@trustware/sdk-staging 0.0.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/config/defaults.ts","../src/types/config.ts","../src/constants.ts","../src/config/merge.ts","../src/config/store.ts","../src/config/index.ts","../src/core/http.ts","../src/registry.ts","../src/widget-v2/components/ConfettiEffect.tsx","../src/index.ts","../src/core/index.ts","../src/wallets/eipWallets.ts","../src/wallets/adapters.ts","../src/wallets/connect.ts","../src/wallets/detect.ts","../src/wallets/deepLink.ts","../src/wallets/metadata.ts","../src/wallets/manager.ts","../src/core/routes.ts","../src/core/balances.ts","../src/core/tx.ts","../src/core/useChains.ts","../src/core/registryClient.ts","../src/widget-v2/helpers/chainHelpers.ts","../src/core/useTokens.ts","../src/widget-v2/data/chainPopularity.json","../src/widget-v2/helpers/chainPopularity.ts","../src/widget-v2/helpers/tokenPopularity.ts","../src/widget-v2/TrustwareWidgetV2.tsx","../src/widget-v2/lib/utils.ts","../src/widget-v2/styles/tokens.ts","../src/widget-v2/styles/theme.ts","../src/widget-v2/styles/animations.ts","../src/widget-v2/context/DepositContext.tsx","../src/widget-v2/hooks/useRouteBuilder.ts","../src/widget-v2/hooks/useAmountConstraints.ts","../src/hooks/useTrustwareConfig.ts","../src/widget-v2/hooks/useTransactionSubmit.ts","../src/widget-v2/hooks/useTransactionPolling.ts","../src/provider.tsx","../src/widget-v2/components/AmountSlider.tsx","../src/widget-v2/components/CircularProgress.tsx","../src/widget-v2/components/Dialog.tsx","../src/widget-v2/components/SwipeToConfirmTokens.tsx","../src/widget-v2/components/ThemeToggle.tsx","../src/widget-v2/components/Toast.tsx","../src/widget-v2/components/TokenSwipePill.tsx","../src/widget-v2/components/TransactionSteps.tsx","../src/widget-v2/components/WidgetContainer.tsx","../src/widget-v2/components/Skeletons/LoadingSkeleton.tsx","../src/widget-v2/pages/Home.tsx","../src/config/walletconnect.ts","../src/widget-v2/pages/SelectToken.tsx","../src/widget-v2/helpers/tokenAmount.ts","../src/utils/index.ts","../src/widget-v2/pages/CryptoPay.tsx","../src/errors/TrustwareError.ts","../src/widget-v2/pages/Processing.tsx","../src/widget-v2/pages/Success.tsx","../src/widget-v2/pages/Error.tsx","../src/types/theme.ts"],"sourcesContent":["import { TrustwareWidgetTheme, TrustwareWidgetMessages } from \"../types/\";\n\nexport const DEFAULT_SLIPPAGE = 1;\nexport const DEFAULT_AUTO_DETECT_PROVIDER = false;\n\nexport const DEFAULT_THEME: TrustwareWidgetTheme = {\n primaryColor: \"#4F46E5\",\n secondaryColor: \"#6366F1\",\n backgroundColor: \"#FFFFFF\",\n textColor: \"#111827\",\n borderColor: \"#E5E7EB\",\n radius: 8,\n};\n\nexport const DEFAULT_MESSAGES: TrustwareWidgetMessages = {\n title: \"Trustware SDK\",\n description: \"Seamlessly bridge assets across chains with Trustware.\",\n};\n","import { TrustwareError } from \"src/errors/TrustwareError\";\nimport { TrustwareWidgetTheme, TrustwareWidgetMessages } from \"./theme\";\nimport { TrustwareEvent } from \"src/events/events\";\nimport { Transaction } from \"./routes\";\n\n/** WalletConnect configuration options (all optional - SDK has built-in defaults) */\nexport type WalletConnectConfig = {\n /** Override the built-in WalletConnect project ID (optional - SDK includes one) */\n projectId?: string;\n /** Chain IDs to support (defaults to [1] for Ethereum mainnet) */\n chains?: number[];\n /** Optional chain IDs (chains that can be switched to) */\n optionalChains?: number[];\n /** dApp metadata shown in wallet */\n metadata?: {\n name: string;\n description?: string;\n url: string;\n icons?: string[];\n };\n /** Custom relay URL (defaults to WalletConnect's relay) */\n relayUrl?: string;\n /** Whether to show our custom QR modal (default: true) */\n showQrModal?: boolean;\n /** Disable WalletConnect entirely (default: false) */\n disabled?: boolean;\n};\n\n/** Resolved WalletConnect config with defaults applied */\nexport type ResolvedWalletConnectConfig = {\n projectId: string;\n chains: number[];\n optionalChains: number[];\n metadata: {\n name: string;\n description: string;\n url: string;\n icons: string[];\n };\n relayUrl?: string;\n showQrModal: boolean;\n};\n\nexport type TrustwareConfigOptions = {\n apiKey: string; // Required API key for authentication\n routes: {\n toChain: string; // Default destination chain\n toToken: string; // Default destination token\n fromToken?: string; // Default source token (optional)\n fromAddress?: string; // Default source address (optional)\n toAddress?: string; // Default destination address (optional; can be updated later via Trustware.setDestinationAddress)\n defaultSlippage?: number; // Default slippage percentage (optional) defautts to 1\n routeType?: string; // Route type: \"swap\" | \"deposit\" | \"withdraw\" | \"cross\" (default: \"swap\")\n options?: {\n routeRefreshMs?: number; // Route refresh interval in milliseconds (optional)\n fixedFromAmount?: string | number;\n minAmountOut?: string | number;\n maxAmountOut?: string | number;\n };\n };\n autoDetectProvider?: boolean; // Whether to auto-detect wallet provider (optional, default: false.)\n theme?: TrustwareWidgetTheme; // Optional theme customization\n messages?: Partial<TrustwareWidgetMessages>; // Optional message customization\n retry?: RetryConfig; // Optional retry configuration for rate-limited requests\n walletConnect?: WalletConnectConfig; // Optional WalletConnect configuration\n\n onError?: (error: TrustwareError) => void;\n onSuccess?: (transaction: Transaction) => void;\n onEvent?: (event: TrustwareEvent) => void;\n};\n\nexport type ResolvedTrustwareConfig = {\n apiKey: string;\n routes: {\n toChain: string;\n toToken: string;\n fromToken?: string;\n fromAddress?: string;\n toAddress?: string;\n defaultSlippage: number; // resolved\n routeType: string; // resolved\n options: {\n routeRefreshMs?: number;\n fixedFromAmount?: string | number;\n minAmountOut?: string | number;\n maxAmountOut?: string | number;\n };\n };\n autoDetectProvider: boolean;\n theme: TrustwareWidgetTheme;\n messages: TrustwareWidgetMessages;\n retry: ResolvedRetryConfig;\n walletConnect?: ResolvedWalletConnectConfig; // Optional WalletConnect config\n};\n\nexport const DEFAULT_SLIPPAGE = 1; // Default slippage percentage\nexport const DEFAULT_AUTO_DETECT_PROVIDER = false; // Default auto-detect provider setting\n\n// Rate limit types for SDK rate limit handling\nexport type RateLimitInfo = {\n /** Maximum requests allowed in the current window */\n limit: number;\n /** Requests remaining in the current window */\n remaining: number;\n /** Unix timestamp when the rate limit window resets */\n reset: number;\n /** Seconds until rate limit resets (only present on 429 responses) */\n retryAfter?: number;\n};\n\nexport type RetryConfig = {\n /** Enable automatic retry on 429 responses (default: true). Note: This does NOT disable backend rate limits, only client-side retry behavior. */\n autoRetry?: boolean;\n /** Maximum number of retries on 429 (default: 3) */\n maxRetries?: number;\n /** Base delay in ms for exponential backoff (default: 1000) */\n baseDelayMs?: number;\n /** Callback when rate limit info is received from server */\n onRateLimitInfo?: (info: RateLimitInfo) => void;\n /** Callback when rate limit is hit (429 received) */\n onRateLimited?: (info: RateLimitInfo, retryCount: number) => void;\n /** Callback when remaining requests fall below threshold */\n onRateLimitApproaching?: (info: RateLimitInfo, threshold: number) => void;\n /** Threshold for onRateLimitApproaching callback (default: 5) */\n approachingThreshold?: number;\n};\n\nexport type ResolvedRetryConfig = {\n autoRetry: boolean;\n maxRetries: number;\n baseDelayMs: number;\n approachingThreshold: number;\n onRateLimitInfo?: (info: RateLimitInfo) => void;\n onRateLimited?: (info: RateLimitInfo, retryCount: number) => void;\n onRateLimitApproaching?: (info: RateLimitInfo, threshold: number) => void;\n};\n\nexport const DEFAULT_RETRY_CONFIG: ResolvedRetryConfig = {\n autoRetry: true,\n maxRetries: 3,\n baseDelayMs: 1000,\n approachingThreshold: 5,\n};\n","// constants.ts\ndeclare const __SDK_VERSION__: string;\ndeclare const __API_ROOT__: string;\n\nexport const SDK_NAME = \"@trustware/sdk\";\nexport const SDK_VERSION: string = __SDK_VERSION__;\nexport const API_ROOT: string = __API_ROOT__;\nexport const API_PREFIX = \"/api\";\n\n// Assets base URL for wallet logos and other static assets\nexport const ASSETS_BASE_URL = \"https://app.trustware.io\";\n\n// WalletConnect Cloud project ID - built into the SDK for seamless wallet connections\n// This is a public identifier (not a secret) registered with WalletConnect Cloud\nexport const WALLETCONNECT_PROJECT_ID = \"4ead125c-63be-4b1a-a835-cef2dce67b84\";\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type {\n TrustwareConfigOptions,\n ResolvedTrustwareConfig,\n ResolvedWalletConnectConfig,\n WalletConnectConfig,\n} from \"../types/\";\nimport {\n DEFAULT_AUTO_DETECT_PROVIDER,\n DEFAULT_SLIPPAGE,\n DEFAULT_THEME,\n DEFAULT_MESSAGES,\n} from \"./defaults\";\nimport { DEFAULT_RETRY_CONFIG } from \"../types/config\";\nimport { WALLETCONNECT_PROJECT_ID } from \"../constants\";\n\n/**\n * Resolve WalletConnect config with built-in defaults.\n * WalletConnect is ENABLED by default - no user configuration required.\n */\nfunction resolveWalletConnectConfig(\n input?: WalletConnectConfig\n): ResolvedWalletConnectConfig | undefined {\n // Allow users to explicitly disable WalletConnect\n if (input?.disabled) return undefined;\n\n // Use built-in project ID by default, allow override\n const projectId = input?.projectId ?? WALLETCONNECT_PROJECT_ID;\n\n return {\n projectId,\n chains: input?.chains ?? [1], // Default to Ethereum mainnet\n optionalChains: input?.optionalChains ?? [\n 1, 10, 56, 137, 8453, 42161, 43114,\n ], // ETH, OP, BSC, Polygon, Base, Arbitrum, Avalanche\n metadata: {\n name: input?.metadata?.name ?? \"Trustware\",\n description:\n input?.metadata?.description ?? \"Cross-chain bridge & top-up\",\n url: input?.metadata?.url ?? \"https://trustware.io\",\n icons: input?.metadata?.icons ?? [\"https://app.trustware.io/icon.png\"],\n },\n relayUrl: input?.relayUrl,\n showQrModal: input?.showQrModal ?? true,\n };\n}\n\n// tiny deep merge for plain objects\nfunction deepMerge<T extends Record<string, any>>(\n base: T,\n patch?: Partial<T>\n): T {\n if (!patch) return { ...base };\n const out: any = Array.isArray(base) ? [...(base as any)] : { ...base };\n for (const [k, v] of Object.entries(patch)) {\n if (v && typeof v === \"object\" && !Array.isArray(v)) {\n (out as any)[k] = deepMerge((base as any)[k] ?? {}, v as any);\n } else {\n (out as any)[k] = v;\n }\n }\n return out;\n}\n\nfunction normalizeSlippage(v: unknown): number {\n const n = Number(v);\n if (!Number.isFinite(n)) return DEFAULT_SLIPPAGE;\n // clamp sane range 0.01%..5% (0.0001..0.05)\n if (n <= 0) return DEFAULT_SLIPPAGE;\n if (n > 5) return 5;\n return n;\n}\n\nexport function resolveConfig(\n input: TrustwareConfigOptions\n): ResolvedTrustwareConfig {\n if (!input?.apiKey) {\n throw new Error(\"TrustwareConfig: 'apiKey' is required.\");\n }\n if (!input.routes?.toChain || !input.routes?.toToken) {\n throw new Error(\n \"TrustwareConfig: 'routes.toChain' and 'routes.toToken' are required.\"\n );\n }\n\n const autoDetectProvider =\n typeof input.autoDetectProvider === \"boolean\"\n ? input.autoDetectProvider\n : DEFAULT_AUTO_DETECT_PROVIDER;\n\n const routes = {\n toChain: input.routes.toChain,\n toToken: input.routes.toToken,\n fromToken: input.routes.fromToken,\n fromAddress: input.routes.fromAddress,\n toAddress: input.routes.toAddress,\n defaultSlippage: normalizeSlippage(\n input.routes.defaultSlippage ?? DEFAULT_SLIPPAGE\n ),\n routeType: input.routes.routeType ?? \"swap\",\n options: {\n ...input.routes.options,\n },\n };\n\n const theme = deepMerge(DEFAULT_THEME, input.theme);\n const messages = deepMerge(DEFAULT_MESSAGES, input.messages);\n\n // Merge retry config with defaults\n const retry = {\n autoRetry: input.retry?.autoRetry ?? DEFAULT_RETRY_CONFIG.autoRetry,\n maxRetries: input.retry?.maxRetries ?? DEFAULT_RETRY_CONFIG.maxRetries,\n baseDelayMs: input.retry?.baseDelayMs ?? DEFAULT_RETRY_CONFIG.baseDelayMs,\n approachingThreshold:\n input.retry?.approachingThreshold ??\n DEFAULT_RETRY_CONFIG.approachingThreshold,\n onRateLimitInfo: input.retry?.onRateLimitInfo,\n onRateLimited: input.retry?.onRateLimited,\n onRateLimitApproaching: input.retry?.onRateLimitApproaching,\n };\n\n // Resolve WalletConnect config (optional)\n const walletConnect = resolveWalletConnectConfig(input.walletConnect);\n\n return {\n apiKey: input.apiKey,\n routes,\n autoDetectProvider,\n theme,\n messages,\n retry,\n walletConnect,\n };\n}\n","import type {\n ResolvedTrustwareConfig,\n TrustwareConfigOptions,\n} from \"../types/\";\nimport { resolveConfig } from \"./merge\";\n\ntype Listener = (cfg: ResolvedTrustwareConfig) => void;\n\nclass ConfigStore {\n private _cfg: ResolvedTrustwareConfig | null = null;\n private _listeners = new Set<Listener>();\n\n isInitialized(): boolean {\n return this._cfg != null;\n }\n\n peek(): ResolvedTrustwareConfig | null {\n return this._cfg;\n }\n\n /** Initialize or replace the config */\n init(opts: TrustwareConfigOptions) {\n this._cfg = resolveConfig(opts);\n this.emit();\n }\n\n /** Partially update by re-resolving from last + patch */\n update(patch: Partial<TrustwareConfigOptions>) {\n if (!this._cfg) throw new Error(\"TrustwareConfig: call init() first.\");\n const next = resolveConfig({\n ...this._cfg,\n ...patch,\n routes: { ...this._cfg.routes, ...(patch.routes ?? {}) },\n theme: {\n ...this._cfg.theme,\n ...(patch.theme ?? {}),\n } as ResolvedTrustwareConfig[\"theme\"],\n messages: {\n ...this._cfg.messages,\n ...(patch.messages ?? {}),\n } as ResolvedTrustwareConfig[\"messages\"],\n retry: { ...this._cfg.retry, ...(patch.retry ?? {}) },\n walletConnect: patch.walletConnect\n ? { ...this._cfg.walletConnect, ...patch.walletConnect }\n : this._cfg.walletConnect,\n } as TrustwareConfigOptions);\n this._cfg = next;\n this.emit();\n }\n\n get(): ResolvedTrustwareConfig {\n if (!this._cfg) throw new Error(\"TrustwareConfig: not initialized.\");\n return this._cfg;\n }\n\n getTheme() {\n return this.get().theme;\n }\n\n getMessages() {\n return this.get().messages;\n }\n\n subscribe(fn: (cfg: ResolvedTrustwareConfig) => void) {\n this._listeners.add(fn);\n if (this._cfg) fn(this._cfg);\n return () => {\n this._listeners.delete(fn);\n };\n }\n\n private emit() {\n if (!this._cfg) return;\n for (const fn of this._listeners) fn(this._cfg);\n }\n}\nexport const TrustwareConfigStore = new ConfigStore();\n\n/** Convenience for non-React environments */\nexport const TrustwareConfig = {\n init: (opts: TrustwareConfigOptions) => TrustwareConfigStore.init(opts),\n update: (patch: Partial<TrustwareConfigOptions>) =>\n TrustwareConfigStore.update(patch),\n get: () => TrustwareConfigStore.get(),\n getTheme: () => TrustwareConfigStore.get().theme,\n getMessages: () => TrustwareConfigStore.get().messages,\n subscribe: (fn: (cfg: ResolvedTrustwareConfig) => void) =>\n TrustwareConfigStore.subscribe(fn),\n};\n","export * from \"./defaults\";\nexport * from \"./merge\";\nexport * from \"./store\";\n// walletconnect.ts is excluded: depends on @reown/appkit-universal-connector (not installed)\n","/* core/http.ts */\nimport { SDK_NAME, SDK_VERSION, API_ROOT, API_PREFIX } from \"../constants\";\nimport { TrustwareConfigStore } from \"../config/\";\nimport type { RateLimitInfo } from \"../types/config\";\n\nexport function apiBase() {\n return `${API_ROOT}${API_PREFIX}`;\n}\n\nexport function jsonHeaders(extra?: Record<string, string>): HeadersInit {\n const cfg = TrustwareConfigStore.get();\n const h: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n \"X-API-Key\": cfg.apiKey,\n \"X-SDK-Name\": SDK_NAME,\n \"X-SDK-Version\": SDK_VERSION,\n \"X-API-Version\": \"2025-10-01\",\n };\n return { ...h, ...(extra || {}) };\n}\n\nexport async function assertOK(r: Response) {\n if (r.ok) return;\n let msg = r.statusText;\n try {\n const j = await r.json();\n if (j?.error) msg = j.error;\n } catch {\n // response body not JSON, use statusText\n }\n throw new Error(`HTTP ${r.status}: ${msg}`);\n}\n\n///sdk/validate\nexport async function validateSdkAccess() {\n const r = await fetch(`${apiBase()}/sdk/validate`, {\n method: \"GET\",\n headers: jsonHeaders(),\n });\n await assertOK(r);\n const j = await r.json();\n return j.data;\n}\n\n/** Parse rate limit headers from a response */\nexport function parseRateLimitHeaders(r: Response): RateLimitInfo | null {\n const limit = r.headers.get(\"X-RateLimit-Limit\");\n const remaining = r.headers.get(\"X-RateLimit-Remaining\");\n const reset = r.headers.get(\"X-RateLimit-Reset\");\n\n if (!limit || !remaining || !reset) {\n return null;\n }\n\n const info: RateLimitInfo = {\n limit: parseInt(limit, 10),\n remaining: parseInt(remaining, 10),\n reset: parseInt(reset, 10),\n };\n\n // Add retryAfter if present (only on 429 responses)\n const retryAfter = r.headers.get(\"Retry-After\");\n if (retryAfter) {\n info.retryAfter = parseInt(retryAfter, 10);\n }\n\n return info;\n}\n\n/** Notify rate limit callbacks based on response */\nfunction notifyRateLimitCallbacks(\n info: RateLimitInfo,\n isRateLimited: boolean,\n retryCount: number\n) {\n const cfg = TrustwareConfigStore.get();\n const { retry } = cfg;\n\n // Always notify onRateLimitInfo if configured\n if (retry.onRateLimitInfo) {\n retry.onRateLimitInfo(info);\n }\n\n // Notify when rate limited\n if (isRateLimited && retry.onRateLimited) {\n retry.onRateLimited(info, retryCount);\n }\n\n // Notify when approaching limit\n if (\n !isRateLimited &&\n retry.onRateLimitApproaching &&\n info.remaining <= retry.approachingThreshold\n ) {\n retry.onRateLimitApproaching(info, retry.approachingThreshold);\n }\n}\n\n/** Calculate delay for exponential backoff */\nfunction calculateBackoffDelay(\n baseDelayMs: number,\n retryCount: number,\n retryAfter?: number\n): number {\n // If server specified retry-after, use that (in seconds, convert to ms)\n if (retryAfter && retryAfter > 0) {\n return retryAfter * 1000;\n }\n // Otherwise use exponential backoff: base * 2^retryCount\n return baseDelayMs * Math.pow(2, retryCount);\n}\n\n/** Sleep for specified milliseconds */\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport class RateLimitError extends Error {\n public readonly rateLimitInfo: RateLimitInfo;\n public readonly retriesExhausted: boolean;\n\n constructor(info: RateLimitInfo, retriesExhausted: boolean) {\n const message = retriesExhausted\n ? `Rate limit exceeded after max retries. Try again in ${info.retryAfter ?? Math.ceil((info.reset * 1000 - Date.now()) / 1000)} seconds.`\n : `Rate limit exceeded. Try again in ${info.retryAfter} seconds.`;\n super(message);\n this.name = \"RateLimitError\";\n this.rateLimitInfo = info;\n this.retriesExhausted = retriesExhausted;\n }\n}\n\ntype FetchOptions = RequestInit & {\n /** Skip rate limit handling for this request */\n skipRateLimit?: boolean;\n};\n\n/**\n * Rate-limit-aware fetch wrapper.\n * Automatically handles 429 responses with exponential backoff retry.\n * Notifies callbacks on rate limit events.\n */\nexport async function rateLimitedFetch(\n url: string,\n options: FetchOptions = {}\n): Promise<Response> {\n const { skipRateLimit, ...fetchOptions } = options;\n\n // If auto-retry is disabled or skipped, just do a normal fetch\n const cfg = TrustwareConfigStore.get();\n if (!cfg.retry.autoRetry || skipRateLimit) {\n return fetch(url, fetchOptions);\n }\n\n const { maxRetries, baseDelayMs } = cfg.retry;\n let retryCount = 0;\n\n while (true) {\n const response = await fetch(url, fetchOptions);\n\n // Parse rate limit headers\n const rateLimitInfo = parseRateLimitHeaders(response);\n\n if (response.status === 429) {\n // Rate limited\n if (rateLimitInfo) {\n notifyRateLimitCallbacks(rateLimitInfo, true, retryCount);\n }\n\n // Check if we should retry\n if (retryCount >= maxRetries) {\n // Max retries exhausted\n throw new RateLimitError(\n rateLimitInfo || { limit: 0, remaining: 0, reset: 0 },\n true\n );\n }\n\n // Calculate delay and retry\n const delay = calculateBackoffDelay(\n baseDelayMs,\n retryCount,\n rateLimitInfo?.retryAfter\n );\n await sleep(delay);\n retryCount++;\n continue;\n }\n\n // Not rate limited - notify callbacks if we have info\n if (rateLimitInfo) {\n notifyRateLimitCallbacks(rateLimitInfo, false, 0);\n }\n\n return response;\n }\n}\n","// src/registry.ts\nimport { TrustwareConfigStore } from \"./config/store\";\nimport type { ChainDef, TokenDef } from \"./types/\";\n\nexport const NATIVE = \"0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE\";\n\nexport class Registry {\n private _chainsById = new Map<string, ChainDef>();\n private _tokensByChain = new Map<string, TokenDef[]>();\n private _loaded = false;\n private _loadingPromise: Promise<void> | null = null;\n\n constructor(private baseURL: string) {}\n\n async ensureLoaded() {\n if (this._loaded) return;\n if (this._loadingPromise) {\n await this._loadingPromise;\n return;\n }\n\n this._loadingPromise = this.load();\n try {\n await this._loadingPromise;\n } finally {\n this._loadingPromise = null;\n }\n }\n\n private async load() {\n const cfg = TrustwareConfigStore.get();\n\n const [chainsRes, tokensRes] = await Promise.all([\n fetch(`${this.baseURL}/squid/chains`, {\n headers: { Accept: \"application/json\", \"X-API-Key\": cfg.apiKey },\n }),\n fetch(`${this.baseURL}/squid/tokens`, {\n headers: { Accept: \"application/json\", \"X-API-Key\": cfg.apiKey },\n }),\n ]);\n if (!chainsRes.ok) throw new Error(`chains: HTTP ${chainsRes.status}`);\n if (!tokensRes.ok) throw new Error(`tokens: HTTP ${tokensRes.status}`);\n\n const chains = await chainsRes.json();\n const tokens = await tokensRes.json();\n\n const chainsArr: ChainDef[] = Array.isArray(chains)\n ? chains\n : (chains.data ?? []);\n for (const c of chainsArr) {\n const canonical = c?.chainId ?? c?.id;\n if (canonical == null) continue;\n const chainId = c.chainId ?? canonical;\n const normalized: ChainDef = {\n ...c,\n id: c.id ?? canonical,\n chainId,\n };\n this._chainsById.set(String(canonical), normalized);\n }\n\n const tokensArr: TokenDef[] = Array.isArray(tokens)\n ? tokens\n : (tokens.data ?? []);\n for (const t of tokensArr) {\n const canonical = t?.chainId;\n if (canonical == null) continue;\n const id = String(canonical);\n const normalized: TokenDef = {\n ...t,\n chainId: t.chainId ?? canonical,\n };\n if (!this._tokensByChain.has(id)) this._tokensByChain.set(id, []);\n this._tokensByChain.get(id)!.push(normalized);\n }\n\n this._loaded = true;\n }\n\n chains(): ChainDef[] {\n return Array.from(this._chainsById.values());\n }\n\n chain(chainId: string | number): ChainDef | undefined {\n return this._chainsById.get(String(chainId));\n }\n\n allTokens(): TokenDef[] {\n const all: TokenDef[] = [];\n for (const list of this._tokensByChain.values()) {\n all.push(...list);\n }\n return all;\n }\n\n tokens(chainId: string | number): TokenDef[] {\n return this._tokensByChain.get(String(chainId)) ?? [];\n }\n\n resolveToken(\n chainId: string | number,\n input?: string | null\n ): string | undefined {\n if (!input) return undefined;\n const s = String(input).trim();\n\n // address passthrough\n if (/^0x[0-9a-fA-F]{40}$/.test(s)) return s as `0x${string}`;\n\n // native by symbol\n const chain = this.chain(chainId);\n const nativeSym = chain?.nativeCurrency?.symbol?.toUpperCase?.();\n if (nativeSym && s.toUpperCase() === nativeSym) return NATIVE;\n\n if ([\"ETH\", \"MATIC\", \"AVAX\", \"BNB\", \"NATIVE\"].includes(s.toUpperCase()))\n return NATIVE;\n\n // symbol → address\n const list = this.tokens(chainId);\n const hit = list.find((t) => t.symbol?.toUpperCase?.() === s.toUpperCase());\n if (hit) return hit.address;\n\n return s;\n }\n}\n","import React, { useEffect, useState } from \"react\";\n\ninterface ConfettiPiece {\n id: number;\n x: number;\n color: string;\n delay: number;\n duration: number;\n size: number;\n rotation: number;\n}\n\nexport interface ConfettiEffectProps {\n /** Whether the confetti animation should be active */\n isActive: boolean;\n /** Duration in ms before confetti pieces are cleared (default: 3000) */\n clearDelay?: number;\n /** Number of confetti pieces to generate (default: 50) */\n pieceCount?: number;\n}\n\n/**\n * Confetti celebration effect component.\n * Renders animated confetti pieces that fall from the top of the screen.\n * This component should be lazy loaded to reduce initial bundle size.\n */\nexport function ConfettiEffect({\n isActive,\n clearDelay = 3000,\n pieceCount = 50,\n}: ConfettiEffectProps): React.ReactElement | null {\n const [pieces, setPieces] = useState<ConfettiPiece[]>([]);\n\n // Generate confetti pieces when activated\n /* eslint-disable react-hooks/set-state-in-effect -- setState syncs animation state with isActive prop */\n useEffect(() => {\n if (isActive) {\n const colors = [\n \"#10b981\", // emerald\n \"#3b82f6\", // blue\n \"#f59e0b\", // amber\n \"#ef4444\", // red\n \"#8b5cf6\", // violet\n \"#ec4899\", // pink\n \"#06b6d4\", // cyan\n \"#84cc16\", // lime\n ];\n const newPieces: ConfettiPiece[] = [];\n\n for (let i = 0; i < pieceCount; i++) {\n newPieces.push({\n id: i,\n x: Math.random() * 100,\n color: colors[Math.floor(Math.random() * colors.length)],\n delay: Math.random() * 0.5,\n duration: 1.5 + Math.random() * 1.5,\n size: 6 + Math.random() * 8,\n rotation: Math.random() * 360,\n });\n }\n\n setPieces(newPieces);\n\n // Clear after animation completes\n const timer = setTimeout(() => {\n setPieces([]);\n }, clearDelay);\n\n return () => clearTimeout(timer);\n } else {\n setPieces([]);\n }\n }, [isActive, pieceCount, clearDelay]);\n /* eslint-enable react-hooks/set-state-in-effect */\n\n if (!isActive || pieces.length === 0) {\n return null;\n }\n\n return (\n <div\n style={{\n position: \"fixed\",\n inset: 0,\n pointerEvents: \"none\",\n zIndex: 50,\n overflow: \"hidden\",\n }}\n aria-hidden=\"true\"\n >\n {pieces.map((piece) => (\n <div\n key={piece.id}\n style={{\n position: \"absolute\",\n left: `${piece.x}%`,\n top: \"-20px\",\n width: `${piece.size}px`,\n height: `${piece.size}px`,\n backgroundColor: piece.color,\n borderRadius: piece.id % 2 === 0 ? \"50%\" : \"2px\",\n transform: `rotate(${piece.rotation}deg)`,\n animation: `tw-confetti-fall ${piece.duration}s ease-out forwards`,\n animationDelay: `${piece.delay}s`,\n }}\n />\n ))}\n </div>\n );\n}\n\nexport default ConfettiEffect;\n","// src/index.ts\nexport { Trustware, TrustwareCore } from \"./core\";\nexport { RateLimitError } from \"./core/http\";\nexport {\n connectDetectedWallet,\n useWalletDetection,\n useWireDetectionIntoManager,\n WagmiBridge,\n WagmiConnector,\n useEIP1193,\n useWagmi,\n toWalletInterfaceFromDetected,\n} from \"./wallets/\";\nexport { TrustwareWidget } from \"./widget/\";\nexport { TrustwareProvider, useTrustware } from \"./provider\";\nexport { TrustwareError } from \"./errors/TrustwareError\";\nexport * from \"./types\";\nexport * from \"./constants\";\n","/* core/index.ts */\nimport type {\n TrustwareConfigOptions,\n ResolvedTrustwareConfig,\n WalletInterFaceAPI,\n} from \"../types\";\nimport { TrustwareConfigStore } from \"../config/store\";\nimport { walletManager } from \"../wallets/manager\";\nimport { buildRoute, submitReceipt, getStatus, pollStatus } from \"./routes\";\nimport { getBalances, getBalancesByAddress } from \"./balances\";\nimport { sendRouteTransaction, runTopUp } from \"./tx\";\nimport { validateSdkAccess } from \"./http\";\nimport { useChains } from \"./useChains\";\nimport { useTokens } from \"./useTokens\";\n\n// simple memo to avoid re-validating same key repeatedly\nlet _lastValidatedKey: string | null = null;\n\nexport const Trustware = {\n /** Initialize config */\n async init(cfg: TrustwareConfigOptions) {\n TrustwareConfigStore.init(cfg);\n const key = TrustwareConfigStore.get().apiKey;\n\n if (_lastValidatedKey !== key) {\n try {\n await validateSdkAccess();\n _lastValidatedKey = key;\n } catch (err: unknown) {\n const reason =\n err instanceof Error && err.message ? `: ${err.message}` : \"\";\n throw new Error(`Trustware.init: API key validation failed${reason}`);\n }\n }\n return Trustware;\n },\n\n /** Attach a wallet interface directly (skips detection) */\n useWallet(w: WalletInterFaceAPI) {\n walletManager.attachWallet(w);\n return Trustware;\n },\n\n /** Best-effort background attach to detected wallet(s) (detection hook should be running in the app) */\n async autoDetect(_timeoutMs?: number) {\n await walletManager.autoAttach();\n return walletManager.wallet != null;\n },\n\n /** Read resolved config */\n getConfig(): ResolvedTrustwareConfig {\n return TrustwareConfigStore.get();\n },\n\n setDestinationAddress(address?: string | null) {\n const prev = TrustwareConfigStore.get();\n TrustwareConfigStore.update({\n routes: {\n ...prev.routes,\n toAddress: address ?? undefined,\n },\n });\n return Trustware;\n },\n\n /** Read active wallet */\n getWallet(): WalletInterFaceAPI | null {\n return walletManager.wallet;\n },\n\n /** Simple helpers */\n async getAddress(): Promise<string> {\n const w = walletManager.wallet;\n if (!w) throw new Error(\"Trustware.wallet not configured\");\n return w.getAddress();\n },\n\n // ---- REST methods (re-export) ----\n buildRoute,\n submitReceipt,\n getStatus,\n pollStatus,\n getBalances,\n getBalancesByAddress,\n useChains,\n useTokens,\n\n // ---- Tx helpers ----\n sendRouteTransaction,\n runTopUp,\n};\n\nexport type TrustwareCore = typeof Trustware;\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n// src/wallet.ts\nimport type { WalletInterFaceAPI, EIP1193 } from \"../types/\";\n\n/* ---------------- chain params for addChain fallback ---------------- */\nconst CHAIN_PARAMS: Record<\n number,\n {\n chainIdHex: `0x${string}`;\n chainName: string;\n rpcUrls: string[];\n nativeCurrency: { name: string; symbol: string; decimals: number };\n blockExplorerUrls?: string[];\n }\n> = {\n 8453: {\n chainIdHex: \"0x2105\",\n chainName: \"Base\",\n rpcUrls: [\"https://mainnet.base.org\"],\n nativeCurrency: { name: \"Ether\", symbol: \"ETH\", decimals: 18 },\n blockExplorerUrls: [\"https://basescan.org\"],\n },\n 42161: {\n chainIdHex: \"0xa4b1\",\n chainName: \"Arbitrum One\",\n rpcUrls: [\"https://arb1.arbitrum.io/rpc\"],\n nativeCurrency: { name: \"Ether\", symbol: \"ETH\", decimals: 18 },\n blockExplorerUrls: [\"https://arbiscan.io\"],\n },\n 43114: {\n chainIdHex: \"0xa86a\",\n chainName: \"Avalanche C-Chain\",\n rpcUrls: [\"https://api.avax.network/ext/bc/C/rpc\"],\n nativeCurrency: { name: \"Avalanche\", symbol: \"AVAX\", decimals: 18 },\n blockExplorerUrls: [\"https://snowtrace.io\"],\n },\n};\n\nasync function addThenSwitch(eth: EIP1193, chainId: number) {\n const p = CHAIN_PARAMS[chainId];\n if (!p) throw new Error(`Unknown chain ${chainId} (no params to add)`);\n await eth.request({ method: \"wallet_addEthereumChain\", params: [p] as any });\n await eth.request({\n method: \"wallet_switchEthereumChain\",\n params: [{ chainId: p.chainIdHex }] as any,\n });\n}\n\n/* ---------------- EIP-1193 adapter (safe switching) ---------------- */\nexport function useEIP1193(eth: EIP1193): WalletInterFaceAPI {\n if (!eth?.request) throw new Error(\"useEIP1193: invalid provider\");\n let switching = false;\n\n return {\n type: \"eip1193\",\n async getAddress() {\n const [a] = (await eth.request({\n method: \"eth_requestAccounts\",\n })) as string[];\n if (!a) throw new Error(\"No connected address\");\n return a;\n },\n async getChainId() {\n const hex = await eth.request({ method: \"eth_chainId\" });\n return parseInt(String(hex), 16);\n },\n async switchChain(chainId: number) {\n if (switching) return; // prevent 4001: already in progress\n switching = true;\n const hex =\n CHAIN_PARAMS[chainId]?.chainIdHex ?? `0x${chainId.toString(16)}`;\n try {\n await eth.request({\n method: \"wallet_switchEthereumChain\",\n params: [{ chainId: hex }],\n });\n } catch (e: any) {\n if (e?.code === 4902) {\n await addThenSwitch(eth, chainId);\n } else if (e?.code === 4001) {\n // user rejected or wallet busy; don’t crash the flow\n } else {\n throw e;\n }\n } finally {\n switching = false;\n }\n },\n request: (args) => eth.request(args),\n };\n}\n\n/* ---------------- Wagmi/Viem client adapter (version-agnostic) ---------------- */\nexport function useWagmi(client: any): WalletInterFaceAPI {\n if (!client) throw new Error(\"useWagmi: missing client\");\n let switching = false;\n\n async function getAddress(): Promise<`0x${string}`> {\n const addr = client.account?.address as `0x${string}` | undefined;\n if (addr) return addr;\n if (typeof client.getAddresses === \"function\") {\n const arr = await client.getAddresses();\n if (arr?.[0]) return arr[0];\n }\n throw new Error(\"No connected address\");\n }\n\n async function getChainId(): Promise<number> {\n const id = client.chain?.id ?? (await client.getChainId?.());\n return typeof id === \"number\" ? id : 0;\n }\n\n async function switchChain(target: number) {\n if (switching) return;\n switching = true;\n try {\n if (typeof client.switchChain === \"function\") {\n try {\n await client.switchChain({ id: target });\n } catch {\n await client.switchChain({ chainId: target });\n }\n return;\n }\n const eth = (globalThis as any).ethereum as EIP1193 | undefined;\n if (!eth?.request) throw new Error(\"switchChain not available\");\n try {\n const hex =\n CHAIN_PARAMS[target]?.chainIdHex ?? `0x${target.toString(16)}`;\n await eth.request({\n method: \"wallet_switchEthereumChain\",\n params: [{ chainId: hex }],\n });\n } catch (e: any) {\n if (e?.code === 4902) await addThenSwitch(eth, target);\n else if (e?.code === 4001)\n void 0; // switchChain rejected/in-progress — non-fatal\n else throw e;\n }\n } finally {\n switching = false;\n }\n }\n\n async function sendTransaction(tx: {\n to: `0x${string}`;\n data: `0x${string}`;\n value?: bigint;\n chainId?: number;\n }) {\n if (typeof client.sendTransaction !== \"function\")\n throw new Error(\"sendTransaction not available\");\n const account = await getAddress();\n const chainId = tx.chainId ?? (await getChainId());\n try {\n const res = await client.sendTransaction({\n account,\n to: tx.to,\n data: tx.data,\n value: tx.value,\n chain: { id: chainId },\n });\n return { hash: res.hash as `0x${string}` };\n } catch {\n const res = await client.sendTransaction({\n account,\n to: tx.to,\n data: tx.data,\n value: tx.value,\n chainId,\n });\n return { hash: res.hash as `0x${string}` };\n }\n }\n\n return {\n type: \"wagmi\",\n getAddress,\n getChainId,\n switchChain,\n sendTransaction,\n };\n}\n\n/* ---------------- Provider discovery (prefer Rabby) ---------------- */\n\ntype Detected = { id: string; name: string; provider: EIP1193 };\n\nfunction nameOf(p: any): string {\n return (\n p?.providerInfo?.name ||\n p?.info?.name ||\n (p?.isRabby && \"Rabby\") ||\n (p?.isMetaMask && \"MetaMask\") ||\n (p?.isBraveWallet && \"Brave Wallet\") ||\n (p?.isCoinbaseWallet && \"Coinbase Wallet\") ||\n \"Injected Wallet\"\n );\n}\nfunction idOf(p: any): string {\n return nameOf(p).toLowerCase().replace(/\\s+/g, \"-\") || \"injected\";\n}\n\nfunction rank(list: Detected[]): Detected[] {\n const score = (n: string) => {\n const s = n.toLowerCase();\n if (s.includes(\"rabby\")) return 0;\n if (s.includes(\"metamask\")) return 1;\n if (s.includes(\"coinbase\")) return 2;\n if (s.includes(\"okx\")) return 3;\n if (s.includes(\"brave\")) return 99; // de-prioritize Brave\n return 50;\n };\n return [...list].sort((a, b) => score(a.name) - score(b.name));\n}\n\n/** Prefer Rabby automatically; fallback to others (no browser setting needed) */\nexport async function autoDetectWallet(\n timeoutMs = 400\n): Promise<{ kind: \"eip1193\"; wallet: WalletInterFaceAPI } | null> {\n if (typeof window === \"undefined\") return null;\n const w = window as any;\n\n const announced: any[] = [];\n const handler = (e: any) => {\n if (e?.detail?.provider?.request) announced.push(e.detail.provider);\n };\n w.addEventListener?.(\"eip6963:announceProvider\", handler);\n w.dispatchEvent?.(new Event(\"eip6963:requestProvider\"));\n await new Promise((res) => setTimeout(res, timeoutMs));\n w.removeEventListener?.(\"eip6963:announceProvider\", handler);\n\n const candidates: any[] = [];\n if (w.ethereum?.request) {\n const multi = Array.isArray(w.ethereum.providers)\n ? w.ethereum.providers\n : [w.ethereum];\n for (const p of multi) if (p?.request) candidates.push(p);\n }\n for (const p of announced)\n if (p?.request && !candidates.includes(p)) candidates.push(p);\n\n if (candidates.length === 0) return null;\n\n const dedup = new Map<string, Detected>();\n for (const p of candidates) {\n const det = { id: idOf(p), name: nameOf(p), provider: p as EIP1193 };\n dedup.set(det.id, det);\n }\n\n const best = rank(Array.from(dedup.values()))[0];\n return { kind: \"eip1193\", wallet: useEIP1193(best.provider) };\n}\n","import type { WalletInterFaceAPI, DetectedWallet, EIP1193 } from \"../types/\";\nimport { useEIP1193, useWagmi } from \"./eipWallets\";\n\nexport { useEIP1193, useWagmi };\n\nexport function toWalletInterfaceFromDetected(\n dw: DetectedWallet\n): WalletInterFaceAPI {\n if (!dw?.provider) throw new Error(\"No provider on detected wallet\");\n const eth = dw.provider as EIP1193;\n return useEIP1193(eth);\n}\n","import type { DetectedWallet, WalletInterFaceAPI } from \"../types\";\nimport type { WagmiBridge } from \"./bridges\";\nimport { toWalletInterfaceFromDetected } from \"./adapters\";\n// import { connectWalletConnect } from \"./walletconnect\";\n\nfunction pickWagmiConnector(\n wagmi: WagmiBridge,\n metaName: string,\n metaId: string,\n metaCategory: string\n) {\n const lower = metaName.toLowerCase();\n const cons = wagmi.connectors();\n return (\n cons.find((c) => c.name.toLowerCase().includes(lower)) ||\n (metaId === \"coinbase\" &&\n cons.find((c) => c.name.toLowerCase().includes(\"coinbase\"))) ||\n (metaId === \"walletconnect\" &&\n cons.find((c) => (c.type ?? \"\").toLowerCase() === \"walletconnect\")) ||\n (metaCategory === \"injected\" &&\n cons.find((c) => (c.type ?? \"\").toLowerCase() === \"injected\")) ||\n null\n );\n}\n\n/** Try wagmi bridge first (if provided), otherwise return EIP-1193 adapter. */\nexport async function connectDetectedWallet(\n dw: DetectedWallet,\n opts?: { wagmi?: WagmiBridge; touchAddress?: boolean }\n): Promise<{\n via: \"wagmi\" | \"eip1193\" | \"walletconnect\";\n api: WalletInterFaceAPI | null;\n}> {\n const { wagmi, touchAddress = true } = opts ?? {};\n\n // Handle WalletConnect specially\n if (dw.meta.id === \"walletconnect\" || dw.via === \"walletconnect\") {\n // First try wagmi if available (host may have WC configured in wagmi)\n if (wagmi) {\n const conn = pickWagmiConnector(\n wagmi,\n dw.meta.name,\n dw.meta.id,\n dw.meta.category\n );\n if (conn) {\n await wagmi.connect(conn);\n return { via: \"wagmi\", api: null };\n }\n }\n\n // Use our native WalletConnect integration (built-in, always available)\n // const api = await connectWalletConnect();\n // if (api) {\n // if (touchAddress) await api.getAddress();\n // return { via: \"walletconnect\", api };\n // }\n\n throw new Error(\"WalletConnect connection failed. Please try again.\");\n }\n\n if (wagmi) {\n const conn = pickWagmiConnector(\n wagmi,\n dw.meta.name,\n dw.meta.id,\n dw.meta.category\n );\n if (conn) {\n await wagmi.connect(conn);\n // when the host uses wagmi, you can later wrap the host client using your old useWagmi adapter\n return { via: \"wagmi\", api: null };\n }\n }\n\n // fallback: raw EIP-1193\n const api = toWalletInterfaceFromDetected(dw);\n if (touchAddress) await api.getAddress(); // triggers permission prompt\n return { via: \"eip1193\", api };\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { useEffect, useMemo, useState } from \"react\";\nimport type {\n DetectedWallet,\n EIP6963ProviderDetail,\n WalletMeta,\n WalletId,\n} from \"../types/\";\nimport { WALLETS } from \"./metadata\";\n\ntype AnnounceEvent = CustomEvent<{\n info: EIP6963ProviderDetail[\"info\"];\n provider: any;\n}>;\n\n// ────────────────────────────────────────────────────────────\n// Lookup tables\n// ────────────────────────────────────────────────────────────\n\nconst WALLET_BY_ID = new Map<WalletId, WalletMeta>(\n WALLETS.map((w) => [w.id, w])\n);\n\n// Used for ranking detected wallets\nconst DETECT_PRIORITY = new Map<WalletId, number>(\n WALLETS.map((w, idx) => [w.id, idx])\n);\n\n// Flags that are \"compat only\" and should never beat a more specific match\nconst GENERIC_FLAGS = new Set([\"isMetaMask\"]);\n\n// rdns → wallet id for 6963\nconst RDNS_WALLET_MAP: { pattern: RegExp; id: WalletId }[] = [\n { pattern: /com\\.bitget\\.web3/i, id: \"bitget\" },\n { pattern: /io\\.zerion\\.wallet/i, id: \"zerion\" },\n { pattern: /io\\.metamask/i, id: \"metamask\" },\n { pattern: /wallet\\.coinbase\\.com|com\\.coinbase\\.wallet/i, id: \"coinbase\" },\n { pattern: /app\\.phantom|phantom\\.app/i, id: \"phantom-evm\" },\n { pattern: /com\\.okex\\.wallet|com\\.okx\\.wallet/i, id: \"okx\" },\n { pattern: /com\\.trustwallet/i, id: \"trust\" },\n { pattern: /taho/i, id: \"taho\" }, // 🔧 fixed id to \"taho\"\n { pattern: /safe\\.gnosis/i, id: \"safe\" },\n { pattern: /kucoin/i, id: \"kucoin\" },\n { pattern: /io\\.rabby/i, id: \"rabby\" },\n { pattern: /io\\.rainbow/i, id: \"rainbow\" },\n];\n\n// name → wallet id\nconst NAME_WALLET_MAP: { pattern: RegExp; id: WalletId }[] = [\n { pattern: /metamask/i, id: \"metamask\" },\n { pattern: /rabby/i, id: \"rabby\" },\n { pattern: /coinbase/i, id: \"coinbase\" },\n { pattern: /rainbow/i, id: \"rainbow\" },\n { pattern: /\\btaho\\b|\\btally\\b/i, id: \"taho\" },\n { pattern: /okx|okex/i, id: \"okx\" },\n { pattern: /trust\\s*wallet/i, id: \"trust\" },\n { pattern: /bitget/i, id: \"bitget\" },\n { pattern: /phantom/i, id: \"phantom-evm\" },\n { pattern: /\\bsafe\\b/i, id: \"safe\" },\n { pattern: /zerion/i, id: \"zerion\" },\n { pattern: /kucoin/i, id: \"kucoin\" },\n];\n\n// ────────────────────────────────────────────────────────────\n// Helpers – generic utilities\n// ────────────────────────────────────────────────────────────\n\nfunction getProviderName(\n detail?: EIP6963ProviderDetail,\n provider?: any\n): string | undefined {\n return (\n detail?.info?.name ||\n provider?.providerInfo?.name ||\n provider?.info?.name ||\n undefined\n );\n}\n\nfunction getProviderRdns(\n detail?: EIP6963ProviderDetail,\n provider?: any\n): string | undefined {\n return (\n detail?.info?.rdns ||\n provider?.providerInfo?.rdns ||\n provider?.info?.rdns ||\n provider?.walletMeta?.rdns ||\n undefined\n );\n}\n\nfunction findWalletByRdns(rdns?: string): WalletMeta | undefined {\n if (!rdns) return undefined;\n for (const { pattern, id } of RDNS_WALLET_MAP) {\n if (pattern.test(rdns)) {\n return WALLET_BY_ID.get(id);\n }\n }\n return undefined;\n}\n\nfunction findWalletByName(rawName?: string): WalletMeta | undefined {\n const name = rawName?.trim();\n if (!name) return undefined;\n\n // 1) Regex mapping\n for (const { pattern, id } of NAME_WALLET_MAP) {\n if (pattern.test(name)) {\n return WALLET_BY_ID.get(id);\n }\n }\n\n // 2) Simple normalized id\n const rawId = name.toLowerCase().replace(/\\s+/g, \"-\");\n let normalizedId = rawId as WalletId;\n\n if (rawId === \"bitget-wallet\") normalizedId = \"bitget\";\n if (rawId === \"coinbase-wallet\") normalizedId = \"coinbase\";\n if (rawId === \"brave-wallet\") normalizedId = \"brave\";\n if (rawId === \"trust-wallet\") normalizedId = \"trust\";\n\n return WALLET_BY_ID.get(normalizedId);\n}\n\nfunction createGenericWalletMeta(name: string): WalletMeta {\n const rawId = name.toLowerCase().replace(/\\s+/g, \"-\") || \"injected-wallet\";\n return {\n id: rawId as WalletId,\n name,\n category: \"injected\",\n logo: \"\",\n emoji: \"👛\",\n };\n}\n\n// ────────────────────────────────────────────────────────────\n// Flag-based detection\n// ────────────────────────────────────────────────────────────\n\n// IMPORTANT: only look at *this* provider’s flags.\n// Do NOT walk provider.providers – that caused Rabby/MM\n// flags to \"bleed\" into other providers like Taho.\nfunction hasFlagOnProvider(provider: any, flag: string): boolean {\n return Boolean(provider?.[flag]);\n}\n\ntype FlagMatch = {\n meta: WalletMeta;\n isGeneric: boolean;\n};\n\nfunction findWalletByFlags(provider: any): FlagMatch | undefined {\n const matches: FlagMatch[] = [];\n\n for (const meta of WALLETS) {\n if (!meta.detectFlags?.length) continue;\n const hit = meta.detectFlags.some((flag) =>\n hasFlagOnProvider(provider, flag)\n );\n if (!hit) continue;\n\n const isGeneric = meta.detectFlags.every((f) => GENERIC_FLAGS.has(f));\n matches.push({ meta, isGeneric });\n }\n\n if (!matches.length) return undefined;\n\n // Prefer non-generic matches (e.g., isRabby) over generic (isMetaMask only)\n const nonGeneric = matches.filter((m) => !m.isGeneric);\n const pool = nonGeneric.length ? nonGeneric : matches;\n\n return pool.reduce((best, current) => {\n const bestScore =\n DETECT_PRIORITY.get(best.meta.id as WalletId) ?? Number.MAX_SAFE_INTEGER;\n const currentScore =\n DETECT_PRIORITY.get(current.meta.id as WalletId) ??\n Number.MAX_SAFE_INTEGER;\n return currentScore < bestScore ? current : best;\n });\n}\n\n// ────────────────────────────────────────────────────────────\n// Main resolver – how a provider becomes WalletMeta\n// ────────────────────────────────────────────────────────────\n\nfunction resolveWalletMeta(\n provider: any,\n detail?: EIP6963ProviderDetail\n): WalletMeta {\n const rdns = getProviderRdns(detail, provider);\n const nameFromProvider =\n getProviderName(detail, provider) ||\n (provider?.isRabby && \"Rabby\") ||\n (provider?.isBraveWallet && \"Brave Wallet\") ||\n (provider?.isCoinbaseWallet && \"Coinbase Wallet\") ||\n (provider?.isOkxWallet && \"OKX\") ||\n (provider?.isRainbow && \"Rainbow\") ||\n (provider?.isTahoWallet && \"Taho\") ||\n (provider?.isTally && \"Taho\") ||\n (provider?.isTrustWallet && \"Trust Wallet\") ||\n (provider?.isBitGetWallet && \"Bitget Wallet\") ||\n (provider?.isMetaMask && \"MetaMask\") ||\n \"Injected Wallet\";\n\n // 1) rdns is the most precise\n const rdnsMatch = findWalletByRdns(rdns);\n if (rdnsMatch) return rdnsMatch;\n\n // 2) Try name-based mapping\n const nameMatch = findWalletByName(nameFromProvider);\n\n // 3) Try flag-based mapping\n const flagMatch = findWalletByFlags(provider);\n\n // 4) Combine name vs flag in a sane way:\n // - If both agree on id → use that meta.\n // - If they disagree and the flag is generic (MetaMask compat),\n // trust the name instead.\n if (nameMatch && flagMatch) {\n if (nameMatch.id === flagMatch.meta.id) {\n return nameMatch;\n }\n if (flagMatch.isGeneric && nameMatch.id !== \"metamask\") {\n return nameMatch;\n }\n return flagMatch.meta;\n }\n\n if (nameMatch) return nameMatch;\n if (flagMatch) return flagMatch.meta;\n\n // 5) Fallback generic\n return createGenericWalletMeta(nameFromProvider);\n}\n\n// ────────────────────────────────────────────────────────────\n// WalletConnect virtual entry\n// ────────────────────────────────────────────────────────────\n\n/**\n * Create a \"virtual\" WalletConnect detected wallet entry.\n * This is shown when WalletConnect is configured but not an injected wallet.\n */\nexport function createWalletConnectEntry(): DetectedWallet {\n const wcMeta = WALLET_BY_ID.get(\"walletconnect\");\n if (!wcMeta) {\n throw new Error(\"WalletConnect metadata not found\");\n }\n return {\n meta: wcMeta,\n via: \"walletconnect\",\n provider: undefined, // No provider until connected\n };\n}\n\n// ────────────────────────────────────────────────────────────\n// Ranking + conversion\n// ────────────────────────────────────────────────────────────\n\nfunction rankDetected(list: DetectedWallet[]): DetectedWallet[] {\n const priority = (id: WalletId) =>\n DETECT_PRIORITY.get(id) ?? Number.MAX_SAFE_INTEGER;\n return [...list].sort(\n (a, b) => priority(a.meta.id as WalletId) - priority(b.meta.id as WalletId)\n );\n}\n\nexport function buildDetectedWalletFromProvider(\n provider: any,\n providerDetailMap: Map<any, EIP6963ProviderDetail>\n): DetectedWallet {\n const detail = providerDetailMap.get(provider);\n const meta = resolveWalletMeta(provider, detail);\n\n return {\n meta,\n via: detail ? \"eip6963\" : \"injected-flag\",\n provider,\n detail,\n };\n}\n\n// ────────────────────────────────────────────────────────────\n// React hooks\n// ────────────────────────────────────────────────────────────\n\nexport function useWalletDetection(timeoutMs = 400) {\n const [detected, setDetected] = useState<DetectedWallet[]>([]);\n\n useEffect(() => {\n let done = false;\n const w = window as any;\n const announced: EIP6963ProviderDetail[] = [];\n const providerDetailMap = new Map<any, EIP6963ProviderDetail>();\n\n const onAnnounce = (e: Event) => {\n const ce = e as AnnounceEvent;\n if (ce?.detail?.provider?.request) {\n const detail = {\n info: ce.detail.info,\n provider: ce.detail.provider,\n methods: [],\n events: [],\n } as unknown as EIP6963ProviderDetail;\n\n providerDetailMap.set(detail.provider, detail);\n announced.push(detail);\n }\n };\n\n // EIP-6963 discovery\n w.addEventListener?.(\"eip6963:announceProvider\", onAnnounce);\n w.dispatchEvent?.(new Event(\"eip6963:requestProvider\"));\n\n const tid = setTimeout(() => {\n if (done) return;\n\n const candidates = new Map<any, EIP6963ProviderDetail | undefined>();\n\n // Legacy injected: window.ethereum / window.ethereum.providers\n if (w.ethereum?.request) {\n const multi = Array.isArray(w.ethereum.providers)\n ? w.ethereum.providers\n : [w.ethereum];\n\n for (const p of multi) {\n if (!p?.request) continue;\n const detail = providerDetailMap.get(p);\n candidates.set(p, detail);\n }\n }\n\n // EIP-6963-announced providers\n for (const d of announced) {\n if (!d.provider?.request) continue;\n providerDetailMap.set(d.provider, d);\n candidates.set(d.provider, d);\n }\n\n const out: DetectedWallet[] = [];\n const seenIds = new Set<string>();\n\n for (const [provider] of candidates) {\n const wallet = buildDetectedWalletFromProvider(\n provider,\n providerDetailMap\n );\n // Deduplicate by wallet ID (same wallet can be detected via multiple methods)\n if (!seenIds.has(wallet.meta.id)) {\n seenIds.add(wallet.meta.id);\n out.push(wallet);\n }\n }\n\n // Always add WalletConnect as an option (built-in, enabled by default)\n // Only skip if explicitly disabled via config\n // const hasWalletConnect = seenIds.has(\"walletconnect\");\n // if (!hasWalletConnect && isWalletConnectConfigured()) {\n // out.push(createWalletConnectEntry());\n // }\n\n setDetected(rankDetected(out));\n w.removeEventListener?.(\"eip6963:announceProvider\", onAnnounce);\n done = true;\n }, timeoutMs);\n\n return () => {\n clearTimeout(tid);\n w.removeEventListener?.(\"eip6963:announceProvider\", onAnnounce);\n };\n }, [timeoutMs]);\n\n const detectedIds = useMemo(\n () => new Set(detected.map((d) => d.meta.id)),\n [detected]\n );\n\n return { detected, detectedIds };\n}\n\n// Minimal mobile test\nexport function useIsMobile() {\n const [isMobile, set] = useState(false);\n useEffect(() => {\n const ua = navigator.userAgent || \"\";\n set(/Android|iPhone|iPad|iPod/i.test(ua));\n }, []);\n return isMobile;\n}\n","// Very lightweight deep link helper. Extend as needed per wallet.\nexport function formatDeepLink(\n id: string,\n currentUrl: string\n): string | undefined {\n const enc = encodeURIComponent(currentUrl);\n\n switch (id) {\n case \"metamask\":\n // app schema works on iOS + Android; fallback to site detection\n return `metamask://dapp/${currentUrl}`;\n case \"coinbase\":\n // opens Coinbase Wallet and loads the dapp\n return `coinbase://wallet/dapp?url=${enc}`;\n case \"rainbow\":\n return `rainbow://connect?uri=${enc}`;\n default:\n return undefined;\n }\n}\n\n/**\n * Format a WalletConnect URI for mobile deep linking.\n * Uses the WalletConnect universal link which works across all WC-compatible wallets.\n *\n * @param wcUri - The WalletConnect URI (wc:...) from the display_uri event\n * @returns Universal link that opens wallet selector on mobile\n */\nexport function formatWalletConnectDeepLink(wcUri: string): string {\n // Universal link that works with any WalletConnect-compatible wallet\n return `https://walletconnect.com/wc?uri=${encodeURIComponent(wcUri)}`;\n}\n\n/**\n * Get a wallet-specific deep link for WalletConnect URI.\n * Some wallets have their own deep link schemes for WalletConnect.\n *\n * @param walletId - Wallet identifier (e.g., \"metamask\", \"rainbow\")\n * @param wcUri - The WalletConnect URI\n * @returns Wallet-specific deep link or universal link as fallback\n */\nexport function formatWalletConnectDeepLinkForWallet(\n walletId: string,\n wcUri: string\n): string {\n const encodedUri = encodeURIComponent(wcUri);\n\n switch (walletId) {\n case \"metamask\":\n return `metamask://wc?uri=${encodedUri}`;\n case \"rainbow\":\n return `rainbow://wc?uri=${encodedUri}`;\n case \"trust\":\n return `trust://wc?uri=${encodedUri}`;\n case \"coinbase\":\n return `cbwallet://wc?uri=${encodedUri}`;\n default:\n // Fallback to universal link\n return formatWalletConnectDeepLink(wcUri);\n }\n}\n","import type { WalletMeta, WalletId } from \"../types/\";\nimport { formatDeepLink } from \"./deepLink\";\nimport { ASSETS_BASE_URL } from \"../constants\";\n\nexport const POPULAR_ORDER: WalletId[] = [\n \"metamask\",\n \"coinbase\",\n \"walletconnect\",\n \"rainbow\",\n \"rabby\",\n \"okx\",\n \"brave\",\n \"zerion\",\n \"taho\",\n \"trust\",\n \"bitget\",\n \"phantom-evm\",\n \"imtoken\",\n \"safe\",\n \"kucoin\",\n];\n\nexport const WALLETS: WalletMeta[] = [\n {\n id: \"metamask\",\n name: \"MetaMask\",\n category: \"injected\",\n logo: `${ASSETS_BASE_URL}/assets/wallets/metamask.svg`,\n emoji: \"🦊\",\n homepage: \"https://metamask.io/\",\n chromeWebStore:\n \"https://chromewebstore.google.com/detail/metamask/nkbihfbeogaeaoehlefnkodbefgpgknn\",\n detectFlags: [\"isMetaMask\"],\n deepLink: (url) => formatDeepLink(\"metamask\", url) ?? \"\",\n },\n {\n id: \"rabby\",\n name: \"Rabby\",\n category: \"injected\",\n logo: `${ASSETS_BASE_URL}/assets/wallets/rabby.svg`,\n emoji: \"🐰\",\n homepage: \"https://rabby.io/\",\n chromeWebStore:\n \"https://chromewebstore.google.com/detail/rabby/acmacodkjbdgmoleebolmdjonilkdbch\",\n detectFlags: [\"isRabby\"],\n },\n {\n id: \"coinbase\",\n name: \"Coinbase Wallet\",\n category: \"app\",\n logo: `${ASSETS_BASE_URL}/assets/wallets/coinbase.svg`,\n emoji: \"🟦\",\n homepage: \"https://www.coinbase.com/wallet\",\n detectFlags: [\"isCoinbaseWallet\"],\n deepLink: (url) => formatDeepLink(\"coinbase\", url) ?? \"\",\n },\n {\n id: \"walletconnect\",\n name: \"WalletConnect\",\n category: \"walletconnect\",\n logo: `${ASSETS_BASE_URL}/assets/wallets/walletconnect.svg`,\n emoji: \"🪝\",\n homepage: \"https://walletconnect.com/\",\n },\n {\n id: \"rainbow\",\n name: \"Rainbow\",\n category: \"app\",\n logo: `${ASSETS_BASE_URL}/assets/wallets/rainbow.svg`,\n emoji: \"🌈\",\n homepage: \"https://rainbow.me/\",\n deepLink: (url) => formatDeepLink(\"rainbow\", url) ?? \"\",\n detectFlags: [\"isRainbow\"],\n },\n {\n id: \"okx\",\n name: \"OKX\",\n category: \"injected\",\n logo: `${ASSETS_BASE_URL}/assets/wallets/okx.svg`,\n emoji: \"⬛\",\n homepage: \"https://www.okx.com/web3\",\n detectFlags: [\"isOkxWallet\"],\n },\n {\n id: \"brave\",\n name: \"Brave Wallet\",\n category: \"injected\",\n logo: `${ASSETS_BASE_URL}/assets/wallets/brave.svg`,\n emoji: \"🦁\",\n homepage: \"https://brave.com/wallet/\",\n detectFlags: [\"isBraveWallet\"],\n },\n {\n id: \"zerion\",\n name: \"Zerion\",\n category: \"app\",\n logo: `${ASSETS_BASE_URL}/assets/wallets/zerion.png`,\n emoji: \"🧿\",\n homepage: \"https://zerion.io/wallet/\",\n },\n {\n id: \"taho\",\n name: \"Taho\",\n category: \"injected\",\n logo: `${ASSETS_BASE_URL}/assets/wallets/taho.png`,\n emoji: \"🟪\",\n homepage: \"https://taho.xyz/\",\n detectFlags: [\"isTally\", \"isTallyWallet\", \"isTahoWallet\"],\n },\n {\n id: \"trust\",\n name: \"Trust Wallet\",\n category: \"app\",\n logo: `${ASSETS_BASE_URL}/assets/wallets/trust.svg`,\n emoji: \"🛡️\",\n homepage: \"https://trustwallet.com/\",\n detectFlags: [\"isTrustWallet\"],\n },\n {\n id: \"bitget\",\n name: \"Bitget Wallet\",\n category: \"injected\",\n logo: `${ASSETS_BASE_URL}/assets/wallets/bitget.svg`,\n emoji: \"🟩\",\n homepage: \"https://web3.bitget.com/\",\n detectFlags: [\"isBitGetWallet\"],\n },\n {\n id: \"phantom-evm\",\n name: \"Phantom (EVM)\",\n category: \"injected\",\n logo: `${ASSETS_BASE_URL}/assets/wallets/phantom.svg`,\n emoji: \"👻\",\n homepage: \"https://phantom.app/\",\n detectFlags: [\"isPhantom\"],\n },\n {\n id: \"safe\",\n name: \"Safe\",\n category: \"app\",\n logo: `${ASSETS_BASE_URL}/assets/wallets/safe.svg`,\n emoji: \"🟩\",\n homepage: \"https://safe.global/\",\n },\n {\n id: \"kucoin\",\n name: \"KuCoin Wallet\",\n category: \"app\",\n logo: `${ASSETS_BASE_URL}/assets/wallets/kucoin.svg`,\n emoji: \"🟦\",\n homepage: \"https://www.kucoin.com/\",\n },\n];\n","import type {\n DetectedWallet,\n WalletInterFaceAPI,\n SimpleWalletInterface,\n} from \"../types\";\nimport type { WagmiBridge } from \"./bridges\";\nimport { connectDetectedWallet } from \"./connect\";\nimport { useWalletDetection } from \"./detect\"; // you can also inline detect() if you want non-react\n\ntype Status = \"idle\" | \"detecting\" | \"connecting\" | \"connected\" | \"error\";\ntype Listener = (s: Status) => void;\n\nclass WalletManager {\n private _status: Status = \"idle\";\n private _wallet: WalletInterFaceAPI | null = null;\n private _detected: DetectedWallet[] = [];\n private _listeners = new Set<Listener>();\n private _error: unknown;\n\n get status() {\n return this._status;\n }\n get error() {\n return this._error;\n }\n get detected(): DetectedWallet[] {\n return this._detected;\n }\n get wallet(): WalletInterFaceAPI | null {\n return this._wallet;\n }\n get simple(): SimpleWalletInterface | null {\n if (!this._wallet) return null;\n const { getAddress, getChainId, switchChain } = this._wallet;\n return { getAddress, getChainId, switchChain };\n }\n\n onChange(fn: Listener) {\n this._listeners.add(fn);\n return () => this._listeners.delete(fn);\n }\n private emit() {\n for (const fn of this._listeners) fn(this._status);\n }\n\n /** Provide detection results (from your hook or custom function). */\n setDetected(list: DetectedWallet[]) {\n this._detected = list;\n }\n\n /** Optional: auto attach to the first/best detected wallet. */\n async autoAttach(opts?: {\n wagmi?: WagmiBridge;\n pick?: (list: DetectedWallet[]) => DetectedWallet | undefined;\n }) {\n if (!this._detected.length) return;\n const target = (opts?.pick ?? ((l) => l[0]))(this._detected);\n if (!target) return;\n await this.connectDetected(target, opts);\n }\n\n async connectDetected(\n target: DetectedWallet,\n opts?: { wagmi?: WagmiBridge }\n ) {\n this._status = \"connecting\";\n this.emit();\n try {\n const { api } = await connectDetectedWallet(target, {\n wagmi: opts?.wagmi,\n });\n // Set wallet for both eip1193 and walletconnect (api is returned for both)\n if (api) this._wallet = api;\n this._status = \"connected\";\n } catch (e) {\n this._error = e;\n this._status = \"error\";\n } finally {\n this.emit();\n }\n }\n\n async disconnect(wagmi?: WagmiBridge) {\n if (wagmi) await wagmi.disconnect().catch(() => {});\n this._wallet = null;\n this._status = \"idle\";\n this.emit();\n }\n\n /** Directly attach a pre-provided wallet interface (from old provider prop). */\n attachWallet(api: WalletInterFaceAPI) {\n this._wallet = api;\n this._status = \"connected\";\n this.emit();\n }\n\n /** Optional helper to set explicit status (e.g., \"initializing\" UX). */\n setStatus(s: Status) {\n this._status = s;\n this.emit();\n }\n}\n\nexport const walletManager = new WalletManager();\n\n/* ---------- Optional tiny React hook to feed detection into the manager ---------- */\nimport { useEffect } from \"react\";\n\n/** If you’re in React, call this once near your widget to push detection results into the manager. */\nexport function useWireDetectionIntoManager() {\n const { detected } = useWalletDetection(); // your existing hook\n useEffect(() => {\n walletManager.setDetected(detected);\n }, [detected]);\n}\n","/* core/routes.ts */\nimport { apiBase, jsonHeaders, assertOK, rateLimitedFetch } from \"./http\";\nimport type {\n BuildRouteResult,\n RouteParams,\n RoutePlan,\n Transaction,\n} from \"../types\";\nimport { TrustwareConfigStore } from \"src/config/store\";\n\nexport type BuildRouteBody = {\n fromChain: string; // e.g. \"43114\"\n toChain: string; // link.chain_id\n fromToken: string;\n toToken: string;\n fromAmount: string; // wei string\n fromAddress: string;\n toAddress: string;\n fromAmountUsd?: string; // optional USD string\n refundAddress?: string;\n slippage?: number; // bps or %\n linkId?: string; // optional link identifier\n // optional passthrough:\n memo?: string;\n};\n\nexport type TxRequest = {\n to?: string;\n target?: string;\n data: string;\n value?: string; // wei string\n gasLimit?: string; // wei string\n maxFeePerGas?: string; // wei string\n maxPriorityFeePerGas?: string; // wei string\n chainId?: number | string; // sometimes provided by BE\n gasPrice?: string; // wei string, legacy gas price (optional if EIP-1559 fields are present)\n};\n\nexport type BuildRouteResponse = {\n intentId?: string;\n route?: RoutePlan;\n data?: {\n intentId?: string;\n route?: RoutePlan;\n };\n error?: string;\n message?: string;\n};\n\n// @title Build Route\n// @description Builds a cross-chain or same-chain route based on the provided parameters. Returns a RouteIntent object containing details of the route.\n// @param {RouteParams} p - The parameters for building the route.\n// @param RouteParams.fromChain - The source chain identifier (e.g., \"ethereum\", \"bsc\").\n// @param RouteParams.toChain - The destination chain identifier (e.g., \"polygon\", \"avalanche\").\n// @param RouteParams.fromToken - The token address or symbol on the source chain.\n// @param RouteParams.toToken - The token address or symbol on the destination chain.\n// @param RouteParams.fromAmount - The amount of the source token to be transferred (in smallest unit, e.g., wei).\n// @param RouteParams.fromAddress - The address on the source chain from which the tokens will be sent.\n// @param RouteParams.toAddress - The address on the destination chain to which the tokens will be sent.\n// @param RouteParams.slippage - (Optional) The maximum acceptable slippage percentage for the swap (default is 0.5%).\n// @returns {Promise<RouteIntent>} - A promise that resolves to a RouteIntent object.\n// @throws {Error} - Throws an error if the API request fails or if the response is invalid.\n// @example\n// const routeParams = {\n// fromChain: 'ethereum',\n// toChain: 'polygon',\n// fromToken: 'ETH',\n// toToken: 'MATIC',\n// fromAmount: '1000000000000000000', // 1 ETH in wei\n// fromAddress: '0xYourSourceAddress',\n// toAddress: '0xYourDestinationAddress',\n// slippage: 0.5, // Optional\n// };\nexport async function buildRoute1(p: RouteParams): Promise<BuildRouteResult> {\n const r = await rateLimitedFetch(`${apiBase()}/squid/route`, {\n method: \"POST\",\n headers: jsonHeaders(),\n credentials: \"omit\",\n body: JSON.stringify(p),\n });\n await assertOK(r);\n const j = await r.json();\n return j.data as BuildRouteResult;\n}\n\nexport async function buildRoute(\n // backendBase: string,\n body: BuildRouteBody,\n signal?: AbortSignal\n): Promise<{\n intentId: string;\n txReq: TxRequest;\n actions: unknown[];\n finalExchangeRate: {\n fromAmountUSD?: string;\n toAmountMinUSD?: string;\n };\n route: RoutePlan | undefined;\n}> {\n const cfg = TrustwareConfigStore.get();\n const url = `${apiBase()}/routes/route`;\n const payload = {\n ...body,\n slippageBps:\n body.slippage === undefined ? undefined : Math.round(body.slippage * 100),\n fromAmountUSD: body.fromAmountUsd,\n };\n const r = await rateLimitedFetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\", \"X-API-Key\": cfg.apiKey },\n body: JSON.stringify(payload),\n signal,\n });\n\n let json: BuildRouteResponse = {};\n try {\n json = await r.json();\n } catch {\n // response body not JSON\n }\n\n if (!r.ok) {\n const msg = json?.error || json?.message || \"Failed to build route\";\n throw new Error(msg);\n }\n\n const intentId = json?.data?.intentId ?? json?.intentId ?? \"\";\n const route = json?.data?.route ?? json?.route;\n const txReq: TxRequest | undefined = route?.execution?.transaction;\n const actions = Array.isArray(route?.steps) ? route.steps : [];\n const estimate = route?.estimate ?? {};\n\n const finalExchangeRate = {\n fromAmountUSD: (estimate as { fromAmountUsd?: string }).fromAmountUsd,\n toAmountMinUSD: estimate?.toAmountUsd,\n };\n\n if (!txReq?.data || !(txReq?.to || txReq?.target)) {\n throw new Error(\"Invalid route: missing transactionRequest target/data\");\n }\n\n return { intentId, txReq, actions, finalExchangeRate, route };\n}\n\n// @title Submit Receipt\n// @description Submits a transaction receipt for a previously created route intent. This function is used to inform the system of the transaction hash associated with the route intent.\n// @param {string} intentId - The unique identifier of the route intent.\n// @param {string} txHash - The transaction hash of the submitted transaction.\n// @returns {Promise<any>} - A promise that resolves to the response data from the API.\n// @throws {Error} - Throws an error if the API request fails or if the response is invalid.\n// @example\n// const intentId = 'your-route-intent-id';\n// const txHash = '0xYourTransactionHash';\n// const receiptResponse = await submitReceipt(intentId, txHash);\nexport async function submitReceipt(intentId: string, txHash: string) {\n const r = await rateLimitedFetch(\n `${apiBase()}/route-intent/${intentId}/receipt`,\n {\n method: \"POST\",\n headers: jsonHeaders({ \"Idempotency-Key\": txHash }),\n body: JSON.stringify({ txHash }),\n }\n );\n await assertOK(r);\n const j = await r.json();\n return j.data;\n}\n\n// @title Get Route Intent Status\n// @description Retrieves the current status of a route intent based on its unique identifier. This function is used to check the progress of a cross-chain or same-chain transaction.\n// @param {string} intentId - The unique identifier of the route intent.\n// @returns {Promise<Transaction>} - A promise that resolves to a Transaction object containing the status and details of the route intent.\n// @throws {Error} - Throws an error if the API request fails or if the response is invalid.\n// @example\n// const intentId = 'your-route-intent-id';\n// const transactionStatus = await getStatus(intentId);\nexport async function getStatus(intentId: string): Promise<Transaction> {\n const r = await rateLimitedFetch(\n `${apiBase()}/route-intent/${intentId}/status`,\n {\n headers: jsonHeaders(),\n }\n );\n await assertOK(r);\n const j = await r.json();\n return j.data as Transaction;\n}\n\n// @title Poll Route Intent Status\n// @description Polls the status of a route intent at regular intervals until it reaches a terminal state (success or failed) or a timeout occurs. This function is useful for monitoring the progress of a transaction.\n// @param {string} intentId - The unique identifier of the route intent.\n// @param {Object} [options] - Optional parameters for polling.\n// @param {number} [options.intervalMs=2000] - The interval in milliseconds between each status check (default is 2000ms).\n// @param {number} [options.timeoutMs=300000] - The maximum time in milliseconds to wait before timing out (default is 300000ms or 5 minutes).\n// @returns {Promise<Transaction>} - A promise that resolves to a Transaction object containing the final status and details of the route intent.\n// @throws {Error} - Throws an error if the API request fails during polling.\n// @example\n// const intentId = 'your-route-intent-id';\n// const finalStatus = await pollStatus(intentId, { intervalMs: 3000, timeoutMs: 600000 });\nexport async function pollStatus(\n intentId: string,\n { intervalMs = 2000, timeoutMs = 5 * 60_000 } = {}\n): Promise<Transaction> {\n const t0 = Date.now();\n while (true) {\n const tx = await getStatus(intentId);\n if (tx.status === \"success\" || tx.status === \"failed\") return tx;\n if (Date.now() - t0 > timeoutMs) return tx;\n await new Promise((r) => setTimeout(r, intervalMs));\n }\n}\n","/* core/balances.ts */\nimport type { BalanceRow, WalletAddressBalanceWrapper } from \"../types/\";\nimport { apiBase, jsonHeaders } from \"./http\";\nimport { Registry } from \"../registry\";\n\nexport type { BalanceRow };\n\n/** Map chainId -> backend chain_key and return balances */\nexport async function getBalances(\n chainId: string | number,\n address: string\n): Promise<BalanceRow[]> {\n const reg = await ensureRegistry();\n const meta = reg.chain(chainId);\n const chainKey = meta?.networkIdentifier || String(chainId);\n const url = `${apiBase()}/data/wallets/${encodeURIComponent(chainKey)}/${address}/balances`;\n const r = await fetch(url, {\n method: \"GET\",\n credentials: \"omit\",\n headers: jsonHeaders(),\n });\n if (!r.ok) throw new Error(`balances: HTTP ${r.status}`);\n const j = await r.json();\n const rows: BalanceRow[] = Array.isArray(j) ? j : (j.data ?? []);\n return rows;\n}\nexport async function getBalancesByAddress(\n address: string\n): Promise<WalletAddressBalanceWrapper[]> {\n const url = `${apiBase()}/data/balances/${address}`;\n const r = await fetch(url, {\n method: \"GET\",\n credentials: \"omit\",\n headers: jsonHeaders(),\n });\n if (!r.ok) throw new Error(`balances: HTTP ${r.status}`);\n const j = await r.json();\n const rows: WalletAddressBalanceWrapper[] = Array.isArray(j)\n ? j\n : (j.results ?? []);\n return rows;\n}\n\n/** lazily create one registry bound to current API key */\nlet _registry: Registry | undefined;\nasync function ensureRegistry(): Promise<Registry> {\n if (!_registry) {\n _registry = new Registry(apiBase());\n }\n await _registry.ensureLoaded();\n return _registry;\n}\n","/* core/tx.ts */\nimport type { BuildRouteResult } from \"../types\";\nimport { walletManager } from \"../wallets/\";\nimport { buildRoute, submitReceipt, pollStatus } from \"./routes\";\n\nfunction isUserRejected(e: unknown): boolean {\n const code =\n (e as Record<string, unknown>)?.code ??\n ((e as Record<string, Record<string, unknown>>)?.data?.code as number);\n if (code === 4001) return true;\n const msg = String((e as Error)?.message || e)?.toLowerCase?.() || \"\";\n return msg.includes(\"user rejected\") || msg.includes(\"user denied\");\n}\n\nexport async function sendRouteTransaction(\n b: BuildRouteResult,\n fallbackChainId?: number\n): Promise<`0x${string}`> {\n const w = walletManager.wallet;\n if (!w) throw new Error(\"Trustware.wallet not configured\");\n // const tr = b.route?.transactionRequest;\n const tr = b?.txReq;\n const to = tr.to as `0x${string}`;\n const data = tr.data as `0x${string}`;\n const value = tr.value ? BigInt(tr.value) : 0n;\n\n const target = Number(tr.chainId ?? fallbackChainId);\n if (Number.isFinite(target)) {\n const current = await w.getChainId();\n if (current !== target) {\n try {\n await w.switchChain(target);\n } catch {\n // switchChain failed/skipped — non-fatal, continue with transaction\n }\n }\n }\n\n if (w.type === \"eip1193\") {\n const from = await w.getAddress();\n const hexValue = value ? `0x${value.toString(16)}` : \"0x0\";\n const params: Record<string, unknown> = { from, to, data, value: hexValue };\n if (Number.isFinite(target)) params.chainId = `0x${target!.toString(16)}`;\n\n const hash = await w.request({\n method: \"eth_sendTransaction\",\n params: [params],\n });\n return hash as `0x${string}`;\n } else {\n const resp = await w.sendTransaction({\n to,\n data,\n value,\n chainId: Number.isFinite(target) ? target : undefined,\n });\n return resp.hash as `0x${string}`;\n }\n}\n\n/** One-shot flow that mirrors your old runTopUp */\nexport async function runTopUp(params: {\n fromChain?: string;\n toChain?: string;\n fromToken?: string;\n toToken?: string;\n toAddress?: string;\n fromAmount: string | number;\n}) {\n const w = walletManager.wallet;\n if (!w) throw new Error(\"Trustware.wallet not configured\");\n\n // lazy import to avoid circular import with Registry users\n const { Registry, NATIVE } = await import(\"../registry\");\n const { apiBase } = await import(\"./http\");\n\n const reg = new Registry(apiBase());\n await reg.ensureLoaded();\n\n const fromAddress = await w.getAddress();\n const currentChainId = await w.getChainId();\n const originalChain = currentChainId;\n\n const fromChain = params.fromChain ?? String(currentChainId);\n\n // get default toChain/toToken from config\n const { TrustwareConfigStore } = await import(\"../config/store\");\n const cfg = TrustwareConfigStore.get();\n const toChain = params.toChain ?? String(cfg.routes.toChain);\n\n const fromToken =\n reg.resolveToken(\n fromChain,\n params.fromToken ?? (cfg.routes.fromToken as string) ?? undefined\n ) ?? NATIVE;\n const toToken =\n reg.resolveToken(\n toChain,\n params.toToken ?? (cfg.routes.toToken as string) ?? undefined\n ) ?? NATIVE;\n\n try {\n const build = await buildRoute({\n fromChain,\n toChain,\n fromToken,\n toToken,\n fromAmount: String(params.fromAmount),\n fromAddress,\n toAddress:\n params.toAddress ??\n cfg.routes.toAddress ??\n (cfg.routes.fromAddress as string | undefined) ??\n fromAddress,\n slippage: cfg.routes.defaultSlippage,\n });\n\n const hash = await sendRouteTransaction(build, Number(fromChain));\n await submitReceipt(build.intentId, hash);\n const tx = await pollStatus(build.intentId);\n return tx;\n } catch (e: unknown) {\n if (isUserRejected(e)) throw new Error(\"Transaction cancelled by user\");\n throw e;\n } finally {\n try {\n if (originalChain && originalChain !== Number(fromChain)) {\n await w.switchChain(originalChain);\n }\n } catch {\n // switch back skipped — non-fatal\n }\n }\n}\n","import { useState, useEffect, useMemo } from \"react\";\nimport { getSharedRegistry } from \"./registryClient\";\nimport type { ChainDef } from \"../types\";\nimport {\n canonicalChainKeyForLink,\n canonicalSeiChainKey,\n normalizeChainType,\n} from \"src/widget-v2/helpers/chainHelpers\";\n\nexport interface UseChainsResult {\n /** All available chains */\n chains: ChainDef[];\n /** Popular/featured chains (Ethereum, Polygon, Base) */\n popularChains: ChainDef[];\n /** Other chains (not in popular list) */\n otherChains: ChainDef[];\n /** Whether chains are currently loading */\n isLoading: boolean;\n /** Error message if loading failed */\n error: string | null;\n\n chainMap: Map<string, ChainDef>;\n}\n\n/** Chain IDs for popular chains */\nconst POPULAR_CHAIN_IDS = new Set([\n 1, // Ethereum Mainnet\n 137, // Polygon\n 8453, // Base\n]);\n\nfunction filterSupportedChains(chains: ChainDef[]): ChainDef[] {\n const supportedChainTypes = new Set([\"evm\", \"solana\", \"cosmos\", \"bitcoin\"]);\n return chains.filter((chain) => {\n const chainType = normalizeChainType(chain);\n if (!chainType) return false;\n if (!supportedChainTypes.has(chainType)) {\n return false;\n }\n if (chainType === \"evm\") {\n // hide none working chains for now [Hedera]\n const evmKey = canonicalChainKeyForLink(chain);\n // console.log(\n // \"Checking EVM chain:\",\n // chain.chainId,\n // \"canonical key:\",\n // evmKey\n // );\n const disabledEvmChains = new Set([\"hedera\", \"295\"]);\n if (evmKey && disabledEvmChains.has(evmKey)) {\n return false;\n }\n }\n if (chainType === \"cosmos\") {\n const seiKey = canonicalSeiChainKey(chain.chainId ?? chain.id);\n if (seiKey !== \"sei\" && seiKey !== \"pacific-1\") {\n return false;\n }\n }\n // hide bitcoin for now until we have a better address resoultion for btc maybe wait for squid. or use lifi not sure yet\n if (chainType === \"bitcoin\") {\n return false;\n }\n return true;\n });\n}\n\n/**\n * Hook to load available chains from the registry.\n * Returns chains split into popular and other categories.\n */\nexport function useChains(): UseChainsResult {\n const [chains, setChains] = useState<ChainDef[]>([]);\n const [chainMap, setChainMap] = useState<Map<string, ChainDef>>(new Map());\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n const registry = getSharedRegistry();\n\n useEffect(() => {\n if (chains.length > 0) return;\n\n let cancelled = false;\n\n const loadChains = async () => {\n try {\n setIsLoading(true);\n setError(null);\n\n await registry.ensureLoaded();\n\n if (cancelled) return;\n\n // Filter and sort chains\n const loadedChains = registry.chains();\n // .filter((chain) => chain.visible !== false);\n // .filter((chain) => {\n // // Only include EVM chains\n // const type = (chain.type ?? chain.chainType)\n // ?.toString()\n // .toLowerCase();\n // return !type || type === \"evm\";\n // })\n // .sort((a, b) =>\n // resolveChainLabel(a).localeCompare(resolveChainLabel(b))\n // );\n const supportedChains = filterSupportedChains(loadedChains);\n const chainMap: Map<string, ChainDef> = new Map(\n supportedChains.map((chain) => [\n (chain.chainId ?? chain.id) as string,\n chain,\n ])\n );\n\n setChainMap(chainMap);\n\n setChains(supportedChains);\n } catch (err) {\n if (!cancelled) {\n const message =\n err instanceof Error ? err.message : \"Failed to load chains\";\n setError(message);\n setChains([]);\n }\n } finally {\n if (!cancelled) {\n setIsLoading(false);\n }\n }\n };\n\n void loadChains();\n\n return () => {\n cancelled = true;\n };\n }, [registry, chains.length]);\n\n // Split chains into popular and other\n const { popularChains, otherChains } = useMemo(() => {\n const popular: ChainDef[] = [];\n const other: ChainDef[] = [];\n\n for (const chain of chains) {\n const chainId = Number(chain.chainId ?? chain.id);\n if (POPULAR_CHAIN_IDS.has(chainId)) {\n popular.push(chain);\n } else {\n other.push(chain);\n }\n }\n\n // Sort popular chains by the order in POPULAR_CHAIN_IDS\n const popularOrder = [1, 137, 8453];\n popular.sort((a, b) => {\n const aId = Number(a.chainId ?? a.id);\n const bId = Number(b.chainId ?? b.id);\n return popularOrder.indexOf(aId) - popularOrder.indexOf(bId);\n });\n\n return { popularChains: popular, otherChains: other };\n }, [chains]);\n\n return {\n chains,\n chainMap,\n popularChains,\n otherChains,\n isLoading,\n error,\n };\n}\n","import { TrustwareConfigStore } from \"../config\";\nimport { Registry } from \"../registry\";\nimport { apiBase } from \"./http\";\n\nconst registryCache = new Map<string, Registry>();\n\nfunction registryCacheKey(): string {\n const base = apiBase();\n const apiKey = TrustwareConfigStore.peek()?.apiKey ?? \"__uninitialized__\";\n return `${base}::${apiKey}`;\n}\n\nexport function getSharedRegistry(): Registry {\n const key = registryCacheKey();\n const existing = registryCache.get(key);\n if (existing) {\n return existing;\n }\n\n const registry = new Registry(apiBase());\n registryCache.set(key, registry);\n return registry;\n}\n","import { ChainDef } from \"src/types\";\n\nexport function normalizeChainKey(id: string | number | null): string {\n if (id === undefined || id === null) return \"\";\n return String(id).trim().toLowerCase();\n}\n\nexport const NATIVE_EVM = \"0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee\" as const;\nexport const NATIVE_SOLANA =\n \"So11111111111111111111111111111111111111111\" as const;\n\ntype TokenAddressLookupEntry = {\n address: string;\n symbol: string;\n chainId: string | number;\n};\n\nexport function getNativeTokenAddress(chainType?: ChainDef[\"type\"] | null) {\n const normalized = chainType?.toLowerCase?.();\n return normalized === \"solana\" ? NATIVE_SOLANA : NATIVE_EVM;\n}\n\nexport function parseDecimalToWei(\n input: string,\n decimals: number\n): bigint | null {\n // accepts strings like \"1\", \"1.\", \".5\", \"0.1234\"\n if (!input?.trim()) return null;\n const s = input.trim();\n if (!/^\\d*\\.?\\d*$/.test(s)) return null;\n const [intPartRaw, fracRaw = \"\"] = s.split(\".\");\n const intPart = intPartRaw.length ? BigInt(intPartRaw) : 0n;\n const frac = (fracRaw + \"0\".repeat(decimals)).slice(0, decimals); // pad/right-trim\n const fracPart = frac ? BigInt(frac) : 0n;\n const base = 10n ** BigInt(decimals);\n return intPart * base + fracPart;\n}\n\nconst CHAIN_TYPE_ALIASES: Record<string, SquidChainType> = {\n btc: \"bitcoin\",\n bitcoin: \"bitcoin\",\n sei: \"cosmos\",\n \"pacific-1\": \"cosmos\",\n};\n\nexport type SquidChainType = \"evm\" | \"cosmos\" | \"solana\" | \"btc\" | string;\n\nexport function normalizeChainType(\n chain?: ChainDef | SquidChainType | string | null\n): SquidChainType | undefined {\n if (!chain) return undefined;\n const raw =\n typeof chain === \"string\"\n ? chain\n : (chain.type ??\n chain.chainType ??\n chain.networkIdentifier ??\n chain.chainId ??\n chain.id ??\n chain.networkName ??\n chain.axelarChainName);\n if (!raw) return undefined;\n const normalized = String(raw).trim().toLowerCase();\n return CHAIN_TYPE_ALIASES[normalized] ?? normalized;\n}\n\nexport function canonicalChainKeyForLink(chain: ChainDef): string {\n const seiKey = canonicalSeiChainKey(chain.chainId ?? chain.id);\n if (seiKey) return seiKey;\n return normalizeChainKey(\n chain.networkIdentifier ??\n chain.axelarChainName ??\n chain.id ??\n chain.chainId ??\n chain.networkName\n );\n}\n\nconst SEI_EVM_CHAIN_ID = \"1329\";\nconst SEI_COSMOS_CHAIN_ID = \"pacific-1\";\n\nexport function canonicalSeiChainKey(\n chainId: ChainDef[\"chainId\"] | ChainDef[\"id\"] | null\n): string | null {\n const normalized = normalizeChainKey(chainId as string | number | null);\n if (!normalized) return null;\n if (normalized === SEI_EVM_CHAIN_ID) return \"sei-evm\";\n if (normalized === SEI_COSMOS_CHAIN_ID) return \"sei\";\n return null;\n}\n\nexport function isZeroAddrLike(\n a?: string | null,\n chainType?: ChainDef[\"type\"] | null\n) {\n if (!a) return true;\n if (!chainType) return false;\n const s = normalizeAddress(a, chainType);\n return (\n s === normalizeAddress(getNativeTokenAddress(chainType), chainType) ||\n s === \"0x0000000000000000000000000000000000000000\"\n );\n}\n\nexport function normalizeAddress(\n address: string,\n chainType?: ChainDef[\"type\"]\n) {\n if (chainType?.toLowerCase?.() === \"solana\") {\n const trimmed = address.trim();\n return trimmed.startsWith(\"0x\") ? trimmed.toLowerCase() : trimmed;\n }\n return address.toLowerCase();\n}\n\nexport function isNativeTokenAddress(\n address?: string | null,\n chainType?: ChainDef[\"type\"] | null\n) {\n if (!address) return false;\n if (!chainType) return false;\n return (\n normalizeAddress(address, chainType) ===\n normalizeAddress(getNativeTokenAddress(chainType), chainType)\n );\n}\n\n/**\n * Canonicalizes token identifiers across indexer and registry sources,\n * with cosmos native denom support (e.g. Sei \"usei\").\n */\nexport function canonicalTokenAddressForChain(\n chain: ChainDef,\n address?: string,\n chainTokens: TokenAddressLookupEntry[] = []\n): string {\n const chainType = normalizeChainType(chain);\n const rawAddress = (address ?? \"\").trim();\n\n // Solana is base58 and case-sensitive.\n if (chainType === \"solana\") return rawAddress;\n\n if (chainType === \"cosmos\") {\n const chainIdKey = normalizeChainKey(chain.chainId ?? chain.id ?? \"\");\n const nativeSymbol = chain.nativeCurrency?.symbol?.toUpperCase?.();\n const nativeFromRegistry = chainTokens.find(\n (token) =>\n normalizeChainKey(token.chainId) === chainIdKey &&\n token.symbol?.toUpperCase?.() === nativeSymbol\n );\n const nativeDenom = (nativeFromRegistry?.address ?? \"usei\").toLowerCase();\n\n if (rawAddress.toLowerCase() === NATIVE_EVM) {\n return nativeDenom;\n }\n\n return rawAddress.toLowerCase();\n }\n\n const lowerAddress = rawAddress.toLowerCase();\n if (lowerAddress === \"0x0000000000000000000000000000000000000000\") {\n return NATIVE_EVM;\n }\n return lowerAddress;\n}\n","import { useState, useEffect, useMemo } from \"react\";\nimport { getSharedRegistry } from \"./registryClient\";\nimport type { TokenDef } from \"../types\";\nimport type { Token } from \"../widget-v2/context/DepositContext\";\nimport { useChains } from \"./useChains\";\nimport { sortTokensByPopularity } from \"../widget-v2/helpers/tokenPopularity\";\n\nexport interface UseTokensResult {\n /** All available tokens for the selected chain */\n tokens: Token[];\n /** Filtered tokens based on search query */\n filteredTokens: Token[];\n /** Whether tokens are currently loading */\n isLoading: boolean;\n /** Error message if loading failed */\n error: string | null;\n /** Current search query */\n searchQuery: string;\n /** Set the search query to filter tokens */\n setSearchQuery: (query: string) => void;\n}\n\n/**\n * Convert TokenDef from registry to Token interface used by context\n */\nfunction mapTokenDefToToken(tokenDef: TokenDef): Token {\n return {\n address: tokenDef.address,\n chainId: tokenDef.chainId,\n symbol: tokenDef.symbol,\n name: tokenDef.name,\n decimals: tokenDef.decimals,\n iconUrl: tokenDef.logoURI,\n logoURI: tokenDef.logoURI,\n // balance is populated separately when wallet is connected\n balance: undefined,\n usdPrice: tokenDef.usdPrice,\n };\n}\n\n/**\n * Hook to load available tokens for a selected chain from the registry.\n * Supports filtering tokens by name or symbol.\n */\nexport function useTokens(chainId: number | null | undefined): UseTokensResult {\n const [tokens, setTokens] = useState<Token[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [searchQuery, setSearchQuery] = useState(\"\");\n\n const registry = getSharedRegistry();\n\n const { chainMap } = useChains();\n\n useEffect(() => {\n // Reset state when chainId changes\n setSearchQuery(\"\");\n setError(null);\n setTokens([]);\n\n if (chainId === undefined || chainMap.size === 0) {\n setIsLoading(false);\n return;\n }\n\n let cancelled = false;\n\n const loadTokens = async () => {\n try {\n setIsLoading(true);\n setError(null);\n\n await registry.ensureLoaded();\n\n if (cancelled) return;\n\n // Get tokens for the selected chain. if set to <null>, get all tokens.\n const tokenDefs =\n chainId === null ? registry.allTokens() : registry.tokens(chainId);\n\n const filteredTokens = tokenDefs.filter((item) =>\n chainMap.has(item.chainId.toString())\n );\n\n if (filteredTokens !== undefined) {\n setTokens(filteredTokens.map(mapTokenDefToToken));\n }\n // setTokens(loadedTokens);\n } catch (err) {\n if (!cancelled) {\n const message =\n err instanceof Error ? err.message : \"Failed to load tokens\";\n setError(message);\n setTokens([]);\n }\n } finally {\n if (!cancelled) {\n setIsLoading(false);\n }\n }\n };\n\n void loadTokens();\n\n return () => {\n cancelled = true;\n };\n }, [chainId, registry, chainMap]);\n\n // Filter tokens based on search query\n const filteredTokens = useMemo(() => {\n const query = searchQuery.toLowerCase().trim();\n const source =\n query.length === 0\n ? tokens\n : tokens.filter(\n (token: Token) =>\n token.symbol.toLowerCase().includes(query) ||\n token.name.toLowerCase().includes(query) ||\n token.address.toLowerCase().includes(query)\n );\n\n return sortTokensByPopularity(source);\n }, [tokens, searchQuery]);\n\n return {\n tokens,\n filteredTokens,\n isLoading,\n error,\n searchQuery,\n setSearchQuery,\n };\n}\n","{\n \"ethereum\": 1,\n \"1\": 1,\n \"arbitrum\": 2,\n \"arbitrum-one\": 2,\n \"42161\": 2,\n \"base\": 3,\n \"8453\": 3,\n \"bsc\": 4,\n \"binance\": 4,\n \"binance-smart-chain\": 4,\n \"56\": 4,\n \"solana\": 5,\n \"solana-mainnet-beta\": 5,\n \"avalanche\": 6,\n \"avalanche-c-chain\": 6,\n \"43114\": 6,\n \"tron\": 7,\n \"728126428\": 7,\n \"sui\": 8,\n \"137\": 9,\n \"polygon\": 9,\n \"polygon-pos\": 9,\n \"optimism\": 10,\n \"10\": 10,\n \"bitcoin\": 11,\n \"cosmoshub\": 12,\n \"cosmos\": 12,\n \"osmosis\": 13,\n \"sei\": 14,\n \"sei-evm\": 14,\n \"pacific-1\": 14,\n \"1329\": 14,\n \"mantle\": 15,\n \"5000\": 15,\n \"linea\": 16,\n \"59144\": 16,\n \"zksync\": 17,\n \"zksync-era\": 17,\n \"324\": 17,\n \"blast\": 18,\n \"81457\": 18,\n \"scroll\": 19,\n \"534352\": 19,\n \"sonic\": 20,\n \"146\": 20\n}\n","import chainPopularityMap from \"../data/chainPopularity.json\";\nimport { normalizeChainKey } from \"./chainHelpers\";\n\ntype ChainPopularityLookup = Record<string, number>;\n\nconst popularityByKey = chainPopularityMap as ChainPopularityLookup;\n\nexport type ChainPopularityInput = {\n chainId?: string | number | null;\n networkIdentifier?: string | number | null;\n networkName?: string | number | null;\n axelarChainName?: string | number | null;\n};\n\nexport function getChainPopularityRank(\n chain: ChainPopularityInput | null | undefined\n): number | null {\n if (!chain) return null;\n\n const aliases = [\n chain.chainId,\n chain.networkIdentifier,\n chain.networkName,\n chain.axelarChainName,\n ];\n\n for (const alias of aliases) {\n const key = normalizeChainKey(alias ?? null);\n if (!key) continue;\n\n const rank = popularityByKey[key];\n if (typeof rank === \"number\") {\n return rank;\n }\n }\n\n return null;\n}\n","import { getChainPopularityRank } from \"./chainPopularity\";\n\nexport interface TokenPopularitySortable {\n symbol?: string;\n name?: string;\n address?: string;\n balance?: string;\n chainId?: string | number;\n}\n\n/**\n * Mirrors frontend popularity ranking by symbol and well-known contracts.\n */\nconst POPULAR_TOKEN_SYMBOLS = new Set(\n [\n \"USDC\",\n \"USDC.E\",\n \"USDBC\",\n \"USDT\",\n \"DAI\",\n \"ETH\",\n \"WETH\",\n \"WBTC\",\n \"BTC\",\n \"SOL\",\n \"MATIC\",\n ].map((symbol) => symbol.toUpperCase())\n);\n\nconst POPULAR_TOKEN_CONTRACTS = new Set([\n \"0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48\", // USDC (Ethereum)\n \"0xdac17f958d2ee523a2206206994597c13d831ec7\", // USDT (Ethereum)\n \"0x6b175474e89094c44da98b954eedeac495271d0f\", // DAI (Ethereum)\n \"0x833589fcd6edb6e08f4c7c32d4f71b54bda02913\", // USDC (Base)\n \"0x3c499c542cef5e3811e1192ce70d8cc03d5c3359\", // USDC (Polygon)\n \"0x2791bca1f2de4661ed88a30c99a7a9449aa84174\", // USDC.e (Polygon)\n \"0xc2132d05d31c914a87c6611c10748aeb04b58e8f\", // USDT (Polygon)\n \"0xaf88d065e77c8cc2239327c5edb3a432268e5831\", // USDC (Arbitrum)\n \"0xfd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9\", // USDT (Arbitrum)\n \"0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee\", // EVM native token marker\n \"so11111111111111111111111111111111111111112\", // Wrapped SOL\n]);\n\nfunction normalizeSymbol(symbol?: string): string {\n return (symbol ?? \"\").trim().toUpperCase();\n}\n\nfunction normalizeAddress(address?: string): string {\n return (address ?? \"\").trim().toLowerCase();\n}\n\nfunction hasPositiveBalance(balance?: string): boolean {\n if (!balance) return false;\n const trimmed = balance.trim();\n if (!trimmed) return false;\n\n if (/^[+-]?\\d+$/.test(trimmed)) {\n try {\n return BigInt(trimmed) > 0n;\n } catch {\n return false;\n }\n }\n\n if (/^[+-]?\\d*\\.\\d+$/.test(trimmed)) {\n const isNegative = trimmed.startsWith(\"-\");\n if (isNegative) return false;\n\n const normalized = trimmed.startsWith(\"+\") ? trimmed.slice(1) : trimmed;\n const [whole, fraction = \"\"] = normalized.split(\".\");\n const wholeInt = whole ? BigInt(whole) : 0n;\n if (wholeInt > 0n) return true;\n return /[1-9]/.test(fraction);\n }\n\n const asNumber = Number(trimmed);\n return Number.isFinite(asNumber) && asNumber > 0;\n}\n\nexport function isPopularToken(token: TokenPopularitySortable): boolean {\n const normalizedSymbol = normalizeSymbol(token.symbol);\n const normalizedAddress = normalizeAddress(token.address);\n\n return (\n POPULAR_TOKEN_SYMBOLS.has(normalizedSymbol) ||\n POPULAR_TOKEN_CONTRACTS.has(normalizedAddress)\n );\n}\n\nfunction compareText(a?: string, b?: string): number {\n return (a ?? \"\").localeCompare(b ?? \"\", undefined, {\n sensitivity: \"base\",\n });\n}\n\nfunction getGroupRank(token: TokenPopularitySortable): number {\n const popular = isPopularToken(token);\n const positiveBalance = hasPositiveBalance(token.balance);\n\n if (popular && positiveBalance) return 0; // Group A\n if (popular && !positiveBalance) return 1; // Group B\n if (!popular && positiveBalance) return 2; // Group C\n return 3; // Group D\n}\n\nfunction compareChainPopularity(\n a: TokenPopularitySortable,\n b: TokenPopularitySortable\n): number {\n const rankA = getChainPopularityRank({ chainId: a.chainId });\n const rankB = getChainPopularityRank({ chainId: b.chainId });\n\n if (rankA !== null && rankB !== null && rankA !== rankB) {\n return rankA - rankB;\n }\n\n if (rankA !== null && rankB === null) return -1;\n if (rankA === null && rankB !== null) return 1;\n\n return 0;\n}\n\nexport function sortTokensByPopularity<T extends TokenPopularitySortable>(\n tokens: T[]\n): T[] {\n return tokens\n .map((token, index) => ({ token, index }))\n .sort((a, b) => {\n const rankDiff = getGroupRank(a.token) - getGroupRank(b.token);\n if (rankDiff !== 0) return rankDiff;\n\n const chainPopularityDiff = compareChainPopularity(a.token, b.token);\n if (chainPopularityDiff !== 0) return chainPopularityDiff;\n\n const symbolDiff = compareText(a.token.symbol, b.token.symbol);\n if (symbolDiff !== 0) return symbolDiff;\n\n const nameDiff = compareText(a.token.name, b.token.name);\n if (nameDiff !== 0) return nameDiff;\n\n const addressDiff = compareText(a.token.address, b.token.address);\n if (addressDiff !== 0) return addressDiff;\n\n // Stable deterministic tiebreaker for complete duplicates.\n return a.index - b.index;\n })\n .map(({ token }) => token);\n}\n","import React, {\n useState,\n useEffect,\n useRef,\n useCallback,\n useImperativeHandle,\n forwardRef,\n} from \"react\";\n\nimport { mergeStyles } from \"./lib/utils\";\nimport { spacing } from \"./styles\";\nimport {\n DepositProvider,\n useDeposit,\n type NavigationStep,\n type TransactionStatus,\n type ResolvedTheme,\n} from \"./context/DepositContext\";\nimport { ThemeToggle, WidgetContainer, type Theme, Dialog } from \"./components\";\nimport { Home } from \"./pages/Home\";\nimport { SelectToken } from \"./pages/SelectToken\";\nimport { CryptoPay } from \"./pages/CryptoPay\";\nimport { Processing } from \"./pages/Processing\";\nimport { Success } from \"./pages/Success\";\nimport { Error } from \"./pages/Error\";\n\n/**\n * SessionStorage key for persisting widget state\n */\nconst STORAGE_KEY = \"trustware-widget-state\";\n\n/**\n * Persisted widget state structure\n */\ninterface PersistedState {\n currentStep: NavigationStep;\n amount: string;\n selectedChainId?: number;\n selectedTokenAddress?: string;\n transactionHash?: string;\n transactionStatus?: TransactionStatus;\n}\n\n/**\n * Save state to sessionStorage\n */\nfunction savePersistedState(state: PersistedState): void {\n try {\n sessionStorage.setItem(STORAGE_KEY, JSON.stringify(state));\n } catch {\n // Ignore storage errors\n }\n}\n\n/**\n * Clear persisted state from sessionStorage\n */\nfunction clearPersistedState(): void {\n try {\n sessionStorage.removeItem(STORAGE_KEY);\n } catch {\n // Ignore storage errors\n }\n}\n\n/**\n * Animation direction for page transitions\n */\ntype AnimationDirection = \"forward\" | \"backward\";\n\n/**\n * Page component mapping based on navigation step\n */\nconst PAGE_COMPONENTS: Record<NavigationStep, React.ComponentType> = {\n home: Home,\n \"select-token\": SelectToken,\n \"crypto-pay\": CryptoPay,\n processing: Processing,\n success: Success,\n error: Error,\n};\n\n/**\n * Step order for determining animation direction\n */\nconst STEP_ORDER: NavigationStep[] = [\n \"home\",\n \"select-token\",\n \"crypto-pay\",\n \"processing\",\n \"success\",\n \"error\",\n];\n\n/**\n * Transaction statuses that indicate an active transaction\n */\nconst ACTIVE_TRANSACTION_STATUSES: TransactionStatus[] = [\n \"confirming\",\n \"processing\",\n \"bridging\",\n];\n\n// Styles for WidgetContent\nconst widgetContentContainerStyle: React.CSSProperties = {\n position: \"relative\",\n width: \"100%\",\n height: \"100%\",\n overflow: \"visible\",\n};\n\nconst themeToggleContainerStyle: React.CSSProperties = {\n position: \"absolute\",\n top: spacing[3],\n right: spacing[3],\n zIndex: 10,\n};\n\nconst pageContainerBaseStyle: React.CSSProperties = {\n width: \"100%\",\n height: \"100%\",\n transition: \"all 0.15s ease-out\",\n};\n\n/**\n * Props for the internal widget content\n */\ninterface WidgetContentProps {\n style?: React.CSSProperties;\n onStateChange?: (state: PersistedState) => void;\n /** Whether to show the theme toggle button */\n showThemeToggle: boolean;\n}\n\n/**\n * Internal widget content that handles page rendering and transitions\n */\nfunction WidgetContent({\n style,\n onStateChange,\n showThemeToggle,\n}: WidgetContentProps): React.ReactElement {\n const {\n currentStep,\n stepHistory,\n amount,\n selectedChain,\n selectedToken,\n transactionHash,\n transactionStatus,\n resolvedTheme,\n toggleTheme,\n } = useDeposit();\n const [displayedStep, setDisplayedStep] =\n useState<NavigationStep>(currentStep);\n const [isAnimating, setIsAnimating] = useState(false);\n const [animationDirection, setAnimationDirection] =\n useState<AnimationDirection>(\"forward\");\n const previousStepRef = useRef<NavigationStep>(currentStep);\n\n /**\n * Persist state changes to sessionStorage\n */\n useEffect(() => {\n const state: PersistedState = {\n currentStep,\n amount,\n selectedChainId: selectedChain?.chainId as number,\n selectedTokenAddress: selectedToken?.address,\n transactionHash: transactionHash ?? undefined,\n transactionStatus:\n transactionStatus !== \"idle\" ? transactionStatus : undefined,\n };\n savePersistedState(state);\n onStateChange?.(state);\n }, [\n currentStep,\n amount,\n selectedChain,\n selectedToken,\n transactionHash,\n transactionStatus,\n onStateChange,\n ]);\n\n /**\n * Handle page transitions with animation.\n * Uses setState in effect to sync animation state with external navigation changes.\n * This pattern is valid for animation state synchronization.\n */\n /* eslint-disable react-hooks/set-state-in-effect */\n useEffect(() => {\n if (currentStep === displayedStep) return;\n\n // Determine animation direction based on step order\n const currentIndex = STEP_ORDER.indexOf(currentStep);\n const previousIndex = STEP_ORDER.indexOf(previousStepRef.current);\n\n // Check if this is a back navigation\n const isBackNav =\n stepHistory.length <\n (previousStepRef.current === currentStep\n ? stepHistory.length\n : stepHistory.length);\n const direction: AnimationDirection =\n currentIndex < previousIndex || isBackNav ? \"backward\" : \"forward\";\n\n setAnimationDirection(direction);\n setIsAnimating(true);\n\n // After exit animation completes, switch pages\n const exitTimeout = setTimeout(() => {\n setDisplayedStep(currentStep);\n previousStepRef.current = currentStep;\n }, 150);\n\n // After enter animation completes, stop animating\n const enterTimeout = setTimeout(() => {\n setIsAnimating(false);\n }, 300);\n\n return () => {\n clearTimeout(exitTimeout);\n clearTimeout(enterTimeout);\n };\n }, [currentStep, displayedStep, stepHistory.length]);\n /* eslint-enable react-hooks/set-state-in-effect */\n\n const PageComponent = PAGE_COMPONENTS[displayedStep];\n\n // Calculate page container animation styles\n const getPageAnimationStyle = (): React.CSSProperties => {\n if (!isAnimating) return {};\n\n if (displayedStep !== currentStep) {\n // Exit animation\n if (animationDirection === \"forward\") {\n return { opacity: 0, transform: \"translateX(-1rem)\" };\n } else {\n return { opacity: 0, transform: \"translateX(1rem)\" };\n }\n } else {\n // Enter animation - use CSS animation class\n return {};\n }\n };\n\n // Determine animation class for enter animation\n const getAnimationClass = (): string => {\n if (isAnimating && displayedStep === currentStep) {\n if (animationDirection === \"forward\") {\n return \"tw-animate-slide-in-right\";\n } else {\n return \"tw-animate-slide-in-left\";\n }\n }\n return \"\";\n };\n\n return (\n <div style={mergeStyles(widgetContentContainerStyle, style)}>\n {/* Theme toggle button - positioned in top-right corner */}\n {showThemeToggle && (\n <div style={themeToggleContainerStyle}>\n <ThemeToggle theme={resolvedTheme} onToggle={toggleTheme} />\n </div>\n )}\n <div\n className={getAnimationClass()}\n style={mergeStyles(pageContainerBaseStyle, getPageAnimationStyle())}\n >\n <PageComponent />\n </div>\n </div>\n );\n}\n\n/**\n * Ref methods exposed by TrustwareWidgetV2\n */\nexport interface TrustwareWidgetV2Ref {\n /** Open the widget */\n open: () => void;\n /** Close the widget (shows confirmation if transaction active) */\n close: () => void;\n /** Check if widget is currently open */\n isOpen: () => boolean;\n}\n\nexport interface TrustwareWidgetV2Props {\n /** Widget theme - light, dark, or system preference (used as initial theme) */\n theme?: Theme;\n /** Additional inline styles */\n style?: React.CSSProperties;\n /** Initial navigation step (defaults to 'home') */\n initialStep?: NavigationStep;\n /** Whether the widget is initially open (defaults to true for inline usage) */\n defaultOpen?: boolean;\n /** Callback when the widget is closed */\n onClose?: () => void;\n /** Callback when the widget is opened */\n onOpen?: () => void;\n /** Whether to show the theme toggle button (defaults to true) */\n showThemeToggle?: boolean;\n}\n\n/**\n * Confirmation dialog for closing during active transaction\n */\ninterface ConfirmCloseDialogProps {\n open: boolean;\n onConfirm: () => void;\n onCancel: () => void;\n /** Current theme for styling */\n theme: ResolvedTheme;\n}\n\nfunction ConfirmCloseDialog({\n open,\n onConfirm,\n onCancel,\n theme,\n}: ConfirmCloseDialogProps): React.ReactElement {\n const isDark = theme === \"dark\";\n\n return (\n <>\n <Dialog\n open={open}\n onCancel={onCancel}\n onConfirm={onConfirm}\n title={\"Transaction in Progress\"}\n description={\n \"You have an active transaction. Closing the widget will not cancel your transaction, but you will lose visibility of its progress.\"\n }\n isDark={isDark}\n // style={customDarkStyles}\n />\n </>\n );\n}\n\n/**\n * Inner widget component with access to context\n */\ninterface WidgetInnerProps {\n theme: Theme;\n style?: React.CSSProperties;\n onClose?: () => void;\n onStateChange?: (state: PersistedState) => void;\n closeRequestRef: React.MutableRefObject<(() => void) | null>;\n /** Whether to show the theme toggle button */\n showThemeToggle: boolean;\n}\n\nfunction WidgetInner({\n style,\n onClose,\n onStateChange,\n closeRequestRef,\n showThemeToggle,\n}: WidgetInnerProps): React.ReactElement {\n const { transactionStatus, resetState, resolvedTheme } = useDeposit();\n const [showConfirmDialog, setShowConfirmDialog] = useState(false);\n\n /**\n * Handle close request - shows confirmation if transaction is active\n */\n const handleCloseRequest = useCallback(() => {\n if (ACTIVE_TRANSACTION_STATUSES.includes(transactionStatus)) {\n setShowConfirmDialog(true);\n } else {\n // Clear persisted state on close when no active transaction\n if (transactionStatus === \"success\" || transactionStatus === \"error\") {\n clearPersistedState();\n resetState();\n }\n onClose?.();\n }\n }, [transactionStatus, onClose, resetState]);\n\n // Expose close request handler to parent via useEffect to avoid ref access during render\n useEffect(() => {\n closeRequestRef.current = handleCloseRequest;\n }, [handleCloseRequest, closeRequestRef]);\n\n /**\n * Confirm close during active transaction\n */\n const handleConfirmClose = useCallback(() => {\n setShowConfirmDialog(false);\n onClose?.();\n }, [onClose]);\n\n /**\n * Cancel close during active transaction\n */\n const handleCancelClose = useCallback(() => {\n setShowConfirmDialog(false);\n }, []);\n\n // Use resolved theme from context for the container (allows toggle to work)\n const effectiveTheme = resolvedTheme as Theme;\n\n return (\n <>\n <WidgetContainer theme={effectiveTheme} style={style}>\n <WidgetContent\n onStateChange={onStateChange}\n showThemeToggle={showThemeToggle}\n />\n </WidgetContainer>\n <ConfirmCloseDialog\n open={showConfirmDialog}\n onConfirm={handleConfirmClose}\n onCancel={handleCancelClose}\n theme={resolvedTheme}\n />\n </>\n );\n}\n\n/**\n * TrustwareWidgetV2 - Main widget component for deposit flow.\n *\n * Provides a complete deposit experience with:\n * - Page navigation based on state machine\n * - Animated transitions between pages\n * - Theme support (light/dark/system)\n * - Context-based state management\n * - Programmatic open/close API via ref\n * - State persistence in sessionStorage\n *\n * @example\n * ```tsx\n * // Basic inline usage\n * <TrustwareWidgetV2 theme=\"dark\" />\n *\n * // With ref for programmatic control\n * const widgetRef = useRef<TrustwareWidgetV2Ref>(null);\n *\n * <TrustwareWidgetV2\n * ref={widgetRef}\n * defaultOpen={false}\n * onClose={() => console.log('Widget closed')}\n * onOpen={() => console.log('Widget opened')}\n * />\n *\n * // Open/close programmatically\n * widgetRef.current?.open();\n * widgetRef.current?.close();\n * ```\n */\nexport const TrustwareWidgetV2 = forwardRef<\n TrustwareWidgetV2Ref,\n TrustwareWidgetV2Props\n>(function TrustwareWidgetV2(\n {\n theme = \"system\",\n style,\n initialStep = \"home\",\n defaultOpen = true,\n onClose,\n onOpen,\n showThemeToggle = true,\n }: TrustwareWidgetV2Props,\n ref\n): React.ReactElement | null {\n const [isOpen, setIsOpen] = useState(defaultOpen);\n const closeRequestRef = useRef<(() => void) | null>(null);\n\n // Always start at initialStep on mount (refresh returns to home)\n // Persisting step caused issues: wallet disconnects, intentId lost, polling stops\n const effectiveInitialStep = initialStep;\n\n /**\n * Open the widget\n */\n const open = useCallback(() => {\n setIsOpen(true);\n onOpen?.();\n }, [onOpen]);\n\n /**\n * Close the widget (delegates to inner component for transaction check)\n */\n const close = useCallback(() => {\n if (closeRequestRef.current) {\n closeRequestRef.current();\n } else {\n setIsOpen(false);\n onClose?.();\n }\n }, [onClose]);\n\n /**\n * Handle actual close (called by WidgetInner after confirmation)\n */\n const handleClose = useCallback(() => {\n setIsOpen(false);\n onClose?.();\n }, [onClose]);\n\n // Expose ref methods\n useImperativeHandle(\n ref,\n () => ({\n open,\n close,\n isOpen: () => isOpen,\n }),\n [open, close, isOpen]\n );\n\n // Don't render if closed\n if (!isOpen) {\n return null;\n }\n\n return (\n <DepositProvider initialStep={effectiveInitialStep}>\n <WidgetInner\n theme={theme}\n style={style}\n onClose={handleClose}\n closeRequestRef={closeRequestRef}\n showThemeToggle={showThemeToggle}\n />\n </DepositProvider>\n );\n});\n\nexport default TrustwareWidgetV2;\n","import React from \"react\";\n\n/**\n * Style object type for inline styles\n */\nexport type StyleObject = React.CSSProperties;\n\n/**\n * Style input can be a style object, false, null, or undefined (for conditional styles)\n */\nexport type StyleInput = StyleObject | false | null | undefined;\n\n/**\n * Merges multiple style objects into one.\n * Falsy values are filtered out, allowing conditional styles.\n *\n * @example\n * ```tsx\n * // Basic usage\n * <div style={mergeStyles({ padding: '1rem' }, { backgroundColor: 'red' })} />\n *\n * // Conditional styles\n * <div style={mergeStyles(\n * { padding: '1rem' },\n * isActive && { backgroundColor: 'blue' },\n * isDisabled && { opacity: 0.5 }\n * )} />\n * ```\n */\nexport function mergeStyles(...styles: StyleInput[]): StyleObject {\n return styles.reduce<StyleObject>((acc, style) => {\n if (!style) return acc;\n return { ...acc, ...style };\n }, {});\n}\n\n/**\n * Class name utility for combining CSS class strings.\n * This is a simplified version that just joins non-empty strings.\n * Used for animation classes that must be applied via className.\n *\n * @example\n * ```tsx\n * <div className={cn(\"tw-animate-fade-in\", isActive && \"tw-animate-pulse\")} />\n * ```\n */\nexport function cn(...inputs: (string | false | null | undefined)[]): string {\n return inputs.filter(Boolean).join(\" \");\n}\n","/**\n * Design tokens for the Trustware Widget\n * These tokens define the visual language of the widget and are used by inline styles.\n */\n\n/**\n * Spacing scale (in rem)\n */\nexport const spacing = {\n 0: \"0\",\n 0.5: \"0.125rem\",\n 1: \"0.25rem\",\n 1.5: \"0.375rem\",\n 2: \"0.5rem\",\n 2.5: \"0.625rem\",\n 3: \"0.75rem\",\n 3.5: \"0.875rem\",\n 4: \"1rem\",\n 5: \"1.25rem\",\n 6: \"1.5rem\",\n 7: \"1.75rem\",\n 8: \"2rem\",\n 9: \"2.25rem\",\n 10: \"2.5rem\",\n 11: \"2.75rem\",\n 12: \"3rem\",\n 14: \"3.5rem\",\n 16: \"4rem\",\n 20: \"5rem\",\n 24: \"6rem\",\n 28: \"7rem\",\n 32: \"8rem\",\n 36: \"9rem\",\n 40: \"10rem\",\n 44: \"11rem\",\n 48: \"12rem\",\n 52: \"13rem\",\n 56: \"14rem\",\n 60: \"15rem\",\n 64: \"16rem\",\n 72: \"18rem\",\n 80: \"20rem\",\n 96: \"24rem\",\n} as const;\n\n/**\n * Border radius values\n */\nexport const borderRadius = {\n none: \"0\",\n sm: \"calc(var(--tw-radius) - 4px)\",\n md: \"calc(var(--tw-radius) - 2px)\",\n lg: \"var(--tw-radius)\",\n xl: \"calc(var(--tw-radius) + 4px)\",\n \"2xl\": \"calc(var(--tw-radius) + 8px)\",\n full: \"9999px\",\n} as const;\n\n/**\n * Font sizes\n */\nexport const fontSize = {\n xs: \"0.75rem\",\n sm: \"0.875rem\",\n base: \"1rem\",\n lg: \"1.125rem\",\n xl: \"1.25rem\",\n \"2xl\": \"1.5rem\",\n \"3xl\": \"1.875rem\",\n \"4xl\": \"2.25rem\",\n \"5xl\": \"3rem\",\n \"6xl\": \"3.75rem\",\n} as const;\n\n/**\n * Line heights\n */\nexport const lineHeight = {\n none: \"1\",\n tight: \"1.25\",\n snug: \"1.375\",\n normal: \"1.5\",\n relaxed: \"1.625\",\n loose: \"2\",\n} as const;\n\n/**\n * Font weights\n */\nexport const fontWeight = {\n normal: \"400\",\n medium: \"500\",\n semibold: \"600\",\n bold: \"700\",\n} as const;\n\n/**\n * Colors - using CSS variables for theming\n * These reference the CSS variables injected by the theme system\n */\nexport const colors = {\n // Semantic colors (reference CSS variables)\n background: \"hsl(var(--tw-background))\",\n foreground: \"hsl(var(--tw-foreground))\",\n card: \"hsl(var(--tw-card))\",\n cardForeground: \"hsl(var(--tw-card-foreground))\",\n primary: \"hsl(var(--tw-primary))\",\n primaryForeground: \"hsl(var(--tw-primary-foreground))\",\n secondary: \"hsl(var(--tw-secondary))\",\n secondaryForeground: \"hsl(var(--tw-secondary-foreground))\",\n muted: \"hsl(var(--tw-muted))\",\n mutedForeground: \"hsl(var(--tw-muted-foreground))\",\n accent: \"hsl(var(--tw-accent))\",\n accentForeground: \"hsl(var(--tw-accent-foreground))\",\n destructive: \"hsl(var(--tw-destructive))\",\n destructiveForeground: \"hsl(var(--tw-destructive-foreground))\",\n border: \"hsl(var(--tw-border))\",\n input: \"hsl(var(--tw-input))\",\n ring: \"hsl(var(--tw-ring))\",\n\n // Static colors (don't change with theme)\n white: \"#ffffff\",\n black: \"#000000\",\n transparent: \"transparent\",\n\n // Zinc scale (for specific use cases)\n zinc: {\n 50: \"#fafafa\",\n 100: \"#f4f4f5\",\n 200: \"#e4e4e7\",\n 300: \"#d4d4d8\",\n 400: \"#a1a1aa\",\n 500: \"#71717a\",\n 600: \"#52525b\",\n 700: \"#3f3f46\",\n 800: \"#27272a\",\n 900: \"#18181b\",\n 950: \"#09090b\",\n },\n\n // Green scale (for success states)\n green: {\n 50: \"#f0fdf4\",\n 100: \"#dcfce7\",\n 200: \"#bbf7d0\",\n 300: \"#86efac\",\n 400: \"#4ade80\",\n 500: \"#22c55e\",\n 600: \"#16a34a\",\n 700: \"#15803d\",\n 800: \"#166534\",\n 900: \"#14532d\",\n },\n\n // Red scale (for error states)\n red: {\n 50: \"#fef2f2\",\n 100: \"#fee2e2\",\n 200: \"#fecaca\",\n 300: \"#fca5a5\",\n 400: \"#f87171\",\n 500: \"#ef4444\",\n 600: \"#dc2626\",\n 700: \"#b91c1c\",\n 800: \"#991b1b\",\n 900: \"#7f1d1d\",\n },\n\n // Blue scale (for primary actions)\n blue: {\n 50: \"#eff6ff\",\n 100: \"#dbeafe\",\n 200: \"#bfdbfe\",\n 300: \"#93c5fd\",\n 400: \"#60a5fa\",\n 500: \"#3b82f6\",\n 600: \"#2563eb\",\n 700: \"#1d4ed8\",\n 800: \"#1e40af\",\n 900: \"#1e3a8a\",\n },\n\n // Amber scale (for warnings)\n amber: {\n 50: \"#fffbeb\",\n 100: \"#fef3c7\",\n 200: \"#fde68a\",\n 300: \"#fcd34d\",\n 400: \"#fbbf24\",\n 500: \"#f59e0b\",\n 600: \"#d97706\",\n 700: \"#b45309\",\n 800: \"#92400e\",\n 900: \"#78350f\",\n },\n\n // Emerald scale (for slider/progress)\n emerald: {\n 50: \"#ecfdf5\",\n 100: \"#d1fae5\",\n 200: \"#a7f3d0\",\n 300: \"#6ee7b7\",\n 400: \"#34d399\",\n 500: \"#10b981\",\n 600: \"#059669\",\n 700: \"#047857\",\n 800: \"#065f46\",\n 900: \"#064e3b\",\n },\n} as const;\n\n/**\n * Shadow values - using CSS variables for theming\n */\nexport const shadows = {\n none: \"none\",\n soft: \"var(--tw-shadow-soft)\",\n medium: \"var(--tw-shadow-medium)\",\n large: \"var(--tw-shadow-large)\",\n sm: \"0 1px 2px 0 rgb(0 0 0 / 0.05)\",\n DEFAULT: \"0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1)\",\n md: \"0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1)\",\n lg: \"0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1)\",\n xl: \"0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1)\",\n} as const;\n\n/**\n * Transition presets\n */\nexport const transitions = {\n smooth: \"all 0.3s cubic-bezier(0.4, 0, 0.2, 1)\",\n bounce: \"all 0.4s cubic-bezier(0.68, -0.55, 0.265, 1.55)\",\n fast: \"all 0.15s ease-out\",\n normal: \"all 0.2s ease-out\",\n slow: \"all 0.3s ease-out\",\n colors: \"color, background-color, border-color 0.2s ease-out\",\n opacity: \"opacity 0.2s ease-out\",\n transform: \"transform 0.2s ease-out\",\n} as const;\n\n/**\n * Z-index scale\n */\nexport const zIndex = {\n 0: \"0\",\n 10: \"10\",\n 20: \"20\",\n 30: \"30\",\n 40: \"40\",\n 50: \"50\",\n auto: \"auto\",\n} as const;\n","/**\n * Theme CSS styles for injection via <style> tag\n * Contains CSS variables for light/dark themes and pseudo-state styles\n */\n\n/**\n * CSS variables for theming - scoped to .trustware-widget\n * These variables are used by inline styles throughout the widget\n */\nexport const THEME_STYLES = `\n/* CSS Variables for theming - scoped to widget */\n.trustware-widget {\n /* Light theme (default) - New design system with bright blue primary */\n --tw-background: 0 0% 98%;\n --tw-foreground: 220 15% 20%;\n --tw-card: 0 0% 100%;\n --tw-card-foreground: 220 15% 20%;\n --tw-primary: 217 91% 60%;\n --tw-primary-foreground: 0 0% 100%;\n --tw-secondary: 220 14% 96%;\n --tw-secondary-foreground: 220 15% 20%;\n --tw-muted: 220 14% 96%;\n --tw-muted-foreground: 220 10% 50%;\n --tw-accent: 217 91% 60%;\n --tw-accent-foreground: 0 0% 100%;\n --tw-destructive: 0 84% 60%;\n --tw-destructive-foreground: 0 0% 100%;\n --tw-border: 220 13% 91%;\n --tw-input: 220 13% 91%;\n --tw-ring: 217 91% 60%;\n --tw-radius: 1rem;\n\n /* Shadow system */\n --tw-shadow-soft: 0 2px 8px -2px hsl(220 15% 20% / 0.08);\n --tw-shadow-medium: 0 4px 16px -4px hsl(220 15% 20% / 0.12);\n --tw-shadow-large: 0 8px 32px -8px hsl(220 15% 20% / 0.16);\n\n /* Transitions */\n --tw-transition-smooth: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n --tw-transition-bounce: all 0.4s cubic-bezier(0.68, -0.55, 0.265, 1.55);\n\n /* Font stack - SF Pro system fonts */\n font-family: -apple-system, BlinkMacSystemFont, 'SF Pro Display', 'SF Pro Text', 'Helvetica Neue', sans-serif;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n\n /* Box sizing */\n box-sizing: border-box;\n}\n\n.trustware-widget *,\n.trustware-widget *::before,\n.trustware-widget *::after {\n box-sizing: border-box;\n}\n\n/* Dark theme */\n.trustware-widget[data-theme=\"dark\"],\n.trustware-widget.dark {\n --tw-background: 220 15% 10%;\n --tw-foreground: 0 0% 98%;\n --tw-card: 220 15% 12%;\n --tw-card-foreground: 0 0% 98%;\n --tw-primary: 217 91% 60%;\n --tw-primary-foreground: 0 0% 100%;\n --tw-secondary: 220 15% 18%;\n --tw-secondary-foreground: 0 0% 98%;\n --tw-muted: 220 15% 18%;\n --tw-muted-foreground: 220 10% 60%;\n --tw-accent: 217 91% 60%;\n --tw-accent-foreground: 0 0% 100%;\n --tw-destructive: 0 84% 60%;\n --tw-destructive-foreground: 0 0% 100%;\n --tw-border: 220 15% 20%;\n --tw-input: 220 15% 20%;\n --tw-ring: 217 91% 60%;\n\n /* Dark mode shadows (slightly more visible) */\n --tw-shadow-soft: 0 2px 8px -2px hsl(0 0% 0% / 0.2);\n --tw-shadow-medium: 0 4px 16px -4px hsl(0 0% 0% / 0.3);\n --tw-shadow-large: 0 8px 32px -8px hsl(0 0% 0% / 0.4);\n}\n`;\n\n/**\n * Pseudo-state styles that can't be done with inline styles\n * Kept minimal - only for hover/focus/active states\n */\nexport const PSEUDO_STYLES = `\n/* Reset styles for elements inside widget */\n.trustware-widget button {\n font-family: inherit;\n cursor: pointer;\n}\n\n.trustware-widget a {\n text-decoration: none;\n color: inherit;\n}\n\n.trustware-widget input {\n font-family: inherit;\n}\n\n/* Focus visible styles */\n.trustware-widget button:focus-visible,\n.trustware-widget input:focus-visible,\n.trustware-widget a:focus-visible {\n outline: 2px solid hsl(var(--tw-ring));\n outline-offset: 2px;\n}\n\n/* Scrollbar hiding - apply to widget and all children */\n.trustware-widget,\n.trustware-widget *,\n.tw-scrollbar-none {\n -ms-overflow-style: none;\n scrollbar-width: none;\n}\n.trustware-widget::-webkit-scrollbar,\n.trustware-widget *::-webkit-scrollbar,\n.tw-scrollbar-none::-webkit-scrollbar {\n display: none;\n width: 0;\n height: 0;\n}\n\n/* Touch action utility */\n.tw-touch-none {\n touch-action: none;\n}\n\n/* Safe area utilities */\n.tw-safe-area-bottom {\n padding-bottom: env(safe-area-inset-bottom);\n}\n.tw-safe-area-top {\n padding-top: env(safe-area-inset-top);\n}\n\n/* Disabled state styles */\n.trustware-widget button:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n}\n\n/* Selection color */\n.trustware-widget ::selection {\n background-color: hsl(var(--tw-primary) / 0.2);\n}\n`;\n\n/**\n * Combined theme and pseudo-state styles for injection\n */\nexport const ALL_THEME_STYLES = THEME_STYLES + PSEUDO_STYLES;\n","/**\n * Animation keyframes and definitions for injection via <style> tag\n * These are injected once in the WidgetContainer\n */\n\n/**\n * All keyframe animations used by the widget\n */\nexport const KEYFRAMES = `\n/* Slide in from right (forward navigation) */\n@keyframes tw-slide-in-right {\n 0% { opacity: 0; transform: translateX(1rem); }\n 100% { opacity: 1; transform: translateX(0); }\n}\n\n/* Slide in from left (back navigation) */\n@keyframes tw-slide-in-left {\n 0% { opacity: 0; transform: translateX(-1rem); }\n 100% { opacity: 1; transform: translateX(0); }\n}\n\n/* Fade in with scale */\n@keyframes tw-fade-in {\n from { opacity: 0; transform: scale(0.95); }\n to { opacity: 1; transform: scale(1); }\n}\n\n/* Slide up */\n@keyframes tw-slide-up {\n from { opacity: 0; transform: translateY(20px); }\n to { opacity: 1; transform: translateY(0); }\n}\n\n/* Scale in */\n@keyframes tw-scale-in {\n from { opacity: 0; transform: scale(0.9); }\n to { opacity: 1; transform: scale(1); }\n}\n\n/* Swipe complete background transition */\n@keyframes tw-swipe-complete {\n from { background-color: hsl(var(--tw-muted)); }\n to { background-color: hsl(142 76% 36%); }\n}\n\n/* Token hint bounce (vertical) */\n@keyframes tw-token-hint-bounce {\n 0%, 100% { transform: translateY(0); }\n 25% { transform: translateY(-8px); }\n 50% { transform: translateY(5px); }\n 75% { transform: translateY(-3px); }\n}\n\n/* Token hint bounce (horizontal) */\n@keyframes tw-token-hint-bounce-x {\n 0%, 100% { transform: translateX(0) scale(1); }\n 20% { transform: translateX(-10px) scale(1); }\n 40% { transform: translateX(8px) scale(1); }\n 60% { transform: translateX(-5px) scale(1); }\n 80% { transform: translateX(3px) scale(1); }\n}\n\n/* Spinner rotation */\n@keyframes tw-spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n}\n\n/* Slow spinner rotation */\n@keyframes tw-spin-slow {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n}\n\n/* Confetti fall animation */\n@keyframes tw-confetti-fall {\n 0% {\n transform: translateY(0) rotate(0deg);\n opacity: 1;\n }\n 100% {\n transform: translateY(100vh) rotate(720deg);\n opacity: 0;\n }\n}\n\n/* Pulse animation */\n@keyframes tw-pulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.5; }\n}\n`;\n\n/**\n * Animation CSS classes that use the keyframes\n * These can be referenced by adding className to elements\n */\nexport const ANIMATION_CLASSES = `\n/* Animation utility classes */\n.tw-animate-slide-in-right {\n animation: tw-slide-in-right 150ms ease-out;\n}\n\n.tw-animate-slide-in-left {\n animation: tw-slide-in-left 150ms ease-out;\n}\n\n.tw-animate-fade-in {\n animation: tw-fade-in 0.3s ease-out;\n}\n\n.tw-animate-slide-up {\n animation: tw-slide-up 0.4s ease-out;\n}\n\n.tw-animate-scale-in {\n animation: tw-scale-in 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.tw-animate-swipe-complete {\n animation: tw-swipe-complete 0.3s ease-out forwards;\n}\n\n.tw-animate-token-hint-bounce {\n animation: tw-token-hint-bounce 0.7s ease-out;\n}\n\n.tw-animate-token-hint-bounce-x {\n animation: tw-token-hint-bounce-x 0.8s ease-out;\n}\n\n.tw-animate-spin {\n animation: tw-spin 1s linear infinite;\n}\n\n.tw-animate-spin-slow {\n animation: tw-spin-slow 2s linear infinite;\n}\n\n.tw-animate-confetti {\n animation: tw-confetti-fall 2s ease-out forwards;\n}\n\n.tw-animate-pulse {\n animation: tw-pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;\n}\n`;\n\n/**\n * Combined keyframes and animation classes for injection\n */\nexport const ALL_ANIMATION_STYLES = KEYFRAMES + ANIMATION_CLASSES;\n\n/**\n * Animation timing presets (for use with inline style animation property)\n */\nexport const animationTimings = {\n slideInRight: \"tw-slide-in-right 150ms ease-out\",\n slideInLeft: \"tw-slide-in-left 150ms ease-out\",\n fadeIn: \"tw-fade-in 0.3s ease-out\",\n slideUp: \"tw-slide-up 0.4s ease-out\",\n scaleIn: \"tw-scale-in 0.3s cubic-bezier(0.4, 0, 0.2, 1)\",\n swipeComplete: \"tw-swipe-complete 0.3s ease-out forwards\",\n tokenHintBounce: \"tw-token-hint-bounce 0.7s ease-out\",\n tokenHintBounceX: \"tw-token-hint-bounce-x 0.8s ease-out\",\n spin: \"tw-spin 1s linear infinite\",\n spinSlow: \"tw-spin-slow 2s linear infinite\",\n confettiFall: \"tw-confetti-fall 2s ease-out forwards\",\n pulse: \"tw-pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite\",\n} as const;\n","import React, {\n createContext,\n useContext,\n useState,\n useCallback,\n useMemo,\n useEffect,\n useRef,\n Dispatch,\n SetStateAction,\n} from \"react\";\nimport { walletManager } from \"../../wallets/manager\";\nimport { useWalletDetection } from \"../../wallets/detect\";\nimport type {\n BalanceRow,\n ChainDef,\n DetectedWallet,\n WalletInterFaceAPI,\n} from \"../../types\";\nimport { useChains, useTokens } from \"../hooks\";\nimport { getBalancesByAddress } from \"src/core/balances\";\nimport {\n canonicalTokenAddressForChain,\n getNativeTokenAddress,\n normalizeChainKey,\n} from \"../helpers/chainHelpers\";\nimport { useTrustware } from \"src/provider\";\n\n/**\n * localStorage key for persisting theme preference\n */\nconst THEME_STORAGE_KEY = \"trustware-widget-theme\";\n\n/**\n * Resolved theme type (light or dark, not system)\n */\nexport type ResolvedTheme = \"light\" | \"dark\";\n\nexport interface YourTokenData {\n chainIconURI: string;\n chainData: ChainDef | undefined;\n symbol: string;\n decimals: number;\n name: string;\n iconUrl: string;\n logoURI?: string;\n chainId: number | string;\n usdPrice: number | undefined;\n address: string;\n chain_key: string;\n category: \"native\" | \"erc20\" | \"spl\" | \"btc\";\n contract?: `0x${string}`;\n /** Raw smallest-unit balance string (e.g. wei/lamports) */\n balance: string;\n}\n\n/**\n * Navigation states for the deposit widget flow\n */\nexport type NavigationStep =\n | \"home\"\n | \"select-token\"\n | \"crypto-pay\"\n | \"processing\"\n | \"success\"\n | \"error\";\n\n/**\n * Wallet connection status\n */\nexport type WalletStatus =\n | \"idle\"\n | \"detecting\"\n | \"connecting\"\n | \"connected\"\n | \"error\";\n\n/**\n * Transaction lifecycle status for deposit flow\n */\nexport type TransactionStatus =\n | \"idle\"\n | \"confirming\"\n | \"processing\"\n | \"bridging\"\n | \"success\"\n | \"error\";\n\n/**\n * Payment method type for deposit selection\n */\nexport type PaymentMethodType = \"crypto\" | \"fiat\";\n\n/**\n * Token information for deposit selection\n */\nexport interface Token {\n /** Token contract address (or 'native' for native tokens) */\n address: string;\n /** Token symbol (e.g., 'USDC', 'ETH') */\n symbol: string;\n /** Token display name (e.g., 'USD Coin', 'Ethereum') */\n name: string;\n /** Number of decimals for the token */\n decimals: number;\n /** URL to token icon/logo */\n iconUrl?: string;\n logoURI?: string;\n\n /** Raw smallest-unit balance string (e.g. wei/lamports) when wallet connected */\n balance?: string;\n\n chainId: string | number;\n\n usdPrice: number | undefined;\n}\n\n/**\n * Blockchain network information for deposit selection\n */\nexport interface Chain {\n /** Chain ID (e.g., 1 for Ethereum mainnet) */\n chainId: number;\n /** Chain display name (e.g., 'Ethereum', 'Polygon') */\n name: string;\n /** Short name or symbol (e.g., 'ETH', 'MATIC') */\n shortName: string;\n /** URL to chain icon/logo */\n iconUrl?: string;\n /** Whether this is a popular/featured chain */\n isPopular?: boolean;\n /** Native token symbol */\n nativeToken: string;\n /** Block explorer URL */\n explorerUrl?: string;\n}\n\nexport interface DepositContextValue {\n /** Current navigation step */\n currentStep: NavigationStep;\n /** Set the current navigation step */\n setCurrentStep: (step: NavigationStep) => void;\n /** Navigate to the previous step */\n goBack: () => void;\n /** Reset state and return to home */\n resetState: () => void;\n /** History of visited steps for back navigation */\n stepHistory: NavigationStep[];\n\n // Wallet state\n /** Currently connected wallet interface */\n selectedWallet: WalletInterFaceAPI | null;\n /** Current wallet address (null if not connected) */\n walletAddress: string | null;\n /** Current wallet connection status */\n walletStatus: WalletStatus;\n /** Connect to a detected wallet */\n connectWallet: (wallet: DetectedWallet) => Promise<void>;\n /** Disconnect the current wallet */\n disconnectWallet: () => Promise<void>;\n\n // Token and chain state\n /** Currently selected token for deposit */\n selectedToken: Token | null | YourTokenData;\n /** Set the selected token */\n setSelectedToken: (token: Token | null | YourTokenData) => void;\n /** Currently selected blockchain network */\n selectedChain: ChainDef | null;\n /** Set the selected chain */\n setSelectedChain: (chain: ChainDef | null) => void;\n /** Deposit amount as string (to preserve decimal precision) */\n amount: string;\n /** Set the deposit amount */\n setAmount: (amount: string) => void;\n\n // Transaction lifecycle state\n /** Current transaction status */\n transactionStatus: TransactionStatus;\n /** Set the transaction status */\n setTransactionStatus: (status: TransactionStatus) => void;\n /** Transaction hash after submission (null if not yet submitted) */\n transactionHash: string | null;\n /** Set the transaction hash */\n setTransactionHash: (hash: string | null) => void;\n /** Error message for failed transactions */\n errorMessage: string | null;\n /** Set the error message */\n setErrorMessage: (message: string | null) => void;\n /** Route intent ID for transaction tracking */\n intentId: string | null;\n /** Set the intent ID */\n setIntentId: (id: string | null) => void;\n\n // Payment method state\n /** Selected payment method type */\n paymentMethod: PaymentMethodType;\n /** Set the payment method type */\n setPaymentMethod: (method: PaymentMethodType) => void;\n\n // Theme state\n /** Current resolved theme (light or dark) */\n resolvedTheme: ResolvedTheme;\n /** Toggle between light and dark themes */\n toggleTheme: () => void;\n\n setYourWalletTokens: React.Dispatch<React.SetStateAction<YourTokenData[]>>;\n\n yourWalletTokens: YourTokenData[];\n\n amountInputMode: \"usd\" | \"token\";\n setAmountInputMode: Dispatch<SetStateAction<\"usd\" | \"token\">>;\n}\n\nconst DepositContext = createContext<DepositContextValue | undefined>(\n undefined\n);\n\nexport interface DepositProviderProps {\n children: React.ReactNode;\n /** Initial step to start the widget at */\n initialStep?: NavigationStep;\n}\n\n/**\n * Provider for deposit widget context including navigation state.\n */\nexport function DepositProvider({\n children,\n initialStep = \"home\",\n}: DepositProviderProps): React.ReactElement {\n useTrustware(); // ensures provider is present\n\n const [amountInputMode, setAmountInputMode] = useState<\"usd\" | \"token\">(\n \"usd\"\n );\n\n const [currentStep, setCurrentStepInternal] =\n useState<NavigationStep>(initialStep);\n const [stepHistory, setStepHistory] = useState<NavigationStep[]>([\n initialStep,\n ]);\n\n // Wallet state\n const [selectedWallet, setSelectedWallet] =\n useState<WalletInterFaceAPI | null>(walletManager.wallet);\n const [walletAddress, setWalletAddress] = useState<string | null>(null);\n const [walletStatus, setWalletStatus] = useState<WalletStatus>(\n walletManager.status as WalletStatus\n );\n\n // Wire wallet detection into manager (detection only, no auto-connect)\n const { detected } = useWalletDetection();\n\n // Feed detected wallets into manager for display in UI\n useEffect(() => {\n walletManager.setDetected(detected);\n }, [detected]);\n\n // Token and chain state\n const [selectedToken, setSelectedToken] = useState<\n Token | null | YourTokenData\n >(null);\n const [selectedChain, setSelectedChain] = useState<ChainDef | null>(null);\n const [amount, setAmount] = useState<string>(\"\");\n const [yourWalletTokens, setYourWalletTokens] = useState<YourTokenData[]>([]);\n const lastLoadedWalletRef = useRef<string | null>(null);\n\n // Transaction lifecycle state\n const [transactionStatus, setTransactionStatus] =\n useState<TransactionStatus>(\"idle\");\n const [transactionHash, setTransactionHash] = useState<string | null>(null);\n const [errorMessage, setErrorMessage] = useState<string | null>(null);\n const [intentId, setIntentId] = useState<string | null>(null);\n\n // Payment method state (defaults to crypto)\n const [paymentMethod, setPaymentMethod] =\n useState<PaymentMethodType>(\"crypto\");\n\n // Theme state - load from localStorage or use system preference\n const [resolvedTheme, setResolvedTheme] = useState<ResolvedTheme>(() => {\n // Try to load from localStorage\n try {\n const stored = localStorage.getItem(THEME_STORAGE_KEY);\n if (stored === \"light\" || stored === \"dark\") {\n return stored;\n }\n } catch {\n // localStorage not available\n }\n // Fall back to system preference\n if (typeof window !== \"undefined\" && window.matchMedia) {\n return window.matchMedia(\"(prefers-color-scheme: dark)\").matches\n ? \"dark\"\n : \"light\";\n }\n return \"light\";\n });\n\n /**\n * Subscribe to walletManager state changes\n */\n useEffect(() => {\n const unsubscribe = walletManager.onChange((status) => {\n setWalletStatus(status as WalletStatus);\n setSelectedWallet(walletManager.wallet);\n\n // Update wallet address when connected\n if (status === \"connected\" && walletManager.wallet) {\n walletManager.wallet\n .getAddress()\n .then((address) => {\n setWalletAddress(address);\n })\n .catch(() => {\n setWalletAddress(null);\n });\n } else if (status !== \"connected\") {\n setWalletAddress(null);\n }\n });\n\n // Initialize wallet address if already connected\n if (walletManager.status === \"connected\" && walletManager.wallet) {\n walletManager.wallet\n .getAddress()\n .then((address) => {\n setWalletAddress(address);\n })\n .catch(() => {\n setWalletAddress(null);\n });\n }\n\n return () => {\n unsubscribe();\n };\n }, []);\n\n const { tokens } = useTokens(null);\n\n const { chains } = useChains();\n\n /* eslint-disable react-hooks/set-state-in-effect -- syncing wallet tokens with external wallet/chain state */\n useEffect(() => {\n if (!walletAddress || chains.length === 0 || tokens.length === 0) {\n setYourWalletTokens([]);\n if (!walletAddress) {\n lastLoadedWalletRef.current = null;\n }\n return;\n }\n\n if (lastLoadedWalletRef.current === walletAddress) {\n return;\n }\n\n let cancelled = false;\n\n /**\n * Loads wallet tokens and balances for the currently connected wallet.\n * @return {Promise<void>} Resolves when the operation is complete.\n * @throws {Error} If an error occurs while loading the balances.\n */\n\n async function loadWalletTokens() {\n try {\n const arr = await getBalancesByAddress(walletAddress as string);\n\n const flatenedTokenWithBalancesArr = arr.flatMap((obj) =>\n (obj.balances ?? []).flatMap((balance) => {\n if (!balance || !obj?.chain_id) {\n return [];\n }\n\n return [\n {\n ...balance,\n chain_id: obj.chain_id,\n },\n ];\n })\n );\n\n // ...............................................................//\n\n const tokensByCanonicalKey = new Map<string, (typeof tokens)[number]>();\n for (const token of tokens) {\n const tokenChain = chains.find(\n (chain) =>\n normalizeChainKey(chain.chainId) ===\n normalizeChainKey(token.chainId)\n );\n if (!tokenChain) continue;\n\n const canonicalAddress = canonicalTokenAddressForChain(\n tokenChain,\n token.address,\n tokens\n );\n const key = `${normalizeChainKey(token.chainId)}:${canonicalAddress}`;\n tokensByCanonicalKey.set(key, token);\n }\n\n const updatedArr: YourTokenData[] =\n flatenedTokenWithBalancesArr.flatMap((balanceRow) => {\n const chain = chains.find(\n (c) =>\n normalizeChainKey(c.chainId) ===\n normalizeChainKey(balanceRow.chain_id)\n );\n if (!chain) return [];\n\n const balanceAddress =\n balanceRow.contract ??\n (balanceRow as BalanceRow & { address?: string }).address;\n\n const canonicalBalanceAddress = canonicalTokenAddressForChain(\n chain,\n balanceAddress,\n tokens\n );\n const canonicalKey = `${normalizeChainKey(balanceRow.chain_id)}:${canonicalBalanceAddress}`;\n let foundToken = tokensByCanonicalKey.get(canonicalKey);\n\n if (!foundToken) {\n const isNativeCategory = balanceRow.category === \"native\";\n if (isNativeCategory) {\n const nativeAddress = canonicalTokenAddressForChain(\n chain,\n getNativeTokenAddress(chain.type),\n tokens\n );\n const nativeKey = `${normalizeChainKey(balanceRow.chain_id)}:${nativeAddress}`;\n foundToken = tokensByCanonicalKey.get(nativeKey);\n }\n }\n\n if (\n !foundToken?.name ||\n !foundToken?.symbol ||\n !foundToken?.address\n ) {\n return [];\n }\n\n return [\n {\n ...balanceRow,\n symbol: foundToken.symbol,\n decimals: foundToken.decimals,\n name: foundToken.name,\n iconUrl: foundToken.iconUrl ?? foundToken.logoURI ?? \"\",\n chainId: balanceRow.chain_id,\n usdPrice: foundToken.usdPrice,\n address: canonicalTokenAddressForChain(\n chain,\n foundToken.address,\n tokens\n ),\n chainIconURI: chain?.chainIconURI || \"\",\n chainData: chain,\n },\n ];\n });\n\n if (!cancelled) {\n setYourWalletTokens(\n updatedArr.sort((a, b) => Number(b.balance) - Number(a.balance))\n );\n\n const findtokenwithBalance = updatedArr.find(\n (t) => Number(t.balance) > 0\n );\n\n setSelectedToken(\n findtokenwithBalance as Token & {\n balance: string;\n chainIconURI: string;\n chainData: ChainDef;\n }\n );\n\n setSelectedChain(findtokenwithBalance?.chainData as Chain);\n lastLoadedWalletRef.current = walletAddress;\n }\n } catch (err) {\n void err; // balance loading failed — non-fatal\n if (!cancelled) setYourWalletTokens([]);\n }\n }\n\n void loadWalletTokens();\n\n return () => {\n cancelled = true;\n };\n }, [chains, tokens, walletAddress]);\n /* eslint-enable react-hooks/set-state-in-effect */\n\n /**\n * Connect to a detected wallet\n */\n const connectWallet = useCallback(async (wallet: DetectedWallet) => {\n await walletManager.connectDetected(wallet);\n }, []);\n\n /**\n * Disconnect the current wallet\n */\n const disconnectWallet = useCallback(async () => {\n await walletManager.disconnect();\n }, []);\n\n /**\n * Set the current step and track history\n */\n const setCurrentStep = useCallback((step: NavigationStep) => {\n setCurrentStepInternal(step);\n setStepHistory((prev) => {\n // Don't add duplicate consecutive steps\n if (prev[prev.length - 1] === step) {\n return prev;\n }\n return [...prev, step];\n });\n }, []);\n\n /**\n * Navigate to the previous step based on history\n */\n const goBack = useCallback(() => {\n setStepHistory((prev) => {\n if (prev.length <= 1) {\n // Already at the beginning, stay at home\n setCurrentStepInternal(\"home\");\n return [\"home\"];\n }\n\n // Remove current step from history\n const newHistory = prev.slice(0, -1);\n const previousStep = newHistory[newHistory.length - 1] || \"home\";\n setCurrentStepInternal(previousStep);\n return newHistory;\n });\n }, []);\n\n /**\n * Reset all state and return to home\n */\n const resetState = useCallback(() => {\n setCurrentStepInternal(\"home\");\n setStepHistory([\"home\"]);\n setSelectedToken(null);\n setSelectedChain(null);\n setAmount(\"\");\n // Reset transaction state\n setTransactionStatus(\"idle\");\n setTransactionHash(null);\n setErrorMessage(null);\n setIntentId(null);\n // Reset payment method to crypto\n setPaymentMethod(\"crypto\");\n }, []);\n\n /**\n * Toggle between light and dark themes\n */\n const toggleTheme = useCallback(() => {\n setResolvedTheme((current) => {\n const newTheme = current === \"light\" ? \"dark\" : \"light\";\n // Persist to localStorage\n try {\n localStorage.setItem(THEME_STORAGE_KEY, newTheme);\n } catch {\n // localStorage not available\n }\n return newTheme;\n });\n }, []);\n\n const value = useMemo<DepositContextValue>(\n () => ({\n currentStep,\n setCurrentStep,\n goBack,\n resetState,\n stepHistory,\n // Wallet state\n selectedWallet,\n walletAddress,\n walletStatus,\n connectWallet,\n disconnectWallet,\n // Token and chain state\n selectedToken,\n setSelectedToken,\n selectedChain,\n setSelectedChain,\n amount,\n setAmount,\n // Transaction lifecycle state\n transactionStatus,\n setTransactionStatus,\n transactionHash,\n setTransactionHash,\n errorMessage,\n setErrorMessage,\n intentId,\n setIntentId,\n // Payment method state\n paymentMethod,\n setPaymentMethod,\n // Theme state\n resolvedTheme,\n toggleTheme,\n\n yourWalletTokens,\n setYourWalletTokens,\n\n amountInputMode,\n setAmountInputMode,\n }),\n [\n currentStep,\n setCurrentStep,\n goBack,\n resetState,\n stepHistory,\n selectedWallet,\n walletAddress,\n walletStatus,\n connectWallet,\n disconnectWallet,\n selectedToken,\n selectedChain,\n amount,\n transactionStatus,\n transactionHash,\n errorMessage,\n intentId,\n paymentMethod,\n resolvedTheme,\n toggleTheme,\n yourWalletTokens,\n amountInputMode,\n ]\n );\n\n return (\n <DepositContext.Provider value={value}>{children}</DepositContext.Provider>\n );\n}\n\n/**\n * Hook to access deposit context\n * @throws Error if used outside of DepositProvider\n */\nexport function useDeposit(): DepositContextValue {\n const context = useContext(DepositContext);\n if (context === undefined) {\n throw new Error(\"useDeposit must be used within a DepositProvider\");\n }\n return context;\n}\n\nexport default DepositContext;\n","\"use client\";\nimport { useEffect, useMemo, useRef, useState } from \"react\";\nimport { Trustware } from \"../../core\";\nimport { TrustwareConfigStore } from \"../../config/store\";\nimport { useDeposit } from \"../context/DepositContext\";\nimport type { BuildRouteResult, ChainDef } from \"../../types\";\n\n/**\n * Route building state\n */\nexport type RouteBuilderState = {\n /** Whether a route is currently being fetched */\n isLoadingRoute: boolean;\n /** Network/gas fees for the transaction (in USD) */\n networkFees: string | null;\n /** Estimated amount to receive after fees (in destination token) */\n estimatedReceive: string | null;\n /** Error message if route building failed */\n error: string | null;\n /** The built route intent ID (needed for transaction submission) */\n intentId: string | null;\n /** The full route result (for transaction execution) */\n routeResult: BuildRouteResult | null;\n};\n\n/**\n * Options for useRouteBuilder\n */\nexport interface UseRouteBuilderOptions {\n /** Debounce time in milliseconds (default: 300) */\n debounceMs?: number;\n /** Whether to automatically build routes (default: true) */\n enabled?: boolean;\n /** Route refresh interval in milliseconds (optional) */\n refreshMs?: number;\n\n fromChain: ChainDef | undefined | string | number;\n fromChainId: string | number | undefined;\n toChain: ChainDef | null;\n toChainId: string;\n toToken: string;\n toAddress: string | undefined;\n fromToken: string;\n fromAmountWei: bigint | string;\n fromAmountUsd?: string;\n fromAddress: string | undefined;\n refundAddress: string | undefined;\n slippage: number;\n}\n\n/**\n * Hook for building routes with fee calculation.\n * Automatically calls Trustware.buildRoute() when amount, token, and chain are selected.\n * Debounces calls to avoid excessive API requests.\n *\n * @param options - Configuration options\n * @returns Route building state including fees and estimated receive amount\n */\nexport function useRouteBuilder({\n enabled = true,\n debounceMs = 300,\n refreshMs,\n fromChain,\n fromChainId,\n toChain,\n toChainId,\n toToken,\n toAddress,\n fromToken,\n fromAmountWei,\n fromAmountUsd,\n fromAddress,\n refundAddress,\n slippage,\n}: UseRouteBuilderOptions): RouteBuilderState {\n // const { debounceMs = 300, enabled = true } = options;\n\n const { selectedToken, selectedChain, amount, walletAddress, errorMessage } =\n useDeposit();\n\n const [state, setState] = useState<RouteBuilderState>({\n isLoadingRoute: false,\n networkFees: null,\n estimatedReceive: null,\n error: null,\n intentId: null,\n routeResult: null,\n });\n\n const abortRef = useRef<AbortController | null>(null);\n const [refreshTick, setRefreshTick] = useState(0);\n\n // Build a cache key from the route parameters\n\n const routeKey = useMemo(() => {\n // unique key for memoization/invalidation\n if (\n !enabled ||\n !selectedToken ||\n !selectedChain ||\n !amount ||\n !walletAddress\n ) {\n return null;\n }\n\n return JSON.stringify({\n fromChainId,\n toChainId,\n fromToken,\n toToken,\n fromAmountWei: fromAmountWei.toString(), //toString() fixed the Error: <- Do not know how to serialize a BigInt->\n fromAmountUsd,\n fromAddress,\n toAddress,\n fromChain,\n toChain,\n refundAddress,\n slippage,\n } as UseRouteBuilderOptions);\n }, [\n amount,\n enabled,\n fromAddress,\n fromAmountUsd,\n fromAmountWei,\n fromChain,\n fromChainId,\n fromToken,\n refundAddress,\n selectedChain,\n selectedToken,\n slippage,\n toAddress,\n toChain,\n toChainId,\n toToken,\n walletAddress,\n ]);\n\n const hasFromChainId =\n fromChainId !== undefined &&\n fromChainId !== null &&\n String(fromChainId).trim() !== \"\";\n const hasToChainId =\n toChainId !== undefined &&\n toChainId !== null &&\n String(toChainId).trim() !== \"\";\n\n useEffect(() => {\n if (\n !fromChain ||\n !toChain ||\n !hasFromChainId ||\n !hasToChainId ||\n !fromToken ||\n !toToken ||\n !fromAmountWei ||\n !fromAddress ||\n !toAddress\n )\n return;\n\n // console.log(\n // \"[useRouteBuilder] Effect triggered, routeKey:\",\n // routeKey ? \"exists\" : \"null\"\n // );\n\n // Abort any pending request\n abortRef.current?.abort();\n\n // Clear state if we don't have all required params\n if (!routeKey) {\n setState({\n isLoadingRoute: false,\n networkFees: null,\n estimatedReceive: null,\n error: null,\n intentId: null,\n routeResult: null,\n });\n return;\n }\n\n // Parse the route key to get params\n const params = JSON.parse(routeKey);\n // console.log(\"[useRouteBuilder] Building route with params:\", params);\n\n // Create new abort controller\n const ac = new AbortController();\n abortRef.current = ac;\n\n // Debounce the route building\n const timeout = setTimeout(async () => {\n try {\n setState((prev) => ({\n ...prev,\n isLoadingRoute: true,\n error: null,\n }));\n\n // Get destination config from SDK config\n const config = TrustwareConfigStore.get();\n // console.log(\"[useRouteBuilder] Config routes:\", config.routes);\n const { toChain, toToken, toAddress, defaultSlippage } = config.routes;\n\n // Ensure we have a destination address\n const destinationAddress = toAddress || walletAddress;\n if (!destinationAddress) {\n throw new Error(\"Destination address not configured\");\n }\n\n // Build the route\n const shouldBuildRoute = errorMessage === null || errorMessage === \"\";\n\n if (!shouldBuildRoute) return;\n\n const result = await Trustware.buildRoute({\n fromChain: String(params.fromChain),\n toChain,\n fromToken: params.fromToken,\n toToken,\n fromAmount: params.fromAmountWei,\n fromAmountUsd: params.fromAmountUsd,\n fromAddress: params.fromAddress,\n toAddress: destinationAddress,\n slippage: defaultSlippage,\n });\n\n // Check if aborted\n if (ac.signal.aborted) return;\n\n // Extract fee and estimate info from the route result\n const estimate = result?.route?.estimate;\n const fees = estimate?.fees;\n\n // Debug: log the full estimate object\n // console.log(\"[useRouteBuilder] Route result:\", result);\n // console.log(\"[useRouteBuilder] Estimate:\", estimate);\n // console.log(\"[useRouteBuilder] Fees:\", fees);\n\n // Calculate network fees (gas + bridge fees in USD)\n let networkFeesUSD: string | null = null;\n if (estimate?.fromAmountUsd && estimate?.toAmountMinUsd) {\n const fromUSD = parseFloat(estimate.fromAmountUsd);\n const toMinUSD = parseFloat(estimate.toAmountMinUsd);\n if (!isNaN(fromUSD) && !isNaN(toMinUSD)) {\n const feesDiff = fromUSD - toMinUSD;\n networkFeesUSD = feesDiff > 0 ? feesDiff.toFixed(2) : \"0.00\";\n }\n }\n\n // Try to get gas cost from fees object\n if (!networkFeesUSD && fees) {\n const gasCost =\n (fees as unknown as Record<string, string>).gasCostUSD ||\n (fees as unknown as Record<string, string>).totalGasCostUSD;\n if (gasCost) {\n networkFeesUSD = parseFloat(gasCost).toFixed(2);\n }\n }\n\n // Get estimated receive amount\n // Priority: USD value > formatted token amount > raw amount converted\n let estimatedReceive: string | null = null;\n\n if (estimate?.toAmountUsd) {\n estimatedReceive = estimate.toAmountUsd;\n } else if (estimate?.toAmountMinUsd) {\n estimatedReceive = estimate.toAmountMinUsd;\n } else if (estimate?.toAmount) {\n // Convert from smallest unit - assume 6 decimals for stablecoins, 18 for others\n const toToken = config.routes.toToken?.toLowerCase() || \"\";\n const isStablecoin =\n toToken.includes(\"usdc\") ||\n toToken.includes(\"usdt\") ||\n toToken.includes(\"dai\");\n const decimals = isStablecoin ? 6 : 18;\n const raw = BigInt(estimate.toAmount);\n const divisor = BigInt(10 ** decimals);\n const whole = raw / divisor;\n const fraction = raw % divisor;\n const fractionStr = fraction\n .toString()\n .padStart(decimals, \"0\")\n .slice(0, 2);\n estimatedReceive = `${whole}.${fractionStr}`;\n }\n\n setState({\n isLoadingRoute: false,\n networkFees: networkFeesUSD,\n estimatedReceive,\n error: null,\n intentId: result.intentId,\n routeResult: result,\n });\n } catch (err) {\n // Check if aborted\n if (ac.signal.aborted) return;\n\n // Map error to user-friendly message\n const errorMessage = mapErrorToMessage(err);\n\n setState({\n isLoadingRoute: false,\n networkFees: null,\n estimatedReceive: null,\n error: errorMessage,\n intentId: null,\n routeResult: null,\n });\n } finally {\n if (!ac.signal.aborted) {\n setState((prev) => ({\n ...prev,\n isLoadingRoute: false,\n }));\n }\n }\n }, debounceMs);\n\n return () => {\n clearTimeout(timeout);\n ac.abort();\n };\n }, [\n routeKey,\n refreshTick,\n fromChainId,\n toChainId,\n fromToken,\n toToken,\n fromAmountWei,\n fromAmountUsd,\n fromAddress,\n toAddress,\n fromChain,\n toChain,\n refundAddress,\n slippage,\n hasFromChainId,\n hasToChainId,\n selectedChain,\n selectedToken,\n amount,\n walletAddress,\n errorMessage,\n ]);\n\n useEffect(() => {\n if (!enabled || !routeKey || !refreshMs || refreshMs <= 0) return;\n const id = setInterval(() => {\n setRefreshTick((tick) => tick + 1);\n }, refreshMs);\n return () => {\n clearInterval(id);\n };\n }, [enabled, refreshMs, routeKey]);\n\n return state;\n}\n\n/**\n * Maps API errors to user-friendly messages\n */\nfunction mapErrorToMessage(err: unknown): string {\n if (err instanceof Error) {\n const msg = err.message.toLowerCase();\n\n if (msg.includes(\"insufficient\") || msg.includes(\"balance\")) {\n return \"Insufficient balance for this transaction\";\n }\n if (msg.includes(\"rate limit\") || msg.includes(\"429\")) {\n return \"Too many requests. Please wait a moment and try again.\";\n }\n if (msg.includes(\"network\") || msg.includes(\"fetch\")) {\n return \"Network error. Please check your connection.\";\n }\n if (msg.includes(\"slippage\") || msg.includes(\"price impact\")) {\n return \"Price impact too high. Try a smaller amount.\";\n }\n if (msg.includes(\"liquidity\")) {\n return \"Insufficient liquidity for this route.\";\n }\n if (msg.includes(\"not supported\") || msg.includes(\"unsupported\")) {\n return \"This token or chain combination is not supported.\";\n }\n if (msg.includes(\"api key\") || msg.includes(\"unauthorized\")) {\n return \"Configuration error. Please contact support.\";\n }\n if (msg.includes(\"destination address\")) {\n return \"Destination address not configured.\";\n }\n\n // Return original message if no mapping found\n return err.message;\n }\n\n if (typeof err === \"string\") {\n return err;\n }\n\n return \"Unable to calculate route. Please try again.\";\n}\n\nexport default useRouteBuilder;\n","import { useMemo } from \"react\";\nimport { useTrustwareConfig } from \"src/hooks/useTrustwareConfig\";\n\nexport type AmountConstraints = {\n fixedFromAmountString?: string;\n fixedFromAmountValue?: number;\n isFixedAmount: boolean;\n minAmountUsd?: number;\n maxAmountUsd?: number;\n};\n\nfunction parsePositiveNumber(value: string | number | null | undefined) {\n if (value === null || value === undefined) return undefined;\n const str = String(value).trim();\n if (!str) return undefined;\n const n = Number(str);\n return Number.isFinite(n) && n >= 0 ? n : undefined;\n}\n\nexport function useAmountConstraints(): AmountConstraints {\n const config = useTrustwareConfig();\n const routeOptions = config.routes?.options ?? {};\n\n const fixedFromAmountString = useMemo(() => {\n const raw = routeOptions.fixedFromAmount;\n if (raw === null || raw === undefined) return undefined;\n const str = String(raw).trim();\n if (!str) return undefined;\n const n = Number(str);\n return Number.isFinite(n) && n > 0 ? str : undefined;\n }, [routeOptions.fixedFromAmount]);\n\n const fixedFromAmountValue = useMemo(() => {\n if (!fixedFromAmountString) return undefined;\n const n = Number(fixedFromAmountString);\n return Number.isFinite(n) ? n : undefined;\n }, [fixedFromAmountString]);\n\n const minAmountUsd = useMemo(\n () => parsePositiveNumber(routeOptions.minAmountOut),\n [routeOptions.minAmountOut]\n );\n const maxAmountUsd = useMemo(\n () => parsePositiveNumber(routeOptions.maxAmountOut),\n [routeOptions.maxAmountOut]\n );\n\n return {\n fixedFromAmountString,\n fixedFromAmountValue,\n isFixedAmount: fixedFromAmountValue !== undefined,\n minAmountUsd,\n maxAmountUsd,\n };\n}\n\nexport function sanitizeAmountInput(raw: string): string {\n const cleaned = raw.replace(/[^0-9.]/g, \"\");\n const parts = cleaned.split(\".\");\n return parts.length > 2 ? parts[0] + \".\" + parts.slice(1).join(\"\") : cleaned;\n}\n\nexport function clampUsdAmount(\n raw: string,\n min?: number,\n max?: number\n): string {\n if (!raw) return raw;\n const n = Number(raw);\n if (!Number.isFinite(n)) return raw;\n let clamped = n;\n if (min != null && clamped < min) clamped = min;\n if (max != null && clamped > max) clamped = max;\n return clamped.toString();\n}\n","\"use client\";\nimport { useEffect, useState } from \"react\";\nimport type { ResolvedTrustwareConfig } from \"../types\";\nimport { TrustwareConfigStore } from \"../config/store\";\n\nexport function useTrustwareConfig(): ResolvedTrustwareConfig {\n const [cfg, setCfg] = useState<ResolvedTrustwareConfig>(() => {\n try {\n return TrustwareConfigStore.get();\n } catch {\n // not initialized yet; create a placeholder to avoid SSR crashes,\n // but this will be replaced on subscribe() fire\n return {\n apiKey: \"\",\n routes: {\n toChain: \"\",\n toToken: \"\",\n toAddress: undefined,\n defaultSlippage: 1,\n routeType: \"swap\",\n options: {},\n },\n autoDetectProvider: false,\n theme: {\n primaryColor: \"#4F46E5\",\n secondaryColor: \"#6366F1\",\n backgroundColor: \"#FFFFFF\",\n textColor: \"#111827\",\n borderColor: \"#E5E7EB\",\n radius: 8,\n },\n messages: {\n title: \"Trustware SDK\",\n description: \"Seamlessly bridge assets across chains with Trustware.\",\n },\n retry: {\n autoRetry: true,\n maxRetries: 3,\n baseDelayMs: 1000,\n approachingThreshold: 5,\n },\n };\n }\n });\n\n useEffect(() => {\n const unsubscribe = TrustwareConfigStore.subscribe(setCfg);\n return () => {\n unsubscribe();\n };\n }, []);\n\n return cfg;\n}\n","\"use client\";\nimport { useCallback, useState } from \"react\";\nimport { Trustware } from \"../../core\";\nimport { submitReceipt } from \"../../core/routes\";\nimport { useDeposit } from \"../context/DepositContext\";\nimport type { BuildRouteResult } from \"../../types\";\n\n/**\n * Transaction submission state\n */\nexport type TransactionSubmitState = {\n /** Whether a transaction is currently being submitted */\n isSubmitting: boolean;\n /** Transaction hash after wallet approval (null if not yet submitted) */\n txHash: string | null;\n /** Error message if submission failed */\n error: string | null;\n};\n\n/**\n * Hook for submitting transactions to the wallet.\n * Handles the wallet signing flow and error mapping.\n *\n * @returns Transaction submission state and submit function\n */\nexport function useTransactionSubmit() {\n const {\n selectedChain,\n setTransactionStatus,\n setTransactionHash,\n setErrorMessage,\n setCurrentStep,\n setIntentId,\n } = useDeposit();\n\n const [state, setState] = useState<TransactionSubmitState>({\n isSubmitting: false,\n txHash: null,\n error: null,\n });\n\n /**\n * Submit a transaction to the wallet for signing.\n * Updates context state throughout the flow.\n *\n * @param routeResult - The built route result from useRouteBuilder\n * @returns The transaction hash if successful, null if failed\n */\n const submitTransaction = useCallback(\n async (routeResult: BuildRouteResult): Promise<string | null> => {\n if (!routeResult?.txReq) {\n const errorMsg = \"Invalid route data. Please try again.\";\n setState({\n isSubmitting: false,\n txHash: null,\n error: errorMsg,\n });\n setErrorMessage(errorMsg);\n setTransactionStatus(\"error\");\n setCurrentStep(\"error\");\n return null;\n }\n\n setState({\n isSubmitting: true,\n txHash: null,\n error: null,\n });\n\n // Set context to confirming state (waiting for wallet signature)\n setTransactionStatus(\"confirming\");\n\n try {\n // Get the fallback chain ID from selected chain\n const fallbackChainId = selectedChain?.chainId;\n\n // Send the transaction to the wallet for signing\n const hash = await Trustware.sendRouteTransaction(\n routeResult,\n Number(fallbackChainId)\n );\n\n // Transaction was signed and submitted\n setState({\n isSubmitting: false,\n txHash: hash,\n error: null,\n });\n\n // Update context with the transaction hash and intent ID\n setTransactionHash(hash);\n setIntentId(routeResult.intentId);\n\n // Notify backend of the transaction receipt\n try {\n await submitReceipt(routeResult.intentId, hash);\n } catch {\n // Don't fail the transaction if receipt submission fails\n // The backend poller will eventually pick it up\n }\n\n // Transition to processing step (polling will be handled by Processing page)\n setTransactionStatus(\"processing\");\n setCurrentStep(\"processing\");\n\n return hash;\n } catch (err) {\n // Map error to user-friendly message\n const errorMsg = mapTransactionError(err);\n\n setState({\n isSubmitting: false,\n txHash: null,\n error: errorMsg,\n });\n\n // Update context with error\n setErrorMessage(errorMsg);\n setTransactionStatus(\"error\");\n setCurrentStep(\"error\");\n\n return null;\n }\n },\n [\n selectedChain,\n setTransactionStatus,\n setTransactionHash,\n setErrorMessage,\n setCurrentStep,\n setIntentId,\n ]\n );\n\n /**\n * Reset the submission state\n */\n const resetSubmit = useCallback(() => {\n setState({\n isSubmitting: false,\n txHash: null,\n error: null,\n });\n }, []);\n\n return {\n ...state,\n submitTransaction,\n resetSubmit,\n };\n}\n\n/**\n * Maps wallet/transaction errors to user-friendly messages\n */\nfunction mapTransactionError(err: unknown): string {\n if (!err) {\n return \"Transaction failed. Please try again.\";\n }\n\n // Check for user rejection (code 4001)\n const errRecord = err as Record<string, unknown>;\n const errorCode =\n errRecord?.code ?? (errRecord?.data as Record<string, unknown>)?.code;\n if (errorCode === 4001) {\n return \"Transaction cancelled. You rejected the request in your wallet.\";\n }\n\n // Get error message\n const msg =\n err instanceof Error\n ? err.message\n : typeof err === \"string\"\n ? err\n : String(err);\n\n const msgLower = msg.toLowerCase();\n\n // User rejection patterns\n if (\n msgLower.includes(\"user rejected\") ||\n msgLower.includes(\"user denied\") ||\n msgLower.includes(\"rejected the request\") ||\n msgLower.includes(\"cancelled\") ||\n msgLower.includes(\"canceled\")\n ) {\n return \"Transaction cancelled. You rejected the request in your wallet.\";\n }\n\n // Insufficient funds\n if (\n msgLower.includes(\"insufficient funds\") ||\n msgLower.includes(\"insufficient balance\") ||\n msgLower.includes(\"not enough\")\n ) {\n return \"Insufficient funds. Please check your balance and try again.\";\n }\n\n // Gas estimation failed\n if (msgLower.includes(\"gas\") || msgLower.includes(\"execution reverted\")) {\n return \"Transaction would fail. Please try a different amount or token.\";\n }\n\n // Network/RPC errors\n if (\n msgLower.includes(\"network\") ||\n msgLower.includes(\"rpc\") ||\n msgLower.includes(\"connection\")\n ) {\n return \"Network error. Please check your connection and try again.\";\n }\n\n // Chain switching errors\n if (msgLower.includes(\"chain\") || msgLower.includes(\"switch\")) {\n return \"Please switch to the correct network in your wallet.\";\n }\n\n // Wallet not configured\n if (msgLower.includes(\"wallet not configured\")) {\n return \"Wallet not connected. Please connect your wallet first.\";\n }\n\n // Pending request\n if (msgLower.includes(\"pending\") || msgLower.includes(\"already processing\")) {\n return \"Please check your wallet for a pending request.\";\n }\n\n // Return the original message if no specific mapping found\n // but make it more user-friendly by removing technical prefixes\n const cleanedMsg = msg\n .replace(/^error:\\s*/i, \"\")\n .replace(/^err:\\s*/i, \"\")\n .replace(/^exception:\\s*/i, \"\");\n\n // Truncate very long messages\n if (cleanedMsg.length > 150) {\n return cleanedMsg.substring(0, 147) + \"...\";\n }\n\n return cleanedMsg || \"Transaction failed. Please try again.\";\n}\n\nexport default useTransactionSubmit;\n","\"use client\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { getStatus } from \"../../core/routes\";\nimport { useDeposit } from \"../context/DepositContext\";\nimport { useTrustware } from \"src/provider\";\nimport type { Transaction } from \"../../types\";\n\n/**\n * Polling interval in milliseconds - faster for better UX\n * Initial polls are faster, then slows down for efficiency\n */\nconst FAST_POLL_INTERVAL_MS = 1500;\nconst NORMAL_POLL_INTERVAL_MS = 2500;\n\n/**\n * Timeout duration in milliseconds (5 minutes as per spec)\n */\nconst POLL_TIMEOUT_MS = 5 * 60 * 1000;\n\n/**\n * Transaction polling state\n */\nexport type TransactionPollingState = {\n /** Whether polling is currently active */\n isPolling: boolean;\n /** The latest transaction status from the API */\n apiStatus: Transaction[\"status\"] | null;\n /** Error message if polling failed */\n error: string | null;\n /** The full transaction data from the API */\n transaction: Transaction | null;\n /** Whether the receipt has been submitted */\n receiptSubmitted: boolean;\n};\n\n/**\n * Hook for monitoring transaction status after submission.\n * Handles receipt submission and status polling with bridge phase detection.\n *\n * @returns Transaction polling state and control functions\n */\nexport function useTransactionPolling() {\n const { setTransactionStatus, setCurrentStep, setErrorMessage } =\n useDeposit();\n const { emitSuccess } = useTrustware();\n\n const [state, setState] = useState<TransactionPollingState>({\n isPolling: false,\n apiStatus: null,\n error: null,\n transaction: null,\n receiptSubmitted: false,\n });\n\n // Refs for cleanup and timeout tracking\n const pollingRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const abortRef = useRef(false);\n const startTimeRef = useRef<number>(0);\n const pollCountRef = useRef<number>(0);\n\n /**\n * Clear all timers and stop polling\n */\n const clearPolling = useCallback(() => {\n abortRef.current = true;\n if (pollingRef.current) {\n clearTimeout(pollingRef.current);\n pollingRef.current = null;\n }\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = null;\n }\n }, []);\n\n /**\n * Start monitoring a transaction by polling status.\n * Note: Receipt submission is handled by useTransactionSubmit.\n *\n * @param intentId - The route intent ID from buildRoute\n * @param _txHash - The transaction hash (unused, kept for API compatibility)\n */\n const startPolling = useCallback(\n async (intentId: string, _txHash?: string) => {\n // Clear any existing polling\n clearPolling();\n abortRef.current = false;\n startTimeRef.current = Date.now();\n pollCountRef.current = 0;\n\n setState({\n isPolling: true,\n apiStatus: null,\n error: null,\n transaction: null,\n receiptSubmitted: true, // Receipt already submitted by useTransactionSubmit\n });\n\n try {\n // Set up the 5-minute timeout\n timeoutRef.current = setTimeout(() => {\n if (abortRef.current) return;\n\n const timeoutError =\n \"Transaction is taking longer than expected. Please check your wallet or block explorer for status.\";\n\n setState((prev) => ({\n ...prev,\n isPolling: false,\n error: timeoutError,\n }));\n\n setErrorMessage(timeoutError);\n setTransactionStatus(\"error\");\n setCurrentStep(\"error\");\n }, POLL_TIMEOUT_MS);\n\n // Step 3: Start polling loop\n const poll = async () => {\n if (abortRef.current) {\n return;\n }\n\n try {\n const tx = await getStatus(intentId);\n\n // Check if aborted after async call\n if (abortRef.current) return;\n\n // Update state with latest transaction data\n setState((prev) => ({\n ...prev,\n apiStatus: tx.status,\n transaction: tx,\n }));\n\n // Handle terminal states\n if (tx.status === \"success\") {\n clearPolling();\n setState((prev) => ({\n ...prev,\n isPolling: false,\n }));\n setTransactionStatus(\"success\");\n setCurrentStep(\"success\");\n emitSuccess?.(tx);\n return;\n }\n\n if (tx.status === \"failed\") {\n const failError = mapFailedTransactionError(tx);\n clearPolling();\n setState((prev) => ({\n ...prev,\n isPolling: false,\n error: failError,\n }));\n setErrorMessage(failError);\n setTransactionStatus(\"error\");\n setCurrentStep(\"error\");\n return;\n }\n\n // Handle bridging phase\n if (tx.status === \"bridging\") {\n setTransactionStatus(\"bridging\");\n }\n\n // Schedule next poll if not terminal\n // Use faster polling for first 10 polls, then slow down\n pollCountRef.current += 1;\n const pollInterval =\n pollCountRef.current <= 10\n ? FAST_POLL_INTERVAL_MS\n : NORMAL_POLL_INTERVAL_MS;\n pollingRef.current = setTimeout(poll, pollInterval);\n } catch {\n if (abortRef.current) return;\n\n // Check if we've been polling for too long (soft timeout check)\n const elapsed = Date.now() - startTimeRef.current;\n if (elapsed > POLL_TIMEOUT_MS) {\n clearPolling();\n const timeoutError =\n \"Transaction monitoring timed out. Please check your wallet or block explorer.\";\n setState((prev) => ({\n ...prev,\n isPolling: false,\n error: timeoutError,\n }));\n setErrorMessage(timeoutError);\n setTransactionStatus(\"error\");\n setCurrentStep(\"error\");\n return;\n }\n\n // Retry after interval (use same adaptive timing)\n pollCountRef.current += 1;\n const retryInterval =\n pollCountRef.current <= 10\n ? FAST_POLL_INTERVAL_MS\n : NORMAL_POLL_INTERVAL_MS;\n pollingRef.current = setTimeout(poll, retryInterval);\n }\n };\n\n // Start first poll\n poll();\n } catch (err) {\n if (abortRef.current) return;\n\n const errorMessage = mapReceiptError(err);\n clearPolling();\n\n setState({\n isPolling: false,\n apiStatus: null,\n error: errorMessage,\n transaction: null,\n receiptSubmitted: false,\n });\n\n setErrorMessage(errorMessage);\n setTransactionStatus(\"error\");\n setCurrentStep(\"error\");\n }\n },\n [\n clearPolling,\n emitSuccess,\n setTransactionStatus,\n setCurrentStep,\n setErrorMessage,\n ]\n );\n\n /**\n * Stop polling manually\n */\n const stopPolling = useCallback(() => {\n clearPolling();\n setState((prev) => ({\n ...prev,\n isPolling: false,\n }));\n }, [clearPolling]);\n\n /**\n * Reset the polling state\n */\n const resetPolling = useCallback(() => {\n clearPolling();\n setState({\n isPolling: false,\n apiStatus: null,\n error: null,\n transaction: null,\n receiptSubmitted: false,\n });\n }, [clearPolling]);\n\n // Cleanup on unmount only - use ref to avoid dependency issues\n const clearPollingRef = useRef(clearPolling);\n clearPollingRef.current = clearPolling;\n\n useEffect(() => {\n return () => {\n clearPollingRef.current();\n };\n }, []); // Empty deps - only run cleanup on actual unmount\n\n return {\n ...state,\n startPolling,\n stopPolling,\n resetPolling,\n };\n}\n\n/**\n * Maps receipt submission errors to user-friendly messages\n */\nfunction mapReceiptError(err: unknown): string {\n if (!err) {\n return \"Failed to submit transaction receipt. Please try again.\";\n }\n\n const msg =\n err instanceof Error\n ? err.message\n : typeof err === \"string\"\n ? err\n : String(err);\n\n const msgLower = msg.toLowerCase();\n\n // Network/API errors\n if (\n msgLower.includes(\"network\") ||\n msgLower.includes(\"fetch\") ||\n msgLower.includes(\"connection\")\n ) {\n return \"Network error while submitting transaction. Please check your connection.\";\n }\n\n // Rate limiting\n if (msgLower.includes(\"rate limit\") || msgLower.includes(\"429\")) {\n return \"Too many requests. Please wait a moment and try again.\";\n }\n\n // Invalid intent\n if (msgLower.includes(\"intent\") || msgLower.includes(\"not found\")) {\n return \"Transaction session expired. Please try again.\";\n }\n\n // Already submitted\n if (msgLower.includes(\"duplicate\") || msgLower.includes(\"already\")) {\n return \"Transaction already submitted. Monitoring status...\";\n }\n\n // Return cleaned message\n const cleanedMsg = msg\n .replace(/^error:\\s*/i, \"\")\n .replace(/^err:\\s*/i, \"\")\n .trim();\n\n if (cleanedMsg.length > 150) {\n return cleanedMsg.substring(0, 147) + \"...\";\n }\n\n return cleanedMsg || \"Failed to submit transaction. Please try again.\";\n}\n\n/**\n * Maps failed transaction details to user-friendly error message\n */\nfunction mapFailedTransactionError(tx: Transaction): string {\n // Check for specific failure reasons in the status\n const statusRaw = tx.statusRaw;\n if (typeof statusRaw === \"object\" && statusRaw !== null) {\n const statusObj = statusRaw as Record<string, unknown>;\n const reason = statusObj.reason || statusObj.error || statusObj.message;\n\n if (reason) {\n const reasonLower = String(reason).toLowerCase();\n\n if (reasonLower.includes(\"slippage\") || reasonLower.includes(\"price\")) {\n return \"Transaction failed due to price movement. Please try again with a higher slippage.\";\n }\n\n if (reasonLower.includes(\"liquidity\")) {\n return \"Transaction failed due to insufficient liquidity. Try a smaller amount.\";\n }\n\n if (reasonLower.includes(\"timeout\") || reasonLower.includes(\"expired\")) {\n return \"Transaction expired. Please start a new deposit.\";\n }\n }\n }\n\n // Check gas status\n if (tx.gasStatus === \"insufficient\") {\n return \"Transaction failed due to insufficient gas. Please ensure you have enough native tokens for gas.\";\n }\n\n // Default failure message\n return \"Transaction failed. Please try again or contact support if the issue persists.\";\n}\n\nexport default useTransactionPolling;\n","\"use client\";\nimport React, {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\n\nimport { Trustware } from \"./core\"; // <-- the facade above\nimport type { TrustwareConfigOptions } from \"./types\";\nimport type { WalletInterFaceAPI } from \"./types\";\nimport { useWireDetectionIntoManager } from \"./wallets/manager\";\nimport { TrustwareError } from \"./errors/TrustwareError\";\nimport { TrustwareEvent } from \"./events/events\";\nimport type { Transaction } from \"./types/routes\";\n\nexport type Status = \"idle\" | \"initializing\" | \"ready\" | \"error\";\n\nexport type Ctx = {\n status: Status;\n errors?: string;\n core: typeof Trustware;\n emitError?: (error: TrustwareError) => void;\n emitSuccess?: (transaction: Transaction) => void;\n emitEvent?: (event: TrustwareEvent) => void;\n};\n\nexport const Ctx = createContext<Ctx>({ status: \"idle\", core: Trustware });\n\nexport function TrustwareProvider({\n config,\n wallet,\n autoDetect = true,\n children,\n}: {\n config: TrustwareConfigOptions; // <-- updated type\n wallet?: WalletInterFaceAPI;\n autoDetect?: boolean;\n children: React.ReactNode;\n}) {\n const [status, setStatus] = useState<Status>(\"idle\");\n const [errors, setErrors] = useState<string>();\n\n const emitError = useCallback(\n (error: TrustwareError) => {\n config.onError?.(error);\n\n config.onEvent?.({\n type: \"error\",\n error,\n });\n\n // Error already forwarded via config.onError and config.onEvent\n },\n [config]\n );\n\n const emitEvent = useCallback(\n (event: TrustwareEvent) => {\n config.onEvent?.(event);\n },\n [config]\n );\n\n const emitSuccess = useCallback(\n (transaction: Transaction) => {\n config.onSuccess?.(transaction);\n const txHash =\n transaction?.destTxHash ||\n transaction?.sourceTxHash ||\n transaction?.id ||\n \"\";\n config.onEvent?.({\n type: \"transaction_success\",\n txHash,\n transaction,\n });\n },\n [config]\n );\n\n // Push detection results → manager (no UI, runs behind the scenes)\n useWireDetectionIntoManager();\n\n useEffect(() => {\n let cancelled = false;\n\n (async () => {\n try {\n setStatus(\"initializing\");\n setErrors(undefined);\n\n // Initialize config once\n await Trustware.init(config);\n\n if (wallet) {\n // If caller gives us a wallet, attach it directly\n // eslint-disable-next-line react-hooks/rules-of-hooks -- Trustware.useWallet is not a React hook\n Trustware.useWallet(wallet);\n if (!cancelled) setStatus(\"ready\");\n return;\n }\n\n if (autoDetect) {\n await Trustware.autoDetect(400);\n }\n\n if (!cancelled) setStatus(\"ready\");\n } catch (e: unknown) {\n if (!cancelled) {\n setStatus(\"error\");\n setErrors(e instanceof Error ? e.message : String(e));\n }\n }\n })();\n\n return () => {\n cancelled = true;\n };\n }, [config, wallet, autoDetect]);\n\n const value = useMemo<Ctx>(\n () => ({\n status,\n errors,\n core: Trustware,\n emitError,\n emitSuccess,\n emitEvent,\n }),\n [status, errors, emitError, emitSuccess, emitEvent]\n );\n return <Ctx.Provider value={value}>{children}</Ctx.Provider>;\n}\n\nexport function useTrustware() {\n const ctx = useContext(Ctx);\n if (!ctx)\n throw new Error(\n \"useTrustware must be used inside <TrustwareProvider config={...}>\"\n );\n return ctx;\n}\n","import React, { useCallback, useMemo } from \"react\";\nimport { colors, spacing, fontSize, fontWeight } from \"../styles\";\n\nexport interface AmountSliderProps {\n /** Current amount value */\n value: number;\n /** Callback when the slider value changes */\n onChange: (value: number) => void;\n /** Maximum amount (e.g., wallet balance or deposit limit) */\n max: number;\n /** Minimum amount (defaults to 0) */\n min?: number;\n /** Additional inline styles */\n style?: React.CSSProperties;\n /** Whether the slider is disabled */\n disabled?: boolean;\n}\n\n/**\n * Tick mark configuration for slider labels\n */\ninterface TickMark {\n position: number;\n label: string;\n value: number;\n}\n\nconst roundToNiceNumber = (value: number, range: number): number => {\n // Determine appropriate rounding precision\n let roundingFactor: number;\n\n if (range < 0.5) {\n roundingFactor = 1000; // Round to 0.001\n } else if (range < 1) {\n roundingFactor = 500; // Round to 0.002\n } else if (range < 5) {\n roundingFactor = 100; // Round to 0.01\n } else if (range < 10) {\n roundingFactor = 50; // Round to 0.02\n } else if (range < 50) {\n roundingFactor = 10; // Round to 0.1\n } else if (range < 100) {\n roundingFactor = 5; // Round to 0.2\n } else if (range < 500) {\n roundingFactor = 1; // Round to 1\n } else if (range < 1000) {\n roundingFactor = 5; // Round to 5\n } else if (range < 5000) {\n roundingFactor = 10; // Round to 10\n } else if (range < 10000) {\n roundingFactor = 50; // Round to 50\n } else {\n roundingFactor = 100; // Round to 100\n }\n\n return Math.round(value * roundingFactor) / roundingFactor;\n};\n\n// Format values appropriately\nconst formatValue = (value: number): string => {\n // Remove unnecessary decimal places\n if (value % 1 === 0) {\n return Math.round(value).toString();\n }\n\n // For values with decimals, show 1-2 decimal places based on size\n if (value < 1) {\n // Show up to 3 decimal places for very small values\n return parseFloat(value.toFixed(3)).toString();\n } else if (value < 10) {\n // Show up to 2 decimal places for small values\n return parseFloat(value.toFixed(2)).toString();\n } else if (value < 1000) {\n // Show up to 1 decimal place for medium values\n return parseFloat(value.toFixed(1)).toString();\n }\n\n // For large values, round to nearest integer\n return Math.round(value).toLocaleString();\n};\n\n/**\n * Range slider component for quickly adjusting deposit amounts.\n * Features:\n * - Smart tick marks that adapt to the max value\n * - Snap-to-tick behavior for precise amounts\n * - Smooth drag interaction\n * - Bidirectional sync with amount input\n */\nexport function AmountSlider({\n value,\n onChange,\n max,\n min = 0,\n style,\n disabled = false,\n}: AmountSliderProps): React.ReactElement {\n /**\n * Generate smart tick marks based on the [min, max] range with even spacing\n */\n\n const generateTickMarks = useCallback(\n (minValue: number, maxValue: number): TickMark[] => {\n const range = maxValue - minValue;\n\n // For very small or zero range\n if (range <= 0) {\n return [\n {\n position: 100,\n label: `$${formatValue(maxValue)}`,\n value: maxValue,\n },\n ];\n }\n\n // Always create 5 evenly spaced points (min + 3 intermediate + max)\n // We'll return 4 tick marks (max + 3 intermediate), min will be handled separately\n const totalPoints = 5; // min + 3 intermediate + max\n const spacingPercent = 100 / (totalPoints - 1); // 25% spacing\n\n // Calculate nice rounded values for each intermediate position\n const ticks: TickMark[] = [];\n\n // First intermediate point (25%)\n const value1 = minValue + (range * 1) / 4;\n const niceValue1 = roundToNiceNumber(value1, range);\n\n // Second intermediate point (50%)\n const value2 = minValue + (range * 2) / 4;\n const niceValue2 = roundToNiceNumber(value2, range);\n\n // Third intermediate point (75%)\n const value3 = minValue + (range * 3) / 4;\n const niceValue3 = roundToNiceNumber(value3, range);\n\n // Add first intermediate tick (25%)\n ticks.push({\n position: spacingPercent * 1, // 25%\n label: `$${formatValue(niceValue1)}`,\n value: niceValue1,\n });\n\n // Add second intermediate tick (50%)\n ticks.push({\n position: spacingPercent * 2, // 50%\n label: `$${formatValue(niceValue2)}`,\n value: niceValue2,\n });\n\n // Add third intermediate tick (75%)\n ticks.push({\n position: spacingPercent * 3, // 75%\n label: `$${formatValue(niceValue3)}`,\n value: niceValue3,\n });\n\n // Always add Max at the end (100%)\n ticks.push({\n position: 100,\n label: `$${formatValue(maxValue)}`,\n value: maxValue,\n });\n\n // console.log({ ticks, minValue, maxValue, range });\n return ticks;\n },\n []\n );\n\n const tickMarks = useMemo(\n () => generateTickMarks(min, max),\n [generateTickMarks, min, max]\n );\n\n /**\n * Calculate slider position percentage based on value\n * Uses tick positions for exact alignment when snapped to tick\n */\n const getPercentage = useCallback((): number => {\n if (max <= 0) return 0;\n\n // Check if at zero or min\n if (value <= min) return 0;\n\n // Create array of all points including min\n const allPoints = [\n { position: 0, value: min },\n ...tickMarks.filter((tick) => tick.position !== 0), // Ensure min isn't duplicated\n ];\n\n // Sort by position just in case\n allPoints.sort((a, b) => a.position - b.position);\n\n // Check if current value matches any point exactly\n for (const point of allPoints) {\n if (Math.abs(value - point.value) < 0.01) {\n return point.position;\n }\n }\n\n // Interpolate between points\n for (let i = 0; i < allPoints.length - 1; i++) {\n const lower = allPoints[i];\n const upper = allPoints[i + 1];\n if (value >= lower.value && value <= upper.value) {\n const valueRatio = (value - lower.value) / (upper.value - lower.value);\n return lower.position + valueRatio * (upper.position - lower.position);\n }\n }\n\n return Math.min(((value - min) / (max - min)) * 100, 100);\n }, [max, min, tickMarks, value]);\n\n // Snap threshold - 5% of max value for noticeable snap effect\n const snapThreshold = max * 0.05;\n\n const percentage = useMemo(() => getPercentage(), [getPercentage]);\n\n /**\n * Handle slider input change with snap-to-tick behavior\n */\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n let newValue = Math.min(Math.max(Number(e.target.value), min), max);\n\n // Check if close to any tick mark and snap to it\n for (const tick of tickMarks) {\n if (Math.abs(newValue - tick.value) <= snapThreshold) {\n newValue = tick.value;\n break;\n }\n }\n\n // Also snap to min if close\n if (newValue <= min + snapThreshold) {\n newValue = min;\n }\n\n onChange(newValue);\n },\n [onChange, min, max, tickMarks, snapThreshold]\n );\n\n /**\n * Handle clicking on a tick mark to jump to that value\n */\n const handleTickClick = useCallback(\n (tickValue: number) => {\n if (disabled) return;\n onChange(tickValue);\n },\n [onChange, disabled]\n );\n\n return (\n <div style={{ width: \"100%\", ...style }}>\n {/* Slider Track */}\n <div style={{ position: \"relative\" }}>\n {/* Labels */}\n <div\n style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n marginBottom: spacing[2],\n padding: `0 ${spacing[1]}`,\n }}\n >\n <span\n style={{\n fontSize: fontSize.xs,\n color: colors.zinc[500],\n fontWeight: fontWeight.medium,\n }}\n >\n ${min}\n {min > 0 ? \" Min\" : \"\"}\n </span>\n <span\n style={{\n fontSize: fontSize.xs,\n color: colors.zinc[500],\n fontWeight: fontWeight.medium,\n }}\n >\n Max\n </span>\n </div>\n\n {/* Track Container */}\n <div\n style={{\n position: \"relative\",\n height: \"3rem\",\n display: \"flex\",\n alignItems: \"center\",\n }}\n >\n {/* Background Track */}\n <div\n style={{\n position: \"absolute\",\n left: 0,\n right: 0,\n height: \"0.625rem\",\n borderRadius: \"9999px\",\n backgroundColor: colors.background,\n boxShadow: \"inset 0 1px 2px rgba(0, 0, 0, 0.2)\",\n ...(disabled === false && { backgroundColor: colors.muted }),\n }}\n />\n\n {/* Active Track */}\n <div\n style={{\n position: \"absolute\",\n left: 0,\n height: \"0.625rem\",\n borderRadius: \"9999px\",\n background: `linear-gradient(90deg, ${colors.emerald[500]}, ${colors.emerald[400]})`,\n boxShadow: `0 0 8px ${colors.emerald[500]}40`,\n transition: \"all 75ms\",\n width: `${percentage}%`,\n ...(disabled && { backgroundColor: \"rgba(4, 120, 87, 0.5)\" }),\n }}\n />\n\n {/* Tick Marks */}\n {tickMarks.map((tick) => {\n const isActive = percentage >= tick.position;\n return (\n <button\n key={tick.position}\n type=\"button\"\n style={{\n position: \"absolute\",\n top: 0,\n bottom: 0,\n transform: \"translateX(-50%)\",\n padding: 0,\n margin: 0,\n border: 0,\n width: \"1.5rem\",\n backgroundColor: colors.transparent,\n cursor: \"pointer\",\n outline: \"none\",\n left: `${tick.position}%`,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n onClick={() => handleTickClick(tick.value)}\n disabled={disabled}\n aria-label={`Set amount to ${tick.label}`}\n >\n <div\n style={{\n width: \"2px\",\n height: \"0.5rem\",\n borderRadius: \"9999px\",\n transition: \"all 0.2s\",\n backgroundColor: isActive\n ? colors.emerald[400]\n : colors.zinc[400],\n boxShadow: isActive\n ? `0 0 4px ${colors.emerald[500]}40`\n : \"none\",\n }}\n />\n </button>\n );\n })}\n\n {/* Range Input */}\n <input\n type=\"range\"\n min={min}\n max={max}\n value={value}\n onChange={handleChange}\n disabled={disabled}\n style={{\n position: \"absolute\",\n inset: 0,\n width: \"100%\",\n height: \"100%\",\n opacity: 0,\n zIndex: 10,\n touchAction: \"none\",\n cursor: \"pointer\",\n WebkitAppearance: \"none\",\n appearance: \"none\",\n ...(disabled && { cursor: \"not-allowed\" }),\n }}\n aria-label=\"Amount slider\"\n aria-valuemin={min}\n aria-valuemax={max}\n aria-valuenow={value}\n aria-valuetext={`$${value.toLocaleString()}`}\n />\n\n {/* Thumb */}\n <div\n style={{\n position: \"absolute\",\n top: \"50%\",\n transform: \"translateY(-50%)\",\n width: \"1.75rem\",\n height: \"1.75rem\",\n borderRadius: \"9999px\",\n boxShadow: `0 4px 12px rgba(0, 0, 0, 0.3), 0 0 0 3px ${colors.emerald[500]}30`,\n pointerEvents: \"none\",\n transition: \"all 75ms\",\n backgroundColor: colors.white,\n border: `3px solid ${colors.emerald[500]}`,\n left: `calc(${percentage}% - 12px)`,\n ...(disabled && {\n backgroundColor: colors.zinc[600],\n border: `2px solid ${colors.zinc[500]}`,\n }),\n }}\n />\n </div>\n\n {/* Tick Labels */}\n <div\n style={{\n position: \"relative\",\n marginTop: spacing[2],\n height: \"1.25rem\",\n }}\n >\n {tickMarks.map((tick) => (\n <span\n key={tick.position}\n style={{\n position: \"absolute\",\n fontSize: \"10px\",\n fontWeight: fontWeight.semibold,\n transform: \"translateX(-50%)\",\n letterSpacing: \"-0.01em\",\n left: `${tick.position}%`,\n\n color:\n percentage >= tick.position\n ? colors.zinc[400]\n : colors.zinc[600],\n }}\n >\n {tick.label}\n </span>\n ))}\n </div>\n </div>\n </div>\n );\n}\n\nexport default AmountSlider;\n","import React from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { colors, fontSize, fontWeight } from \"../styles\";\n\nexport interface CircularProgressProps {\n /** Progress value from 0-100 */\n progress?: number;\n /** Size of the circle in pixels */\n size?: number;\n /** Stroke width in pixels */\n strokeWidth?: number;\n /** Additional inline styles */\n style?: React.CSSProperties;\n /** Show percentage text in center */\n showPercentage?: boolean;\n /** Use spinning indeterminate animation */\n isIndeterminate?: boolean;\n}\n\n/**\n * CircularProgress component for displaying progress in a circular format.\n * Supports both determinate (with percentage) and indeterminate (spinning) modes.\n */\nexport function CircularProgress({\n progress = 0,\n size = 120,\n strokeWidth = 8,\n style,\n showPercentage = false,\n isIndeterminate = false,\n}: CircularProgressProps): React.ReactElement {\n const radius = (size - strokeWidth) / 2;\n const circumference = radius * 2 * Math.PI;\n const offset = circumference - (progress / 100) * circumference;\n\n return (\n <div\n style={{\n position: \"relative\",\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n ...style,\n }}\n >\n <svg\n width={size}\n height={size}\n className={cn(isIndeterminate && \"tw-animate-spin\")}\n style={{\n ...(isIndeterminate\n ? { animation: \"tw-spin 2s linear infinite\" }\n : {}),\n }}\n >\n {/* Background circle */}\n <circle\n cx={size / 2}\n cy={size / 2}\n r={radius}\n fill=\"none\"\n stroke={colors.muted}\n strokeWidth={strokeWidth}\n />\n\n {/* Progress circle */}\n <circle\n cx={size / 2}\n cy={size / 2}\n r={radius}\n fill=\"none\"\n stroke={colors.primary}\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n strokeDasharray={circumference}\n strokeDashoffset={isIndeterminate ? circumference * 0.75 : offset}\n transform={`rotate(-90 ${size / 2} ${size / 2})`}\n style={{\n transition: \"all 0.5s ease-out\",\n }}\n />\n </svg>\n\n {showPercentage && !isIndeterminate && (\n <div\n style={{\n position: \"absolute\",\n inset: 0,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n <span\n style={{\n fontSize: fontSize[\"2xl\"],\n fontWeight: fontWeight.bold,\n color: colors.foreground,\n }}\n >\n {Math.round(progress)}%\n </span>\n </div>\n )}\n </div>\n );\n}\n\nexport default CircularProgress;\n","import React, { useEffect, useRef, ReactNode } from \"react\";\nimport {\n colors,\n spacing,\n fontSize,\n fontWeight,\n borderRadius,\n zIndex,\n} from \"../styles\";\n\nexport interface DialogProps {\n /** Controls whether the dialog is visible */\n open: boolean;\n /** Callback when dialog is cancelled/closed */\n onCancel: () => void;\n /** Callback when dialog is confirmed */\n onConfirm: () => void;\n /** Optional dialog title */\n title?: ReactNode;\n /** Optional dialog description */\n description?: ReactNode;\n /** Optional cancel button text */\n cancelText?: string;\n /** Optional confirm button text */\n confirmText?: string;\n /** Optional CSS class name */\n className?: string;\n /** Optional style overrides */\n style?: React.CSSProperties;\n\n isDark?: boolean;\n}\n\nexport const Dialog: React.FC<DialogProps> = ({\n open,\n onCancel,\n onConfirm,\n title = \"Transaction in Progress\",\n description = \"You have an active transaction. Closing the widget will not cancel your transaction, but you will lose visibility of its progress.\",\n cancelText = \"Keep Open\",\n confirmText = \"Close Anyway\",\n isDark = false,\n}) => {\n const dialogRef = useRef<HTMLDivElement>(null);\n const overlayRef = useRef<HTMLDivElement>(null);\n const firstButtonRef = useRef<HTMLButtonElement>(null);\n const lastButtonRef = useRef<HTMLButtonElement>(null);\n\n // Handle Escape key press\n useEffect(() => {\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === \"Escape\" && open) {\n e.preventDefault();\n onCancel();\n }\n };\n\n if (open) {\n document.addEventListener(\"keydown\", handleEscape);\n }\n\n return () => {\n document.removeEventListener(\"keydown\", handleEscape);\n };\n }, [open, onCancel]);\n\n // Handle focus trapping\n useEffect(() => {\n const handleTabKey = (e: KeyboardEvent) => {\n if (!open) return;\n\n if (e.key === \"Tab\") {\n if (e.shiftKey) {\n // Shift + Tab (moving backwards)\n if (document.activeElement === firstButtonRef.current) {\n e.preventDefault();\n lastButtonRef.current?.focus();\n }\n } else {\n // Tab (moving forwards)\n if (document.activeElement === lastButtonRef.current) {\n e.preventDefault();\n firstButtonRef.current?.focus();\n }\n }\n }\n };\n\n if (open) {\n document.addEventListener(\"keydown\", handleTabKey);\n }\n\n return () => {\n document.removeEventListener(\"keydown\", handleTabKey);\n };\n }, [open]);\n\n // Set initial focus when dialog opens and manage body scroll\n useEffect(() => {\n if (open) {\n // Store current body overflow style\n const originalStyle = window.getComputedStyle(document.body).overflow;\n\n // Prevent body scrolling\n document.body.style.overflow = \"hidden\";\n\n // Set focus to first button after a small delay\n const timer = setTimeout(() => {\n firstButtonRef.current?.focus();\n }, 10);\n\n return () => {\n clearTimeout(timer);\n // Restore original body overflow\n document.body.style.overflow = originalStyle;\n };\n }\n }, [open]);\n\n // Handle click outside to close\n const handleOverlayClick = (e: React.MouseEvent<HTMLDivElement>) => {\n if (e.target === e.currentTarget) {\n onCancel();\n }\n };\n\n // Handle button key down events\n const handleCancelKeyDown = (e: React.KeyboardEvent<HTMLButtonElement>) => {\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n onCancel();\n }\n };\n\n const handleConfirmKeyDown = (e: React.KeyboardEvent<HTMLButtonElement>) => {\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n onConfirm();\n }\n };\n\n // Add hover and focus styles dynamically\n const handleCancelMouseEnter = (e: React.MouseEvent<HTMLButtonElement>) => {\n e.currentTarget.style.backgroundColor = \"var(--cancel-hover, #e5e7eb)\";\n };\n\n const handleCancelMouseLeave = (e: React.MouseEvent<HTMLButtonElement>) => {\n e.currentTarget.style.backgroundColor = \"var(--cancel-bg, #f3f4f6)\";\n };\n\n const handleConfirmMouseEnter = (e: React.MouseEvent<HTMLButtonElement>) => {\n e.currentTarget.style.backgroundColor = \"var(--confirm-hover, #dc2626)\";\n };\n\n const handleConfirmMouseLeave = (e: React.MouseEvent<HTMLButtonElement>) => {\n e.currentTarget.style.backgroundColor = \"var(--confirm-bg, #ef4444)\";\n };\n\n const handleCancelFocus = (e: React.FocusEvent<HTMLButtonElement>) => {\n e.currentTarget.style.boxShadow = \"0 0 0 3px rgba(59, 130, 246, 0.5)\";\n e.currentTarget.style.borderColor = \"#3b82f6\";\n };\n\n const handleCancelBlur = (e: React.FocusEvent<HTMLButtonElement>) => {\n e.currentTarget.style.boxShadow = \"\";\n e.currentTarget.style.borderColor = \"var(--cancel-border, #d1d5db)\";\n };\n\n const handleConfirmFocus = (e: React.FocusEvent<HTMLButtonElement>) => {\n e.currentTarget.style.boxShadow = \"0 0 0 3px rgba(239, 68, 68, 0.5)\";\n e.currentTarget.style.borderColor = \"#ef4444\";\n };\n\n const handleConfirmBlur = (e: React.FocusEvent<HTMLButtonElement>) => {\n e.currentTarget.style.boxShadow = \"\";\n e.currentTarget.style.borderColor = \"transparent\";\n };\n\n // Don't render if not open\n if (!open) return null;\n\n return (\n <>\n <div\n // className={`dialog-overlay ${className}`}\n ref={overlayRef}\n onClick={handleOverlayClick}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"dialog-title\"\n aria-describedby=\"dialog-description\"\n data-testid=\"dialog-overlay\"\n style={{\n position: \"fixed\",\n inset: 0,\n backgroundColor: \"rgba(0, 0, 0, 0.5)\",\n zIndex: zIndex[50],\n animation: \"tw-fade-in 0.2s ease-out\",\n }}\n >\n <div\n // className=\"dialog-content\"\n ref={dialogRef}\n data-testid=\"dialog-content\"\n style={{\n position: \"fixed\",\n left: \"50%\",\n top: \"50%\",\n transform: \"translate(-50%, -50%)\",\n zIndex: zIndex[50],\n width: \"90%\",\n maxWidth: \"340px\",\n borderRadius: borderRadius.xl,\n padding: spacing[6],\n boxShadow: \"0 25px 50px -12px rgb(0 0 0 / 0.25)\",\n animation: \"tw-fade-in 0.2s ease-out\",\n backgroundColor: isDark ? colors.zinc[900] : colors.white,\n }}\n >\n <h2\n // className=\"dialog-title\"\n id=\"dialog-title\"\n data-testid=\"dialog-title\"\n style={{\n fontSize: fontSize.lg,\n fontWeight: fontWeight.semibold,\n color: isDark ? colors.white : colors.zinc[900],\n }}\n >\n {title}\n </h2>\n <p\n // className=\"dialog-description\"\n id=\"dialog-description\"\n data-testid=\"dialog-description\"\n style={{\n marginTop: spacing[2],\n fontSize: fontSize.sm,\n }}\n >\n {description}\n </p>\n <div\n // className=\"dialog-buttons-container\"\n data-testid=\"dialog-buttons-container\"\n style={{\n marginTop: \"1.5rem\",\n display: \"flex\",\n gap: \"0.75rem\",\n }}\n >\n <button\n ref={firstButtonRef}\n onClick={onCancel}\n // className=\"dialog-button dialog-button-cancel\"\n onKeyDown={handleCancelKeyDown}\n onMouseEnter={handleCancelMouseEnter}\n onMouseLeave={handleCancelMouseLeave}\n onFocus={handleCancelFocus}\n onBlur={handleCancelBlur}\n aria-label={cancelText}\n data-testid=\"dialog-cancel-button\"\n style={{\n flex: 1,\n borderRadius: \"0.5rem\",\n padding: `${spacing[2.5]} ${spacing[4]}`,\n fontSize: fontSize.sm,\n fontWeight: fontWeight.medium,\n transition: \"background-color 0.2s\",\n cursor: \"pointer\",\n ...(isDark\n ? {\n border: `1px solid ${colors.zinc[700]}`,\n color: colors.zinc[300],\n backgroundColor: \"transparent\",\n }\n : {\n border: `1px solid ${colors.zinc[200]}`,\n color: colors.zinc[700],\n backgroundColor: \"transparent\",\n }),\n }}\n >\n {cancelText}\n </button>\n\n <button\n ref={lastButtonRef}\n onClick={onConfirm}\n // className=\"dialog-button dialog-button-confirm\"\n onKeyDown={handleConfirmKeyDown}\n onMouseEnter={handleConfirmMouseEnter}\n onMouseLeave={handleConfirmMouseLeave}\n onFocus={handleConfirmFocus}\n onBlur={handleConfirmBlur}\n aria-label={confirmText}\n data-testid=\"dialog-confirm-button\"\n style={{\n // borderRadius: \"8px\",\n flex: 1,\n borderRadius: \"0.5rem\",\n backgroundColor: colors.red[500],\n padding: `${spacing[2.5]} ${spacing[4]}`,\n fontSize: fontSize.sm,\n fontWeight: fontWeight.medium,\n color: colors.white,\n transition: \"background-color 0.2s\",\n border: 0,\n cursor: \"pointer\",\n }}\n >\n {confirmText}\n </button>\n </div>\n </div>\n </div>\n </>\n );\n};\n\n// Optional: Default export for convenience\n// export default Dialog;\n","import React, { useState, useRef, useCallback, useEffect } from \"react\";\nimport { colors, spacing, fontSize, fontWeight } from \"../styles\";\nimport type { Token, YourTokenData } from \"../context/DepositContext\";\n\nexport interface SwipeToConfirmTokensProps {\n /** Token being sent/deposited */\n fromToken: Token | YourTokenData;\n /** URL to destination token icon */\n toTokenIcon?: string;\n /** Destination token symbol (e.g., 'USDC') */\n toTokenSymbol?: string;\n /** Destination chain name (e.g., 'Base') */\n toChainName?: string;\n fromChainName?: string;\n dappName?: string;\n /** Callback when swipe reaches confirmation threshold */\n onConfirm: () => void;\n /** Whether the component is disabled */\n disabled?: boolean;\n /** Whether wallet is connected (affects display text) */\n isWalletConnected?: boolean;\n /** Additional inline styles */\n style?: React.CSSProperties;\n\n text: string;\n}\n\n/**\n * Swipe-to-confirm component with token icons and horizontal drag interaction.\n */\nexport function SwipeToConfirmTokens({\n fromToken,\n toTokenIcon,\n toTokenSymbol,\n toChainName,\n fromChainName,\n dappName,\n onConfirm,\n disabled = false,\n isWalletConnected = false,\n style,\n text,\n}: SwipeToConfirmTokensProps): React.ReactElement {\n const [dragX, setDragX] = useState(0);\n const [isDragging, setIsDragging] = useState(false);\n const [isComplete, setIsComplete] = useState(false);\n const trackRef = useRef<HTMLDivElement>(null);\n const thumbRef = useRef<HTMLDivElement>(null);\n\n // Long-press state\n const [isLongPressing, setIsLongPressing] = useState(false);\n const [longPressProgress, setLongPressProgress] = useState(0);\n const longPressTimerRef = useRef<number | null>(null);\n const longPressStartRef = useRef<number | null>(null);\n const longPressAnimationRef = useRef<number | null>(null);\n\n // Constants\n const LONG_PRESS_DURATION = 1500;\n const thumbSize = 48;\n const padding = 4;\n const threshold = 0.8;\n\n const getMaxDrag = useCallback(() => {\n if (!trackRef.current) return 0;\n return trackRef.current.offsetWidth - thumbSize - padding * 2;\n }, []);\n\n const getProgress = useCallback(() => {\n const maxDrag = getMaxDrag();\n return maxDrag > 0 ? dragX / maxDrag : 0;\n }, [dragX, getMaxDrag]);\n\n const handleDragStart = useCallback(() => {\n if (disabled || isComplete) return;\n setIsDragging(true);\n }, [disabled, isComplete]);\n\n const handleDragMove = useCallback(\n (clientX: number) => {\n if (!isDragging || !trackRef.current || isComplete) return;\n const rect = trackRef.current.getBoundingClientRect();\n const newX = clientX - rect.left - thumbSize / 2 - padding;\n const maxDrag = getMaxDrag();\n const clampedX = Math.max(0, Math.min(newX, maxDrag));\n setDragX(clampedX);\n },\n [isDragging, isComplete, getMaxDrag]\n );\n\n const handleDragEnd = useCallback(() => {\n if (!isDragging) return;\n setIsDragging(false);\n const progress = getProgress();\n if (progress >= threshold) {\n setDragX(getMaxDrag());\n setIsComplete(true);\n if (navigator.vibrate) navigator.vibrate(50);\n setTimeout(() => onConfirm(), 150);\n } else {\n setDragX(0);\n }\n }, [isDragging, getProgress, getMaxDrag, onConfirm]);\n\n const triggerConfirmation = useCallback(() => {\n if (isComplete) return;\n setDragX(getMaxDrag());\n setIsComplete(true);\n if (navigator.vibrate) navigator.vibrate(50);\n setTimeout(() => onConfirm(), 150);\n }, [isComplete, getMaxDrag, onConfirm]);\n\n const cancelLongPress = useCallback(() => {\n setIsLongPressing(false);\n setLongPressProgress(0);\n longPressStartRef.current = null;\n if (longPressTimerRef.current) {\n clearTimeout(longPressTimerRef.current);\n longPressTimerRef.current = null;\n }\n if (longPressAnimationRef.current) {\n cancelAnimationFrame(longPressAnimationRef.current);\n longPressAnimationRef.current = null;\n }\n }, []);\n\n const startLongPress = useCallback(() => {\n if (disabled || isComplete || isDragging) return;\n setIsLongPressing(true);\n longPressStartRef.current = Date.now();\n const animateProgress = () => {\n if (!longPressStartRef.current) return;\n const elapsed = Date.now() - longPressStartRef.current;\n const progress = Math.min(elapsed / LONG_PRESS_DURATION, 1);\n setLongPressProgress(progress);\n if (progress >= 1) {\n cancelLongPress();\n triggerConfirmation();\n } else {\n longPressAnimationRef.current = requestAnimationFrame(animateProgress);\n }\n };\n longPressAnimationRef.current = requestAnimationFrame(animateProgress);\n }, [disabled, isComplete, isDragging, triggerConfirmation, cancelLongPress]);\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (disabled || isComplete) return;\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n startLongPress();\n }\n },\n [disabled, isComplete, startLongPress]\n );\n\n const handleKeyUp = useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n cancelLongPress();\n }\n },\n [cancelLongPress]\n );\n\n useEffect(() => {\n return () => {\n if (longPressTimerRef.current) clearTimeout(longPressTimerRef.current);\n if (longPressAnimationRef.current)\n cancelAnimationFrame(longPressAnimationRef.current);\n };\n }, []);\n\n const handleMouseDown = (e: React.MouseEvent) => {\n e.preventDefault();\n handleDragStart();\n };\n\n const handleMouseMove = useCallback(\n (e: MouseEvent) => handleDragMove(e.clientX),\n [handleDragMove]\n );\n\n const handleMouseUp = useCallback(() => handleDragEnd(), [handleDragEnd]);\n\n const handleTouchStart = () => handleDragStart();\n const handleTouchMove = (e: React.TouchEvent) =>\n handleDragMove(e.touches[0].clientX);\n const handleTouchEnd = () => handleDragEnd();\n\n useEffect(() => {\n if (isDragging) {\n window.addEventListener(\"mousemove\", handleMouseMove);\n window.addEventListener(\"mouseup\", handleMouseUp);\n return () => {\n window.removeEventListener(\"mousemove\", handleMouseMove);\n window.removeEventListener(\"mouseup\", handleMouseUp);\n };\n }\n }, [isDragging, handleMouseMove, handleMouseUp]);\n\n // eslint-disable-next-line react-hooks/refs -- trackRef accessed for layout-driven progress calculation during render\n const progress = getProgress();\n const effectiveProgress = isLongPressing ? longPressProgress : progress;\n\n const getTokenInitials = (symbol: string) =>\n symbol?.slice(0, 2).toUpperCase();\n\n const getAriaLabel = () => {\n if (!isWalletConnected) return \"Connect your wallet to deposit\";\n if (isComplete) return \"Transaction confirmed\";\n if (isLongPressing)\n return `Confirming... ${Math.round(longPressProgress * 100)}% complete.`;\n return `Confirm transaction. Swipe right to confirm.`;\n };\n const trackBg =\n effectiveProgress > 0\n ? `linear-gradient(to right, rgb(34, 197, 94) ${effectiveProgress * 100}%, ${colors.background} ${effectiveProgress * 100}%)`\n : colors.muted;\n\n return (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n gap: spacing[3],\n ...style,\n }}\n >\n <div\n ref={trackRef}\n role=\"slider\"\n aria-label={getAriaLabel()}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={Math.round(effectiveProgress * 100)}\n aria-disabled={disabled}\n tabIndex={disabled ? -1 : 0}\n onKeyDown={handleKeyDown}\n onKeyUp={handleKeyUp}\n style={{\n position: \"relative\",\n height: \"3.5rem\",\n width: \"100%\",\n borderRadius: \"9999px\",\n overflow: \"hidden\",\n userSelect: \"none\",\n border: \"1px solid rgba(255, 255, 255, 0.1)\",\n outline: \"none\",\n background: trackBg,\n ...(disabled && { opacity: 0.5, cursor: \"not-allowed\" }),\n }}\n >\n {/* Swipe text */}\n <div\n style={{\n position: \"absolute\",\n inset: 0,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n transition: \"opacity 0.2s\",\n ...(effectiveProgress > 0.15 && { opacity: 0 }),\n }}\n >\n <span\n style={{\n fontSize: fontSize.sm,\n color: colors.mutedForeground,\n fontWeight: fontWeight.bold,\n }}\n >\n {/* {isWalletConnected\n ? \"Swipe to confirm\"\n : \"Connect your wallet to deposit\"} */}\n {text}\n </span>\n </div>\n\n {/* Long-press countdown */}\n {isLongPressing && !isComplete && (\n <div\n style={{\n position: \"absolute\",\n inset: 0,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: spacing[2],\n }}\n >\n <svg\n style={{\n width: \"2rem\",\n height: \"2rem\",\n transform: \"rotate(-90deg)\",\n }}\n viewBox=\"0 0 36 36\"\n >\n <circle\n stroke={colors.zinc[600]}\n strokeWidth=\"3\"\n fill=\"transparent\"\n r=\"15.9155\"\n cx=\"18\"\n cy=\"18\"\n />\n <circle\n stroke={colors.white}\n strokeWidth=\"3\"\n strokeDasharray={`${longPressProgress * 100}, 100`}\n strokeLinecap=\"round\"\n fill=\"transparent\"\n r=\"15.9155\"\n cx=\"18\"\n cy=\"18\"\n style={{ transition: \"all 100ms\" }}\n />\n </svg>\n <span\n style={{\n fontSize: fontSize.sm,\n color: colors.white,\n fontWeight: fontWeight.bold,\n }}\n >\n {Math.ceil(\n (1 - longPressProgress) * (LONG_PRESS_DURATION / 1000) * 10\n ) / 10}\n s\n </span>\n </div>\n </div>\n )}\n\n {/* Checkmark on complete */}\n {isComplete && (\n <div\n style={{\n position: \"absolute\",\n inset: 0,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n <svg\n style={{ width: \"1.5rem\", height: \"1.5rem\", color: colors.white }}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={3}\n d=\"M5 13l4 4L19 7\"\n />\n </svg>\n </div>\n )}\n\n {/* Draggable Thumb */}\n <div\n ref={thumbRef}\n style={{\n position: \"absolute\",\n top: \"50%\",\n transform: \"translateY(-50%)\",\n width: \"3rem\",\n height: \"3rem\",\n borderRadius: \"9999px\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n cursor: \"grab\",\n zIndex: 10,\n backgroundColor: \"none\",\n\n left: `${dragX + padding}px`,\n ...{\n transition: isDragging\n ? \"transform 0.1s\"\n : \"left 0.3s cubic-bezier(0.4, 0, 0.2, 1), transform 0.15s\",\n },\n\n ...(isDragging && { transform: \"translateY(-50%) scale(1.05)\" }),\n ...(isLongPressing && {\n transform: \"translateY(-50%) scale(1.1)\",\n boxShadow: `0 0 0 2px ${colors.green[500]}`,\n }),\n ...(isComplete && { backgroundColor: colors.green[500] }),\n }}\n onMouseDown={handleMouseDown}\n onTouchStart={handleTouchStart}\n onTouchMove={handleTouchMove}\n onTouchEnd={handleTouchEnd}\n >\n {fromToken.iconUrl ? (\n <img\n src={fromToken.iconUrl}\n alt={fromToken.symbol}\n style={{\n width: \"2.5rem\",\n height: \"2.5rem\",\n objectFit: \"contain\",\n borderRadius: \"9999px\",\n }}\n />\n ) : (\n <span\n style={{\n fontSize: fontSize.sm,\n fontWeight: fontWeight.bold,\n color: colors.white,\n }}\n >\n {getTokenInitials(fromToken.symbol as string)}\n </span>\n )}\n </div>\n\n {/* Destination Icon */}\n {toTokenIcon && (\n <div\n style={{\n position: \"absolute\",\n top: \"50%\",\n transform: \"translateY(-50%)\",\n width: \"3rem\",\n height: \"3rem\",\n borderRadius: \"9999px\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n transition: \"opacity 0.2s\",\n right: `${padding}px`,\n opacity: 0.2 + effectiveProgress * 0.8,\n }}\n >\n <img\n src={toTokenIcon}\n alt={toTokenSymbol || \"destination\"}\n style={{\n width: \"2.5rem\",\n height: \"2.5rem\",\n objectFit: \"contain\",\n borderRadius: \"9999px\",\n }}\n />\n </div>\n )}\n\n {/* Chevron hint */}\n {!toTokenIcon && !isComplete && (\n <div\n style={{\n position: \"absolute\",\n top: \"50%\",\n transform: \"translateY(-50%)\",\n width: \"3rem\",\n height: \"3rem\",\n borderRadius: \"9999px\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n transition: \"opacity 0.2s\",\n right: `${padding}px`,\n opacity: 0.3 + effectiveProgress * 0.7,\n }}\n >\n <svg\n style={{\n width: \"1.5rem\",\n height: \"1.5rem\",\n color: colors.white,\n }}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M9 5l7 7-7 7\"\n />\n </svg>\n </div>\n )}\n </div>\n\n {/* Label */}\n {isWalletConnected && toChainName && (\n <span\n style={{\n fontSize: fontSize.xs,\n color: colors.zinc[400],\n }}\n >\n {fromToken.symbol} on {fromChainName} → {dappName}\n </span>\n )}\n </div>\n );\n}\n\nexport default SwipeToConfirmTokens;\n","import React from \"react\";\nimport { colors } from \"../styles\";\n\n/**\n * Resolved theme type (not 'system')\n */\nexport type ResolvedTheme = \"light\" | \"dark\";\n\nexport interface ThemeToggleProps {\n /** Current resolved theme */\n theme: ResolvedTheme;\n /** Callback when theme is toggled */\n onToggle: () => void;\n /** Additional inline styles */\n style?: React.CSSProperties;\n}\n\n/**\n * Theme toggle button with sun/moon icons for switching between light and dark modes.\n * Uses animated icons to provide visual feedback during theme transition.\n */\nexport function ThemeToggle({\n theme,\n onToggle,\n style,\n}: ThemeToggleProps): React.ReactElement {\n const isDark = theme === \"dark\";\n\n return (\n <button\n onClick={onToggle}\n style={{\n position: \"relative\",\n width: \"2.25rem\",\n height: \"2.25rem\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n borderRadius: \"9999px\",\n transition: \"all 0.2s ease-out\",\n backgroundColor: \"hsl(var(--tw-muted) / 0.5)\",\n color: colors.mutedForeground,\n border: \"none\",\n cursor: \"pointer\",\n outline: \"none\",\n ...style,\n }}\n aria-label={isDark ? \"Switch to light mode\" : \"Switch to dark mode\"}\n title={isDark ? \"Switch to light mode\" : \"Switch to dark mode\"}\n >\n {/* Sun icon (visible in dark mode) */}\n <svg\n style={{\n position: \"absolute\",\n width: \"1.25rem\",\n height: \"1.25rem\",\n transition: \"all 0.3s ease-out\",\n ...(isDark\n ? { opacity: 1, transform: \"rotate(0deg) scale(1)\" }\n : { opacity: 0, transform: \"rotate(90deg) scale(0.5)\" }),\n }}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth={2}\n aria-hidden=\"true\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M12 3v1m0 16v1m9-9h-1M4 12H3m15.364 6.364l-.707-.707M6.343 6.343l-.707-.707m12.728 0l-.707.707M6.343 17.657l-.707.707M16 12a4 4 0 11-8 0 4 4 0 018 0z\"\n />\n </svg>\n\n {/* Moon icon (visible in light mode) */}\n <svg\n style={{\n position: \"absolute\",\n width: \"1.25rem\",\n height: \"1.25rem\",\n transition: \"all 0.3s ease-out\",\n ...(isDark\n ? { opacity: 0, transform: \"rotate(-90deg) scale(0.5)\" }\n : { opacity: 1, transform: \"rotate(0deg) scale(1)\" }),\n }}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth={2}\n aria-hidden=\"true\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M20.354 15.354A9 9 0 018.646 3.646 9.003 9.003 0 0012 21a9.003 9.003 0 008.354-5.646z\"\n />\n </svg>\n </button>\n );\n}\n\nexport default ThemeToggle;\n","import React, { useEffect, useState, useCallback } from \"react\";\nimport {\n colors,\n spacing,\n fontSize,\n fontWeight,\n shadows,\n borderRadius,\n} from \"../styles\";\n\nexport interface ToastData {\n id: string;\n title: string;\n description?: string;\n variant?: \"default\" | \"destructive\" | \"success\";\n duration?: number;\n}\n\ninterface ToastProps extends ToastData {\n onDismiss: (id: string) => void;\n}\n\nconst variantStyles: Record<\n ToastData[\"variant\"] & string,\n React.CSSProperties\n> = {\n default: {\n border: `1px solid ${colors.border}`,\n backgroundColor: colors.card,\n color: colors.foreground,\n },\n destructive: {\n border: \"1px solid rgba(239, 68, 68, 0.5)\",\n // backgroundColor: \"rgba(239, 68, 68, 0.1)\",\n backgroundColor: \"rgba(239, 68, 68, 0.88)\",\n // color: colors.red[600],\n fontWeight: fontWeight.semibold,\n color: colors.white,\n },\n success: {\n border: \"1px solid rgba(34, 197, 94, 0.5)\",\n backgroundColor: \"rgba(34, 197, 94, 0.1)\",\n color: colors.green[600],\n },\n};\n\n/**\n * Individual Toast notification component\n */\nfunction ToastItem({\n id,\n title,\n description,\n variant = \"default\",\n duration = 4000,\n onDismiss,\n}: ToastProps): React.ReactElement {\n const [isExiting, setIsExiting] = useState(false);\n\n useEffect(() => {\n const timer = setTimeout(() => {\n setIsExiting(true);\n }, duration);\n\n return () => clearTimeout(timer);\n }, [duration]);\n\n useEffect(() => {\n if (isExiting) {\n const exitTimer = setTimeout(() => {\n onDismiss(id);\n }, 200); // Animation duration\n return () => clearTimeout(exitTimer);\n }\n }, [isExiting, id, onDismiss]);\n\n const handleDismiss = () => {\n setIsExiting(true);\n };\n\n return (\n <div\n role=\"alert\"\n aria-live=\"assertive\"\n style={{\n pointerEvents: \"auto\",\n position: \"relative\",\n display: \"flex\",\n width: \"100%\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n gap: spacing[3],\n overflow: \"hidden\",\n borderRadius: borderRadius.lg,\n padding: spacing[4],\n boxShadow: shadows.lg,\n transition: \"all 0.2s ease-out\",\n ...(variantStyles[variant] || variantStyles.default),\n ...(isExiting\n ? { opacity: 0, transform: \"translateX(1rem)\" }\n : { opacity: 1, transform: \"translateX(0)\" }),\n }}\n >\n {/* Icon based on variant */}\n <div\n style={{\n flexShrink: 0,\n }}\n >\n {variant === \"destructive\" && (\n <svg\n style={{\n width: \"1.25rem\",\n height: \"1.25rem\",\n }}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n )}\n {variant === \"success\" && (\n <svg\n style={{\n width: \"1.25rem\",\n height: \"1.25rem\",\n }}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M5 13l4 4L19 7\"\n />\n </svg>\n )}\n {variant === \"default\" && (\n <svg\n style={{\n width: \"1.25rem\",\n height: \"1.25rem\",\n }}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n )}\n </div>\n\n {/* Content */}\n <div\n style={{\n flex: 1,\n minWidth: 0,\n }}\n >\n <p\n style={{\n fontSize: fontSize.sm,\n fontWeight: fontWeight.semibold,\n margin: 0,\n }}\n >\n {title}\n </p>\n {description && (\n <p\n style={{\n fontSize: fontSize.sm,\n opacity: 0.8,\n marginTop: spacing[0.5],\n margin: 0,\n }}\n >\n {description}\n </p>\n )}\n </div>\n\n {/* Close button */}\n <button\n onClick={handleDismiss}\n style={{\n flexShrink: 0,\n borderRadius: \"0.375rem\",\n padding: spacing[1],\n opacity: 0.7,\n transition: \"opacity 0.2s\",\n background: \"none\",\n border: \"none\",\n cursor: \"pointer\",\n color: \"inherit\",\n }}\n aria-label=\"Dismiss\"\n >\n <svg\n style={{\n width: \"1rem\",\n height: \"1rem\",\n }}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n </button>\n </div>\n );\n}\n\n// Global toast state management\ntype ToastListener = (toasts: ToastData[]) => void;\nconst listeners: ToastListener[] = [];\nlet toasts: ToastData[] = [];\nlet toastId = 0;\n\nfunction notifyListeners() {\n listeners.forEach((listener) => listener([...toasts]));\n}\n\n/**\n * Show a toast notification\n */\nexport function toast(data: Omit<ToastData, \"id\"> | string): {\n dismiss: () => void;\n} {\n const id = String(++toastId);\n const toastData: ToastData =\n typeof data === \"string\" ? { id, title: data } : { ...data, id };\n\n toasts = [toastData, ...toasts].slice(0, 3); // Limit to 3 toasts\n notifyListeners();\n\n return {\n dismiss: () => {\n toasts = toasts.filter((t) => t.id !== id);\n notifyListeners();\n },\n };\n}\n\n/**\n * Convenience methods for common toast types\n */\ntoast.error = (title: string, description?: string) =>\n toast({ title, description, variant: \"destructive\" });\n\ntoast.success = (title: string, description?: string) =>\n toast({ title, description, variant: \"success\" });\n\n/**\n * ToastContainer - Renders all active toasts\n * Must be included in your component tree (typically in WidgetContainer)\n */\nexport function ToastContainer(): React.ReactElement | null {\n const [activeToasts, setActiveToasts] = useState<ToastData[]>([]);\n\n useEffect(() => {\n const listener: ToastListener = (newToasts) => {\n setActiveToasts(newToasts);\n };\n listeners.push(listener);\n return () => {\n const index = listeners.indexOf(listener);\n if (index > -1) {\n listeners.splice(index, 1);\n }\n };\n }, []);\n\n const handleDismiss = useCallback((id: string) => {\n toasts = toasts.filter((t) => t.id !== id);\n notifyListeners();\n }, []);\n\n if (activeToasts.length === 0) {\n return null;\n }\n\n return (\n <div\n style={{\n position: \"fixed\",\n bottom: spacing[4],\n left: \"50%\",\n transform: \"translateX(-50%)\",\n zIndex: 50,\n display: \"flex\",\n flexDirection: \"column\",\n gap: spacing[2],\n width: \"100%\",\n maxWidth: \"380px\",\n padding: `0 ${spacing[4]}`,\n pointerEvents: \"none\",\n }}\n >\n {activeToasts.map((toastData) => (\n <ToastItem\n key={toastData.id}\n {...toastData}\n onDismiss={handleDismiss}\n />\n ))}\n </div>\n );\n}\n\nexport default ToastContainer;\n","import React, {\n useState,\n useRef,\n useCallback,\n useEffect,\n useMemo,\n} from \"react\";\nimport { colors, spacing, fontSize, fontWeight, borderRadius } from \"../styles\";\nimport type { Token, Chain, YourTokenData } from \"../context/DepositContext\";\n\nexport interface TokenSwipePillProps {\n /** List of tokens to display in the carousel */\n tokens: Token[] | YourTokenData[];\n /** Currently selected token */\n selectedToken: Token | YourTokenData;\n /** Callback when a token is selected */\n onTokenChange: (token: Token | YourTokenData) => void;\n /** Callback when expand/dropdown button is clicked */\n onExpandClick?: () => void;\n /** Currently selected chain (for displaying chain info) */\n selectedChain?: Chain | null;\n /** Connected wallet address (optional, for display) */\n walletAddress?: string | null;\n /** Additional inline styles */\n style?: React.CSSProperties;\n}\n\n/**\n * Max number of pagination dots to show\n * When there are more tokens, we show a subset with ellipsis-like behavior\n */\nconst MAX_VISIBLE_DOTS = 5;\n\n/**\n * Horizontal carousel component for quickly switching between tokens.\n * Supports swipe/drag gestures to navigate between tokens.\n * Displays token icons with pagination dots below.\n */\nexport function TokenSwipePill({\n tokens,\n selectedToken,\n onTokenChange,\n onExpandClick,\n // selectedChain,\n walletAddress,\n style,\n}: TokenSwipePillProps): React.ReactElement | null {\n const [isDragging, setIsDragging] = useState(false);\n const [dragOffset, setDragOffset] = useState(0);\n const startXRef = useRef(0);\n const containerRef = useRef<HTMLDivElement>(null);\n\n // Find current index in tokens array\n const currentIndex = tokens.findIndex(\n (t) =>\n t.address === selectedToken.address && t.symbol === selectedToken.symbol\n );\n\n const swipeThreshold = 30;\n const hasMultipleTokens = tokens.length > 1;\n\n /**\n * Calculate position for continuous carousel effect\n */\n const getPosition = (index: number) => {\n const offset = index - currentIndex;\n const total = tokens.length;\n let pos = ((offset % total) + total) % total;\n if (pos > Math.floor(total / 2)) {\n pos = pos - total;\n }\n return pos;\n };\n\n /**\n * Start drag interaction\n */\n const handleDragStart = useCallback((clientX: number) => {\n setIsDragging(true);\n startXRef.current = clientX;\n }, []);\n\n /**\n * Handle drag movement\n */\n const handleDragMove = useCallback(\n (clientX: number) => {\n if (!isDragging) return;\n const delta = startXRef.current - clientX;\n setDragOffset(delta);\n },\n [isDragging]\n );\n\n /**\n * End drag and determine if token should change\n */\n const handleDragEnd = useCallback(() => {\n if (!isDragging) return;\n setIsDragging(false);\n\n if (Math.abs(dragOffset) > swipeThreshold) {\n // Swipe left (positive delta) = next token, swipe right (negative delta) = prev token\n const direction = dragOffset > 0 ? 1 : -1;\n const newIndex =\n (currentIndex + direction + tokens.length) % tokens.length;\n\n onTokenChange(tokens[newIndex]);\n if (navigator.vibrate) {\n navigator.vibrate(10);\n }\n }\n\n setDragOffset(0);\n }, [isDragging, dragOffset, currentIndex, tokens, onTokenChange]);\n\n // Mouse events\n const handleMouseDown = (e: React.MouseEvent) => {\n if (!hasMultipleTokens) return;\n e.preventDefault();\n handleDragStart(e.clientX);\n };\n\n const handleMouseMove = useCallback(\n (e: MouseEvent) => {\n handleDragMove(e.clientX);\n },\n [handleDragMove]\n );\n\n const handleMouseUp = useCallback(() => {\n handleDragEnd();\n }, [handleDragEnd]);\n\n // Touch events\n const handleTouchStart = (e: React.TouchEvent) => {\n if (!hasMultipleTokens) return;\n handleDragStart(e.touches[0].clientX);\n };\n\n const handleTouchMove = (e: React.TouchEvent) => {\n if (!hasMultipleTokens) return;\n handleDragMove(e.touches[0].clientX);\n };\n\n const handleTouchEnd = () => {\n handleDragEnd();\n };\n\n // Add/remove global mouse listeners for drag tracking\n useEffect(() => {\n if (isDragging) {\n window.addEventListener(\"mousemove\", handleMouseMove);\n window.addEventListener(\"mouseup\", handleMouseUp);\n return () => {\n window.removeEventListener(\"mousemove\", handleMouseMove);\n window.removeEventListener(\"mouseup\", handleMouseUp);\n };\n }\n }, [isDragging, handleMouseMove, handleMouseUp]);\n\n // Clamp drag offset for visual effect (limit visual range)\n const visualOffset = Math.max(-40, Math.min(40, dragOffset * 0.5));\n\n /**\n * Generate fallback initials from token symbol\n */\n const getTokenInitials = (symbol: string) => {\n return symbol?.slice(0, 2).toUpperCase();\n };\n\n const chainBadge = useMemo(() => {\n const url =\n (selectedToken as YourTokenData).chainData?.chainIconURI ||\n (\n (selectedToken as YourTokenData)\n .chainData as YourTokenData[\"chainData\"] & {\n iconUrl: string;\n }\n )?.iconUrl;\n return url?.toString();\n }, [selectedToken]);\n\n // Don't render if no tokens\n if (tokens.length === 0) {\n return null;\n }\n\n function validateIconUrl(url: string | undefined, isCenter: boolean) {\n if (url === undefined) return \"\";\n if (!isCenter) return url;\n if (url !== (selectedToken.iconUrl ?? selectedToken.logoURI)) {\n return selectedToken.iconUrl ?? selectedToken.logoURI ?? \"\";\n }\n return url;\n }\n\n return (\n <div\n ref={containerRef}\n style={{\n position: \"relative\",\n display: \"inline-flex\",\n alignItems: \"flex-start\",\n gap: spacing[2],\n padding: `${spacing[1.5]} ${spacing[4]}`,\n\n backgroundColor: colors.background,\n borderRadius: borderRadius.full,\n border: `1px solid ${colors.border}`,\n userSelect: \"none\",\n touchAction: \"none\",\n ...(hasMultipleTokens && { cursor: \"grab\" }),\n ...(isDragging && { backgroundColor: colors.background }),\n ...style,\n }}\n onMouseDown={handleMouseDown}\n onTouchStart={handleTouchStart}\n onTouchMove={handleTouchMove}\n onTouchEnd={handleTouchEnd}\n >\n {/* Left Section: Carousel + Dots + Wallet Indicator */}\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n height: \"3rem\",\n }}\n >\n {/* Left Chevron Arrow */}\n {hasMultipleTokens && (\n <svg\n style={{\n width: \"1rem\",\n height: \"1rem\",\n color: colors.zinc[500],\n }}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M15 19l-7-7 7-7\"\n />\n </svg>\n )}\n\n {/* Carousel Container */}\n <div\n style={{\n position: \"relative\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n height: \"3rem\",\n width: \"5rem\",\n overflow: \"hidden\",\n }}\n >\n {/* Tokens in carousel */}\n {tokens.map((token, index) => {\n const pos = getPosition(index);\n const isCenter = pos === 0;\n const isVisible = Math.abs(pos) <= 1;\n\n if (!isVisible) return null;\n\n // Calculate transform based on position + drag offset\n const baseOffset = pos * 32;\n const currentOffset = baseOffset - visualOffset;\n const scale = isCenter ? 1 : 0.6;\n const opacity = isCenter ? 1 : 0.5;\n const blur = isCenter ? 0 : 1;\n const zIndexVal = isCenter ? 10 : 5;\n\n return (\n <div\n key={`carousel-${index}-${token.address}`}\n style={{\n position: \"absolute\",\n transition: isDragging ? \"all 75ms\" : \"all 200ms ease-out\",\n transform: `translateX(${currentOffset}px) scale(${scale})`,\n opacity,\n filter: `blur(${blur}px)`,\n zIndex: zIndexVal,\n }}\n >\n <div style={{ position: \"relative\" }}>\n <div\n style={{\n width: \"2.5rem\",\n height: \"2.5rem\",\n overflow: \"hidden\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n {validateIconUrl(token.iconUrl, isCenter) ? (\n <img\n src={validateIconUrl(token.iconUrl, isCenter)}\n alt={token.symbol}\n style={{\n width: \"2rem\",\n height: \"2rem\",\n objectFit: \"contain\",\n }}\n />\n ) : (\n <span\n style={{\n fontSize: fontSize.xs,\n fontWeight: fontWeight.bold,\n color: colors.zinc[800],\n }}\n >\n {getTokenInitials(token.symbol as string)}\n </span>\n )}\n </div>\n {/* Chain Icon - only on center token */}\n\n {isCenter && (selectedToken as YourTokenData).chainData && (\n <div\n style={{\n position: \"absolute\",\n bottom: \"1px\",\n right: \"-2px\",\n width: \"1rem\",\n height: \"1rem\",\n borderRadius: \"9999px\",\n\n backgroundColor: \"none\",\n border: `none`,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n overflow: \"hidden\",\n }}\n >\n <img\n src={chainBadge}\n alt={\n (selectedToken as YourTokenData).chainData\n ?.networkName\n }\n style={{\n width: \"0.75rem\",\n height: \"0.75rem\",\n borderRadius: \"9999px\",\n objectFit: \"cover\",\n }}\n />\n </div>\n )}\n </div>\n </div>\n );\n })}\n </div>\n\n {/* Right Chevron Arrow */}\n {hasMultipleTokens && (\n <svg\n style={{\n width: \"1rem\",\n height: \"1rem\",\n color: colors.zinc[500],\n }}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M9 5l7 7-7 7\"\n />\n </svg>\n )}\n </div>\n\n {/* Pagination Dots - directly under carousel */}\n {hasMultipleTokens && (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: spacing[1],\n marginTop: spacing[1],\n }}\n >\n {(() => {\n const total = tokens.length;\n\n // If we have few tokens, show all dots\n if (total <= MAX_VISIBLE_DOTS) {\n return tokens.map((token, index) => (\n <div\n key={`dot-${index}-${token.address}`}\n onClick={(e) => {\n e.stopPropagation();\n onTokenChange(token);\n }}\n style={{\n height: \"0.313rem\",\n borderRadius: \"3.125rem\",\n transition: \"all 0.2s\",\n border: 0,\n outline: \"none\",\n cursor: \"pointer\",\n backgroundColor:\n index === currentIndex\n ? colors.zinc[300]\n : colors.zinc[600],\n width: index === currentIndex ? \"0.938rem\" : \"0.938rem\",\n }}\n aria-label={`Select ${token.symbol}`}\n />\n ));\n }\n\n // For many tokens, show limited dots with scaling effect\n // Show: first, prev, current, next, last (when applicable)\n const visibleIndices: number[] = [];\n\n // Always show first\n visibleIndices.push(0);\n\n // Show dots around current\n if (currentIndex > 1) {\n visibleIndices.push(currentIndex - 1);\n }\n if (currentIndex > 0 && currentIndex < total - 1) {\n visibleIndices.push(currentIndex);\n }\n if (currentIndex < total - 2) {\n visibleIndices.push(currentIndex + 1);\n }\n\n // Always show last\n if (total > 1) {\n visibleIndices.push(total - 1);\n }\n\n // Dedupe and sort\n const uniqueIndices = [...new Set(visibleIndices)].sort(\n (a, b) => a - b\n );\n\n return uniqueIndices.map((index, i) => {\n const token = tokens[index];\n const prevIndex = uniqueIndices[i - 1];\n const showGap = i > 0 && index - prevIndex > 1;\n\n return (\n <React.Fragment key={`dot-${index}-${token.address}`}>\n {/* Gap indicator for skipped tokens */}\n {showGap && (\n <span\n style={{\n width: \"0.25rem\",\n height: \"0.25rem\",\n borderRadius: \"9999px\",\n backgroundColor: colors.zinc[700],\n }}\n />\n )}\n <div\n onClick={(e) => {\n e.stopPropagation();\n onTokenChange(token);\n }}\n style={{\n height: \"0.313rem\",\n borderRadius: \"3.125rem\",\n transition: \"all 0.2s\",\n border: 0,\n outline: \"none\",\n cursor: \"pointer\",\n backgroundColor:\n index === currentIndex\n ? colors.zinc[300]\n : colors.zinc[600],\n width: index === currentIndex ? \"0.938rem\" : \"0.938rem\",\n }}\n aria-label={`Select ${token.symbol} (${index + 1} of ${total})`}\n />\n </React.Fragment>\n );\n });\n })()}\n </div>\n )}\n\n {/* Wallet indicator - minimal */}\n {hasMultipleTokens && walletAddress && (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: spacing[1],\n marginTop: spacing[1],\n }}\n >\n {/* Wallet icon */}\n <svg\n style={{\n width: \"0.75rem\",\n height: \"0.75rem\",\n color: colors.zinc[500],\n }}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M3 10h18M7 15h1m4 0h1m-7 4h12a3 3 0 003-3V8a3 3 0 00-3-3H6a3 3 0 00-3 3v8a3 3 0 003 3z\"\n />\n </svg>\n <span\n style={{\n fontSize: \"10px\",\n color: colors.zinc[500],\n }}\n >\n {walletAddress.slice(0, 6)}...{walletAddress.slice(-4)}\n </span>\n </div>\n )}\n </div>\n\n {/* Divider */}\n <div\n style={{\n width: \"1px\",\n height: \"2rem\",\n backgroundColor: \"rgba(63, 63, 70, 0.5)\",\n alignSelf: \"center\",\n }}\n />\n\n {/* Token Info with Expand Button */}\n <button\n type=\"button\"\n style={{\n alignSelf: \"center\",\n textAlign: \"left\",\n display: \"flex\",\n alignItems: \"center\",\n gap: spacing[2],\n borderRadius: \"0.5rem\",\n padding: `${spacing[1]} ${spacing[2]}`,\n margin: `0 -${spacing[1]}`,\n transition: \"background-color 0.2s\",\n border: 0,\n outline: \"none\",\n cursor: \"pointer\",\n backgroundColor: \"transparent\",\n }}\n onClick={(e) => {\n e.stopPropagation();\n onExpandClick?.();\n }}\n >\n <div>\n <p\n style={{\n fontWeight: fontWeight.semibold,\n color: colors.foreground,\n fontSize: fontSize.sm,\n lineHeight: 1.25,\n margin: 0,\n }}\n >\n {selectedToken.symbol}\n </p>\n {(selectedToken as YourTokenData).chainData && (\n <p\n style={{\n fontSize: fontSize.xs,\n color: colors.zinc[400],\n lineHeight: 1.25,\n margin: 0,\n }}\n >\n {(selectedToken as YourTokenData)?.chainData?.networkName ||\n ((selectedToken as YourTokenData)?.chainData as Chain)?.name}\n </p>\n )}\n </div>\n {/* Chevron Down icon */}\n <svg\n style={{\n width: \"1rem\",\n height: \"1rem\",\n color: colors.zinc[400],\n }}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M19 9l-7 7-7-7\"\n />\n </svg>\n </button>\n </div>\n );\n}\n\nexport default TokenSwipePill;\n","import React, { useMemo } from \"react\";\nimport { colors, spacing, fontSize, fontWeight } from \"../styles\";\nimport type { TransactionStatus } from \"../context/DepositContext\";\n\n/**\n * Step configuration for the transaction progress display\n */\nexport interface Step {\n /** Step display label */\n label: string;\n /** Optional icon URL for the step */\n icon?: string;\n /** Step status */\n status: \"pending\" | \"active\" | \"complete\";\n}\n\nexport interface TransactionStepsProps {\n /** Current transaction status from context */\n transactionStatus: TransactionStatus;\n /** Additional inline styles */\n style?: React.CSSProperties;\n /** Custom step labels (optional) */\n stepLabels?: {\n confirming?: string;\n processing?: string;\n bridging?: string;\n complete?: string;\n };\n}\n\n/**\n * Default step labels\n */\nconst DEFAULT_LABELS = {\n confirming: \"Confirming in wallet\",\n processing: \"Processing on network\",\n bridging: \"Bridging to destination\",\n complete: \"Complete\",\n};\n\n/**\n * Generates steps array based on current transaction status\n */\nfunction getSteps(\n status: TransactionStatus,\n labels: typeof DEFAULT_LABELS\n): Step[] {\n const statusOrder: TransactionStatus[] = [\n \"confirming\",\n \"processing\",\n \"bridging\",\n \"success\",\n ];\n const currentIndex = statusOrder.indexOf(status);\n\n return [\n {\n label: labels.confirming,\n status:\n currentIndex > 0\n ? \"complete\"\n : currentIndex === 0\n ? \"active\"\n : \"pending\",\n },\n {\n label: labels.processing,\n status:\n currentIndex > 1\n ? \"complete\"\n : currentIndex === 1\n ? \"active\"\n : \"pending\",\n },\n {\n label: labels.bridging,\n status:\n currentIndex > 2\n ? \"complete\"\n : currentIndex === 2\n ? \"active\"\n : \"pending\",\n },\n {\n label: labels.complete,\n status:\n currentIndex >= 3\n ? \"complete\"\n : currentIndex === 3\n ? \"active\"\n : \"pending\",\n },\n ];\n}\n\n/**\n * TransactionSteps component.\n * Displays a vertical list of transaction steps with visual status indicators.\n * Shows checkmark for completed steps, spinner for active step, and number for pending steps.\n */\nexport function TransactionSteps({\n transactionStatus,\n style,\n stepLabels,\n}: TransactionStepsProps): React.ReactElement {\n // Merge custom labels with defaults\n const labels = useMemo(\n () => ({\n ...DEFAULT_LABELS,\n ...stepLabels,\n }),\n [stepLabels]\n );\n\n // Generate steps based on current status\n const steps = useMemo(\n () => getSteps(transactionStatus, labels),\n [transactionStatus, labels]\n );\n\n return (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: spacing[3],\n ...style,\n }}\n >\n {steps.map((step, index) => {\n return (\n <div\n key={index}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: spacing[3],\n }}\n >\n {/* Step indicator */}\n <div\n style={{\n width: \"2rem\",\n height: \"2rem\",\n borderRadius: \"9999px\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n transition: \"all 0.2s\",\n flexShrink: 0,\n ...(step.status === \"complete\" && {\n backgroundColor: colors.green[500],\n color: colors.white,\n }),\n ...(step.status === \"active\" && {\n backgroundColor: colors.primary,\n color: colors.primaryForeground,\n }),\n ...(step.status === \"pending\" && {\n backgroundColor: colors.muted,\n color: colors.mutedForeground,\n }),\n }}\n >\n {step.status === \"complete\" ? (\n <svg\n style={{\n width: \"1rem\",\n height: \"1rem\",\n }}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={3}\n aria-hidden=\"true\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M5 13l4 4L19 7\"\n />\n </svg>\n ) : step.status === \"active\" ? (\n <svg\n style={{\n width: \"1rem\",\n height: \"1rem\",\n animation: \"tw-spin 1s linear infinite\",\n }}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <circle\n style={{ opacity: 0.25 }}\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n />\n <path\n style={{ opacity: 0.75 }}\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z\"\n />\n </svg>\n ) : (\n <span\n style={{\n fontSize: fontSize.xs,\n fontWeight: fontWeight.medium,\n }}\n >\n {index + 1}\n </span>\n )}\n </div>\n\n {/* Step icon (optional) */}\n {step.icon && (\n <div\n style={{\n width: \"1.5rem\",\n height: \"1.5rem\",\n borderRadius: \"9999px\",\n overflow: \"hidden\",\n flexShrink: 0,\n }}\n >\n <img\n src={step.icon}\n alt=\"\"\n style={{\n width: \"100%\",\n height: \"100%\",\n objectFit: \"contain\",\n }}\n />\n </div>\n )}\n\n {/* Step label */}\n <span\n style={{\n fontSize: fontSize.sm,\n fontWeight: fontWeight.medium,\n ...(step.status === \"pending\"\n ? { color: colors.mutedForeground }\n : { color: colors.foreground }),\n }}\n >\n {step.label}\n </span>\n </div>\n );\n })}\n </div>\n );\n}\n\nexport default TransactionSteps;\n","import React, { useEffect, useState } from \"react\";\nimport { ToastContainer } from \"./Toast\";\nimport { ALL_THEME_STYLES, ALL_ANIMATION_STYLES } from \"../styles\";\nimport { colors, shadows } from \"../styles\";\n\nexport type Theme = \"light\" | \"dark\" | \"system\";\n\nexport interface WidgetContainerProps {\n children: React.ReactNode;\n theme?: Theme;\n className?: string;\n style?: React.CSSProperties;\n}\n\n/**\n * Combined styles for injection - only injected once\n */\nconst INJECTED_STYLES = ALL_THEME_STYLES + ALL_ANIMATION_STYLES;\n\n/**\n * Responsive container component that wraps the widget and handles embedding concerns.\n * - Max-width of 420px suitable for embedding\n * - Theme support: light, dark, or system preference\n * - Scrollable when content exceeds height\n * - Injects all necessary CSS for theming and animations\n */\nexport function WidgetContainer({\n children,\n theme = \"system\",\n className,\n style,\n}: WidgetContainerProps): React.ReactElement {\n const [resolvedTheme, setResolvedTheme] = useState<\"light\" | \"dark\">(\"light\");\n\n /* eslint-disable react-hooks/set-state-in-effect -- syncing theme prop with system preference requires setState in effect */\n useEffect(() => {\n if (theme === \"system\") {\n // Check system preference\n const mediaQuery = window.matchMedia(\"(prefers-color-scheme: dark)\");\n setResolvedTheme(mediaQuery.matches ? \"dark\" : \"light\");\n\n // Listen for changes\n const handler = (e: MediaQueryListEvent) => {\n setResolvedTheme(e.matches ? \"dark\" : \"light\");\n };\n mediaQuery.addEventListener(\"change\", handler);\n return () => mediaQuery.removeEventListener(\"change\", handler);\n } else {\n setResolvedTheme(theme);\n }\n }, [theme]);\n /* eslint-enable react-hooks/set-state-in-effect */\n\n return (\n <>\n {/* Inject all required CSS once */}\n <style>{INJECTED_STYLES}</style>\n <div\n className={`trustware-widget tw-scrollbar-none ${className || \"\"}`.trim()}\n data-theme={resolvedTheme}\n style={{\n maxWidth: \"420px\",\n width: \"100%\",\n overflow: \"visible\",\n backgroundColor: colors.card,\n color: colors.foreground,\n borderRadius: \"20px\",\n boxShadow: shadows.large,\n border: `1px solid ${colors.border}`,\n fontFamily:\n \"-apple-system, BlinkMacSystemFont, 'SF Pro Display', 'SF Pro Text', 'Helvetica Neue', sans-serif\",\n position: \"relative\",\n WebkitFontSmoothing: \"antialiased\",\n MozOsxFontSmoothing: \"grayscale\",\n ...style,\n }}\n >\n {children}\n <ToastContainer />\n </div>\n </>\n );\n}\n\nexport default WidgetContainer;\n","import React from \"react\";\nimport { colors, spacing, borderRadius } from \"../../styles/tokens\";\n\nexport interface LoadingSkeletonProps {\n style?: React.CSSProperties;\n}\n\nconst containerStyle: React.CSSProperties = {\n display: \"flex\",\n flexDirection: \"column\",\n gap: spacing[4],\n padding: `${spacing[6]} ${spacing[6]}`,\n width: \"100%\",\n};\n\nconst rowStyle: React.CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n gap: spacing[3],\n};\n\nconst circleStyle: React.CSSProperties = {\n width: \"2.25rem\",\n height: \"2.25rem\",\n borderRadius: \"9999px\",\n backgroundColor: colors.muted,\n flexShrink: 0,\n};\n\nconst lineBaseStyle: React.CSSProperties = {\n height: \"0.75rem\",\n backgroundColor: colors.muted,\n borderRadius: borderRadius.md,\n};\n\nconst lineLgStyle: React.CSSProperties = {\n ...lineBaseStyle,\n width: \"70%\",\n};\n\nconst lineSmStyle: React.CSSProperties = {\n ...lineBaseStyle,\n width: \"45%\",\n};\n\nexport function LoadingSkeleton({\n style,\n}: LoadingSkeletonProps): React.ReactElement {\n return (\n <div style={{ ...containerStyle, ...style }}>\n {[0, 1, 2].map((i) => (\n <div key={i} style={rowStyle}>\n <div style={circleStyle} className=\"tw-animate-pulse\" />\n <div style={{ flex: 1 }}>\n <div style={lineLgStyle} className=\"tw-animate-pulse\" />\n <div\n style={{ ...lineSmStyle, marginTop: spacing[2] }}\n className=\"tw-animate-pulse\"\n />\n </div>\n </div>\n ))}\n </div>\n );\n}\n\nexport default LoadingSkeleton;\n","import React, { useState, useRef, useEffect } from \"react\";\nimport {\n colors,\n spacing,\n fontSize,\n fontWeight,\n borderRadius,\n shadows,\n} from \"../styles\";\nimport { useDeposit } from \"../context/DepositContext\";\nimport {\n clampUsdAmount,\n sanitizeAmountInput,\n useAmountConstraints,\n} from \"../hooks\";\nimport { useWalletDetection } from \"../../wallets/detect\";\nimport { UniversalConnector } from \"@reown/appkit-universal-connector\";\nimport { getUniversalConnector } from \"src/config/walletconnect\";\n/**\n * Fiat payment option definition\n */\ninterface FiatOption {\n id: string;\n name: string;\n icon: React.ReactNode;\n}\n\n/**\n * Available fiat payment options (all coming soon)\n */\nconst fiatOptions: FiatOption[] = [\n {\n id: \"applepay\",\n name: \"Apple Pay\",\n icon: (\n <svg\n style={{\n width: \"2rem\",\n height: \"1.25rem\",\n }}\n viewBox=\"0 0 50 20\"\n fill=\"currentColor\"\n >\n <path d=\"M9.6 4.8c-.6.7-1.5 1.3-2.4 1.2-.1-.9.3-1.9.9-2.5.6-.7 1.6-1.2 2.4-1.2.1 1-.3 1.9-.9 2.5zm.9 1.3c-1.3-.1-2.5.8-3.1.8-.6 0-1.6-.7-2.7-.7-1.4 0-2.6.8-3.4 2-.7 1.2-.5 3.5.6 5.5.5.9 1.2 1.9 2.1 1.9.8 0 1.2-.5 2.3-.5s1.4.5 2.4.5c.9 0 1.5-.9 2-1.8.4-.6.5-1.2.7-1.8-1.6-.6-2-2.6-1.4-4-.4-.5-1-1.3-1.5-1.9z\" />\n <path d=\"M18.4 2.1c2.3 0 4 1.6 4 3.9s-1.7 3.9-4.1 3.9h-2.6v4h-1.8V2.1h4.5zm-2.7 6.2h2.2c1.6 0 2.5-.9 2.5-2.4s-.9-2.4-2.5-2.4h-2.2v4.8zm6.4 3.2c0-1.5 1.2-2.5 3.3-2.6l2.4-.1v-.7c0-1-.7-1.6-1.8-1.6-1 0-1.7.5-1.8 1.3h-1.6c.1-1.5 1.4-2.7 3.5-2.7 2.1 0 3.4 1.1 3.4 2.9v6h-1.6v-1.4c-.5 1-1.5 1.6-2.7 1.6-1.7 0-2.9-1-2.9-2.7h-.2zm5.7-.8v-.7l-2.2.1c-1.1.1-1.8.6-1.8 1.4 0 .8.6 1.3 1.6 1.3 1.3 0 2.4-.9 2.4-2.1zm3.2 5.8v-1.4c.1 0 .5.1.7.1 1 0 1.5-.4 1.8-1.5l.2-.6-3.1-8.6h1.9l2.2 6.9 2.2-6.9h1.8l-3.2 9c-.7 2-1.5 2.7-3.3 2.7-.2 0-.6 0-.8-.1l-.4.4z\" />\n </svg>\n ),\n },\n {\n id: \"mpesa\",\n name: \"M-Pesa\",\n icon: (\n <svg\n style={{\n width: \"2rem\",\n height: \"1.25rem\",\n }}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n >\n <path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-1 17.93c-3.95-.49-7-3.85-7-7.93 0-.62.08-1.21.21-1.79L9 15v1c0 1.1.9 2 2 2v1.93zm6.9-2.54c-.26-.81-1-1.39-1.9-1.39h-1v-3c0-.55-.45-1-1-1H8v-2h2c.55 0 1-.45 1-1V7h2c1.1 0 2-.9 2-2v-.41c2.93 1.19 5 4.06 5 7.41 0 2.08-.8 3.97-2.1 5.39z\" />\n </svg>\n ),\n },\n {\n id: \"venmo\",\n name: \"Venmo\",\n icon: (\n <svg\n style={{\n width: \"2rem\",\n height: \"1.25rem\",\n }}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n >\n <path d=\"M19.5 3h-15C3.12 3 2 4.12 2 5.5v13C2 19.88 3.12 21 4.5 21h15c1.38 0 2.5-1.12 2.5-2.5v-13C22 4.12 20.88 3 19.5 3zm-4.77 11.58c-.64 1.56-2.13 3.42-3.86 3.42H8.69l-.61-3.55 1.13-.21.28 1.64c.25.14.52.22.79.22.68 0 1.31-.48 1.74-1.34.33-.67.44-1.34.44-1.92 0-.45-.11-.82-.38-1.06-.24-.22-.58-.33-.98-.33-.64 0-1.29.28-1.86.61l-.05-.02.61-4.04h4.13l-.16 1.11H11l-.21 1.4c.41-.13.85-.19 1.28-.19.71 0 1.31.2 1.73.61.46.44.67 1.08.67 1.88 0 .68-.15 1.35-.48 2.01z\" />\n </svg>\n ),\n },\n {\n id: \"zelle\",\n name: \"Zelle\",\n icon: (\n <svg\n style={{\n width: \"2rem\",\n height: \"1.25rem\",\n }}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n >\n <path d=\"M13.25 4H5.5C4.67 4 4 4.67 4 5.5v13c0 .83.67 1.5 1.5 1.5h13c.83 0 1.5-.67 1.5-1.5v-7.75h-2v6.25H6V7h7.25V4zm3.91 2.83L9.83 14.17l-1.42-1.41 7.33-7.34L13.83 3.5h6.67v6.67l-1.92-1.92-1.42-1.42z\" />\n </svg>\n ),\n },\n];\n\nexport interface HomeProps {\n /** Additional inline styles */\n style?: React.CSSProperties;\n}\n\nconst dropdownWrapperStyle: React.CSSProperties = {\n position: \"relative\",\n height: \"2.75rem\", // Fixed height to match button, prevents layout shift\n};\n\nconst dropdownWrapperOpenStyle: React.CSSProperties = {\n position: \"relative\",\n height: \"2.75rem\",\n zIndex: 100, // Higher z-index when open to overlay other elements\n};\n/**\n * Home page for the deposit widget.\n * Displays a large amount input and dropdown buttons for payment method selection.\n */\nexport function Home({ style: _style }: HomeProps): React.ReactElement {\n const {\n amount,\n setAmount,\n setCurrentStep,\n walletAddress,\n connectWallet,\n amountInputMode,\n setAmountInputMode,\n } = useDeposit();\n const { fixedFromAmountString, isFixedAmount, minAmountUsd, maxAmountUsd } =\n useAmountConstraints();\n const { detected: detectedWallets } = useWalletDetection();\n\n const [isEditing, setIsEditing] = useState(false);\n const [isCryptoDropdownOpen, setIsCryptoDropdownOpen] = useState(false);\n const [isFiatDropdownOpen, setIsFiatDropdownOpen] = useState(false);\n\n const amountInputRef = useRef<HTMLInputElement>(null);\n const cryptoDropdownRef = useRef<HTMLDivElement>(null);\n const fiatDropdownRef = useRef<HTMLDivElement>(null);\n\n // Close dropdowns when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n cryptoDropdownRef.current &&\n !cryptoDropdownRef.current.contains(event.target as Node)\n ) {\n setIsCryptoDropdownOpen(false);\n }\n if (\n fiatDropdownRef.current &&\n !fiatDropdownRef.current.contains(event.target as Node)\n ) {\n setIsFiatDropdownOpen(false);\n }\n };\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\n }, []);\n\n useEffect(() => {\n if (!fixedFromAmountString) return;\n if (amount !== fixedFromAmountString) {\n setAmount(fixedFromAmountString);\n }\n if (amountInputMode !== \"usd\") {\n setAmountInputMode(\"usd\");\n }\n }, [\n amount,\n amountInputMode,\n fixedFromAmountString,\n setAmount,\n setAmountInputMode,\n ]);\n\n // Parse amount for display\n const parsedAmount = parseFloat(fixedFromAmountString ?? amount) || 0;\n\n /**\n * Handle amount input changes with decimal sanitization\n */\n const handleAmountChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (isFixedAmount) return;\n if (amountInputMode !== \"usd\") setAmountInputMode(\"usd\");\n const sanitized = sanitizeAmountInput(e.target.value);\n const clamped = clampUsdAmount(sanitized, minAmountUsd, maxAmountUsd);\n setAmount(clamped);\n };\n\n /**\n * Handle click on the amount display to start editing\n */\n const handleAmountClick = () => {\n if (isFixedAmount) return;\n const isZeroish = !amount || parseFloat(amount) === 0;\n setIsEditing(true);\n if (isZeroish) setAmount(\"\");\n\n setTimeout(() => {\n const input = amountInputRef.current;\n if (!input) return;\n input.focus();\n input.setSelectionRange(0, 0);\n }, 0);\n };\n\n /**\n * Handle wallet selection from dropdown\n */\n const handleWalletSelect = async (wallet: (typeof detectedWallets)[0]) => {\n setIsCryptoDropdownOpen(false);\n\n // If already connected, go to select token\n if (walletAddress) {\n // setCurrentStep(\"select-token\");\n setCurrentStep(\"crypto-pay\");\n return;\n }\n\n // Connect to the wallet\n try {\n await connectWallet(wallet);\n // setCurrentStep(\"select-token\");\n setCurrentStep(\"crypto-pay\");\n } catch {\n // wallet connection failed — handled by walletManager status\n }\n };\n\n /**\n * Handle fiat payment selection (coming soon)\n */\n const handleFiatSelect = () => {\n // Fiat is coming soon - just close dropdown\n setIsFiatDropdownOpen(false);\n };\n\n // Filter out WalletConnect for the detected wallets list\n const browserWallets = detectedWallets.filter(\n (w) => w.meta.id !== \"walletconnect\"\n );\n\n const [universalConnector, setUniversalConnector] =\n useState<UniversalConnector>();\n // Initialize the Universal Connector on component mount\n useEffect(() => {\n getUniversalConnector().then(setUniversalConnector);\n }, []);\n\n const handleWalletConnect = async () => {\n if (!universalConnector) {\n return;\n }\n\n const { session: providerSession } = await universalConnector.connect();\n\n if (providerSession) {\n setCurrentStep(\"select-token\");\n // setStatus(\"connected\");\n // onNext();\n }\n };\n\n return (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n minHeight: \"500px\",\n }}\n >\n {/* Header */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: `${spacing[4]} ${spacing[4]}`,\n borderBottom: `1px solid ${colors.border}`,\n }}\n >\n <h1\n style={{\n fontSize: fontSize.lg,\n fontWeight: fontWeight.semibold,\n color: colors.foreground,\n }}\n >\n Deposit\n </h1>\n </div>\n\n {/* Content */}\n <div\n style={{\n flex: 1,\n padding: `0 ${spacing[6]}`,\n overflow: \"visible\",\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n position: \"relative\",\n }}\n >\n {/* Enter Amount Label */}\n <p\n style={{\n fontSize: fontSize.base,\n color: colors.mutedForeground,\n marginBottom: spacing[4],\n }}\n >\n Enter an amount\n </p>\n\n {/* Large Amount Display */}\n <div\n style={{\n textAlign: \"center\",\n position: \"relative\",\n marginBottom: spacing[8],\n }}\n >\n <span\n style={{\n fontSize: \"3.75rem\",\n fontWeight: fontWeight.bold,\n letterSpacing: \"-0.025em\",\n cursor: isFixedAmount ? \"default\" : \"pointer\",\n }}\n onClick={handleAmountClick}\n >\n <span\n style={{\n color: colors.foreground,\n }}\n >\n $\n </span>\n <span\n style={{\n position: \"relative\",\n display: \"inline-block\",\n minWidth: \"1ch\",\n }}\n >\n <span\n style={{\n color:\n isEditing || parsedAmount > 0\n ? colors.foreground\n : \"rgba(161, 161, 170, 0.4)\",\n }}\n >\n {isEditing\n ? amount || \"0\"\n : parsedAmount > 0\n ? parsedAmount.toLocaleString(undefined, {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n })\n : \"0\"}\n </span>\n {!isEditing && parsedAmount === 0 && (\n <span style={{ color: \"rgba(161, 161, 170, 0.4)\" }}>.00</span>\n )}\n <input\n ref={amountInputRef}\n type=\"text\"\n inputMode=\"decimal\"\n value={amount}\n onChange={handleAmountChange}\n onBlur={() => setIsEditing(false)}\n readOnly={isFixedAmount}\n style={{\n position: \"absolute\",\n inset: 0,\n width: \"100%\",\n backgroundColor: \"transparent\",\n border: \"none\",\n outline: \"none\",\n padding: 0,\n margin: 0,\n textAlign: \"center\",\n color: \"transparent\",\n fontSize: \"3.75rem\",\n fontWeight: fontWeight.bold,\n letterSpacing: \"-0.025em\",\n caretColor: \"hsl(var(--tw-muted-foreground) / 0.5)\",\n }}\n aria-label=\"Deposit amount\"\n />\n </span>\n </span>\n </div>\n\n {/* Payment Options - Dropdown Pills */}\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: spacing[3],\n alignItems: \"center\",\n position: \"relative\",\n zIndex: 10,\n minHeight: \"6rem\",\n }}\n >\n {/* Pay with Crypto Dropdown */}\n <div\n style={\n isCryptoDropdownOpen\n ? dropdownWrapperOpenStyle\n : dropdownWrapperStyle\n }\n ref={cryptoDropdownRef}\n >\n <button\n type=\"button\"\n onClick={() => {\n setIsCryptoDropdownOpen(!isCryptoDropdownOpen);\n setIsFiatDropdownOpen(false);\n }}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: spacing[3],\n padding: `${spacing[3]} ${spacing[6]}`,\n borderRadius: \"9999px\",\n transition: \"all 0.2s\",\n backgroundColor: \"rgba(161, 161, 170, 0.1)\",\n width: \"14rem\",\n border: \"none\",\n cursor: \"pointer\",\n fontFamily: \"inherit\",\n fontSize: fontSize.sm,\n lineHeight: 1.5,\n outline: \"none\",\n WebkitAppearance: \"none\",\n MozAppearance: \"none\",\n appearance: \"none\",\n }}\n >\n {/* Wallet Icon */}\n <svg\n style={{\n width: \"1.25rem\",\n height: \"1.25rem\",\n color: colors.mutedForeground,\n }}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M3 10h18M7 15h1m4 0h1m-7 4h12a3 3 0 003-3V8a3 3 0 00-3-3H6a3 3 0 00-3 3v8a3 3 0 003 3z\"\n />\n </svg>\n <span\n style={{\n fontWeight: fontWeight.medium,\n fontSize: fontSize.sm,\n color: colors.foreground,\n flex: 1,\n textAlign: \"left\",\n }}\n >\n Pay with crypto\n </span>\n {/* Chevron */}\n <svg\n style={{\n width: \"1rem\",\n height: \"1rem\",\n color: colors.mutedForeground,\n transition: \"transform 0.2s\",\n transform: isCryptoDropdownOpen ? \"rotate(180deg)\" : \"none\",\n }}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M19 9l-7 7-7-7\"\n />\n </svg>\n </button>\n\n {/* Crypto Dropdown Menu */}\n {isCryptoDropdownOpen && (\n <div\n style={{\n position: \"absolute\",\n top: \"100%\",\n left: \"50%\",\n transform: \"translateX(-50%)\",\n marginTop: spacing[2],\n width: \"16rem\",\n maxHeight: \"16rem\",\n backgroundColor: colors.card,\n borderRadius: borderRadius.xl,\n boxShadow: shadows.large,\n border: `1px solid rgba(63, 63, 70, 0.5)`,\n zIndex: 100,\n overflow: \"auto\",\n animation: \"tw-fade-in 0.2s ease-out\",\n scrollbarWidth: \"thin\",\n scrollbarColor: `${colors.muted} transparent`,\n }}\n >\n {/* Detected Wallets Section */}\n <div\n style={{\n padding: spacing[3],\n }}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: spacing[2],\n marginBottom: spacing[2],\n }}\n >\n <div\n style={{\n width: \"0.375rem\",\n height: \"0.375rem\",\n borderRadius: \"9999px\",\n backgroundColor: colors.green[500],\n }}\n />\n <span\n style={{\n fontSize: fontSize.xs,\n fontWeight: fontWeight.medium,\n color: colors.primary,\n }}\n >\n {browserWallets.length > 0\n ? \"Detected Wallets\"\n : \"No Wallets Detected\"}\n </span>\n </div>\n\n {browserWallets.length > 0 ? (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: spacing[1],\n }}\n >\n {browserWallets.map((wallet) => (\n <button\n key={wallet.meta.id}\n type=\"button\"\n onClick={() => handleWalletSelect(wallet)}\n style={{\n width: \"100%\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n padding: spacing[2],\n borderRadius: borderRadius.lg,\n transition: \"background-color 0.2s\",\n border: \"none\",\n backgroundColor: \"transparent\",\n cursor: \"pointer\",\n fontFamily: \"inherit\",\n fontSize: fontSize.sm,\n outline: \"none\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: spacing[2],\n }}\n >\n {wallet.meta.logo ? (\n <img\n src={wallet.meta.logo}\n alt={wallet.meta.name}\n style={{\n width: \"2rem\",\n height: \"2rem\",\n borderRadius: borderRadius.lg,\n objectFit: \"cover\",\n }}\n />\n ) : (\n <div\n style={{\n width: \"2rem\",\n height: \"2rem\",\n borderRadius: borderRadius.lg,\n backgroundColor: colors.muted,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n <span\n style={{\n fontSize: fontSize.xs,\n fontWeight: fontWeight.bold,\n color: colors.mutedForeground,\n }}\n >\n {wallet.meta.name.slice(0, 2).toUpperCase()}\n </span>\n </div>\n )}\n <span\n style={{\n fontWeight: fontWeight.medium,\n fontSize: fontSize.sm,\n color: colors.foreground,\n }}\n >\n {wallet.meta.name}\n </span>\n </div>\n <div\n style={{\n width: \"1rem\",\n height: \"1rem\",\n borderRadius: \"9999px\",\n border: `2px solid rgba(161, 161, 170, 0.3)`,\n }}\n />\n </button>\n ))}\n </div>\n ) : (\n <p\n style={{\n fontSize: fontSize.xs,\n color: colors.mutedForeground,\n textAlign: \"center\",\n padding: `${spacing[2]} 0`,\n }}\n >\n Install a wallet extension like MetaMask to continue\n </p>\n )}\n </div>\n\n {/* Divider */}\n <div\n style={{\n borderTop: `1px solid rgba(63, 63, 70, 0.5)`,\n }}\n />\n\n {/* WalletConnect Option */}\n <div\n style={{\n padding: spacing[3],\n }}\n >\n <button\n type=\"button\"\n onClick={() => {\n // const wcWallet = detectedWallets.find(\n // (w) => w.meta.id === \"walletconnect\"\n // );\n // if (wcWallet) handleWalletSelect(wcWallet);\n handleWalletConnect();\n }}\n style={{\n width: \"100%\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n padding: spacing[2],\n borderRadius: borderRadius.lg,\n transition: \"background-color 0.2s\",\n border: \"none\",\n backgroundColor: \"transparent\",\n cursor: \"pointer\",\n fontFamily: \"inherit\",\n fontSize: fontSize.sm,\n outline: \"none\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: spacing[2],\n }}\n >\n <div\n style={{\n width: \"2rem\",\n height: \"2rem\",\n borderRadius: borderRadius.lg,\n backgroundColor: \"rgba(59, 130, 246, 0.1)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n <svg\n style={{\n width: \"1.25rem\",\n height: \"1.25rem\",\n color: colors.blue[500],\n }}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n >\n <path d=\"M6.09 10.56c3.26-3.2 8.56-3.2 11.82 0l.39.39a.4.4 0 010 .58l-1.34 1.31a.21.21 0 01-.3 0l-.54-.53c-2.28-2.23-5.97-2.23-8.24 0l-.58.56a.21.21 0 01-.3 0L5.66 11.6a.4.4 0 010-.58l.43-.46zm14.6 2.72l1.2 1.17a.4.4 0 010 .58l-5.38 5.27a.43.43 0 01-.6 0l-3.82-3.74a.11.11 0 00-.15 0l-3.82 3.74a.43.43 0 01-.6 0L2.15 15.03a.4.4 0 010-.58l1.2-1.17a.43.43 0 01.6 0l3.82 3.74c.04.04.1.04.15 0l3.82-3.74a.43.43 0 01.6 0l3.82 3.74c.04.04.1.04.15 0l3.82-3.74a.43.43 0 01.6 0z\" />\n </svg>\n </div>\n <span\n style={{\n fontWeight: fontWeight.medium,\n fontSize: fontSize.sm,\n color: colors.foreground,\n }}\n >\n WalletConnect\n </span>\n </div>\n <svg\n style={{\n width: \"1rem\",\n height: \"1rem\",\n color: colors.mutedForeground,\n }}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M9 5l7 7-7 7\"\n />\n </svg>\n </button>\n </div>\n </div>\n )}\n </div>\n\n {/* Pay with Fiat Dropdown */}\n <div\n style={\n isFiatDropdownOpen\n ? dropdownWrapperOpenStyle\n : dropdownWrapperStyle\n }\n ref={fiatDropdownRef}\n >\n <button\n type=\"button\"\n onClick={() => {\n setIsFiatDropdownOpen(!isFiatDropdownOpen);\n setIsCryptoDropdownOpen(false);\n }}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: spacing[3],\n padding: `${spacing[3]} ${spacing[6]}`,\n borderRadius: \"9999px\",\n transition: \"all 0.2s\",\n backgroundColor: \"rgba(161, 161, 170, 0.1)\",\n width: \"14rem\",\n border: \"none\",\n cursor: \"pointer\",\n fontFamily: \"inherit\",\n fontSize: fontSize.sm,\n lineHeight: 1.5,\n outline: \"none\",\n WebkitAppearance: \"none\",\n MozAppearance: \"none\",\n appearance: \"none\",\n }}\n >\n {/* Credit Card Icon */}\n <svg\n style={{\n width: \"1.25rem\",\n height: \"1.25rem\",\n color: colors.mutedForeground,\n }}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <rect x=\"1\" y=\"4\" width=\"22\" height=\"16\" rx=\"2\" ry=\"2\" />\n <line x1=\"1\" y1=\"10\" x2=\"23\" y2=\"10\" />\n </svg>\n <span\n style={{\n fontWeight: fontWeight.medium,\n fontSize: fontSize.sm,\n color: colors.foreground,\n flex: 1,\n textAlign: \"left\",\n }}\n >\n Pay with fiat\n </span>\n {/* Chevron */}\n <svg\n style={{\n width: \"1rem\",\n height: \"1rem\",\n color: colors.mutedForeground,\n transition: \"transform 0.2s\",\n transform: `${isFiatDropdownOpen ? \"rotate(180deg)\" : \"none\"}`,\n }}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M19 9l-7 7-7-7\"\n />\n </svg>\n </button>\n\n {/* Fiat Dropdown Menu */}\n {isFiatDropdownOpen && (\n <div\n style={{\n position: \"absolute\",\n top: \"100%\",\n left: \"50%\",\n transform: \"translateX(-50%)\",\n marginTop: spacing[2],\n width: \"16rem\",\n backgroundColor: colors.card,\n borderRadius: borderRadius.xl,\n boxShadow: shadows.large,\n border: `1px solid rgba(63, 63, 70, 0.5)`,\n zIndex: 100,\n overflow: \"hidden\",\n animation: \"tw-fade-in 0.2s ease-out\",\n }}\n >\n {/* Coming Soon Banner */}\n <div\n style={{\n padding: `${spacing[2]} ${spacing[3]}`,\n backgroundColor: \"rgba(245, 158, 11, 0.1)\",\n borderBottom: \"1px solid rgba(245, 158, 11, 0.2)\",\n }}\n >\n <p\n style={{\n fontSize: fontSize.xs,\n fontWeight: fontWeight.medium,\n color: colors.amber[600],\n textAlign: \"center\",\n }}\n >\n Coming Soon\n </p>\n </div>\n\n {/* Payment Methods Section */}\n <div\n style={{\n padding: spacing[3],\n }}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: spacing[2],\n marginBottom: spacing[2],\n }}\n >\n <div\n style={{\n width: \"0.375rem\",\n height: \"0.375rem\",\n borderRadius: \"9999px\",\n backgroundColor: colors.primary,\n }}\n />\n <span\n style={{\n fontSize: fontSize.xs,\n fontWeight: fontWeight.medium,\n color: colors.primary,\n }}\n >\n Payment Methods\n </span>\n </div>\n\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: spacing[1],\n }}\n >\n {fiatOptions.map((method) => (\n <button\n key={method.id}\n type=\"button\"\n onClick={() => handleFiatSelect()}\n disabled\n style={{\n width: \"100%\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n padding: spacing[2],\n borderRadius: borderRadius.lg,\n opacity: 0.5,\n cursor: \"not-allowed\",\n border: \"none\",\n backgroundColor: \"transparent\",\n fontFamily: \"inherit\",\n fontSize: fontSize.sm,\n outline: \"none\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: spacing[2],\n }}\n >\n <span style={{ color: colors.mutedForeground }}>\n {method.icon}\n </span>\n <span\n style={{\n fontWeight: fontWeight.medium,\n fontSize: fontSize.sm,\n color: colors.foreground,\n }}\n >\n {method.name}\n </span>\n </div>\n <div\n style={{\n width: \"1rem\",\n height: \"1rem\",\n borderRadius: \"9999px\",\n border: `2px solid rgba(161, 161, 170, 0.3)`,\n }}\n />\n </button>\n ))}\n </div>\n </div>\n </div>\n )}\n </div>\n </div>\n </div>\n\n {/* Footer */}\n <div\n style={{\n padding: `${spacing[4]} ${spacing[6]}`,\n borderTop: `1px solid rgba(63, 63, 70, 0.3)`,\n }}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: spacing[2],\n }}\n >\n <svg\n style={{\n width: \"0.875rem\",\n height: \"0.875rem\",\n color: colors.mutedForeground,\n }}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z\"\n />\n </svg>\n <span\n style={{\n fontSize: fontSize.sm,\n color: colors.mutedForeground,\n }}\n >\n Secured by{\" \"}\n <span\n style={{\n fontWeight: fontWeight.semibold,\n color: colors.foreground,\n }}\n >\n Trustware\n </span>\n </span>\n </div>\n </div>\n </div>\n );\n}\n\nexport default Home;\n","import type { AppKitNetwork } from \"@reown/appkit/networks\";\nimport type { CustomCaipNetwork } from \"@reown/appkit-common\";\nimport { UniversalConnector } from \"@reown/appkit-universal-connector\";\n\n// Get projectId from https://dashboard.walletconnect.com\nexport const projectId = \"896c4c8fa652baf14b9614e4026aff6a\"; // this is a public projectId only to use on localhost\n\nif (!projectId) {\n throw new Error(\"Project ID is not defined\");\n}\n\nexport const solanaMainnet: CustomCaipNetwork<\"solana\"> = {\n id: 1,\n chainNamespace: \"solana\",\n caipNetworkId: \"solana:5eykt4UsFv8P8NJdTREpY1vzqAQ3H1FQ\",\n name: \"Solana Mainnet\",\n nativeCurrency: {\n name: \"Solana\",\n symbol: \"SOL\",\n decimals: 9,\n },\n rpcUrls: {\n default: {\n http: [\"https://api.mainnet-beta.solana.com\"],\n },\n },\n};\n\nexport const bitcoinMainnet: CustomCaipNetwork<\"bip122\"> = {\n id: 0,\n chainNamespace: \"bip122\",\n caipNetworkId: \"bip122:000000000019d6689c085ae165831e93\",\n name: \"Bitcoin Mainnet\",\n nativeCurrency: {\n name: \"Bitcoin\",\n symbol: \"BTC\",\n decimals: 8,\n },\n rpcUrls: {\n default: {\n http: [\"https://api.blockcypher.com/v1/btc/main\"],\n },\n },\n};\n\nexport const ethereumMainnet: CustomCaipNetwork<\"eip155\"> = {\n id: 1,\n chainNamespace: \"eip155\",\n caipNetworkId: \"eip155:1\",\n name: \"Ethereum Mainnet\",\n nativeCurrency: {\n name: \"Ether\",\n symbol: \"ETH\",\n decimals: 18,\n },\n rpcUrls: {\n default: {\n http: [\"https://rpc.ankr.com/eth\"],\n },\n },\n};\n\nexport const seiMainnet: CustomCaipNetwork<\"eip155\"> = {\n id: 1329,\n chainNamespace: \"eip155\",\n caipNetworkId: \"eip155:1329\",\n name: \"Sei Mainnet\",\n nativeCurrency: {\n name: \"Sei\",\n symbol: \"SEI\",\n decimals: 18,\n },\n rpcUrls: {\n default: {\n http: [\"https://evm-rpc.sei-apis.com\"],\n },\n },\n};\n\nexport const networks1 = [\n solanaMainnet,\n bitcoinMainnet,\n ethereumMainnet,\n seiMainnet,\n] as [AppKitNetwork, ...AppKitNetwork[]];\n\nexport async function getUniversalConnector() {\n const universalConnector = await UniversalConnector.init({\n projectId,\n metadata: {\n name: \"Universal Connector\",\n description: \"Universal Connector\",\n url: \"https://www.walletconnect.com\",\n icons: [\"https://www.walletconnect.com/icon.png\"],\n },\n networks: [\n {\n namespace: \"solana\",\n chains: [solanaMainnet],\n methods: [\"solana_signMessage\", \"solana_signTransaction\"],\n events: [],\n },\n {\n namespace: \"eip155\",\n chains: [ethereumMainnet, seiMainnet],\n methods: [\"eth_sendTransaction\", \"eth_sign\", \"personal_sign\"],\n events: [\"accountsChanged\", \"chainChanged\"],\n },\n {\n namespace: \"bip122\",\n chains: [bitcoinMainnet],\n methods: [\"btc_signMessage\"],\n events: [],\n },\n ],\n });\n\n return universalConnector;\n}\n","import React, { useCallback, useMemo } from \"react\";\nimport { colors, spacing, fontSize, fontWeight, borderRadius } from \"../styles\";\n\nimport { useDeposit } from \"../context/DepositContext\";\nimport type { Chain, Token, YourTokenData } from \"../context/DepositContext\";\n\nimport { formatTokenBalance, resolveChainLabel } from \"../../utils\";\nimport type { ChainDef } from \"../../types/\";\nimport { getBalances } from \"src/core/balances\";\nimport { useChains, useTokens } from \"../hooks\";\n\nexport interface SelectTokenProps {\n /** Additional inline styles */\n style?: React.CSSProperties;\n}\n\n/**\n * SelectToken page with two-column layout.\n * Left column displays available chains for selection.\n * Right column displays tokens for the selected chain with search functionality.\n */\nexport function SelectToken({ style }: SelectTokenProps): React.ReactElement {\n const {\n selectedChain,\n setSelectedChain,\n setSelectedToken,\n setCurrentStep,\n goBack,\n walletAddress,\n yourWalletTokens,\n } = useDeposit();\n const { popularChains, otherChains, isLoading, error } = useChains();\n const {\n filteredTokens,\n isLoading: isLoadingTokens,\n error: tokensError,\n searchQuery,\n setSearchQuery,\n } = useTokens((selectedChain?.chainId as number) ?? null);\n\n /**\n * Handle chain selection\n */\n const handleChainSelect = (chain: ChainDef) => {\n // Convert ChainDef to our Chain interface for context\n // console.log({ chainselect: chain });\n const chainId = Number(chain.chainId ?? chain.id);\n setSelectedChain({\n chainId,\n name: resolveChainLabel(chain),\n shortName:\n chain.nativeCurrency?.symbol ??\n resolveChainLabel(chain).slice(0, 3).toUpperCase(),\n iconUrl: chain.chainIconURI,\n isPopular: [1, 137, 8453].includes(chainId),\n nativeToken: chain.nativeCurrency?.symbol,\n explorerUrl: chain.blockExplorerUrls?.[0],\n } as Chain);\n };\n\n // Get balance in USD\n\n /**\n * Handle token selection\n */\n const handleTokenSelect = async (token: Token) => {\n // console.log({ selectToken: token });\n if (token.balance !== undefined)\n return (setSelectedToken(token), setCurrentStep(\"crypto-pay\"));\n\n const balance = await getBalances(\n selectedChain?.chainId as string | number,\n walletAddress as string\n );\n\n const match = balance.find(\n (b) => b.contract?.toLowerCase() === token.address.toLowerCase()\n );\n const tokenWithBalance = {\n ...token,\n balance: match?.balance?.toString?.() ?? \"0\",\n };\n\n const concToken = {\n ...tokenWithBalance,\n chainData: selectedChain as Chain,\n } as unknown as YourTokenData;\n\n setSelectedToken(concToken);\n\n setCurrentStep(\"crypto-pay\");\n };\n\n const handleYourTokenSelect = useCallback(\n (token: YourTokenData) => {\n setSelectedToken(token);\n setSelectedChain(token.chainData as Chain);\n setCurrentStep(\"crypto-pay\");\n },\n [setCurrentStep, setSelectedChain, setSelectedToken]\n );\n\n /**\n * Check if a chain is currently selected\n */\n const isChainSelected = (chain: ChainDef): boolean => {\n if (!selectedChain) return false;\n const chainId = Number(chain.chainId ?? chain.id);\n return selectedChain.chainId === chainId;\n };\n\n const normalizedSearchQuery = searchQuery.toLowerCase().trim();\n\n const matchesSearch = (token: {\n symbol?: string;\n name?: string;\n address?: string;\n }) => {\n if (!normalizedSearchQuery) {\n return true;\n }\n\n const symbol = token.symbol?.toLowerCase() ?? \"\";\n const name = token.name?.toLowerCase() ?? \"\";\n const address = token.address?.toLowerCase() ?? \"\";\n\n return (\n symbol.includes(normalizedSearchQuery) ||\n name.includes(normalizedSearchQuery) ||\n address.includes(normalizedSearchQuery)\n );\n };\n\n const filteredWalletTokens = useMemo(() => {\n if (!selectedChain?.chainId) {\n return [];\n }\n\n return (yourWalletTokens ?? []).filter((token) => {\n return (\n Number(token.chainId) === Number(selectedChain.chainId) &&\n matchesSearch(token)\n );\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [normalizedSearchQuery, selectedChain?.chainId, yourWalletTokens]);\n\n /**\n * Render a single chain item\n */\n const renderChainItem = (chain: ChainDef, index: number) => {\n const key =\n chain.id ?? chain.chainId ?? chain.networkIdentifier ?? `chain-${index}`;\n const isSelected = isChainSelected(chain);\n const label = resolveChainLabel(chain);\n\n return (\n <button\n key={String(key)}\n type=\"button\"\n onClick={() => handleChainSelect(chain)}\n style={{\n width: \"100%\",\n display: \"flex\",\n alignItems: \"center\",\n gap: spacing[3],\n padding: `${spacing[2.5]} ${spacing[3]}`,\n borderRadius: borderRadius.lg,\n border: \"1px solid transparent\",\n transition: \"all 0.2s\",\n backgroundColor: \"transparent\",\n cursor: \"pointer\",\n ...(isSelected && {\n border: `1px solid ${colors.primary}`,\n backgroundColor: \"rgba(59, 130, 246, 0.1)\",\n }),\n }}\n >\n {/* Chain Icon */}\n {chain.chainIconURI ? (\n <img\n src={chain.chainIconURI}\n alt={label}\n style={{\n width: \"2rem\",\n height: \"2rem\",\n borderRadius: \"9999px\",\n objectFit: \"cover\",\n flexShrink: 0,\n }}\n />\n ) : (\n <div\n style={{\n width: \"2rem\",\n height: \"2rem\",\n borderRadius: \"9999px\",\n backgroundColor: colors.muted,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n flexShrink: 0,\n }}\n >\n <span\n style={{\n fontSize: fontSize.xs,\n fontWeight: fontWeight.semibold,\n color: colors.mutedForeground,\n }}\n >\n {label.slice(0, 2).toUpperCase()}\n </span>\n </div>\n )}\n\n {/* Chain Name */}\n <div\n style={{\n flex: 1,\n textAlign: \"left\",\n minWidth: 0,\n }}\n >\n <span\n style={{\n fontSize: fontSize.sm,\n fontWeight: fontWeight.medium,\n color: colors.foreground,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n display: \"block\",\n }}\n >\n {label}\n </span>\n </div>\n\n {/* Selection indicator */}\n {isSelected && (\n <div\n style={{\n width: \"1.25rem\",\n height: \"1.25rem\",\n borderRadius: \"9999px\",\n backgroundColor: colors.primary,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n flexShrink: 0,\n }}\n >\n <svg\n style={{\n width: \"0.75rem\",\n height: \"0.75rem\",\n color: colors.primaryForeground,\n }}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={3}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M5 13l4 4L19 7\"\n />\n </svg>\n </div>\n )}\n </button>\n );\n };\n\n return (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n minHeight: \"500px\",\n maxHeight: \"70vh\",\n ...style,\n }}\n >\n {/* Header */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n padding: `${spacing[4]} ${spacing[4]}`,\n borderBottom: `1px solid ${colors.border}`,\n }}\n >\n <button\n type=\"button\"\n onClick={goBack}\n style={{\n padding: spacing[1],\n marginRight: spacing[2],\n borderRadius: borderRadius.lg,\n transition: \"background-color 0.2s\",\n backgroundColor: \"transparent\",\n border: 0,\n cursor: \"pointer\",\n }}\n aria-label=\"Go back\"\n >\n <svg\n style={{\n width: \"1.25rem\",\n height: \"1.25rem\",\n color: colors.foreground,\n }}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M15 19l-7-7 7-7\"\n />\n </svg>\n </button>\n <h1\n style={{\n flex: 1,\n fontSize: fontSize.lg,\n fontWeight: fontWeight.semibold,\n color: colors.foreground,\n textAlign: \"center\",\n marginRight: \"1.75rem\",\n }}\n >\n Select Token\n </h1>\n </div>\n\n {/* Content - Two Column Layout */}\n <div\n style={{\n flex: 1,\n display: \"flex\",\n overflow: \"hidden\",\n }}\n >\n {/* Left Column - Chain Selector */}\n <div\n style={{\n width: \"140px\",\n borderRight: `1px solid ${colors.border}`,\n display: \"flex\",\n flexDirection: \"column\",\n overflow: \"hidden\",\n }}\n >\n <div\n style={{\n padding: `${spacing[2]} ${spacing[3]}`,\n borderBottom: `1px solid rgba(63, 63, 70, 0.5)`,\n }}\n >\n <span\n style={{\n fontSize: fontSize.xs,\n fontWeight: fontWeight.medium,\n color: colors.mutedForeground,\n textTransform: \"uppercase\",\n letterSpacing: \"0.05em\",\n }}\n >\n Chain\n </span>\n </div>\n\n <div\n style={{\n flex: 1,\n overflowY: \"auto\",\n padding: `${spacing[2]} ${spacing[1]}`,\n }}\n >\n {isLoading ? (\n // Loading skeleton\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: spacing[2],\n padding: `0 ${spacing[2]}`,\n }}\n >\n {[1, 2, 3, 4, 5].map((i) => (\n <div\n key={i}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: spacing[3],\n padding: `${spacing[2]} 0`,\n }}\n >\n <div\n style={{\n width: \"2rem\",\n height: \"2rem\",\n borderRadius: \"9999px\",\n backgroundColor: colors.muted,\n }}\n className=\"tw-animate-pulse\"\n />\n <div\n style={{\n flex: 1,\n height: \"1rem\",\n backgroundColor: colors.muted,\n borderRadius: borderRadius.md,\n }}\n className=\"tw-animate-pulse\"\n />\n </div>\n ))}\n </div>\n ) : error ? (\n // Error state\n <div\n style={{\n padding: `${spacing[3]} ${spacing[4]}`,\n textAlign: \"center\",\n }}\n >\n <p\n style={{\n fontSize: fontSize.sm,\n color: colors.destructive,\n }}\n >\n {error}\n </p>\n <button\n type=\"button\"\n onClick={() => window.location.reload()}\n style={{\n marginTop: spacing[2],\n fontSize: fontSize.xs,\n color: colors.primary,\n backgroundColor: \"transparent\",\n border: 0,\n cursor: \"pointer\",\n textDecoration: \"underline\",\n }}\n >\n Retry\n </button>\n </div>\n ) : (\n <>\n {/* Popular Chains Section */}\n {popularChains.length > 0 && (\n <div\n style={{\n marginBottom: spacing[2],\n }}\n >\n <div\n style={{\n padding: `${spacing[1.5]} ${spacing[3]}`,\n }}\n >\n <span\n style={{\n fontSize: \"10px\",\n fontWeight: fontWeight.medium,\n color: \"rgba(161, 161, 170, 0.7)\",\n textTransform: \"uppercase\",\n letterSpacing: \"0.05em\",\n }}\n >\n Popular\n </span>\n </div>\n {popularChains.map((chain, idx) =>\n renderChainItem(chain, idx)\n )}\n </div>\n )}\n\n {/* Other Chains Section */}\n {otherChains.length > 0 && (\n <div>\n {popularChains.length > 0 && (\n <div\n style={{\n padding: `${spacing[1.5]} ${spacing[3]}`,\n marginTop: spacing[2],\n }}\n >\n <span\n style={{\n fontSize: \"10px\",\n fontWeight: fontWeight.medium,\n color: \"rgba(161, 161, 170, 0.7)\",\n textTransform: \"uppercase\",\n letterSpacing: \"0.05em\",\n }}\n >\n All Chains\n </span>\n </div>\n )}\n {otherChains.map((chain, idx) =>\n renderChainItem(chain, popularChains.length + idx)\n )}\n </div>\n )}\n\n {/* Empty state */}\n {popularChains.length === 0 && otherChains.length === 0 && (\n <div\n style={{\n padding: `${spacing[3]} ${spacing[4]}`,\n textAlign: \"center\",\n }}\n >\n <p\n style={{\n fontSize: fontSize.sm,\n color: colors.mutedForeground,\n }}\n >\n No chains available\n </p>\n </div>\n )}\n </>\n )}\n </div>\n </div>\n\n {/* Right Column - Token Selector */}\n <div\n style={{\n flex: 1,\n display: \"flex\",\n flexDirection: \"column\",\n overflow: \"hidden\",\n }}\n >\n {/* Header with search */}\n <div\n style={{\n padding: `${spacing[2]} ${spacing[3]}`,\n borderBottom: `1px solid rgba(63, 63, 70, 0.5)`,\n }}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: spacing[2],\n marginBottom: spacing[2],\n }}\n >\n <span\n style={{\n fontSize: fontSize.xs,\n fontWeight: fontWeight.medium,\n color: colors.mutedForeground,\n textTransform: \"uppercase\",\n letterSpacing: \"0.05em\",\n }}\n >\n Token\n </span>\n {walletAddress && (\n <span\n style={{\n fontSize: \"10px\",\n color: colors.primary,\n backgroundColor: \"rgba(59, 130, 246, 0.1)\",\n padding: `${spacing[0.5]} ${spacing[1.5]}`,\n borderRadius: borderRadius.md,\n }}\n >\n Wallet Connected\n </span>\n )}\n </div>\n {/* Search Input */}\n {selectedChain && (\n <div\n style={{\n position: \"relative\",\n }}\n >\n <svg\n style={{\n position: \"absolute\",\n left: spacing[2.5],\n top: \"50%\",\n transform: \"translateY(-50%)\",\n width: \"1rem\",\n height: \"1rem\",\n color: colors.mutedForeground,\n }}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <circle cx=\"11\" cy=\"11\" r=\"8\" />\n <path strokeLinecap=\"round\" d=\"m21 21-4.35-4.35\" />\n </svg>\n\n <input\n type=\"text\"\n placeholder=\"Search tokens...\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n style={{\n width: \"100%\",\n paddingLeft: spacing[8],\n paddingRight: spacing[3],\n paddingTop: spacing[2],\n paddingBottom: spacing[2],\n fontSize: fontSize.sm,\n backgroundColor: \"rgba(63, 63, 70, 0.5)\",\n border: `1px solid rgba(63, 63, 70, 0.5)`,\n borderRadius: borderRadius.lg,\n color: colors.foreground,\n outline: \"none\",\n transition: \"all 0.2s\",\n }}\n />\n\n {searchQuery && (\n <button\n type=\"button\"\n onClick={() => setSearchQuery(\"\")}\n style={{\n position: \"absolute\",\n right: spacing[2.5],\n top: \"50%\",\n transform: \"translateY(-50%)\",\n padding: spacing[0.5],\n borderRadius: \"9999px\",\n backgroundColor: \"transparent\",\n border: 0,\n cursor: \"pointer\",\n transition: \"background-color 0.2s\",\n }}\n aria-label=\"Clear search\"\n >\n <svg\n style={{\n width: \"0.875rem\",\n height: \"0.875rem\",\n color: colors.mutedForeground,\n }}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <path strokeLinecap=\"round\" d=\"M18 6 6 18M6 6l12 12\" />\n </svg>\n </button>\n )}\n </div>\n )}\n </div>\n\n {/* Token List */}\n <div\n style={{\n flex: 1,\n overflowY: \"auto\",\n padding: `${spacing[2]} ${spacing[1]}`,\n }}\n >\n {!selectedChain ? (\n // No chain selected\n <div\n style={{\n height: \"100%\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: `0 ${spacing[4]}`,\n }}\n >\n <div\n style={{\n textAlign: \"center\",\n }}\n >\n <svg\n style={{\n width: \"3rem\",\n height: \"3rem\",\n margin: `0 auto ${spacing[3]}`,\n color: \"rgba(161, 161, 170, 0.5)\",\n }}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={1.5}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M7.5 21 3 16.5m0 0L7.5 12M3 16.5h13.5m0-13.5L21 7.5m0 0L16.5 12M21 7.5H7.5\"\n />\n </svg>\n <p\n style={{\n fontSize: fontSize.sm,\n color: colors.mutedForeground,\n }}\n >\n Select a chain to view available tokens\n </p>\n </div>\n </div>\n ) : isLoadingTokens ? (\n // Loading skeleton\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: spacing[2],\n padding: `0 ${spacing[2]}`,\n }}\n >\n {[1, 2, 3, 4, 5, 6].map((i) => (\n <div\n key={i}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: spacing[3],\n padding: `${spacing[2.5]} ${spacing[2]}`,\n }}\n >\n <div\n style={{\n width: \"2.25rem\",\n height: \"2.25rem\",\n borderRadius: \"9999px\",\n backgroundColor: colors.muted,\n }}\n className=\"tw-animate-pulse\"\n />\n <div\n style={{\n flex: 1,\n }}\n >\n <div\n style={{\n height: \"1rem\",\n width: \"4rem\",\n backgroundColor: colors.muted,\n borderRadius: borderRadius.md,\n marginBottom: spacing[1.5],\n }}\n className=\"tw-animate-pulse\"\n />\n <div\n style={{\n height: \"0.75rem\",\n width: \"6rem\",\n backgroundColor: colors.muted,\n borderRadius: borderRadius.md,\n }}\n className=\"tw-animate-pulse\"\n />\n </div>\n <div\n style={{\n height: \"1rem\",\n width: \"3.5rem\",\n backgroundColor: colors.muted,\n borderRadius: borderRadius.md,\n }}\n className=\"tw-animate-pulse\"\n />\n </div>\n ))}\n </div>\n ) : tokensError ? (\n // Error state\n <div\n style={{\n height: \"100%\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: `0 ${spacing[4]}`,\n }}\n >\n <div\n style={{\n textAlign: \"center\",\n }}\n >\n <svg\n style={{\n width: \"2.5rem\",\n height: \"2.5rem\",\n margin: `0 auto ${spacing[2]}`,\n color: colors.destructive,\n }}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path strokeLinecap=\"round\" d=\"M12 8v4M12 16h.01\" />\n </svg>\n <p\n style={{\n fontSize: fontSize.sm,\n\n color: colors.destructive,\n marginBottom: spacing[2],\n }}\n >\n {tokensError}\n </p>\n <button\n type=\"button\"\n onClick={() => window.location.reload()}\n style={{\n marginTop: spacing[2],\n fontSize: fontSize.xs,\n color: colors.primary,\n backgroundColor: \"transparent\",\n border: 0,\n cursor: \"pointer\",\n textDecoration: \"underline\",\n }}\n >\n Try again\n </button>\n </div>\n </div>\n ) : filteredTokens.length === 0 ? (\n // No tokens found\n <div\n style={{\n height: \"100%\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: `0 ${spacing[4]}`,\n }}\n >\n <div\n style={{\n textAlign: \"center\",\n }}\n >\n <svg\n style={{\n width: \"2.5rem\",\n height: \"2.5rem\",\n margin: `0 auto ${spacing[2]}`,\n }}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={1.5}\n >\n <circle cx=\"11\" cy=\"11\" r=\"8\" />\n <path strokeLinecap=\"round\" d=\"m21 21-4.35-4.35\" />\n <path strokeLinecap=\"round\" d=\"M8 11h6\" />\n </svg>\n <p\n style={{\n fontSize: fontSize.sm,\n color: colors.mutedForeground,\n }}\n >\n {searchQuery\n ? `No tokens matching \"${searchQuery}\"`\n : \"No tokens available\"}\n </p>\n {searchQuery && (\n <button\n type=\"button\"\n onClick={() => setSearchQuery(\"\")}\n style={{\n marginTop: spacing[2],\n fontSize: fontSize.xs,\n color: colors.primary,\n backgroundColor: \"transparent\",\n border: 0,\n cursor: \"pointer\",\n textDecoration: \"underline\",\n }}\n >\n Clear search\n </button>\n )}\n </div>\n </div>\n ) : (\n // Token list\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: spacing[0.5],\n }}\n >\n {filteredWalletTokens.length > 0 ? (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"0.375rem\",\n paddingLeft: \"0.5rem\",\n paddingRight: \"0.5rem\",\n marginBottom: spacing[2],\n }}\n >\n {/* <Sparkles className=\"w-3.5 h-3.5 text-primary\" /> */}\n <span\n style={{\n fontSize: \"0.75rem\",\n lineHeight: \"1rem\",\n color: colors.primary,\n }}\n >\n Your tokens\n </span>\n </div>\n ) : null}\n\n {filteredWalletTokens.map((token, i) => (\n <button\n onClick={() => handleYourTokenSelect(token)}\n style={{\n width: \"100%\",\n display: \"flex\",\n alignItems: \"center\",\n gap: spacing[3],\n padding: `${spacing[2.5]} ${spacing[3]}`,\n borderRadius: borderRadius.lg,\n transition: \"all 0.2s\",\n backgroundColor: \"transparent\",\n border: 0,\n cursor: \"pointer\",\n }}\n key={`${token.address}-${i}`}\n >\n {/* Token Icon with Chain Badge */}\n <div\n style={{\n position: \"relative\",\n }}\n >\n {token.iconUrl ||\n (token as typeof token & { logo_url: string })\n .logo_url ? (\n <img\n src={\n token.iconUrl ||\n (token as typeof token & { logo_url: string })\n .logo_url\n }\n alt={token.symbol}\n style={{\n width: \"2.25rem\",\n height: \"2.25rem\",\n borderRadius: \"9999px\",\n objectFit: \"cover\",\n flexShrink: 0,\n }}\n />\n ) : (\n <div\n style={{\n width: \"2.25rem\",\n height: \"2.25rem\",\n borderRadius: \"9999px\",\n objectFit: \"cover\",\n flexShrink: 0,\n }}\n >\n <span\n style={{\n fontSize: fontSize.sm,\n fontWeight: fontWeight.semibold,\n color: colors.foreground,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {token.symbol}\n </span>\n </div>\n )}\n <div\n style={{\n position: \"absolute\",\n bottom: \"-0.125rem\",\n right: \"-0.125rem\",\n width: \"1rem\",\n height: \"1rem\",\n borderRadius: \"100%\",\n backgroundColor: colors.background,\n border: `2px solid ${colors.background}`,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n <img\n src={token.chainIconURI}\n alt={token.chainId?.toString()}\n style={{\n width: \"0.875rem\",\n height: \"0.875rem\",\n borderRadius: \"9999px\",\n }}\n />\n </div>\n </div>\n\n {/* Token Info */}\n <div\n style={{\n flex: 1,\n textAlign: \"left\",\n minWidth: 0,\n }}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: spacing[1.5],\n }}\n >\n <span\n style={{\n fontSize: fontSize.sm,\n fontWeight: fontWeight.semibold,\n color: colors.foreground,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {token.symbol}\n </span>\n </div>\n <span\n style={{\n fontSize: fontSize.xs,\n color: colors.mutedForeground,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n display: \"block\",\n }}\n >\n {formatTokenBalance(token.balance, token.decimals)}{\" \"}\n {token.symbol}\n </span>\n </div>\n </button>\n ))}\n\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"0.375rem\",\n paddingLeft: \"0.5rem\",\n paddingRight: \"0.5rem\",\n marginBottom: spacing[2],\n }}\n >\n <span\n style={{\n fontSize: \"0.75rem\",\n lineHeight: \"1rem\",\n color: colors.primary,\n }}\n >\n Popular tokens\n </span>\n </div>\n\n {filteredTokens.map((token: Token, i) => (\n <button\n type=\"button\"\n onClick={() => handleTokenSelect(token)}\n style={{\n width: \"100%\",\n display: \"flex\",\n alignItems: \"center\",\n gap: spacing[3],\n padding: `${spacing[2.5]} ${spacing[3]}`,\n borderRadius: borderRadius.lg,\n transition: \"all 0.2s\",\n backgroundColor: \"transparent\",\n border: 0,\n cursor: \"pointer\",\n }}\n key={`${token.address}-${i}`}\n >\n {/* Token Icon */}\n {token.iconUrl ? (\n <img\n src={token.iconUrl}\n alt={token.symbol}\n style={{\n width: \"2.25rem\",\n height: \"2.25rem\",\n borderRadius: \"9999px\",\n objectFit: \"cover\",\n flexShrink: 0,\n }}\n onError={(e) => {\n // Fallback to initials on image error\n const target = e.target as HTMLImageElement;\n target.style.display = \"none\";\n if (target.nextElementSibling) {\n (\n target.nextElementSibling as HTMLElement\n ).style.display = \"flex\";\n }\n }}\n />\n ) : null}\n <div\n style={{\n width: \"2.25rem\",\n height: \"2.25rem\",\n borderRadius: \"9999px\",\n backgroundColor: \"rgba(59, 130, 246, 0.1)\",\n alignItems: \"center\",\n justifyContent: \"center\",\n flexShrink: 0,\n display: token.iconUrl ? \"none\" : \"flex\",\n }}\n >\n <span\n style={{\n fontSize: fontSize.sm,\n fontWeight: fontWeight.semibold,\n color: colors.primary,\n }}\n >\n {token.symbol.slice(0, 2).toUpperCase()}\n </span>\n </div>\n\n {/* Token Info */}\n <div\n style={{\n flex: 1,\n textAlign: \"left\",\n minWidth: 0,\n }}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: spacing[1.5],\n }}\n >\n <span\n style={{\n fontSize: fontSize.sm,\n fontWeight: fontWeight.semibold,\n color: colors.foreground,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {token.symbol}\n </span>\n </div>\n <span\n style={{\n fontSize: fontSize.xs,\n color: colors.mutedForeground,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n display: \"block\",\n }}\n >\n {token.name}\n </span>\n </div>\n\n {/* Token Balance (if wallet connected) */}\n {token.balance !== undefined && (\n <div\n style={{\n textAlign: \"right\",\n flexShrink: 0,\n }}\n >\n <span\n style={{\n fontSize: fontSize.sm,\n fontWeight: fontWeight.medium,\n color: colors.foreground,\n }}\n >\n {formatTokenBalance(token.balance, token.decimals)}\n </span>\n </div>\n )}\n\n {/* Chevron */}\n <svg\n style={{\n width: \"1rem\",\n height: \"1rem\",\n color: colors.mutedForeground,\n flexShrink: 0,\n }}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"m9 18 6-6-6-6\"\n />\n </svg>\n </button>\n ))}\n </div>\n )}\n </div>\n </div>\n </div>\n\n {/* Footer */}\n <div\n style={{\n padding: `${spacing[4]} ${spacing[6]}`,\n borderTop: `1px solid rgba(63, 63, 70, 0.3)`,\n }}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: spacing[2],\n }}\n >\n <svg\n style={{\n width: \"0.875rem\",\n height: \"0.875rem\",\n color: colors.mutedForeground,\n }}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z\"\n />\n </svg>\n <span\n style={{\n fontSize: fontSize.sm,\n color: colors.mutedForeground,\n }}\n >\n Secured by{\" \"}\n <span\n style={{\n fontWeight: fontWeight.semibold,\n color: colors.foreground,\n }}\n >\n Trustware\n </span>\n </span>\n </div>\n </div>\n </div>\n );\n}\n\nexport default SelectToken;\n","export function rawToDecimal(rawAmount: string, decimals: number): string {\n if (!rawAmount) return \"0\";\n const sanitized = rawAmount.trim();\n if (!/^\\d+$/.test(sanitized)) return \"0\";\n\n const value = BigInt(sanitized);\n const base = 10n ** BigInt(Math.max(decimals, 0));\n const whole = value / base;\n const fraction = value % base;\n\n if (fraction === 0n || decimals <= 0) {\n return whole.toString();\n }\n\n const paddedFraction = fraction.toString().padStart(decimals, \"0\");\n const trimmedFraction = paddedFraction.replace(/0+$/, \"\");\n\n return trimmedFraction\n ? `${whole.toString()}.${trimmedFraction}`\n : whole.toString();\n}\n\nexport function decimalToRaw(decimalAmount: string, decimals: number): string {\n if (!decimalAmount?.trim()) return \"0\";\n const normalized = decimalAmount.trim();\n if (!/^\\d*\\.?\\d*$/.test(normalized)) return \"0\";\n\n const [wholePartRaw = \"\", fractionRaw = \"\"] = normalized.split(\".\");\n const safeDecimals = Math.max(decimals, 0);\n const wholePart = wholePartRaw.length > 0 ? BigInt(wholePartRaw) : 0n;\n const fractionPadded = (fractionRaw + \"0\".repeat(safeDecimals)).slice(\n 0,\n safeDecimals\n );\n const fractionPart = fractionPadded ? BigInt(fractionPadded) : 0n;\n const base = 10n ** BigInt(safeDecimals);\n\n return (wholePart * base + fractionPart).toString();\n}\n","import { ChainDef } from \"src/types/\";\nimport { rawToDecimal } from \"src/widget-v2/helpers/tokenAmount\";\n\nexport function hexToRgba(hex: string, alpha = 1) {\n if (!hex?.startsWith(\"#\")) return `rgba(0,0,0,${alpha})`;\n const h = hex.replace(\"#\", \"\");\n const isShort = h.length === 3;\n const r = parseInt(isShort ? h[0] + h[0] : h.slice(0, 2), 16);\n const g = parseInt(isShort ? h[1] + h[1] : h.slice(2, 4), 16);\n const b = parseInt(isShort ? h[2] + h[2] : h.slice(4, 6), 16);\n return `rgba(${r}, ${g}, ${b}, ${alpha})`;\n}\n\nexport function formatUsd(value?: number) {\n if (typeof value !== \"number\" || !Number.isFinite(value)) return \"$0.00\";\n return new Intl.NumberFormat(undefined, {\n style: \"currency\",\n currency: \"USD\",\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n }).format(value);\n}\n\nexport function formatNumber(value?: number, maxFractionDigits = 6) {\n if (typeof value !== \"number\" || !Number.isFinite(value)) return \"0\";\n return new Intl.NumberFormat(undefined, {\n minimumFractionDigits: 0,\n maximumFractionDigits: maxFractionDigits,\n }).format(value);\n}\n\n// ------- tiny local helpers (no new imports) -------\nexport function parseDecimalToWeiUnsafe(\n input: string,\n decimals: number\n): bigint | null {\n // accept \"12\", \"12.3\", \"0.0001\" etc (no commas)\n if (!/^\\d*(\\.\\d*)?$/.test(input.trim())) return null;\n const [intPart = \"0\", fracPartRaw = \"\"] = input.trim().split(\".\");\n const fracPart = (fracPartRaw || \"\").slice(0, Math.max(0, decimals)); // clamp precision\n const pad = Math.max(0, decimals - fracPart.length);\n try {\n const whole = BigInt(intPart || \"0\") * BigInt(10) ** BigInt(decimals);\n const frac = BigInt((fracPart || \"0\") + \"0\".repeat(pad));\n return whole + frac;\n } catch {\n return null;\n }\n}\n\n// export function weiToDecimalString(\n// wei: bigint,\n// decimals: number,\n// maxFrac = 8\n// ): string {\n// const neg = wei < 0n;\n// const value = neg ? -wei : wei;\n// const base = BigInt(10) ** BigInt(decimals);\n// const intPart = value / base;\n// const fracPart = value % base;\n// let fracStr = decimals > 0 ? fracPart.toString().padStart(decimals, \"0\") : \"\";\n// if (decimals > 0) {\n// fracStr = fracStr.slice(0, Math.min(maxFrac, decimals)).replace(/0+$/, \"\");\n// }\n// return `${neg ? \"-\" : \"\"}${intPart.toString()}${fracStr ? `.${fracStr}` : \"\"}`;\n// }\n\nexport function weiToDecimalString(\n wei: bigint,\n decimals: number,\n maxFrac = 6\n): string {\n const base = 10n ** BigInt(decimals);\n const intPart = wei / base;\n const fracPart = wei % base;\n if (fracPart === 0n) return intPart.toString();\n const fracStr = fracPart\n .toString()\n .padStart(decimals, \"0\")\n .replace(/0+$/, \"\");\n const trimmed = fracStr.slice(0, maxFrac).replace(/0+$/, \"\");\n return trimmed ? `${intPart.toString()}.${trimmed}` : intPart.toString();\n}\n\n// export function divRoundDown(a: bigint, b: bigint): bigint {\n// if (b === 0n) return 0n;\n// const q = a / b;\n// const r = a % b;\n// if ((a ^ b) >= 0 || r === 0n) return q; // same sign or exact\n// return q; // we want floor toward -∞; with non-negative inputs it's just q\n// }\nexport function divRoundDown(a: bigint, b: bigint): bigint {\n if (b === 0n) return 0n;\n return a / b;\n}\n\nexport function shortenAddress(address: string, chars = 4) {\n if (address.length <= chars * 2 + 2) return address;\n return `${address.slice(0, chars + 2)}...${address.slice(-chars)}`;\n}\n\n// export function formatTokenBalance(token: TokenWithBalance) {\n// if (token.balance === undefined) return \"0.0000\";\n// try {\n// const amount = Number(token.balance) / Math.pow(10, token.decimals ?? 18);\n// if (!Number.isFinite(amount)) return \"0.0000\";\n// return amount.toLocaleString(undefined, {\n// minimumFractionDigits: 0,\n// maximumFractionDigits: 4,\n// });\n// } catch {\n// return \"0.0000\";\n// }\n// }\n\nexport function formatTokenBalance(\n balanceRaw: string,\n decimals: number\n): string {\n const normalized = Number(rawToDecimal(balanceRaw, decimals));\n if (!isFinite(normalized) || normalized <= 0) return \"0\";\n if (normalized < 0.0001) return \"<0.0001\";\n if (normalized < 1) return normalized.toFixed(4);\n if (normalized < 1000) return normalized.toFixed(2);\n return normalized.toLocaleString(undefined, {\n maximumFractionDigits: 2,\n });\n}\n\nexport function resolveChainLabel(chain: ChainDef) {\n return (\n chain.networkName ||\n chain.axelarChainName ||\n (chain.id != null ? String(chain.id) : undefined) ||\n (chain.chainId != null ? String(chain.chainId) : undefined) ||\n chain.networkIdentifier ||\n \"Chain\"\n );\n}\n\nconst ALLOWANCE_SELECTOR = \"0xdd62ed3e\";\nconst APPROVE_SELECTOR = \"0x095ea7b3\";\n\nfunction stripHexPrefix(value: string) {\n return value.startsWith(\"0x\") ? value.slice(2) : value;\n}\n\nfunction padTo32Bytes(hex: string) {\n return hex.padStart(64, \"0\");\n}\n\nfunction encodeAddress(address: string) {\n return padTo32Bytes(stripHexPrefix(address).toLowerCase());\n}\n\nfunction encodeUint256(value: bigint) {\n return padTo32Bytes(value.toString(16));\n}\n\nexport function encodeAllowanceCallData(owner: string, spender: string) {\n return `${ALLOWANCE_SELECTOR}${encodeAddress(owner)}${encodeAddress(\n spender\n )}` as `0x${string}`;\n}\n\nexport function encodeApproveCallData(spender: string, amount: bigint) {\n return `${APPROVE_SELECTOR}${encodeAddress(spender)}${encodeUint256(\n amount\n )}` as `0x${string}`;\n}\n\nexport function hexToBigInt(value?: string | null) {\n if (!value || typeof value !== \"string\") return null;\n if (!value.startsWith(\"0x\")) return null;\n const normalized = value === \"0x\" ? \"0x0\" : value;\n try {\n return BigInt(normalized);\n } catch {\n return null;\n }\n}\n","import React, {\n useState,\n useRef,\n useMemo,\n useEffect,\n useCallback,\n} from \"react\";\nimport { colors, spacing, fontSize, fontWeight, borderRadius } from \"../styles\";\nimport { Chain, useDeposit, YourTokenData } from \"../context/DepositContext\";\nimport {\n clampUsdAmount,\n sanitizeAmountInput,\n useAmountConstraints,\n useRouteBuilder,\n UseRouteBuilderOptions,\n useTransactionSubmit,\n useChains,\n} from \"../hooks\";\nimport {\n TokenSwipePill,\n SwipeToConfirmTokens,\n AmountSlider,\n LoadingSkeleton,\n} from \"../components\";\nimport {\n divRoundDown,\n formatTokenBalance,\n weiToDecimalString,\n} from \"src/utils\";\nimport { ChainDef, Trustware, useTrustware } from \"src\";\nimport { useTrustwareConfig } from \"src/hooks/useTrustwareConfig\";\nimport {\n getNativeTokenAddress,\n isNativeTokenAddress,\n isZeroAddrLike,\n normalizeChainKey,\n} from \"../helpers/chainHelpers\";\nimport { decimalToRaw, rawToDecimal } from \"../helpers/tokenAmount\";\n\nexport interface CryptoPayProps {\n /** Additional inline styles */\n style?: React.CSSProperties;\n}\n\nimport { createPublicClient, encodeFunctionData, erc20Abi, http } from \"viem\";\nimport { TrustwareError } from \"src/errors/TrustwareError\";\nimport { TrustwareErrorCode } from \"src/errors/errorCodes\";\n\nfunction normalizeTokenAddressForCompare(\n chain: ChainDef,\n addr?: string\n): string {\n const chainType = (chain.type ?? chain.chainType ?? \"\").toLowerCase();\n const a = (addr ?? \"\").trim();\n if (chainType === \"solana\") return a;\n return a.toLowerCase();\n}\n\nconst SHOW_FEE_SUMMARY = false;\n\n/**\n * CryptoPay confirmation page.\n * Displays transaction summary with fees and allows last-minute token changes.\n * Includes SwipeToConfirmTokens for secure transaction confirmation.\n */\nexport function CryptoPay({ style }: CryptoPayProps) {\n const {\n amount,\n setAmount,\n selectedToken,\n setSelectedToken,\n selectedChain,\n setSelectedChain,\n walletAddress,\n walletStatus,\n goBack,\n setCurrentStep,\n yourWalletTokens,\n currentStep,\n amountInputMode,\n setAmountInputMode,\n } = useDeposit();\n const config = useTrustwareConfig();\n const { fixedFromAmountString, isFixedAmount, minAmountUsd, maxAmountUsd } =\n useAmountConstraints();\n const routeRefreshMs = useMemo(() => {\n const raw = config.routes?.options?.routeRefreshMs;\n const n = Number(raw);\n return Number.isFinite(n) && n > 0 ? n : undefined;\n }, [config.routes?.options?.routeRefreshMs]);\n\n const isReady = useMemo(() => {\n if (\n selectedToken !== null &&\n yourWalletTokens.length > 0 &&\n (selectedToken as YourTokenData)?.chainData !== undefined\n ) {\n return true;\n }\n }, [selectedToken, yourWalletTokens.length]);\n\n const { chains } = useChains();\n\n const [isEditing, setIsEditing] = useState(false);\n\n const amountInputRef = useRef<HTMLInputElement>(null);\n const gasPriceCacheRef = useRef<{\n value?: bigint;\n ts?: number;\n inflight?: Promise<bigint>;\n }>({});\n\n // Transaction submission hook\n const { isSubmitting, submitTransaction } = useTransactionSubmit();\n\n const destinationConfig = useMemo(\n () => ({\n dappName: config.messages?.title || \"DApp\",\n toChain: config.routes.toChain,\n toToken: config.routes.toToken,\n toAddress: config.routes.toAddress,\n }),\n [\n config.messages?.title,\n config.routes.toAddress,\n config.routes.toChain,\n config.routes.toToken,\n ]\n );\n\n const tokenPriceUSD =\n typeof selectedToken?.usdPrice === \"number\" &&\n isFinite(selectedToken?.usdPrice) &&\n selectedToken.usdPrice > 0\n ? selectedToken.usdPrice\n : 0;\n\n const hasUsdPrice =\n typeof tokenPriceUSD === \"number\" &&\n isFinite(tokenPriceUSD) &&\n tokenPriceUSD > 0;\n\n useEffect(() => {\n if (fixedFromAmountString) return;\n if (isReady && !hasUsdPrice && amountInputMode === \"usd\") {\n setAmountInputMode(\"token\");\n }\n }, [\n amountInputMode,\n fixedFromAmountString,\n hasUsdPrice,\n isReady,\n setAmountInputMode,\n ]);\n\n useEffect(() => {\n if (!fixedFromAmountString) return;\n if (amount !== fixedFromAmountString) {\n setAmount(fixedFromAmountString);\n }\n if (amountInputMode !== \"usd\") {\n setAmountInputMode(\"usd\");\n }\n }, [\n amount,\n amountInputMode,\n fixedFromAmountString,\n setAmount,\n setAmountInputMode,\n ]);\n\n const amountComputation = useMemo(() => {\n const rawAmount = (fixedFromAmountString ?? amount)?.trim();\n // if (!rawAmount) {\n // return {\n // fromAmountWei: null,\n // tokenAmount: null,\n // usdAmount: null,\n // validationError: \"Enter an amount to continue.\",\n // };\n // }\n\n if (!/^\\d*\\.?\\d*$/.test(rawAmount)) {\n return {\n fromAmountWei: null,\n tokenAmount: null,\n usdAmount: null,\n validationError: \"Use numbers only for amount.\",\n };\n }\n\n const tokenDecimals = selectedToken?.decimals ?? 18;\n const parsedAmount = Number(rawAmount);\n if (!isFinite(parsedAmount) || parsedAmount <= 0) {\n return {\n fromAmountWei: null,\n tokenAmount: null,\n usdAmount: null,\n validationError: \"Enter an amount greater than 0.\",\n };\n }\n\n if (amountInputMode === \"usd\") {\n if (!hasUsdPrice) {\n return {\n fromAmountWei: null,\n tokenAmount: null,\n usdAmount: rawAmount,\n validationError:\n \"USD pricing is unavailable for this token. Switch to token amount mode.\",\n };\n }\n\n if (minAmountUsd != null && parsedAmount < minAmountUsd) {\n return {\n fromAmountWei: null,\n tokenAmount: null,\n usdAmount: rawAmount,\n validationError: `Minimum amount is ${minAmountUsd.toLocaleString(\n undefined,\n { maximumFractionDigits: 2 }\n )} USD`,\n };\n }\n if (maxAmountUsd != null && parsedAmount > maxAmountUsd) {\n return {\n fromAmountWei: null,\n tokenAmount: null,\n usdAmount: rawAmount,\n validationError: `Maximum amount is ${maxAmountUsd.toLocaleString(\n undefined,\n { maximumFractionDigits: 2 }\n )} USD`,\n };\n }\n\n const tokenUnits = parsedAmount / tokenPriceUSD;\n if (!isFinite(tokenUnits) || tokenUnits <= 0) {\n return {\n fromAmountWei: null,\n tokenAmount: null,\n usdAmount: rawAmount,\n validationError: \"Unable to convert USD to token amount.\",\n };\n }\n\n return {\n fromAmountWei: BigInt(decimalToRaw(String(tokenUnits), tokenDecimals)),\n tokenAmount: String(tokenUnits),\n usdAmount: rawAmount,\n validationError: null,\n };\n }\n\n if ((minAmountUsd != null || maxAmountUsd != null) && !hasUsdPrice) {\n return {\n fromAmountWei: null,\n tokenAmount: null,\n usdAmount: undefined,\n validationError:\n \"USD pricing is unavailable for this token. Switch to USD amount mode.\",\n };\n }\n\n if (hasUsdPrice) {\n const usdValue = parsedAmount * tokenPriceUSD;\n if (minAmountUsd != null && usdValue < minAmountUsd) {\n return {\n fromAmountWei: null,\n tokenAmount: null,\n usdAmount: String(usdValue),\n validationError: `Minimum amount is ${minAmountUsd.toLocaleString(\n undefined,\n { maximumFractionDigits: 2 }\n )} USD`,\n };\n }\n if (maxAmountUsd != null && usdValue > maxAmountUsd) {\n return {\n fromAmountWei: null,\n tokenAmount: null,\n usdAmount: String(usdValue),\n validationError: `Maximum amount is ${maxAmountUsd.toLocaleString(\n undefined,\n { maximumFractionDigits: 2 }\n )} USD`,\n };\n }\n }\n\n return {\n fromAmountWei: BigInt(decimalToRaw(rawAmount, tokenDecimals)),\n tokenAmount: rawAmount,\n usdAmount: hasUsdPrice ? String(parsedAmount * tokenPriceUSD) : undefined,\n validationError: null,\n };\n }, [\n amount,\n amountInputMode,\n fixedFromAmountString,\n hasUsdPrice,\n maxAmountUsd,\n minAmountUsd,\n selectedToken?.decimals,\n tokenPriceUSD,\n ]);\n\n const amountWei = amountComputation.fromAmountWei ?? 0n;\n\n const routeConfig = useMemo(() => {\n const toChainId = config.routes.toChain;\n const toChainKey = normalizeChainKey(toChainId);\n const toChain = toChainKey\n ? (chains.find(\n (chain) => normalizeChainKey(chain.chainId ?? chain.id) === toChainKey\n ) ?? null)\n : null;\n\n const object: UseRouteBuilderOptions = {\n fromChain: selectedChain?.chainId ?? selectedChain?.id ?? \"\",\n fromChainId: selectedChain?.chainId ?? selectedChain?.id,\n toChain,\n toChainId,\n toToken: config.routes.toToken,\n toAddress: config.routes.toAddress || walletAddress || undefined,\n fromToken:\n selectedToken?.address ??\n getNativeTokenAddress(selectedChain?.type ?? selectedChain?.chainType),\n fromAmountWei: amountWei ?? 0n,\n fromAmountUsd: amountComputation.usdAmount || undefined,\n fromAddress: walletAddress || undefined,\n refundAddress: walletAddress || undefined,\n slippage: 1,\n refreshMs: routeRefreshMs,\n };\n\n // console.log(\"Resolved route config:\", {\n // object,\n // selectedToken,\n // selectedChain,\n // });\n\n return object;\n }, [\n amountComputation.usdAmount,\n amountWei,\n chains,\n config.routes.toAddress,\n config.routes.toChain,\n config.routes.toToken,\n routeRefreshMs,\n selectedChain,\n selectedToken,\n walletAddress,\n ]);\n\n const {\n isLoadingRoute,\n // networkFees,\n estimatedReceive,\n error: routeBuilderError,\n routeResult,\n } = useRouteBuilder(routeConfig);\n\n const routePrerequisiteError = useMemo(() => {\n if (!isReady) return;\n // const error = new Map<string, string>();\n if (!selectedChain) {\n // error.set(\"from_chain\", \"Select a source chain to fetch a route.\");\n return \"Select a source chain to fetch a route.\";\n }\n\n if (!selectedToken) {\n // error.set(\"from_token\", \"Select a token to fetch a route.\");\n return \"Select a token to fetch a route.\";\n }\n\n if (!walletAddress) {\n // error.set(\"from_address\", \"Connect your wallet to fetch a route.\");\n return \"Connect your wallet to fetch a route.\";\n }\n if (!routeConfig.toAddress) {\n // error.set(\n // \"to_address\",\n // \"Destination address missing. Please check widget configuration.\"\n // );\n return \"Destination address missing. Please check widget configuration.\";\n }\n if (!amountComputation.fromAmountWei) {\n // error.set(\"amount_wei\", amountComputation.validationError || \"\");\n return amountComputation.validationError;\n }\n return null;\n }, [\n amountComputation.fromAmountWei,\n amountComputation.validationError,\n isReady,\n routeConfig.toAddress,\n selectedChain,\n selectedToken,\n walletAddress,\n ]);\n\n // const routeError = routePrerequisiteError || _routeBuilderError;\n const routeError = routeBuilderError && \"No successful provider response\";\n\n const { emitError } = useTrustware();\n\n useEffect(() => {\n if (currentStep != \"crypto-pay\") return;\n\n emitError?.(\n new TrustwareError({\n code: TrustwareErrorCode.INPUT_ERROR,\n message: routeError as string,\n userMessage: routeError as string,\n cause: routeError,\n })\n );\n\n if (routePrerequisiteError || routeBuilderError) {\n void (routePrerequisiteError || routeBuilderError);\n }\n }, [\n currentStep,\n emitError,\n routeBuilderError,\n routeError,\n routePrerequisiteError,\n ]);\n\n useEffect(() => {\n if (!routePrerequisiteError && amountComputation.fromAmountWei) {\n // Route prerequisites satisfied — route building will proceed\n }\n }, [\n amountComputation.fromAmountWei,\n routeConfig.toAddress,\n routePrerequisiteError,\n selectedChain?.chainId,\n selectedChain?.id,\n selectedToken?.address,\n walletAddress,\n ]);\n\n const [gasReservationWei, setGasReservationWei] = useState<bigint>(0n);\n\n const chainType = selectedChain?.type ?? selectedChain?.chainType;\n const chainTypeNormalized = (chainType ?? \"\").toLowerCase();\n const isEvm = chainTypeNormalized === \"evm\";\n const rpcUrl = useMemo(() => {\n const list = selectedChain?.rpcList;\n if (Array.isArray(list) && list.length > 0) return list[0];\n return selectedChain?.rpc;\n }, [selectedChain?.rpc, selectedChain?.rpcList]);\n\n useEffect(() => {\n if (!rpcUrl) {\n // Missing RPC URL for selected chain — on-chain reads may fail\n }\n }, [\n rpcUrl,\n selectedChain?.chainId,\n selectedChain?.id,\n selectedChain?.networkName,\n ]);\n\n const client = useMemo(() => {\n if (!rpcUrl) {\n return null;\n }\n return createPublicClient({\n transport: http(rpcUrl),\n });\n }, [rpcUrl]);\n\n const isNativeSelected = useMemo(() => {\n const address = selectedToken?.address;\n\n return (\n isNativeTokenAddress(address, chainType) ||\n isZeroAddrLike(address, chainType) ||\n normalizeTokenAddressForCompare(selectedChain as ChainDef, address) ===\n normalizeTokenAddressForCompare(\n selectedChain as ChainDef,\n getNativeTokenAddress(chainType)\n )\n );\n }, [chainType, selectedChain, selectedToken?.address]);\n\n const spender = useMemo(() => {\n const txReq = routeResult?.txReq;\n const addr = (txReq?.to ?? txReq?.target) as `0x${string}` | undefined;\n return addr ?? null;\n }, [routeResult?.txReq]);\n\n const [allowanceWei, setAllowanceWei] = useState<bigint>(0n);\n const [isReadingAllowance, setIsReadingAllowance] = useState(false);\n const [isApproving, setIsApproving] = useState(false);\n\n const readAllowance = useCallback(async () => {\n if (\n !client ||\n !isEvm ||\n isNativeSelected ||\n !walletAddress ||\n !spender ||\n !selectedToken?.address\n ) {\n setAllowanceWei(0n);\n return;\n }\n try {\n setIsReadingAllowance(true);\n const res = await client.readContract({\n address: selectedToken.address as `0x${string}`,\n abi: erc20Abi,\n functionName: \"allowance\",\n args: [walletAddress as `0x${string}`, spender],\n });\n setAllowanceWei((res as unknown as bigint) ?? 0n);\n } catch {\n setAllowanceWei(0n);\n } finally {\n setIsReadingAllowance(false);\n }\n }, [\n client,\n isEvm,\n isNativeSelected,\n selectedToken?.address,\n spender,\n walletAddress,\n ]);\n\n useEffect(() => {\n void readAllowance();\n }, [readAllowance]);\n\n const needsApproval =\n isEvm &&\n !isNativeSelected &&\n !!walletAddress &&\n !!spender &&\n amountWei > 0n &&\n allowanceWei < amountWei;\n\n const handleApproveExact = useCallback(async () => {\n if (\n isApproving ||\n !amountWei ||\n amountWei <= 0n ||\n !walletAddress ||\n !spender ||\n !selectedToken?.address\n ) {\n return;\n }\n\n const wallet = Trustware.getWallet();\n if (!wallet) {\n //toast.error(\"Wallet not connected\", \"Connect your wallet to approve.\");\n return;\n }\n\n setIsApproving(true);\n try {\n const targetChain = Number(\n routeResult?.txReq?.chainId ??\n selectedChain?.chainId ??\n selectedChain?.id\n );\n if (Number.isFinite(targetChain)) {\n const current = await wallet.getChainId();\n if (current !== targetChain) {\n try {\n await wallet.switchChain(targetChain);\n } catch {\n // If user cancels, the send below will fail and surface error.\n }\n }\n }\n\n const data = encodeFunctionData({\n abi: erc20Abi,\n functionName: \"approve\",\n args: [spender, amountWei],\n });\n\n let hash: `0x${string}`;\n if (wallet.type === \"eip1193\") {\n const from = await wallet.getAddress();\n const params: Record<string, unknown> = {\n from,\n to: selectedToken.address as `0x${string}`,\n data,\n value: \"0x0\",\n };\n if (Number.isFinite(targetChain)) {\n params.chainId = `0x${targetChain.toString(16)}`;\n }\n hash = (await wallet.request({\n method: \"eth_sendTransaction\",\n params: [params],\n })) as `0x${string}`;\n } else {\n const resp = await wallet.sendTransaction({\n to: selectedToken.address as `0x${string}`,\n data,\n value: 0n,\n chainId: Number.isFinite(targetChain) ? targetChain : undefined,\n });\n hash = resp.hash;\n }\n\n if (client) {\n await client.waitForTransactionReceipt({ hash });\n await readAllowance();\n } else {\n setAllowanceWei(amountWei);\n }\n //toast.success(\"Approval confirmed\", \"You can now confirm the transfer.\");\n } catch {\n // Approval failed — user can retry\n } finally {\n setIsApproving(false);\n }\n }, [\n amountWei,\n client,\n isApproving,\n readAllowance,\n routeResult?.txReq?.chainId,\n selectedChain?.chainId,\n selectedChain?.id,\n selectedToken?.address,\n spender,\n walletAddress,\n ]);\n\n const estimateGasReservationWei = useCallback(async () => {\n if (!isNativeSelected) {\n setGasReservationWei(0n);\n return 0n;\n }\n // if (!routeResult?.txReq?.data || !client || !walletAddress) {\n // setGasReservationWei(0n);\n // return 0n;\n // }\n\n let gasLimit: bigint | undefined;\n let effectiveGasPrice: bigint | undefined;\n\n // const txReq =\n // routeResult?. === \"ready\" ? routeResult.txReq : undefined;\n const txReq = routeResult?.txReq;\n const txTo = txReq?.to ?? txReq?.target;\n const fromAccount = walletAddress as `0x${string}` | undefined;\n\n // Skip reservation if route doesn't provide essential fields or pricing\n if (\n !txReq?.gasLimit ||\n txReq?.value == null ||\n (!txReq?.maxFeePerGas && !txReq?.gasPrice)\n ) {\n setGasReservationWei(0n);\n return 0n;\n }\n\n if (\n chainTypeNormalized === \"evm\" &&\n txReq?.data &&\n txTo &&\n client &&\n fromAccount\n ) {\n try {\n const request = {\n account: fromAccount,\n to: txTo as `0x${string}`,\n data: txReq.data as `0x${string}`,\n value: txReq.value ? BigInt(txReq.value) : undefined,\n };\n gasLimit = await client.estimateGas(request);\n } catch {\n gasLimit = undefined;\n }\n\n try {\n const now = Date.now();\n const cache = gasPriceCacheRef.current;\n const cacheTtlMs = 15000;\n\n const getCachedGasPrice = async () => {\n if (cache.value && cache.ts && now - cache.ts < cacheTtlMs) {\n return cache.value;\n }\n if (!cache.inflight) {\n cache.inflight = client\n .getGasPrice()\n .then((price) => {\n cache.value = price;\n cache.ts = Date.now();\n return price;\n })\n .finally(() => {\n cache.inflight = undefined;\n });\n }\n return cache.inflight;\n };\n\n effectiveGasPrice = txReq.maxFeePerGas\n ? BigInt(txReq.maxFeePerGas)\n : txReq.gasPrice\n ? BigInt(txReq.gasPrice)\n : await getCachedGasPrice();\n } catch {\n const cached = gasPriceCacheRef.current.value;\n effectiveGasPrice = cached ?? undefined;\n }\n }\n\n // fallback: try route/provider gas metadata when available\n if (!gasLimit) {\n try {\n gasLimit = txReq?.gasLimit ? BigInt(txReq.gasLimit) : undefined;\n } catch {\n gasLimit = undefined;\n }\n }\n if (!effectiveGasPrice) {\n try {\n effectiveGasPrice = txReq?.maxFeePerGas\n ? BigInt(txReq.maxFeePerGas)\n : undefined;\n } catch {\n effectiveGasPrice = undefined;\n }\n }\n\n if (!gasLimit || !effectiveGasPrice) {\n setGasReservationWei(0n);\n return 0n;\n }\n\n const reservedWei = divRoundDown(gasLimit * effectiveGasPrice * 12n, 10n);\n // console.log({ reservedWei });\n setGasReservationWei(reservedWei);\n return reservedWei;\n }, [\n chainTypeNormalized,\n client,\n isNativeSelected,\n routeResult?.txReq,\n walletAddress,\n ]);\n\n useEffect(() => {\n if (routeResult) {\n estimateGasReservationWei().then(() => {});\n }\n }, [estimateGasReservationWei, routeResult]);\n\n const parsedAmount = parseFloat(fixedFromAmountString ?? amount) || 0;\n\n const normalizedTokenBalance = useMemo(() => {\n if (!selectedToken?.balance) return 0;\n const normalized = Number(\n rawToDecimal(selectedToken.balance, selectedToken.decimals ?? 18)\n );\n return Number.isFinite(normalized) ? normalized : 0;\n }, [selectedToken?.balance, selectedToken?.decimals]);\n\n const maxTokenAmount = useMemo(() => {\n const walletMax = Math.min(normalizedTokenBalance, 10000);\n if (maxAmountUsd == null || !hasUsdPrice || tokenPriceUSD <= 0) {\n return walletMax;\n }\n const maxFromUsd = maxAmountUsd / tokenPriceUSD;\n return Math.min(walletMax, maxFromUsd);\n }, [hasUsdPrice, maxAmountUsd, normalizedTokenBalance, tokenPriceUSD]);\n\n const maxUsdAmount = useMemo(() => {\n if (!hasUsdPrice) return undefined;\n const walletMaxUsd = Math.min(maxTokenAmount * tokenPriceUSD, 10000);\n if (maxAmountUsd == null) return walletMaxUsd;\n return Math.min(walletMaxUsd, maxAmountUsd);\n }, [hasUsdPrice, maxAmountUsd, maxTokenAmount, tokenPriceUSD]);\n\n const minAmountForMode = useMemo(() => {\n if (minAmountUsd == null) return 0;\n if (amountInputMode === \"usd\") {\n return minAmountUsd;\n }\n if (!hasUsdPrice || tokenPriceUSD <= 0) return 0;\n return minAmountUsd / tokenPriceUSD;\n }, [amountInputMode, hasUsdPrice, minAmountUsd, tokenPriceUSD]);\n\n const sliderMax = amountInputMode === \"usd\" ? maxUsdAmount : maxTokenAmount;\n\n /**\n * Handle amount input changes with decimal sanitization\n */\n const handleAmountChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (isFixedAmount) return;\n const sanitized = sanitizeAmountInput(e.target.value);\n if (amountInputMode === \"usd\") {\n const clamped = clampUsdAmount(sanitized, minAmountUsd, maxAmountUsd);\n setAmount(clamped);\n return;\n }\n setAmount(sanitized);\n };\n\n /**\n * Handle click on the amount display to start editing\n */\n const handleAmountClick = () => {\n if (isFixedAmount) return;\n const isZeroish = !amount || parseFloat(amount) === 0;\n setIsEditing(true);\n if (isZeroish) setAmount(\"\");\n\n setTimeout(() => {\n const input = amountInputRef.current;\n if (!input) return;\n input.focus();\n input.setSelectionRange(0, 0);\n }, 0);\n };\n\n /**\n * Handle slider value change\n */\n const handleSliderChange = (value: number) => {\n if (isFixedAmount) return;\n setAmount(value.toString());\n };\n\n /**\n * Handle token change from TokenSwipePill\n */\n const handleTokenChange = useCallback(\n async (token: typeof selectedToken) => {\n if (token) {\n setSelectedToken(token);\n setSelectedChain((token as YourTokenData).chainData as Chain);\n }\n },\n [setSelectedChain, setSelectedToken]\n );\n\n /**\n * Handle expand click to navigate to token selection\n */\n const handleExpandTokens = () => {\n setCurrentStep(\"select-token\");\n };\n\n /**\n * Handle swipe confirmation - submit transaction to wallet\n */\n const handleConfirm = useCallback(async () => {\n if (!routeResult) {\n // No route result available, show error\n return;\n }\n\n // Submit the transaction to the wallet for signing\n // The hook handles all state updates (confirming -> processing or error)\n await submitTransaction(routeResult);\n }, [routeResult, submitTransaction]);\n\n const handleSwipeConfirm = useCallback(async () => {\n if (needsApproval) {\n await handleApproveExact();\n return;\n }\n await handleConfirm();\n }, [handleApproveExact, handleConfirm, needsApproval]);\n\n const orderedTokens = useMemo(() => {\n const index = yourWalletTokens.findIndex(\n (t) => t.address?.toLowerCase() === selectedToken?.address?.toLowerCase()\n );\n\n let _tok: YourTokenData[] = [];\n\n if (index === -1) {\n const appended = [...yourWalletTokens];\n if (selectedToken) {\n appended.push(selectedToken as YourTokenData);\n }\n _tok = appended;\n } else {\n _tok = [\n ...yourWalletTokens.slice(index),\n ...yourWalletTokens.slice(0, index),\n ];\n }\n\n const normalizedTokens = _tok.filter(\n (t) => !!t && t.balance != null && t.decimals != null\n );\n\n if (!amount?.trim()) return normalizedTokens;\n\n const parsedAmount = Number(amount.trim());\n if (!Number.isFinite(parsedAmount) || parsedAmount <= 0) {\n return normalizedTokens;\n }\n\n let result: YourTokenData[];\n\n if (amountInputMode === \"usd\") {\n const filteredTks = normalizedTokens.filter((t) => {\n const tokenPriceUSD =\n typeof t?.usdPrice === \"number\" &&\n Number.isFinite(t.usdPrice) &&\n t.usdPrice > 0\n ? t.usdPrice\n : 0;\n\n if (tokenPriceUSD <= 0) return false;\n\n const tokenBal = Number(formatTokenBalance(t.balance, t.decimals));\n const tokenUsdBal = tokenBal * tokenPriceUSD;\n\n return Number.isFinite(tokenUsdBal) && tokenUsdBal >= parsedAmount;\n });\n\n result =\n filteredTks.length > 0\n ? filteredTks\n : normalizedTokens.filter(\n (t) => Number(formatTokenBalance(t.balance, t.decimals)) > 0\n );\n } else {\n const filteredTks = normalizedTokens.filter((t) => {\n const tokenBal = Number(formatTokenBalance(t.balance, t.decimals));\n return Number.isFinite(tokenBal) && tokenBal >= parsedAmount;\n });\n\n result =\n filteredTks.length > 0\n ? filteredTks\n : normalizedTokens.filter(\n (t) => Number(formatTokenBalance(t.balance, t.decimals)) > 0\n );\n }\n\n const isFound = result.find(\n (t) =>\n t.symbol?.toLowerCase() === selectedToken?.symbol?.toLowerCase() &&\n t?.chainData?.chainId.toString() ===\n (selectedToken as YourTokenData)?.chainData?.chainId.toString()\n );\n\n if (!isFound && result.length) {\n setSelectedToken(result[0]);\n setSelectedChain(result[0].chainData as Chain);\n }\n\n return result;\n }, [\n yourWalletTokens,\n amountInputMode,\n amount,\n selectedToken,\n setSelectedToken,\n setSelectedChain,\n ]);\n\n const isWalletConnected = walletStatus === \"connected\";\n const canSwipe =\n parsedAmount > 0 &&\n selectedToken &&\n isWalletConnected &&\n !isLoadingRoute &&\n !isSubmitting &&\n !!routeResult &&\n !isApproving &&\n !isReadingAllowance;\n\n return (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n minHeight: \"500px\",\n // ...style,\n }}\n >\n {/* Header */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n padding: `${spacing[4]} ${spacing[4]}`,\n borderBottom: `1px solid ${colors.border}`,\n ...style,\n }}\n >\n <button\n type=\"button\"\n onClick={goBack}\n style={{\n padding: spacing[1],\n marginRight: spacing[2],\n borderRadius: borderRadius.lg,\n transition: \"background-color 0.2s\",\n backgroundColor: \"transparent\",\n border: 0,\n cursor: \"pointer\",\n }}\n aria-label=\"Go back\"\n >\n <svg\n style={{\n width: \"1.25rem\",\n height: \"1.25rem\",\n color: colors.foreground,\n }}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M15 19l-7-7 7-7\"\n />\n </svg>\n </button>\n <h1\n style={{\n flex: 1,\n fontSize: fontSize.lg,\n fontWeight: fontWeight.semibold,\n color: colors.foreground,\n textAlign: \"center\",\n marginRight: \"1.75rem\",\n }}\n >\n Confirm Deposit\n </h1>\n </div>\n\n {isReady ? (\n <>\n {/* Content */}\n <div\n style={{\n flex: 1,\n padding: `0 ${spacing[6]}`,\n overflowY: \"auto\",\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n }}\n >\n {/* Enter Amount Label */}\n <p\n style={{\n fontSize: fontSize.base,\n color: colors.mutedForeground,\n marginBottom: spacing[4],\n marginTop: spacing[4],\n }}\n >\n Enter an amount\n </p>\n\n {/* Large Amount Display */}\n <div\n style={{\n textAlign: \"center\",\n position: \"relative\",\n marginBottom: spacing[4],\n }}\n >\n <span\n style={{\n fontSize: \"3.75rem\",\n fontWeight: fontWeight.bold,\n letterSpacing: \"-0.025em\",\n cursor: isFixedAmount ? \"default\" : \"pointer\",\n }}\n onClick={handleAmountClick}\n >\n <span\n style={{\n color: colors.foreground,\n }}\n >\n {amountInputMode === \"usd\" ? \"$\" : \"\"}\n </span>\n <span\n style={{\n position: \"relative\",\n display: \"inline-block\",\n minWidth: \"1ch\",\n }}\n >\n <span\n style={{\n color:\n parsedAmount > 0\n ? colors.foreground\n : \"rgba(161, 161, 170, 0.4)\",\n }}\n >\n {isEditing\n ? amount || \"0\"\n : parsedAmount > 0\n ? parsedAmount.toLocaleString(undefined, {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n })\n : \"0\"}\n </span>\n {!isEditing && parsedAmount === 0 && (\n <span style={{ color: \"rgba(161, 161, 170, 0.4)\" }}>\n .00\n </span>\n )}\n <input\n // ref={amountInputRef}\n type=\"text\"\n inputMode=\"decimal\"\n value={amount}\n onChange={handleAmountChange}\n onBlur={() => setIsEditing(false)}\n readOnly={isFixedAmount}\n style={{\n position: \"absolute\",\n inset: 0,\n width: \"100%\",\n backgroundColor: \"transparent\",\n border: \"none\",\n outline: \"none\",\n padding: 0,\n margin: 0,\n textAlign: \"center\",\n color: \"transparent\",\n fontSize: \"3.75rem\",\n fontWeight: fontWeight.bold,\n letterSpacing: \"-0.025em\",\n caretColor: \"hsl(var(--tw-muted-foreground) / 0.5)\",\n }}\n aria-label=\"Deposit amount\"\n />\n </span>\n {amountInputMode === \"token\" && selectedToken?.symbol && (\n <span\n style={{\n marginLeft: spacing[2],\n fontSize: fontSize.lg,\n fontWeight: fontWeight.semibold,\n color: colors.mutedForeground,\n }}\n >\n {selectedToken.symbol}\n </span>\n )}\n </span>\n </div>\n\n {/* Token / USD Conversion */}\n {selectedToken && (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: spacing[2],\n marginTop: spacing[2],\n }}\n >\n <span\n style={{\n fontSize: fontSize.lg,\n color: colors.mutedForeground,\n }}\n >\n {amountInputMode === \"usd\" ? (\n <>\n {Number(amountComputation.tokenAmount ?? 0) > 0\n ? parseFloat(\n (amountComputation.tokenAmount ?? 0).toString()\n ).toLocaleString(undefined, {\n maximumFractionDigits: 5,\n })\n : \"0\"}{\" \"}\n {selectedToken.symbol}\n </>\n ) : (\n <>\n {hasUsdPrice &&\n Number(amountComputation.usdAmount ?? 0) > 0\n ? `$${parseFloat(\n (amountComputation.usdAmount ?? 0).toString()\n ).toLocaleString(undefined, {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n })}`\n : \"USD pricing unavailable\"}\n </>\n )}\n </span>\n <svg\n style={{\n width: \"1rem\",\n height: \"1rem\",\n color: colors.mutedForeground,\n cursor: isFixedAmount ? \"not-allowed\" : \"pointer\",\n }}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n onClick={() => {\n if (isFixedAmount) return;\n setAmountInputMode((mode) =>\n mode === \"usd\" ? \"token\" : \"usd\"\n );\n }}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M7 16V4m0 0L3 8m4-4l4 4m6 0v12m0 0l4-4m-4 4l-4-4\"\n />\n </svg>\n </div>\n )}\n\n {/* Balance + Max Button */}\n {selectedToken?.balance && (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: spacing[3],\n marginTop: spacing[2],\n }}\n >\n <span\n style={{\n fontSize: fontSize.sm,\n fontWeight: fontWeight.semibold,\n color: colors.primary,\n }}\n >\n {amountInputMode === \"usd\" && hasUsdPrice\n ? `Balance ($) ${(\n normalizedTokenBalance * tokenPriceUSD\n ).toLocaleString(undefined, {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n })}`\n : `Balance (${selectedToken.symbol}) ${normalizedTokenBalance.toLocaleString(\n undefined,\n {\n maximumFractionDigits: 6,\n }\n )}`}\n </span>\n <button\n type=\"button\"\n onClick={() => handleSliderChange(sliderMax ?? 0)}\n disabled={isFixedAmount}\n style={{\n padding: `${spacing[1]} ${spacing[3]}`,\n fontSize: fontSize.xs,\n fontWeight: fontWeight.medium,\n color: colors.mutedForeground,\n backgroundColor: colors.muted,\n borderRadius: \"9999px\",\n transition: \"background-color 0.2s\",\n border: 0,\n cursor: isFixedAmount ? \"not-allowed\" : \"pointer\",\n }}\n >\n Max\n </button>\n </div>\n )}\n\n {/* Token Swipe Pill */}\n {selectedToken && yourWalletTokens.length > 0 && (\n <div\n style={{\n marginTop: spacing[6],\n display: \"flex\",\n flexDirection: \"column\",\n gap: spacing[3],\n }}\n >\n <TokenSwipePill\n tokens={orderedTokens}\n selectedToken={selectedToken}\n onTokenChange={handleTokenChange}\n onExpandClick={handleExpandTokens}\n selectedChain={selectedChain as Chain}\n walletAddress={walletAddress}\n />\n </div>\n )}\n\n {/* Amount Slider */}\n {selectedToken && sliderMax !== undefined && (\n <div\n style={{\n width: \"100%\",\n marginTop: spacing[8],\n padding: `0 ${spacing[2]}`,\n }}\n >\n <p\n style={{\n fontSize: fontSize.xs,\n color: colors.mutedForeground,\n marginBottom: spacing[2],\n textAlign: \"center\",\n }}\n >\n Slider unit:{\" \"}\n {amountInputMode === \"usd\" ? \"$ USD\" : selectedToken.symbol}\n </p>\n <AmountSlider\n value={parsedAmount}\n onChange={handleSliderChange}\n max={sliderMax}\n min={minAmountForMode}\n disabled={!selectedToken || isFixedAmount}\n />\n </div>\n )}\n\n {/* Fee Summary */}\n {SHOW_FEE_SUMMARY && (\n <div\n style={{\n width: \"100%\",\n marginTop: spacing[6],\n padding: spacing[4],\n borderRadius: borderRadius.xl,\n backgroundColor: \"rgba(63, 63, 70, 0.5)\",\n }}\n >\n {isLoadingRoute ? (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: `${spacing[2]} 0`,\n }}\n >\n <svg\n style={{\n width: \"1.25rem\",\n height: \"1.25rem\",\n color: colors.mutedForeground,\n }}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n className=\"tw-animate-spin\"\n >\n <circle\n style={{ opacity: 0.25 }}\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n />\n <path\n style={{ opacity: 0.75 }}\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n />\n </svg>\n <span\n style={{\n marginLeft: spacing[2],\n fontSize: fontSize.sm,\n color: colors.mutedForeground,\n }}\n >\n Calculating fees...\n </span>\n </div>\n ) : !amount?.trim() ? (\n <div\n style={{\n textAlign: \"center\",\n padding: `${spacing[2]} 0`,\n }}\n >\n <p\n style={{\n fontSize: fontSize.base,\n color: colors.mutedForeground,\n }}\n >\n {/* {routeError} */}\n Enter an amount to continue.\n </p>\n </div>\n ) : (\n <>\n {/* Network Fee */}\n <div\n style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n fontSize: fontSize.sm,\n }}\n >\n <span\n style={{\n color: colors.mutedForeground,\n }}\n >\n Network fee\n </span>\n\n <span\n style={{\n fontWeight: fontWeight.medium,\n color: colors.foreground,\n }}\n >\n {/* {networkFees ? `$${networkFees}` : \"—\"} */}\n {weiToDecimalString(\n gasReservationWei,\n selectedToken?.decimals as number,\n 6\n )}{\" \"}\n {/* ({selectedToken?.symbol}){gasFeeDisplay} */}\n </span>\n </div>\n\n {/* Divider */}\n <div\n style={{\n height: \"1px\",\n backgroundColor: colors.border,\n margin: `${spacing[2]} 0`,\n }}\n />\n\n {/* You'll receive */}\n <div\n style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n }}\n >\n <span\n style={{\n color: colors.mutedForeground,\n fontSize: fontSize.sm,\n }}\n >\n You&apos;ll receive\n </span>\n <span\n style={{\n fontWeight: fontWeight.semibold,\n color: colors.foreground,\n }}\n >\n {estimatedReceive\n ? `~$${parseFloat(estimatedReceive).toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`\n : parsedAmount > 0\n ? `~$${(parsedAmount * 0.99).toFixed(2)}`\n : \"—\"}\n </span>\n </div>\n </>\n )}\n </div>\n )}\n </div>\n\n {/* Bottom Action - Swipe to Confirm */}\n <div\n style={{\n padding: `${spacing[4]} ${spacing[6]}`,\n }}\n >\n {selectedToken !== null &&\n (selectedToken as YourTokenData).chainData !== undefined && (\n <SwipeToConfirmTokens\n text={\n routeError\n ? routeError\n : !isWalletConnected\n ? \"Connect your wallet to deposit\"\n : isApproving\n ? \"Approving...\"\n : isReadingAllowance\n ? \"Checking allowance...\"\n : needsApproval\n ? \"Swipe to approve\"\n : \"Swipe to confirm\"\n }\n fromToken={selectedToken}\n toTokenSymbol={destinationConfig?.toToken || \"USDC\"}\n toChainName={destinationConfig?.toChain || \"Base\"}\n fromChainName={selectedChain?.networkName || \"Unknown Chain\"}\n dappName={destinationConfig?.dappName || \"Example DApp\"}\n onConfirm={handleSwipeConfirm}\n disabled={!canSwipe}\n isWalletConnected={isWalletConnected}\n />\n )}\n </div>\n\n {/* Footer */}\n <div\n style={{\n padding: `${spacing[4]} ${spacing[6]}`,\n borderTop: `1px solid rgba(63, 63, 70, 0.3)`,\n }}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: spacing[2],\n }}\n >\n <svg\n style={{\n width: \"0.875rem\",\n height: \"0.875rem\",\n color: colors.mutedForeground,\n }}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z\"\n />\n </svg>\n <span\n style={{\n fontSize: fontSize.sm,\n color: colors.mutedForeground,\n }}\n >\n Secured by{\" \"}\n <span\n style={{\n fontWeight: fontWeight.semibold,\n color: colors.foreground,\n }}\n >\n Trustware\n </span>\n </span>\n </div>\n </div>\n </>\n ) : (\n <div\n style={{\n display: \"flex\",\n flex: 1,\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n <LoadingSkeleton />\n </div>\n )}\n </div>\n );\n}\n\nexport default CryptoPay;\n","import { TrustwareErrorCode } from \"./errorCodes\";\n\nexport class TrustwareError extends Error {\n code: TrustwareErrorCode;\n userMessage?: string;\n cause?: unknown;\n\n constructor(params: {\n code: TrustwareErrorCode;\n message: string;\n userMessage?: string;\n cause?: unknown;\n }) {\n super(params.message);\n\n this.name = \"TrustwareError\";\n this.code = params.code;\n this.userMessage = params.userMessage;\n this.cause = params.cause;\n }\n\n toJSON() {\n return {\n name: this.name,\n code: this.code,\n message: this.message,\n userMessage: this.userMessage,\n };\n }\n}\n","import React, { useEffect, useMemo, useRef } from \"react\";\nimport { colors, spacing, fontSize, fontWeight, borderRadius } from \"../styles\";\nimport { useDeposit, type TransactionStatus } from \"../context/DepositContext\";\nimport { useTransactionPolling } from \"../hooks\";\nimport { CircularProgress, TransactionSteps } from \"../components\";\n\nexport interface ProcessingProps {\n /** Additional inline styles */\n style?: React.CSSProperties;\n}\n\n/**\n * Maps transaction status to a progress percentage\n */\nfunction getProgressFromStatus(status: TransactionStatus): number {\n switch (status) {\n case \"confirming\":\n return 15;\n case \"processing\":\n return 40;\n case \"bridging\":\n return 75;\n case \"success\":\n return 100;\n case \"error\":\n return 0;\n default:\n return 0;\n }\n}\n\n/**\n * Gets the step text to display based on transaction status\n */\nfunction getStepText(status: TransactionStatus): string {\n switch (status) {\n case \"confirming\":\n return \"Waiting for wallet confirmation...\";\n case \"processing\":\n return \"Processing transaction on network...\";\n case \"bridging\":\n return \"Bridging assets to destination chain...\";\n case \"success\":\n return \"Transaction complete!\";\n case \"error\":\n return \"Transaction failed\";\n default:\n return \"Initializing...\";\n }\n}\n\n/**\n * Truncates a transaction hash for display\n */\nfunction truncateHash(hash: string): string {\n if (hash.length <= 16) return hash;\n return `${hash.slice(0, 8)}...${hash.slice(-6)}`;\n}\n\n/**\n * Processing page component.\n * Displays real-time progress of a transaction based on actual status from the API.\n * Shows circular progress animation and step indicators.\n */\nexport function Processing({ style }: ProcessingProps): React.ReactElement {\n const {\n transactionStatus,\n transactionHash,\n selectedToken,\n selectedChain,\n amount,\n resetState,\n setCurrentStep,\n intentId,\n } = useDeposit();\n\n // Get transaction details from polling hook\n const { transaction, startPolling, isPolling } = useTransactionPolling();\n\n // Track if we've already started polling to avoid duplicate calls\n const hasStartedPolling = useRef(false);\n\n // Reset hasStartedPolling on unmount (needed for React StrictMode compatibility)\n useEffect(() => {\n return () => {\n hasStartedPolling.current = false;\n };\n }, []);\n\n // Start polling when we have intentId and transactionHash\n useEffect(() => {\n if (\n intentId &&\n transactionHash &&\n !isPolling &&\n !hasStartedPolling.current &&\n transactionStatus !== \"success\" &&\n transactionStatus !== \"error\"\n ) {\n hasStartedPolling.current = true;\n startPolling(intentId, transactionHash);\n }\n }, [intentId, transactionHash, isPolling, transactionStatus, startPolling]);\n\n // Calculate progress based on actual status\n const progress = useMemo(\n () => getProgressFromStatus(transactionStatus),\n [transactionStatus]\n );\n\n // Get current step text\n const stepText = useMemo(\n () => getStepText(transactionStatus),\n [transactionStatus]\n );\n\n // Get block explorer URL from transaction data or construct fallback\n const explorerUrl = useMemo(() => {\n // Prefer the URL from the API response\n if (transaction?.fromChainTxUrl) {\n return transaction.fromChainTxUrl;\n }\n // Fallback: construct URL based on chain if we have a hash\n if (transactionHash && selectedChain?.blockExplorerUrls?.length) {\n return `${selectedChain.blockExplorerUrls[0].replace(/\\/+$/, \"\")}/tx/${transactionHash}`;\n }\n return null;\n }, [transaction, transactionHash, selectedChain]);\n\n // Parse amount for display\n const parsedAmount = parseFloat(amount) || 0;\n\n /**\n * Handle close/done button click\n */\n const handleClose = () => {\n resetState();\n };\n\n /**\n * Navigate to error page if transaction failed\n */\n const handleViewError = () => {\n setCurrentStep(\"error\");\n };\n\n // Determine if we should show indeterminate spinner\n const isIndeterminate =\n transactionStatus === \"confirming\" || transactionStatus === \"idle\";\n\n // Determine header title based on status\n const headerTitle =\n transactionStatus === \"success\"\n ? \"Complete\"\n : transactionStatus === \"error\"\n ? \"Failed\"\n : \"Processing\";\n\n return (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n minHeight: \"500px\",\n ...style,\n }}\n >\n {/* Header */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n padding: `${spacing[4]} ${spacing[4]}`,\n borderBottom: `1px solid ${colors.border}`,\n }}\n >\n <div\n style={{\n width: \"2.5rem\",\n }}\n />\n <h1\n style={{\n fontSize: fontSize.lg,\n fontWeight: fontWeight.semibold,\n color: colors.foreground,\n }}\n >\n {headerTitle}\n </h1>\n <button\n type=\"button\"\n onClick={handleClose}\n style={{\n width: \"2.5rem\",\n height: \"2.5rem\",\n borderRadius: \"9999px\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n transition: \"background-color 0.2s\",\n border: 0,\n backgroundColor: \"transparent\",\n cursor: \"pointer\",\n }}\n aria-label=\"Close\"\n >\n <svg\n style={{\n width: \"1.25rem\",\n height: \"1.25rem\",\n color: colors.foreground,\n }}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n </button>\n </div>\n\n {/* Content */}\n <div\n style={{\n flex: 1,\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: `${spacing[8]} ${spacing[6]}`,\n }}\n >\n {/* Progress Circle */}\n <div\n style={{\n marginBottom: spacing[6],\n }}\n >\n <CircularProgress\n progress={progress}\n size={120}\n strokeWidth={8}\n showPercentage={!isIndeterminate}\n isIndeterminate={isIndeterminate}\n />\n </div>\n\n {/* Current Step Text */}\n <p\n style={{\n fontSize: fontSize.lg,\n fontWeight: fontWeight.medium,\n color: colors.foreground,\n textAlign: \"center\",\n marginBottom: spacing[2],\n }}\n >\n {stepText}\n </p>\n\n {/* Amount Display */}\n {selectedToken && parsedAmount > 0 && (\n <p\n style={{\n fontSize: fontSize.sm,\n color: colors.mutedForeground,\n textAlign: \"center\",\n marginBottom: spacing[6],\n }}\n >\n ${parsedAmount.toFixed(2)} {selectedToken.symbol}\n </p>\n )}\n\n {/* Transaction Steps */}\n <TransactionSteps\n transactionStatus={transactionStatus}\n style={{\n width: \"100%\",\n maxWidth: \"20rem\",\n marginBottom: spacing[6],\n }}\n />\n\n {/* Transaction Hash Link */}\n {transactionHash && (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: spacing[2],\n fontSize: fontSize.sm,\n }}\n >\n <span\n style={{\n color: colors.mutedForeground,\n }}\n >\n Transaction:\n </span>\n {explorerUrl ? (\n <a\n href={explorerUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: spacing[1],\n color: colors.primary,\n textDecoration: \"none\",\n }}\n >\n <span\n style={{\n fontFamily: \"monospace\",\n }}\n >\n {truncateHash(transactionHash)}\n </span>\n <svg\n style={{\n width: \"0.875rem\",\n height: \"0.875rem\",\n }}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14\"\n />\n </svg>\n </a>\n ) : (\n <span\n style={{\n fontFamily: \"monospace\",\n color: colors.foreground,\n }}\n >\n {truncateHash(transactionHash)}\n </span>\n )}\n </div>\n )}\n\n {/* Error State Action */}\n {transactionStatus === \"error\" && (\n <button\n type=\"button\"\n onClick={handleViewError}\n style={{\n marginTop: spacing[4],\n padding: `${spacing[2]} ${spacing[6]}`,\n borderRadius: borderRadius.xl,\n backgroundColor: colors.destructive,\n color: colors.destructiveForeground,\n fontWeight: fontWeight.medium,\n transition: \"background-color 0.2s\",\n border: 0,\n cursor: \"pointer\",\n }}\n >\n View Details\n </button>\n )}\n </div>\n\n {/* Footer */}\n <div\n style={{\n padding: `${spacing[4]} ${spacing[6]}`,\n borderTop: `1px solid rgba(63, 63, 70, 0.3)`,\n }}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: spacing[2],\n }}\n >\n <svg\n style={{\n width: \"0.875rem\",\n height: \"0.875rem\",\n color: colors.mutedForeground,\n }}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z\"\n />\n </svg>\n <span\n style={{\n fontSize: fontSize.sm,\n color: colors.mutedForeground,\n }}\n >\n Secured by{\" \"}\n <span\n style={{\n fontWeight: fontWeight.semibold,\n color: colors.foreground,\n }}\n >\n Trustware\n </span>\n </span>\n </div>\n </div>\n </div>\n );\n}\n\nexport default Processing;\n","import React, { lazy, Suspense, useMemo } from \"react\";\nimport { colors, spacing, fontSize, fontWeight, borderRadius } from \"../styles\";\nimport { useDeposit } from \"../context/DepositContext\";\nimport { useTransactionPolling } from \"../hooks\";\n\n// Lazy load the ConfettiEffect to reduce initial bundle size\nconst ConfettiEffect = lazy(() => import(\"../components/ConfettiEffect\"));\n\nexport interface SuccessProps {\n /** Additional inline styles */\n style?: React.CSSProperties;\n}\n\n/**\n * Truncates a transaction hash for display\n */\nfunction truncateHash(hash: string): string {\n if (hash.length <= 16) return hash;\n return `${hash.slice(0, 8)}...${hash.slice(-6)}`;\n}\n\n/**\n * Success page component.\n * Displays a celebratory success screen with confetti when the deposit completes.\n */\nexport function Success({ style }: SuccessProps): React.ReactElement {\n const { transactionHash, selectedToken, selectedChain, amount, resetState } =\n useDeposit();\n\n // Get transaction details for explorer URL\n const { transaction } = useTransactionPolling();\n\n // Parse amount for display\n const parsedAmount = useMemo(() => parseFloat(amount) || 0, [amount]);\n\n // Get block explorer URL from transaction data or construct fallback\n const explorerUrl = useMemo(() => {\n // Prefer the destination chain URL if bridging completed\n if (transaction?.toChainTxUrl) {\n return transaction.toChainTxUrl;\n }\n // Fall back to source chain URL\n if (transaction?.fromChainTxUrl) {\n return transaction.fromChainTxUrl;\n }\n // Last fallback: construct URL based on chain if we have a hash\n if (transactionHash && selectedChain?.blockExplorerUrls?.length) {\n return `${selectedChain.blockExplorerUrls[0].replace(/\\/+$/, \"\")}/tx/${transactionHash}`;\n }\n return null;\n }, [transaction, transactionHash, selectedChain]);\n\n /**\n * Handle Done button click - reset state and return to home\n */\n const handleDone = () => {\n resetState();\n };\n\n return (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n minHeight: \"500px\",\n ...style,\n }}\n >\n {/* Confetti effect - lazy loaded */}\n <Suspense fallback={null}>\n <ConfettiEffect isActive={true} pieceCount={60} clearDelay={4000} />\n </Suspense>\n\n {/* Header */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: `${spacing[4]} ${spacing[4]}`,\n borderBottom: `1px solid ${colors.border}`,\n }}\n >\n <h1\n style={{\n fontSize: fontSize.lg,\n fontWeight: fontWeight.semibold,\n color: colors.foreground,\n }}\n >\n Deposit Complete\n </h1>\n </div>\n\n {/* Content */}\n <div\n style={{\n flex: 1,\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: `${spacing[8]} ${spacing[6]}`,\n }}\n >\n {/* Success Icon */}\n <div\n style={{\n width: \"5rem\",\n height: \"5rem\",\n borderRadius: \"9999px\",\n backgroundColor: \"rgba(34, 197, 94, 0.1)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n marginBottom: spacing[6],\n }}\n >\n <svg\n style={{\n width: \"2.5rem\",\n height: \"2.5rem\",\n color: colors.green[500],\n }}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2.5}\n aria-hidden=\"true\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M5 13l4 4L19 7\"\n />\n </svg>\n </div>\n\n {/* Success Message */}\n <h2\n style={{\n fontSize: fontSize[\"2xl\"],\n fontWeight: fontWeight.bold,\n color: colors.foreground,\n textAlign: \"center\",\n marginBottom: spacing[2],\n }}\n >\n Success!\n </h2>\n <p\n style={{\n color: colors.mutedForeground,\n textAlign: \"center\",\n marginBottom: spacing[6],\n }}\n >\n Your deposit has been completed successfully.\n </p>\n\n {/* Deposited Amount */}\n {selectedToken && parsedAmount > 0 && (\n <div\n style={{\n backgroundColor: \"rgba(63, 63, 70, 0.5)\",\n borderRadius: borderRadius.xl,\n padding: `${spacing[4]} ${spacing[6]}`,\n marginBottom: spacing[6],\n textAlign: \"center\",\n }}\n >\n <p\n style={{\n fontSize: fontSize.sm,\n color: colors.mutedForeground,\n marginBottom: spacing[1],\n }}\n >\n Amount Deposited\n </p>\n <p\n style={{\n fontSize: fontSize[\"3xl\"],\n fontWeight: fontWeight.bold,\n color: colors.foreground,\n }}\n >\n $\n {parsedAmount.toLocaleString(undefined, {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n })}\n </p>\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: spacing[2],\n marginTop: spacing[2],\n }}\n >\n {selectedToken.iconUrl && (\n <img\n src={selectedToken.iconUrl}\n alt=\"\"\n style={{\n width: \"1.25rem\",\n height: \"1.25rem\",\n borderRadius: \"9999px\",\n }}\n />\n )}\n <span\n style={{\n fontSize: fontSize.sm,\n color: colors.mutedForeground,\n }}\n >\n {selectedToken.symbol}\n {selectedChain && ` on ${selectedChain.networkName}`}\n </span>\n </div>\n </div>\n )}\n\n {/* Transaction Hash Link */}\n {transactionHash && (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n gap: spacing[1],\n marginBottom: spacing[8],\n }}\n >\n <span\n style={{\n fontSize: fontSize.sm,\n color: colors.mutedForeground,\n }}\n >\n Transaction ID\n </span>\n {explorerUrl ? (\n <a\n href={explorerUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: spacing[1.5],\n color: colors.primary,\n textDecoration: \"none\",\n }}\n >\n <span\n style={{\n fontFamily: \"monospace\",\n fontSize: fontSize.sm,\n }}\n >\n {truncateHash(transactionHash)}\n </span>\n <svg\n style={{\n width: \"0.875rem\",\n height: \"0.875rem\",\n }}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n aria-hidden=\"true\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14\"\n />\n </svg>\n </a>\n ) : (\n <span\n style={{\n fontFamily: \"monospace\",\n fontSize: fontSize.sm,\n color: colors.foreground,\n }}\n >\n {truncateHash(transactionHash)}\n </span>\n )}\n </div>\n )}\n\n {/* Done Button */}\n <button\n type=\"button\"\n onClick={handleDone}\n style={{\n width: \"100%\",\n maxWidth: \"20rem\",\n padding: `${spacing[3]} ${spacing[6]}`,\n borderRadius: borderRadius.xl,\n backgroundColor: colors.primary,\n color: colors.primaryForeground,\n fontWeight: fontWeight.semibold,\n fontSize: fontSize.base,\n transition: \"background-color 0.2s\",\n border: 0,\n cursor: \"pointer\",\n }}\n >\n Done\n </button>\n </div>\n\n {/* Footer */}\n <div\n style={{\n padding: `${spacing[4]} ${spacing[6]}`,\n borderTop: `1px solid rgba(63, 63, 70, 0.3)`,\n }}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: spacing[2],\n }}\n >\n <svg\n style={{\n width: \"0.875rem\",\n height: \"0.875rem\",\n color: colors.mutedForeground,\n }}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth={2}\n aria-hidden=\"true\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z\"\n />\n </svg>\n <span\n style={{\n fontSize: fontSize.sm,\n color: colors.mutedForeground,\n }}\n >\n Secured by{\" \"}\n <span\n style={{\n fontWeight: fontWeight.semibold,\n color: colors.foreground,\n }}\n >\n Trustware\n </span>\n </span>\n </div>\n </div>\n </div>\n );\n}\n\nexport default Success;\n","import React, { useMemo, useEffect } from \"react\";\nimport { colors, spacing, fontSize, fontWeight, borderRadius } from \"../styles\";\nimport { useDeposit } from \"../context/DepositContext\";\nimport { TrustwareConfigStore } from \"../../config/store\";\n\nexport interface ErrorProps {\n /** Additional inline styles */\n style?: React.CSSProperties;\n}\n\n/**\n * Error type categories for determining recovery options\n */\ntype ErrorCategory =\n | \"wallet_rejected\"\n | \"insufficient_funds\"\n | \"network_error\"\n | \"route_error\"\n | \"transaction_failed\"\n | \"timeout\"\n | \"unknown\";\n\n/**\n * Maps error messages to categories for recovery flow\n */\nfunction categorizeError(errorMessage: string | null): ErrorCategory {\n if (!errorMessage) return \"unknown\";\n\n const msg = errorMessage.toLowerCase();\n\n // User rejected transaction in wallet\n if (\n msg.includes(\"rejected\") ||\n msg.includes(\"denied\") ||\n msg.includes(\"cancelled\") ||\n msg.includes(\"canceled\")\n ) {\n return \"wallet_rejected\";\n }\n\n // Insufficient funds/balance\n if (\n msg.includes(\"insufficient\") ||\n msg.includes(\"balance\") ||\n msg.includes(\"not enough\")\n ) {\n return \"insufficient_funds\";\n }\n\n // Network connectivity issues\n if (\n msg.includes(\"network\") ||\n msg.includes(\"connection\") ||\n msg.includes(\"fetch\") ||\n msg.includes(\"rpc\")\n ) {\n return \"network_error\";\n }\n\n // Route building errors (liquidity, slippage, unsupported)\n if (\n msg.includes(\"liquidity\") ||\n msg.includes(\"slippage\") ||\n msg.includes(\"route\") ||\n msg.includes(\"not supported\") ||\n msg.includes(\"price impact\")\n ) {\n return \"route_error\";\n }\n\n // Transaction execution failures\n if (\n msg.includes(\"failed\") ||\n msg.includes(\"reverted\") ||\n msg.includes(\"gas\")\n ) {\n return \"transaction_failed\";\n }\n\n // Timeout errors\n if (\n msg.includes(\"timeout\") ||\n msg.includes(\"taking longer\") ||\n msg.includes(\"expired\")\n ) {\n return \"timeout\";\n }\n\n return \"unknown\";\n}\n\n/**\n * Gets user-friendly title based on error category\n */\nfunction getErrorTitle(category: ErrorCategory): string {\n switch (category) {\n case \"wallet_rejected\":\n return \"Transaction Cancelled\";\n case \"insufficient_funds\":\n return \"Insufficient Balance\";\n case \"network_error\":\n return \"Connection Error\";\n case \"route_error\":\n return \"Route Unavailable\";\n case \"transaction_failed\":\n return \"Transaction Failed\";\n case \"timeout\":\n return \"Request Timeout\";\n default:\n return \"Something Went Wrong\";\n }\n}\n\n/**\n * Gets helpful suggestion text based on error category\n */\nfunction getErrorSuggestion(category: ErrorCategory): string {\n switch (category) {\n case \"wallet_rejected\":\n return \"You can try again when you're ready to approve the transaction.\";\n case \"insufficient_funds\":\n return \"Please ensure you have enough tokens and native currency for gas fees.\";\n case \"network_error\":\n return \"Please check your internet connection and try again.\";\n case \"route_error\":\n return \"Try a different amount or token combination.\";\n case \"transaction_failed\":\n return \"The transaction couldn't be completed. You can try again with a different amount.\";\n case \"timeout\":\n return \"Check your wallet or block explorer to verify the transaction status.\";\n default:\n return \"Please try again or contact support if the issue persists.\";\n }\n}\n\n/**\n * Determines which step to return to based on error category\n */\nfunction getRetryStep(\n category: ErrorCategory\n): \"home\" | \"select-token\" | \"crypto-pay\" {\n switch (category) {\n case \"wallet_rejected\":\n // User just needs to approve again\n return \"crypto-pay\";\n case \"insufficient_funds\":\n // May need to change amount or token\n return \"home\";\n case \"network_error\":\n // Retry from where they were\n return \"crypto-pay\";\n case \"route_error\":\n // Need to select different token/chain/amount\n return \"select-token\";\n case \"transaction_failed\":\n // May need to adjust parameters\n return \"crypto-pay\";\n case \"timeout\":\n // Start fresh\n return \"home\";\n default:\n return \"home\";\n }\n}\n\n/**\n * Error page component.\n * Displays user-friendly error messages with appropriate recovery options.\n */\nexport function Error({ style }: ErrorProps): React.ReactElement {\n const {\n errorMessage,\n setCurrentStep,\n setTransactionStatus,\n setErrorMessage,\n transactionHash,\n selectedChain,\n resetState,\n } = useDeposit();\n\n // Categorize the error for appropriate handling\n const errorCategory = useMemo(\n () => categorizeError(errorMessage),\n [errorMessage]\n );\n\n const errorTitle = useMemo(\n () => getErrorTitle(errorCategory),\n [errorCategory]\n );\n\n const errorSuggestion = useMemo(\n () => getErrorSuggestion(errorCategory),\n [errorCategory]\n );\n\n const retryStep = useMemo(() => getRetryStep(errorCategory), [errorCategory]);\n\n // Log error via SDK callback if configured\n useEffect(() => {\n if (errorMessage) {\n try {\n const config = TrustwareConfigStore.get();\n // Check for rate limit callback as a proxy for error logging\n // This notifies the host app of issues\n if (\n config.retry?.onRateLimited &&\n errorMessage.includes(\"rate limit\")\n ) {\n config.retry.onRateLimited(\n { limit: 0, remaining: 0, reset: Date.now() + 60000 },\n 0\n );\n }\n } catch {\n // Config may not be initialized, ignore\n }\n }\n }, [errorMessage]);\n\n /**\n * Handle Try Again button click\n * Routes to appropriate step based on error category\n */\n const handleTryAgain = () => {\n // Clear the error state\n setErrorMessage(null);\n setTransactionStatus(\"idle\");\n\n // Navigate to the appropriate step for recovery\n setCurrentStep(retryStep);\n };\n\n /**\n * Handle Start Over button click\n * Completely resets the flow\n */\n const handleStartOver = () => {\n resetState();\n };\n\n // Get block explorer URL if we have a transaction hash\n const explorerUrl = useMemo(() => {\n if (transactionHash && selectedChain?.blockExplorerUrls?.length) {\n return `${selectedChain.blockExplorerUrls[0].replace(/\\/+$/, \"\")}/tx/${transactionHash}`;\n }\n return null;\n }, [transactionHash, selectedChain]);\n\n // Render appropriate icon based on error category\n const renderErrorIcon = () => {\n if (errorCategory === \"wallet_rejected\") {\n // X icon for user rejection\n return (\n <svg\n style={{\n width: \"2.5rem\",\n height: \"2.5rem\",\n color: colors.red[500],\n }}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2.5}\n aria-hidden=\"true\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n );\n }\n if (errorCategory === \"network_error\") {\n // Wifi off icon for network errors\n return (\n <svg\n style={{\n width: \"2.5rem\",\n height: \"2.5rem\",\n color: colors.red[500],\n }}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n aria-hidden=\"true\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M8.111 16.404a5.5 5.5 0 017.778 0M12 20h.01M3.293 7.293a14.962 14.962 0 0117.414 0M1 1l22 22\"\n />\n </svg>\n );\n }\n // Warning triangle for other errors\n return (\n <svg\n style={{\n width: \"2.5rem\",\n height: \"2.5rem\",\n color: colors.red[500],\n }}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n aria-hidden=\"true\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z\"\n />\n </svg>\n );\n };\n\n return (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n minHeight: \"500px\",\n ...style,\n }}\n >\n {/* Header */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: `${spacing[4]} ${spacing[4]}`,\n borderBottom: `1px solid ${colors.border}`,\n }}\n >\n <h1\n style={{\n fontSize: fontSize.lg,\n fontWeight: fontWeight.semibold,\n color: colors.foreground,\n }}\n >\n {errorTitle}\n </h1>\n </div>\n\n {/* Content */}\n <div\n style={{\n flex: 1,\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: `${spacing[8]} ${spacing[6]}`,\n }}\n >\n {/* Error Icon */}\n <div\n style={{\n width: \"5rem\",\n height: \"5rem\",\n borderRadius: \"9999px\",\n backgroundColor: \"rgba(239, 68, 68, 0.1)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n marginBottom: spacing[6],\n }}\n >\n {renderErrorIcon()}\n </div>\n\n {/* Error Message */}\n <h2\n style={{\n fontSize: fontSize[\"2xl\"],\n fontWeight: fontWeight.bold,\n color: colors.foreground,\n textAlign: \"center\",\n marginBottom: spacing[2],\n }}\n >\n {errorTitle}\n </h2>\n\n {/* Error Details */}\n {errorMessage && (\n <p\n style={{\n color: colors.mutedForeground,\n textAlign: \"center\",\n marginBottom: spacing[4],\n maxWidth: \"20rem\",\n }}\n >\n {errorMessage}\n </p>\n )}\n\n {/* Suggestion */}\n <p\n style={{\n fontSize: fontSize.sm,\n color: colors.mutedForeground,\n textAlign: \"center\",\n marginBottom: spacing[6],\n maxWidth: \"20rem\",\n }}\n >\n {errorSuggestion}\n </p>\n\n {/* Transaction Hash Link (if available) */}\n {explorerUrl && (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n gap: spacing[1],\n marginBottom: spacing[6],\n }}\n >\n <span\n style={{\n fontSize: fontSize.sm,\n color: colors.mutedForeground,\n }}\n >\n Transaction ID\n </span>\n <a\n href={explorerUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: spacing[1.5],\n color: colors.primary,\n textDecoration: \"none\",\n }}\n >\n <span\n style={{\n fontFamily: \"monospace\",\n fontSize: fontSize.sm,\n }}\n >\n {transactionHash!.slice(0, 8)}...{transactionHash!.slice(-6)}\n </span>\n <svg\n style={{\n width: \"0.875rem\",\n height: \"0.875rem\",\n }}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n aria-hidden=\"true\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14\"\n />\n </svg>\n </a>\n </div>\n )}\n\n {/* Action Buttons */}\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: spacing[3],\n width: \"100%\",\n maxWidth: \"20rem\",\n }}\n >\n {/* Try Again Button */}\n <button\n type=\"button\"\n onClick={handleTryAgain}\n style={{\n width: \"100%\",\n padding: `${spacing[3]} ${spacing[6]}`,\n borderRadius: borderRadius.xl,\n backgroundColor: colors.primary,\n color: colors.primaryForeground,\n fontWeight: fontWeight.semibold,\n fontSize: fontSize.base,\n transition: \"background-color 0.2s\",\n border: 0,\n cursor: \"pointer\",\n }}\n >\n Try Again\n </button>\n\n {/* Start Over Button (secondary) */}\n <button\n type=\"button\"\n onClick={handleStartOver}\n style={{\n width: \"100%\",\n padding: `${spacing[3]} ${spacing[6]}`,\n borderRadius: borderRadius.xl,\n backgroundColor: \"transparent\",\n color: colors.mutedForeground,\n fontWeight: fontWeight.medium,\n fontSize: fontSize.base,\n transition: \"background-color 0.2s\",\n border: `1px solid ${colors.border}`,\n cursor: \"pointer\",\n }}\n >\n Start Over\n </button>\n </div>\n </div>\n\n {/* Footer */}\n <div\n style={{\n padding: `${spacing[4]} ${spacing[6]}`,\n borderTop: `1px solid rgba(63, 63, 70, 0.3)`,\n }}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: spacing[2],\n }}\n >\n <svg\n style={{\n width: \"0.875rem\",\n height: \"0.875rem\",\n color: colors.mutedForeground,\n }}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth={2}\n aria-hidden=\"true\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z\"\n />\n </svg>\n <span\n style={{\n fontSize: fontSize.sm,\n color: colors.mutedForeground,\n }}\n >\n Secured by{\" \"}\n <span\n style={{\n fontWeight: fontWeight.semibold,\n color: colors.foreground,\n }}\n >\n Trustware\n </span>\n </span>\n </div>\n </div>\n </div>\n );\n}\n\nexport default Error;\n","export type TrustwareWidgetTheme = {\n primaryColor: string;\n secondaryColor: string;\n backgroundColor: string;\n textColor: string;\n borderColor: string;\n radius: number;\n};\n\nexport type TrustwareWidgetMessages = {\n title: string;\n description: string;\n};\n\nexport const DEFAULT_THEME: TrustwareWidgetTheme = {\n primaryColor: \"#4F46E5\", // Indigo-600\n secondaryColor: \"#6366F1\", // Indigo-500\n backgroundColor: \"#FFFFFF\", // White\n textColor: \"#111827\", // Gray-900\n borderColor: \"#E5E7EB\", // Gray-200\n radius: 8, // 8px border radius\n};\n\nexport const DEFAULT_MESSAGES: TrustwareWidgetMessages = {\n title: \"Trustware SDK\",\n description: \"Seamlessly bridge assets across chains with Trustware.\",\n};\n"],"mappings":"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","names":["DEFAULT_SLIPPAGE","DEFAULT_AUTO_DETECT_PROVIDER","projectId","init_config","init_config","colors","import_react","import_jsx_runtime","DEFAULT_AUTO_DETECT_PROVIDER","DEFAULT_MESSAGES","DEFAULT_SLIPPAGE","DEFAULT_THEME","import_react","Registry","NATIVE","apiBase","TrustwareConfigStore","import_react","init_config","chainMap","import_react","normalizeAddress","filteredTokens","import_react","import_react","import_react","toChain","toToken","toAddress","errorMessage","import_react","import_react","import_react","import_react","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","progress","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","React","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","parsedAmount","tokenPriceUSD","import_react","import_jsx_runtime","import_react","import_jsx_runtime","ConfettiEffect","truncateHash","import_react","import_jsx_runtime","Error","import_jsx_runtime","Error","TrustwareWidgetV2","DEFAULT_THEME","DEFAULT_MESSAGES"]}