@uniswap-widget/react 2.1.0 → 2.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.
- package/LICENSE +21 -0
- package/README.md +10 -10
- package/dist/index.es.js.map +1 -1
- package/dist/index.umd.js +1 -1
- package/dist/index.umd.js.map +1 -1
- package/package.json +3 -2
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Houtan Rocky
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
# react
|
|
1
|
+
# @uniswap-widget/react
|
|
2
2
|
|
|
3
3
|
<img width="581" height="546" alt="image" src="https://github.com/user-attachments/assets/b98e27cd-3a08-4a1e-a018-f12ef1cd9bba" />
|
|
4
4
|
|
|
5
|
-
A React component package for easily integrating Uniswap swap functionality into your dApp with maximum dev flexibility
|
|
5
|
+
A React component package for easily integrating Uniswap swap functionality into your dApp with maximum dev flexibility no token limitations, no warnings, and no added fee.
|
|
6
6
|
|
|
7
|
-
> Looking for a runnable end-to-end setup? See [`examples/basic`](https://github.com/houtan/
|
|
7
|
+
> Looking for a runnable end-to-end setup? See [`examples/basic`](https://github.com/houtan/uniswap-widget/tree/main/examples/basic) in the monorepo.
|
|
8
8
|
|
|
9
9
|
## Installation
|
|
10
10
|
|
|
11
11
|
The widget keeps its heavy dependencies as **peer dependencies**, so you install them alongside it (and stay in control of their versions):
|
|
12
12
|
|
|
13
13
|
```bash
|
|
14
|
-
pnpm add react
|
|
14
|
+
pnpm add @uniswap-widget/react \
|
|
15
15
|
@reown/appkit @reown/appkit-adapter-wagmi wagmi viem \
|
|
16
16
|
@tanstack/react-query ethers \
|
|
17
17
|
@uniswap/sdk-core @uniswap/v3-sdk @uniswap/v3-core
|
|
@@ -20,7 +20,7 @@ pnpm add react-uniswap \
|
|
|
20
20
|
|
|
21
21
|
## Host-app requirements
|
|
22
22
|
|
|
23
|
-
The widget makes three assumptions about the app embedding it. Satisfy all three or it won't render/behave correctly. (These are tracked for removal
|
|
23
|
+
The widget makes three assumptions about the app embedding it. Satisfy all three or it won't render/behave correctly. (These are tracked for removal see the [decoupling spec](https://github.com/houtan/uniswap-widget/blob/main/docs/0004-core-deps-decoupling.md).)
|
|
24
24
|
|
|
25
25
|
### 1. Tailwind CSS
|
|
26
26
|
|
|
@@ -31,7 +31,7 @@ The widget is styled with **Tailwind utility classes** and ships **no CSS of its
|
|
|
31
31
|
export default {
|
|
32
32
|
content: [
|
|
33
33
|
'./src/**/*.{js,ts,jsx,tsx}',
|
|
34
|
-
'./node_modules/react
|
|
34
|
+
'./node_modules/@uniswap-widget/react/dist/*.js', // generate the widget's classes
|
|
35
35
|
],
|
|
36
36
|
}
|
|
37
37
|
```
|
|
@@ -45,7 +45,7 @@ The widget calls these **relative** paths, which your app must proxy:
|
|
|
45
45
|
| `/api/base-rpc` | POST | Base-chain JSON-RPC reads (balances, pool reserves, quotes) | Always |
|
|
46
46
|
| `/api/uniswap/v2/Search.v1.SearchService/SearchTokens` | POST | Token search | `searchConfig.enabled` is `true` |
|
|
47
47
|
|
|
48
|
-
See [`examples/basic/vite.config.ts`](https://github.com/houtan/
|
|
48
|
+
See [`examples/basic/vite.config.ts`](https://github.com/houtan/uniswap-widget/blob/main/examples/basic/vite.config.ts) (dev proxy) and [`examples/basic/api`](https://github.com/houtan/uniswap-widget/tree/main/examples/basic/api) (Vercel functions) for a working reference.
|
|
49
49
|
|
|
50
50
|
### 3. Vite-style env
|
|
51
51
|
|
|
@@ -62,7 +62,7 @@ Get your WalletConnect v2 Project ID at https://cloud.walletconnect.com/
|
|
|
62
62
|
Wrap your app with the `Provider`, passing a configured `WagmiAdapter`:
|
|
63
63
|
|
|
64
64
|
```tsx
|
|
65
|
-
import { Provider, createAppKit, WagmiAdapter, base } from 'react
|
|
65
|
+
import { Provider, createAppKit, WagmiAdapter, base } from '@uniswap-widget/react';
|
|
66
66
|
import { QueryClient } from '@tanstack/react-query';
|
|
67
67
|
|
|
68
68
|
const projectId = 'your_project_id';
|
|
@@ -114,7 +114,7 @@ export default function App({ children }: { children: React.ReactNode }) {
|
|
|
114
114
|
## Usage
|
|
115
115
|
|
|
116
116
|
```tsx
|
|
117
|
-
import { SwapWidget } from 'react
|
|
117
|
+
import { SwapWidget } from '@uniswap-widget/react';
|
|
118
118
|
|
|
119
119
|
export default function SwapPage() {
|
|
120
120
|
const handleSwap = async (inputAmount: string, outputAmount: string) => {
|
|
@@ -199,7 +199,7 @@ VITE_APP_DESCRIPTION=Your app description
|
|
|
199
199
|
VITE_APP_URL=https://your-domain.com
|
|
200
200
|
VITE_APP_ICON=https://your-icon-url.com
|
|
201
201
|
|
|
202
|
-
# Optional
|
|
202
|
+
# Optional token-change controls (default: true)
|
|
203
203
|
VITE_ALLOW_SELL_TOKEN_CHANGE=true
|
|
204
204
|
VITE_ALLOW_BUY_TOKEN_CHANGE=true
|
|
205
205
|
```
|
package/dist/index.es.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.es.js","sources":["../src/hooks/useQuote.ts","../src/hooks/useSwap.ts","../src/components/SwapWidget.tsx","../src/components/Provider.tsx"],"sourcesContent":["import { useEffect, useRef } from \"react\";\nimport { ethers } from \"ethers\";\nimport {\n getQuote,\n RATE_LIMIT_CONFIG,\n type SwapState,\n type PoolConfig,\n} from \"@uniswap-widget/core\";\n\n/**\n * React binding for the core `getQuote`. Owns the reactive concerns — debounce,\n * de-duplication, abort, and state writes — while the actual quote logic lives\n * in `@uniswap-widget/core`.\n */\nexport default function useQuote({\n signer,\n state,\n setState,\n poolConfig,\n}: {\n signer?: ethers.Signer;\n state: SwapState;\n setState: React.Dispatch<React.SetStateAction<SwapState>>;\n poolConfig: PoolConfig;\n}) {\n const debounceTimeout = useRef<NodeJS.Timeout>();\n const lastQuoteParams = useRef<string>(\"\");\n const abortController = useRef<AbortController>();\n\n useEffect(() => {\n // Initialize tokens from pool config\n setState((prev) => ({\n ...prev,\n inputToken: poolConfig.tokenIn,\n outputToken: poolConfig.tokenOut,\n }));\n }, [poolConfig]);\n\n useEffect(() => {\n if (debounceTimeout.current) {\n clearTimeout(debounceTimeout.current);\n }\n\n if (abortController.current) {\n abortController.current.abort();\n }\n\n async function updateQuote() {\n if (!state.inputAmount || Number(state.inputAmount) === 0) {\n setState((prev) => ({ ...prev, outputAmount: \"\" }));\n return;\n }\n\n if (!signer) {\n setState((prev) => ({\n ...prev,\n outputAmount: \"\",\n error: \"Please connect your wallet to get quotes\",\n }));\n return;\n }\n\n const quoteKey = `${poolConfig.tokenIn.address}-${poolConfig.tokenOut.address}-${state.inputAmount}`;\n if (lastQuoteParams.current === quoteKey) {\n return;\n }\n lastQuoteParams.current = quoteKey;\n\n const controller = new AbortController();\n abortController.current = controller;\n\n try {\n setState((prev) => ({ ...prev, loading: true, error: null }));\n\n const { outputAmount, routeInfo } = await getQuote({\n signer,\n inputToken: poolConfig.tokenIn,\n outputToken: poolConfig.tokenOut,\n inputAmount: state.inputAmount,\n poolConfig,\n signal: controller.signal,\n });\n\n if (controller.signal.aborted) {\n return;\n }\n\n setState((prev) => ({ ...prev, outputAmount, routeInfo }));\n } catch (err) {\n if (controller.signal.aborted) {\n return;\n }\n\n const errorMessage =\n err instanceof Error ? err.message : \"Failed to get quote\";\n\n setState((prev) => ({\n ...prev,\n outputAmount: \"\",\n error: errorMessage,\n }));\n } finally {\n if (!controller.signal.aborted) {\n setState((prev) => ({ ...prev, loading: false }));\n }\n }\n }\n\n debounceTimeout.current = setTimeout(\n updateQuote,\n RATE_LIMIT_CONFIG.QUOTE_DEBOUNCE\n );\n\n return () => {\n if (debounceTimeout.current) {\n clearTimeout(debounceTimeout.current);\n }\n if (abortController.current) {\n abortController.current.abort();\n }\n };\n }, [state.inputAmount, poolConfig, signer]);\n\n return;\n}\n","import { ethers } from \"ethers\";\nimport { executeSwap, type SwapState } from \"@uniswap-widget/core\";\n\n/**\n * React binding for the core `executeSwap`. Manages loading/error state; the\n * swap itself (approve, send, wait, callback) lives in `@uniswap-widget/core`.\n */\nexport default function useSwap({\n state,\n setState,\n onSwap,\n signer,\n}: {\n state: SwapState;\n setState: React.Dispatch<React.SetStateAction<SwapState>>;\n onSwap?: (inputAmount: string, outputAmount: string) => Promise<void>;\n signer?: ethers.Signer;\n}) {\n async function swap() {\n if (!signer) {\n setState((prev) => ({ ...prev, error: \"Please connect your wallet\" }));\n return;\n }\n\n if (!state.inputToken || !state.outputToken) {\n setState((prev) => ({ ...prev, error: \"Tokens not initialized\" }));\n return;\n }\n\n setState((prev) => ({ ...prev, txLoading: true }));\n\n try {\n await executeSwap({\n signer,\n inputToken: state.inputToken,\n outputToken: state.outputToken,\n inputAmount: state.inputAmount,\n outputAmount: state.outputAmount,\n onSwap,\n });\n } catch (error) {\n setState((prev) => ({\n ...prev,\n error: error instanceof Error ? error.message : \"Swap failed\",\n }));\n } finally {\n setState((prev) => ({ ...prev, txLoading: false }));\n }\n }\n\n return {\n swap,\n };\n}\n","import React, { useState, useMemo, useEffect } from \"react\";\nimport { useAccount, useWalletClient } from \"wagmi\";\nimport { ethers } from \"ethers\";\nimport {\n DEFAULT_POOL_CONFIG,\n lightTheme,\n type SwapState,\n type SwapProps,\n type ThemeConfig,\n} from \"@uniswap-widget/core\";\nimport useQuote from \"../hooks/useQuote\";\nimport useSwap from \"../hooks/useSwap\";\nimport { useAppKit } from \"@reown/appkit/react\";\n\nconst cx = (...classes: (string | false | null | undefined)[]) =>\n classes.filter(Boolean).join(\" \");\n\nconst ArrowDown = (props: React.SVGProps<SVGSVGElement>) => (\n <svg {...props} viewBox=\"0 0 512 512\" className=\"text-2xl w-6 h-6\" fill=\"currentColor\">\n <path d=\"M256 400L56 200h400L256 400z\"/>\n </svg>\n)\n\nconst SwapWidget: React.FC<SwapProps> = ({\n poolConfig = DEFAULT_POOL_CONFIG,\n theme: customTheme = {},\n onSwap,\n}) => {\n const { open } = useAppKit();\n const { isConnected } = useAccount();\n const { data: walletClient } = useWalletClient();\n const [isSwapping, setIsSwapping] = useState(false);\n\n const signer = useMemo(() => {\n if (!walletClient) return undefined;\n const { account, chain, transport } = walletClient;\n const network = {\n chainId: chain.id,\n name: chain.name,\n ensAddress: chain.contracts?.ensRegistry?.address,\n };\n const provider = new ethers.providers.Web3Provider(transport, network);\n return provider.getSigner(account.address);\n }, [walletClient]);\n\n // Merge custom theme with default light theme\n const theme = useMemo<ThemeConfig>(\n () => ({\n ...lightTheme,\n ...customTheme,\n tokenButton: {\n ...lightTheme.tokenButton,\n ...customTheme.tokenButton,\n },\n swapButton: {\n ...lightTheme.swapButton,\n ...customTheme.swapButton,\n },\n connectButton: {\n ...lightTheme.connectButton,\n ...customTheme.connectButton,\n },\n inputField: {\n ...lightTheme.inputField,\n ...customTheme.inputField,\n },\n buySection: {\n ...lightTheme.buySection,\n ...customTheme.buySection,\n },\n }),\n [customTheme]\n );\n\n const [state, setState] = useState<SwapState>({\n inputAmount: \"\",\n outputAmount: \"\",\n inputToken: null,\n outputToken: null,\n loading: false,\n error: null,\n inputDisabled: true,\n });\n\n useEffect(() => {\n setState((prev) => ({\n ...prev,\n inputDisabled: !isConnected,\n error: !isConnected ? \"Please connect your wallet\" : null,\n }));\n }, [isConnected]);\n\n // Always call hooks, but pass undefined if no signer\n useQuote({ state, setState, poolConfig, signer: signer || undefined });\n const { swap } = useSwap({ state, setState, onSwap, signer: signer || undefined });\n\n const handleSwap = async () => {\n if (!signer) {\n setState(prev => ({ ...prev, error: \"Please connect your wallet\" }));\n return;\n }\n setIsSwapping(true);\n try {\n await swap();\n } finally {\n setIsSwapping(false);\n setState((prev) => ({ ...prev, inputAmount: \"\", outputAmount: \"\" }));\n }\n };\n\n const handleInputAmountChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value;\n if (value === \"\" || /^\\d*\\.?\\d*$/.test(value)) {\n setState((prev) => ({ ...prev, inputAmount: value }));\n }\n };\n\n const onConnectWallet = async () => {\n open({\n view: \"Connect\",\n });\n };\n\n return (\n <div\n className=\"relative w-full max-w-md rounded-xl p-2\"\n style={{ backgroundColor: theme.background }}\n >\n {/* Sell Section */}\n <div\n className=\"p-4 rounded-2xl relative\"\n style={{\n backgroundColor: theme.foreground,\n border: `1px solid ${theme.border}`,\n opacity: !isConnected ? 0.5 : 1,\n }}\n >\n <label className=\"block mb-2\" style={{ color: theme.textSecondary }}>\n Sell\n </label>\n <div className=\"flex items-center\">\n <input\n type=\"text\"\n disabled={!isConnected}\n value={state.inputAmount}\n onChange={handleInputAmountChange}\n className={cx(\n \"w-full text-2xl outline-none\",\n !isConnected && \"cursor-not-allowed\"\n )}\n placeholder=\"0\"\n inputMode=\"decimal\"\n style={{\n backgroundColor: !isConnected\n ? theme.inputField.disabledBackground\n : theme.inputField.background,\n color: !isConnected\n ? theme.inputField.disabledText\n : theme.inputField.text,\n }}\n />\n <div className=\"flex flex-col gap-2\">\n <div\n className={cx(\n \"ml-2 p-3 py-2 rounded-full flex items-center justify-center gap-2 min-w-[140px]\",\n !isConnected && \"opacity-50\"\n )}\n style={{\n backgroundColor: theme.tokenButton.background,\n border: `1px solid ${theme.tokenButton.border}`,\n }}\n >\n {poolConfig.tokenIn.logoURI && (\n <img\n src={poolConfig.tokenIn.logoURI}\n alt={poolConfig.tokenIn.symbol}\n className=\"h-[20px] w-[20px] flex-shrink-0 rounded-full\"\n onError={(e) => {\n (e.target as HTMLImageElement).style.display = \"none\";\n }}\n />\n )}\n <span\n style={{ color: theme.tokenButton.text }}\n className=\"font-bold text-sm\"\n >\n {poolConfig.tokenIn.symbol}\n </span>\n </div>\n </div>\n </div>\n </div>\n\n {/* Swap Arrow */}\n <div className=\"relative z-10 flex justify-center items-center h-[5px]\">\n <div\n className=\"rounded-2xl w-[40px] h-[40px] flex justify-center items-center\"\n style={{ \n backgroundColor: theme.border,\n opacity: !isConnected ? 0.5 : 1\n }}\n >\n <ArrowDown className=\"text-2xl\" style={{ color: theme.text }} />\n </div>\n </div>\n\n {/* Buy Section */}\n <div\n className=\"mb-2 p-4 rounded-2xl relative\"\n style={{\n backgroundColor: theme.buySection.background,\n border: `1px solid ${theme.buySection.border}`,\n opacity: !isConnected ? 0.5 : 1,\n }}\n >\n <label className=\"block mb-2\" style={{ color: theme.textSecondary }}>\n Buy\n </label>\n <div className=\"flex items-center\">\n <input\n type=\"text\"\n value={\n state.loading ? \"Fetching Quotes\" : state.outputAmount || \"0\"\n }\n readOnly\n disabled={true}\n className={cx(\n \"w-full text-2xl outline-none disabled:text-lg\",\n !isConnected && \"cursor-not-allowed\"\n )}\n style={{\n backgroundColor: !isConnected\n ? theme.inputField.disabledBackground\n : theme.inputField.background,\n color: !isConnected\n ? theme.inputField.disabledText\n : theme.inputField.text,\n opacity: state.loading ? 0.3 : !isConnected ? 0.5 : 0.8,\n }}\n placeholder=\"0\"\n />\n <div className=\"flex flex-col gap-2\">\n <div\n className={cx(\n \"ml-2 p-3 py-2 rounded-full flex items-center justify-center gap-2 min-w-[140px]\",\n !isConnected && \"opacity-50\"\n )}\n style={{\n backgroundColor: theme.tokenButton.background,\n border: `1px solid ${theme.tokenButton.border}`,\n padding: `${theme.tokenButton.paddingY}px ${theme.tokenButton.paddingX}px`,\n }}\n >\n {poolConfig.tokenOut.logoURI && (\n <img\n src={poolConfig.tokenOut.logoURI}\n alt={poolConfig.tokenOut.symbol}\n className=\"h-[20px] w-[20px] flex-shrink-0 rounded-full\"\n onError={(e) => {\n (e.target as HTMLImageElement).style.display = \"none\";\n }}\n />\n )}\n <span\n style={{ color: theme.tokenButton.text }}\n className=\"font-bold text-sm\"\n >\n {poolConfig.tokenOut.symbol}\n </span>\n </div>\n </div>\n </div>\n </div>\n\n {/* Error Message */}\n {state.error && (\n <div className=\"mb-2 p-4 bg-red-50 text-red-500 rounded-2xl overflow-x-hidden\">\n {state.error}\n </div>\n )}\n\n {/* Action Button */}\n {isConnected ? (\n <button\n disabled={\n state.loading ||\n isSwapping ||\n !state.inputAmount ||\n Number(state.inputAmount) <= 0\n }\n onClick={handleSwap}\n className=\"w-full py-4 rounded-2xl transition-colors cursor-pointer\"\n style={{\n backgroundColor:\n state.loading ||\n isSwapping ||\n !state.inputAmount ||\n Number(state.inputAmount) <= 0\n ? theme.swapButton.disabledBackground\n : theme.swapButton.background,\n color:\n state.loading ||\n isSwapping ||\n !state.inputAmount ||\n Number(state.inputAmount) <= 0\n ? theme.swapButton.disabledText\n : theme.swapButton.text,\n }}\n >\n {isSwapping ? \"Swapping...\" : state.loading ? \"Getting Quote...\" : \"Swap\"}\n </button>\n ) : (\n <button\n onClick={onConnectWallet}\n className=\"w-full py-4 rounded-2xl transition-colors\"\n style={{\n backgroundColor: theme.connectButton.background,\n color: theme.connectButton.text,\n }}\n >\n Connect Wallet\n </button>\n )}\n\n {/* Price Info */}\n {state.inputAmount && state.outputAmount && (\n <div className=\"p-4 rounded-2xl\">\n <div\n className=\"flex justify-between items-center text-sm mb-2\"\n style={{ color: theme.textSecondary }}\n >\n 1 {poolConfig.tokenIn.symbol} ={\" \"}\n {(Number(state.outputAmount) / Number(state.inputAmount)).toFixed(\n 6\n )}{\" \"}\n {poolConfig.tokenOut.symbol}\n </div>\n\n {state.routeInfo && (\n <div\n className=\"mt-2 text-xs\"\n style={{ color: theme.textSecondary }}\n >\n {state.routeInfo.isDirectRoute ? (\n <div className=\"flex justify-between\">\n <span>Direct swap</span>\n <span>{state.routeInfo.routeString}</span>\n </div>\n ) : (\n <div className=\"flex justify-between\">\n <span>Route: {state.routeInfo.routeString}</span>\n </div>\n )}\n </div>\n )}\n </div>\n )}\n\n {/* Account Button */}\n {isConnected && (\n <div className=\"flex justify-center items-center mt-2\">\n <appkit-account-button />\n </div>\n )}\n </div>\n );\n};\n\nexport default SwapWidget;\n","\"use client\";\n\nimport { WagmiAdapter } from \"@reown/appkit-adapter-wagmi\";\nimport { QueryClient, QueryClientProvider } from \"@tanstack/react-query\";\nimport { WagmiProvider } from \"wagmi\";\n\nexport interface ProviderProps {\n children: React.ReactNode;\n wagmiAdapter: WagmiAdapter;\n queryClient?: QueryClient;\n}\n\nexport function Provider({\n children,\n wagmiAdapter,\n queryClient = new QueryClient(),\n}: ProviderProps) {\n return (\n <WagmiProvider config={wagmiAdapter.wagmiConfig}>\n <QueryClientProvider client={queryClient}>{children}</QueryClientProvider>\n </WagmiProvider>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.es.js","sources":["../src/hooks/useQuote.ts","../src/hooks/useSwap.ts","../src/components/SwapWidget.tsx","../src/components/Provider.tsx"],"sourcesContent":["import { useEffect, useRef } from \"react\";\nimport { ethers } from \"ethers\";\nimport {\n getQuote,\n RATE_LIMIT_CONFIG,\n type SwapState,\n type PoolConfig,\n} from \"@uniswap-widget/core\";\n\n/**\n * React binding for the core `getQuote`. Owns the reactive concerns debounce,\n * de-duplication, abort, and state writes while the actual quote logic lives\n * in `@uniswap-widget/core`.\n */\nexport default function useQuote({\n signer,\n state,\n setState,\n poolConfig,\n}: {\n signer?: ethers.Signer;\n state: SwapState;\n setState: React.Dispatch<React.SetStateAction<SwapState>>;\n poolConfig: PoolConfig;\n}) {\n const debounceTimeout = useRef<NodeJS.Timeout>();\n const lastQuoteParams = useRef<string>(\"\");\n const abortController = useRef<AbortController>();\n\n useEffect(() => {\n // Initialize tokens from pool config\n setState((prev) => ({\n ...prev,\n inputToken: poolConfig.tokenIn,\n outputToken: poolConfig.tokenOut,\n }));\n }, [poolConfig]);\n\n useEffect(() => {\n if (debounceTimeout.current) {\n clearTimeout(debounceTimeout.current);\n }\n\n if (abortController.current) {\n abortController.current.abort();\n }\n\n async function updateQuote() {\n if (!state.inputAmount || Number(state.inputAmount) === 0) {\n setState((prev) => ({ ...prev, outputAmount: \"\" }));\n return;\n }\n\n if (!signer) {\n setState((prev) => ({\n ...prev,\n outputAmount: \"\",\n error: \"Please connect your wallet to get quotes\",\n }));\n return;\n }\n\n const quoteKey = `${poolConfig.tokenIn.address}-${poolConfig.tokenOut.address}-${state.inputAmount}`;\n if (lastQuoteParams.current === quoteKey) {\n return;\n }\n lastQuoteParams.current = quoteKey;\n\n const controller = new AbortController();\n abortController.current = controller;\n\n try {\n setState((prev) => ({ ...prev, loading: true, error: null }));\n\n const { outputAmount, routeInfo } = await getQuote({\n signer,\n inputToken: poolConfig.tokenIn,\n outputToken: poolConfig.tokenOut,\n inputAmount: state.inputAmount,\n poolConfig,\n signal: controller.signal,\n });\n\n if (controller.signal.aborted) {\n return;\n }\n\n setState((prev) => ({ ...prev, outputAmount, routeInfo }));\n } catch (err) {\n if (controller.signal.aborted) {\n return;\n }\n\n const errorMessage =\n err instanceof Error ? err.message : \"Failed to get quote\";\n\n setState((prev) => ({\n ...prev,\n outputAmount: \"\",\n error: errorMessage,\n }));\n } finally {\n if (!controller.signal.aborted) {\n setState((prev) => ({ ...prev, loading: false }));\n }\n }\n }\n\n debounceTimeout.current = setTimeout(\n updateQuote,\n RATE_LIMIT_CONFIG.QUOTE_DEBOUNCE\n );\n\n return () => {\n if (debounceTimeout.current) {\n clearTimeout(debounceTimeout.current);\n }\n if (abortController.current) {\n abortController.current.abort();\n }\n };\n }, [state.inputAmount, poolConfig, signer]);\n\n return;\n}\n","import { ethers } from \"ethers\";\nimport { executeSwap, type SwapState } from \"@uniswap-widget/core\";\n\n/**\n * React binding for the core `executeSwap`. Manages loading/error state; the\n * swap itself (approve, send, wait, callback) lives in `@uniswap-widget/core`.\n */\nexport default function useSwap({\n state,\n setState,\n onSwap,\n signer,\n}: {\n state: SwapState;\n setState: React.Dispatch<React.SetStateAction<SwapState>>;\n onSwap?: (inputAmount: string, outputAmount: string) => Promise<void>;\n signer?: ethers.Signer;\n}) {\n async function swap() {\n if (!signer) {\n setState((prev) => ({ ...prev, error: \"Please connect your wallet\" }));\n return;\n }\n\n if (!state.inputToken || !state.outputToken) {\n setState((prev) => ({ ...prev, error: \"Tokens not initialized\" }));\n return;\n }\n\n setState((prev) => ({ ...prev, txLoading: true }));\n\n try {\n await executeSwap({\n signer,\n inputToken: state.inputToken,\n outputToken: state.outputToken,\n inputAmount: state.inputAmount,\n outputAmount: state.outputAmount,\n onSwap,\n });\n } catch (error) {\n setState((prev) => ({\n ...prev,\n error: error instanceof Error ? error.message : \"Swap failed\",\n }));\n } finally {\n setState((prev) => ({ ...prev, txLoading: false }));\n }\n }\n\n return {\n swap,\n };\n}\n","import React, { useState, useMemo, useEffect } from \"react\";\nimport { useAccount, useWalletClient } from \"wagmi\";\nimport { ethers } from \"ethers\";\nimport {\n DEFAULT_POOL_CONFIG,\n lightTheme,\n type SwapState,\n type SwapProps,\n type ThemeConfig,\n} from \"@uniswap-widget/core\";\nimport useQuote from \"../hooks/useQuote\";\nimport useSwap from \"../hooks/useSwap\";\nimport { useAppKit } from \"@reown/appkit/react\";\n\nconst cx = (...classes: (string | false | null | undefined)[]) =>\n classes.filter(Boolean).join(\" \");\n\nconst ArrowDown = (props: React.SVGProps<SVGSVGElement>) => (\n <svg {...props} viewBox=\"0 0 512 512\" className=\"text-2xl w-6 h-6\" fill=\"currentColor\">\n <path d=\"M256 400L56 200h400L256 400z\"/>\n </svg>\n)\n\nconst SwapWidget: React.FC<SwapProps> = ({\n poolConfig = DEFAULT_POOL_CONFIG,\n theme: customTheme = {},\n onSwap,\n}) => {\n const { open } = useAppKit();\n const { isConnected } = useAccount();\n const { data: walletClient } = useWalletClient();\n const [isSwapping, setIsSwapping] = useState(false);\n\n const signer = useMemo(() => {\n if (!walletClient) return undefined;\n const { account, chain, transport } = walletClient;\n const network = {\n chainId: chain.id,\n name: chain.name,\n ensAddress: chain.contracts?.ensRegistry?.address,\n };\n const provider = new ethers.providers.Web3Provider(transport, network);\n return provider.getSigner(account.address);\n }, [walletClient]);\n\n // Merge custom theme with default light theme\n const theme = useMemo<ThemeConfig>(\n () => ({\n ...lightTheme,\n ...customTheme,\n tokenButton: {\n ...lightTheme.tokenButton,\n ...customTheme.tokenButton,\n },\n swapButton: {\n ...lightTheme.swapButton,\n ...customTheme.swapButton,\n },\n connectButton: {\n ...lightTheme.connectButton,\n ...customTheme.connectButton,\n },\n inputField: {\n ...lightTheme.inputField,\n ...customTheme.inputField,\n },\n buySection: {\n ...lightTheme.buySection,\n ...customTheme.buySection,\n },\n }),\n [customTheme]\n );\n\n const [state, setState] = useState<SwapState>({\n inputAmount: \"\",\n outputAmount: \"\",\n inputToken: null,\n outputToken: null,\n loading: false,\n error: null,\n inputDisabled: true,\n });\n\n useEffect(() => {\n setState((prev) => ({\n ...prev,\n inputDisabled: !isConnected,\n error: !isConnected ? \"Please connect your wallet\" : null,\n }));\n }, [isConnected]);\n\n // Always call hooks, but pass undefined if no signer\n useQuote({ state, setState, poolConfig, signer: signer || undefined });\n const { swap } = useSwap({ state, setState, onSwap, signer: signer || undefined });\n\n const handleSwap = async () => {\n if (!signer) {\n setState(prev => ({ ...prev, error: \"Please connect your wallet\" }));\n return;\n }\n setIsSwapping(true);\n try {\n await swap();\n } finally {\n setIsSwapping(false);\n setState((prev) => ({ ...prev, inputAmount: \"\", outputAmount: \"\" }));\n }\n };\n\n const handleInputAmountChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value;\n if (value === \"\" || /^\\d*\\.?\\d*$/.test(value)) {\n setState((prev) => ({ ...prev, inputAmount: value }));\n }\n };\n\n const onConnectWallet = async () => {\n open({\n view: \"Connect\",\n });\n };\n\n return (\n <div\n className=\"relative w-full max-w-md rounded-xl p-2\"\n style={{ backgroundColor: theme.background }}\n >\n {/* Sell Section */}\n <div\n className=\"p-4 rounded-2xl relative\"\n style={{\n backgroundColor: theme.foreground,\n border: `1px solid ${theme.border}`,\n opacity: !isConnected ? 0.5 : 1,\n }}\n >\n <label className=\"block mb-2\" style={{ color: theme.textSecondary }}>\n Sell\n </label>\n <div className=\"flex items-center\">\n <input\n type=\"text\"\n disabled={!isConnected}\n value={state.inputAmount}\n onChange={handleInputAmountChange}\n className={cx(\n \"w-full text-2xl outline-none\",\n !isConnected && \"cursor-not-allowed\"\n )}\n placeholder=\"0\"\n inputMode=\"decimal\"\n style={{\n backgroundColor: !isConnected\n ? theme.inputField.disabledBackground\n : theme.inputField.background,\n color: !isConnected\n ? theme.inputField.disabledText\n : theme.inputField.text,\n }}\n />\n <div className=\"flex flex-col gap-2\">\n <div\n className={cx(\n \"ml-2 p-3 py-2 rounded-full flex items-center justify-center gap-2 min-w-[140px]\",\n !isConnected && \"opacity-50\"\n )}\n style={{\n backgroundColor: theme.tokenButton.background,\n border: `1px solid ${theme.tokenButton.border}`,\n }}\n >\n {poolConfig.tokenIn.logoURI && (\n <img\n src={poolConfig.tokenIn.logoURI}\n alt={poolConfig.tokenIn.symbol}\n className=\"h-[20px] w-[20px] flex-shrink-0 rounded-full\"\n onError={(e) => {\n (e.target as HTMLImageElement).style.display = \"none\";\n }}\n />\n )}\n <span\n style={{ color: theme.tokenButton.text }}\n className=\"font-bold text-sm\"\n >\n {poolConfig.tokenIn.symbol}\n </span>\n </div>\n </div>\n </div>\n </div>\n\n {/* Swap Arrow */}\n <div className=\"relative z-10 flex justify-center items-center h-[5px]\">\n <div\n className=\"rounded-2xl w-[40px] h-[40px] flex justify-center items-center\"\n style={{ \n backgroundColor: theme.border,\n opacity: !isConnected ? 0.5 : 1\n }}\n >\n <ArrowDown className=\"text-2xl\" style={{ color: theme.text }} />\n </div>\n </div>\n\n {/* Buy Section */}\n <div\n className=\"mb-2 p-4 rounded-2xl relative\"\n style={{\n backgroundColor: theme.buySection.background,\n border: `1px solid ${theme.buySection.border}`,\n opacity: !isConnected ? 0.5 : 1,\n }}\n >\n <label className=\"block mb-2\" style={{ color: theme.textSecondary }}>\n Buy\n </label>\n <div className=\"flex items-center\">\n <input\n type=\"text\"\n value={\n state.loading ? \"Fetching Quotes\" : state.outputAmount || \"0\"\n }\n readOnly\n disabled={true}\n className={cx(\n \"w-full text-2xl outline-none disabled:text-lg\",\n !isConnected && \"cursor-not-allowed\"\n )}\n style={{\n backgroundColor: !isConnected\n ? theme.inputField.disabledBackground\n : theme.inputField.background,\n color: !isConnected\n ? theme.inputField.disabledText\n : theme.inputField.text,\n opacity: state.loading ? 0.3 : !isConnected ? 0.5 : 0.8,\n }}\n placeholder=\"0\"\n />\n <div className=\"flex flex-col gap-2\">\n <div\n className={cx(\n \"ml-2 p-3 py-2 rounded-full flex items-center justify-center gap-2 min-w-[140px]\",\n !isConnected && \"opacity-50\"\n )}\n style={{\n backgroundColor: theme.tokenButton.background,\n border: `1px solid ${theme.tokenButton.border}`,\n padding: `${theme.tokenButton.paddingY}px ${theme.tokenButton.paddingX}px`,\n }}\n >\n {poolConfig.tokenOut.logoURI && (\n <img\n src={poolConfig.tokenOut.logoURI}\n alt={poolConfig.tokenOut.symbol}\n className=\"h-[20px] w-[20px] flex-shrink-0 rounded-full\"\n onError={(e) => {\n (e.target as HTMLImageElement).style.display = \"none\";\n }}\n />\n )}\n <span\n style={{ color: theme.tokenButton.text }}\n className=\"font-bold text-sm\"\n >\n {poolConfig.tokenOut.symbol}\n </span>\n </div>\n </div>\n </div>\n </div>\n\n {/* Error Message */}\n {state.error && (\n <div className=\"mb-2 p-4 bg-red-50 text-red-500 rounded-2xl overflow-x-hidden\">\n {state.error}\n </div>\n )}\n\n {/* Action Button */}\n {isConnected ? (\n <button\n disabled={\n state.loading ||\n isSwapping ||\n !state.inputAmount ||\n Number(state.inputAmount) <= 0\n }\n onClick={handleSwap}\n className=\"w-full py-4 rounded-2xl transition-colors cursor-pointer\"\n style={{\n backgroundColor:\n state.loading ||\n isSwapping ||\n !state.inputAmount ||\n Number(state.inputAmount) <= 0\n ? theme.swapButton.disabledBackground\n : theme.swapButton.background,\n color:\n state.loading ||\n isSwapping ||\n !state.inputAmount ||\n Number(state.inputAmount) <= 0\n ? theme.swapButton.disabledText\n : theme.swapButton.text,\n }}\n >\n {isSwapping ? \"Swapping...\" : state.loading ? \"Getting Quote...\" : \"Swap\"}\n </button>\n ) : (\n <button\n onClick={onConnectWallet}\n className=\"w-full py-4 rounded-2xl transition-colors\"\n style={{\n backgroundColor: theme.connectButton.background,\n color: theme.connectButton.text,\n }}\n >\n Connect Wallet\n </button>\n )}\n\n {/* Price Info */}\n {state.inputAmount && state.outputAmount && (\n <div className=\"p-4 rounded-2xl\">\n <div\n className=\"flex justify-between items-center text-sm mb-2\"\n style={{ color: theme.textSecondary }}\n >\n 1 {poolConfig.tokenIn.symbol} ={\" \"}\n {(Number(state.outputAmount) / Number(state.inputAmount)).toFixed(\n 6\n )}{\" \"}\n {poolConfig.tokenOut.symbol}\n </div>\n\n {state.routeInfo && (\n <div\n className=\"mt-2 text-xs\"\n style={{ color: theme.textSecondary }}\n >\n {state.routeInfo.isDirectRoute ? (\n <div className=\"flex justify-between\">\n <span>Direct swap</span>\n <span>{state.routeInfo.routeString}</span>\n </div>\n ) : (\n <div className=\"flex justify-between\">\n <span>Route: {state.routeInfo.routeString}</span>\n </div>\n )}\n </div>\n )}\n </div>\n )}\n\n {/* Account Button */}\n {isConnected && (\n <div className=\"flex justify-center items-center mt-2\">\n <appkit-account-button />\n </div>\n )}\n </div>\n );\n};\n\nexport default SwapWidget;\n","\"use client\";\n\nimport { WagmiAdapter } from \"@reown/appkit-adapter-wagmi\";\nimport { QueryClient, QueryClientProvider } from \"@tanstack/react-query\";\nimport { WagmiProvider } from \"wagmi\";\n\nexport interface ProviderProps {\n children: React.ReactNode;\n wagmiAdapter: WagmiAdapter;\n queryClient?: QueryClient;\n}\n\nexport function Provider({\n children,\n wagmiAdapter,\n queryClient = new QueryClient(),\n}: ProviderProps) {\n return (\n <WagmiProvider config={wagmiAdapter.wagmiConfig}>\n <QueryClientProvider client={queryClient}>{children}</QueryClientProvider>\n </WagmiProvider>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;;;AAcA,SAAwB,SAAS;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKG;AACD,QAAM,kBAAkB,OAAA;AACxB,QAAM,kBAAkB,OAAe,EAAE;AACzC,QAAM,kBAAkB,OAAA;AAExB,YAAU,MAAM;AAEd,aAAS,CAAC,UAAU;AAAA,MAClB,GAAG;AAAA,MACH,YAAY,WAAW;AAAA,MACvB,aAAa,WAAW;AAAA,IAAA,EACxB;AAAA,EACJ,GAAG,CAAC,UAAU,CAAC;AAEf,YAAU,MAAM;AACd,QAAI,gBAAgB,SAAS;AAC3B,mBAAa,gBAAgB,OAAO;AAAA,IACtC;AAEA,QAAI,gBAAgB,SAAS;AAC3B,sBAAgB,QAAQ,MAAA;AAAA,IAC1B;AAEA,mBAAe,cAAc;AAC3B,UAAI,CAAC,MAAM,eAAe,OAAO,MAAM,WAAW,MAAM,GAAG;AACzD,iBAAS,CAAC,UAAU,EAAE,GAAG,MAAM,cAAc,KAAK;AAClD;AAAA,MACF;AAEA,UAAI,CAAC,QAAQ;AACX,iBAAS,CAAC,UAAU;AAAA,UAClB,GAAG;AAAA,UACH,cAAc;AAAA,UACd,OAAO;AAAA,QAAA,EACP;AACF;AAAA,MACF;AAEA,YAAM,WAAW,GAAG,WAAW,QAAQ,OAAO,IAAI,WAAW,SAAS,OAAO,IAAI,MAAM,WAAW;AAClG,UAAI,gBAAgB,YAAY,UAAU;AACxC;AAAA,MACF;AACA,sBAAgB,UAAU;AAE1B,YAAM,aAAa,IAAI,gBAAA;AACvB,sBAAgB,UAAU;AAE1B,UAAI;AACF,iBAAS,CAAC,UAAU,EAAE,GAAG,MAAM,SAAS,MAAM,OAAO,KAAA,EAAO;AAE5D,cAAM,EAAE,cAAc,UAAA,IAAc,MAAM,SAAS;AAAA,UACjD;AAAA,UACA,YAAY,WAAW;AAAA,UACvB,aAAa,WAAW;AAAA,UACxB,aAAa,MAAM;AAAA,UACnB;AAAA,UACA,QAAQ,WAAW;AAAA,QAAA,CACpB;AAED,YAAI,WAAW,OAAO,SAAS;AAC7B;AAAA,QACF;AAEA,iBAAS,CAAC,UAAU,EAAE,GAAG,MAAM,cAAc,YAAY;AAAA,MAC3D,SAAS,KAAK;AACZ,YAAI,WAAW,OAAO,SAAS;AAC7B;AAAA,QACF;AAEA,cAAM,eACJ,eAAe,QAAQ,IAAI,UAAU;AAEvC,iBAAS,CAAC,UAAU;AAAA,UAClB,GAAG;AAAA,UACH,cAAc;AAAA,UACd,OAAO;AAAA,QAAA,EACP;AAAA,MACJ,UAAA;AACE,YAAI,CAAC,WAAW,OAAO,SAAS;AAC9B,mBAAS,CAAC,UAAU,EAAE,GAAG,MAAM,SAAS,QAAQ;AAAA,QAClD;AAAA,MACF;AAAA,IACF;AAEA,oBAAgB,UAAU;AAAA,MACxB;AAAA,MACA,kBAAkB;AAAA,IAAA;AAGpB,WAAO,MAAM;AACX,UAAI,gBAAgB,SAAS;AAC3B,qBAAa,gBAAgB,OAAO;AAAA,MACtC;AACA,UAAI,gBAAgB,SAAS;AAC3B,wBAAgB,QAAQ,MAAA;AAAA,MAC1B;AAAA,IACF;AAAA,EACF,GAAG,CAAC,MAAM,aAAa,YAAY,MAAM,CAAC;AAE1C;AACF;ACrHA,SAAwB,QAAQ;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKG;AACD,iBAAe,OAAO;AACpB,QAAI,CAAC,QAAQ;AACX,eAAS,CAAC,UAAU,EAAE,GAAG,MAAM,OAAO,+BAA+B;AACrE;AAAA,IACF;AAEA,QAAI,CAAC,MAAM,cAAc,CAAC,MAAM,aAAa;AAC3C,eAAS,CAAC,UAAU,EAAE,GAAG,MAAM,OAAO,2BAA2B;AACjE;AAAA,IACF;AAEA,aAAS,CAAC,UAAU,EAAE,GAAG,MAAM,WAAW,OAAO;AAEjD,QAAI;AACF,YAAM,YAAY;AAAA,QAChB;AAAA,QACA,YAAY,MAAM;AAAA,QAClB,aAAa,MAAM;AAAA,QACnB,aAAa,MAAM;AAAA,QACnB,cAAc,MAAM;AAAA,QACpB;AAAA,MAAA,CACD;AAAA,IACH,SAAS,OAAO;AACd,eAAS,CAAC,UAAU;AAAA,QAClB,GAAG;AAAA,QACH,OAAO,iBAAiB,QAAQ,MAAM,UAAU;AAAA,MAAA,EAChD;AAAA,IACJ,UAAA;AACE,eAAS,CAAC,UAAU,EAAE,GAAG,MAAM,WAAW,QAAQ;AAAA,IACpD;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,EAAA;AAEJ;ACvCA,MAAM,KAAK,IAAI,YACb,QAAQ,OAAO,OAAO,EAAE,KAAK,GAAG;AAElC,MAAM,YAAY,CAAC,UACjB,oBAAC,OAAA,EAAK,GAAG,OAAO,SAAQ,eAAc,WAAU,oBAAmB,MAAK,gBACtE,8BAAC,QAAA,EAAK,GAAE,gCAA8B,GACxC;AAGF,MAAM,aAAkC,CAAC;AAAA,EACvC,aAAa;AAAA,EACb,OAAO,cAAc,CAAA;AAAA,EACrB;AACF,MAAM;AACJ,QAAM,EAAE,KAAA,IAAS,UAAA;AACjB,QAAM,EAAE,YAAA,IAAgB,WAAA;AACxB,QAAM,EAAE,MAAM,aAAA,IAAiB,gBAAA;AAC/B,QAAM,CAAC,YAAY,aAAa,IAAI,SAAS,KAAK;AAElD,QAAM,SAAS,QAAQ,MAAM;;AAC3B,QAAI,CAAC,aAAc,QAAO;AAC1B,UAAM,EAAE,SAAS,OAAO,UAAA,IAAc;AACtC,UAAM,UAAU;AAAA,MACd,SAAS,MAAM;AAAA,MACf,MAAM,MAAM;AAAA,MACZ,aAAY,iBAAM,cAAN,mBAAiB,gBAAjB,mBAA8B;AAAA,IAAA;AAE5C,UAAM,WAAW,IAAI,OAAO,UAAU,aAAa,WAAW,OAAO;AACrE,WAAO,SAAS,UAAU,QAAQ,OAAO;AAAA,EAC3C,GAAG,CAAC,YAAY,CAAC;AAGjB,QAAM,QAAQ;AAAA,IACZ,OAAO;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,MACH,aAAa;AAAA,QACX,GAAG,WAAW;AAAA,QACd,GAAG,YAAY;AAAA,MAAA;AAAA,MAEjB,YAAY;AAAA,QACV,GAAG,WAAW;AAAA,QACd,GAAG,YAAY;AAAA,MAAA;AAAA,MAEjB,eAAe;AAAA,QACb,GAAG,WAAW;AAAA,QACd,GAAG,YAAY;AAAA,MAAA;AAAA,MAEjB,YAAY;AAAA,QACV,GAAG,WAAW;AAAA,QACd,GAAG,YAAY;AAAA,MAAA;AAAA,MAEjB,YAAY;AAAA,QACV,GAAG,WAAW;AAAA,QACd,GAAG,YAAY;AAAA,MAAA;AAAA,IACjB;AAAA,IAEF,CAAC,WAAW;AAAA,EAAA;AAGd,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAoB;AAAA,IAC5C,aAAa;AAAA,IACb,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,SAAS;AAAA,IACT,OAAO;AAAA,IACP,eAAe;AAAA,EAAA,CAChB;AAED,YAAU,MAAM;AACd,aAAS,CAAC,UAAU;AAAA,MAClB,GAAG;AAAA,MACH,eAAe,CAAC;AAAA,MAChB,OAAO,CAAC,cAAc,+BAA+B;AAAA,IAAA,EACrD;AAAA,EACJ,GAAG,CAAC,WAAW,CAAC;AAGhB,WAAS,EAAE,OAAO,UAAU,YAAY,QAAQ,UAAU,QAAW;AACrE,QAAM,EAAE,KAAA,IAAS,QAAQ,EAAE,OAAO,UAAU,QAAQ,QAAQ,UAAU,QAAW;AAEjF,QAAM,aAAa,YAAY;AAC7B,QAAI,CAAC,QAAQ;AACX,eAAS,WAAS,EAAE,GAAG,MAAM,OAAO,+BAA+B;AACnE;AAAA,IACF;AACA,kBAAc,IAAI;AAClB,QAAI;AACF,YAAM,KAAA;AAAA,IACR,UAAA;AACE,oBAAc,KAAK;AACnB,eAAS,CAAC,UAAU,EAAE,GAAG,MAAM,aAAa,IAAI,cAAc,GAAA,EAAK;AAAA,IACrE;AAAA,EACF;AAEA,QAAM,0BAA0B,CAAC,MAA2C;AAC1E,UAAM,QAAQ,EAAE,OAAO;AACvB,QAAI,UAAU,MAAM,cAAc,KAAK,KAAK,GAAG;AAC7C,eAAS,CAAC,UAAU,EAAE,GAAG,MAAM,aAAa,QAAQ;AAAA,IACtD;AAAA,EACF;AAEA,QAAM,kBAAkB,YAAY;AAClC,SAAK;AAAA,MACH,MAAM;AAAA,IAAA,CACP;AAAA,EACH;AAEA,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAU;AAAA,MACV,OAAO,EAAE,iBAAiB,MAAM,WAAA;AAAA,MAGhC,UAAA;AAAA,QAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAO;AAAA,cACL,iBAAiB,MAAM;AAAA,cACvB,QAAQ,aAAa,MAAM,MAAM;AAAA,cACjC,SAAS,CAAC,cAAc,MAAM;AAAA,YAAA;AAAA,YAGhC,UAAA;AAAA,cAAA,oBAAC,SAAA,EAAM,WAAU,cAAa,OAAO,EAAE,OAAO,MAAM,cAAA,GAAiB,UAAA,OAAA,CAErE;AAAA,cACA,qBAAC,OAAA,EAAI,WAAU,qBACb,UAAA;AAAA,gBAAA;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,MAAK;AAAA,oBACL,UAAU,CAAC;AAAA,oBACX,OAAO,MAAM;AAAA,oBACb,UAAU;AAAA,oBACV,WAAW;AAAA,sBACT;AAAA,sBACA,CAAC,eAAe;AAAA,oBAAA;AAAA,oBAElB,aAAY;AAAA,oBACZ,WAAU;AAAA,oBACV,OAAO;AAAA,sBACL,iBAAiB,CAAC,cACd,MAAM,WAAW,qBACjB,MAAM,WAAW;AAAA,sBACrB,OAAO,CAAC,cACJ,MAAM,WAAW,eACjB,MAAM,WAAW;AAAA,oBAAA;AAAA,kBACvB;AAAA,gBAAA;AAAA,gBAEF,oBAAC,OAAA,EAAI,WAAU,uBACb,UAAA;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,WAAW;AAAA,sBACT;AAAA,sBACA,CAAC,eAAe;AAAA,oBAAA;AAAA,oBAElB,OAAO;AAAA,sBACL,iBAAiB,MAAM,YAAY;AAAA,sBACnC,QAAQ,aAAa,MAAM,YAAY,MAAM;AAAA,oBAAA;AAAA,oBAG9C,UAAA;AAAA,sBAAA,WAAW,QAAQ,WAClB;AAAA,wBAAC;AAAA,wBAAA;AAAA,0BACC,KAAK,WAAW,QAAQ;AAAA,0BACxB,KAAK,WAAW,QAAQ;AAAA,0BACxB,WAAU;AAAA,0BACV,SAAS,CAAC,MAAM;AACb,8BAAE,OAA4B,MAAM,UAAU;AAAA,0BACjD;AAAA,wBAAA;AAAA,sBAAA;AAAA,sBAGJ;AAAA,wBAAC;AAAA,wBAAA;AAAA,0BACC,OAAO,EAAE,OAAO,MAAM,YAAY,KAAA;AAAA,0BAClC,WAAU;AAAA,0BAET,qBAAW,QAAQ;AAAA,wBAAA;AAAA,sBAAA;AAAA,oBACtB;AAAA,kBAAA;AAAA,gBAAA,EACF,CACF;AAAA,cAAA,EAAA,CACF;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,QAIF,oBAAC,OAAA,EAAI,WAAU,0DACb,UAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAO;AAAA,cACL,iBAAiB,MAAM;AAAA,cACvB,SAAS,CAAC,cAAc,MAAM;AAAA,YAAA;AAAA,YAGhC,UAAA,oBAAC,aAAU,WAAU,YAAW,OAAO,EAAE,OAAO,MAAM,OAAK,CAAG;AAAA,UAAA;AAAA,QAAA,GAElE;AAAA,QAGA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAO;AAAA,cACL,iBAAiB,MAAM,WAAW;AAAA,cAClC,QAAQ,aAAa,MAAM,WAAW,MAAM;AAAA,cAC5C,SAAS,CAAC,cAAc,MAAM;AAAA,YAAA;AAAA,YAGhC,UAAA;AAAA,cAAA,oBAAC,SAAA,EAAM,WAAU,cAAa,OAAO,EAAE,OAAO,MAAM,cAAA,GAAiB,UAAA,MAAA,CAErE;AAAA,cACA,qBAAC,OAAA,EAAI,WAAU,qBACb,UAAA;AAAA,gBAAA;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,MAAK;AAAA,oBACL,OACE,MAAM,UAAU,oBAAoB,MAAM,gBAAgB;AAAA,oBAE5D,UAAQ;AAAA,oBACR,UAAU;AAAA,oBACV,WAAW;AAAA,sBACT;AAAA,sBACA,CAAC,eAAe;AAAA,oBAAA;AAAA,oBAElB,OAAO;AAAA,sBACL,iBAAiB,CAAC,cACd,MAAM,WAAW,qBACjB,MAAM,WAAW;AAAA,sBACrB,OAAO,CAAC,cACJ,MAAM,WAAW,eACjB,MAAM,WAAW;AAAA,sBACrB,SAAS,MAAM,UAAU,MAAM,CAAC,cAAc,MAAM;AAAA,oBAAA;AAAA,oBAEtD,aAAY;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAEd,oBAAC,OAAA,EAAI,WAAU,uBACb,UAAA;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,WAAW;AAAA,sBACT;AAAA,sBACA,CAAC,eAAe;AAAA,oBAAA;AAAA,oBAElB,OAAO;AAAA,sBACL,iBAAiB,MAAM,YAAY;AAAA,sBACnC,QAAQ,aAAa,MAAM,YAAY,MAAM;AAAA,sBAC7C,SAAS,GAAG,MAAM,YAAY,QAAQ,MAAM,MAAM,YAAY,QAAQ;AAAA,oBAAA;AAAA,oBAGvE,UAAA;AAAA,sBAAA,WAAW,SAAS,WACnB;AAAA,wBAAC;AAAA,wBAAA;AAAA,0BACC,KAAK,WAAW,SAAS;AAAA,0BACzB,KAAK,WAAW,SAAS;AAAA,0BACzB,WAAU;AAAA,0BACV,SAAS,CAAC,MAAM;AACb,8BAAE,OAA4B,MAAM,UAAU;AAAA,0BACjD;AAAA,wBAAA;AAAA,sBAAA;AAAA,sBAGJ;AAAA,wBAAC;AAAA,wBAAA;AAAA,0BACC,OAAO,EAAE,OAAO,MAAM,YAAY,KAAA;AAAA,0BAClC,WAAU;AAAA,0BAET,qBAAW,SAAS;AAAA,wBAAA;AAAA,sBAAA;AAAA,oBACvB;AAAA,kBAAA;AAAA,gBAAA,EACF,CACF;AAAA,cAAA,EAAA,CACF;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,QAID,MAAM,SACL,oBAAC,SAAI,WAAU,iEACZ,gBAAM,OACT;AAAA,QAID,cACC;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,UACE,MAAM,WACN,cACA,CAAC,MAAM,eACP,OAAO,MAAM,WAAW,KAAK;AAAA,YAE/B,SAAS;AAAA,YACT,WAAU;AAAA,YACV,OAAO;AAAA,cACL,iBACE,MAAM,WACN,cACA,CAAC,MAAM,eACP,OAAO,MAAM,WAAW,KAAK,IACzB,MAAM,WAAW,qBACjB,MAAM,WAAW;AAAA,cACvB,OACE,MAAM,WACN,cACA,CAAC,MAAM,eACP,OAAO,MAAM,WAAW,KAAK,IACzB,MAAM,WAAW,eACjB,MAAM,WAAW;AAAA,YAAA;AAAA,YAGxB,UAAA,aAAa,gBAAgB,MAAM,UAAU,qBAAqB;AAAA,UAAA;AAAA,QAAA,IAGrE;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,SAAS;AAAA,YACT,WAAU;AAAA,YACV,OAAO;AAAA,cACL,iBAAiB,MAAM,cAAc;AAAA,cACrC,OAAO,MAAM,cAAc;AAAA,YAAA;AAAA,YAE9B,UAAA;AAAA,UAAA;AAAA,QAAA;AAAA,QAMF,MAAM,eAAe,MAAM,gBAC1B,qBAAC,OAAA,EAAI,WAAU,mBACb,UAAA;AAAA,UAAA;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAU;AAAA,cACV,OAAO,EAAE,OAAO,MAAM,cAAA;AAAA,cACvB,UAAA;AAAA,gBAAA;AAAA,gBACI,WAAW,QAAQ;AAAA,gBAAO;AAAA,gBAAG;AAAA,iBAC9B,OAAO,MAAM,YAAY,IAAI,OAAO,MAAM,WAAW,GAAG;AAAA,kBACxD;AAAA,gBAAA;AAAA,gBACC;AAAA,gBACF,WAAW,SAAS;AAAA,cAAA;AAAA,YAAA;AAAA,UAAA;AAAA,UAGtB,MAAM,aACL;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAU;AAAA,cACV,OAAO,EAAE,OAAO,MAAM,cAAA;AAAA,cAErB,gBAAM,UAAU,gBACf,qBAAC,OAAA,EAAI,WAAU,wBACb,UAAA;AAAA,gBAAA,oBAAC,UAAK,UAAA,cAAA,CAAW;AAAA,gBACjB,oBAAC,QAAA,EAAM,UAAA,MAAM,UAAU,YAAA,CAAY;AAAA,cAAA,EAAA,CACrC,IAEA,oBAAC,OAAA,EAAI,WAAU,wBACb,+BAAC,QAAA,EAAK,UAAA;AAAA,gBAAA;AAAA,gBAAQ,MAAM,UAAU;AAAA,cAAA,EAAA,CAAY,EAAA,CAC5C;AAAA,YAAA;AAAA,UAAA;AAAA,QAEJ,GAEJ;AAAA,QAID,eACC,oBAAC,OAAA,EAAI,WAAU,yCACb,UAAA,oBAAC,2BAAsB,EAAA,CACzB;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAIR;AClWO,SAAS,SAAS;AAAA,EACvB;AAAA,EACA;AAAA,EACA,cAAc,IAAI,YAAA;AACpB,GAAkB;AAChB,SACE,oBAAC,eAAA,EAAc,QAAQ,aAAa,aAClC,8BAAC,qBAAA,EAAoB,QAAQ,aAAc,SAAA,CAAS,EAAA,CACtD;AAEJ;"}
|
package/dist/index.umd.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("react/jsx-runtime"),require("react"),require("wagmi"),require("ethers"),require("@uniswap-widget/core"),require("@reown/appkit/react"),require("@tanstack/react-query"),require("@reown/appkit-adapter-wagmi"),require("@reown/appkit/networks")):"function"==typeof define&&define.amd?define(["exports","react/jsx-runtime","react","wagmi","ethers","@uniswap-widget/core","@reown/appkit/react","@tanstack/react-query","@reown/appkit-adapter-wagmi","@reown/appkit/networks"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).UniswapWidget={},e.jsx,e.React,e.wagmi,e.ethers,e.UniswapWidgetCore,e.reownAppkitReact,e.reactQuery,e.reownAppkitAdapterWagmi,e.reownAppkitNetworks)}(this,function(e,t,n,o,r,i,l,u,a,s){"use strict";const c=(...e)=>e.filter(Boolean).join(" "),d=e=>t.jsx("svg",{...e,viewBox:"0 0 512 512",className:"text-2xl w-6 h-6",fill:"currentColor",children:t.jsx("path",{d:"M256 400L56 200h400L256 400z"})});Object.defineProperty(e,"DEFAULT_DEADLINE_MINUTES",{enumerable:!0,get:()=>i.DEFAULT_DEADLINE_MINUTES}),Object.defineProperty(e,"DEFAULT_SLIPPAGE",{enumerable:!0,get:()=>i.DEFAULT_SLIPPAGE}),Object.defineProperty(e,"SolaceTokenInfo",{enumerable:!0,get:()=>i.SolaceTokenInfo}),Object.defineProperty(e,"VIRTUAL_PROTOCOL_TOKEN",{enumerable:!0,get:()=>i.VIRTUAL_PROTOCOL_TOKEN}),Object.defineProperty(e,"VritualProtocolTokenInfo",{enumerable:!0,get:()=>i.VritualProtocolTokenInfo}),Object.defineProperty(e,"darkTheme",{enumerable:!0,get:()=>i.darkTheme}),Object.defineProperty(e,"lightTheme",{enumerable:!0,get:()=>i.lightTheme}),Object.defineProperty(e,"createAppKit",{enumerable:!0,get:()=>l.createAppKit}),Object.defineProperty(e,"useAppKit",{enumerable:!0,get:()=>l.useAppKit}),Object.defineProperty(e,"WagmiAdapter",{enumerable:!0,get:()=>a.WagmiAdapter}),Object.defineProperty(e,"arbitrum",{enumerable:!0,get:()=>s.arbitrum}),Object.defineProperty(e,"avalanche",{enumerable:!0,get:()=>s.avalanche}),Object.defineProperty(e,"base",{enumerable:!0,get:()=>s.base}),Object.defineProperty(e,"fantom",{enumerable:!0,get:()=>s.fantom}),Object.defineProperty(e,"mainnet",{enumerable:!0,get:()=>s.mainnet}),Object.defineProperty(e,"moonbeam",{enumerable:!0,get:()=>s.moonbeam}),Object.defineProperty(e,"optimism",{enumerable:!0,get:()=>s.optimism}),Object.defineProperty(e,"polygon",{enumerable:!0,get:()=>s.polygon}),Object.defineProperty(e,"solana",{enumerable:!0,get:()=>s.solana}),e.Provider=function({children:e,wagmiAdapter:n,queryClient:r=new u.QueryClient}){return t.jsx(o.WagmiProvider,{config:n.wagmiConfig,children:t.jsx(u.QueryClientProvider,{client:r,children:e})})},e.SwapWidget=({poolConfig:e=i.DEFAULT_POOL_CONFIG,theme:u={},onSwap:a})=>{const{open:s}=l.useAppKit(),{isConnected:p}=o.useAccount(),{data:m}=o.useWalletClient(),[g,b]=n.useState(!1),x=n.useMemo(()=>{var e,t;if(!m)return;const{account:n,chain:o,transport:i}=m,l={chainId:o.id,name:o.name,ensAddress:null==(t=null==(e=o.contracts)?void 0:e.ensRegistry)?void 0:t.address};return new r.ethers.providers.Web3Provider(i,l).getSigner(n.address)},[m]),f=n.useMemo(()=>({...i.lightTheme,...u,tokenButton:{...i.lightTheme.tokenButton,...u.tokenButton},swapButton:{...i.lightTheme.swapButton,...u.swapButton},connectButton:{...i.lightTheme.connectButton,...u.connectButton},inputField:{...i.lightTheme.inputField,...u.inputField},buySection:{...i.lightTheme.buySection,...u.buySection}}),[u]),[y,k]=n.useState({inputAmount:"",outputAmount:"",inputToken:null,outputToken:null,loading:!1,error:null,inputDisabled:!0});n.useEffect(()=>{k(e=>({...e,inputDisabled:!p,error:p?null:"Please connect your wallet"}))},[p]),function({signer:e,state:t,setState:o,poolConfig:r}){const l=n.useRef(),u=n.useRef(""),a=n.useRef();n.useEffect(()=>{o(e=>({...e,inputToken:r.tokenIn,outputToken:r.tokenOut}))},[r]),n.useEffect(()=>(l.current&&clearTimeout(l.current),a.current&&a.current.abort(),l.current=setTimeout(async function(){if(!t.inputAmount||0===Number(t.inputAmount))return void o(e=>({...e,outputAmount:""}));if(!e)return void o(e=>({...e,outputAmount:"",error:"Please connect your wallet to get quotes"}));const n=`${r.tokenIn.address}-${r.tokenOut.address}-${t.inputAmount}`;if(u.current===n)return;u.current=n;const l=new AbortController;a.current=l;try{o(e=>({...e,loading:!0,error:null}));const{outputAmount:n,routeInfo:u}=await i.getQuote({signer:e,inputToken:r.tokenIn,outputToken:r.tokenOut,inputAmount:t.inputAmount,poolConfig:r,signal:l.signal});if(l.signal.aborted)return;o(e=>({...e,outputAmount:n,routeInfo:u}))}catch(s){if(l.signal.aborted)return;const e=s instanceof Error?s.message:"Failed to get quote";o(t=>({...t,outputAmount:"",error:e}))}finally{l.signal.aborted||o(e=>({...e,loading:!1}))}},i.RATE_LIMIT_CONFIG.QUOTE_DEBOUNCE),()=>{l.current&&clearTimeout(l.current),a.current&&a.current.abort()}),[t.inputAmount,r,e])}({state:y,setState:k,poolConfig:e,signer:x||void 0});const{swap:h}=function({state:e,setState:t,onSwap:n,signer:o}){return{swap:async function(){if(o)if(e.inputToken&&e.outputToken){t(e=>({...e,txLoading:!0}));try{await i.executeSwap({signer:o,inputToken:e.inputToken,outputToken:e.outputToken,inputAmount:e.inputAmount,outputAmount:e.outputAmount,onSwap:n})}catch(r){t(e=>({...e,error:r instanceof Error?r.message:"Swap failed"}))}finally{t(e=>({...e,txLoading:!1}))}}else t(e=>({...e,error:"Tokens not initialized"}));else t(e=>({...e,error:"Please connect your wallet"}))}}}({state:y,setState:k,onSwap:a,signer:x||void 0});return t.jsxs("div",{className:"relative w-full max-w-md rounded-xl p-2",style:{backgroundColor:f.background},children:[t.jsxs("div",{className:"p-4 rounded-2xl relative",style:{backgroundColor:f.foreground,border:`1px solid ${f.border}`,opacity:p?1:.5},children:[t.jsx("label",{className:"block mb-2",style:{color:f.textSecondary},children:"Sell"}),t.jsxs("div",{className:"flex items-center",children:[t.jsx("input",{type:"text",disabled:!p,value:y.inputAmount,onChange:e=>{const t=e.target.value;(""===t||/^\d*\.?\d*$/.test(t))&&k(e=>({...e,inputAmount:t}))},className:c("w-full text-2xl outline-none",!p&&"cursor-not-allowed"),placeholder:"0",inputMode:"decimal",style:{backgroundColor:p?f.inputField.background:f.inputField.disabledBackground,color:p?f.inputField.text:f.inputField.disabledText}}),t.jsx("div",{className:"flex flex-col gap-2",children:t.jsxs("div",{className:c("ml-2 p-3 py-2 rounded-full flex items-center justify-center gap-2 min-w-[140px]",!p&&"opacity-50"),style:{backgroundColor:f.tokenButton.background,border:`1px solid ${f.tokenButton.border}`},children:[e.tokenIn.logoURI&&t.jsx("img",{src:e.tokenIn.logoURI,alt:e.tokenIn.symbol,className:"h-[20px] w-[20px] flex-shrink-0 rounded-full",onError:e=>{e.target.style.display="none"}}),t.jsx("span",{style:{color:f.tokenButton.text},className:"font-bold text-sm",children:e.tokenIn.symbol})]})})]})]}),t.jsx("div",{className:"relative z-10 flex justify-center items-center h-[5px]",children:t.jsx("div",{className:"rounded-2xl w-[40px] h-[40px] flex justify-center items-center",style:{backgroundColor:f.border,opacity:p?1:.5},children:t.jsx(d,{className:"text-2xl",style:{color:f.text}})})}),t.jsxs("div",{className:"mb-2 p-4 rounded-2xl relative",style:{backgroundColor:f.buySection.background,border:`1px solid ${f.buySection.border}`,opacity:p?1:.5},children:[t.jsx("label",{className:"block mb-2",style:{color:f.textSecondary},children:"Buy"}),t.jsxs("div",{className:"flex items-center",children:[t.jsx("input",{type:"text",value:y.loading?"Fetching Quotes":y.outputAmount||"0",readOnly:!0,disabled:!0,className:c("w-full text-2xl outline-none disabled:text-lg",!p&&"cursor-not-allowed"),style:{backgroundColor:p?f.inputField.background:f.inputField.disabledBackground,color:p?f.inputField.text:f.inputField.disabledText,opacity:y.loading?.3:p?.8:.5},placeholder:"0"}),t.jsx("div",{className:"flex flex-col gap-2",children:t.jsxs("div",{className:c("ml-2 p-3 py-2 rounded-full flex items-center justify-center gap-2 min-w-[140px]",!p&&"opacity-50"),style:{backgroundColor:f.tokenButton.background,border:`1px solid ${f.tokenButton.border}`,padding:`${f.tokenButton.paddingY}px ${f.tokenButton.paddingX}px`},children:[e.tokenOut.logoURI&&t.jsx("img",{src:e.tokenOut.logoURI,alt:e.tokenOut.symbol,className:"h-[20px] w-[20px] flex-shrink-0 rounded-full",onError:e=>{e.target.style.display="none"}}),t.jsx("span",{style:{color:f.tokenButton.text},className:"font-bold text-sm",children:e.tokenOut.symbol})]})})]})]}),y.error&&t.jsx("div",{className:"mb-2 p-4 bg-red-50 text-red-500 rounded-2xl overflow-x-hidden",children:y.error}),p?t.jsx("button",{disabled:y.loading||g||!y.inputAmount||Number(y.inputAmount)<=0,onClick:async()=>{if(x){b(!0);try{await h()}finally{b(!1),k(e=>({...e,inputAmount:"",outputAmount:""}))}}else k(e=>({...e,error:"Please connect your wallet"}))},className:"w-full py-4 rounded-2xl transition-colors cursor-pointer",style:{backgroundColor:y.loading||g||!y.inputAmount||Number(y.inputAmount)<=0?f.swapButton.disabledBackground:f.swapButton.background,color:y.loading||g||!y.inputAmount||Number(y.inputAmount)<=0?f.swapButton.disabledText:f.swapButton.text},children:g?"Swapping...":y.loading?"Getting Quote...":"Swap"}):t.jsx("button",{onClick:async()=>{s({view:"Connect"})},className:"w-full py-4 rounded-2xl transition-colors",style:{backgroundColor:f.connectButton.background,color:f.connectButton.text},children:"Connect Wallet"}),y.inputAmount&&y.outputAmount&&t.jsxs("div",{className:"p-4 rounded-2xl",children:[t.jsxs("div",{className:"flex justify-between items-center text-sm mb-2",style:{color:f.textSecondary},children:["1 ",e.tokenIn.symbol," ="," ",(Number(y.outputAmount)/Number(y.inputAmount)).toFixed(6)," ",e.tokenOut.symbol]}),y.routeInfo&&t.jsx("div",{className:"mt-2 text-xs",style:{color:f.textSecondary},children:y.routeInfo.isDirectRoute?t.jsxs("div",{className:"flex justify-between",children:[t.jsx("span",{children:"Direct swap"}),t.jsx("span",{children:y.routeInfo.routeString})]}):t.jsx("div",{className:"flex justify-between",children:t.jsxs("span",{children:["Route: ",y.routeInfo.routeString]})})})]}),p&&t.jsx("div",{className:"flex justify-center items-center mt-2",children:t.jsx("appkit-account-button",{})})]})},Object.defineProperty(e,Symbol.toStringTag,{value:"Module"})});
|
|
1
|
+
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("react/jsx-runtime"),require("react"),require("wagmi"),require("ethers"),require("@uniswap-widget/core"),require("@reown/appkit/react"),require("@tanstack/react-query"),require("@reown/appkit-adapter-wagmi"),require("@reown/appkit/networks")):"function"==typeof define&&define.amd?define(["exports","react/jsx-runtime","react","wagmi","ethers","@uniswap-widget/core","@reown/appkit/react","@tanstack/react-query","@reown/appkit-adapter-wagmi","@reown/appkit/networks"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).UniswapWidgetReact={},e.jsx,e.React,e.wagmi,e.ethers,e.UniswapWidgetCore,e.reownAppkitReact,e.reactQuery,e.reownAppkitAdapterWagmi,e.reownAppkitNetworks)}(this,function(e,t,n,o,r,i,l,u,a,s){"use strict";const c=(...e)=>e.filter(Boolean).join(" "),d=e=>t.jsx("svg",{...e,viewBox:"0 0 512 512",className:"text-2xl w-6 h-6",fill:"currentColor",children:t.jsx("path",{d:"M256 400L56 200h400L256 400z"})});Object.defineProperty(e,"DEFAULT_DEADLINE_MINUTES",{enumerable:!0,get:()=>i.DEFAULT_DEADLINE_MINUTES}),Object.defineProperty(e,"DEFAULT_SLIPPAGE",{enumerable:!0,get:()=>i.DEFAULT_SLIPPAGE}),Object.defineProperty(e,"SolaceTokenInfo",{enumerable:!0,get:()=>i.SolaceTokenInfo}),Object.defineProperty(e,"VIRTUAL_PROTOCOL_TOKEN",{enumerable:!0,get:()=>i.VIRTUAL_PROTOCOL_TOKEN}),Object.defineProperty(e,"VritualProtocolTokenInfo",{enumerable:!0,get:()=>i.VritualProtocolTokenInfo}),Object.defineProperty(e,"darkTheme",{enumerable:!0,get:()=>i.darkTheme}),Object.defineProperty(e,"lightTheme",{enumerable:!0,get:()=>i.lightTheme}),Object.defineProperty(e,"createAppKit",{enumerable:!0,get:()=>l.createAppKit}),Object.defineProperty(e,"useAppKit",{enumerable:!0,get:()=>l.useAppKit}),Object.defineProperty(e,"WagmiAdapter",{enumerable:!0,get:()=>a.WagmiAdapter}),Object.defineProperty(e,"arbitrum",{enumerable:!0,get:()=>s.arbitrum}),Object.defineProperty(e,"avalanche",{enumerable:!0,get:()=>s.avalanche}),Object.defineProperty(e,"base",{enumerable:!0,get:()=>s.base}),Object.defineProperty(e,"fantom",{enumerable:!0,get:()=>s.fantom}),Object.defineProperty(e,"mainnet",{enumerable:!0,get:()=>s.mainnet}),Object.defineProperty(e,"moonbeam",{enumerable:!0,get:()=>s.moonbeam}),Object.defineProperty(e,"optimism",{enumerable:!0,get:()=>s.optimism}),Object.defineProperty(e,"polygon",{enumerable:!0,get:()=>s.polygon}),Object.defineProperty(e,"solana",{enumerable:!0,get:()=>s.solana}),e.Provider=function({children:e,wagmiAdapter:n,queryClient:r=new u.QueryClient}){return t.jsx(o.WagmiProvider,{config:n.wagmiConfig,children:t.jsx(u.QueryClientProvider,{client:r,children:e})})},e.SwapWidget=({poolConfig:e=i.DEFAULT_POOL_CONFIG,theme:u={},onSwap:a})=>{const{open:s}=l.useAppKit(),{isConnected:p}=o.useAccount(),{data:m}=o.useWalletClient(),[g,b]=n.useState(!1),x=n.useMemo(()=>{var e,t;if(!m)return;const{account:n,chain:o,transport:i}=m,l={chainId:o.id,name:o.name,ensAddress:null==(t=null==(e=o.contracts)?void 0:e.ensRegistry)?void 0:t.address};return new r.ethers.providers.Web3Provider(i,l).getSigner(n.address)},[m]),f=n.useMemo(()=>({...i.lightTheme,...u,tokenButton:{...i.lightTheme.tokenButton,...u.tokenButton},swapButton:{...i.lightTheme.swapButton,...u.swapButton},connectButton:{...i.lightTheme.connectButton,...u.connectButton},inputField:{...i.lightTheme.inputField,...u.inputField},buySection:{...i.lightTheme.buySection,...u.buySection}}),[u]),[y,k]=n.useState({inputAmount:"",outputAmount:"",inputToken:null,outputToken:null,loading:!1,error:null,inputDisabled:!0});n.useEffect(()=>{k(e=>({...e,inputDisabled:!p,error:p?null:"Please connect your wallet"}))},[p]),function({signer:e,state:t,setState:o,poolConfig:r}){const l=n.useRef(),u=n.useRef(""),a=n.useRef();n.useEffect(()=>{o(e=>({...e,inputToken:r.tokenIn,outputToken:r.tokenOut}))},[r]),n.useEffect(()=>(l.current&&clearTimeout(l.current),a.current&&a.current.abort(),l.current=setTimeout(async function(){if(!t.inputAmount||0===Number(t.inputAmount))return void o(e=>({...e,outputAmount:""}));if(!e)return void o(e=>({...e,outputAmount:"",error:"Please connect your wallet to get quotes"}));const n=`${r.tokenIn.address}-${r.tokenOut.address}-${t.inputAmount}`;if(u.current===n)return;u.current=n;const l=new AbortController;a.current=l;try{o(e=>({...e,loading:!0,error:null}));const{outputAmount:n,routeInfo:u}=await i.getQuote({signer:e,inputToken:r.tokenIn,outputToken:r.tokenOut,inputAmount:t.inputAmount,poolConfig:r,signal:l.signal});if(l.signal.aborted)return;o(e=>({...e,outputAmount:n,routeInfo:u}))}catch(s){if(l.signal.aborted)return;const e=s instanceof Error?s.message:"Failed to get quote";o(t=>({...t,outputAmount:"",error:e}))}finally{l.signal.aborted||o(e=>({...e,loading:!1}))}},i.RATE_LIMIT_CONFIG.QUOTE_DEBOUNCE),()=>{l.current&&clearTimeout(l.current),a.current&&a.current.abort()}),[t.inputAmount,r,e])}({state:y,setState:k,poolConfig:e,signer:x||void 0});const{swap:h}=function({state:e,setState:t,onSwap:n,signer:o}){return{swap:async function(){if(o)if(e.inputToken&&e.outputToken){t(e=>({...e,txLoading:!0}));try{await i.executeSwap({signer:o,inputToken:e.inputToken,outputToken:e.outputToken,inputAmount:e.inputAmount,outputAmount:e.outputAmount,onSwap:n})}catch(r){t(e=>({...e,error:r instanceof Error?r.message:"Swap failed"}))}finally{t(e=>({...e,txLoading:!1}))}}else t(e=>({...e,error:"Tokens not initialized"}));else t(e=>({...e,error:"Please connect your wallet"}))}}}({state:y,setState:k,onSwap:a,signer:x||void 0});return t.jsxs("div",{className:"relative w-full max-w-md rounded-xl p-2",style:{backgroundColor:f.background},children:[t.jsxs("div",{className:"p-4 rounded-2xl relative",style:{backgroundColor:f.foreground,border:`1px solid ${f.border}`,opacity:p?1:.5},children:[t.jsx("label",{className:"block mb-2",style:{color:f.textSecondary},children:"Sell"}),t.jsxs("div",{className:"flex items-center",children:[t.jsx("input",{type:"text",disabled:!p,value:y.inputAmount,onChange:e=>{const t=e.target.value;(""===t||/^\d*\.?\d*$/.test(t))&&k(e=>({...e,inputAmount:t}))},className:c("w-full text-2xl outline-none",!p&&"cursor-not-allowed"),placeholder:"0",inputMode:"decimal",style:{backgroundColor:p?f.inputField.background:f.inputField.disabledBackground,color:p?f.inputField.text:f.inputField.disabledText}}),t.jsx("div",{className:"flex flex-col gap-2",children:t.jsxs("div",{className:c("ml-2 p-3 py-2 rounded-full flex items-center justify-center gap-2 min-w-[140px]",!p&&"opacity-50"),style:{backgroundColor:f.tokenButton.background,border:`1px solid ${f.tokenButton.border}`},children:[e.tokenIn.logoURI&&t.jsx("img",{src:e.tokenIn.logoURI,alt:e.tokenIn.symbol,className:"h-[20px] w-[20px] flex-shrink-0 rounded-full",onError:e=>{e.target.style.display="none"}}),t.jsx("span",{style:{color:f.tokenButton.text},className:"font-bold text-sm",children:e.tokenIn.symbol})]})})]})]}),t.jsx("div",{className:"relative z-10 flex justify-center items-center h-[5px]",children:t.jsx("div",{className:"rounded-2xl w-[40px] h-[40px] flex justify-center items-center",style:{backgroundColor:f.border,opacity:p?1:.5},children:t.jsx(d,{className:"text-2xl",style:{color:f.text}})})}),t.jsxs("div",{className:"mb-2 p-4 rounded-2xl relative",style:{backgroundColor:f.buySection.background,border:`1px solid ${f.buySection.border}`,opacity:p?1:.5},children:[t.jsx("label",{className:"block mb-2",style:{color:f.textSecondary},children:"Buy"}),t.jsxs("div",{className:"flex items-center",children:[t.jsx("input",{type:"text",value:y.loading?"Fetching Quotes":y.outputAmount||"0",readOnly:!0,disabled:!0,className:c("w-full text-2xl outline-none disabled:text-lg",!p&&"cursor-not-allowed"),style:{backgroundColor:p?f.inputField.background:f.inputField.disabledBackground,color:p?f.inputField.text:f.inputField.disabledText,opacity:y.loading?.3:p?.8:.5},placeholder:"0"}),t.jsx("div",{className:"flex flex-col gap-2",children:t.jsxs("div",{className:c("ml-2 p-3 py-2 rounded-full flex items-center justify-center gap-2 min-w-[140px]",!p&&"opacity-50"),style:{backgroundColor:f.tokenButton.background,border:`1px solid ${f.tokenButton.border}`,padding:`${f.tokenButton.paddingY}px ${f.tokenButton.paddingX}px`},children:[e.tokenOut.logoURI&&t.jsx("img",{src:e.tokenOut.logoURI,alt:e.tokenOut.symbol,className:"h-[20px] w-[20px] flex-shrink-0 rounded-full",onError:e=>{e.target.style.display="none"}}),t.jsx("span",{style:{color:f.tokenButton.text},className:"font-bold text-sm",children:e.tokenOut.symbol})]})})]})]}),y.error&&t.jsx("div",{className:"mb-2 p-4 bg-red-50 text-red-500 rounded-2xl overflow-x-hidden",children:y.error}),p?t.jsx("button",{disabled:y.loading||g||!y.inputAmount||Number(y.inputAmount)<=0,onClick:async()=>{if(x){b(!0);try{await h()}finally{b(!1),k(e=>({...e,inputAmount:"",outputAmount:""}))}}else k(e=>({...e,error:"Please connect your wallet"}))},className:"w-full py-4 rounded-2xl transition-colors cursor-pointer",style:{backgroundColor:y.loading||g||!y.inputAmount||Number(y.inputAmount)<=0?f.swapButton.disabledBackground:f.swapButton.background,color:y.loading||g||!y.inputAmount||Number(y.inputAmount)<=0?f.swapButton.disabledText:f.swapButton.text},children:g?"Swapping...":y.loading?"Getting Quote...":"Swap"}):t.jsx("button",{onClick:async()=>{s({view:"Connect"})},className:"w-full py-4 rounded-2xl transition-colors",style:{backgroundColor:f.connectButton.background,color:f.connectButton.text},children:"Connect Wallet"}),y.inputAmount&&y.outputAmount&&t.jsxs("div",{className:"p-4 rounded-2xl",children:[t.jsxs("div",{className:"flex justify-between items-center text-sm mb-2",style:{color:f.textSecondary},children:["1 ",e.tokenIn.symbol," ="," ",(Number(y.outputAmount)/Number(y.inputAmount)).toFixed(6)," ",e.tokenOut.symbol]}),y.routeInfo&&t.jsx("div",{className:"mt-2 text-xs",style:{color:f.textSecondary},children:y.routeInfo.isDirectRoute?t.jsxs("div",{className:"flex justify-between",children:[t.jsx("span",{children:"Direct swap"}),t.jsx("span",{children:y.routeInfo.routeString})]}):t.jsx("div",{className:"flex justify-between",children:t.jsxs("span",{children:["Route: ",y.routeInfo.routeString]})})})]}),p&&t.jsx("div",{className:"flex justify-center items-center mt-2",children:t.jsx("appkit-account-button",{})})]})},Object.defineProperty(e,Symbol.toStringTag,{value:"Module"})});
|
|
2
2
|
//# sourceMappingURL=index.umd.js.map
|
package/dist/index.umd.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.umd.js","sources":["../src/components/SwapWidget.tsx","../src/components/Provider.tsx","../src/hooks/useQuote.ts","../src/hooks/useSwap.ts"],"sourcesContent":["import React, { useState, useMemo, useEffect } from \"react\";\nimport { useAccount, useWalletClient } from \"wagmi\";\nimport { ethers } from \"ethers\";\nimport {\n DEFAULT_POOL_CONFIG,\n lightTheme,\n type SwapState,\n type SwapProps,\n type ThemeConfig,\n} from \"@uniswap-widget/core\";\nimport useQuote from \"../hooks/useQuote\";\nimport useSwap from \"../hooks/useSwap\";\nimport { useAppKit } from \"@reown/appkit/react\";\n\nconst cx = (...classes: (string | false | null | undefined)[]) =>\n classes.filter(Boolean).join(\" \");\n\nconst ArrowDown = (props: React.SVGProps<SVGSVGElement>) => (\n <svg {...props} viewBox=\"0 0 512 512\" className=\"text-2xl w-6 h-6\" fill=\"currentColor\">\n <path d=\"M256 400L56 200h400L256 400z\"/>\n </svg>\n)\n\nconst SwapWidget: React.FC<SwapProps> = ({\n poolConfig = DEFAULT_POOL_CONFIG,\n theme: customTheme = {},\n onSwap,\n}) => {\n const { open } = useAppKit();\n const { isConnected } = useAccount();\n const { data: walletClient } = useWalletClient();\n const [isSwapping, setIsSwapping] = useState(false);\n\n const signer = useMemo(() => {\n if (!walletClient) return undefined;\n const { account, chain, transport } = walletClient;\n const network = {\n chainId: chain.id,\n name: chain.name,\n ensAddress: chain.contracts?.ensRegistry?.address,\n };\n const provider = new ethers.providers.Web3Provider(transport, network);\n return provider.getSigner(account.address);\n }, [walletClient]);\n\n // Merge custom theme with default light theme\n const theme = useMemo<ThemeConfig>(\n () => ({\n ...lightTheme,\n ...customTheme,\n tokenButton: {\n ...lightTheme.tokenButton,\n ...customTheme.tokenButton,\n },\n swapButton: {\n ...lightTheme.swapButton,\n ...customTheme.swapButton,\n },\n connectButton: {\n ...lightTheme.connectButton,\n ...customTheme.connectButton,\n },\n inputField: {\n ...lightTheme.inputField,\n ...customTheme.inputField,\n },\n buySection: {\n ...lightTheme.buySection,\n ...customTheme.buySection,\n },\n }),\n [customTheme]\n );\n\n const [state, setState] = useState<SwapState>({\n inputAmount: \"\",\n outputAmount: \"\",\n inputToken: null,\n outputToken: null,\n loading: false,\n error: null,\n inputDisabled: true,\n });\n\n useEffect(() => {\n setState((prev) => ({\n ...prev,\n inputDisabled: !isConnected,\n error: !isConnected ? \"Please connect your wallet\" : null,\n }));\n }, [isConnected]);\n\n // Always call hooks, but pass undefined if no signer\n useQuote({ state, setState, poolConfig, signer: signer || undefined });\n const { swap } = useSwap({ state, setState, onSwap, signer: signer || undefined });\n\n const handleSwap = async () => {\n if (!signer) {\n setState(prev => ({ ...prev, error: \"Please connect your wallet\" }));\n return;\n }\n setIsSwapping(true);\n try {\n await swap();\n } finally {\n setIsSwapping(false);\n setState((prev) => ({ ...prev, inputAmount: \"\", outputAmount: \"\" }));\n }\n };\n\n const handleInputAmountChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value;\n if (value === \"\" || /^\\d*\\.?\\d*$/.test(value)) {\n setState((prev) => ({ ...prev, inputAmount: value }));\n }\n };\n\n const onConnectWallet = async () => {\n open({\n view: \"Connect\",\n });\n };\n\n return (\n <div\n className=\"relative w-full max-w-md rounded-xl p-2\"\n style={{ backgroundColor: theme.background }}\n >\n {/* Sell Section */}\n <div\n className=\"p-4 rounded-2xl relative\"\n style={{\n backgroundColor: theme.foreground,\n border: `1px solid ${theme.border}`,\n opacity: !isConnected ? 0.5 : 1,\n }}\n >\n <label className=\"block mb-2\" style={{ color: theme.textSecondary }}>\n Sell\n </label>\n <div className=\"flex items-center\">\n <input\n type=\"text\"\n disabled={!isConnected}\n value={state.inputAmount}\n onChange={handleInputAmountChange}\n className={cx(\n \"w-full text-2xl outline-none\",\n !isConnected && \"cursor-not-allowed\"\n )}\n placeholder=\"0\"\n inputMode=\"decimal\"\n style={{\n backgroundColor: !isConnected\n ? theme.inputField.disabledBackground\n : theme.inputField.background,\n color: !isConnected\n ? theme.inputField.disabledText\n : theme.inputField.text,\n }}\n />\n <div className=\"flex flex-col gap-2\">\n <div\n className={cx(\n \"ml-2 p-3 py-2 rounded-full flex items-center justify-center gap-2 min-w-[140px]\",\n !isConnected && \"opacity-50\"\n )}\n style={{\n backgroundColor: theme.tokenButton.background,\n border: `1px solid ${theme.tokenButton.border}`,\n }}\n >\n {poolConfig.tokenIn.logoURI && (\n <img\n src={poolConfig.tokenIn.logoURI}\n alt={poolConfig.tokenIn.symbol}\n className=\"h-[20px] w-[20px] flex-shrink-0 rounded-full\"\n onError={(e) => {\n (e.target as HTMLImageElement).style.display = \"none\";\n }}\n />\n )}\n <span\n style={{ color: theme.tokenButton.text }}\n className=\"font-bold text-sm\"\n >\n {poolConfig.tokenIn.symbol}\n </span>\n </div>\n </div>\n </div>\n </div>\n\n {/* Swap Arrow */}\n <div className=\"relative z-10 flex justify-center items-center h-[5px]\">\n <div\n className=\"rounded-2xl w-[40px] h-[40px] flex justify-center items-center\"\n style={{ \n backgroundColor: theme.border,\n opacity: !isConnected ? 0.5 : 1\n }}\n >\n <ArrowDown className=\"text-2xl\" style={{ color: theme.text }} />\n </div>\n </div>\n\n {/* Buy Section */}\n <div\n className=\"mb-2 p-4 rounded-2xl relative\"\n style={{\n backgroundColor: theme.buySection.background,\n border: `1px solid ${theme.buySection.border}`,\n opacity: !isConnected ? 0.5 : 1,\n }}\n >\n <label className=\"block mb-2\" style={{ color: theme.textSecondary }}>\n Buy\n </label>\n <div className=\"flex items-center\">\n <input\n type=\"text\"\n value={\n state.loading ? \"Fetching Quotes\" : state.outputAmount || \"0\"\n }\n readOnly\n disabled={true}\n className={cx(\n \"w-full text-2xl outline-none disabled:text-lg\",\n !isConnected && \"cursor-not-allowed\"\n )}\n style={{\n backgroundColor: !isConnected\n ? theme.inputField.disabledBackground\n : theme.inputField.background,\n color: !isConnected\n ? theme.inputField.disabledText\n : theme.inputField.text,\n opacity: state.loading ? 0.3 : !isConnected ? 0.5 : 0.8,\n }}\n placeholder=\"0\"\n />\n <div className=\"flex flex-col gap-2\">\n <div\n className={cx(\n \"ml-2 p-3 py-2 rounded-full flex items-center justify-center gap-2 min-w-[140px]\",\n !isConnected && \"opacity-50\"\n )}\n style={{\n backgroundColor: theme.tokenButton.background,\n border: `1px solid ${theme.tokenButton.border}`,\n padding: `${theme.tokenButton.paddingY}px ${theme.tokenButton.paddingX}px`,\n }}\n >\n {poolConfig.tokenOut.logoURI && (\n <img\n src={poolConfig.tokenOut.logoURI}\n alt={poolConfig.tokenOut.symbol}\n className=\"h-[20px] w-[20px] flex-shrink-0 rounded-full\"\n onError={(e) => {\n (e.target as HTMLImageElement).style.display = \"none\";\n }}\n />\n )}\n <span\n style={{ color: theme.tokenButton.text }}\n className=\"font-bold text-sm\"\n >\n {poolConfig.tokenOut.symbol}\n </span>\n </div>\n </div>\n </div>\n </div>\n\n {/* Error Message */}\n {state.error && (\n <div className=\"mb-2 p-4 bg-red-50 text-red-500 rounded-2xl overflow-x-hidden\">\n {state.error}\n </div>\n )}\n\n {/* Action Button */}\n {isConnected ? (\n <button\n disabled={\n state.loading ||\n isSwapping ||\n !state.inputAmount ||\n Number(state.inputAmount) <= 0\n }\n onClick={handleSwap}\n className=\"w-full py-4 rounded-2xl transition-colors cursor-pointer\"\n style={{\n backgroundColor:\n state.loading ||\n isSwapping ||\n !state.inputAmount ||\n Number(state.inputAmount) <= 0\n ? theme.swapButton.disabledBackground\n : theme.swapButton.background,\n color:\n state.loading ||\n isSwapping ||\n !state.inputAmount ||\n Number(state.inputAmount) <= 0\n ? theme.swapButton.disabledText\n : theme.swapButton.text,\n }}\n >\n {isSwapping ? \"Swapping...\" : state.loading ? \"Getting Quote...\" : \"Swap\"}\n </button>\n ) : (\n <button\n onClick={onConnectWallet}\n className=\"w-full py-4 rounded-2xl transition-colors\"\n style={{\n backgroundColor: theme.connectButton.background,\n color: theme.connectButton.text,\n }}\n >\n Connect Wallet\n </button>\n )}\n\n {/* Price Info */}\n {state.inputAmount && state.outputAmount && (\n <div className=\"p-4 rounded-2xl\">\n <div\n className=\"flex justify-between items-center text-sm mb-2\"\n style={{ color: theme.textSecondary }}\n >\n 1 {poolConfig.tokenIn.symbol} ={\" \"}\n {(Number(state.outputAmount) / Number(state.inputAmount)).toFixed(\n 6\n )}{\" \"}\n {poolConfig.tokenOut.symbol}\n </div>\n\n {state.routeInfo && (\n <div\n className=\"mt-2 text-xs\"\n style={{ color: theme.textSecondary }}\n >\n {state.routeInfo.isDirectRoute ? (\n <div className=\"flex justify-between\">\n <span>Direct swap</span>\n <span>{state.routeInfo.routeString}</span>\n </div>\n ) : (\n <div className=\"flex justify-between\">\n <span>Route: {state.routeInfo.routeString}</span>\n </div>\n )}\n </div>\n )}\n </div>\n )}\n\n {/* Account Button */}\n {isConnected && (\n <div className=\"flex justify-center items-center mt-2\">\n <appkit-account-button />\n </div>\n )}\n </div>\n );\n};\n\nexport default SwapWidget;\n","\"use client\";\n\nimport { WagmiAdapter } from \"@reown/appkit-adapter-wagmi\";\nimport { QueryClient, QueryClientProvider } from \"@tanstack/react-query\";\nimport { WagmiProvider } from \"wagmi\";\n\nexport interface ProviderProps {\n children: React.ReactNode;\n wagmiAdapter: WagmiAdapter;\n queryClient?: QueryClient;\n}\n\nexport function Provider({\n children,\n wagmiAdapter,\n queryClient = new QueryClient(),\n}: ProviderProps) {\n return (\n <WagmiProvider config={wagmiAdapter.wagmiConfig}>\n <QueryClientProvider client={queryClient}>{children}</QueryClientProvider>\n </WagmiProvider>\n );\n}\n","import { useEffect, useRef } from \"react\";\nimport { ethers } from \"ethers\";\nimport {\n getQuote,\n RATE_LIMIT_CONFIG,\n type SwapState,\n type PoolConfig,\n} from \"@uniswap-widget/core\";\n\n/**\n * React binding for the core `getQuote`. Owns the reactive concerns — debounce,\n * de-duplication, abort, and state writes — while the actual quote logic lives\n * in `@uniswap-widget/core`.\n */\nexport default function useQuote({\n signer,\n state,\n setState,\n poolConfig,\n}: {\n signer?: ethers.Signer;\n state: SwapState;\n setState: React.Dispatch<React.SetStateAction<SwapState>>;\n poolConfig: PoolConfig;\n}) {\n const debounceTimeout = useRef<NodeJS.Timeout>();\n const lastQuoteParams = useRef<string>(\"\");\n const abortController = useRef<AbortController>();\n\n useEffect(() => {\n // Initialize tokens from pool config\n setState((prev) => ({\n ...prev,\n inputToken: poolConfig.tokenIn,\n outputToken: poolConfig.tokenOut,\n }));\n }, [poolConfig]);\n\n useEffect(() => {\n if (debounceTimeout.current) {\n clearTimeout(debounceTimeout.current);\n }\n\n if (abortController.current) {\n abortController.current.abort();\n }\n\n async function updateQuote() {\n if (!state.inputAmount || Number(state.inputAmount) === 0) {\n setState((prev) => ({ ...prev, outputAmount: \"\" }));\n return;\n }\n\n if (!signer) {\n setState((prev) => ({\n ...prev,\n outputAmount: \"\",\n error: \"Please connect your wallet to get quotes\",\n }));\n return;\n }\n\n const quoteKey = `${poolConfig.tokenIn.address}-${poolConfig.tokenOut.address}-${state.inputAmount}`;\n if (lastQuoteParams.current === quoteKey) {\n return;\n }\n lastQuoteParams.current = quoteKey;\n\n const controller = new AbortController();\n abortController.current = controller;\n\n try {\n setState((prev) => ({ ...prev, loading: true, error: null }));\n\n const { outputAmount, routeInfo } = await getQuote({\n signer,\n inputToken: poolConfig.tokenIn,\n outputToken: poolConfig.tokenOut,\n inputAmount: state.inputAmount,\n poolConfig,\n signal: controller.signal,\n });\n\n if (controller.signal.aborted) {\n return;\n }\n\n setState((prev) => ({ ...prev, outputAmount, routeInfo }));\n } catch (err) {\n if (controller.signal.aborted) {\n return;\n }\n\n const errorMessage =\n err instanceof Error ? err.message : \"Failed to get quote\";\n\n setState((prev) => ({\n ...prev,\n outputAmount: \"\",\n error: errorMessage,\n }));\n } finally {\n if (!controller.signal.aborted) {\n setState((prev) => ({ ...prev, loading: false }));\n }\n }\n }\n\n debounceTimeout.current = setTimeout(\n updateQuote,\n RATE_LIMIT_CONFIG.QUOTE_DEBOUNCE\n );\n\n return () => {\n if (debounceTimeout.current) {\n clearTimeout(debounceTimeout.current);\n }\n if (abortController.current) {\n abortController.current.abort();\n }\n };\n }, [state.inputAmount, poolConfig, signer]);\n\n return;\n}\n","import { ethers } from \"ethers\";\nimport { executeSwap, type SwapState } from \"@uniswap-widget/core\";\n\n/**\n * React binding for the core `executeSwap`. Manages loading/error state; the\n * swap itself (approve, send, wait, callback) lives in `@uniswap-widget/core`.\n */\nexport default function useSwap({\n state,\n setState,\n onSwap,\n signer,\n}: {\n state: SwapState;\n setState: React.Dispatch<React.SetStateAction<SwapState>>;\n onSwap?: (inputAmount: string, outputAmount: string) => Promise<void>;\n signer?: ethers.Signer;\n}) {\n async function swap() {\n if (!signer) {\n setState((prev) => ({ ...prev, error: \"Please connect your wallet\" }));\n return;\n }\n\n if (!state.inputToken || !state.outputToken) {\n setState((prev) => ({ ...prev, error: \"Tokens not initialized\" }));\n return;\n }\n\n setState((prev) => ({ ...prev, txLoading: true }));\n\n try {\n await executeSwap({\n signer,\n inputToken: state.inputToken,\n outputToken: state.outputToken,\n inputAmount: state.inputAmount,\n outputAmount: state.outputAmount,\n onSwap,\n });\n } catch (error) {\n setState((prev) => ({\n ...prev,\n error: error instanceof Error ? error.message : \"Swap failed\",\n }));\n } finally {\n setState((prev) => ({ ...prev, txLoading: false }));\n }\n }\n\n return {\n swap,\n };\n}\n"],"names":["cx","classes","filter","Boolean","join","ArrowDown","props","jsx","viewBox","className","fill","children","d","wagmiAdapter","queryClient","QueryClient","WagmiProvider","config","wagmiConfig","QueryClientProvider","client","poolConfig","DEFAULT_POOL_CONFIG","theme","customTheme","onSwap","open","useAppKit","isConnected","useAccount","data","walletClient","useWalletClient","isSwapping","setIsSwapping","useState","signer","useMemo","account","chain","transport","network","chainId","id","name","ensAddress","_b","_a","contracts","ensRegistry","address","ethers","providers","Web3Provider","getSigner","lightTheme","tokenButton","swapButton","connectButton","inputField","buySection","state","setState","inputAmount","outputAmount","inputToken","outputToken","loading","error","inputDisabled","useEffect","prev","debounceTimeout","useRef","lastQuoteParams","abortController","tokenIn","tokenOut","current","clearTimeout","abort","setTimeout","async","Number","quoteKey","controller","AbortController","routeInfo","getQuote","signal","aborted","err","errorMessage","Error","message","RATE_LIMIT_CONFIG","QUOTE_DEBOUNCE","useQuote","swap","txLoading","executeSwap","useSwap","jsxs","style","backgroundColor","background","foreground","border","opacity","color","textSecondary","type","disabled","value","onChange","e","target","test","placeholder","inputMode","disabledBackground","text","disabledText","logoURI","src","alt","symbol","onError","display","readOnly","padding","paddingY","paddingX","onClick","view","toFixed","isDirectRoute","routeString"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.umd.js","sources":["../src/components/SwapWidget.tsx","../src/components/Provider.tsx","../src/hooks/useQuote.ts","../src/hooks/useSwap.ts"],"sourcesContent":["import React, { useState, useMemo, useEffect } from \"react\";\nimport { useAccount, useWalletClient } from \"wagmi\";\nimport { ethers } from \"ethers\";\nimport {\n DEFAULT_POOL_CONFIG,\n lightTheme,\n type SwapState,\n type SwapProps,\n type ThemeConfig,\n} from \"@uniswap-widget/core\";\nimport useQuote from \"../hooks/useQuote\";\nimport useSwap from \"../hooks/useSwap\";\nimport { useAppKit } from \"@reown/appkit/react\";\n\nconst cx = (...classes: (string | false | null | undefined)[]) =>\n classes.filter(Boolean).join(\" \");\n\nconst ArrowDown = (props: React.SVGProps<SVGSVGElement>) => (\n <svg {...props} viewBox=\"0 0 512 512\" className=\"text-2xl w-6 h-6\" fill=\"currentColor\">\n <path d=\"M256 400L56 200h400L256 400z\"/>\n </svg>\n)\n\nconst SwapWidget: React.FC<SwapProps> = ({\n poolConfig = DEFAULT_POOL_CONFIG,\n theme: customTheme = {},\n onSwap,\n}) => {\n const { open } = useAppKit();\n const { isConnected } = useAccount();\n const { data: walletClient } = useWalletClient();\n const [isSwapping, setIsSwapping] = useState(false);\n\n const signer = useMemo(() => {\n if (!walletClient) return undefined;\n const { account, chain, transport } = walletClient;\n const network = {\n chainId: chain.id,\n name: chain.name,\n ensAddress: chain.contracts?.ensRegistry?.address,\n };\n const provider = new ethers.providers.Web3Provider(transport, network);\n return provider.getSigner(account.address);\n }, [walletClient]);\n\n // Merge custom theme with default light theme\n const theme = useMemo<ThemeConfig>(\n () => ({\n ...lightTheme,\n ...customTheme,\n tokenButton: {\n ...lightTheme.tokenButton,\n ...customTheme.tokenButton,\n },\n swapButton: {\n ...lightTheme.swapButton,\n ...customTheme.swapButton,\n },\n connectButton: {\n ...lightTheme.connectButton,\n ...customTheme.connectButton,\n },\n inputField: {\n ...lightTheme.inputField,\n ...customTheme.inputField,\n },\n buySection: {\n ...lightTheme.buySection,\n ...customTheme.buySection,\n },\n }),\n [customTheme]\n );\n\n const [state, setState] = useState<SwapState>({\n inputAmount: \"\",\n outputAmount: \"\",\n inputToken: null,\n outputToken: null,\n loading: false,\n error: null,\n inputDisabled: true,\n });\n\n useEffect(() => {\n setState((prev) => ({\n ...prev,\n inputDisabled: !isConnected,\n error: !isConnected ? \"Please connect your wallet\" : null,\n }));\n }, [isConnected]);\n\n // Always call hooks, but pass undefined if no signer\n useQuote({ state, setState, poolConfig, signer: signer || undefined });\n const { swap } = useSwap({ state, setState, onSwap, signer: signer || undefined });\n\n const handleSwap = async () => {\n if (!signer) {\n setState(prev => ({ ...prev, error: \"Please connect your wallet\" }));\n return;\n }\n setIsSwapping(true);\n try {\n await swap();\n } finally {\n setIsSwapping(false);\n setState((prev) => ({ ...prev, inputAmount: \"\", outputAmount: \"\" }));\n }\n };\n\n const handleInputAmountChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value;\n if (value === \"\" || /^\\d*\\.?\\d*$/.test(value)) {\n setState((prev) => ({ ...prev, inputAmount: value }));\n }\n };\n\n const onConnectWallet = async () => {\n open({\n view: \"Connect\",\n });\n };\n\n return (\n <div\n className=\"relative w-full max-w-md rounded-xl p-2\"\n style={{ backgroundColor: theme.background }}\n >\n {/* Sell Section */}\n <div\n className=\"p-4 rounded-2xl relative\"\n style={{\n backgroundColor: theme.foreground,\n border: `1px solid ${theme.border}`,\n opacity: !isConnected ? 0.5 : 1,\n }}\n >\n <label className=\"block mb-2\" style={{ color: theme.textSecondary }}>\n Sell\n </label>\n <div className=\"flex items-center\">\n <input\n type=\"text\"\n disabled={!isConnected}\n value={state.inputAmount}\n onChange={handleInputAmountChange}\n className={cx(\n \"w-full text-2xl outline-none\",\n !isConnected && \"cursor-not-allowed\"\n )}\n placeholder=\"0\"\n inputMode=\"decimal\"\n style={{\n backgroundColor: !isConnected\n ? theme.inputField.disabledBackground\n : theme.inputField.background,\n color: !isConnected\n ? theme.inputField.disabledText\n : theme.inputField.text,\n }}\n />\n <div className=\"flex flex-col gap-2\">\n <div\n className={cx(\n \"ml-2 p-3 py-2 rounded-full flex items-center justify-center gap-2 min-w-[140px]\",\n !isConnected && \"opacity-50\"\n )}\n style={{\n backgroundColor: theme.tokenButton.background,\n border: `1px solid ${theme.tokenButton.border}`,\n }}\n >\n {poolConfig.tokenIn.logoURI && (\n <img\n src={poolConfig.tokenIn.logoURI}\n alt={poolConfig.tokenIn.symbol}\n className=\"h-[20px] w-[20px] flex-shrink-0 rounded-full\"\n onError={(e) => {\n (e.target as HTMLImageElement).style.display = \"none\";\n }}\n />\n )}\n <span\n style={{ color: theme.tokenButton.text }}\n className=\"font-bold text-sm\"\n >\n {poolConfig.tokenIn.symbol}\n </span>\n </div>\n </div>\n </div>\n </div>\n\n {/* Swap Arrow */}\n <div className=\"relative z-10 flex justify-center items-center h-[5px]\">\n <div\n className=\"rounded-2xl w-[40px] h-[40px] flex justify-center items-center\"\n style={{ \n backgroundColor: theme.border,\n opacity: !isConnected ? 0.5 : 1\n }}\n >\n <ArrowDown className=\"text-2xl\" style={{ color: theme.text }} />\n </div>\n </div>\n\n {/* Buy Section */}\n <div\n className=\"mb-2 p-4 rounded-2xl relative\"\n style={{\n backgroundColor: theme.buySection.background,\n border: `1px solid ${theme.buySection.border}`,\n opacity: !isConnected ? 0.5 : 1,\n }}\n >\n <label className=\"block mb-2\" style={{ color: theme.textSecondary }}>\n Buy\n </label>\n <div className=\"flex items-center\">\n <input\n type=\"text\"\n value={\n state.loading ? \"Fetching Quotes\" : state.outputAmount || \"0\"\n }\n readOnly\n disabled={true}\n className={cx(\n \"w-full text-2xl outline-none disabled:text-lg\",\n !isConnected && \"cursor-not-allowed\"\n )}\n style={{\n backgroundColor: !isConnected\n ? theme.inputField.disabledBackground\n : theme.inputField.background,\n color: !isConnected\n ? theme.inputField.disabledText\n : theme.inputField.text,\n opacity: state.loading ? 0.3 : !isConnected ? 0.5 : 0.8,\n }}\n placeholder=\"0\"\n />\n <div className=\"flex flex-col gap-2\">\n <div\n className={cx(\n \"ml-2 p-3 py-2 rounded-full flex items-center justify-center gap-2 min-w-[140px]\",\n !isConnected && \"opacity-50\"\n )}\n style={{\n backgroundColor: theme.tokenButton.background,\n border: `1px solid ${theme.tokenButton.border}`,\n padding: `${theme.tokenButton.paddingY}px ${theme.tokenButton.paddingX}px`,\n }}\n >\n {poolConfig.tokenOut.logoURI && (\n <img\n src={poolConfig.tokenOut.logoURI}\n alt={poolConfig.tokenOut.symbol}\n className=\"h-[20px] w-[20px] flex-shrink-0 rounded-full\"\n onError={(e) => {\n (e.target as HTMLImageElement).style.display = \"none\";\n }}\n />\n )}\n <span\n style={{ color: theme.tokenButton.text }}\n className=\"font-bold text-sm\"\n >\n {poolConfig.tokenOut.symbol}\n </span>\n </div>\n </div>\n </div>\n </div>\n\n {/* Error Message */}\n {state.error && (\n <div className=\"mb-2 p-4 bg-red-50 text-red-500 rounded-2xl overflow-x-hidden\">\n {state.error}\n </div>\n )}\n\n {/* Action Button */}\n {isConnected ? (\n <button\n disabled={\n state.loading ||\n isSwapping ||\n !state.inputAmount ||\n Number(state.inputAmount) <= 0\n }\n onClick={handleSwap}\n className=\"w-full py-4 rounded-2xl transition-colors cursor-pointer\"\n style={{\n backgroundColor:\n state.loading ||\n isSwapping ||\n !state.inputAmount ||\n Number(state.inputAmount) <= 0\n ? theme.swapButton.disabledBackground\n : theme.swapButton.background,\n color:\n state.loading ||\n isSwapping ||\n !state.inputAmount ||\n Number(state.inputAmount) <= 0\n ? theme.swapButton.disabledText\n : theme.swapButton.text,\n }}\n >\n {isSwapping ? \"Swapping...\" : state.loading ? \"Getting Quote...\" : \"Swap\"}\n </button>\n ) : (\n <button\n onClick={onConnectWallet}\n className=\"w-full py-4 rounded-2xl transition-colors\"\n style={{\n backgroundColor: theme.connectButton.background,\n color: theme.connectButton.text,\n }}\n >\n Connect Wallet\n </button>\n )}\n\n {/* Price Info */}\n {state.inputAmount && state.outputAmount && (\n <div className=\"p-4 rounded-2xl\">\n <div\n className=\"flex justify-between items-center text-sm mb-2\"\n style={{ color: theme.textSecondary }}\n >\n 1 {poolConfig.tokenIn.symbol} ={\" \"}\n {(Number(state.outputAmount) / Number(state.inputAmount)).toFixed(\n 6\n )}{\" \"}\n {poolConfig.tokenOut.symbol}\n </div>\n\n {state.routeInfo && (\n <div\n className=\"mt-2 text-xs\"\n style={{ color: theme.textSecondary }}\n >\n {state.routeInfo.isDirectRoute ? (\n <div className=\"flex justify-between\">\n <span>Direct swap</span>\n <span>{state.routeInfo.routeString}</span>\n </div>\n ) : (\n <div className=\"flex justify-between\">\n <span>Route: {state.routeInfo.routeString}</span>\n </div>\n )}\n </div>\n )}\n </div>\n )}\n\n {/* Account Button */}\n {isConnected && (\n <div className=\"flex justify-center items-center mt-2\">\n <appkit-account-button />\n </div>\n )}\n </div>\n );\n};\n\nexport default SwapWidget;\n","\"use client\";\n\nimport { WagmiAdapter } from \"@reown/appkit-adapter-wagmi\";\nimport { QueryClient, QueryClientProvider } from \"@tanstack/react-query\";\nimport { WagmiProvider } from \"wagmi\";\n\nexport interface ProviderProps {\n children: React.ReactNode;\n wagmiAdapter: WagmiAdapter;\n queryClient?: QueryClient;\n}\n\nexport function Provider({\n children,\n wagmiAdapter,\n queryClient = new QueryClient(),\n}: ProviderProps) {\n return (\n <WagmiProvider config={wagmiAdapter.wagmiConfig}>\n <QueryClientProvider client={queryClient}>{children}</QueryClientProvider>\n </WagmiProvider>\n );\n}\n","import { useEffect, useRef } from \"react\";\nimport { ethers } from \"ethers\";\nimport {\n getQuote,\n RATE_LIMIT_CONFIG,\n type SwapState,\n type PoolConfig,\n} from \"@uniswap-widget/core\";\n\n/**\n * React binding for the core `getQuote`. Owns the reactive concerns debounce,\n * de-duplication, abort, and state writes while the actual quote logic lives\n * in `@uniswap-widget/core`.\n */\nexport default function useQuote({\n signer,\n state,\n setState,\n poolConfig,\n}: {\n signer?: ethers.Signer;\n state: SwapState;\n setState: React.Dispatch<React.SetStateAction<SwapState>>;\n poolConfig: PoolConfig;\n}) {\n const debounceTimeout = useRef<NodeJS.Timeout>();\n const lastQuoteParams = useRef<string>(\"\");\n const abortController = useRef<AbortController>();\n\n useEffect(() => {\n // Initialize tokens from pool config\n setState((prev) => ({\n ...prev,\n inputToken: poolConfig.tokenIn,\n outputToken: poolConfig.tokenOut,\n }));\n }, [poolConfig]);\n\n useEffect(() => {\n if (debounceTimeout.current) {\n clearTimeout(debounceTimeout.current);\n }\n\n if (abortController.current) {\n abortController.current.abort();\n }\n\n async function updateQuote() {\n if (!state.inputAmount || Number(state.inputAmount) === 0) {\n setState((prev) => ({ ...prev, outputAmount: \"\" }));\n return;\n }\n\n if (!signer) {\n setState((prev) => ({\n ...prev,\n outputAmount: \"\",\n error: \"Please connect your wallet to get quotes\",\n }));\n return;\n }\n\n const quoteKey = `${poolConfig.tokenIn.address}-${poolConfig.tokenOut.address}-${state.inputAmount}`;\n if (lastQuoteParams.current === quoteKey) {\n return;\n }\n lastQuoteParams.current = quoteKey;\n\n const controller = new AbortController();\n abortController.current = controller;\n\n try {\n setState((prev) => ({ ...prev, loading: true, error: null }));\n\n const { outputAmount, routeInfo } = await getQuote({\n signer,\n inputToken: poolConfig.tokenIn,\n outputToken: poolConfig.tokenOut,\n inputAmount: state.inputAmount,\n poolConfig,\n signal: controller.signal,\n });\n\n if (controller.signal.aborted) {\n return;\n }\n\n setState((prev) => ({ ...prev, outputAmount, routeInfo }));\n } catch (err) {\n if (controller.signal.aborted) {\n return;\n }\n\n const errorMessage =\n err instanceof Error ? err.message : \"Failed to get quote\";\n\n setState((prev) => ({\n ...prev,\n outputAmount: \"\",\n error: errorMessage,\n }));\n } finally {\n if (!controller.signal.aborted) {\n setState((prev) => ({ ...prev, loading: false }));\n }\n }\n }\n\n debounceTimeout.current = setTimeout(\n updateQuote,\n RATE_LIMIT_CONFIG.QUOTE_DEBOUNCE\n );\n\n return () => {\n if (debounceTimeout.current) {\n clearTimeout(debounceTimeout.current);\n }\n if (abortController.current) {\n abortController.current.abort();\n }\n };\n }, [state.inputAmount, poolConfig, signer]);\n\n return;\n}\n","import { ethers } from \"ethers\";\nimport { executeSwap, type SwapState } from \"@uniswap-widget/core\";\n\n/**\n * React binding for the core `executeSwap`. Manages loading/error state; the\n * swap itself (approve, send, wait, callback) lives in `@uniswap-widget/core`.\n */\nexport default function useSwap({\n state,\n setState,\n onSwap,\n signer,\n}: {\n state: SwapState;\n setState: React.Dispatch<React.SetStateAction<SwapState>>;\n onSwap?: (inputAmount: string, outputAmount: string) => Promise<void>;\n signer?: ethers.Signer;\n}) {\n async function swap() {\n if (!signer) {\n setState((prev) => ({ ...prev, error: \"Please connect your wallet\" }));\n return;\n }\n\n if (!state.inputToken || !state.outputToken) {\n setState((prev) => ({ ...prev, error: \"Tokens not initialized\" }));\n return;\n }\n\n setState((prev) => ({ ...prev, txLoading: true }));\n\n try {\n await executeSwap({\n signer,\n inputToken: state.inputToken,\n outputToken: state.outputToken,\n inputAmount: state.inputAmount,\n outputAmount: state.outputAmount,\n onSwap,\n });\n } catch (error) {\n setState((prev) => ({\n ...prev,\n error: error instanceof Error ? error.message : \"Swap failed\",\n }));\n } finally {\n setState((prev) => ({ ...prev, txLoading: false }));\n }\n }\n\n return {\n swap,\n };\n}\n"],"names":["cx","classes","filter","Boolean","join","ArrowDown","props","jsx","viewBox","className","fill","children","d","wagmiAdapter","queryClient","QueryClient","WagmiProvider","config","wagmiConfig","QueryClientProvider","client","poolConfig","DEFAULT_POOL_CONFIG","theme","customTheme","onSwap","open","useAppKit","isConnected","useAccount","data","walletClient","useWalletClient","isSwapping","setIsSwapping","useState","signer","useMemo","account","chain","transport","network","chainId","id","name","ensAddress","_b","_a","contracts","ensRegistry","address","ethers","providers","Web3Provider","getSigner","lightTheme","tokenButton","swapButton","connectButton","inputField","buySection","state","setState","inputAmount","outputAmount","inputToken","outputToken","loading","error","inputDisabled","useEffect","prev","debounceTimeout","useRef","lastQuoteParams","abortController","tokenIn","tokenOut","current","clearTimeout","abort","setTimeout","async","Number","quoteKey","controller","AbortController","routeInfo","getQuote","signal","aborted","err","errorMessage","Error","message","RATE_LIMIT_CONFIG","QUOTE_DEBOUNCE","useQuote","swap","txLoading","executeSwap","useSwap","jsxs","style","backgroundColor","background","foreground","border","opacity","color","textSecondary","type","disabled","value","onChange","e","target","test","placeholder","inputMode","disabledBackground","text","disabledText","logoURI","src","alt","symbol","onError","display","readOnly","padding","paddingY","paddingX","onClick","view","toFixed","isDirectRoute","routeString"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@uniswap-widget/react",
|
|
3
|
-
"version": "2.1.
|
|
3
|
+
"version": "2.1.2",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "A clean Uniswap swap widget package for easy integration",
|
|
6
6
|
"license": "MIT",
|
|
@@ -27,7 +27,8 @@
|
|
|
27
27
|
},
|
|
28
28
|
"files": [
|
|
29
29
|
"dist",
|
|
30
|
-
"README.md"
|
|
30
|
+
"README.md",
|
|
31
|
+
"LICENSE"
|
|
31
32
|
],
|
|
32
33
|
"scripts": {
|
|
33
34
|
"build": "tsc --noEmit && vite build",
|