@liberfi.io/ui-trade 0.1.1 → 0.1.2

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/hooks/useSwap.ts","../src/hooks/useTxConfirmation.ts","../src/version.ts"],"names":["base64ToUint8Array","base64","binary","bytes","i","uint8ArrayToBase64","useSwap","options","client","useDexClient","isSwapping","setIsSwapping","useState","optionsRef","useRef","swap","useCallback","input","wallet","chain","rest","route","API","e","err","signedBytes","unsignedBytes","sendResult","signedBase64","result","useMemo","DEFAULT_TIMEOUT","useTxConfirmation","transactions","setTransactions","updateTx","txHash","status","prev","existing","next","track","timeout","success","clear","clearAll","version_default"],"mappings":"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","file":"index.mjs","sourcesContent":["import { useCallback, useMemo, useRef, useState } from \"react\";\nimport { useDexClient } from \"@liberfi.io/react\";\nimport { API } from \"@liberfi.io/types\";\nimport type { SwapInput, SwapResult, UseSwapOptions } from \"../types\";\n\nfunction base64ToUint8Array(base64: string): Uint8Array {\n const binary = atob(base64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n}\n\nfunction uint8ArrayToBase64(bytes: Uint8Array): string {\n let binary = \"\";\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return btoa(binary);\n}\n\n/**\n * Hook that orchestrates the full swap flow: route -> sign -> send.\n *\n * Designed for IoC: no toast, no i18n, no UI side-effects.\n * The caller controls feedback via `onSubmitted` / `onError` callbacks.\n *\n * Works across Solana and EVM chains — chain-specific differences\n * (dex selection, tx format) are handled by the underlying client\n * and wallet adapter abstractions.\n */\nexport function useSwap(options?: UseSwapOptions) {\n const { client } = useDexClient();\n const [isSwapping, setIsSwapping] = useState(false);\n const optionsRef = useRef(options);\n optionsRef.current = options;\n\n const swap = useCallback(\n async (input: SwapInput): Promise<SwapResult> => {\n const { wallet, chain, ...rest } = input;\n\n setIsSwapping(true);\n try {\n // 1. Fetch route — returns unsigned tx as base64\n let route: API.SwapRoute;\n try {\n route = await client.swapRoute({\n chain,\n userAddress: wallet.address,\n input: rest.input,\n output: rest.output,\n mode: rest.mode ?? API.SwapMode.EXACT_IN,\n amount: rest.amount,\n slippage: rest.slippage,\n priorityFee: rest.priorityFee,\n tipFee: rest.tipFee,\n isAntiMev: rest.isAntiMev,\n permit: rest.permit,\n deadline: rest.deadline,\n });\n } catch (e) {\n const err = e instanceof Error ? e : new Error(String(e));\n optionsRef.current?.onError?.(err, \"route\");\n throw err;\n }\n\n // 2. Sign the transaction via wallet adapter\n let signedBytes: Uint8Array;\n try {\n const unsignedBytes = base64ToUint8Array(route.serializedTx);\n signedBytes = await wallet.signTransaction(unsignedBytes);\n } catch (e) {\n const err = e instanceof Error ? e : new Error(String(e));\n optionsRef.current?.onError?.(err, \"sign\");\n throw err;\n }\n\n // 3. Submit the signed transaction\n let sendResult: API.SendTxResult;\n try {\n const signedBase64 = uint8ArrayToBase64(signedBytes);\n sendResult = await client.sendTx({\n chain,\n serializedTx: signedBase64,\n });\n } catch (e) {\n const err = e instanceof Error ? e : new Error(String(e));\n optionsRef.current?.onError?.(err, \"send\");\n throw err;\n }\n\n const result: SwapResult = {\n txHash: sendResult.txHash,\n extra: sendResult.extra,\n };\n\n optionsRef.current?.onSubmitted?.(result);\n return result;\n } finally {\n setIsSwapping(false);\n }\n },\n [client],\n );\n\n return useMemo(() => ({ swap, isSwapping }), [swap, isSwapping]);\n}\n","import { useCallback, useMemo, useRef, useState } from \"react\";\nimport { useDexClient } from \"@liberfi.io/react\";\nimport { Chain } from \"@liberfi.io/types\";\nimport type { TxConfirmationStatus, UseTxConfirmationOptions } from \"../types\";\n\ninterface TrackedTx {\n chain: Chain;\n txHash: string;\n status: TxConfirmationStatus;\n}\n\nconst DEFAULT_TIMEOUT = 60_000;\n\n/**\n * Hook that tracks transaction confirmation via backend SSE (Server-Sent Events).\n *\n * Designed to be composed with `useSwap` — call `track()` inside `onSubmitted`\n * to start monitoring. Supports tracking multiple concurrent transactions.\n *\n * @example\n * ```tsx\n * const { swap } = useSwap({ onSubmitted: (r) => track(chain, r.txHash) });\n * const { track, transactions } = useTxConfirmation({\n * onConfirmed: (txHash) => toast.success(`Confirmed: ${txHash}`),\n * onFailed: (txHash) => toast.error(`Failed: ${txHash}`),\n * });\n * ```\n */\nexport function useTxConfirmation(options?: UseTxConfirmationOptions) {\n const { client } = useDexClient();\n const [transactions, setTransactions] = useState<Map<string, TrackedTx>>(\n () => new Map(),\n );\n const optionsRef = useRef(options);\n optionsRef.current = options;\n\n const updateTx = useCallback(\n (txHash: string, status: TxConfirmationStatus) => {\n setTransactions((prev) => {\n const existing = prev.get(txHash);\n if (!existing) return prev;\n if (existing.status === status) return prev;\n const next = new Map(prev);\n next.set(txHash, { ...existing, status });\n return next;\n });\n },\n [],\n );\n\n const track = useCallback(\n (chain: Chain, txHash: string) => {\n setTransactions((prev) => {\n if (prev.has(txHash)) return prev;\n const next = new Map(prev);\n next.set(txHash, { chain, txHash, status: \"pending\" });\n return next;\n });\n\n const timeout = optionsRef.current?.timeout ?? DEFAULT_TIMEOUT;\n\n client\n .checkTxSuccess(chain, txHash, timeout)\n .then((success) => {\n if (success) {\n updateTx(txHash, \"confirmed\");\n optionsRef.current?.onConfirmed?.(txHash);\n } else {\n const err = new Error(\"Transaction failed on-chain\");\n updateTx(txHash, \"failed\");\n optionsRef.current?.onFailed?.(txHash, err);\n }\n })\n .catch((e) => {\n const err = e instanceof Error ? e : new Error(String(e));\n updateTx(txHash, \"failed\");\n optionsRef.current?.onFailed?.(txHash, err);\n });\n },\n [client, updateTx],\n );\n\n const clear = useCallback((txHash: string) => {\n setTransactions((prev) => {\n if (!prev.has(txHash)) return prev;\n const next = new Map(prev);\n next.delete(txHash);\n return next;\n });\n }, []);\n\n const clearAll = useCallback(() => {\n setTransactions((prev) => (prev.size === 0 ? prev : new Map()));\n }, []);\n\n return useMemo(\n () => ({ track, clear, clearAll, transactions }),\n [track, clear, clearAll, transactions],\n );\n}\n","declare global {\n interface Window {\n __LIBERFI_VERSION__?: {\n [key: string]: string;\n };\n }\n}\nif (typeof window !== \"undefined\") {\n window.__LIBERFI_VERSION__ = window.__LIBERFI_VERSION__ || {};\n window.__LIBERFI_VERSION__[\"@liberfi.io/ui-trade\"] = \"0.1.1\";\n}\n\nexport default \"0.1.1\";\n"]}
1
+ {"version":3,"sources":["../src/hooks/useSwap.ts","../src/hooks/useSwapRoutePolling.ts","../src/hooks/useTxConfirmation.ts","../src/components/swap/swap.script.ts","../src/components/swap/swap-preview-modal.tsx","../src/components/swap/swap.ui.tsx","../src/components/swap/swap.widget.tsx","../src/version.ts"],"names":["base64ToUint8Array","base64","binary","bytes","uint8ArrayToBase64","i","useSwap","options","client","useDexClient","isSwapping","setIsSwapping","useState","optionsRef","useRef","swap","useCallback","input","wallet","chain","rest","route","API","e","err","signedBytes","unsignedBytes","sendResult","signedBase64","result","useMemo","DEFAULT_INTERVAL","useSwapRoutePolling","params","interval","paused","enabled","query","useSwapRouteQuery","useEffect","DEFAULT_TIMEOUT","useTxConfirmation","transactions","setTransactions","updateTx","txHash","status","prev","existing","next","track","timeout","success","clear","clearAll","SOLANA_CHAINS","Chain","chainNamespace","ChainNamespace","TOKEN_POLL_MS","BALANCE_POLL_MS","formatOutputAmount","plans","decimals","raw","padded","intPart","trimmed","useSwapScript","wallets","useWallets","ns","w","walletAddress","fromTokenAddress","setFromTokenAddress","toTokenAddress","setToTokenAddress","fromRef","toRef","tokenAddresses","tokensQuery","useTokensQuery","fromToken","t","toToken","balancesQuery","useWalletPortfoliosByTokensQuery","fromBalance","p","toBalance","amount","setAmount","amountInDecimals","parts","amountInUsd","price","value","setHalfAmount","bal","half","setMaxAmount","routeParams","isSwappingRef","isRouting","routeError","outputAmount","outputAmountInUsd","rawSwap","onCompleteRef","latestTxStatus","entries","isLoading","SwapPreviewModal","isOpen","onOpenChange","inputAmount","inputAmountInUsd","onConfirm","expanded","setExpanded","toggleExpanded","plan","jsx","Modal","jsxs","ModalContent","ModalHeader","ModalBody","Avatar","WalletBalanceIcon","formatNumber","formatUsd","truncateAddress","formatSmallAmount","TradeIcon","Button","ChevronUpIcon","ChevronDownIcon","ModalFooter","n","addr","SwapUI","onAmountChange","onHalfAmount","onMaxAmount","onFromTokenSelect","onToTokenSelect","onPreview","className","cn","Input","SwapWidget","from","to","onComplete","script","onOpen","onClose","useDisclosure","handleConfirm","Fragment","version_default"],"mappings":"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","file":"index.mjs","sourcesContent":["import { useCallback, useMemo, useRef, useState } from \"react\";\nimport { useDexClient } from \"@liberfi.io/react\";\nimport { API } from \"@liberfi.io/types\";\nimport type { SwapInput, SwapResult, UseSwapOptions } from \"../types\";\n\nfunction base64ToUint8Array(base64: string): Uint8Array {\n const binary = atob(base64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n}\n\nfunction uint8ArrayToBase64(bytes: Uint8Array): string {\n let binary = \"\";\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return btoa(binary);\n}\n\n/**\n * Hook that orchestrates the full swap flow: route -> sign -> send.\n *\n * Designed for IoC: no toast, no i18n, no UI side-effects.\n * The caller controls feedback via `onSubmitted` / `onError` callbacks.\n *\n * Works across Solana and EVM chains — chain-specific differences\n * (dex selection, tx format) are handled by the underlying client\n * and wallet adapter abstractions.\n */\nexport function useSwap(options?: UseSwapOptions) {\n const { client } = useDexClient();\n const [isSwapping, setIsSwapping] = useState(false);\n const optionsRef = useRef(options);\n optionsRef.current = options;\n\n const swap = useCallback(\n async (input: SwapInput): Promise<SwapResult> => {\n const { wallet, chain, ...rest } = input;\n\n setIsSwapping(true);\n try {\n // 1. Fetch route — returns unsigned tx as base64\n let route: API.SwapRoute;\n try {\n route = await client.swapRoute({\n chain,\n userAddress: wallet.address,\n input: rest.input,\n output: rest.output,\n mode: rest.mode ?? API.SwapMode.EXACT_IN,\n amount: rest.amount,\n slippage: rest.slippage,\n priorityFee: rest.priorityFee,\n tipFee: rest.tipFee,\n isAntiMev: rest.isAntiMev,\n permit: rest.permit,\n deadline: rest.deadline,\n });\n } catch (e) {\n const err = e instanceof Error ? e : new Error(String(e));\n optionsRef.current?.onError?.(err, \"route\");\n throw err;\n }\n\n // 2. Sign the transaction via wallet adapter\n let signedBytes: Uint8Array;\n try {\n const unsignedBytes = base64ToUint8Array(route.serializedTx);\n signedBytes = await wallet.signTransaction(unsignedBytes);\n } catch (e) {\n const err = e instanceof Error ? e : new Error(String(e));\n optionsRef.current?.onError?.(err, \"sign\");\n throw err;\n }\n\n // 3. Submit the signed transaction\n let sendResult: API.SendTxResult;\n try {\n const signedBase64 = uint8ArrayToBase64(signedBytes);\n sendResult = await client.sendTx({\n chain,\n serializedTx: signedBase64,\n });\n } catch (e) {\n const err = e instanceof Error ? e : new Error(String(e));\n optionsRef.current?.onError?.(err, \"send\");\n throw err;\n }\n\n const result: SwapResult = {\n txHash: sendResult.txHash,\n extra: sendResult.extra,\n };\n\n optionsRef.current?.onSubmitted?.(result);\n return result;\n } finally {\n setIsSwapping(false);\n }\n },\n [client],\n );\n\n return useMemo(() => ({ swap, isSwapping }), [swap, isSwapping]);\n}\n","import { useEffect, useMemo, useRef } from \"react\";\nimport { useSwapRouteQuery } from \"@liberfi.io/react\";\nimport { API } from \"@liberfi.io/types\";\nimport type { UseSwapRoutePollingOptions } from \"../types\";\n\nconst DEFAULT_INTERVAL = 12_000;\n\n/**\n * Hook that polls for swap route quotes at a configurable interval.\n *\n * Built on top of `useSwapRouteQuery` (TanStack Query) — automatically\n * deduplicates requests, caches results, and invalidates when params change.\n *\n * Polling pauses when `paused` is true (e.g. during swap execution) or\n * when required params are missing.\n */\nexport function useSwapRoutePolling(\n params: Partial<API.SwapParams>,\n options?: UseSwapRoutePollingOptions,\n) {\n const interval = options?.interval ?? DEFAULT_INTERVAL;\n const paused = options?.paused ?? false;\n const optionsRef = useRef(options);\n optionsRef.current = options;\n\n const hasRequiredParams =\n !!params.chain &&\n !!params.userAddress &&\n !!params.input &&\n !!params.output &&\n !!params.amount;\n\n const enabled = hasRequiredParams && !paused;\n\n const query = useSwapRouteQuery(params as API.SwapParams, {\n enabled,\n refetchInterval: enabled ? interval : false,\n retry: false,\n });\n\n useEffect(() => {\n if (query.error) {\n optionsRef.current?.onError?.(query.error);\n }\n }, [query.error]);\n\n return useMemo(\n () => ({\n route: query.data,\n isRouting: query.isFetching,\n error: query.error,\n }),\n [query.data, query.isFetching, query.error],\n );\n}\n","import { useCallback, useMemo, useRef, useState } from \"react\";\nimport { useDexClient } from \"@liberfi.io/react\";\nimport { Chain } from \"@liberfi.io/types\";\nimport type { TxConfirmationStatus, UseTxConfirmationOptions } from \"../types\";\n\ninterface TrackedTx {\n chain: Chain;\n txHash: string;\n status: TxConfirmationStatus;\n}\n\nconst DEFAULT_TIMEOUT = 60_000;\n\n/**\n * Hook that tracks transaction confirmation via backend SSE (Server-Sent Events).\n *\n * Designed to be composed with `useSwap` — call `track()` inside `onSubmitted`\n * to start monitoring. Supports tracking multiple concurrent transactions.\n *\n * @example\n * ```tsx\n * const { swap } = useSwap({ onSubmitted: (r) => track(chain, r.txHash) });\n * const { track, transactions } = useTxConfirmation({\n * onConfirmed: (txHash) => toast.success(`Confirmed: ${txHash}`),\n * onFailed: (txHash) => toast.error(`Failed: ${txHash}`),\n * });\n * ```\n */\nexport function useTxConfirmation(options?: UseTxConfirmationOptions) {\n const { client } = useDexClient();\n const [transactions, setTransactions] = useState<Map<string, TrackedTx>>(\n () => new Map(),\n );\n const optionsRef = useRef(options);\n optionsRef.current = options;\n\n const updateTx = useCallback(\n (txHash: string, status: TxConfirmationStatus) => {\n setTransactions((prev) => {\n const existing = prev.get(txHash);\n if (!existing) return prev;\n if (existing.status === status) return prev;\n const next = new Map(prev);\n next.set(txHash, { ...existing, status });\n return next;\n });\n },\n [],\n );\n\n const track = useCallback(\n (chain: Chain, txHash: string) => {\n setTransactions((prev) => {\n if (prev.has(txHash)) return prev;\n const next = new Map(prev);\n next.set(txHash, { chain, txHash, status: \"pending\" });\n return next;\n });\n\n const timeout = optionsRef.current?.timeout ?? DEFAULT_TIMEOUT;\n\n client\n .checkTxSuccess(chain, txHash, timeout)\n .then((success) => {\n if (success) {\n updateTx(txHash, \"confirmed\");\n optionsRef.current?.onConfirmed?.(txHash);\n } else {\n const err = new Error(\"Transaction failed on-chain\");\n updateTx(txHash, \"failed\");\n optionsRef.current?.onFailed?.(txHash, err);\n }\n })\n .catch((e) => {\n const err = e instanceof Error ? e : new Error(String(e));\n updateTx(txHash, \"failed\");\n optionsRef.current?.onFailed?.(txHash, err);\n });\n },\n [client, updateTx],\n );\n\n const clear = useCallback((txHash: string) => {\n setTransactions((prev) => {\n if (!prev.has(txHash)) return prev;\n const next = new Map(prev);\n next.delete(txHash);\n return next;\n });\n }, []);\n\n const clearAll = useCallback(() => {\n setTransactions((prev) => (prev.size === 0 ? prev : new Map()));\n }, []);\n\n return useMemo(\n () => ({ track, clear, clearAll, transactions }),\n [track, clear, clearAll, transactions],\n );\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n useTokensQuery,\n useWalletPortfoliosByTokensQuery,\n} from \"@liberfi.io/react\";\nimport { API, Chain, ChainNamespace } from \"@liberfi.io/types\";\nimport { useWallets } from \"@liberfi.io/wallet-connector\";\nimport { useSwap } from \"../../hooks/useSwap\";\nimport { useSwapRoutePolling } from \"../../hooks/useSwapRoutePolling\";\nimport { useTxConfirmation } from \"../../hooks/useTxConfirmation\";\nimport type { UseSwapScriptParams, UseSwapScriptResult } from \"./types\";\n\nconst SOLANA_CHAINS: ReadonlySet<Chain> = new Set([\n Chain.SOLANA,\n Chain.SOLANA_TESTNET,\n Chain.SOLANA_DEVNET,\n]);\n\nfunction chainNamespace(chain: Chain): ChainNamespace {\n return SOLANA_CHAINS.has(chain) ? ChainNamespace.SOLANA : ChainNamespace.EVM;\n}\n\nconst TOKEN_POLL_MS = 10_000;\nconst BALANCE_POLL_MS = 15_000;\n\n/**\n * Computes the total output amount from route plans.\n * Each plan has an outputAmount in smallest units — we take the last plan's\n * output (the final token) and shift by decimals.\n */\nfunction formatOutputAmount(\n plans: Array<{ outputAmount: string }>,\n decimals: number,\n): string | undefined {\n if (plans.length === 0) return undefined;\n const lastPlan = plans[plans.length - 1]!;\n const raw = lastPlan.outputAmount;\n if (!raw || raw === \"0\") return \"0\";\n\n const padded = raw.padStart(decimals + 1, \"0\");\n const intPart = padded.slice(0, padded.length - decimals) || \"0\";\n const fracPart = padded.slice(padded.length - decimals);\n const trimmed = fracPart.replace(/0+$/, \"\");\n return trimmed ? `${intPart}.${trimmed}` : intPart;\n}\n\n/**\n * Script hook that encapsulates all data fetching and state management\n * for the swap form.\n *\n * Pure TypeScript — no JSX, no UI imports.\n */\nexport function useSwapScript(\n params: UseSwapScriptParams,\n): UseSwapScriptResult {\n const { chain } = params;\n\n // ── Wallet ────────────────────────────────────────────────────────────────\n\n const wallets = useWallets();\n const ns = chainNamespace(chain);\n const wallet = useMemo(\n () => wallets.find((w) => w.chainNamespace === ns && w.isConnected),\n [wallets, ns],\n );\n const walletAddress = wallet?.address ?? \"\";\n\n // ── Token selection state ─────────────────────────────────────────────────\n\n const [fromTokenAddress, setFromTokenAddress] = useState(params.from ?? \"\");\n const [toTokenAddress, setToTokenAddress] = useState(params.to ?? \"\");\n\n const fromRef = useRef(params.from);\n const toRef = useRef(params.to);\n useEffect(() => {\n if (params.from !== fromRef.current) {\n fromRef.current = params.from;\n if (params.from) setFromTokenAddress(params.from);\n }\n }, [params.from]);\n useEffect(() => {\n if (params.to !== toRef.current) {\n toRef.current = params.to;\n if (params.to) setToTokenAddress(params.to);\n }\n }, [params.to]);\n\n // ── Token metadata ────────────────────────────────────────────────────────\n\n const tokenAddresses = useMemo(\n () => [fromTokenAddress, toTokenAddress].filter(Boolean),\n [fromTokenAddress, toTokenAddress],\n );\n\n const tokensQuery = useTokensQuery(\n { chain, addresses: tokenAddresses },\n { enabled: tokenAddresses.length > 0, refetchInterval: TOKEN_POLL_MS },\n );\n\n const fromToken = useMemo(\n () => tokensQuery.data?.find((t) => t.address === fromTokenAddress) ?? null,\n [tokensQuery.data, fromTokenAddress],\n );\n const toToken = useMemo(\n () => tokensQuery.data?.find((t) => t.address === toTokenAddress) ?? null,\n [tokensQuery.data, toTokenAddress],\n );\n\n // ── Balances ──────────────────────────────────────────────────────────────\n\n const balancesQuery = useWalletPortfoliosByTokensQuery(\n { chain, address: walletAddress, tokenAddresses },\n {\n enabled: !!walletAddress && tokenAddresses.length > 0,\n refetchInterval: BALANCE_POLL_MS,\n },\n );\n\n const fromBalance = useMemo(\n () =>\n balancesQuery.data?.find((p) => p.address === fromTokenAddress) ?? null,\n [balancesQuery.data, fromTokenAddress],\n );\n const toBalance = useMemo(\n () => balancesQuery.data?.find((p) => p.address === toTokenAddress) ?? null,\n [balancesQuery.data, toTokenAddress],\n );\n\n // ── Amount ────────────────────────────────────────────────────────────────\n\n const [amount, setAmount] = useState<string | undefined>(undefined);\n\n const amountInDecimals = useMemo(() => {\n if (!amount || fromToken?.decimals == null) return undefined;\n const parts = amount.split(\".\");\n const intPart = parts[0] ?? \"0\";\n const fracPart = (parts[1] ?? \"\").slice(0, fromToken.decimals);\n const padded = fracPart.padEnd(fromToken.decimals, \"0\");\n const raw = intPart + padded;\n return raw.replace(/^0+/, \"\") || \"0\";\n }, [amount, fromToken?.decimals]);\n\n const amountInUsd = useMemo(() => {\n if (!amount || !fromToken?.marketData?.priceInUsd) return undefined;\n const price = Number(fromToken.marketData.priceInUsd);\n const value = Number(amount) * price;\n return Number.isFinite(value) ? value.toString() : undefined;\n }, [amount, fromToken?.marketData?.priceInUsd]);\n\n // ── Half / Max helpers ────────────────────────────────────────────────────\n\n const setHalfAmount = useCallback(() => {\n if (!fromBalance) return;\n const bal = Number(fromBalance.amount);\n if (!Number.isFinite(bal) || bal <= 0) return;\n const half = bal / 2;\n const decimals = fromToken?.decimals ?? 9;\n setAmount(\n half.toLocaleString(\"en-US\", {\n useGrouping: false,\n maximumFractionDigits: decimals,\n }),\n );\n }, [fromBalance, fromToken?.decimals]);\n\n const setMaxAmount = useCallback(() => {\n if (!fromBalance) return;\n const bal = Number(fromBalance.amount);\n if (!Number.isFinite(bal) || bal <= 0) return;\n const decimals = fromToken?.decimals ?? 9;\n setAmount(\n bal.toLocaleString(\"en-US\", {\n useGrouping: false,\n maximumFractionDigits: decimals,\n }),\n );\n }, [fromBalance, fromToken?.decimals]);\n\n // ── Route polling ─────────────────────────────────────────────────────────\n\n const routeParams = useMemo<Partial<API.SwapParams>>(\n () => ({\n chain,\n userAddress: walletAddress || undefined,\n input: fromTokenAddress || undefined,\n output: toTokenAddress || undefined,\n mode: API.SwapMode.EXACT_IN,\n amount: amountInDecimals,\n }),\n [chain, walletAddress, fromTokenAddress, toTokenAddress, amountInDecimals],\n );\n\n const isSwappingRef = useRef(false);\n\n const {\n route,\n isRouting,\n error: routeError,\n } = useSwapRoutePolling(routeParams, { paused: isSwappingRef.current });\n\n // ── Output amount ─────────────────────────────────────────────────────────\n\n const outputAmount = useMemo(\n () =>\n route && toToken\n ? formatOutputAmount(route.plans, toToken.decimals)\n : undefined,\n [route, toToken],\n );\n\n const outputAmountInUsd = useMemo(() => {\n if (!outputAmount || !toToken?.marketData?.priceInUsd) return undefined;\n const price = Number(toToken.marketData.priceInUsd);\n const value = Number(outputAmount) * price;\n return Number.isFinite(value) ? value.toString() : undefined;\n }, [outputAmount, toToken?.marketData?.priceInUsd]);\n\n // ── Swap execution ────────────────────────────────────────────────────────\n\n const { swap: rawSwap, isSwapping } = useSwap();\n isSwappingRef.current = isSwapping;\n\n const onCompleteRef = useRef(params.onComplete);\n onCompleteRef.current = params.onComplete;\n\n const { track, transactions } = useTxConfirmation({\n onConfirmed: (txHash) => {\n onCompleteRef.current?.({ success: true, txHash });\n },\n onFailed: (txHash) => {\n onCompleteRef.current?.({ success: false, txHash });\n },\n });\n\n const latestTxStatus = useMemo(() => {\n if (transactions.size === 0) return \"idle\" as const;\n const entries = Array.from(transactions.values());\n return entries[entries.length - 1]!.status;\n }, [transactions]);\n\n const swap = useCallback(async () => {\n if (\n !wallet ||\n !route ||\n !fromTokenAddress ||\n !toTokenAddress ||\n !amountInDecimals\n ) {\n return;\n }\n\n try {\n const result = await rawSwap({\n chain,\n wallet,\n input: fromTokenAddress,\n output: toTokenAddress,\n amount: amountInDecimals,\n mode: API.SwapMode.EXACT_IN,\n });\n track(chain, result.txHash);\n } catch {\n // Error is already reported via useSwap's onError callback\n }\n }, [\n wallet,\n route,\n chain,\n fromTokenAddress,\n toTokenAddress,\n amountInDecimals,\n rawSwap,\n track,\n ]);\n\n // ── Loading state ─────────────────────────────────────────────────────────\n\n const isLoading = tokensQuery.isPending || balancesQuery.isPending;\n\n // ── Return ────────────────────────────────────────────────────────────────\n\n return useMemo(\n () => ({\n fromTokenAddress,\n toTokenAddress,\n setFromTokenAddress,\n setToTokenAddress,\n\n fromToken,\n toToken,\n\n fromBalance,\n toBalance,\n\n amount,\n setAmount,\n setHalfAmount,\n setMaxAmount,\n amountInDecimals,\n amountInUsd,\n\n outputAmount,\n outputAmountInUsd,\n\n route,\n isRouting,\n routeError,\n\n swap,\n isSwapping,\n\n txStatus: latestTxStatus,\n\n isLoading,\n }),\n [\n fromTokenAddress,\n toTokenAddress,\n fromToken,\n toToken,\n fromBalance,\n toBalance,\n amount,\n setHalfAmount,\n setMaxAmount,\n amountInDecimals,\n amountInUsd,\n outputAmount,\n outputAmountInUsd,\n route,\n isRouting,\n routeError,\n swap,\n isSwapping,\n latestTxStatus,\n isLoading,\n ],\n );\n}\n","import { useCallback, useMemo, useState } from \"react\";\nimport {\n Avatar,\n Button,\n ChevronDownIcon,\n ChevronUpIcon,\n cn,\n Modal,\n ModalBody,\n ModalContent,\n ModalFooter,\n ModalHeader,\n TradeIcon,\n} from \"@liberfi.io/ui\";\nimport type { SwapPreviewModalProps } from \"./types\";\n\n/**\n * Modal that previews swap details before confirmation.\n *\n * Pure presentational — all data and callbacks received via props.\n * Shows from/to token cards, expandable route plan details,\n * and a confirm button.\n */\nexport function SwapPreviewModal({\n isOpen,\n onOpenChange,\n fromToken,\n toToken,\n fromBalance,\n inputAmount,\n inputAmountInUsd,\n outputAmount,\n outputAmountInUsd,\n route,\n isRouting,\n routeError,\n onConfirm,\n isSwapping,\n}: SwapPreviewModalProps) {\n const [expanded, setExpanded] = useState(false);\n const toggleExpanded = useCallback(() => setExpanded((prev) => !prev), []);\n\n const plans = useMemo(() => {\n if (!route) return [];\n return route.plans.map((plan, i) => ({\n key: `plan-${i}`,\n name: plan.name,\n input: plan.input,\n inputAmount: plan.inputAmount,\n output: plan.output,\n outputAmount: plan.outputAmount,\n feeQuote: plan.feeQuote,\n feeAmount: plan.feeAmount,\n }));\n }, [route]);\n\n return (\n <Modal\n isOpen={isOpen}\n onOpenChange={onOpenChange}\n hideCloseButton\n scrollBehavior=\"inside\"\n backdrop=\"blur\"\n >\n <ModalContent className=\"bg-content2 rounded-lg\">\n <ModalHeader>Preview</ModalHeader>\n <ModalBody>\n <div className=\"flex w-full max-h-[70vh] flex-1 flex-col overflow-y-auto py-2\">\n {/* ── From preview ─────────────────────────────────────────── */}\n <div className=\"mb-5\">\n <div className=\"text-neutral flex items-center justify-between text-xs font-medium\">\n From\n </div>\n <div className=\"bg-content3 mt-3 flex w-full items-center gap-3 rounded-lg px-4 py-3\">\n <div className=\"flex flex-1 items-center gap-3\">\n {fromToken?.image && (\n <Avatar\n size=\"sm\"\n src={fromToken.image}\n name={fromToken.symbol}\n className=\"h-6 w-6\"\n />\n )}\n <div className=\"flex flex-col items-start justify-center gap-0.5\">\n <div className=\"text-foreground text-xs\">\n {fromToken?.symbol ?? \"—\"}\n </div>\n {fromBalance && (\n <div className=\"text-neutral flex items-center gap-1 text-[10px]\">\n <WalletBalanceIcon />\n <span>\n {formatNumber(fromBalance.amount)} {fromToken?.symbol}\n </span>\n </div>\n )}\n </div>\n </div>\n <div className=\"flex-0 flex flex-col items-end justify-center gap-0.5\">\n <div className=\"text-foreground text-xs\">\n {formatNumber(inputAmount)}\n </div>\n <div className=\"text-neutral text-[10px]\">\n ${formatUsd(inputAmountInUsd)}\n </div>\n </div>\n </div>\n </div>\n\n {/* ── To preview ───────────────────────────────────────────── */}\n <div className=\"mb-5\">\n <div className=\"text-neutral flex items-center justify-between text-xs font-medium\">\n Estimated Receive\n </div>\n <div className=\"bg-content3 mt-3 flex w-full items-center gap-3 rounded-lg px-4 py-3\">\n <div className=\"flex flex-1 items-center gap-3\">\n {toToken?.image && (\n <Avatar\n size=\"sm\"\n src={toToken.image}\n name={toToken.symbol}\n className=\"h-6 w-6\"\n />\n )}\n <div className=\"flex flex-col items-start justify-center gap-0.5\">\n <div className=\"text-foreground text-xs\">\n {toToken?.symbol ?? \"—\"}\n </div>\n <div className=\"text-neutral text-[10px]\">\n {truncateAddress(toToken?.address)}\n </div>\n </div>\n </div>\n <div className=\"flex-0 flex flex-col items-end justify-center gap-0.5\">\n <div className=\"text-foreground text-xs\">\n {formatNumber(outputAmount)}\n </div>\n <div className=\"text-neutral text-[10px]\">\n ${formatUsd(outputAmountInUsd)}\n </div>\n </div>\n </div>\n </div>\n\n {/* ── Route plan details ───────────────────────────────────── */}\n {expanded && plans.length > 0 && (\n <div className=\"my-3\">\n <div className=\"text-neutral flex items-center justify-between text-xs font-medium\">\n Route Details\n </div>\n <div className=\"mt-3 flex flex-col gap-3\">\n {plans.map((plan) => (\n <div\n key={plan.key}\n className=\"bg-content3 flex w-full flex-col items-center gap-2 rounded-lg px-4 py-3\"\n >\n <div className=\"flex w-full items-center justify-between\">\n <div className=\"text-neutral text-xs\">DEX</div>\n <div className=\"text-foreground text-xs\">\n {plan.name}\n </div>\n </div>\n <div className=\"flex w-full items-center justify-between\">\n <div className=\"text-neutral text-xs\">Swap</div>\n <div className=\"text-foreground flex items-center gap-2 text-xs\">\n <span>\n {formatSmallAmount(plan.inputAmount)}{\" \"}\n {truncateAddress(plan.input)}\n </span>\n <TradeIcon\n width={12}\n height={12}\n className=\"text-foreground\"\n />\n <span>\n {formatSmallAmount(plan.outputAmount)}{\" \"}\n {truncateAddress(plan.output)}\n </span>\n </div>\n </div>\n {plan.feeAmount && (\n <div className=\"flex w-full items-center justify-between\">\n <div className=\"text-neutral text-xs\">Fee</div>\n <div className=\"text-foreground text-xs\">\n {formatSmallAmount(plan.feeAmount)}{\" \"}\n {truncateAddress(plan.feeQuote)}\n </div>\n </div>\n )}\n </div>\n ))}\n </div>\n </div>\n )}\n\n {/* ── Expand / collapse toggle ─────────────────────────────── */}\n {plans.length > 0 && (\n <div className=\"flex justify-center\">\n <Button\n size=\"sm\"\n className=\"text-neutral flex bg-transparent text-xs\"\n endContent={\n expanded ? (\n <ChevronUpIcon width={12} height={12} />\n ) : (\n <ChevronDownIcon width={12} height={12} />\n )\n }\n disableRipple\n onPress={toggleExpanded}\n >\n {expanded ? \"Show Less\" : \"Show More\"}\n </Button>\n </div>\n )}\n </div>\n </ModalBody>\n <ModalFooter>\n <Button\n fullWidth\n color=\"primary\"\n className=\"flex rounded-lg\"\n disableRipple\n isDisabled={!route || !!routeError}\n isLoading={(!route && isRouting) || isSwapping}\n onPress={onConfirm}\n >\n Confirm\n </Button>\n </ModalFooter>\n </ModalContent>\n </Modal>\n );\n}\n\nfunction WalletBalanceIcon() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={12}\n height={12}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"text-neutral\"\n >\n <path d=\"M21 12V7H5a2 2 0 0 1 0-4h14v4\" />\n <path d=\"M3 5v14a2 2 0 0 0 2 2h16v-5\" />\n <path d=\"M18 12a2 2 0 0 0 0 4h4v-4Z\" />\n </svg>\n );\n}\n\nfunction formatUsd(value: string | undefined): string {\n if (!value) return \"0.00\";\n const n = Number(value);\n if (!Number.isFinite(n)) return \"0.00\";\n return n.toLocaleString(\"en-US\", {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n });\n}\n\nfunction formatNumber(value: string | undefined): string {\n if (!value) return \"0\";\n const n = Number(value);\n if (!Number.isFinite(n)) return \"0\";\n if (n >= 1_000_000)\n return (\n (n / 1_000_000).toLocaleString(\"en-US\", {\n maximumFractionDigits: 2,\n }) + \"M\"\n );\n if (n >= 1_000)\n return (\n (n / 1_000).toLocaleString(\"en-US\", { maximumFractionDigits: 2 }) + \"K\"\n );\n return n.toLocaleString(\"en-US\", { maximumFractionDigits: 6 });\n}\n\n/** Render raw smallest-unit amounts in abbreviated form. */\nfunction formatSmallAmount(value: string | undefined): string {\n if (!value || value === \"0\") return \"0\";\n const n = Number(value);\n if (!Number.isFinite(n)) return value;\n if (n >= 1e12) return (n / 1e12).toFixed(2) + \"T\";\n if (n >= 1e9) return (n / 1e9).toFixed(2) + \"B\";\n if (n >= 1e6) return (n / 1e6).toFixed(2) + \"M\";\n if (n >= 1e3) return (n / 1e3).toFixed(2) + \"K\";\n return value;\n}\n\nfunction truncateAddress(addr: string | undefined): string {\n if (!addr) return \"—\";\n if (addr.length <= 10) return addr;\n return `${addr.slice(0, 4)}...${addr.slice(-4)}`;\n}\n","import { Avatar, Button, ChevronDownIcon, cn, Input } from \"@liberfi.io/ui\";\nimport type { SwapUIProps } from \"./types\";\n\n/**\n * Pure presentational component for the swap form.\n *\n * Receives all data and callbacks via props — no API calls, no subscriptions.\n * Consumers can replace this component entirely while reusing `useSwapScript`.\n */\nexport function SwapUI({\n fromToken,\n toToken,\n fromBalance,\n toBalance,\n amount,\n amountInUsd,\n onAmountChange,\n onHalfAmount,\n onMaxAmount,\n outputAmount,\n outputAmountInUsd,\n onFromTokenSelect,\n onToTokenSelect,\n route,\n isRouting,\n routeError,\n onPreview,\n isSwapping,\n className,\n}: SwapUIProps) {\n return (\n <div className={cn(\"px-4 pb-4 lg:pb-8\", className)}>\n {/* ── From token section ─────────────────────────────────────────── */}\n <div className=\"space-y-3\">\n <p className=\"text-neutral text-sm font-medium\">From</p>\n <div className=\"bg-content1 flex flex-col rounded-lg px-3.5 pb-2.5 pt-2\">\n <div className=\"flex items-center gap-2\">\n <div className=\"flex-1\">\n <Input\n type=\"number\"\n value={amount ?? \"\"}\n onChange={(e) => onAmountChange(e.target.value || undefined)}\n placeholder=\"0\"\n classNames={{\n inputWrapper: cn(\n \"h-10 p-0 bg-transparent\",\n \"data-[hover=true]:bg-transparent group-data-[focus=true]:bg-transparent\",\n \"group-data-[focus-visible=true]:ring-offset-transparent group-data-[focus-visible=true]:ring-transparent\",\n ),\n input: cn(\n \"w-full h-full caret-primary text-3xl font-medium\",\n \"placeholder:text-placeholder placeholder:text-3xl placeholder:font-medium\",\n \"scrollbar-hide overflow-hidden text-ellipsis whitespace-nowrap\",\n ),\n }}\n />\n </div>\n <div className=\"flex-0 flex h-full items-center justify-center\">\n <Button\n className={cn(\n \"flex min-w-0 h-8 min-h-8 pl-3 pr-2 bg-content3 rounded-full\",\n fromToken ? \"text-foreground\" : \"text-neutral\",\n )}\n disableRipple\n startContent={\n fromToken?.image ? (\n <Avatar\n size=\"sm\"\n src={fromToken.image}\n name={fromToken.symbol}\n className=\"h-6 w-6\"\n />\n ) : null\n }\n endContent={\n <ChevronDownIcon\n width={16}\n height={16}\n className=\"text-neutral\"\n />\n }\n onPress={() => onFromTokenSelect(\"\")}\n >\n {fromToken ? fromToken.symbol : \"Select token\"}\n </Button>\n </div>\n </div>\n\n <div className=\"mt-3 flex items-center justify-between gap-4\">\n <div className=\"text-neutral flex-1 text-xs\">\n ≈ ${formatUsd(amountInUsd)}\n </div>\n {fromBalance && (\n <div className=\"flex-0 flex items-center gap-2 pr-3 text-xs\">\n <WalletBalanceIcon />\n <span className=\"text-neutral\">\n {formatNumber(fromBalance.amount)} {fromBalance.symbol}\n </span>\n {onHalfAmount && (\n <span\n className=\"text-primary cursor-pointer\"\n onClick={onHalfAmount}\n >\n Half\n </span>\n )}\n {onMaxAmount && (\n <span\n className=\"text-primary cursor-pointer\"\n onClick={onMaxAmount}\n >\n Max\n </span>\n )}\n </div>\n )}\n </div>\n\n {routeError && (\n <p className=\"mt-1 break-words text-xs text-danger-500\">\n {routeError.message}\n </p>\n )}\n </div>\n </div>\n\n {/* ── To token section ───────────────────────────────────────────── */}\n <div className=\"mt-4 space-y-3\">\n <p className=\"text-neutral text-sm font-medium\">To</p>\n <div className=\"bg-content1 flex flex-col rounded-lg px-3.5 pb-2.5 pt-2\">\n <div className=\"flex items-center gap-2\">\n <div className=\"flex-1\">\n <Input\n type=\"number\"\n value={outputAmount ?? \"\"}\n disabled\n placeholder=\"0\"\n classNames={{\n inputWrapper: cn(\n \"h-10 p-0 bg-transparent\",\n \"data-[hover=true]:bg-transparent group-data-[focus=true]:bg-transparent\",\n \"group-data-[focus-visible=true]:ring-offset-transparent group-data-[focus-visible=true]:ring-transparent\",\n ),\n input: cn(\n \"w-full h-full caret-primary text-3xl font-medium\",\n \"placeholder:text-placeholder placeholder:text-3xl placeholder:font-medium\",\n \"scrollbar-hide overflow-hidden text-ellipsis whitespace-nowrap\",\n ),\n }}\n />\n </div>\n <div className=\"flex-0 flex h-full items-center justify-center\">\n <Button\n className={cn(\n \"flex min-w-0 h-8 min-h-8 pl-3 pr-2 bg-content3 rounded-full\",\n toToken ? \"text-foreground\" : \"text-neutral\",\n )}\n disableRipple\n startContent={\n toToken?.image ? (\n <Avatar\n size=\"sm\"\n src={toToken.image}\n name={toToken.symbol}\n className=\"h-6 w-6\"\n />\n ) : null\n }\n endContent={\n <ChevronDownIcon\n width={16}\n height={16}\n className=\"text-neutral\"\n />\n }\n onPress={() => onToTokenSelect(\"\")}\n >\n {toToken ? toToken.symbol : \"Select token\"}\n </Button>\n </div>\n </div>\n\n <div className=\"mt-3 flex items-center justify-between gap-4\">\n <div className=\"text-neutral flex-1 text-xs\">\n ≈ ${formatUsd(outputAmountInUsd)}\n </div>\n {toBalance && (\n <div className=\"flex-0 flex items-center gap-2 pr-3 text-xs\">\n <WalletBalanceIcon />\n <span className=\"text-neutral\">\n {formatNumber(toBalance.amount)} {toBalance.symbol}\n </span>\n </div>\n )}\n </div>\n </div>\n </div>\n\n {/* ── Submit button ──────────────────────────────────────────────── */}\n <Button\n fullWidth\n color=\"primary\"\n className=\"mt-8 flex rounded-lg\"\n disableRipple\n isDisabled={!route}\n isLoading={!route && isRouting}\n onPress={onPreview}\n >\n {isSwapping ? \"Swapping...\" : isRouting ? \"Finding route...\" : \"Swap\"}\n </Button>\n </div>\n );\n}\n\nfunction WalletBalanceIcon() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={12}\n height={12}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"text-neutral\"\n >\n <path d=\"M21 12V7H5a2 2 0 0 1 0-4h14v4\" />\n <path d=\"M3 5v14a2 2 0 0 0 2 2h16v-5\" />\n <path d=\"M18 12a2 2 0 0 0 0 4h4v-4Z\" />\n </svg>\n );\n}\n\nfunction formatUsd(value: string | undefined): string {\n if (!value) return \"0.00\";\n const n = Number(value);\n if (!Number.isFinite(n)) return \"0.00\";\n return n.toLocaleString(\"en-US\", {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n });\n}\n\nfunction formatNumber(value: string | undefined): string {\n if (!value) return \"0\";\n const n = Number(value);\n if (!Number.isFinite(n)) return \"0\";\n if (n >= 1_000_000)\n return (\n (n / 1_000_000).toLocaleString(\"en-US\", { maximumFractionDigits: 2 }) +\n \"M\"\n );\n if (n >= 1_000)\n return (\n (n / 1_000).toLocaleString(\"en-US\", { maximumFractionDigits: 2 }) + \"K\"\n );\n return n.toLocaleString(\"en-US\", { maximumFractionDigits: 6 });\n}\n","import { useCallback } from \"react\";\nimport { useDisclosure } from \"@liberfi.io/ui\";\nimport { SwapPreviewModal } from \"./swap-preview-modal\";\nimport { useSwapScript } from \"./swap.script\";\nimport { SwapUI } from \"./swap.ui\";\nimport type { SwapWidgetProps } from \"./types\";\n\n/**\n * Swap widget — thin orchestration layer.\n *\n * Calls `useSwapScript` to fetch all data, renders `SwapUI` for the form\n * and `SwapPreviewModal` for pre-swap confirmation.\n *\n * For custom UIs, use `useSwapScript` directly with your own presentation.\n */\nexport function SwapWidget({\n chain,\n from,\n to,\n onComplete,\n className,\n}: SwapWidgetProps) {\n const script = useSwapScript({ chain, from, to, onComplete });\n const { isOpen, onOpen, onOpenChange, onClose } = useDisclosure();\n\n const handleConfirm = useCallback(async () => {\n await script.swap();\n onClose();\n }, [script, onClose]);\n\n return (\n <>\n <SwapUI\n fromToken={script.fromToken}\n toToken={script.toToken}\n fromBalance={script.fromBalance}\n toBalance={script.toBalance}\n amount={script.amount}\n amountInUsd={script.amountInUsd}\n onAmountChange={script.setAmount}\n onHalfAmount={script.setHalfAmount}\n onMaxAmount={script.setMaxAmount}\n outputAmount={script.outputAmount}\n outputAmountInUsd={script.outputAmountInUsd}\n onFromTokenSelect={script.setFromTokenAddress}\n onToTokenSelect={script.setToTokenAddress}\n route={script.route}\n isRouting={script.isRouting}\n routeError={script.routeError}\n onPreview={onOpen}\n isSwapping={script.isSwapping}\n className={className}\n />\n <SwapPreviewModal\n isOpen={isOpen}\n onOpenChange={onOpenChange}\n fromToken={script.fromToken}\n toToken={script.toToken}\n fromBalance={script.fromBalance}\n inputAmount={script.amount}\n inputAmountInUsd={script.amountInUsd}\n outputAmount={script.outputAmount}\n outputAmountInUsd={script.outputAmountInUsd}\n route={script.route}\n isRouting={script.isRouting}\n routeError={script.routeError}\n onConfirm={handleConfirm}\n isSwapping={script.isSwapping}\n />\n </>\n );\n}\n","declare global {\n interface Window {\n __LIBERFI_VERSION__?: {\n [key: string]: string;\n };\n }\n}\nif (typeof window !== \"undefined\") {\n window.__LIBERFI_VERSION__ = window.__LIBERFI_VERSION__ || {};\n window.__LIBERFI_VERSION__[\"@liberfi.io/ui-trade\"] = \"0.1.2\";\n}\n\nexport default \"0.1.2\";\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@liberfi.io/ui-trade",
3
- "version": "0.1.1",
3
+ "version": "0.1.2",
4
4
  "description": "Trade hooks for Liberfi React SDK",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",
@@ -14,7 +14,7 @@
14
14
  "access": "public"
15
15
  },
16
16
  "dependencies": {
17
- "@liberfi.io/types": "0.1.39"
17
+ "@liberfi.io/types": "0.1.40"
18
18
  },
19
19
  "devDependencies": {
20
20
  "@types/react": "^19.1.13",
@@ -23,15 +23,17 @@
23
23
  "react-dom": "^19.1.1",
24
24
  "tsup": "^8.5.0",
25
25
  "typescript": "^5.9.2",
26
- "@liberfi.io/react": "0.1.16",
27
- "@liberfi.io/wallet-connector": "0.1.30",
28
- "tsconfig": "0.1.27"
26
+ "@liberfi.io/react": "0.1.17",
27
+ "@liberfi.io/ui": "0.1.40",
28
+ "@liberfi.io/wallet-connector": "0.1.31",
29
+ "tsconfig": "0.1.28"
29
30
  },
30
31
  "peerDependencies": {
31
32
  "react": ">=18",
32
33
  "react-dom": ">=18",
33
- "@liberfi.io/react": "0.1.16",
34
- "@liberfi.io/wallet-connector": "0.1.30"
34
+ "@liberfi.io/react": "0.1.17",
35
+ "@liberfi.io/ui": "0.1.40",
36
+ "@liberfi.io/wallet-connector": "0.1.31"
35
37
  },
36
38
  "scripts": {
37
39
  "dev": "tsup --watch",