@deloraprotocol/widget 1.0.1 → 1.0.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/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/theme.ts","../src/MyWidget.tsx","../src/constants/api.ts","../src/api/dataApi.ts","../src/hooks/useTradeState.ts","../node_modules/ethers/lib.esm/_version.js","../node_modules/ethers/lib.esm/utils/properties.js","../node_modules/ethers/lib.esm/utils/errors.js","../node_modules/ethers/lib.esm/utils/data.js","../node_modules/ethers/lib.esm/utils/maths.js","../node_modules/ethers/lib.esm/utils/fixednumber.js","../node_modules/ethers/lib.esm/utils/units.js","../node_modules/ethers/lib.esm/constants/addresses.js","../src/api/tradeApi.ts","../src/hooks/useTradeApi.ts","../src/hooks/useSlippage.ts","../src/hooks/useTrade.ts","../src/hooks/useGlitchText.ts","../src/utils/resolveImageUrl.ts","../src/assets/trade/gas-pump.svg","../src/widget/TradeWindow.tsx","../src/assets/trade/copy-hover.png","../src/assets/trade/copy-check.png","../src/assets/trade/link.png","../src/widget/SelectTokenWindow.tsx","../src/widget/SelectNetworkWindow.tsx","../src/assets/trade/slippage.png","../src/widget/SlippagePanel.tsx","../src/widget/TradeWidget.tsx"],"sourcesContent":["import type { CSSProperties } from \"react\";\r\nimport type { MyWidgetTheme, MyWidgetVars } from \"./types\";\r\n\r\nconst lightTheme: MyWidgetVars = {\r\n bg: \"#ffffff\",\r\n fg: \"#111216\",\r\n accent: \"#7ca7f5\",\r\n border: \"#dfe2ea\",\r\n muted: \"#8e93a1\",\r\n surface: \"#ffffff\",\r\n surfaceAlt: \"#f6f7fb\",\r\n surfaceHover: \"#eef2fb\",\r\n textSubtle: \"#8a90a0\",\r\n accentHover: \"#6a95ee\",\r\n success: \"#89d76e\",\r\n danger: \"#f06a63\",\r\n overlay: \"rgba(13, 16, 24, 0.3)\",\r\n shadow: \"0 18px 50px rgba(15, 20, 34, 0.08)\",\r\n radius: \"10px\",\r\n fontFamily: \"'Roboto Mono', monospace\",\r\n fontSize: \"13px\",\r\n lineHeight: \"1.2\",\r\n letterSpacing: \"-0.05em\",\r\n};\r\n\r\nconst darkTheme: MyWidgetVars = {\r\n bg: \"#090909\",\r\n fg: \"#ffffff\",\r\n accent: \"#7ca7f5\",\r\n border: \"#232323\",\r\n muted: \"#636363\",\r\n surface: \"#090909\",\r\n surfaceAlt: \"#0f0f0f\",\r\n surfaceHover: \"#161616\",\r\n textSubtle: \"#7a7a7a\",\r\n accentHover: \"#6a95ee\",\r\n success: \"#87d96f\",\r\n danger: \"#f06a63\",\r\n overlay: \"rgba(0, 0, 0, 0.72)\",\r\n shadow: \"0 0 0 1px rgba(255, 255, 255, 0.03)\",\r\n radius: \"10px\",\r\n fontFamily: \"'Roboto Mono', monospace\",\r\n fontSize: \"13px\",\r\n lineHeight: \"1.2\",\r\n letterSpacing: \"-0.05em\",\r\n};\r\n\r\nexport const themes: Record<MyWidgetTheme, MyWidgetVars> = {\r\n light: lightTheme,\r\n dark: darkTheme,\r\n};\r\n\r\nexport function getThemeVars(\r\n theme: MyWidgetTheme,\r\n overrides?: Partial<MyWidgetVars>\r\n): MyWidgetVars {\r\n const base = themes[theme];\r\n return { ...base, ...overrides };\r\n}\r\n\r\nconst VAR_MAP: Record<keyof MyWidgetVars, string> = {\r\n bg: \"--dw-bg\",\r\n fg: \"--dw-fg\",\r\n accent: \"--dw-accent\",\r\n border: \"--dw-border\",\r\n muted: \"--dw-muted\",\r\n surface: \"--dw-surface\",\r\n surfaceAlt: \"--dw-surface-alt\",\r\n surfaceHover: \"--dw-surface-hover\",\r\n textSubtle: \"--dw-text-subtle\",\r\n accentHover: \"--dw-accent-hover\",\r\n success: \"--dw-success\",\r\n danger: \"--dw-danger\",\r\n overlay: \"--dw-overlay\",\r\n shadow: \"--dw-shadow\",\r\n radius: \"--dw-radius\",\r\n fontFamily: \"--dw-font\",\r\n fontSize: \"--dw-font-size\",\r\n lineHeight: \"--dw-line-height\",\r\n letterSpacing: \"--dw-letter-spacing\",\r\n};\r\n\r\nexport function varsToCssVars(vars: MyWidgetVars): CSSProperties {\r\n const style: Record<string, string> = {};\r\n for (const [key, value] of Object.entries(vars)) {\r\n const cssVar = VAR_MAP[key as keyof MyWidgetVars];\r\n if (cssVar && value != null) style[cssVar] = value;\r\n }\r\n return style as React.CSSProperties;\r\n}\r\n","import type { MyWidgetProps } from \"./types\";\r\nimport { getThemeVars, varsToCssVars } from \"./theme\";\r\nimport \"./styles/index.css\";\r\n\r\nexport function MyWidget(props: MyWidgetProps): JSX.Element {\r\n const {\r\n theme = \"light\",\r\n vars: varsOverride,\r\n className,\r\n style: styleProp,\r\n ...rest\r\n } = props;\r\n\r\n const themeVars = getThemeVars(theme, varsOverride);\r\n const cssVars = varsToCssVars(themeVars);\r\n\r\n const mergedStyle: React.CSSProperties = {\r\n ...cssVars,\r\n ...styleProp,\r\n };\r\n\r\n return (\r\n <div\r\n data-delora-widget-root\r\n className={`dw-flex dw-flex-col dw-gap-3 dw-rounded-[var(--dw-radius)] dw-border dw-border-[var(--dw-border)] dw-bg-[var(--dw-bg)] dw-p-4 dw-shadow-sm ${className ?? \"\"}`}\r\n style={mergedStyle}\r\n {...rest}\r\n >\r\n <h3 className=\"dw-text-base dw-font-semibold dw-text-[var(--dw-fg)]\">\r\n Delora\r\n </h3>\r\n <p className=\"dw-text-sm dw-text-[var(--dw-muted)]\">\r\n A simple widget with theme support.\r\n </p>\r\n <button\r\n type=\"button\"\r\n className=\"dw-inline-flex dw-items-center dw-justify-center dw-rounded-[var(--dw-radius)] dw-bg-[var(--dw-accent)] dw-px-3 dw-py-2 dw-text-sm dw-font-medium dw-text-white dw-transition-colors hover:dw-opacity-90 focus:dw-outline-none focus:dw-ring-2 focus:dw-ring-[var(--dw-accent)] focus:dw-ring-offset-2 focus:dw-ring-offset-[var(--dw-bg)]\"\r\n >\r\n Action\r\n </button>\r\n </div>\r\n );\r\n}\r\n","export const DEFAULT_API_BASE = \"https://api.delora.build\";\r\n\r\nexport const CONSTANT_ETH_ADDRESS = \"0x1111111111111111111111111111111111111111\";\r\nexport const CONSTANT_SOL_ADDRESS = \"11111111111111111111111111111111\";\r\nexport const CONSTANT_SUI_ADDRESS =\r\n \"1111111111111111111111111111111111111111111111111111111111111111\";\r\n","import { DEFAULT_API_BASE } from \"../constants/api\";\nimport type { Network } from \"../types/network\";\nimport type { Token } from \"../types/token\";\n\ninterface TokenData {\n chainId: number;\n address: string;\n symbol: string;\n name: string;\n decimals: number;\n priceUSD?: string;\n coinKey?: string;\n logoURI?: string;\n}\n\nexport interface TokensData {\n byChainId: Record<string, TokenData[]>;\n}\n\ninterface DeloraNativeTokenApi {\n address: string;\n decimals: number;\n symbol: string;\n chainId: number;\n coinKey: string;\n name: string;\n logoURI?: string;\n}\n\ninterface DeloraChainApi {\n key: string;\n name: string;\n chainType: string;\n id: number;\n idHex?: string;\n logoURI?: string;\n rpcUrls?: string[];\n blockExplorerUrls?: string;\n nativeToken?: DeloraNativeTokenApi;\n}\n\ninterface DeloraChainsResponse {\n chains: DeloraChainApi[];\n}\n\ntype DeloraTokensResponse = Record<string, TokenData[]>;\n\nfunction normalizeBaseUrl(baseUrl?: string): string {\n return (baseUrl || DEFAULT_API_BASE).replace(/\\/$/, \"\");\n}\n\nfunction normalizeExplorerUrl(\n url: string | undefined,\n chainType: string,\n chainKey: string\n): string | undefined {\n if (!url) return undefined;\n\n const trimmed = url.replace(/\\/+$/, \"\");\n if (trimmed.includes(\"/token/\") || trimmed.includes(\"/coin/\")) {\n return `${trimmed}/`;\n }\n\n if (chainType === \"MVM\" || chainKey === \"sui\") {\n return `${trimmed}/coin/`;\n }\n\n return `${trimmed}/token/`;\n}\n\nfunction mapNetwork(chain: DeloraChainApi): Network {\n return {\n id: chain.id,\n name: chain.name,\n rpcUrls: chain.rpcUrls ?? [],\n logoURI: chain.logoURI,\n idHex: chain.idHex,\n chainType: chain.chainType,\n explorerUrl: normalizeExplorerUrl(\n chain.blockExplorerUrls,\n chain.chainType,\n chain.key\n ),\n key: chain.key,\n nativeCurrency: {\n name: chain.nativeToken?.name ?? chain.name,\n symbol: chain.nativeToken?.symbol ?? \"\",\n decimals: chain.nativeToken?.decimals ?? 18,\n },\n };\n}\n\nfunction mapToken(t: TokenData): Token {\n return {\n symbol: t.symbol,\n name: t.name,\n contractAddress: t.address,\n chainId: t.chainId,\n imageUrl: t.logoURI ?? \"\",\n decimals: t.decimals,\n priceUSD: t.priceUSD,\n };\n}\n\nexport async function fetchNetworks(apiBase?: string): Promise<Network[]> {\n const base = normalizeBaseUrl(apiBase);\n const res = await fetch(`${base}/v1/chains`);\n if (!res.ok) throw new Error(`Failed to fetch networks: ${res.status}`);\n const data = (await res.json()) as DeloraChainsResponse;\n return (data.chains ?? []).map(mapNetwork);\n}\n\nexport async function fetchTokens(apiBase?: string): Promise<TokensData> {\n const base = normalizeBaseUrl(apiBase);\n const res = await fetch(`${base}/v1/tokens`);\n if (!res.ok) throw new Error(`Failed to fetch tokens: ${res.status}`);\n const data = (await res.json()) as DeloraTokensResponse;\n return { byChainId: data };\n}\n\nexport async function fetchTokensSearch(apiBase?: string): Promise<TokensData> {\n return fetchTokens(apiBase);\n}\n\nexport function getTokensForNetwork(\n tokensData: TokensData,\n networkId: number\n): Token[] {\n const key = String(networkId);\n return (tokensData.byChainId[key] ?? []).map(mapToken);\n}\n\r\nexport function getAllTokensForNetwork(\r\n tokensSearchData: TokensData,\r\n networkId: number\r\n): Token[] {\r\n return getTokensForNetwork(tokensSearchData, networkId);\r\n}\r\n\r\nexport function getNativeTokenForNetwork(tokens: Token[]): Token | undefined {\r\n const zero = \"0x0000000000000000000000000000000000000000\";\r\n const sol = \"11111111111111111111111111111111\";\r\n const sui =\r\n \"1111111111111111111111111111111111111111111111111111111111111111\";\r\n return (\r\n tokens.find(\r\n (t) =>\r\n t.contractAddress === zero ||\r\n t.contractAddress === sol ||\r\n t.contractAddress === sui\r\n ) ?? tokens[0]\r\n );\r\n}\r\n","import { useCallback, useEffect, useState } from \"react\";\r\nimport type { Network, Token } from \"../types\";\nimport {\n fetchNetworks,\n fetchTokens,\n getTokensForNetwork,\n getAllTokensForNetwork,\n getNativeTokenForNetwork,\n type TokensData,\r\n} from \"../api/dataApi\";\r\n\nexport interface UseTradeStateConfig {\n apiBase?: string;\n}\n\nexport function useTradeState(config: UseTradeStateConfig) {\n const [networks, setNetworks] = useState<Network[]>([]);\r\n const [tokensData, setTokensData] = useState<TokensData | null>(null);\r\n const [tokensSearchData, setTokensSearchData] = useState<TokensData | null>(null);\r\n const [loading, setLoading] = useState(true);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n const [networkSell, setNetworkSell] = useState<Network | undefined>();\r\n const [networkBuy, setNetworkBuy] = useState<Network | undefined>();\r\n const [sellToken, setSellToken] = useState<Token | undefined>();\r\n const [buyToken, setBuyToken] = useState<Token | undefined>();\r\n\r\n useEffect(() => {\n let cancelled = false;\n setLoading(true);\n setError(null);\n Promise.all([fetchNetworks(config.apiBase), fetchTokens(config.apiBase)])\n .then(([nets, tok]) => {\n if (cancelled) return;\n setNetworks(nets);\n setTokensData(tok);\n setTokensSearchData(tok);\n if (nets.length >= 2) {\n setNetworkSell(nets[0]);\n setNetworkBuy(nets[1]);\n } else if (nets.length === 1) {\r\n setNetworkSell(nets[0]);\r\n setNetworkBuy(nets[0]);\r\n }\r\n })\r\n .catch((e) => {\r\n if (!cancelled) setError(e?.message ?? \"Failed to load data\");\r\n })\r\n .finally(() => {\r\n if (!cancelled) setLoading(false);\r\n });\r\n return () => {\n cancelled = true;\n };\n }, [config.apiBase]);\n\r\n useEffect(() => {\r\n if (!networkSell || !tokensData) return;\r\n const tokens = getTokensForNetwork(tokensData, networkSell.id);\r\n if (tokens.length && !sellToken) {\r\n setSellToken(tokens[0]);\r\n } else if (sellToken && !tokens.some((t) => t.contractAddress === sellToken.contractAddress && t.chainId === sellToken.chainId)) {\r\n setSellToken(tokens[0]);\r\n }\r\n }, [networkSell, tokensData, sellToken]);\r\n\r\n useEffect(() => {\r\n if (!networkBuy || !tokensData) return;\r\n const tokens = getTokensForNetwork(tokensData, networkBuy.id);\r\n if (tokens.length && !buyToken) {\r\n const other = sellToken ? tokens.find((t) => !(t.contractAddress === sellToken.contractAddress && t.chainId === sellToken.chainId)) : undefined;\r\n setBuyToken(other ?? tokens[0]);\r\n } else if (buyToken && !tokens.some((t) => t.contractAddress === buyToken.contractAddress && t.chainId === buyToken.chainId)) {\r\n const other = sellToken ? tokens.find((t) => !(t.contractAddress === sellToken.contractAddress && t.chainId === sellToken.chainId)) : undefined;\r\n setBuyToken(other ?? tokens[0]);\r\n }\r\n }, [networkBuy, tokensData, buyToken, sellToken]);\r\n\r\n const getTokensForNetworkId = useCallback(\r\n (networkId: number): Token[] => {\r\n if (!tokensData) return [];\r\n return getTokensForNetwork(tokensData, networkId);\r\n },\r\n [tokensData]\r\n );\r\n\r\n const getAllTokensForNetworkId = useCallback(\n (networkId: number): Token[] => {\n if (!tokensSearchData) {\n return getTokensForNetwork(tokensData ?? { byChainId: {} }, networkId);\n }\n return getAllTokensForNetwork(tokensSearchData, networkId);\n },\n [tokensSearchData, tokensData]\n );\n\n const getNativeToken = useCallback(\n (networkId: number): Token | undefined => {\n const tokens = getTokensForNetwork(tokensData ?? { byChainId: {} }, networkId);\n return getNativeTokenForNetwork(tokens);\n },\n [tokensData]\n );\r\n\r\n const getNetworkById = useCallback(\r\n (id: number): Network | undefined => networks.find((n) => n.id === id),\r\n [networks]\r\n );\r\n\r\n const updateNetworkSell = useCallback((chainId: number) => {\r\n const net = networks.find((n) => n.id === chainId);\r\n if (net) setNetworkSell(net);\r\n }, [networks]);\r\n\r\n const updateNetworkBuy = useCallback((chainId: number) => {\r\n const net = networks.find((n) => n.id === chainId);\r\n if (net) setNetworkBuy(net);\r\n }, [networks]);\r\n\r\n const setNetworkBuyDirect = useCallback((network: Network) => {\r\n setNetworkBuy(network);\r\n }, []);\r\n\r\n return {\r\n networks,\r\n networkSell,\r\n networkBuy,\r\n sellToken,\r\n buyToken,\r\n setSellToken,\r\n setBuyToken,\r\n setNetworkSell: (n: Network) => setNetworkSell(n),\r\n setNetworkBuy: setNetworkBuyDirect,\r\n updateNetworkSell,\r\n updateNetworkBuy,\r\n getTokensForNetworkId,\r\n getAllTokensForNetworkId,\r\n getNativeToken,\r\n getNetworkById,\r\n loading,\r\n error,\r\n };\r\n}\r\n","/* Do NOT modify this file; see /src.ts/_admin/update-version.ts */\n/**\n * The current version of Ethers.\n */\nexport const version = \"6.16.0\";\n//# sourceMappingURL=_version.js.map","/**\n * Property helper functions.\n *\n * @_subsection api/utils:Properties [about-properties]\n */\nfunction checkType(value, type, name) {\n const types = type.split(\"|\").map(t => t.trim());\n for (let i = 0; i < types.length; i++) {\n switch (type) {\n case \"any\":\n return;\n case \"bigint\":\n case \"boolean\":\n case \"number\":\n case \"string\":\n if (typeof (value) === type) {\n return;\n }\n }\n }\n const error = new Error(`invalid value for type ${type}`);\n error.code = \"INVALID_ARGUMENT\";\n error.argument = `value.${name}`;\n error.value = value;\n throw error;\n}\n/**\n * Resolves to a new object that is a copy of %%value%%, but with all\n * values resolved.\n */\nexport async function resolveProperties(value) {\n const keys = Object.keys(value);\n const results = await Promise.all(keys.map((k) => Promise.resolve(value[k])));\n return results.reduce((accum, v, index) => {\n accum[keys[index]] = v;\n return accum;\n }, {});\n}\n/**\n * Assigns the %%values%% to %%target%% as read-only values.\n *\n * It %%types%% is specified, the values are checked.\n */\nexport function defineProperties(target, values, types) {\n for (let key in values) {\n let value = values[key];\n const type = (types ? types[key] : null);\n if (type) {\n checkType(value, type, key);\n }\n Object.defineProperty(target, key, { enumerable: true, value, writable: false });\n }\n}\n//# sourceMappingURL=properties.js.map","/**\n * All errors in ethers include properties to ensure they are both\n * human-readable (i.e. ``.message``) and machine-readable (i.e. ``.code``).\n *\n * The [[isError]] function can be used to check the error ``code`` and\n * provide a type guard for the properties present on that error interface.\n *\n * @_section: api/utils/errors:Errors [about-errors]\n */\nimport { version } from \"../_version.js\";\nimport { defineProperties } from \"./properties.js\";\nfunction stringify(value, seen) {\n if (value == null) {\n return \"null\";\n }\n if (seen == null) {\n seen = new Set();\n }\n if (typeof (value) === \"object\") {\n if (seen.has(value)) {\n return \"[Circular]\";\n }\n seen.add(value);\n }\n if (Array.isArray(value)) {\n return \"[ \" + (value.map((v) => stringify(v, seen))).join(\", \") + \" ]\";\n }\n if (value instanceof Uint8Array) {\n const HEX = \"0123456789abcdef\";\n let result = \"0x\";\n for (let i = 0; i < value.length; i++) {\n result += HEX[value[i] >> 4];\n result += HEX[value[i] & 0xf];\n }\n return result;\n }\n if (typeof (value) === \"object\" && typeof (value.toJSON) === \"function\") {\n return stringify(value.toJSON(), seen);\n }\n switch (typeof (value)) {\n case \"boolean\":\n case \"number\":\n case \"symbol\":\n return value.toString();\n case \"bigint\":\n return BigInt(value).toString();\n case \"string\":\n return JSON.stringify(value);\n case \"object\": {\n const keys = Object.keys(value);\n keys.sort();\n return \"{ \" + keys.map((k) => `${stringify(k, seen)}: ${stringify(value[k], seen)}`).join(\", \") + \" }\";\n }\n }\n return `[ COULD NOT SERIALIZE ]`;\n}\n/**\n * Returns true if the %%error%% matches an error thrown by ethers\n * that matches the error %%code%%.\n *\n * In TypeScript environments, this can be used to check that %%error%%\n * matches an EthersError type, which means the expected properties will\n * be set.\n *\n * @See [ErrorCodes](api:ErrorCode)\n * @example\n * try {\n * // code....\n * } catch (e) {\n * if (isError(e, \"CALL_EXCEPTION\")) {\n * // The Type Guard has validated this object\n * console.log(e.data);\n * }\n * }\n */\nexport function isError(error, code) {\n return (error && error.code === code);\n}\n/**\n * Returns true if %%error%% is a [[CallExceptionError].\n */\nexport function isCallException(error) {\n return isError(error, \"CALL_EXCEPTION\");\n}\n/**\n * Returns a new Error configured to the format ethers emits errors, with\n * the %%message%%, [[api:ErrorCode]] %%code%% and additional properties\n * for the corresponding EthersError.\n *\n * Each error in ethers includes the version of ethers, a\n * machine-readable [[ErrorCode]], and depending on %%code%%, additional\n * required properties. The error message will also include the %%message%%,\n * ethers version, %%code%% and all additional properties, serialized.\n */\nexport function makeError(message, code, info) {\n let shortMessage = message;\n {\n const details = [];\n if (info) {\n if (\"message\" in info || \"code\" in info || \"name\" in info) {\n throw new Error(`value will overwrite populated values: ${stringify(info)}`);\n }\n for (const key in info) {\n if (key === \"shortMessage\") {\n continue;\n }\n const value = (info[key]);\n // try {\n details.push(key + \"=\" + stringify(value));\n // } catch (error: any) {\n // console.log(\"MMM\", error.message);\n // details.push(key + \"=[could not serialize object]\");\n // }\n }\n }\n details.push(`code=${code}`);\n details.push(`version=${version}`);\n if (details.length) {\n message += \" (\" + details.join(\", \") + \")\";\n }\n }\n let error;\n switch (code) {\n case \"INVALID_ARGUMENT\":\n error = new TypeError(message);\n break;\n case \"NUMERIC_FAULT\":\n case \"BUFFER_OVERRUN\":\n error = new RangeError(message);\n break;\n default:\n error = new Error(message);\n }\n defineProperties(error, { code });\n if (info) {\n Object.assign(error, info);\n }\n if (error.shortMessage == null) {\n defineProperties(error, { shortMessage });\n }\n return error;\n}\n/**\n * Throws an EthersError with %%message%%, %%code%% and additional error\n * %%info%% when %%check%% is falsish..\n *\n * @see [[api:makeError]]\n */\nexport function assert(check, message, code, info) {\n if (!check) {\n throw makeError(message, code, info);\n }\n}\n/**\n * A simple helper to simply ensuring provided arguments match expected\n * constraints, throwing if not.\n *\n * In TypeScript environments, the %%check%% has been asserted true, so\n * any further code does not need additional compile-time checks.\n */\nexport function assertArgument(check, message, name, value) {\n assert(check, message, \"INVALID_ARGUMENT\", { argument: name, value: value });\n}\nexport function assertArgumentCount(count, expectedCount, message) {\n if (message == null) {\n message = \"\";\n }\n if (message) {\n message = \": \" + message;\n }\n assert(count >= expectedCount, \"missing argument\" + message, \"MISSING_ARGUMENT\", {\n count: count,\n expectedCount: expectedCount\n });\n assert(count <= expectedCount, \"too many arguments\" + message, \"UNEXPECTED_ARGUMENT\", {\n count: count,\n expectedCount: expectedCount\n });\n}\nconst _normalizeForms = [\"NFD\", \"NFC\", \"NFKD\", \"NFKC\"].reduce((accum, form) => {\n try {\n // General test for normalize\n /* c8 ignore start */\n if (\"test\".normalize(form) !== \"test\") {\n throw new Error(\"bad\");\n }\n ;\n /* c8 ignore stop */\n if (form === \"NFD\") {\n const check = String.fromCharCode(0xe9).normalize(\"NFD\");\n const expected = String.fromCharCode(0x65, 0x0301);\n /* c8 ignore start */\n if (check !== expected) {\n throw new Error(\"broken\");\n }\n /* c8 ignore stop */\n }\n accum.push(form);\n }\n catch (error) { }\n return accum;\n}, []);\n/**\n * Throws if the normalization %%form%% is not supported.\n */\nexport function assertNormalize(form) {\n assert(_normalizeForms.indexOf(form) >= 0, \"platform missing String.prototype.normalize\", \"UNSUPPORTED_OPERATION\", {\n operation: \"String.prototype.normalize\", info: { form }\n });\n}\n/**\n * Many classes use file-scoped values to guard the constructor,\n * making it effectively private. This facilitates that pattern\n * by ensuring the %%givenGaurd%% matches the file-scoped %%guard%%,\n * throwing if not, indicating the %%className%% if provided.\n */\nexport function assertPrivate(givenGuard, guard, className) {\n if (className == null) {\n className = \"\";\n }\n if (givenGuard !== guard) {\n let method = className, operation = \"new\";\n if (className) {\n method += \".\";\n operation += \" \" + className;\n }\n assert(false, `private constructor; use ${method}from* methods`, \"UNSUPPORTED_OPERATION\", {\n operation\n });\n }\n}\n//# sourceMappingURL=errors.js.map","/**\n * Some data helpers.\n *\n *\n * @_subsection api/utils:Data Helpers [about-data]\n */\nimport { assert, assertArgument } from \"./errors.js\";\nfunction _getBytes(value, name, copy) {\n if (value instanceof Uint8Array) {\n if (copy) {\n return new Uint8Array(value);\n }\n return value;\n }\n if (typeof (value) === \"string\" && (value.length % 2) === 0 &&\n value.match(/^0x[0-9a-f]*$/i)) {\n const result = new Uint8Array((value.length - 2) / 2);\n let offset = 2;\n for (let i = 0; i < result.length; i++) {\n result[i] = parseInt(value.substring(offset, offset + 2), 16);\n offset += 2;\n }\n return result;\n }\n assertArgument(false, \"invalid BytesLike value\", name || \"value\", value);\n}\n/**\n * Get a typed Uint8Array for %%value%%. If already a Uint8Array\n * the original %%value%% is returned; if a copy is required use\n * [[getBytesCopy]].\n *\n * @see: getBytesCopy\n */\nexport function getBytes(value, name) {\n return _getBytes(value, name, false);\n}\n/**\n * Get a typed Uint8Array for %%value%%, creating a copy if necessary\n * to prevent any modifications of the returned value from being\n * reflected elsewhere.\n *\n * @see: getBytes\n */\nexport function getBytesCopy(value, name) {\n return _getBytes(value, name, true);\n}\n/**\n * Returns true if %%value%% is a valid [[HexString]].\n *\n * If %%length%% is ``true`` or a //number//, it also checks that\n * %%value%% is a valid [[DataHexString]] of %%length%% (if a //number//)\n * bytes of data (e.g. ``0x1234`` is 2 bytes).\n */\nexport function isHexString(value, length) {\n if (typeof (value) !== \"string\" || !value.match(/^0x[0-9A-Fa-f]*$/)) {\n return false;\n }\n if (typeof (length) === \"number\" && value.length !== 2 + 2 * length) {\n return false;\n }\n if (length === true && (value.length % 2) !== 0) {\n return false;\n }\n return true;\n}\n/**\n * Returns true if %%value%% is a valid representation of arbitrary\n * data (i.e. a valid [[DataHexString]] or a Uint8Array).\n */\nexport function isBytesLike(value) {\n return (isHexString(value, true) || (value instanceof Uint8Array));\n}\nconst HexCharacters = \"0123456789abcdef\";\n/**\n * Returns a [[DataHexString]] representation of %%data%%.\n */\nexport function hexlify(data) {\n const bytes = getBytes(data);\n let result = \"0x\";\n for (let i = 0; i < bytes.length; i++) {\n const v = bytes[i];\n result += HexCharacters[(v & 0xf0) >> 4] + HexCharacters[v & 0x0f];\n }\n return result;\n}\n/**\n * Returns a [[DataHexString]] by concatenating all values\n * within %%data%%.\n */\nexport function concat(datas) {\n return \"0x\" + datas.map((d) => hexlify(d).substring(2)).join(\"\");\n}\n/**\n * Returns the length of %%data%%, in bytes.\n */\nexport function dataLength(data) {\n if (isHexString(data, true)) {\n return (data.length - 2) / 2;\n }\n return getBytes(data).length;\n}\n/**\n * Returns a [[DataHexString]] by slicing %%data%% from the %%start%%\n * offset to the %%end%% offset.\n *\n * By default %%start%% is 0 and %%end%% is the length of %%data%%.\n */\nexport function dataSlice(data, start, end) {\n const bytes = getBytes(data);\n if (end != null && end > bytes.length) {\n assert(false, \"cannot slice beyond data bounds\", \"BUFFER_OVERRUN\", {\n buffer: bytes, length: bytes.length, offset: end\n });\n }\n return hexlify(bytes.slice((start == null) ? 0 : start, (end == null) ? bytes.length : end));\n}\n/**\n * Return the [[DataHexString]] result by stripping all **leading**\n ** zero bytes from %%data%%.\n */\nexport function stripZerosLeft(data) {\n let bytes = hexlify(data).substring(2);\n while (bytes.startsWith(\"00\")) {\n bytes = bytes.substring(2);\n }\n return \"0x\" + bytes;\n}\nfunction zeroPad(data, length, left) {\n const bytes = getBytes(data);\n assert(length >= bytes.length, \"padding exceeds data length\", \"BUFFER_OVERRUN\", {\n buffer: new Uint8Array(bytes),\n length: length,\n offset: length + 1\n });\n const result = new Uint8Array(length);\n result.fill(0);\n if (left) {\n result.set(bytes, length - bytes.length);\n }\n else {\n result.set(bytes, 0);\n }\n return hexlify(result);\n}\n/**\n * Return the [[DataHexString]] of %%data%% padded on the **left**\n * to %%length%% bytes.\n *\n * If %%data%% already exceeds %%length%%, a [[BufferOverrunError]] is\n * thrown.\n *\n * This pads data the same as **values** are in Solidity\n * (e.g. ``uint128``).\n */\nexport function zeroPadValue(data, length) {\n return zeroPad(data, length, true);\n}\n/**\n * Return the [[DataHexString]] of %%data%% padded on the **right**\n * to %%length%% bytes.\n *\n * If %%data%% already exceeds %%length%%, a [[BufferOverrunError]] is\n * thrown.\n *\n * This pads data the same as **bytes** are in Solidity\n * (e.g. ``bytes16``).\n */\nexport function zeroPadBytes(data, length) {\n return zeroPad(data, length, false);\n}\n//# sourceMappingURL=data.js.map","/**\n * Some mathematic operations.\n *\n * @_subsection: api/utils:Math Helpers [about-maths]\n */\nimport { hexlify, isBytesLike } from \"./data.js\";\nimport { assert, assertArgument } from \"./errors.js\";\nconst BN_0 = BigInt(0);\nconst BN_1 = BigInt(1);\n//const BN_Max256 = (BN_1 << BigInt(256)) - BN_1;\n// IEEE 754 support 53-bits of mantissa\nconst maxValue = 0x1fffffffffffff;\n/**\n * Convert %%value%% from a twos-compliment representation of %%width%%\n * bits to its value.\n *\n * If the highest bit is ``1``, the result will be negative.\n */\nexport function fromTwos(_value, _width) {\n const value = getUint(_value, \"value\");\n const width = BigInt(getNumber(_width, \"width\"));\n assert((value >> width) === BN_0, \"overflow\", \"NUMERIC_FAULT\", {\n operation: \"fromTwos\", fault: \"overflow\", value: _value\n });\n // Top bit set; treat as a negative value\n if (value >> (width - BN_1)) {\n const mask = (BN_1 << width) - BN_1;\n return -(((~value) & mask) + BN_1);\n }\n return value;\n}\n/**\n * Convert %%value%% to a twos-compliment representation of\n * %%width%% bits.\n *\n * The result will always be positive.\n */\nexport function toTwos(_value, _width) {\n let value = getBigInt(_value, \"value\");\n const width = BigInt(getNumber(_width, \"width\"));\n const limit = (BN_1 << (width - BN_1));\n if (value < BN_0) {\n value = -value;\n assert(value <= limit, \"too low\", \"NUMERIC_FAULT\", {\n operation: \"toTwos\", fault: \"overflow\", value: _value\n });\n const mask = (BN_1 << width) - BN_1;\n return ((~value) & mask) + BN_1;\n }\n else {\n assert(value < limit, \"too high\", \"NUMERIC_FAULT\", {\n operation: \"toTwos\", fault: \"overflow\", value: _value\n });\n }\n return value;\n}\n/**\n * Mask %%value%% with a bitmask of %%bits%% ones.\n */\nexport function mask(_value, _bits) {\n const value = getUint(_value, \"value\");\n const bits = BigInt(getNumber(_bits, \"bits\"));\n return value & ((BN_1 << bits) - BN_1);\n}\n/**\n * Gets a BigInt from %%value%%. If it is an invalid value for\n * a BigInt, then an ArgumentError will be thrown for %%name%%.\n */\nexport function getBigInt(value, name) {\n switch (typeof (value)) {\n case \"bigint\": return value;\n case \"number\":\n assertArgument(Number.isInteger(value), \"underflow\", name || \"value\", value);\n assertArgument(value >= -maxValue && value <= maxValue, \"overflow\", name || \"value\", value);\n return BigInt(value);\n case \"string\":\n try {\n if (value === \"\") {\n throw new Error(\"empty string\");\n }\n if (value[0] === \"-\" && value[1] !== \"-\") {\n return -BigInt(value.substring(1));\n }\n return BigInt(value);\n }\n catch (e) {\n assertArgument(false, `invalid BigNumberish string: ${e.message}`, name || \"value\", value);\n }\n }\n assertArgument(false, \"invalid BigNumberish value\", name || \"value\", value);\n}\n/**\n * Returns %%value%% as a bigint, validating it is valid as a bigint\n * value and that it is positive.\n */\nexport function getUint(value, name) {\n const result = getBigInt(value, name);\n assert(result >= BN_0, \"unsigned value cannot be negative\", \"NUMERIC_FAULT\", {\n fault: \"overflow\", operation: \"getUint\", value\n });\n return result;\n}\nconst Nibbles = \"0123456789abcdef\";\n/*\n * Converts %%value%% to a BigInt. If %%value%% is a Uint8Array, it\n * is treated as Big Endian data.\n */\nexport function toBigInt(value) {\n if (value instanceof Uint8Array) {\n let result = \"0x0\";\n for (const v of value) {\n result += Nibbles[v >> 4];\n result += Nibbles[v & 0x0f];\n }\n return BigInt(result);\n }\n return getBigInt(value);\n}\n/**\n * Gets a //number// from %%value%%. If it is an invalid value for\n * a //number//, then an ArgumentError will be thrown for %%name%%.\n */\nexport function getNumber(value, name) {\n switch (typeof (value)) {\n case \"bigint\":\n assertArgument(value >= -maxValue && value <= maxValue, \"overflow\", name || \"value\", value);\n return Number(value);\n case \"number\":\n assertArgument(Number.isInteger(value), \"underflow\", name || \"value\", value);\n assertArgument(value >= -maxValue && value <= maxValue, \"overflow\", name || \"value\", value);\n return value;\n case \"string\":\n try {\n if (value === \"\") {\n throw new Error(\"empty string\");\n }\n return getNumber(BigInt(value), name);\n }\n catch (e) {\n assertArgument(false, `invalid numeric string: ${e.message}`, name || \"value\", value);\n }\n }\n assertArgument(false, \"invalid numeric value\", name || \"value\", value);\n}\n/**\n * Converts %%value%% to a number. If %%value%% is a Uint8Array, it\n * is treated as Big Endian data. Throws if the value is not safe.\n */\nexport function toNumber(value) {\n return getNumber(toBigInt(value));\n}\n/**\n * Converts %%value%% to a Big Endian hexstring, optionally padded to\n * %%width%% bytes.\n */\nexport function toBeHex(_value, _width) {\n const value = getUint(_value, \"value\");\n let result = value.toString(16);\n if (_width == null) {\n // Ensure the value is of even length\n if (result.length % 2) {\n result = \"0\" + result;\n }\n }\n else {\n const width = getNumber(_width, \"width\");\n // Special case when both value and width are 0 (see: #5025)\n if (width === 0 && value === BN_0) {\n return \"0x\";\n }\n assert(width * 2 >= result.length, `value exceeds width (${width} bytes)`, \"NUMERIC_FAULT\", {\n operation: \"toBeHex\",\n fault: \"overflow\",\n value: _value\n });\n // Pad the value to the required width\n while (result.length < (width * 2)) {\n result = \"0\" + result;\n }\n }\n return \"0x\" + result;\n}\n/**\n * Converts %%value%% to a Big Endian Uint8Array.\n */\nexport function toBeArray(_value, _width) {\n const value = getUint(_value, \"value\");\n if (value === BN_0) {\n const width = (_width != null) ? getNumber(_width, \"width\") : 0;\n return new Uint8Array(width);\n }\n let hex = value.toString(16);\n if (hex.length % 2) {\n hex = \"0\" + hex;\n }\n if (_width != null) {\n const width = getNumber(_width, \"width\");\n while (hex.length < (width * 2)) {\n hex = \"00\" + hex;\n }\n assert((width * 2) === hex.length, `value exceeds width (${width} bytes)`, \"NUMERIC_FAULT\", {\n operation: \"toBeArray\",\n fault: \"overflow\",\n value: _value\n });\n }\n const result = new Uint8Array(hex.length / 2);\n for (let i = 0; i < result.length; i++) {\n const offset = i * 2;\n result[i] = parseInt(hex.substring(offset, offset + 2), 16);\n }\n return result;\n}\n/**\n * Returns a [[HexString]] for %%value%% safe to use as a //Quantity//.\n *\n * A //Quantity// does not have and leading 0 values unless the value is\n * the literal value `0x0`. This is most commonly used for JSSON-RPC\n * numeric values.\n */\nexport function toQuantity(value) {\n let result = hexlify(isBytesLike(value) ? value : toBeArray(value)).substring(2);\n while (result.startsWith(\"0\")) {\n result = result.substring(1);\n }\n if (result === \"\") {\n result = \"0\";\n }\n return \"0x\" + result;\n}\n//# sourceMappingURL=maths.js.map","/**\n * The **FixedNumber** class permits using values with decimal places,\n * using fixed-pont math.\n *\n * Fixed-point math is still based on integers under-the-hood, but uses an\n * internal offset to store fractional components below, and each operation\n * corrects for this after each operation.\n *\n * @_section: api/utils/fixed-point-math:Fixed-Point Maths [about-fixed-point-math]\n */\nimport { getBytes } from \"./data.js\";\nimport { assert, assertArgument, assertPrivate } from \"./errors.js\";\nimport { getBigInt, getNumber, fromTwos, mask, toBigInt } from \"./maths.js\";\nimport { defineProperties } from \"./properties.js\";\nconst BN_N1 = BigInt(-1);\nconst BN_0 = BigInt(0);\nconst BN_1 = BigInt(1);\nconst BN_5 = BigInt(5);\nconst _guard = {};\n// Constant to pull zeros from for multipliers\nlet Zeros = \"0000\";\nwhile (Zeros.length < 80) {\n Zeros += Zeros;\n}\n// Returns a string \"1\" followed by decimal \"0\"s\nfunction getTens(decimals) {\n let result = Zeros;\n while (result.length < decimals) {\n result += result;\n }\n return BigInt(\"1\" + result.substring(0, decimals));\n}\nfunction checkValue(val, format, safeOp) {\n const width = BigInt(format.width);\n if (format.signed) {\n const limit = (BN_1 << (width - BN_1));\n assert(safeOp == null || (val >= -limit && val < limit), \"overflow\", \"NUMERIC_FAULT\", {\n operation: safeOp, fault: \"overflow\", value: val\n });\n if (val > BN_0) {\n val = fromTwos(mask(val, width), width);\n }\n else {\n val = -fromTwos(mask(-val, width), width);\n }\n }\n else {\n const limit = (BN_1 << width);\n assert(safeOp == null || (val >= 0 && val < limit), \"overflow\", \"NUMERIC_FAULT\", {\n operation: safeOp, fault: \"overflow\", value: val\n });\n val = (((val % limit) + limit) % limit) & (limit - BN_1);\n }\n return val;\n}\nfunction getFormat(value) {\n if (typeof (value) === \"number\") {\n value = `fixed128x${value}`;\n }\n let signed = true;\n let width = 128;\n let decimals = 18;\n if (typeof (value) === \"string\") {\n // Parse the format string\n if (value === \"fixed\") {\n // defaults...\n }\n else if (value === \"ufixed\") {\n signed = false;\n }\n else {\n const match = value.match(/^(u?)fixed([0-9]+)x([0-9]+)$/);\n assertArgument(match, \"invalid fixed format\", \"format\", value);\n signed = (match[1] !== \"u\");\n width = parseInt(match[2]);\n decimals = parseInt(match[3]);\n }\n }\n else if (value) {\n // Extract the values from the object\n const v = value;\n const check = (key, type, defaultValue) => {\n if (v[key] == null) {\n return defaultValue;\n }\n assertArgument(typeof (v[key]) === type, \"invalid fixed format (\" + key + \" not \" + type + \")\", \"format.\" + key, v[key]);\n return v[key];\n };\n signed = check(\"signed\", \"boolean\", signed);\n width = check(\"width\", \"number\", width);\n decimals = check(\"decimals\", \"number\", decimals);\n }\n assertArgument((width % 8) === 0, \"invalid FixedNumber width (not byte aligned)\", \"format.width\", width);\n assertArgument(decimals <= 80, \"invalid FixedNumber decimals (too large)\", \"format.decimals\", decimals);\n const name = (signed ? \"\" : \"u\") + \"fixed\" + String(width) + \"x\" + String(decimals);\n return { signed, width, decimals, name };\n}\nfunction toString(val, decimals) {\n let negative = \"\";\n if (val < BN_0) {\n negative = \"-\";\n val *= BN_N1;\n }\n let str = val.toString();\n // No decimal point for whole values\n if (decimals === 0) {\n return (negative + str);\n }\n // Pad out to the whole component (including a whole digit)\n while (str.length <= decimals) {\n str = Zeros + str;\n }\n // Insert the decimal point\n const index = str.length - decimals;\n str = str.substring(0, index) + \".\" + str.substring(index);\n // Trim the whole component (leaving at least one 0)\n while (str[0] === \"0\" && str[1] !== \".\") {\n str = str.substring(1);\n }\n // Trim the decimal component (leaving at least one 0)\n while (str[str.length - 1] === \"0\" && str[str.length - 2] !== \".\") {\n str = str.substring(0, str.length - 1);\n }\n return (negative + str);\n}\n/**\n * A FixedNumber represents a value over its [[FixedFormat]]\n * arithmetic field.\n *\n * A FixedNumber can be used to perform math, losslessly, on\n * values which have decmial places.\n *\n * A FixedNumber has a fixed bit-width to store values in, and stores all\n * values internally by multiplying the value by 10 raised to the power of\n * %%decimals%%.\n *\n * If operations are performed that cause a value to grow too high (close to\n * positive infinity) or too low (close to negative infinity), the value\n * is said to //overflow//.\n *\n * For example, an 8-bit signed value, with 0 decimals may only be within\n * the range ``-128`` to ``127``; so ``-128 - 1`` will overflow and become\n * ``127``. Likewise, ``127 + 1`` will overflow and become ``-127``.\n *\n * Many operation have a normal and //unsafe// variant. The normal variant\n * will throw a [[NumericFaultError]] on any overflow, while the //unsafe//\n * variant will silently allow overflow, corrupting its value value.\n *\n * If operations are performed that cause a value to become too small\n * (close to zero), the value loses precison and is said to //underflow//.\n *\n * For example, a value with 1 decimal place may store a number as small\n * as ``0.1``, but the value of ``0.1 / 2`` is ``0.05``, which cannot fit\n * into 1 decimal place, so underflow occurs which means precision is lost\n * and the value becomes ``0``.\n *\n * Some operations have a normal and //signalling// variant. The normal\n * variant will silently ignore underflow, while the //signalling// variant\n * will thow a [[NumericFaultError]] on underflow.\n */\nexport class FixedNumber {\n /**\n * The specific fixed-point arithmetic field for this value.\n */\n format;\n #format;\n // The actual value (accounting for decimals)\n #val;\n // A base-10 value to multiple values by to maintain the magnitude\n #tens;\n /**\n * This is a property so console.log shows a human-meaningful value.\n *\n * @private\n */\n _value;\n // Use this when changing this file to get some typing info,\n // but then switch to any to mask the internal type\n //constructor(guard: any, value: bigint, format: _FixedFormat) {\n /**\n * @private\n */\n constructor(guard, value, format) {\n assertPrivate(guard, _guard, \"FixedNumber\");\n this.#val = value;\n this.#format = format;\n const _value = toString(value, format.decimals);\n defineProperties(this, { format: format.name, _value });\n this.#tens = getTens(format.decimals);\n }\n /**\n * If true, negative values are permitted, otherwise only\n * positive values and zero are allowed.\n */\n get signed() { return this.#format.signed; }\n /**\n * The number of bits available to store the value.\n */\n get width() { return this.#format.width; }\n /**\n * The number of decimal places in the fixed-point arithment field.\n */\n get decimals() { return this.#format.decimals; }\n /**\n * The value as an integer, based on the smallest unit the\n * [[decimals]] allow.\n */\n get value() { return this.#val; }\n #checkFormat(other) {\n assertArgument(this.format === other.format, \"incompatible format; use fixedNumber.toFormat\", \"other\", other);\n }\n #checkValue(val, safeOp) {\n /*\n const width = BigInt(this.width);\n if (this.signed) {\n const limit = (BN_1 << (width - BN_1));\n assert(safeOp == null || (val >= -limit && val < limit), \"overflow\", \"NUMERIC_FAULT\", {\n operation: <string>safeOp, fault: \"overflow\", value: val\n });\n \n if (val > BN_0) {\n val = fromTwos(mask(val, width), width);\n } else {\n val = -fromTwos(mask(-val, width), width);\n }\n \n } else {\n const masked = mask(val, width);\n assert(safeOp == null || (val >= 0 && val === masked), \"overflow\", \"NUMERIC_FAULT\", {\n operation: <string>safeOp, fault: \"overflow\", value: val\n });\n val = masked;\n }\n */\n val = checkValue(val, this.#format, safeOp);\n return new FixedNumber(_guard, val, this.#format);\n }\n #add(o, safeOp) {\n this.#checkFormat(o);\n return this.#checkValue(this.#val + o.#val, safeOp);\n }\n /**\n * Returns a new [[FixedNumber]] with the result of %%this%% added\n * to %%other%%, ignoring overflow.\n */\n addUnsafe(other) { return this.#add(other); }\n /**\n * Returns a new [[FixedNumber]] with the result of %%this%% added\n * to %%other%%. A [[NumericFaultError]] is thrown if overflow\n * occurs.\n */\n add(other) { return this.#add(other, \"add\"); }\n #sub(o, safeOp) {\n this.#checkFormat(o);\n return this.#checkValue(this.#val - o.#val, safeOp);\n }\n /**\n * Returns a new [[FixedNumber]] with the result of %%other%% subtracted\n * from %%this%%, ignoring overflow.\n */\n subUnsafe(other) { return this.#sub(other); }\n /**\n * Returns a new [[FixedNumber]] with the result of %%other%% subtracted\n * from %%this%%. A [[NumericFaultError]] is thrown if overflow\n * occurs.\n */\n sub(other) { return this.#sub(other, \"sub\"); }\n #mul(o, safeOp) {\n this.#checkFormat(o);\n return this.#checkValue((this.#val * o.#val) / this.#tens, safeOp);\n }\n /**\n * Returns a new [[FixedNumber]] with the result of %%this%% multiplied\n * by %%other%%, ignoring overflow and underflow (precision loss).\n */\n mulUnsafe(other) { return this.#mul(other); }\n /**\n * Returns a new [[FixedNumber]] with the result of %%this%% multiplied\n * by %%other%%. A [[NumericFaultError]] is thrown if overflow\n * occurs.\n */\n mul(other) { return this.#mul(other, \"mul\"); }\n /**\n * Returns a new [[FixedNumber]] with the result of %%this%% multiplied\n * by %%other%%. A [[NumericFaultError]] is thrown if overflow\n * occurs or if underflow (precision loss) occurs.\n */\n mulSignal(other) {\n this.#checkFormat(other);\n const value = this.#val * other.#val;\n assert((value % this.#tens) === BN_0, \"precision lost during signalling mul\", \"NUMERIC_FAULT\", {\n operation: \"mulSignal\", fault: \"underflow\", value: this\n });\n return this.#checkValue(value / this.#tens, \"mulSignal\");\n }\n #div(o, safeOp) {\n assert(o.#val !== BN_0, \"division by zero\", \"NUMERIC_FAULT\", {\n operation: \"div\", fault: \"divide-by-zero\", value: this\n });\n this.#checkFormat(o);\n return this.#checkValue((this.#val * this.#tens) / o.#val, safeOp);\n }\n /**\n * Returns a new [[FixedNumber]] with the result of %%this%% divided\n * by %%other%%, ignoring underflow (precision loss). A\n * [[NumericFaultError]] is thrown if overflow occurs.\n */\n divUnsafe(other) { return this.#div(other); }\n /**\n * Returns a new [[FixedNumber]] with the result of %%this%% divided\n * by %%other%%, ignoring underflow (precision loss). A\n * [[NumericFaultError]] is thrown if overflow occurs.\n */\n div(other) { return this.#div(other, \"div\"); }\n /**\n * Returns a new [[FixedNumber]] with the result of %%this%% divided\n * by %%other%%. A [[NumericFaultError]] is thrown if underflow\n * (precision loss) occurs.\n */\n divSignal(other) {\n assert(other.#val !== BN_0, \"division by zero\", \"NUMERIC_FAULT\", {\n operation: \"div\", fault: \"divide-by-zero\", value: this\n });\n this.#checkFormat(other);\n const value = (this.#val * this.#tens);\n assert((value % other.#val) === BN_0, \"precision lost during signalling div\", \"NUMERIC_FAULT\", {\n operation: \"divSignal\", fault: \"underflow\", value: this\n });\n return this.#checkValue(value / other.#val, \"divSignal\");\n }\n /**\n * Returns a comparison result between %%this%% and %%other%%.\n *\n * This is suitable for use in sorting, where ``-1`` implies %%this%%\n * is smaller, ``1`` implies %%this%% is larger and ``0`` implies\n * both are equal.\n */\n cmp(other) {\n let a = this.value, b = other.value;\n // Coerce a and b to the same magnitude\n const delta = this.decimals - other.decimals;\n if (delta > 0) {\n b *= getTens(delta);\n }\n else if (delta < 0) {\n a *= getTens(-delta);\n }\n // Comnpare\n if (a < b) {\n return -1;\n }\n if (a > b) {\n return 1;\n }\n return 0;\n }\n /**\n * Returns true if %%other%% is equal to %%this%%.\n */\n eq(other) { return this.cmp(other) === 0; }\n /**\n * Returns true if %%other%% is less than to %%this%%.\n */\n lt(other) { return this.cmp(other) < 0; }\n /**\n * Returns true if %%other%% is less than or equal to %%this%%.\n */\n lte(other) { return this.cmp(other) <= 0; }\n /**\n * Returns true if %%other%% is greater than to %%this%%.\n */\n gt(other) { return this.cmp(other) > 0; }\n /**\n * Returns true if %%other%% is greater than or equal to %%this%%.\n */\n gte(other) { return this.cmp(other) >= 0; }\n /**\n * Returns a new [[FixedNumber]] which is the largest **integer**\n * that is less than or equal to %%this%%.\n *\n * The decimal component of the result will always be ``0``.\n */\n floor() {\n let val = this.#val;\n if (this.#val < BN_0) {\n val -= this.#tens - BN_1;\n }\n val = (this.#val / this.#tens) * this.#tens;\n return this.#checkValue(val, \"floor\");\n }\n /**\n * Returns a new [[FixedNumber]] which is the smallest **integer**\n * that is greater than or equal to %%this%%.\n *\n * The decimal component of the result will always be ``0``.\n */\n ceiling() {\n let val = this.#val;\n if (this.#val > BN_0) {\n val += this.#tens - BN_1;\n }\n val = (this.#val / this.#tens) * this.#tens;\n return this.#checkValue(val, \"ceiling\");\n }\n /**\n * Returns a new [[FixedNumber]] with the decimal component\n * rounded up on ties at %%decimals%% places.\n */\n round(decimals) {\n if (decimals == null) {\n decimals = 0;\n }\n // Not enough precision to not already be rounded\n if (decimals >= this.decimals) {\n return this;\n }\n const delta = this.decimals - decimals;\n const bump = BN_5 * getTens(delta - 1);\n let value = this.value + bump;\n const tens = getTens(delta);\n value = (value / tens) * tens;\n checkValue(value, this.#format, \"round\");\n return new FixedNumber(_guard, value, this.#format);\n }\n /**\n * Returns true if %%this%% is equal to ``0``.\n */\n isZero() { return (this.#val === BN_0); }\n /**\n * Returns true if %%this%% is less than ``0``.\n */\n isNegative() { return (this.#val < BN_0); }\n /**\n * Returns the string representation of %%this%%.\n */\n toString() { return this._value; }\n /**\n * Returns a float approximation.\n *\n * Due to IEEE 754 precission (or lack thereof), this function\n * can only return an approximation and most values will contain\n * rounding errors.\n */\n toUnsafeFloat() { return parseFloat(this.toString()); }\n /**\n * Return a new [[FixedNumber]] with the same value but has had\n * its field set to %%format%%.\n *\n * This will throw if the value cannot fit into %%format%%.\n */\n toFormat(format) {\n return FixedNumber.fromString(this.toString(), format);\n }\n /**\n * Creates a new [[FixedNumber]] for %%value%% divided by\n * %%decimal%% places with %%format%%.\n *\n * This will throw a [[NumericFaultError]] if %%value%% (once adjusted\n * for %%decimals%%) cannot fit in %%format%%, either due to overflow\n * or underflow (precision loss).\n */\n static fromValue(_value, _decimals, _format) {\n const decimals = (_decimals == null) ? 0 : getNumber(_decimals);\n const format = getFormat(_format);\n let value = getBigInt(_value, \"value\");\n const delta = decimals - format.decimals;\n if (delta > 0) {\n const tens = getTens(delta);\n assert((value % tens) === BN_0, \"value loses precision for format\", \"NUMERIC_FAULT\", {\n operation: \"fromValue\", fault: \"underflow\", value: _value\n });\n value /= tens;\n }\n else if (delta < 0) {\n value *= getTens(-delta);\n }\n checkValue(value, format, \"fromValue\");\n return new FixedNumber(_guard, value, format);\n }\n /**\n * Creates a new [[FixedNumber]] for %%value%% with %%format%%.\n *\n * This will throw a [[NumericFaultError]] if %%value%% cannot fit\n * in %%format%%, either due to overflow or underflow (precision loss).\n */\n static fromString(_value, _format) {\n const match = _value.match(/^(-?)([0-9]*)\\.?([0-9]*)$/);\n assertArgument(match && (match[2].length + match[3].length) > 0, \"invalid FixedNumber string value\", \"value\", _value);\n const format = getFormat(_format);\n let whole = (match[2] || \"0\"), decimal = (match[3] || \"\");\n // Pad out the decimals\n while (decimal.length < format.decimals) {\n decimal += Zeros;\n }\n // Check precision is safe\n assert(decimal.substring(format.decimals).match(/^0*$/), \"too many decimals for format\", \"NUMERIC_FAULT\", {\n operation: \"fromString\", fault: \"underflow\", value: _value\n });\n // Remove extra padding\n decimal = decimal.substring(0, format.decimals);\n const value = BigInt(match[1] + whole + decimal);\n checkValue(value, format, \"fromString\");\n return new FixedNumber(_guard, value, format);\n }\n /**\n * Creates a new [[FixedNumber]] with the big-endian representation\n * %%value%% with %%format%%.\n *\n * This will throw a [[NumericFaultError]] if %%value%% cannot fit\n * in %%format%% due to overflow.\n */\n static fromBytes(_value, _format) {\n let value = toBigInt(getBytes(_value, \"value\"));\n const format = getFormat(_format);\n if (format.signed) {\n value = fromTwos(value, format.width);\n }\n checkValue(value, format, \"fromBytes\");\n return new FixedNumber(_guard, value, format);\n }\n}\n//const f1 = FixedNumber.fromString(\"12.56\", \"fixed16x2\");\n//const f2 = FixedNumber.fromString(\"0.3\", \"fixed16x2\");\n//console.log(f1.divSignal(f2));\n//const BUMP = FixedNumber.from(\"0.5\");\n//# sourceMappingURL=fixednumber.js.map","/**\n * Most interactions with Ethereum requires integer values, which use\n * the smallest magnitude unit.\n *\n * For example, imagine dealing with dollars and cents. Since dollars\n * are divisible, non-integer values are possible, such as ``$10.77``.\n * By using the smallest indivisible unit (i.e. cents), the value can\n * be kept as the integer ``1077``.\n *\n * When receiving decimal input from the user (as a decimal string),\n * the value should be converted to an integer and when showing a user\n * a value, the integer value should be converted to a decimal string.\n *\n * This creates a clear distinction, between values to be used by code\n * (integers) and values used for display logic to users (decimals).\n *\n * The native unit in Ethereum, //ether// is divisible to 18 decimal places,\n * where each individual unit is called a //wei//.\n *\n * @_subsection api/utils:Unit Conversion [about-units]\n */\nimport { assertArgument } from \"./errors.js\";\nimport { FixedNumber } from \"./fixednumber.js\";\nimport { getNumber } from \"./maths.js\";\nconst names = [\n \"wei\",\n \"kwei\",\n \"mwei\",\n \"gwei\",\n \"szabo\",\n \"finney\",\n \"ether\",\n];\n/**\n * Converts %%value%% into a //decimal string//, assuming %%unit%% decimal\n * places. The %%unit%% may be the number of decimal places or the name of\n * a unit (e.g. ``\"gwei\"`` for 9 decimal places).\n *\n */\nexport function formatUnits(value, unit) {\n let decimals = 18;\n if (typeof (unit) === \"string\") {\n const index = names.indexOf(unit);\n assertArgument(index >= 0, \"invalid unit\", \"unit\", unit);\n decimals = 3 * index;\n }\n else if (unit != null) {\n decimals = getNumber(unit, \"unit\");\n }\n return FixedNumber.fromValue(value, decimals, { decimals, width: 512 }).toString();\n}\n/**\n * Converts the //decimal string// %%value%% to a BigInt, assuming\n * %%unit%% decimal places. The %%unit%% may the number of decimal places\n * or the name of a unit (e.g. ``\"gwei\"`` for 9 decimal places).\n */\nexport function parseUnits(value, unit) {\n assertArgument(typeof (value) === \"string\", \"value must be a string\", \"value\", value);\n let decimals = 18;\n if (typeof (unit) === \"string\") {\n const index = names.indexOf(unit);\n assertArgument(index >= 0, \"invalid unit\", \"unit\", unit);\n decimals = 3 * index;\n }\n else if (unit != null) {\n decimals = getNumber(unit, \"unit\");\n }\n return FixedNumber.fromString(value, { decimals, width: 512 }).value;\n}\n/**\n * Converts %%value%% into a //decimal string// using 18 decimal places.\n */\nexport function formatEther(wei) {\n return formatUnits(wei, 18);\n}\n/**\n * Converts the //decimal string// %%ether%% to a BigInt, using 18\n * decimal places.\n */\nexport function parseEther(ether) {\n return parseUnits(ether, 18);\n}\n//# sourceMappingURL=units.js.map","/**\n * A constant for the zero address.\n *\n * (**i.e.** ``\"0x0000000000000000000000000000000000000000\"``)\n */\nexport const ZeroAddress = \"0x0000000000000000000000000000000000000000\";\n//# sourceMappingURL=addresses.js.map","import { DEFAULT_API_BASE } from \"../constants/api\";\r\n\r\nexport interface QuoteParams {\r\n originChainId: string | number;\r\n destinationChainId: string | number;\r\n originCurrency: string;\r\n destinationCurrency: string;\r\n amount: string;\r\n senderAddress: string;\r\n receiverAddress?: string;\r\n slippage?: number;\r\n}\r\n\r\nexport interface QuoteResponse {\r\n calldata?: {\r\n to?: string;\r\n data?: string;\r\n value?: string;\r\n };\r\n gas?: {\r\n gasPrice?: string;\r\n gasLimit?: string;\r\n maxFeePerGas?: string;\r\n maxPriorityFeePerGas?: string;\r\n };\r\n inputAmount?: string;\r\n outputAmount?: string;\r\n fees?: {\r\n total?: { amount: string; decimals?: number };\r\n breakdown?: Array<{ type: string; amount: string; gasPrice?: string }>;\r\n };\r\n [key: string]: unknown;\r\n}\r\n\r\nexport function parseToAmount(toAmount: string, decimals: number): string {\r\n return (Number(toAmount) / Math.pow(10, decimals)).toString();\r\n}\r\n\r\nexport async function fetchQuote(\r\n params: QuoteParams,\r\n apiBase: string = DEFAULT_API_BASE\r\n): Promise<QuoteResponse> {\r\n const searchParams = new URLSearchParams({\r\n senderAddress: params.senderAddress,\r\n receiverAddress: params.receiverAddress ?? params.senderAddress,\r\n originChainId: String(params.originChainId),\r\n destinationChainId: String(params.destinationChainId),\r\n amount: params.amount,\r\n originCurrency: params.originCurrency,\r\n destinationCurrency: params.destinationCurrency,\r\n });\r\n if (params.slippage != null) {\r\n searchParams.set(\"slippage\", String(params.slippage));\r\n }\r\n\r\n const url = `${apiBase}/v1/quotes?${searchParams.toString()}`;\r\n const res = await fetch(url);\r\n if (!res.ok) {\r\n const errBody = await res.json().catch(() => ({}));\r\n const err = new Error(errBody?.message ?? `HTTP ${res.status}`);\r\n (err as any).status = res.status;\r\n (err as any).statusCode = errBody?.statusCode;\r\n (err as any).error = errBody;\r\n throw err;\r\n }\r\n return res.json();\r\n}\r\n","import { useCallback, useRef, useState } from \"react\";\r\nimport { parseUnits } from \"ethers\";\r\nimport type { Token } from \"../types\";\r\nimport {\r\n fetchQuote,\r\n parseToAmount,\r\n type QuoteResponse,\r\n} from \"../api/tradeApi\";\r\nimport { DEFAULT_API_BASE } from \"../constants/api\";\r\n\r\nexport type ButtonState =\r\n | \"swap\"\r\n | \"finding\"\r\n | \"approve\"\r\n | \"wallet\"\r\n | \"insufficient\"\r\n | \"no-available-quotes\"\r\n | \"wrong-address\"\r\n | \"rate-limit\";\r\n\r\nexport interface UseTradeApiResult {\r\n txData: QuoteResponse[\"calldata\"] | null;\r\n buyAmount: string;\r\n buyAmountForInput: string;\r\n setBuyAmount: (s: string) => void;\r\n setBuyAmountForInput: (s: string) => void;\r\n price: number;\r\n gasCostUSD: string | null;\r\n gasPriceRaw: string | undefined;\r\n gasLimitRaw: string | undefined;\r\n buttonState: ButtonState;\r\n setButtonState: (s: ButtonState) => void;\r\n fetchQuote: (params: FetchQuoteParams) => void;\r\n cancelRequest: () => void;\r\n invalidateQuote: () => void;\r\n}\r\n\r\nexport interface FetchQuoteParams {\r\n sellNetworkId: number;\r\n buyNetworkId: number;\r\n sellToken: Token;\r\n buyToken: Token;\r\n sellAmountStr: string;\r\n slippage: number;\r\n fromAddress: string;\r\n toAddress?: string;\r\n apiBase?: string;\r\n}\r\n\r\nfunction truncateToTokenDecimals(amountStr: string, maxDecimals: number): string {\r\n if (!amountStr || maxDecimals < 0) return amountStr;\r\n if (!amountStr.includes(\".\")) return amountStr;\r\n const [intPart, decPart] = amountStr.split(\".\");\r\n if (!decPart || decPart.length <= maxDecimals) return amountStr;\r\n const trimmed = decPart.slice(0, maxDecimals);\r\n return trimmed ? `${intPart}.${trimmed}` : intPart || \"0\";\r\n}\r\n\r\nexport function useTradeApi(): UseTradeApiResult {\r\n const [txData, setTxData] = useState<QuoteResponse[\"calldata\"] | null>(null);\r\n const [buyAmount, setBuyAmount] = useState(\"\");\r\n const [buyAmountForInput, setBuyAmountForInput] = useState(\"\");\r\n const [price, setPrice] = useState(0);\r\n const [gasCostUSD, setGasCostUSD] = useState<string | null>(null);\r\n const [gasPriceRaw, setGasPriceRaw] = useState<string | undefined>();\r\n const [gasLimitRaw, setGasLimitRaw] = useState<string | undefined>();\r\n const [buttonState, setButtonState] = useState<ButtonState>(\"swap\");\r\n\r\n const abortRef = useRef<AbortController | null>(null);\r\n const requestIdRef = useRef(0);\r\n\r\n const cancelRequest = useCallback(() => {\r\n abortRef.current?.abort();\r\n abortRef.current = null;\r\n }, []);\r\n\r\n const invalidateQuote = useCallback(() => {\r\n setTxData(null);\r\n setButtonState(\"finding\");\r\n }, []);\r\n\r\n const fetchQuoteRequest = useCallback(\r\n (params: FetchQuoteParams) => {\r\n cancelRequest();\r\n const requestId = ++requestIdRef.current;\r\n const abort = new AbortController();\r\n abortRef.current = abort;\r\n\r\n const {\r\n sellNetworkId,\r\n buyNetworkId,\r\n sellToken,\r\n buyToken,\r\n sellAmountStr,\r\n slippage,\r\n fromAddress,\r\n toAddress,\r\n apiBase = DEFAULT_API_BASE,\r\n } = params;\r\n\r\n const truncated = truncateToTokenDecimals(\r\n sellAmountStr || \"0\",\r\n sellToken.decimals\r\n );\r\n let fromAmount: bigint;\r\n try {\r\n fromAmount = parseUnits(truncated, sellToken.decimals);\r\n } catch {\r\n setButtonState(\"swap\");\r\n return;\r\n }\r\n\r\n if (fromAmount <= 0n) {\r\n setButtonState(\"swap\");\r\n return;\r\n }\r\n\r\n setButtonState(\"finding\");\r\n setTxData(null);\r\n setGasPriceRaw(undefined);\r\n setGasLimitRaw(undefined);\r\n\r\n const toAddr =\r\n toAddress && toAddress !== \"\" ? toAddress : undefined;\r\n\r\n fetchQuote(\r\n {\r\n originChainId: sellNetworkId,\r\n destinationChainId: buyNetworkId,\r\n originCurrency: sellToken.contractAddress,\r\n destinationCurrency: buyToken.contractAddress,\r\n amount: fromAmount.toString(),\r\n senderAddress: fromAddress,\r\n receiverAddress: toAddr,\r\n slippage: slippage ?? 0.005,\r\n },\r\n apiBase\r\n )\r\n .then((response) => {\r\n if (requestId !== requestIdRef.current) return;\r\n\r\n const gasBreakdown = response?.fees?.breakdown?.find(\r\n (b: any) => b.type === \"gas\"\r\n );\r\n if (gasBreakdown) {\r\n setGasLimitRaw(String(gasBreakdown.amount));\r\n if (gasBreakdown.gasPrice !== undefined) {\r\n setGasPriceRaw(String(gasBreakdown.gasPrice));\r\n }\r\n }\r\n if (response?.calldata) {\r\n const rawOutput = response.outputAmount ?? \"0\";\r\n const toAmountNumber = String(rawOutput).includes(\".\")\r\n ? Number(rawOutput)\r\n : Number(\r\n parseToAmount(\r\n String(rawOutput),\r\n buyToken.decimals\r\n )\r\n );\r\n const readable = toAmountNumber\r\n .toFixed(buyToken.decimals)\r\n .replace(/\\.?0+$/, \"\");\r\n setBuyAmount(readable);\r\n setBuyAmountForInput(readable);\r\n\r\n const totalFeesAmount = Number(\r\n response.fees?.total?.amount || \"0\"\r\n );\r\n const totalFeesDecimals = Number(\r\n response.fees?.total?.decimals ?? 18\r\n );\r\n const gasTokenAmount =\r\n totalFeesAmount / Math.pow(10, totalFeesDecimals);\r\n setGasCostUSD(\r\n gasTokenAmount <= 0\r\n ? null\r\n : gasTokenAmount < 0.01\r\n ? \"$<0.01\"\r\n : `$${gasTokenAmount.toFixed(2)}`\r\n );\r\n\r\n const fromDecimal = parseFloat(\r\n parseToAmount(\r\n response.inputAmount ?? \"0\",\r\n sellToken.decimals\r\n )\r\n );\r\n const toDecimal = parseFloat(\r\n parseToAmount(\r\n response.outputAmount ?? \"0\",\r\n buyToken.decimals\r\n )\r\n );\r\n if (fromDecimal > 0) {\r\n setPrice(Number((toDecimal / fromDecimal).toFixed(3)));\r\n }\r\n\r\n setTxData(response.calldata ?? null);\r\n const isNative =\r\n sellToken.contractAddress ===\r\n \"0x0000000000000000000000000000000000000000\";\r\n setButtonState(isNative ? \"swap\" : \"approve\");\r\n }\r\n })\r\n .catch((err) => {\r\n if (requestId !== requestIdRef.current) return;\r\n if (err?.name === \"AbortError\") return;\r\n\r\n const msg = String(err?.error?.message ?? err?.message ?? \"\");\r\n const statusCode = err?.statusCode ?? err?.status;\r\n\r\n if (\r\n msg.includes(\"No available quotes\") ||\r\n statusCode === 422\r\n ) {\r\n setButtonState(\"no-available-quotes\");\r\n } else if (\r\n msg.includes(\"Invalid toAddress\") ||\r\n msg.includes(\"Invalid fromAddress\")\r\n ) {\r\n setButtonState(\"wrong-address\");\r\n } else if (statusCode === 429 || msg.includes(\"Rate limit\")) {\r\n setButtonState(\"rate-limit\");\r\n } else {\r\n setButtonState(\"no-available-quotes\");\r\n }\r\n });\r\n },\r\n [cancelRequest]\r\n );\r\n\r\n return {\r\n txData,\r\n buyAmount,\r\n buyAmountForInput,\r\n setBuyAmount,\r\n setBuyAmountForInput,\r\n price,\r\n gasCostUSD,\r\n gasPriceRaw,\r\n gasLimitRaw,\r\n buttonState,\r\n setButtonState,\r\n fetchQuote: fetchQuoteRequest,\r\n cancelRequest,\r\n invalidateQuote,\r\n};\r\n}\r\n","import { useCallback, useEffect, useState } from \"react\";\r\n\r\nconst STORAGE_INDEX = \"delora-slippage-selectedIndex\";\r\nconst STORAGE_CUSTOM = \"delora-slippage-customValue\";\r\nconst STORAGE_VALUE = \"delora-slippage-value\";\r\n\r\nconst OPTIONS = [\"Auto\", \"0.1%\", \"0.5%\"];\r\nconst AUTO_SLIPPAGE = 0.005;\r\n\r\nexport function useSlippage() {\r\n const [selectedIndex, setSelectedIndex] = useState<number | null>(0);\r\n const [customValue, setCustomValue] = useState(\"\");\r\n const [slippage, setSlippage] = useState(AUTO_SLIPPAGE);\r\n\r\n useEffect(() => {\r\n const si = localStorage.getItem(STORAGE_INDEX);\r\n const cv = localStorage.getItem(STORAGE_CUSTOM);\r\n if (si !== null) setSelectedIndex(JSON.parse(si));\r\n if (cv) setCustomValue(cv);\r\n }, []);\r\n\r\n const selectOption = useCallback((index: number) => {\r\n setSelectedIndex(index);\r\n setCustomValue(\"\");\r\n localStorage.setItem(STORAGE_INDEX, JSON.stringify(index));\r\n localStorage.setItem(STORAGE_CUSTOM, \"\");\r\n setSlippage(index === 0 ? AUTO_SLIPPAGE : parseFloat(OPTIONS[index].replace(\"%\", \"\")) / 100);\r\n }, []);\r\n\r\n const setCustom = useCallback((value: string) => {\r\n setSelectedIndex(null);\r\n setCustomValue(value);\r\n localStorage.setItem(STORAGE_INDEX, \"null\");\r\n localStorage.setItem(STORAGE_CUSTOM, value);\r\n const num = parseFloat(value.replace(\"%\", \"\"));\r\n if (!isNaN(num) && num <= 49.9) {\r\n setSlippage(num / 100);\r\n }\r\n }, []);\r\n\r\n const save = useCallback(\r\n (value: string): number => {\r\n if (value === \"Auto\") {\r\n const s = AUTO_SLIPPAGE;\r\n setSlippage(s);\r\n localStorage.setItem(STORAGE_VALUE, value);\r\n return s;\r\n }\r\n const val = parseFloat(value.replace(\"%\", \"\"));\r\n if (val > 49.9) throw new Error(\"Slippage is too high!\");\r\n const s = val / 100;\r\n setSlippage(s);\r\n localStorage.setItem(STORAGE_VALUE, value);\r\n return s;\r\n },\r\n []\r\n );\r\n\r\n return {\r\n options: OPTIONS,\r\n selectedIndex,\r\n customValue,\r\n slippage,\r\n selectOption,\r\n setCustom,\r\n save,\r\n };\r\n}\r\n","import { useCallback, useEffect, useRef, useState } from \"react\";\r\nimport type { Token } from \"../types\";\r\nimport { useTradeState } from \"./useTradeState\";\r\nimport { useTradeApi } from \"./useTradeApi\";\r\nimport { useSlippage } from \"./useSlippage\";\r\nimport { DEFAULT_API_BASE } from \"../constants/api\";\r\nimport {\r\n CONSTANT_ETH_ADDRESS,\r\n CONSTANT_SOL_ADDRESS,\r\n CONSTANT_SUI_ADDRESS,\r\n} from \"../constants/api\";\r\n\r\nconst INPUT_DEBOUNCE_MS = 1000;\r\n\r\nfunction limitDecimals(value: string, max: number): string {\r\n if (!value.includes(\".\")) return value;\r\n const [int, dec] = value.split(\".\");\r\n return `${int}.${(dec ?? \"\").slice(0, max)}`;\r\n}\r\n\r\nfunction getAddressForChainType(chainType: string | undefined): string {\r\n if (chainType === \"EVM\") return CONSTANT_ETH_ADDRESS;\r\n if (chainType === \"SVM\") return CONSTANT_SOL_ADDRESS;\r\n return CONSTANT_SUI_ADDRESS;\r\n}\r\n\r\nexport function useTrade(config: {\n apiBase?: string;\n}) {\n const state = useTradeState({ apiBase: config.apiBase });\n const api = useTradeApi();\n const slippage = useSlippage();\n\r\n const [sellAmountForInput, setSellAmountForInput] = useState(\"\");\r\n const [validatedSellAmount, setValidatedSellAmount] = useState(0);\r\n const [isProcessingInput, setIsProcessingInput] = useState(false);\r\n const debounceRef = useRef<ReturnType<typeof setTimeout> | null>(null);\r\n\r\n const balance = 0;\r\n const balanceBuy = 0;\r\n\r\n const allFieldsReady =\r\n !!state.sellToken &&\r\n !!state.buyToken &&\r\n validatedSellAmount > 0;\r\n\r\n const fetchQuote = useCallback(() => {\r\n if (\r\n !state.networkSell ||\r\n !state.networkBuy ||\r\n !state.sellToken ||\r\n !state.buyToken ||\r\n validatedSellAmount <= 0 ||\r\n isProcessingInput\r\n ) {\r\n return;\r\n }\r\n\r\n const fromAddress = getAddressForChainType(state.networkSell.chainType);\r\n const toAddress = getAddressForChainType(state.networkBuy.chainType);\r\n\r\n api.fetchQuote({\r\n sellNetworkId: state.networkSell.id,\r\n buyNetworkId: state.networkBuy.id,\r\n sellToken: state.sellToken,\r\n buyToken: state.buyToken,\r\n sellAmountStr: sellAmountForInput || \"0\",\r\n slippage: slippage.slippage,\r\n fromAddress,\r\n toAddress,\r\n apiBase: config.apiBase ?? DEFAULT_API_BASE,\r\n });\r\n }, [\r\n state.networkSell,\r\n state.networkBuy,\r\n state.sellToken,\r\n state.buyToken,\r\n validatedSellAmount,\r\n sellAmountForInput,\r\n slippage.slippage,\r\n isProcessingInput,\r\n config.apiBase,\r\n api,\r\n ]);\r\n\r\n useEffect(() => {\r\n if (!allFieldsReady) {\r\n api.cancelRequest();\r\n api.setBuyAmount(\"\");\r\n api.setBuyAmountForInput(\"\");\r\n api.setButtonState(\"swap\");\r\n return;\r\n }\r\n fetchQuote();\r\n // eslint-disable-next-line react-hooks/exhaustive-deps -- fetchQuote excluded to avoid infinite loop (api changes every render)\r\n }, [\r\n allFieldsReady,\r\n state.networkSell?.id,\r\n state.networkBuy?.id,\r\n state.sellToken?.contractAddress,\r\n state.buyToken?.contractAddress,\r\n validatedSellAmount,\r\n sellAmountForInput,\r\n slippage.slippage,\r\n isProcessingInput,\r\n ]);\r\n\r\n useEffect(() => {\r\n if (validatedSellAmount === 0) {\r\n api.setBuyAmount(\"\");\r\n api.setBuyAmountForInput(\"\");\r\n }\r\n }, [validatedSellAmount]);\r\n\r\n const processSellInput = useCallback((value: string) => {\r\n const cleaned = value\r\n .replace(/[^0-9.]/g, \"\")\r\n .replace(/\\.+/g, \".\")\r\n .replace(/^(\\.)/g, \"\");\r\n const limited = limitDecimals(cleaned, 6);\r\n const num = Number(limited);\r\n\r\n setSellAmountForInput(limited);\r\n setValidatedSellAmount(isNaN(num) ? 0 : num);\r\n setIsProcessingInput(true);\r\n api.invalidateQuote();\r\n\r\n if (debounceRef.current) clearTimeout(debounceRef.current);\r\n debounceRef.current = setTimeout(() => {\r\n setIsProcessingInput(false);\r\n debounceRef.current = null;\r\n }, INPUT_DEBOUNCE_MS);\r\n }, [api]);\r\n\r\n const setMaxSellAmount = useCallback(() => {\r\n setSellAmountForInput(String(balance));\r\n setValidatedSellAmount(balance);\r\n setIsProcessingInput(false);\r\n if (allFieldsReady) fetchQuote();\r\n }, [balance, allFieldsReady, fetchQuote]);\r\n\r\n const setSellAmountByPercent = useCallback(\r\n (percent: number) => {\r\n const amount = (balance * percent) / 100;\r\n const limited = limitDecimals(String(amount), 6);\r\n setSellAmountForInput(limited);\r\n setValidatedSellAmount(amount);\r\n setIsProcessingInput(false);\r\n if (allFieldsReady) fetchQuote();\r\n },\r\n [balance, allFieldsReady, fetchQuote]\r\n );\r\n\r\n const swapTokens = useCallback(() => {\r\n const ts = state.sellToken;\r\n const tb = state.buyToken;\r\n if (!ts || !tb) return;\r\n\r\n const prevSellStr = sellAmountForInput || \"0\";\r\n const prevBuyStr = api.buyAmountForInput || api.buyAmount || \"0\";\r\n\r\n api.cancelRequest();\r\n api.invalidateQuote();\r\n\r\n state.updateNetworkSell(tb.chainId);\r\n state.updateNetworkBuy(ts.chainId);\r\n state.setSellToken(tb);\r\n state.setBuyToken(ts);\r\n\r\n if (prevBuyStr && prevBuyStr !== \"0\" && prevBuyStr !== \"0.0\") {\r\n const limited = limitDecimals(prevBuyStr, 6);\r\n setSellAmountForInput(limited);\r\n setValidatedSellAmount(Number(limited));\r\n } else {\r\n setSellAmountForInput(\"\");\r\n setValidatedSellAmount(0);\r\n }\r\n if (prevSellStr && prevSellStr !== \"0\" && prevSellStr !== \"0.0\") {\r\n api.setBuyAmount(limitDecimals(prevSellStr, 6));\r\n api.setBuyAmountForInput(limitDecimals(prevSellStr, 6));\r\n } else {\r\n api.setBuyAmount(\"\");\r\n api.setBuyAmountForInput(\"\");\r\n }\r\n }, [state, api, sellAmountForInput]);\r\n\r\n const isSameToken = (a?: Token, b?: Token) =>\r\n !!a && !!b && a.contractAddress === b.contractAddress && a.chainId === b.chainId;\r\n\r\n return {\r\n ...state,\r\n ...api,\r\n slippage,\r\n sellAmountForInput,\r\n setSellAmountForInput,\r\n validatedSellAmount,\r\n processSellInput,\r\n setMaxSellAmount,\r\n setSellAmountByPercent,\r\n swapTokens,\r\n balance,\r\n balanceBuy,\r\n allFieldsReady,\r\n isProcessingInput,\r\n isSameToken,\r\n };\r\n}\r\n","import { useEffect, useLayoutEffect, useRef } from \"react\";\r\n\r\nexport type GlitchTextPreset = \"trade\" | \"form\";\r\n\r\nconst PRESETS = {\r\n trade: {\r\n possibleChars:\r\n \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()_+{}:\\\"<>?|\",\r\n glitchChars: \"!@#$%^&*()_+{}:\\\"<>?|\\\\\",\r\n cyberChars: \"01010101110010101010101110101010\",\r\n animationFrames: 35,\r\n animationSpeed: 12,\r\n },\r\n form: {\r\n possibleChars: \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\",\r\n glitchChars: \"ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\",\r\n cyberChars: \"0123456789\",\r\n animationFrames: 80,\r\n animationSpeed: 25,\r\n },\r\n} as const;\r\n\r\nexport interface UseGlitchTextOptions {\r\n /** Ref to the DOM element to animate */\r\n ref: React.RefObject<HTMLElement | null>;\r\n /** Final text to display (triggers animation when it changes) */\r\n text: string;\r\n /** Whether to run the animation (e.g. when buy token selected and sell amount > 0) */\r\n enabled: boolean;\r\n /** Preset: \"trade\" for buy amount style, \"form\" for title style */\r\n preset?: GlitchTextPreset;\r\n /** Called when animation starts (use to hide React children to avoid conflicts) */\r\n onAnimationStart?: () => void;\r\n /** Called when animation ends */\r\n onAnimationEnd?: () => void;\r\n}\r\n\r\n/**\r\n * Custom hook that animates text with a glitch/cyber effect.\r\n * Matches the Angular TradeComponent.animateText and FormPageComponent.animateTitle behavior.\r\n */\r\nexport function useGlitchText({\r\n ref,\r\n text,\r\n enabled,\r\n preset = \"trade\",\r\n onAnimationStart,\r\n onAnimationEnd,\r\n}: UseGlitchTextOptions): void {\r\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\r\n\r\n // Set static content before paint when not animating\r\n useLayoutEffect(() => {\r\n const el = ref.current;\r\n if (el && (!enabled || !text || text === \"0\" || text === \"0.0\")) {\r\n el.textContent = text || \"0.0\";\r\n }\r\n }, [ref, text, enabled]);\r\n\r\n useEffect(() => {\r\n const element = ref.current;\r\n if (!element) return;\r\n\r\n if (!enabled || !text || text === \"0\" || text === \"0.0\") {\r\n element.textContent = text || \"0.0\";\r\n return;\r\n }\r\n\r\n const { possibleChars, glitchChars, cyberChars, animationFrames, animationSpeed } =\r\n PRESETS[preset];\r\n\r\n const finalText = String(text);\r\n\r\n if (timeoutRef.current) {\r\n clearTimeout(timeoutRef.current);\r\n timeoutRef.current = null;\r\n }\r\n\r\n let frame = 0;\r\n const glitchStates = Array(finalText.length).fill(false);\r\n const resolvedChars = Array(finalText.length).fill(false);\r\n\r\n const animate = () => {\r\n if (!ref.current) return;\r\n\r\n if (frame >= animationFrames) {\r\n ref.current.textContent = finalText;\r\n timeoutRef.current = null;\r\n onAnimationEnd?.();\r\n return;\r\n }\r\n\r\n if (frame === 0) onAnimationStart?.();\r\n\r\n let result = \"\";\r\n const progress = frame / animationFrames;\r\n const easedProgress = Math.pow(progress, 0.6);\r\n const resolvedCount = Math.floor(finalText.length * easedProgress);\r\n\r\n for (let i = 0; i < resolvedCount; i++) {\r\n if (!resolvedChars[i]) resolvedChars[i] = true;\r\n }\r\n\r\n if (frame % 2 === 0) {\r\n const glitchProbability = 0.05 + progress * 0.1;\r\n for (let i = 0; i < finalText.length; i++) {\r\n if (Math.random() < glitchProbability) glitchStates[i] = !glitchStates[i];\r\n }\r\n }\r\n\r\n for (let i = 0; i < finalText.length; i++) {\r\n if (resolvedChars[i]) {\r\n if (\r\n glitchStates[i] &&\r\n frame < animationFrames * 0.95 &&\r\n finalText[i] !== \" \"\r\n ) {\r\n if (Math.random() < 0.3) {\r\n result += cyberChars[Math.floor(Math.random() * cyberChars.length)];\r\n } else {\r\n result += glitchChars[Math.floor(Math.random() * glitchChars.length)];\r\n }\r\n } else {\r\n result += finalText[i];\r\n }\r\n } else {\r\n if (finalText[i] === \" \") {\r\n result += \" \";\r\n } else {\r\n const rand = Math.random();\r\n if (rand < 0.2) {\r\n result += glitchChars[Math.floor(Math.random() * glitchChars.length)];\r\n } else if (rand < 0.4) {\r\n result += cyberChars[Math.floor(Math.random() * cyberChars.length)];\r\n } else {\r\n result += possibleChars[Math.floor(Math.random() * possibleChars.length)];\r\n }\r\n }\r\n }\r\n }\r\n\r\n ref.current.textContent = result;\r\n frame++;\r\n\r\n let currentSpeed = animationSpeed;\r\n if (progress < 0.3) currentSpeed = animationSpeed * 0.8;\r\n else if (progress > 0.7) currentSpeed = animationSpeed * 0.7;\r\n else currentSpeed = animationSpeed * 1.2;\r\n\r\n timeoutRef.current = setTimeout(animate, currentSpeed);\r\n };\r\n\r\n // Defer to next tick so we run after React has committed; avoids React overwriting our content\r\n const startId = setTimeout(() => {\r\n if (ref.current) animate();\r\n }, 0);\r\n\r\n return () => {\r\n clearTimeout(startId);\r\n if (timeoutRef.current) {\r\n clearTimeout(timeoutRef.current);\r\n timeoutRef.current = null;\r\n }\r\n onAnimationEnd?.();\r\n };\r\n }, [ref, text, enabled, preset]);\r\n}\r\n","/**\r\n * Resolves relative image URLs (e.g. /img/tokens/weth.png) to absolute URLs\r\n * using the provided base URL.\r\n */\r\nexport function resolveImageUrl(\r\n url: string | undefined,\r\n baseUrl: string\r\n): string {\r\n if (!url) return \"\";\r\n if (url.startsWith(\"http://\") || url.startsWith(\"https://\") || url.startsWith(\"data:\")) {\r\n return url;\r\n }\r\n const base = baseUrl?.replace(/\\/$/, \"\") ?? \"\";\r\n return url.startsWith(\"/\") ? `${base}${url}` : `${base}/${url}`;\r\n}\r\n","export default \"data:image/svg+xml,%3csvg%20width='27'%20height='27'%20viewBox='0%200%2027%2027'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M7.42142%203.29834C6.61961%203.29834%205.85064%203.61686%205.28367%204.18383C4.71671%204.75079%204.39819%205.51976%204.39819%206.32158V22.5371H4.12335C3.90467%2022.5371%203.69495%2022.624%203.54032%2022.7786C3.3857%2022.9332%203.29883%2023.143%203.29883%2023.3616C3.29883%2023.5803%203.3857%2023.79%203.54032%2023.9447C3.69495%2024.0993%203.90467%2024.1862%204.12335%2024.1862H18.9647C19.1834%2024.1862%2019.3931%2024.0993%2019.5477%2023.9447C19.7023%2023.79%2019.7892%2023.5803%2019.7892%2023.3616C19.7892%2023.143%2019.7023%2022.9332%2019.5477%2022.7786C19.3931%2022.624%2019.1834%2022.5371%2018.9647%2022.5371H18.6899V20.555C19.1499%2020.7915%2019.6631%2020.9058%2020.1801%2020.8868C20.697%2020.8679%2021.2005%2020.7163%2021.642%2020.4468C22.0835%2020.1772%2022.4484%2019.7987%2022.7015%2019.3475C22.9546%2018.8963%2023.0874%2018.3877%2023.0873%2017.8703V11.4523C23.0873%2010.7981%2022.8751%2010.1617%2022.4826%209.63834L21.2733%208.02558C21.1421%207.85064%2020.9468%207.73499%2020.7303%207.70406C20.5139%207.67314%2020.294%207.72947%2020.119%207.86068C19.9441%207.99189%2019.8284%208.18721%2019.7975%208.40369C19.7666%208.62017%2019.8229%208.84007%2019.9541%209.01501L21.1634%2010.6278C21.3415%2010.8652%2021.4383%2011.1555%2021.4383%2011.4523V17.8703C21.4383%2018.0501%2021.4028%2018.2281%2021.3341%2018.3941C21.2653%2018.5602%2021.1645%2018.7111%2021.0374%2018.8382C20.9103%2018.9653%2020.7594%2019.0661%2020.5933%2019.1349C20.4273%2019.2036%2020.2493%2019.239%2020.0695%2019.239C19.8898%2019.239%2019.7118%2019.2036%2019.5458%2019.1349C19.3797%2019.0661%2019.2288%2018.9653%2019.1017%2018.8382C18.9746%2018.7111%2018.8738%2018.5602%2018.805%2018.3941C18.7363%2018.2281%2018.7008%2018.0501%2018.7008%2017.8703V15.941C18.6999%2015.8964%2018.6962%2015.852%2018.6899%2015.8079V6.32158C18.6899%205.92456%2018.6117%205.53143%2018.4597%205.16463C18.3078%204.79784%2018.0851%204.46456%2017.8044%204.18383C17.5236%203.90309%2017.1904%203.6804%2016.8236%203.52847C16.4568%203.37654%2016.0636%203.29834%2015.6666%203.29834H7.42142ZM7.69626%207.42094C7.69626%207.20226%207.78313%206.99254%207.93776%206.83791C8.09239%206.68329%208.30211%206.59642%208.52078%206.59642H14.5673C14.7859%206.59642%2014.9957%206.68329%2015.1503%206.83791C15.3049%206.99254%2015.3918%207.20226%2015.3918%207.42094V11.2687C15.3918%2011.4874%2015.3049%2011.6971%2015.1503%2011.8517C14.9957%2012.0063%2014.7859%2012.0932%2014.5673%2012.0932H8.52078C8.30211%2012.0932%208.09239%2012.0063%207.93776%2011.8517C7.78313%2011.6971%207.69626%2011.4874%207.69626%2011.2687V7.42094Z'%20fill='white'/%3e%3c/svg%3e\"","import { useRef } from \"react\";\r\nimport type { Token } from \"../types\";\r\nimport type { ButtonState } from \"../hooks/useTradeApi\";\r\nimport { useGlitchText } from \"../hooks/useGlitchText\";\r\nimport { resolveImageUrl } from \"../utils/resolveImageUrl\";\r\nimport gasPumpIcon from \"../assets/trade/gas-pump.svg\";\r\n\r\ninterface TradeWindowProps {\r\n sellToken: Token | undefined;\r\n buyToken: Token | undefined;\r\n networkSellLogo?: string;\r\n networkBuyLogo?: string;\r\n assetBaseUrl: string;\r\n sellAmountForInput: string;\r\n buyAmountForInput: string;\r\n onSellAmountChange: (value: string) => void;\r\n onSellInputProcess: (value: string) => void;\r\n onOpenSellToken: () => void;\r\n onOpenBuyToken: () => void;\r\n onSwapTokens: () => void;\r\n onRefresh: () => void;\r\n onOpenSettings: () => void;\r\n balance: number;\r\n balanceBuy: number;\r\n sellPriceUsd: string;\r\n buyPriceUsd: string;\r\n onMaxClick: () => void;\r\n onSet50Percent: () => void;\r\n onSet25Percent: () => void;\r\n buttonState: ButtonState;\r\n txData: object | null | undefined;\r\n loading: boolean;\r\n price: number;\r\n gasCostUSD: string | null;\r\n truncateTo6Decimals: (n: number) => number;\r\n isWalletConnected?: boolean;\r\n onConnectWallet?: () => void;\r\n}\r\n\r\nconst BUTTON_LABELS: Record<ButtonState, string> = {\r\n swap: \"Swap\",\r\n finding: \"Finding Routes...\",\r\n approve: \"Approve\",\r\n wallet: \"Continue in your wallet...\",\r\n insufficient: \"Insufficient balance\",\r\n \"no-available-quotes\": \"No routes available\",\r\n \"wrong-address\": \"Wrong address\",\r\n \"rate-limit\": \"Try later\",\r\n};\r\n\r\nexport function TradeWindow(props: TradeWindowProps) {\r\n const {\r\n sellToken,\r\n buyToken,\r\n networkSellLogo,\r\n networkBuyLogo,\r\n assetBaseUrl,\r\n sellAmountForInput,\r\n buyAmountForInput,\r\n onSellAmountChange,\r\n onSellInputProcess,\r\n onOpenSellToken,\r\n onOpenBuyToken,\r\n onSwapTokens,\r\n onRefresh,\r\n onOpenSettings,\r\n balance,\r\n balanceBuy,\r\n sellPriceUsd,\r\n buyPriceUsd,\r\n onMaxClick,\r\n onSet50Percent,\r\n onSet25Percent,\r\n buttonState,\r\n txData,\r\n loading,\r\n price,\r\n gasCostUSD,\r\n truncateTo6Decimals,\r\n isWalletConnected = false,\r\n onConnectWallet,\r\n } = props;\r\n\r\n const isSwapActive = !!sellAmountForInput && Number(sellAmountForInput) > 0;\r\n const isErrorState =\r\n buttonState === \"insufficient\" ||\r\n buttonState === \"no-available-quotes\" ||\r\n buttonState === \"wrong-address\";\r\n const isDisabled =\r\n !isSwapActive ||\r\n loading ||\r\n (isWalletConnected && !txData && buttonState !== \"finding\") ||\r\n buttonState === \"no-available-quotes\" ||\r\n buttonState === \"insufficient\";\r\n\r\n const buyAmountRef = useRef<HTMLParagraphElement>(null);\r\n const refreshIconRef = useRef<HTMLSpanElement>(null);\r\n const refreshRotationRef = useRef(0);\r\n\r\n const handleRefresh = () => {\r\n onRefresh();\r\n refreshRotationRef.current += 1;\r\n const el = refreshIconRef.current;\r\n if (el)\r\n el.style.transform = `rotate(${refreshRotationRef.current * -720}deg)`;\r\n };\r\n\r\n useGlitchText({\r\n ref: buyAmountRef,\r\n text: buyAmountForInput || \"0.0\",\r\n enabled:\r\n !!buyToken?.symbol &&\r\n Number(sellAmountForInput) > 0 &&\r\n !!buyAmountForInput &&\r\n buyAmountForInput !== \"0\" &&\r\n buyAmountForInput !== \"0.0\",\r\n preset: \"trade\",\r\n });\r\n\r\n const handleKeyDown = (e: React.KeyboardEvent) => {\r\n const replaceKeys = [\",\", \".\", \"/\", \"б\", \"ю\"];\r\n if (replaceKeys.includes(e.key)) {\r\n e.preventDefault();\r\n const input = e.target as HTMLInputElement;\r\n if (input.value.includes(\".\")) return;\r\n const pos = input.selectionStart ?? input.value.length;\r\n const newValue = input.value.slice(0, pos) + \".\" + input.value.slice(pos);\r\n onSellAmountChange(newValue);\r\n onSellInputProcess(newValue);\r\n }\r\n };\r\n\r\n const actionButtonClassName = isWalletConnected\r\n ? `dw-w-full dw-h-[38px] dw-rounded-[var(--dw-radius)] dw-border dw-text-[13px] dw-font-normal dw-transition-colors ${\r\n isErrorState\r\n ? \"dw-bg-[var(--dw-danger)] dw-border-[var(--dw-danger)] dw-text-white\"\r\n : isDisabled\r\n ? \"dw-bg-[var(--dw-surface-hover)] dw-border-[var(--dw-border)] dw-text-[var(--dw-muted)]\"\r\n : \"dw-bg-[var(--dw-accent)] dw-border-[var(--dw-accent)] dw-text-white hover:dw-bg-[var(--dw-accent-hover)] hover:dw-border-[var(--dw-accent-hover)]\"\r\n }`\r\n : \"dw-w-full dw-h-[38px] dw-rounded-[var(--dw-radius)] dw-border dw-border-[var(--dw-accent)] dw-text-[13px] dw-font-normal dw-transition-colors dw-bg-[var(--dw-accent)] dw-text-white hover:dw-bg-[var(--dw-accent-hover)] hover:dw-border-[var(--dw-accent-hover)]\";\r\n\r\n return (\r\n <div className=\"dw-widget-shell dw-elevated-surface dw-flex dw-flex-col dw-gap-1.5 dw-font-mono\">\r\n <div className=\"dw-flex dw-items-center dw-justify-between dw-mb-0.5\">\r\n <h3 className=\"dw-text-[14px] dw-font-normal dw-text-[var(--dw-fg)]\">\r\n Trade\r\n </h3>\r\n <div className=\"dw-flex dw-items-center dw-gap-1\">\r\n <button\r\n type=\"button\"\r\n className=\"dw-icon-button dw-w-4 dw-h-4 dw-flex dw-items-center dw-justify-center dw-rounded-[4px] dw-cursor-pointer dw-opacity-70\"\r\n onMouseDown={handleRefresh}\r\n aria-label=\"Refresh\"\r\n >\r\n <span\r\n ref={refreshIconRef}\r\n className=\"dw-w-full dw-h-full dw-flex dw-items-center dw-justify-center\"\r\n style={{ transition: \"transform 1s ease-in-out\" }}\r\n >\r\n <RefreshIcon />\r\n </span>\r\n </button>\r\n <button\r\n type=\"button\"\r\n className=\"dw-icon-button dw-w-4 dw-h-4 dw-flex dw-items-center dw-justify-center dw-rounded-[4px] dw-cursor-pointer dw-opacity-70\"\r\n onClick={onOpenSettings}\r\n aria-label=\"Settings\"\r\n >\r\n <SettingsIcon />\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div className=\"dw-relative dw-flex dw-flex-col dw-gap-1.5\">\r\n <button\r\n type=\"button\"\r\n className=\"dw-widget-section dw-group dw-w-[30px] dw-h-[30px] dw-absolute dw-left-1/2 dw-top-1/2 dw-z-10 dw--translate-x-1/2 dw--translate-y-1/2 dw-cursor-pointer dw-flex dw-justify-center dw-items-center\"\r\n onClick={onSwapTokens}\r\n aria-label=\"Swap tokens\"\r\n >\r\n <SwapArrowsBlock />\r\n </button>\r\n\r\n <AssetSection\r\n label=\"From\"\r\n labelTone=\"danger\"\r\n token={sellToken}\r\n networkLogo={networkSellLogo}\r\n assetBaseUrl={assetBaseUrl}\r\n amount={sellAmountForInput}\r\n amountPlaceholder=\"0.0\"\r\n usdValue={sellPriceUsd || \"$0.000\"}\r\n balance={truncateTo6Decimals(balance)}\r\n onOpenToken={onOpenSellToken}\r\n onInputChange={(value) => {\r\n onSellAmountChange(value);\r\n onSellInputProcess(value);\r\n }}\r\n onKeyDown={handleKeyDown}\r\n amountToneClassName={\r\n isErrorState\r\n ? \"dw-text-[var(--dw-danger)]\"\r\n : \"dw-text-[var(--dw-fg)]\"\r\n }\r\n quickActions={\r\n <>\r\n <ActionLink label=\"MAX\" onClick={onMaxClick} />\r\n <ActionLink label=\"50%\" onClick={onSet50Percent} />\r\n <ActionLink label=\"25%\" onClick={onSet25Percent} />\r\n </>\r\n }\r\n />\r\n\r\n <AssetSection\r\n label=\"To\"\r\n labelTone=\"success\"\r\n token={buyToken}\r\n networkLogo={networkBuyLogo}\r\n assetBaseUrl={assetBaseUrl}\r\n amount={buyAmountForInput || \"0.0\"}\r\n usdValue={buyPriceUsd || \"$0.000\"}\r\n balance={truncateTo6Decimals(balanceBuy)}\r\n onOpenToken={onOpenBuyToken}\r\n amountRef={buyAmountRef}\r\n readOnly\r\n />\r\n\r\n <button\r\n type=\"button\"\r\n className={actionButtonClassName}\r\n disabled={isWalletConnected ? isDisabled : false}\r\n onClick={isWalletConnected ? () => {} : onConnectWallet}\r\n >\r\n {isWalletConnected ? BUTTON_LABELS[buttonState] : \"Connect Wallet\"}\r\n </button>\r\n\r\n <div className=\"dw-flex dw-items-center dw-justify-between dw-min-h-[12px] dw-px-0.5\">\r\n <div className=\"dw-flex dw-items-center dw-gap-1 dw-min-w-0\">\r\n <img src={gasPumpIcon} alt=\"\" className=\"dw-w-[10px] dw-h-[10px]\" />\r\n <p className=\"dw-font-normal dw-text-[10px] dw-text-[var(--dw-fg)]\">\r\n {txData ? (gasCostUSD ?? \"—\") : \"$<0.01\"}\r\n </p>\r\n </div>\r\n <p className=\"dw-font-normal dw-text-[10px] dw-text-[var(--dw-text-subtle)] dw-truncate dw-ml-3\">\r\n {txData && sellToken?.symbol && buyToken?.symbol\r\n ? `1 ${sellToken.symbol} = ${price} ${buyToken.symbol}`\r\n : \"\"}\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nfunction AssetSection(props: {\r\n label: string;\r\n labelTone: \"danger\" | \"success\";\r\n token: Token | undefined;\r\n networkLogo?: string;\r\n assetBaseUrl: string;\r\n amount: string;\r\n amountPlaceholder?: string;\r\n usdValue: string;\r\n balance: number;\r\n onOpenToken: () => void;\r\n onInputChange?: (value: string) => void;\r\n onKeyDown?: (e: React.KeyboardEvent) => void;\r\n amountToneClassName?: string;\r\n amountRef?: React.RefObject<HTMLParagraphElement>;\r\n readOnly?: boolean;\r\n quickActions?: React.ReactNode;\r\n}) {\r\n const {\r\n label,\r\n labelTone,\r\n token,\r\n networkLogo,\r\n assetBaseUrl,\r\n amount,\r\n amountPlaceholder = \"0.0\",\r\n usdValue,\r\n balance,\r\n onOpenToken,\r\n onInputChange,\r\n onKeyDown,\r\n amountToneClassName = \"dw-text-[var(--dw-fg)]\",\r\n amountRef,\r\n readOnly = false,\r\n quickActions,\r\n } = props;\r\n\r\n return (\r\n <div className=\"dw-widget-section dw-relative dw-flex dw-flex-col dw-w-full dw-min-h-[91px] dw-px-4 dw-py-3\">\r\n <div className=\"dw-flex dw-items-start dw-justify-between\">\r\n <div className=\"dw-flex dw-flex-col dw-gap-2\">\r\n <h6\r\n className={`dw-font-normal dw-text-[11px] ${\r\n labelTone === \"danger\"\r\n ? \"dw-text-[var(--dw-danger)]\"\r\n : \"dw-text-[var(--dw-success)]\"\r\n }`}\r\n >\r\n {label}\r\n </h6>\r\n <button\r\n type=\"button\"\r\n className=\"dw-flex dw-items-center dw-gap-2 dw-cursor-pointer\"\r\n onClick={onOpenToken}\r\n >\r\n <TokenIcon\r\n token={token}\r\n networkLogo={networkLogo}\r\n assetBaseUrl={assetBaseUrl}\r\n sizeClassName=\"dw-w-[28px] dw-h-[28px]\"\r\n badgeClassName=\"dw-w-[10px] dw-h-[10px]\"\r\n />\r\n <p className=\"dw-font-normal dw-text-[13px] dw-text-[var(--dw-fg)]\">\r\n {token?.symbol ?? \"Select\"}\r\n </p>\r\n <span className=\"dw-text-[10px] dw-text-[var(--dw-text-subtle)]\">\r\n ▼\r\n </span>\r\n </button>\r\n </div>\r\n <div className=\"dw-flex dw-flex-col dw-items-end dw-min-w-0\">\r\n {readOnly ? (\r\n <p\r\n ref={amountRef}\r\n className={`dw-font-normal dw-text-[20px] dw-min-w-[70px] dw-max-w-[124px] dw-text-right dw-truncate ${amountToneClassName}`}\r\n >\r\n {amount || amountPlaceholder}\r\n </p>\r\n ) : (\r\n <input\r\n type=\"text\"\r\n placeholder={amountPlaceholder}\r\n value={amount}\r\n onChange={(e) => onInputChange?.(e.target.value)}\r\n onKeyDown={onKeyDown}\r\n className={`dw-h-[28px] dw-w-[124px] dw-font-normal dw-text-right dw-bg-transparent dw-outline-none dw-border-none dw-text-[20px] ${amountToneClassName}`}\r\n />\r\n )}\r\n <p className=\"dw-mt-1 dw-text-[10px] dw-text-[var(--dw-text-subtle)]\">\r\n {usdValue}\r\n </p>\r\n </div>\r\n </div>\r\n <div className=\"dw-w-full dw-flex dw-items-center dw-justify-between dw-mt-2 dw-min-h-[12px]\">\r\n <div className=\"dw-flex dw-gap-2 dw-items-center dw-min-w-0\">\r\n <p className=\"dw-font-normal dw-text-[10px] dw-text-[var(--dw-text-subtle)]\">\r\n {balance}\r\n </p>\r\n {quickActions}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nfunction ActionLink(props: { label: string; onClick: () => void }) {\r\n return (\r\n <button\r\n type=\"button\"\r\n className=\"dw-font-normal dw-text-[10px] dw-text-[var(--dw-fg)] dw-cursor-pointer hover:dw-text-[var(--dw-text-subtle)]\"\r\n onClick={props.onClick}\r\n >\r\n {props.label}\r\n </button>\r\n );\r\n}\r\n\r\nfunction TokenIcon(props: {\r\n token: Token | undefined;\r\n networkLogo?: string;\r\n assetBaseUrl: string;\r\n sizeClassName?: string;\r\n badgeClassName?: string;\r\n}) {\r\n const {\r\n token,\r\n networkLogo,\r\n assetBaseUrl,\r\n sizeClassName = \"dw-w-[28px] dw-h-[28px]\",\r\n badgeClassName = \"dw-w-[10px] dw-h-[10px]\",\r\n } = props;\r\n\r\n if (!token) {\r\n return (\r\n <div\r\n className={`${sizeClassName} dw-rounded-full dw-bg-[var(--dw-surface-hover)] dw-flex dw-items-center dw-justify-center dw-border dw-border-[var(--dw-border)]`}\r\n >\r\n <span className=\"dw-text-[10px] dw-font-normal dw-text-[var(--dw-fg)]\">\r\n ?\r\n </span>\r\n </div>\r\n );\r\n }\r\n\r\n const tokenImg = resolveImageUrl(token.imageUrl, assetBaseUrl);\r\n const netImg = resolveImageUrl(networkLogo, assetBaseUrl);\r\n\r\n return (\r\n <div className=\"dw-relative\">\r\n <div\r\n className={`${sizeClassName} dw-rounded-full dw-bg-cover dw-flex dw-items-center dw-justify-center dw-border dw-border-[var(--dw-border)] dw-bg-[var(--dw-surface-hover)]`}\r\n style={{ backgroundImage: tokenImg ? `url(${tokenImg})` : \"none\" }}\r\n >\r\n {!tokenImg && (\r\n <span className=\"dw-text-[10px] dw-font-normal dw-text-[var(--dw-fg)]\">\r\n {token.symbol[0]?.toUpperCase() ?? \"?\"}\r\n </span>\r\n )}\r\n </div>\r\n {netImg && (\r\n <div\r\n className={`dw-absolute dw--bottom-0.5 dw--left-0.5 ${badgeClassName} dw-rounded-full dw-bg-cover dw-border dw-border-[var(--dw-surface)]`}\r\n style={{ backgroundImage: `url(${netImg})` }}\r\n />\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nfunction SwapArrowsBlock() {\r\n return (\r\n <div className=\"dw-flex dw-flex-row dw-justify-center dw-items-center dw-w-[14px] dw-h-[14px] dw-gap-0\">\r\n <svg\r\n className=\"dw-w-[7px] dw-h-[10px] dw-flex-shrink-0 dw-transition-[transform] dw-duration-200 group-hover:dw-translate-y-[-1px] dw-text-[var(--dw-fg)]\"\r\n width=\"16\"\r\n height=\"24\"\r\n viewBox=\"0 0 16 24\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <g clipPath=\"url(#clip0_6875_213)\">\r\n <path\r\n d=\"M7.74569 1.94531V22.1232M7.74569 1.94531L13.9543 8.15389M7.74569 1.94531L1.53711 8.15389\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2.1\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_6875_213\">\r\n <rect width=\"15.6814\" height=\"23.5221\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n\r\n <svg\r\n className=\"dw-w-[7px] dw-h-[10px] dw-flex-shrink-0 dw-transition-[transform] dw-duration-200 group-hover:dw-translate-y-[1px] dw-text-[var(--dw-fg)]\"\r\n width=\"16\"\r\n height=\"24\"\r\n viewBox=\"0 0 16 24\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <g clipPath=\"url(#clip0_6875_215)\">\r\n <path\r\n d=\"M7.74569 21.5769V1.39901M7.74569 21.5769L13.9543 15.3683M7.74569 21.5769L1.53711 15.3683\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2.1\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_6875_215\">\r\n <rect\r\n width=\"15.6814\"\r\n height=\"23.5221\"\r\n fill=\"white\"\r\n transform=\"matrix(1 0 0 -1 0 23.5222)\"\r\n />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </div>\r\n );\r\n}\r\n\r\nfunction RefreshIcon() {\r\n return (\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <path\r\n d=\"M20 12a8 8 0 1 1-2.34-5.66M20 4v5h-5\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"1.8\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction SettingsIcon() {\r\n return (\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <path\r\n d=\"M10 6h10M4 6h2M14 18h6M4 18h6M7 6a1 1 0 1 1-2 0 1 1 0 0 1 2 0Zm8 12a1 1 0 1 1-2 0 1 1 0 0 1 2 0Zm5-6H10M4 12h2m6 0a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"1.6\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n />\r\n </svg>\r\n );\r\n}\r\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAHaSURBVHgB7Zj/dYIwEMcPX/+vGzRuYDewG3QD7QS1G3SDugF0go4AG+gG4ASywfUi4XnEBAkJ4h983ruXQMjlm19ADuDBicARRJxTMgdHoigqIDRSDNmWLCbL0Z+YTEAIyNE72QmHYd1VR2QR90nJzlKnVOaK0K7faNozcEVOgdbbnOybbInV+uuF8pszv/su9SKDo5iSjbosyF6pp6WtUXBDkP3BZZO5j6LWy5VWJkfhB8NsmHp24s4dVdNYc9LK1jjcppEYN86Tds3X2IGPHCWJoX4B/TC9SxNq59g65fTAhvUoZvdTbE7LCj02jPI5V35y5ju9VWnLHt4xRxwBAcHrt0aj4zPteV5Y79wlu5eF/mQpfxm7teLlM7iNYPkChuHI8q0jaEJYHIWktLTXSeA9sH46H0WglUmgL5NAXyaBvkwCfZkE+qIL5N9Erx/SUOgCDyy/Dv1z2oeGQHUeqEXKEZS/4C8wIqY1+MXyAi5nZMndp/1KoBrFD8vzzzAMguULXmDcxSQyoWRB9tviKCR8GRXgwtinuq5O0rHOxZ0irFjFaEyH6r6hOFuUdtH7WIvNqENoZMxnA75gtV5kDGWPYcixij0KW5vOQXRNcK+A+rnhIYLqY/APHpl3hlZpXEMAAAAASUVORK5CYII=\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAkCAYAAADhAJiYAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAERSURBVHgB7dShDoMwEAbgK0EgJiYmEAgEAjGx93+KCR4AMTkxMYEgYXdJSbqOo4WVgrg/uRRo034pTQEkEolk3yiInGEYMmyuWNS2SqmH2Z9AxGjMDeuElWKV9phoIAOTGZ972APEYDqsuz128zM0h8Hz00FMEGLorIwH2InZFKQxtDOpL2Yz0FoMJeEm1P8+KoaiJiassCn0K11cLUTCUKZ2qDCeS1ykhEgYDvSy3p2oUBgO1GC9wRMVEkNRzCI0Od0fZ6vr60zhuBybKhSGBRkL1tjkMIHSmNrqo51t1mKcoBnUE+sCvxjamR7+iNfFyKCCY7xBDlQwzCIQgwqKWQzSqPEmp/uqCYmRSCSSI+QD+pyUWCGG+FwAAAAASUVORK5CYII=\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAwCAYAAAAhOEsMAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAABZSURBVHgB7c7RCQAgCEVRa5JGbONGKT8KgtQsCPp4FwQRDkh0WRhL5eigSC/jZxJPqVOnqLiggNIWSqjfdaghE1pIhTskQg9aoBdJMHvQAidsIoQQQgj9VgNcp//kKP+JUgAAAABJRU5ErkJggg==\"","import { useState, useMemo, useCallback } from \"react\";\r\nimport { ethers } from \"ethers\";\r\nimport type { Network, Token } from \"../types\";\r\nimport { resolveImageUrl } from \"../utils/resolveImageUrl\";\r\nimport copyHoverIcon from \"../assets/trade/copy-hover.png\";\r\nimport copyCheckIcon from \"../assets/trade/copy-check.png\";\r\nimport linkIcon from \"../assets/trade/link.png\";\r\n\r\ninterface SelectTokenWindowProps {\r\n mode: \"sell\" | \"buy\";\r\n networks: Network[];\r\n selectedNetworkId: number | undefined;\r\n selectedToken: Token | undefined;\r\n excludeToken: Token | undefined;\r\n getAllTokensForNetwork: (id: number) => Token[];\r\n getNetworkById: (id: number) => Network | undefined;\r\n onSelectToken: (t: Token) => void;\r\n onSelectNetwork: (n: Network) => void;\r\n onOpenNetworkSelector?: () => void;\r\n onClose: () => void;\r\n assetBaseUrl: string;\r\n /** Networks to display in the first row (first 6 or 5+selected). */\r\n displayedNetworks: Network[];\r\n /** Count of networks not in displayedNetworks. */\r\n additionalNetworksCount: number;\r\n}\r\n\r\nexport function SelectTokenWindow(props: SelectTokenWindowProps) {\r\n const {\r\n mode,\r\n selectedNetworkId,\r\n selectedToken,\r\n excludeToken,\r\n getAllTokensForNetwork,\r\n getNetworkById,\r\n onSelectToken,\r\n onSelectNetwork,\r\n onOpenNetworkSelector,\r\n onClose,\r\n assetBaseUrl,\r\n displayedNetworks,\r\n additionalNetworksCount,\r\n } = props;\r\n\r\n const [search, setSearch] = useState(\"\");\r\n const [copiedAddresses, setCopiedAddresses] = useState<Set<string>>(\r\n new Set(),\r\n );\r\n\r\n const isNativeToken = useCallback(\r\n (token: Token) => {\r\n const network = getNetworkById(token.chainId);\r\n if (!network) return false;\r\n if (network.chainType === \"SVM\") return token.symbol === \"SOL\";\r\n if (network.chainType === \"MVM\") return token.symbol === \"SUI\";\r\n return token.contractAddress === ethers.ZeroAddress;\r\n },\r\n [getNetworkById],\r\n );\r\n\r\n const copyToClipboard = useCallback(\r\n (address: string, e: React.MouseEvent) => {\r\n e.stopPropagation();\r\n navigator.clipboard\r\n .writeText(address)\r\n .then(() => {\r\n setCopiedAddresses((prev) => new Set(prev).add(address));\r\n setTimeout(() => {\r\n setCopiedAddresses((prev) => {\r\n const next = new Set(prev);\r\n next.delete(address);\r\n return next;\r\n });\r\n }, 2000);\r\n })\r\n .catch(() => console.error(\"Failed to copy to clipboard\"));\r\n },\r\n [],\r\n );\r\n\r\n const tokens = useMemo(() => {\r\n const networkId = selectedNetworkId ?? displayedNetworks[0]?.id;\r\n if (!networkId) return [];\r\n const all = getAllTokensForNetwork(networkId);\r\n if (!search.trim()) {\r\n return all.filter(\r\n (t) =>\r\n !excludeToken ||\r\n !(\r\n t.contractAddress === excludeToken.contractAddress &&\r\n t.chainId === excludeToken.chainId\r\n ),\r\n );\r\n }\r\n const s = search.toLowerCase();\r\n return all.filter(\r\n (t) =>\r\n (t.symbol?.toLowerCase().includes(s) ||\r\n t.contractAddress?.toLowerCase().includes(s)) &&\r\n (!excludeToken ||\r\n !(\r\n t.contractAddress === excludeToken.contractAddress &&\r\n t.chainId === excludeToken.chainId\r\n )),\r\n );\r\n }, [\r\n selectedNetworkId,\r\n getAllTokensForNetwork,\r\n search,\r\n excludeToken,\r\n displayedNetworks,\r\n ]);\r\n\r\n const displayed = tokens;\r\n\r\n return (\r\n <div className=\"dw-popup-backdrop dw-absolute dw-top-0 dw-left-1/2 dw--translate-x-1/2 dw-max-h-[420px] dw-h-full dw-z-50 dw-flex dw-items-start dw-justify-center\">\r\n <div\r\n className=\"dw-modal-surface dw-popup-content dw-w-[304px] dw-h-full dw-flex dw-flex-col dw-rounded-[var(--dw-radius)] dw-p-3 dw-overflow-hidden\"\r\n onClick={(e) => e.stopPropagation()}\r\n >\r\n <div className=\"dw-flex dw-items-center dw-justify-between\">\r\n <h3 className=\"dw-text-[14px] dw-font-normal dw-text-[var(--dw-fg)]\">\r\n {mode === \"sell\" ? \"Exchange from\" : \"Exchange to\"}\r\n </h3>\r\n <button\r\n type=\"button\"\r\n className=\"dw-icon-button dw-w-4 dw-h-4 dw-rounded-[4px] dw-opacity-70 dw-cursor-pointer\"\r\n onClick={onClose}\r\n aria-label=\"Close\"\r\n >\r\n <CloseIcon />\r\n </button>\r\n </div>\r\n\r\n <div className=\"dw-flex dw-gap-1 dw-mt-3 dw-flex-wrap\">\r\n {displayedNetworks.map((n) => (\r\n <button\r\n key={n.id}\r\n type=\"button\"\r\n className={`dw-w-[34px] dw-h-[34px] dw-flex dw-items-center dw-justify-center dw-border dw-rounded-[6px] dw-transition ${\r\n selectedNetworkId === n.id\r\n ? \"dw-bg-[var(--dw-surface-hover)] dw-border-[var(--dw-accent)]\"\r\n : \"dw-bg-[var(--dw-surface-alt)] dw-border-[var(--dw-border)] hover:dw-bg-[var(--dw-surface-hover)]\"\r\n }`}\r\n onClick={() => onSelectNetwork(n)}\r\n title={n.name}\r\n >\r\n {n.logoURI && (\r\n <img\r\n src={resolveImageUrl(n.logoURI, assetBaseUrl)}\r\n alt=\"\"\r\n className=\"dw-w-5 dw-h-5 dw-object-cover\"\r\n />\r\n )}\r\n </button>\r\n ))}\r\n {additionalNetworksCount > 0 && (\r\n <button\r\n type=\"button\"\r\n className=\"dw-min-w-[34px] dw-h-[34px] dw-px-2 dw-flex dw-items-center dw-justify-center dw-rounded-[6px] dw-border dw-border-[var(--dw-border)] dw-bg-[var(--dw-surface-alt)] hover:dw-bg-[var(--dw-surface-hover)] dw-transition dw-cursor-pointer\"\r\n onClick={onOpenNetworkSelector}\r\n title=\"More networks\"\r\n >\r\n <p className=\"dw-font-normal dw-text-[11px] dw-text-[var(--dw-fg)]\">\r\n {additionalNetworksCount}+\r\n </p>\r\n </button>\r\n )}\r\n </div>\r\n\r\n <div className=\"dw-field-shell dw-flex dw-items-center dw-gap-2 dw-h-[34px] dw-mt-3 dw-rounded-[6px] dw-px-3\">\r\n <input\r\n type=\"text\"\r\n placeholder=\"Search by name or contract address\"\r\n value={search}\r\n onChange={(e) => setSearch(e.target.value)}\r\n className=\"dw-flex-1 dw-h-5 dw-font-normal dw-text-[11px] dw-text-[var(--dw-fg)] dw-bg-transparent dw-outline-none dw-border-none\"\r\n />\r\n <SearchIcon />\r\n </div>\r\n\r\n <div className=\"dw-flex dw-items-center dw-justify-between dw-mt-2.5 dw-px-0.5\">\r\n <p className=\"dw-font-normal dw-text-[11px] dw-text-[var(--dw-text-subtle)]\">\r\n Token list\r\n </p>\r\n <p className=\"dw-font-normal dw-text-[11px] dw-text-[var(--dw-text-subtle)]\">\r\n Contracts\r\n </p>\r\n </div>\r\n\r\n <div className=\"dw-widget-list dw-flex-1 dw-overflow-y-auto dw-mt-2 dw-pr-1 dw-flex dw-flex-col dw-gap-1\">\r\n {displayed.map((token) => {\r\n const network = getNetworkById(token.chainId);\r\n const explorerUrl =\r\n network?.explorerUrl ?? \"https://etherscan.io/token/\";\r\n const explorerLink = `${explorerUrl}${token.contractAddress}`;\r\n const shortAddress =\r\n token.contractAddress.length > 10\r\n ? `${token.contractAddress.slice(0, 4)}…${token.contractAddress.slice(-3)}`\r\n : token.contractAddress;\r\n const isCopied = copiedAddresses.has(token.contractAddress);\r\n const showContract = !isNativeToken(token);\r\n\r\n return (\r\n <button\r\n key={`${token.chainId}-${token.contractAddress}`}\r\n type=\"button\"\r\n className={`dw-w-full dw-min-h-[48px] dw-flex dw-items-center dw-justify-between dw-rounded-[6px] dw-px-3 dw-py-2 dw-text-left dw-transition dw-cursor-pointer dw-border ${\r\n selectedToken?.contractAddress === token.contractAddress &&\r\n selectedToken?.chainId === token.chainId\r\n ? \"dw-bg-[var(--dw-surface-hover)] dw-border-[var(--dw-accent)]\"\r\n : \"dw-bg-transparent dw-border-transparent hover:dw-bg-[var(--dw-surface-alt)] hover:dw-border-[var(--dw-border)]\"\r\n }`}\r\n onClick={() => onSelectToken(token)}\r\n >\r\n <div className=\"dw-flex dw-items-center dw-gap-2 dw-min-w-0\">\r\n <div\r\n className=\"dw-w-[28px] dw-h-[28px] dw-rounded-full dw-flex dw-items-center dw-justify-center dw-bg-cover dw-bg-[var(--dw-surface-hover)] dw-border dw-border-[var(--dw-border)] dw-flex-shrink-0\"\r\n style={{\r\n backgroundImage: resolveImageUrl(\r\n token.imageUrl,\r\n assetBaseUrl,\r\n )\r\n ? `url(${resolveImageUrl(token.imageUrl, assetBaseUrl)})`\r\n : \"none\",\r\n }}\r\n >\r\n {!resolveImageUrl(token.imageUrl, assetBaseUrl) && (\r\n <span className=\"dw-font-normal dw-text-[10px] dw-text-[var(--dw-fg)]\">\r\n {token.symbol[0]?.toUpperCase() ?? \"?\"}\r\n </span>\r\n )}\r\n </div>\r\n <div className=\"dw-min-w-0\">\r\n <p className=\"dw-font-normal dw-text-[12px] dw-text-[var(--dw-fg)] dw-truncate\">\r\n {token.symbol}\r\n </p>\r\n {token.name && (\r\n <p className=\"dw-font-normal dw-text-[10px] dw-text-[var(--dw-text-subtle)] dw-truncate\">\r\n {token.name}\r\n </p>\r\n )}\r\n </div>\r\n </div>\r\n <div className=\"dw-flex dw-flex-col dw-items-end dw-gap-1 dw-flex-shrink-0\">\r\n {showContract && (\r\n <div className=\"dw-flex dw-items-center dw-gap-2.5\">\r\n <button\r\n type=\"button\"\r\n className={`dw-w-[12px] dw-h-[12px] dw-flex-shrink-0 dw-bg-cover dw-bg-no-repeat dw-cursor-pointer dw-transition-opacity hover:dw-opacity-100 ${\r\n isCopied ? \"dw-opacity-100\" : \"dw-opacity-50\"\r\n }`}\r\n style={{\r\n backgroundImage: `url(${isCopied ? copyCheckIcon : copyHoverIcon})`,\r\n }}\r\n onClick={(e) =>\r\n copyToClipboard(token.contractAddress, e)\r\n }\r\n aria-label=\"Copy address\"\r\n />\r\n <a\r\n href={explorerLink}\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n className=\"dw-flex dw-items-center dw-gap-1 dw-font-normal dw-text-[10px] dw-text-[var(--dw-text-subtle)] hover:dw-text-[var(--dw-fg)] dw-transition-colors\"\r\n onClick={(e) => e.stopPropagation()}\r\n >\r\n <span>{shortAddress}</span>\r\n <span\r\n className=\"dw-w-[6px] dw-h-[10px] dw-flex-shrink-0 dw-bg-cover dw-bg-no-repeat\"\r\n style={{ backgroundImage: `url(${linkIcon})` }}\r\n />\r\n </a>\r\n </div>\r\n )}\r\n {!showContract && (\r\n <p className=\"dw-font-normal dw-text-[10px] dw-text-[var(--dw-text-subtle)]\">\r\n Native\r\n </p>\r\n )}\r\n </div>\r\n </button>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nfunction CloseIcon() {\r\n return (\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n <path d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction SearchIcon() {\r\n return (\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <path\r\n d=\"M21 21l-4.35-4.35M10.5 18a7.5 7.5 0 1 1 0-15 7.5 7.5 0 0 1 0 15Z\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"1.7\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n />\r\n </svg>\r\n );\r\n}\r\n","import { useState, useMemo } from \"react\";\r\nimport type { Network } from \"../types\";\r\nimport { resolveImageUrl } from \"../utils/resolveImageUrl\";\r\n\r\ninterface SelectNetworkWindowProps {\r\n networks: Network[];\r\n onSelectNetwork: (n: Network) => void;\r\n onClose: () => void;\r\n assetBaseUrl: string;\r\n}\r\n\r\nexport function SelectNetworkWindow(props: SelectNetworkWindowProps) {\r\n const { networks, onSelectNetwork, onClose, assetBaseUrl } = props;\r\n const [search, setSearch] = useState(\"\");\r\n\r\n const filtered = useMemo(() => {\r\n if (!search.trim()) return networks;\r\n const s = search.toLowerCase();\r\n return networks.filter((n) => n.name.toLowerCase().includes(s));\r\n }, [networks, search]);\r\n\r\n return (\r\n <div className=\"dw-popup-backdrop dw-absolute dw-top-0 dw-left-1/2 dw--translate-x-1/2 dw-max-h-[420px] dw-h-full dw-z-[60] dw-flex dw-items-start dw-justify-center\">\r\n <div\r\n className=\"dw-modal-surface dw-popup-content dw-w-[304px] dw-h-full dw-flex dw-flex-col dw-rounded-[var(--dw-radius)] dw-p-3 dw-overflow-hidden\"\r\n onClick={(e) => e.stopPropagation()}\r\n >\r\n <div className=\"dw-flex dw-items-center dw-justify-between\">\r\n <h3 className=\"dw-text-[14px] dw-font-normal dw-text-[var(--dw-fg)]\">\r\n Select ecosystem\r\n </h3>\r\n <button\r\n type=\"button\"\r\n className=\"dw-icon-button dw-w-4 dw-h-4 dw-rounded-[4px] dw-opacity-70 dw-cursor-pointer\"\r\n onClick={onClose}\r\n aria-label=\"Close\"\r\n >\r\n <CloseIcon />\r\n </button>\r\n </div>\r\n\r\n <div className=\"dw-field-shell dw-flex dw-items-center dw-gap-2 dw-h-[34px] dw-mt-3 dw-rounded-[6px] dw-px-3\">\r\n <input\r\n type=\"text\"\r\n placeholder=\"Search by name\"\r\n value={search}\r\n onChange={(e) => setSearch(e.target.value)}\r\n className=\"dw-flex-1 dw-h-5 dw-font-normal dw-text-[11px] dw-text-[var(--dw-fg)] dw-bg-transparent dw-outline-none dw-border-none\"\r\n />\r\n <SearchIcon />\r\n </div>\r\n\r\n <div className=\"dw-widget-list dw-flex-1 dw-overflow-y-auto dw-mt-3 dw-pr-1 dw-grid dw-grid-cols-2 dw-gap-1.5\">\r\n {filtered.map((network) => (\r\n <button\r\n key={network.id}\r\n type=\"button\"\r\n className=\"dw-w-full dw-min-h-[36px] dw-flex dw-items-center dw-gap-2 dw-rounded-[6px] dw-px-2.5 dw-py-2 dw-text-left dw-transition dw-cursor-pointer dw-bg-transparent dw-border dw-border-transparent hover:dw-bg-[var(--dw-surface-alt)] hover:dw-border-[var(--dw-border)]\"\r\n onClick={() => onSelectNetwork(network)}\r\n >\r\n <div\r\n className=\"dw-w-[18px] dw-h-[18px] dw-rounded-[4px] dw-flex-shrink-0 dw-bg-cover dw-bg-center\"\r\n style={{\r\n backgroundImage: network.logoURI\r\n ? `url(${resolveImageUrl(network.logoURI, assetBaseUrl)})`\r\n : \"none\",\r\n }}\r\n />\r\n <h6 className=\"dw-font-normal dw-text-[12px] dw-text-[var(--dw-fg)] dw-truncate\">\r\n {network.name}\r\n </h6>\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nfunction CloseIcon() {\r\n return (\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n <path d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction SearchIcon() {\r\n return (\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <path\r\n d=\"M21 21l-4.35-4.35M10.5 18a7.5 7.5 0 1 1 0-15 7.5 7.5 0 0 1 0 15Z\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"1.7\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n />\r\n </svg>\r\n );\r\n}\r\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACYAAAAmCAYAAACoPemuAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAIFSURBVHgB7Vf/VcMgEL5MYJxAnMBuIBvYDewIbtJukG5QnSB1AusEwQkaJzjvBF5ICg1Jaf/ie+979KUHHNwvDiAj47ooIDEQsaRhQXwhCvNbOCItURl+EvdFURzGFl0QBcxTSBIr4hGnoyGuQguvHcHKbFSOKCOIb8Qa02Bn1y6cTTCwP1+zvX4La56zihu0DsHMESFhMmvfvRKemk1ZEVcYcAv6XqK2CN9248z98gmzWbY4H7XZKOYWh3vL4dzCdxoaJHFJfAJtNh/YNGxmG1l7SIiodOExSUuKtJCRMY7kJcnC+KUEnbcezMh++Qtd4Bxu4qsm7Nc4rSzVeCbn8aKvqJNdxRtAJFAnyxRlqWEd7LpuSWqgXyoUdHlqWP1ZzuY4CenAaeh+qNgR4mpfLPbEb9CHUoP/+EDPcPokUqTYY0/S2LnBy1DjxLKE2i+3OPL0EUbBOl6Xf0ff4AS/jEEwXWD3EmWWhnegw12BDnmukQoyMsK4WkmyML7ai9IYv7xG+yZB5ygebeD4cDD8AB1EbWhBW1okTFcmRVmq0Fcv6ePOEWqskhhIltjlvArn9ZI+1Hb92JKkoN9+lRDfuvFct9YKM9fbS/jat0s6pN6pUd+2gDNAbf7lYN9NSHhuvbS9pIQZQO0WvRssAoL2OcPRJeC061agzfNDfIdbvUQzMhLiDyT6chuOT10RAAAAAElFTkSuQmCC\"","import { useState } from \"react\";\r\nimport slippageIcon from \"../assets/trade/slippage.png\";\r\n\r\ninterface SlippagePanelProps {\r\n options: string[];\r\n selectedIndex: number | null;\r\n customValue: string;\r\n onSelectOption: (index: number) => void;\r\n onCustomChange: (value: string) => void;\r\n onSave: (value: string) => void;\r\n onClose: () => void;\r\n}\r\n\r\nexport function SlippagePanel(props: SlippagePanelProps) {\r\n const {\r\n options,\r\n selectedIndex,\r\n customValue,\r\n onSelectOption,\r\n onCustomChange,\r\n onSave,\r\n onClose,\r\n } = props;\r\n\r\n const [localCustom, setLocalCustom] = useState(customValue);\r\n\r\n const handleCustomInput = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n let v = e.target.value.replace(/,/g, \".\");\r\n if (v.startsWith(\".\")) v = \"0\" + v;\r\n v = v.replace(/[^0-9.]/g, \"\");\r\n const dotIdx = v.indexOf(\".\");\r\n if (dotIdx >= 0) {\r\n v = v.slice(0, dotIdx + 1) + v.slice(dotIdx + 1).replace(/\\./g, \"\");\r\n }\r\n v = v.slice(0, 4);\r\n setLocalCustom(v);\r\n onCustomChange(v);\r\n };\r\n\r\n const handleSave = () => {\r\n let value: string;\r\n if (selectedIndex !== null) {\r\n value = options[selectedIndex];\r\n } else if (localCustom) {\r\n value = localCustom + \"%\";\r\n } else {\r\n return;\r\n }\r\n try {\r\n onSave(value);\r\n onClose();\r\n } catch (e) {\r\n console.error(e);\r\n }\r\n };\r\n\r\n return (\r\n <div className=\"dw-popup-backdrop dw-absolute dw-inset-0 dw-z-50 dw-flex dw-items-center dw-justify-center\">\r\n <div\r\n className=\"dw-modal-surface dw-popup-content dw-w-[304px] dw-flex dw-flex-col dw-rounded-[var(--dw-radius)] dw-p-3\"\r\n onClick={(e) => e.stopPropagation()}\r\n >\r\n <div className=\"dw-flex dw-items-center dw-justify-between\">\r\n <h3 className=\"dw-font-normal dw-text-[14px] dw-text-[var(--dw-fg)]\">\r\n Settings\r\n </h3>\r\n <button\r\n type=\"button\"\r\n className=\"dw-icon-button dw-w-4 dw-h-4 dw-rounded-[4px] dw-opacity-70 dw-cursor-pointer\"\r\n onClick={onClose}\r\n aria-label=\"Close\"\r\n >\r\n <CloseIcon />\r\n </button>\r\n </div>\r\n\r\n <div className=\"dw-flex dw-items-center dw-gap-2 dw-mt-3\">\r\n <img\r\n src={slippageIcon}\r\n alt=\"\"\r\n className=\"dw-w-[14px] dw-h-[14px] dw-object-cover\"\r\n />\r\n <p className=\"dw-font-normal dw-text-[12px] dw-text-[var(--dw-fg)]\">\r\n Slippage limit\r\n </p>\r\n </div>\r\n\r\n <div className=\"dw-flex dw-items-center dw-gap-1 dw-mt-3 dw-flex-wrap\">\r\n {options.map((opt, i) => (\r\n <button\r\n key={opt}\r\n type=\"button\"\r\n className={`dw-font-normal dw-text-[11px] dw-px-3 dw-py-1.5 dw-rounded-[6px] dw-border dw-transition ${\r\n selectedIndex === i\r\n ? \"dw-bg-[var(--dw-surface-hover)] dw-border-[var(--dw-accent)] dw-text-[var(--dw-fg)]\"\r\n : \"dw-bg-transparent dw-border-[var(--dw-border)] dw-text-[var(--dw-text-subtle)] hover:dw-bg-[var(--dw-surface-alt)] hover:dw-text-[var(--dw-fg)]\"\r\n }`}\r\n onClick={() => onSelectOption(i)}\r\n >\r\n {opt}\r\n </button>\r\n ))}\r\n <div\r\n className={`dw-relative dw-w-[72px] dw-h-[30px] dw-flex dw-items-center dw-justify-center dw-rounded-[6px] dw-border ${\r\n selectedIndex === null && localCustom\r\n ? \"dw-border-[var(--dw-accent)] dw-bg-[var(--dw-surface-hover)]\"\r\n : \"dw-border-[var(--dw-border)] dw-bg-[var(--dw-surface-alt)]\"\r\n }`}\r\n >\r\n <input\r\n type=\"text\"\r\n placeholder=\"Custom\"\r\n value={localCustom}\r\n onChange={handleCustomInput}\r\n onFocus={() => onCustomChange(\"\")}\r\n maxLength={4}\r\n className=\"dw-w-10 dw-font-normal dw-text-[11px] dw-text-[var(--dw-fg)] dw-bg-transparent dw-border-none dw-outline-none dw-text-center\"\r\n />\r\n {localCustom && (\r\n <span className=\"dw-absolute dw-right-2 dw-pointer-events-none dw-font-normal dw-text-[11px] dw-text-[var(--dw-fg)]\">\r\n %\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n\r\n <button\r\n type=\"button\"\r\n className=\"dw-w-full dw-h-[34px] dw-mt-4 dw-bg-[var(--dw-accent)] dw-border dw-border-transparent dw-rounded-[6px] dw-font-normal dw-text-[12px] dw-text-white hover:dw-bg-[var(--dw-accent-hover)] dw-cursor-pointer\"\r\n onClick={handleSave}\r\n >\r\n Save\r\n </button>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nfunction CloseIcon() {\r\n return (\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n <path d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\" />\r\n </svg>\r\n );\r\n}\r\n","import { useState, useMemo } from \"react\";\r\nimport type { TradeWidgetProps } from \"../types\";\r\nimport { getThemeVars, varsToCssVars } from \"../theme\";\r\nimport { useTrade } from \"../hooks/useTrade\";\r\nimport { TradeWindow } from \"./TradeWindow\";\r\nimport { SelectTokenWindow } from \"./SelectTokenWindow\";\r\nimport { SelectNetworkWindow } from \"./SelectNetworkWindow\";\r\nimport { SlippagePanel } from \"./SlippagePanel\";\r\nimport {\r\n CONSTANT_ETH_ADDRESS,\r\n CONSTANT_SOL_ADDRESS,\r\n CONSTANT_SUI_ADDRESS,\r\n} from \"../constants/api\";\r\nimport \"../styles/index.css\";\r\n\r\nexport type PopupType =\r\n | \"tokenSell\"\r\n | \"tokenBuy\"\r\n | \"network\"\r\n | \"settings\"\r\n | null;\r\nexport type NetworkSelectorFrom = \"sell\" | \"buy\" | null;\r\n\r\nfunction getAddressForChainType(chainType?: string): string {\r\n if (chainType === \"EVM\") return CONSTANT_ETH_ADDRESS;\r\n if (chainType === \"SVM\") return CONSTANT_SOL_ADDRESS;\r\n return CONSTANT_SUI_ADDRESS;\r\n}\r\n\r\nexport function TradeWidget(props: TradeWidgetProps): JSX.Element {\r\n const {\r\n theme = \"dark\",\r\n vars: varsOverride,\r\n className,\r\n style: styleProp,\r\n config,\r\n ...rest\r\n } = props;\r\n\r\n const themeVars = getThemeVars(theme, varsOverride);\r\n const cssVars = varsToCssVars(themeVars);\r\n const mergedStyle: React.CSSProperties = {\r\n ...cssVars,\r\n ...styleProp,\r\n };\r\n\r\n const assetBaseUrl =\n config.assetBaseUrl ??\n config.dataBaseUrl ??\n config.apiBase ??\n (typeof window !== \"undefined\" ? window.location.origin : \"\");\n\r\n const [popup, setPopup] = useState<PopupType>(null);\r\n const [networkSelectorFrom, setNetworkSelectorFrom] =\r\n useState<NetworkSelectorFrom>(null);\r\n\r\n const trade = useTrade({\n apiBase: config.apiBase,\n });\n\r\n const displayedNetworksForSell = useMemo(() => {\r\n const all = trade.networks;\r\n const sel = trade.networkSell?.id;\r\n const first6 = all.slice(0, 6);\r\n if (!sel) return first6;\r\n if (first6.some((n) => n.id === sel)) return first6;\r\n const selNet = all.find((n) => n.id === sel);\r\n if (!selNet) return first6;\r\n return [...first6.slice(0, 5), selNet];\r\n }, [trade.networks, trade.networkSell?.id]);\r\n\r\n const additionalNetworksForSell = useMemo(() => {\r\n const ids = new Set(displayedNetworksForSell.map((n) => n.id));\r\n return trade.networks.filter((n) => !ids.has(n.id));\r\n }, [trade.networks, displayedNetworksForSell]);\r\n\r\n const displayedNetworksForBuy = useMemo(() => {\r\n const all = trade.networks;\r\n const sel = trade.networkBuy?.id;\r\n const first6 = all.slice(0, 6);\r\n if (!sel) return first6;\r\n if (first6.some((n) => n.id === sel)) return first6;\r\n const selNet = all.find((n) => n.id === sel);\r\n if (!selNet) return first6;\r\n return [...first6.slice(0, 5), selNet];\r\n }, [trade.networks, trade.networkBuy?.id]);\r\n\r\n const additionalNetworksForBuy = useMemo(() => {\r\n const ids = new Set(displayedNetworksForBuy.map((n) => n.id));\r\n return trade.networks.filter((n) => !ids.has(n.id));\r\n }, [trade.networks, displayedNetworksForBuy]);\r\n\r\n const truncateTo6Decimals = (n: number) => Math.trunc(n * 1e6) / 1e6;\r\n\r\n if (trade.loading) {\r\n return (\r\n <div\r\n data-delora-widget-root\r\n className={`dw-flex dw-items-center dw-justify-center dw-p-8 ${className ?? \"\"}`}\r\n style={mergedStyle}\r\n {...rest}\r\n >\r\n <p className=\"dw-text-[var(--dw-muted)]\">Loading...</p>\r\n </div>\r\n );\r\n }\r\n\r\n if (trade.error) {\r\n return (\r\n <div\r\n data-delora-widget-root\r\n className={`dw-flex dw-items-center dw-justify-center dw-p-8 ${className ?? \"\"}`}\r\n style={mergedStyle}\r\n {...rest}\r\n >\r\n <p className=\"dw-text-[#ff7e7e]\">{trade.error}</p>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div\r\n data-delora-widget-root\r\n className={`dw-font-mono dw-relative dw-inline-block ${className ?? \"\"}`}\r\n style={mergedStyle}\r\n {...rest}\r\n >\r\n <TradeWindow\r\n assetBaseUrl={assetBaseUrl}\r\n sellToken={trade.sellToken}\r\n buyToken={trade.buyToken}\r\n networkSellLogo={trade.networkSell?.logoURI}\r\n networkBuyLogo={trade.networkBuy?.logoURI}\r\n sellAmountForInput={trade.sellAmountForInput}\r\n buyAmountForInput={trade.buyAmountForInput}\r\n onSellAmountChange={(v) => trade.setSellAmountForInput(v)}\r\n onSellInputProcess={trade.processSellInput}\r\n onOpenSellToken={() => setPopup(\"tokenSell\")}\r\n onOpenBuyToken={() => setPopup(\"tokenBuy\")}\r\n onSwapTokens={trade.swapTokens}\r\n onRefresh={() => {\r\n if (\r\n trade.networkSell &&\r\n trade.networkBuy &&\r\n trade.sellToken &&\r\n trade.buyToken &&\r\n trade.validatedSellAmount > 0\r\n ) {\r\n trade.fetchQuote({\r\n sellNetworkId: trade.networkSell.id,\r\n buyNetworkId: trade.networkBuy.id,\r\n sellToken: trade.sellToken,\r\n buyToken: trade.buyToken,\r\n sellAmountStr: trade.sellAmountForInput || \"0\",\r\n slippage: trade.slippage.slippage,\r\n fromAddress: getAddressForChainType(trade.networkSell.chainType),\r\n toAddress: getAddressForChainType(trade.networkBuy.chainType),\r\n apiBase: config.apiBase,\r\n });\r\n }\r\n }}\r\n onOpenSettings={() => setPopup(\"settings\")}\r\n balance={trade.balance}\r\n balanceBuy={trade.balanceBuy}\r\n sellPriceUsd={\r\n trade.sellToken?.priceUSD &&\r\n trade.sellAmountForInput &&\r\n Number(trade.sellAmountForInput) > 0\r\n ? `$${(\r\n Number(trade.sellAmountForInput) *\r\n Number(trade.sellToken.priceUSD)\r\n ).toFixed(3)}`\r\n : \"\"\r\n }\r\n buyPriceUsd={\r\n trade.buyToken?.priceUSD &&\r\n trade.buyAmountForInput &&\r\n Number(trade.buyAmountForInput) > 0\r\n ? `$${(\r\n Number(trade.buyAmountForInput) *\r\n Number(trade.buyToken.priceUSD)\r\n ).toFixed(3)}`\r\n : \"\"\r\n }\r\n onMaxClick={trade.setMaxSellAmount}\r\n onSet50Percent={() => trade.setSellAmountByPercent(50)}\r\n onSet25Percent={() => trade.setSellAmountByPercent(25)}\r\n buttonState={trade.buttonState}\r\n txData={trade.txData}\r\n loading={trade.buttonState === \"finding\"}\r\n price={trade.price}\r\n gasCostUSD={trade.gasCostUSD}\r\n truncateTo6Decimals={truncateTo6Decimals}\r\n isWalletConnected={Boolean(config.isWalletConnected)}\r\n onConnectWallet={config.onConnectWallet}\r\n />\r\n\r\n {popup === \"tokenSell\" && (\r\n <SelectTokenWindow\r\n mode=\"sell\"\r\n networks={trade.networks}\r\n selectedNetworkId={trade.networkSell?.id}\r\n selectedToken={trade.sellToken}\r\n excludeToken={trade.buyToken}\r\n getAllTokensForNetwork={trade.getAllTokensForNetworkId}\r\n getNetworkById={trade.getNetworkById}\r\n displayedNetworks={displayedNetworksForSell}\r\n additionalNetworksCount={additionalNetworksForSell.length}\r\n onOpenNetworkSelector={() => setNetworkSelectorFrom(\"sell\")}\r\n onSelectToken={(t) => {\r\n trade.setSellToken(t);\r\n trade.cancelRequest();\r\n setPopup(null);\r\n }}\r\n onSelectNetwork={(n) => {\r\n trade.updateNetworkSell(n.id);\r\n if (trade.networkBuy?.id !== n.id) {\r\n trade.setNetworkBuy(n);\r\n }\r\n }}\r\n onClose={() => setPopup(null)}\r\n assetBaseUrl={assetBaseUrl}\r\n />\r\n )}\r\n\r\n {popup === \"tokenBuy\" && (\r\n <SelectTokenWindow\r\n mode=\"buy\"\r\n networks={trade.networks}\r\n selectedNetworkId={trade.networkBuy?.id}\r\n selectedToken={trade.buyToken}\r\n excludeToken={trade.sellToken}\r\n getAllTokensForNetwork={trade.getAllTokensForNetworkId}\r\n getNetworkById={trade.getNetworkById}\r\n displayedNetworks={displayedNetworksForBuy}\r\n additionalNetworksCount={additionalNetworksForBuy.length}\r\n onOpenNetworkSelector={() => setNetworkSelectorFrom(\"buy\")}\r\n onSelectToken={(t) => {\r\n trade.setBuyToken(t);\r\n trade.cancelRequest();\r\n setPopup(null);\r\n }}\r\n onSelectNetwork={(n) => {\r\n trade.setNetworkBuy(n);\r\n }}\r\n onClose={() => setPopup(null)}\r\n assetBaseUrl={assetBaseUrl}\r\n />\r\n )}\r\n\r\n {networkSelectorFrom === \"sell\" && popup === \"tokenSell\" && (\r\n <SelectNetworkWindow\r\n networks={additionalNetworksForSell}\r\n assetBaseUrl={assetBaseUrl}\r\n onSelectNetwork={(n) => {\r\n trade.updateNetworkSell(n.id);\r\n if (trade.networkBuy?.id !== n.id) {\r\n trade.setNetworkBuy(n);\r\n }\r\n setNetworkSelectorFrom(null);\r\n }}\r\n onClose={() => setNetworkSelectorFrom(null)}\r\n />\r\n )}\r\n\r\n {networkSelectorFrom === \"buy\" && popup === \"tokenBuy\" && (\r\n <SelectNetworkWindow\r\n networks={additionalNetworksForBuy}\r\n assetBaseUrl={assetBaseUrl}\r\n onSelectNetwork={(n) => {\r\n trade.setNetworkBuy(n);\r\n setNetworkSelectorFrom(null);\r\n }}\r\n onClose={() => setNetworkSelectorFrom(null)}\r\n />\r\n )}\r\n\r\n {popup === \"settings\" && (\r\n <SlippagePanel\r\n options={trade.slippage.options}\r\n selectedIndex={trade.slippage.selectedIndex}\r\n customValue={trade.slippage.customValue}\r\n onSelectOption={trade.slippage.selectOption}\r\n onCustomChange={trade.slippage.setCustom}\r\n onSave={(value) => {\r\n trade.slippage.save(value);\r\n setPopup(null);\r\n }}\r\n onClose={() => setPopup(null)}\r\n />\r\n )}\r\n </div>\r\n );\r\n}\r\n"],"names":["lightTheme","darkTheme","themes","getThemeVars","theme","overrides","VAR_MAP","varsToCssVars","vars","style","key","value","cssVar","MyWidget","props","varsOverride","className","styleProp","rest","themeVars","mergedStyle","jsxs","jsx","DEFAULT_API_BASE","CONSTANT_ETH_ADDRESS","CONSTANT_SOL_ADDRESS","CONSTANT_SUI_ADDRESS","normalizeBaseUrl","baseUrl","normalizeExplorerUrl","url","chainType","chainKey","trimmed","mapNetwork","chain","_a","_b","_c","mapToken","fetchNetworks","apiBase","base","res","fetchTokens","getTokensForNetwork","tokensData","networkId","getAllTokensForNetwork","tokensSearchData","getNativeTokenForNetwork","tokens","zero","sol","sui","t","useTradeState","config","networks","setNetworks","useState","setTokensData","setTokensSearchData","loading","setLoading","error","setError","networkSell","setNetworkSell","networkBuy","setNetworkBuy","sellToken","setSellToken","buyToken","setBuyToken","useEffect","cancelled","nets","tok","e","other","getTokensForNetworkId","useCallback","getAllTokensForNetworkId","getNativeToken","getNetworkById","id","n","updateNetworkSell","chainId","net","updateNetworkBuy","setNetworkBuyDirect","network","version","defineProperties","target","values","types","stringify","seen","v","HEX","result","i","keys","k","makeError","message","code","info","shortMessage","details","assert","check","assertArgument","name","accum","form","assertPrivate","givenGuard","guard","method","operation","_getBytes","copy","offset","getBytes","BN_0","BN_1","maxValue","fromTwos","_value","_width","getUint","width","getNumber","mask","_bits","bits","getBigInt","Nibbles","toBigInt","BN_N1","BN_5","_guard","Zeros","getTens","decimals","checkValue","val","format","safeOp","limit","getFormat","signed","match","type","defaultValue","toString","negative","str","index","_FixedNumber","__privateAdd","_FixedNumber_instances","__publicField","_format","_val","_tens","__privateSet","__privateGet","__privateMethod","add_fn","sub_fn","mul_fn","checkFormat_fn","checkValue_fn","div_fn","a","b","delta","bump","tens","_decimals","whole","decimal","o","FixedNumber","names","parseUnits","unit","ZeroAddress","parseToAmount","toAmount","fetchQuote","params","searchParams","errBody","err","truncateToTokenDecimals","amountStr","maxDecimals","intPart","decPart","useTradeApi","txData","setTxData","buyAmount","setBuyAmount","buyAmountForInput","setBuyAmountForInput","price","setPrice","gasCostUSD","setGasCostUSD","gasPriceRaw","setGasPriceRaw","gasLimitRaw","setGasLimitRaw","buttonState","setButtonState","abortRef","useRef","requestIdRef","cancelRequest","invalidateQuote","fetchQuoteRequest","requestId","abort","sellNetworkId","buyNetworkId","sellAmountStr","slippage","fromAddress","toAddress","truncated","fromAmount","toAddr","response","gasBreakdown","rawOutput","readable","totalFeesAmount","_d","totalFeesDecimals","_f","_e","gasTokenAmount","fromDecimal","toDecimal","isNative","msg","statusCode","STORAGE_INDEX","STORAGE_CUSTOM","STORAGE_VALUE","OPTIONS","AUTO_SLIPPAGE","useSlippage","selectedIndex","setSelectedIndex","customValue","setCustomValue","setSlippage","si","cv","selectOption","setCustom","num","save","s","INPUT_DEBOUNCE_MS","limitDecimals","max","int","dec","getAddressForChainType","useTrade","state","api","sellAmountForInput","setSellAmountForInput","validatedSellAmount","setValidatedSellAmount","isProcessingInput","setIsProcessingInput","debounceRef","balance","balanceBuy","allFieldsReady","processSellInput","cleaned","limited","setMaxSellAmount","setSellAmountByPercent","percent","amount","swapTokens","ts","tb","prevSellStr","prevBuyStr","PRESETS","useGlitchText","ref","text","enabled","preset","onAnimationStart","onAnimationEnd","timeoutRef","useLayoutEffect","el","element","possibleChars","glitchChars","cyberChars","animationFrames","animationSpeed","finalText","frame","glitchStates","resolvedChars","animate","progress","easedProgress","resolvedCount","glitchProbability","rand","currentSpeed","startId","resolveImageUrl","gasPumpIcon","BUTTON_LABELS","TradeWindow","networkSellLogo","networkBuyLogo","assetBaseUrl","onSellAmountChange","onSellInputProcess","onOpenSellToken","onOpenBuyToken","onSwapTokens","onRefresh","onOpenSettings","sellPriceUsd","buyPriceUsd","onMaxClick","onSet50Percent","onSet25Percent","truncateTo6Decimals","isWalletConnected","onConnectWallet","isSwapActive","isErrorState","isDisabled","buyAmountRef","refreshIconRef","refreshRotationRef","handleRefresh","handleKeyDown","input","pos","newValue","actionButtonClassName","RefreshIcon","SettingsIcon","SwapArrowsBlock","AssetSection","Fragment","ActionLink","label","labelTone","token","networkLogo","amountPlaceholder","usdValue","onOpenToken","onInputChange","onKeyDown","amountToneClassName","amountRef","readOnly","quickActions","TokenIcon","sizeClassName","badgeClassName","tokenImg","netImg","copyHoverIcon","copyCheckIcon","linkIcon","SelectTokenWindow","mode","selectedNetworkId","selectedToken","excludeToken","onSelectToken","onSelectNetwork","onOpenNetworkSelector","onClose","displayedNetworks","additionalNetworksCount","search","setSearch","copiedAddresses","setCopiedAddresses","isNativeToken","ethers.ZeroAddress","copyToClipboard","address","prev","next","displayed","useMemo","all","CloseIcon","SearchIcon","explorerLink","shortAddress","isCopied","showContract","SelectNetworkWindow","filtered","slippageIcon","SlippagePanel","options","onSelectOption","onCustomChange","onSave","localCustom","setLocalCustom","handleCustomInput","dotIdx","handleSave","opt","TradeWidget","popup","setPopup","networkSelectorFrom","setNetworkSelectorFrom","trade","displayedNetworksForSell","sel","first6","selNet","additionalNetworksForSell","ids","displayedNetworksForBuy","additionalNetworksForBuy","_g","_h"],"mappings":"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","x_google_ignoreList":[5,6,7,8,9,10,11,12]}
1
+ {"version":3,"file":"index.js","sources":["../src/theme.ts","../src/MyWidget.tsx","../src/constants/api.ts","../src/api/dataApi.ts","../src/hooks/useTradeState.ts","../node_modules/ethers/lib.esm/_version.js","../node_modules/ethers/lib.esm/utils/properties.js","../node_modules/ethers/lib.esm/utils/errors.js","../node_modules/ethers/lib.esm/utils/data.js","../node_modules/ethers/lib.esm/utils/maths.js","../node_modules/ethers/lib.esm/utils/fixednumber.js","../node_modules/ethers/lib.esm/utils/units.js","../node_modules/ethers/lib.esm/constants/addresses.js","../src/api/tradeApi.ts","../src/hooks/useTradeApi.ts","../src/hooks/useSlippage.ts","../src/hooks/useTrade.ts","../src/hooks/useGlitchText.ts","../src/utils/resolveImageUrl.ts","../src/assets/trade/gas-pump.svg","../src/widget/TradeWindow.tsx","../src/assets/trade/copy-hover.png","../src/assets/trade/copy-check.png","../src/assets/trade/link.png","../src/widget/SelectTokenWindow.tsx","../src/widget/SelectNetworkWindow.tsx","../src/assets/trade/slippage.png","../src/widget/SlippagePanel.tsx","../src/widget/TradeWidget.tsx"],"sourcesContent":["import type { CSSProperties } from \"react\";\r\nimport type { MyWidgetTheme, MyWidgetVars } from \"./types\";\r\n\r\nconst lightTheme: MyWidgetVars = {\r\n bg: \"#ffffff\",\r\n fg: \"#111216\",\r\n accent: \"#7ca7f5\",\r\n border: \"#dfe2ea\",\r\n muted: \"#8e93a1\",\r\n surface: \"#ffffff\",\r\n surfaceAlt: \"#f6f7fb\",\r\n surfaceHover: \"#eef2fb\",\r\n textSubtle: \"#8a90a0\",\r\n accentHover: \"#6a95ee\",\r\n success: \"#89d76e\",\r\n danger: \"#f06a63\",\r\n overlay: \"rgba(13, 16, 24, 0.3)\",\r\n shadow: \"0 18px 50px rgba(15, 20, 34, 0.08)\",\r\n radius: \"10px\",\r\n fontFamily: \"'Roboto Mono', monospace\",\r\n fontSize: \"13px\",\r\n lineHeight: \"1.2\",\r\n letterSpacing: \"-0.05em\",\r\n};\r\n\r\nconst darkTheme: MyWidgetVars = {\r\n bg: \"#090909\",\r\n fg: \"#ffffff\",\r\n accent: \"#7ca7f5\",\r\n border: \"#232323\",\r\n muted: \"#636363\",\r\n surface: \"#090909\",\r\n surfaceAlt: \"#0f0f0f\",\r\n surfaceHover: \"#161616\",\r\n textSubtle: \"#7a7a7a\",\r\n accentHover: \"#6a95ee\",\r\n success: \"#87d96f\",\r\n danger: \"#f06a63\",\r\n overlay: \"rgba(0, 0, 0, 0.72)\",\r\n shadow: \"0 0 0 1px rgba(255, 255, 255, 0.03)\",\r\n radius: \"10px\",\r\n fontFamily: \"'Roboto Mono', monospace\",\r\n fontSize: \"13px\",\r\n lineHeight: \"1.2\",\r\n letterSpacing: \"-0.05em\",\r\n};\r\n\r\nexport const themes: Record<MyWidgetTheme, MyWidgetVars> = {\r\n light: lightTheme,\r\n dark: darkTheme,\r\n};\r\n\r\nexport function getThemeVars(\r\n theme: MyWidgetTheme,\r\n overrides?: Partial<MyWidgetVars>\r\n): MyWidgetVars {\r\n const base = themes[theme];\r\n return { ...base, ...overrides };\r\n}\r\n\r\nconst VAR_MAP: Record<keyof MyWidgetVars, string> = {\r\n bg: \"--dw-bg\",\r\n fg: \"--dw-fg\",\r\n accent: \"--dw-accent\",\r\n border: \"--dw-border\",\r\n muted: \"--dw-muted\",\r\n surface: \"--dw-surface\",\r\n surfaceAlt: \"--dw-surface-alt\",\r\n surfaceHover: \"--dw-surface-hover\",\r\n textSubtle: \"--dw-text-subtle\",\r\n accentHover: \"--dw-accent-hover\",\r\n success: \"--dw-success\",\r\n danger: \"--dw-danger\",\r\n overlay: \"--dw-overlay\",\r\n shadow: \"--dw-shadow\",\r\n radius: \"--dw-radius\",\r\n fontFamily: \"--dw-font\",\r\n fontSize: \"--dw-font-size\",\r\n lineHeight: \"--dw-line-height\",\r\n letterSpacing: \"--dw-letter-spacing\",\r\n};\r\n\r\nexport function varsToCssVars(vars: MyWidgetVars): CSSProperties {\r\n const style: Record<string, string> = {};\r\n for (const [key, value] of Object.entries(vars)) {\r\n const cssVar = VAR_MAP[key as keyof MyWidgetVars];\r\n if (cssVar && value != null) style[cssVar] = value;\r\n }\r\n return style as React.CSSProperties;\r\n}\r\n","import type { MyWidgetProps } from \"./types\";\r\nimport { getThemeVars, varsToCssVars } from \"./theme\";\r\nimport \"./styles/index.css\";\r\n\r\nexport function MyWidget(props: MyWidgetProps): JSX.Element {\r\n const {\r\n theme = \"light\",\r\n vars: varsOverride,\r\n className,\r\n style: styleProp,\r\n ...rest\r\n } = props;\r\n\r\n const themeVars = getThemeVars(theme, varsOverride);\r\n const cssVars = varsToCssVars(themeVars);\r\n\r\n const mergedStyle: React.CSSProperties = {\r\n ...cssVars,\r\n ...styleProp,\r\n };\r\n\r\n return (\r\n <div\r\n data-delora-widget-root\r\n className={`dw-flex dw-flex-col dw-gap-3 dw-rounded-[var(--dw-radius)] dw-border dw-border-[var(--dw-border)] dw-bg-[var(--dw-bg)] dw-p-4 dw-shadow-sm ${className ?? \"\"}`}\r\n style={mergedStyle}\r\n {...rest}\r\n >\r\n <h3 className=\"dw-text-base dw-font-semibold dw-text-[var(--dw-fg)]\">\r\n Delora\r\n </h3>\r\n <p className=\"dw-text-sm dw-text-[var(--dw-muted)]\">\r\n A simple widget with theme support.\r\n </p>\r\n <button\r\n type=\"button\"\r\n className=\"dw-inline-flex dw-items-center dw-justify-center dw-rounded-[var(--dw-radius)] dw-bg-[var(--dw-accent)] dw-px-3 dw-py-2 dw-text-sm dw-font-medium dw-text-white dw-transition-colors hover:dw-opacity-90 focus:dw-outline-none focus:dw-ring-2 focus:dw-ring-[var(--dw-accent)] focus:dw-ring-offset-2 focus:dw-ring-offset-[var(--dw-bg)]\"\r\n >\r\n Action\r\n </button>\r\n </div>\r\n );\r\n}\r\n","export const DEFAULT_API_BASE = \"https://api.delora.build\";\r\n\r\nexport const CONSTANT_ETH_ADDRESS = \"0x1111111111111111111111111111111111111111\";\r\nexport const CONSTANT_SOL_ADDRESS = \"11111111111111111111111111111111\";\r\nexport const CONSTANT_SUI_ADDRESS =\r\n \"1111111111111111111111111111111111111111111111111111111111111111\";\r\n","import { DEFAULT_API_BASE } from \"../constants/api\";\nimport type { Network } from \"../types/network\";\nimport type { Token } from \"../types/token\";\n\ninterface TokenData {\n chainId: number;\n address: string;\n symbol: string;\n name: string;\n decimals: number;\n priceUSD?: string;\n coinKey?: string;\n logoURI?: string;\n}\n\nexport interface TokensData {\n byChainId: Record<string, TokenData[]>;\n}\n\ninterface DeloraNativeTokenApi {\n address: string;\n decimals: number;\n symbol: string;\n chainId: number;\n coinKey: string;\n name: string;\n logoURI?: string;\n}\n\ninterface DeloraChainApi {\n key: string;\n name: string;\n chainType: string;\n id: number;\n idHex?: string;\n logoURI?: string;\n rpcUrls?: string[];\n blockExplorerUrls?: string;\n nativeToken?: DeloraNativeTokenApi;\n}\n\ninterface DeloraChainsResponse {\n chains: DeloraChainApi[];\n}\n\ntype DeloraTokensResponse = Record<string, TokenData[]>;\n\nfunction normalizeBaseUrl(baseUrl?: string): string {\n return (baseUrl || DEFAULT_API_BASE).replace(/\\/$/, \"\");\n}\n\nfunction normalizeExplorerUrl(\n url: string | undefined,\n chainType: string,\n chainKey: string\n): string | undefined {\n if (!url) return undefined;\n\n const trimmed = url.replace(/\\/+$/, \"\");\n if (trimmed.includes(\"/token/\") || trimmed.includes(\"/coin/\")) {\n return `${trimmed}/`;\n }\n\n if (chainType === \"MVM\" || chainKey === \"sui\") {\n return `${trimmed}/coin/`;\n }\n\n return `${trimmed}/token/`;\n}\n\nfunction mapNetwork(chain: DeloraChainApi): Network {\n return {\n id: chain.id,\n name: chain.name,\n rpcUrls: chain.rpcUrls ?? [],\n logoURI: chain.logoURI,\n idHex: chain.idHex,\n chainType: chain.chainType,\n explorerUrl: normalizeExplorerUrl(\n chain.blockExplorerUrls,\n chain.chainType,\n chain.key\n ),\n key: chain.key,\n nativeCurrency: {\n name: chain.nativeToken?.name ?? chain.name,\n symbol: chain.nativeToken?.symbol ?? \"\",\n decimals: chain.nativeToken?.decimals ?? 18,\n },\n };\n}\n\nfunction mapToken(t: TokenData): Token {\n return {\n symbol: t.symbol,\n name: t.name,\n contractAddress: t.address,\n chainId: t.chainId,\n imageUrl: t.logoURI ?? \"\",\n decimals: t.decimals,\n priceUSD: t.priceUSD,\n };\n}\n\nexport async function fetchNetworks(apiBase?: string): Promise<Network[]> {\n const base = normalizeBaseUrl(apiBase);\n const res = await fetch(`${base}/v1/chains`);\n if (!res.ok) throw new Error(`Failed to fetch networks: ${res.status}`);\n const data = (await res.json()) as DeloraChainsResponse;\n return (data.chains ?? []).map(mapNetwork);\n}\n\nexport async function fetchTokens(apiBase?: string): Promise<TokensData> {\n const base = normalizeBaseUrl(apiBase);\n const res = await fetch(`${base}/v1/tokens`);\n if (!res.ok) throw new Error(`Failed to fetch tokens: ${res.status}`);\n const data = (await res.json()) as DeloraTokensResponse;\n return { byChainId: data };\n}\n\nexport async function fetchTokensSearch(apiBase?: string): Promise<TokensData> {\n return fetchTokens(apiBase);\n}\n\nexport function getTokensForNetwork(\n tokensData: TokensData,\n networkId: number\n): Token[] {\n const key = String(networkId);\n return (tokensData.byChainId[key] ?? []).map(mapToken);\n}\n\r\nexport function getAllTokensForNetwork(\r\n tokensSearchData: TokensData,\r\n networkId: number\r\n): Token[] {\r\n return getTokensForNetwork(tokensSearchData, networkId);\r\n}\r\n\r\nexport function getNativeTokenForNetwork(tokens: Token[]): Token | undefined {\r\n const zero = \"0x0000000000000000000000000000000000000000\";\r\n const sol = \"11111111111111111111111111111111\";\r\n const sui =\r\n \"1111111111111111111111111111111111111111111111111111111111111111\";\r\n return (\r\n tokens.find(\r\n (t) =>\r\n t.contractAddress === zero ||\r\n t.contractAddress === sol ||\r\n t.contractAddress === sui\r\n ) ?? tokens[0]\r\n );\r\n}\r\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport type {\n Network,\n Token,\n TradeWidgetErrorPayload,\n TradeWidgetTokenSelection,\n} from \"../types\";\nimport {\n fetchNetworks,\n fetchTokens,\n getTokensForNetwork,\n getAllTokensForNetwork,\n getNativeTokenForNetwork,\n type TokensData,\n} from \"../api/dataApi\";\n\nexport interface UseTradeStateConfig {\n apiBase?: string;\n initialSellToken?: TradeWidgetTokenSelection;\n initialBuyToken?: TradeWidgetTokenSelection;\n initialSellNetworkId?: number;\n initialBuyNetworkId?: number;\n lockBuyToken?: boolean;\n lockSellToken?: boolean;\n lockBuyNetwork?: boolean;\n lockSellNetwork?: boolean;\n onError?: (payload: TradeWidgetErrorPayload) => void;\n}\n\nfunction isHexAddress(value: string): boolean {\n return value.startsWith(\"0x\");\n}\n\nfunction addressesEqual(a: string, b: string): boolean {\n if (isHexAddress(a) || isHexAddress(b)) {\n return a.toLowerCase() === b.toLowerCase();\n }\n return a === b;\n}\n\nfunction findTokenBySelection(\n tokens: Token[],\n selection?: TradeWidgetTokenSelection\n): Token | undefined {\n if (!selection) return undefined;\n return tokens.find(\n (token) =>\n token.chainId === selection.chainId &&\n addressesEqual(token.contractAddress, selection.address)\n );\n}\n\nexport function useTradeState(config: UseTradeStateConfig) {\n const [networks, setNetworks] = useState<Network[]>([]);\n const [tokensData, setTokensData] = useState<TokensData | null>(null);\n const [tokensSearchData, setTokensSearchData] = useState<TokensData | null>(\n null\n );\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n const [networkSell, setNetworkSellState] = useState<Network | undefined>();\n const [networkBuy, setNetworkBuyState] = useState<Network | undefined>();\n const [sellToken, setSellTokenState] = useState<Token | undefined>();\n const [buyToken, setBuyTokenState] = useState<Token | undefined>();\n\n const appliedSellNetworkRef = useRef(\"\");\n const appliedBuyNetworkRef = useRef(\"\");\n const appliedSellTokenRef = useRef(\"\");\n const appliedBuyTokenRef = useRef(\"\");\n const selectionErrorsRef = useRef<Set<string>>(new Set());\n\n const sellNetworkLocked = Boolean(config.lockSellNetwork || config.lockSellToken);\n const buyNetworkLocked = Boolean(config.lockBuyNetwork || config.lockBuyToken);\n\n const desiredSellNetworkId = useMemo(\n () => config.initialSellNetworkId ?? config.initialSellToken?.chainId,\n [config.initialSellNetworkId, config.initialSellToken]\n );\n\n const desiredBuyNetworkId = useMemo(\n () => config.initialBuyNetworkId ?? config.initialBuyToken?.chainId,\n [config.initialBuyNetworkId, config.initialBuyToken]\n );\n\n useEffect(() => {\n let cancelled = false;\n setLoading(true);\n setError(null);\n\n Promise.all([fetchNetworks(config.apiBase), fetchTokens(config.apiBase)])\n .then(([nets, tok]) => {\n if (cancelled) return;\n setNetworks(nets);\n setTokensData(tok);\n setTokensSearchData(tok);\n\n if (nets.length >= 2) {\n setNetworkSellState(nets[0]);\n setNetworkBuyState(nets[1]);\n } else if (nets.length === 1) {\n setNetworkSellState(nets[0]);\n setNetworkBuyState(nets[0]);\n }\n })\n .catch((e) => {\n if (cancelled) return;\n const message = e?.message ?? \"Failed to load data\";\n setError(message);\n config.onError?.({\n source: \"metadata\",\n message,\n status: e?.status,\n statusCode: e?.statusCode,\n error: e,\n });\n })\n .finally(() => {\n if (!cancelled) setLoading(false);\n });\n\n return () => {\n cancelled = true;\n };\n }, [config.apiBase, config.onError]);\n\n useEffect(() => {\n if (!networks.length || !desiredSellNetworkId) return;\n const key = String(desiredSellNetworkId);\n if (appliedSellNetworkRef.current === key) return;\n const nextNetwork = networks.find((network) => network.id === desiredSellNetworkId);\n if (!nextNetwork) return;\n setNetworkSellState(nextNetwork);\n appliedSellNetworkRef.current = key;\n }, [desiredSellNetworkId, networks]);\n\n useEffect(() => {\n if (!networks.length || !desiredBuyNetworkId) return;\n const key = String(desiredBuyNetworkId);\n if (appliedBuyNetworkRef.current === key) return;\n const nextNetwork = networks.find((network) => network.id === desiredBuyNetworkId);\n if (!nextNetwork) return;\n setNetworkBuyState(nextNetwork);\n appliedBuyNetworkRef.current = key;\n }, [desiredBuyNetworkId, networks]);\n\n useEffect(() => {\n if (!networkSell || !tokensData) return;\n\n const tokens = getTokensForNetwork(tokensData, networkSell.id);\n const selectionKey = config.initialSellToken\n ? `${config.initialSellToken.chainId}:${config.initialSellToken.address}`\n : \"\";\n const selectedByHost = findTokenBySelection(tokens, config.initialSellToken);\n\n if (selectedByHost && appliedSellTokenRef.current !== selectionKey) {\n setSellTokenState(selectedByHost);\n appliedSellTokenRef.current = selectionKey;\n return;\n }\n\n if (\n config.initialSellToken &&\n !selectedByHost &&\n !selectionErrorsRef.current.has(`sell:${selectionKey}`)\n ) {\n selectionErrorsRef.current.add(`sell:${selectionKey}`);\n config.onError?.({\n source: \"selection\",\n message: `Initial sell token ${config.initialSellToken.address} was not found on chain ${config.initialSellToken.chainId}`,\n });\n }\n\n if (tokens.length && !sellToken) {\n setSellTokenState(tokens[0]);\n } else if (\n sellToken &&\n !tokens.some(\n (token) =>\n token.contractAddress === sellToken.contractAddress &&\n token.chainId === sellToken.chainId\n )\n ) {\n setSellTokenState(tokens[0]);\n }\n }, [config.initialSellToken, config.onError, networkSell, sellToken, tokensData]);\n\n useEffect(() => {\n if (!networkBuy || !tokensData) return;\n\n const tokens = getTokensForNetwork(tokensData, networkBuy.id);\n const selectionKey = config.initialBuyToken\n ? `${config.initialBuyToken.chainId}:${config.initialBuyToken.address}`\n : \"\";\n const selectedByHost = findTokenBySelection(tokens, config.initialBuyToken);\n\n if (selectedByHost && appliedBuyTokenRef.current !== selectionKey) {\n setBuyTokenState(selectedByHost);\n appliedBuyTokenRef.current = selectionKey;\n return;\n }\n\n if (\n config.initialBuyToken &&\n !selectedByHost &&\n !selectionErrorsRef.current.has(`buy:${selectionKey}`)\n ) {\n selectionErrorsRef.current.add(`buy:${selectionKey}`);\n config.onError?.({\n source: \"selection\",\n message: `Initial buy token ${config.initialBuyToken.address} was not found on chain ${config.initialBuyToken.chainId}`,\n });\n }\n\n if (tokens.length && !buyToken) {\n const other = sellToken\n ? tokens.find(\n (token) =>\n !(\n token.contractAddress === sellToken.contractAddress &&\n token.chainId === sellToken.chainId\n )\n )\n : undefined;\n setBuyTokenState(other ?? tokens[0]);\n } else if (\n buyToken &&\n !tokens.some(\n (token) =>\n token.contractAddress === buyToken.contractAddress &&\n token.chainId === buyToken.chainId\n )\n ) {\n const other = sellToken\n ? tokens.find(\n (token) =>\n !(\n token.contractAddress === sellToken.contractAddress &&\n token.chainId === sellToken.chainId\n )\n )\n : undefined;\n setBuyTokenState(other ?? tokens[0]);\n }\n }, [buyToken, config.initialBuyToken, config.onError, networkBuy, sellToken, tokensData]);\n\n const getTokensForNetworkId = useCallback(\n (networkId: number): Token[] => {\n if (!tokensData) return [];\n return getTokensForNetwork(tokensData, networkId);\n },\n [tokensData]\n );\n\n const getAllTokensForNetworkId = useCallback(\n (networkId: number): Token[] => {\n if (!tokensSearchData) {\n return getTokensForNetwork(tokensData ?? { byChainId: {} }, networkId);\n }\n return getAllTokensForNetwork(tokensSearchData, networkId);\n },\n [tokensSearchData, tokensData]\n );\n\n const getNativeToken = useCallback(\n (networkId: number): Token | undefined => {\n const tokens = getTokensForNetwork(tokensData ?? { byChainId: {} }, networkId);\n return getNativeTokenForNetwork(tokens);\n },\n [tokensData]\n );\n\n const getNetworkById = useCallback(\n (id: number): Network | undefined => networks.find((network) => network.id === id),\n [networks]\n );\n\n const updateNetworkSell = useCallback(\n (chainId: number) => {\n if (sellNetworkLocked) return;\n const network = networks.find((item) => item.id === chainId);\n if (network) setNetworkSellState(network);\n },\n [networks, sellNetworkLocked]\n );\n\n const updateNetworkBuy = useCallback(\n (chainId: number) => {\n if (buyNetworkLocked) return;\n const network = networks.find((item) => item.id === chainId);\n if (network) setNetworkBuyState(network);\n },\n [buyNetworkLocked, networks]\n );\n\n const setNetworkSell = useCallback(\n (network: Network) => {\n if (sellNetworkLocked) return;\n setNetworkSellState(network);\n },\n [sellNetworkLocked]\n );\n\n const setNetworkBuy = useCallback(\n (network: Network) => {\n if (buyNetworkLocked) return;\n setNetworkBuyState(network);\n },\n [buyNetworkLocked]\n );\n\n const setSellToken = useCallback(\n (token: Token) => {\n if (config.lockSellToken) return;\n setSellTokenState(token);\n },\n [config.lockSellToken]\n );\n\n const setBuyToken = useCallback(\n (token: Token) => {\n if (config.lockBuyToken) return;\n setBuyTokenState(token);\n },\n [config.lockBuyToken]\n );\n\n return {\n networks,\n networkSell,\n networkBuy,\n sellToken,\n buyToken,\n setSellToken,\n setBuyToken,\n setNetworkSell,\n setNetworkBuy,\n updateNetworkSell,\n updateNetworkBuy,\n getTokensForNetworkId,\n getAllTokensForNetworkId,\n getNativeToken,\n getNetworkById,\n sellNetworkLocked,\n buyNetworkLocked,\n loading,\n error,\n };\n}\n","/* Do NOT modify this file; see /src.ts/_admin/update-version.ts */\n/**\n * The current version of Ethers.\n */\nexport const version = \"6.16.0\";\n//# sourceMappingURL=_version.js.map","/**\n * Property helper functions.\n *\n * @_subsection api/utils:Properties [about-properties]\n */\nfunction checkType(value, type, name) {\n const types = type.split(\"|\").map(t => t.trim());\n for (let i = 0; i < types.length; i++) {\n switch (type) {\n case \"any\":\n return;\n case \"bigint\":\n case \"boolean\":\n case \"number\":\n case \"string\":\n if (typeof (value) === type) {\n return;\n }\n }\n }\n const error = new Error(`invalid value for type ${type}`);\n error.code = \"INVALID_ARGUMENT\";\n error.argument = `value.${name}`;\n error.value = value;\n throw error;\n}\n/**\n * Resolves to a new object that is a copy of %%value%%, but with all\n * values resolved.\n */\nexport async function resolveProperties(value) {\n const keys = Object.keys(value);\n const results = await Promise.all(keys.map((k) => Promise.resolve(value[k])));\n return results.reduce((accum, v, index) => {\n accum[keys[index]] = v;\n return accum;\n }, {});\n}\n/**\n * Assigns the %%values%% to %%target%% as read-only values.\n *\n * It %%types%% is specified, the values are checked.\n */\nexport function defineProperties(target, values, types) {\n for (let key in values) {\n let value = values[key];\n const type = (types ? types[key] : null);\n if (type) {\n checkType(value, type, key);\n }\n Object.defineProperty(target, key, { enumerable: true, value, writable: false });\n }\n}\n//# sourceMappingURL=properties.js.map","/**\n * All errors in ethers include properties to ensure they are both\n * human-readable (i.e. ``.message``) and machine-readable (i.e. ``.code``).\n *\n * The [[isError]] function can be used to check the error ``code`` and\n * provide a type guard for the properties present on that error interface.\n *\n * @_section: api/utils/errors:Errors [about-errors]\n */\nimport { version } from \"../_version.js\";\nimport { defineProperties } from \"./properties.js\";\nfunction stringify(value, seen) {\n if (value == null) {\n return \"null\";\n }\n if (seen == null) {\n seen = new Set();\n }\n if (typeof (value) === \"object\") {\n if (seen.has(value)) {\n return \"[Circular]\";\n }\n seen.add(value);\n }\n if (Array.isArray(value)) {\n return \"[ \" + (value.map((v) => stringify(v, seen))).join(\", \") + \" ]\";\n }\n if (value instanceof Uint8Array) {\n const HEX = \"0123456789abcdef\";\n let result = \"0x\";\n for (let i = 0; i < value.length; i++) {\n result += HEX[value[i] >> 4];\n result += HEX[value[i] & 0xf];\n }\n return result;\n }\n if (typeof (value) === \"object\" && typeof (value.toJSON) === \"function\") {\n return stringify(value.toJSON(), seen);\n }\n switch (typeof (value)) {\n case \"boolean\":\n case \"number\":\n case \"symbol\":\n return value.toString();\n case \"bigint\":\n return BigInt(value).toString();\n case \"string\":\n return JSON.stringify(value);\n case \"object\": {\n const keys = Object.keys(value);\n keys.sort();\n return \"{ \" + keys.map((k) => `${stringify(k, seen)}: ${stringify(value[k], seen)}`).join(\", \") + \" }\";\n }\n }\n return `[ COULD NOT SERIALIZE ]`;\n}\n/**\n * Returns true if the %%error%% matches an error thrown by ethers\n * that matches the error %%code%%.\n *\n * In TypeScript environments, this can be used to check that %%error%%\n * matches an EthersError type, which means the expected properties will\n * be set.\n *\n * @See [ErrorCodes](api:ErrorCode)\n * @example\n * try {\n * // code....\n * } catch (e) {\n * if (isError(e, \"CALL_EXCEPTION\")) {\n * // The Type Guard has validated this object\n * console.log(e.data);\n * }\n * }\n */\nexport function isError(error, code) {\n return (error && error.code === code);\n}\n/**\n * Returns true if %%error%% is a [[CallExceptionError].\n */\nexport function isCallException(error) {\n return isError(error, \"CALL_EXCEPTION\");\n}\n/**\n * Returns a new Error configured to the format ethers emits errors, with\n * the %%message%%, [[api:ErrorCode]] %%code%% and additional properties\n * for the corresponding EthersError.\n *\n * Each error in ethers includes the version of ethers, a\n * machine-readable [[ErrorCode]], and depending on %%code%%, additional\n * required properties. The error message will also include the %%message%%,\n * ethers version, %%code%% and all additional properties, serialized.\n */\nexport function makeError(message, code, info) {\n let shortMessage = message;\n {\n const details = [];\n if (info) {\n if (\"message\" in info || \"code\" in info || \"name\" in info) {\n throw new Error(`value will overwrite populated values: ${stringify(info)}`);\n }\n for (const key in info) {\n if (key === \"shortMessage\") {\n continue;\n }\n const value = (info[key]);\n // try {\n details.push(key + \"=\" + stringify(value));\n // } catch (error: any) {\n // console.log(\"MMM\", error.message);\n // details.push(key + \"=[could not serialize object]\");\n // }\n }\n }\n details.push(`code=${code}`);\n details.push(`version=${version}`);\n if (details.length) {\n message += \" (\" + details.join(\", \") + \")\";\n }\n }\n let error;\n switch (code) {\n case \"INVALID_ARGUMENT\":\n error = new TypeError(message);\n break;\n case \"NUMERIC_FAULT\":\n case \"BUFFER_OVERRUN\":\n error = new RangeError(message);\n break;\n default:\n error = new Error(message);\n }\n defineProperties(error, { code });\n if (info) {\n Object.assign(error, info);\n }\n if (error.shortMessage == null) {\n defineProperties(error, { shortMessage });\n }\n return error;\n}\n/**\n * Throws an EthersError with %%message%%, %%code%% and additional error\n * %%info%% when %%check%% is falsish..\n *\n * @see [[api:makeError]]\n */\nexport function assert(check, message, code, info) {\n if (!check) {\n throw makeError(message, code, info);\n }\n}\n/**\n * A simple helper to simply ensuring provided arguments match expected\n * constraints, throwing if not.\n *\n * In TypeScript environments, the %%check%% has been asserted true, so\n * any further code does not need additional compile-time checks.\n */\nexport function assertArgument(check, message, name, value) {\n assert(check, message, \"INVALID_ARGUMENT\", { argument: name, value: value });\n}\nexport function assertArgumentCount(count, expectedCount, message) {\n if (message == null) {\n message = \"\";\n }\n if (message) {\n message = \": \" + message;\n }\n assert(count >= expectedCount, \"missing argument\" + message, \"MISSING_ARGUMENT\", {\n count: count,\n expectedCount: expectedCount\n });\n assert(count <= expectedCount, \"too many arguments\" + message, \"UNEXPECTED_ARGUMENT\", {\n count: count,\n expectedCount: expectedCount\n });\n}\nconst _normalizeForms = [\"NFD\", \"NFC\", \"NFKD\", \"NFKC\"].reduce((accum, form) => {\n try {\n // General test for normalize\n /* c8 ignore start */\n if (\"test\".normalize(form) !== \"test\") {\n throw new Error(\"bad\");\n }\n ;\n /* c8 ignore stop */\n if (form === \"NFD\") {\n const check = String.fromCharCode(0xe9).normalize(\"NFD\");\n const expected = String.fromCharCode(0x65, 0x0301);\n /* c8 ignore start */\n if (check !== expected) {\n throw new Error(\"broken\");\n }\n /* c8 ignore stop */\n }\n accum.push(form);\n }\n catch (error) { }\n return accum;\n}, []);\n/**\n * Throws if the normalization %%form%% is not supported.\n */\nexport function assertNormalize(form) {\n assert(_normalizeForms.indexOf(form) >= 0, \"platform missing String.prototype.normalize\", \"UNSUPPORTED_OPERATION\", {\n operation: \"String.prototype.normalize\", info: { form }\n });\n}\n/**\n * Many classes use file-scoped values to guard the constructor,\n * making it effectively private. This facilitates that pattern\n * by ensuring the %%givenGaurd%% matches the file-scoped %%guard%%,\n * throwing if not, indicating the %%className%% if provided.\n */\nexport function assertPrivate(givenGuard, guard, className) {\n if (className == null) {\n className = \"\";\n }\n if (givenGuard !== guard) {\n let method = className, operation = \"new\";\n if (className) {\n method += \".\";\n operation += \" \" + className;\n }\n assert(false, `private constructor; use ${method}from* methods`, \"UNSUPPORTED_OPERATION\", {\n operation\n });\n }\n}\n//# sourceMappingURL=errors.js.map","/**\n * Some data helpers.\n *\n *\n * @_subsection api/utils:Data Helpers [about-data]\n */\nimport { assert, assertArgument } from \"./errors.js\";\nfunction _getBytes(value, name, copy) {\n if (value instanceof Uint8Array) {\n if (copy) {\n return new Uint8Array(value);\n }\n return value;\n }\n if (typeof (value) === \"string\" && (value.length % 2) === 0 &&\n value.match(/^0x[0-9a-f]*$/i)) {\n const result = new Uint8Array((value.length - 2) / 2);\n let offset = 2;\n for (let i = 0; i < result.length; i++) {\n result[i] = parseInt(value.substring(offset, offset + 2), 16);\n offset += 2;\n }\n return result;\n }\n assertArgument(false, \"invalid BytesLike value\", name || \"value\", value);\n}\n/**\n * Get a typed Uint8Array for %%value%%. If already a Uint8Array\n * the original %%value%% is returned; if a copy is required use\n * [[getBytesCopy]].\n *\n * @see: getBytesCopy\n */\nexport function getBytes(value, name) {\n return _getBytes(value, name, false);\n}\n/**\n * Get a typed Uint8Array for %%value%%, creating a copy if necessary\n * to prevent any modifications of the returned value from being\n * reflected elsewhere.\n *\n * @see: getBytes\n */\nexport function getBytesCopy(value, name) {\n return _getBytes(value, name, true);\n}\n/**\n * Returns true if %%value%% is a valid [[HexString]].\n *\n * If %%length%% is ``true`` or a //number//, it also checks that\n * %%value%% is a valid [[DataHexString]] of %%length%% (if a //number//)\n * bytes of data (e.g. ``0x1234`` is 2 bytes).\n */\nexport function isHexString(value, length) {\n if (typeof (value) !== \"string\" || !value.match(/^0x[0-9A-Fa-f]*$/)) {\n return false;\n }\n if (typeof (length) === \"number\" && value.length !== 2 + 2 * length) {\n return false;\n }\n if (length === true && (value.length % 2) !== 0) {\n return false;\n }\n return true;\n}\n/**\n * Returns true if %%value%% is a valid representation of arbitrary\n * data (i.e. a valid [[DataHexString]] or a Uint8Array).\n */\nexport function isBytesLike(value) {\n return (isHexString(value, true) || (value instanceof Uint8Array));\n}\nconst HexCharacters = \"0123456789abcdef\";\n/**\n * Returns a [[DataHexString]] representation of %%data%%.\n */\nexport function hexlify(data) {\n const bytes = getBytes(data);\n let result = \"0x\";\n for (let i = 0; i < bytes.length; i++) {\n const v = bytes[i];\n result += HexCharacters[(v & 0xf0) >> 4] + HexCharacters[v & 0x0f];\n }\n return result;\n}\n/**\n * Returns a [[DataHexString]] by concatenating all values\n * within %%data%%.\n */\nexport function concat(datas) {\n return \"0x\" + datas.map((d) => hexlify(d).substring(2)).join(\"\");\n}\n/**\n * Returns the length of %%data%%, in bytes.\n */\nexport function dataLength(data) {\n if (isHexString(data, true)) {\n return (data.length - 2) / 2;\n }\n return getBytes(data).length;\n}\n/**\n * Returns a [[DataHexString]] by slicing %%data%% from the %%start%%\n * offset to the %%end%% offset.\n *\n * By default %%start%% is 0 and %%end%% is the length of %%data%%.\n */\nexport function dataSlice(data, start, end) {\n const bytes = getBytes(data);\n if (end != null && end > bytes.length) {\n assert(false, \"cannot slice beyond data bounds\", \"BUFFER_OVERRUN\", {\n buffer: bytes, length: bytes.length, offset: end\n });\n }\n return hexlify(bytes.slice((start == null) ? 0 : start, (end == null) ? bytes.length : end));\n}\n/**\n * Return the [[DataHexString]] result by stripping all **leading**\n ** zero bytes from %%data%%.\n */\nexport function stripZerosLeft(data) {\n let bytes = hexlify(data).substring(2);\n while (bytes.startsWith(\"00\")) {\n bytes = bytes.substring(2);\n }\n return \"0x\" + bytes;\n}\nfunction zeroPad(data, length, left) {\n const bytes = getBytes(data);\n assert(length >= bytes.length, \"padding exceeds data length\", \"BUFFER_OVERRUN\", {\n buffer: new Uint8Array(bytes),\n length: length,\n offset: length + 1\n });\n const result = new Uint8Array(length);\n result.fill(0);\n if (left) {\n result.set(bytes, length - bytes.length);\n }\n else {\n result.set(bytes, 0);\n }\n return hexlify(result);\n}\n/**\n * Return the [[DataHexString]] of %%data%% padded on the **left**\n * to %%length%% bytes.\n *\n * If %%data%% already exceeds %%length%%, a [[BufferOverrunError]] is\n * thrown.\n *\n * This pads data the same as **values** are in Solidity\n * (e.g. ``uint128``).\n */\nexport function zeroPadValue(data, length) {\n return zeroPad(data, length, true);\n}\n/**\n * Return the [[DataHexString]] of %%data%% padded on the **right**\n * to %%length%% bytes.\n *\n * If %%data%% already exceeds %%length%%, a [[BufferOverrunError]] is\n * thrown.\n *\n * This pads data the same as **bytes** are in Solidity\n * (e.g. ``bytes16``).\n */\nexport function zeroPadBytes(data, length) {\n return zeroPad(data, length, false);\n}\n//# sourceMappingURL=data.js.map","/**\n * Some mathematic operations.\n *\n * @_subsection: api/utils:Math Helpers [about-maths]\n */\nimport { hexlify, isBytesLike } from \"./data.js\";\nimport { assert, assertArgument } from \"./errors.js\";\nconst BN_0 = BigInt(0);\nconst BN_1 = BigInt(1);\n//const BN_Max256 = (BN_1 << BigInt(256)) - BN_1;\n// IEEE 754 support 53-bits of mantissa\nconst maxValue = 0x1fffffffffffff;\n/**\n * Convert %%value%% from a twos-compliment representation of %%width%%\n * bits to its value.\n *\n * If the highest bit is ``1``, the result will be negative.\n */\nexport function fromTwos(_value, _width) {\n const value = getUint(_value, \"value\");\n const width = BigInt(getNumber(_width, \"width\"));\n assert((value >> width) === BN_0, \"overflow\", \"NUMERIC_FAULT\", {\n operation: \"fromTwos\", fault: \"overflow\", value: _value\n });\n // Top bit set; treat as a negative value\n if (value >> (width - BN_1)) {\n const mask = (BN_1 << width) - BN_1;\n return -(((~value) & mask) + BN_1);\n }\n return value;\n}\n/**\n * Convert %%value%% to a twos-compliment representation of\n * %%width%% bits.\n *\n * The result will always be positive.\n */\nexport function toTwos(_value, _width) {\n let value = getBigInt(_value, \"value\");\n const width = BigInt(getNumber(_width, \"width\"));\n const limit = (BN_1 << (width - BN_1));\n if (value < BN_0) {\n value = -value;\n assert(value <= limit, \"too low\", \"NUMERIC_FAULT\", {\n operation: \"toTwos\", fault: \"overflow\", value: _value\n });\n const mask = (BN_1 << width) - BN_1;\n return ((~value) & mask) + BN_1;\n }\n else {\n assert(value < limit, \"too high\", \"NUMERIC_FAULT\", {\n operation: \"toTwos\", fault: \"overflow\", value: _value\n });\n }\n return value;\n}\n/**\n * Mask %%value%% with a bitmask of %%bits%% ones.\n */\nexport function mask(_value, _bits) {\n const value = getUint(_value, \"value\");\n const bits = BigInt(getNumber(_bits, \"bits\"));\n return value & ((BN_1 << bits) - BN_1);\n}\n/**\n * Gets a BigInt from %%value%%. If it is an invalid value for\n * a BigInt, then an ArgumentError will be thrown for %%name%%.\n */\nexport function getBigInt(value, name) {\n switch (typeof (value)) {\n case \"bigint\": return value;\n case \"number\":\n assertArgument(Number.isInteger(value), \"underflow\", name || \"value\", value);\n assertArgument(value >= -maxValue && value <= maxValue, \"overflow\", name || \"value\", value);\n return BigInt(value);\n case \"string\":\n try {\n if (value === \"\") {\n throw new Error(\"empty string\");\n }\n if (value[0] === \"-\" && value[1] !== \"-\") {\n return -BigInt(value.substring(1));\n }\n return BigInt(value);\n }\n catch (e) {\n assertArgument(false, `invalid BigNumberish string: ${e.message}`, name || \"value\", value);\n }\n }\n assertArgument(false, \"invalid BigNumberish value\", name || \"value\", value);\n}\n/**\n * Returns %%value%% as a bigint, validating it is valid as a bigint\n * value and that it is positive.\n */\nexport function getUint(value, name) {\n const result = getBigInt(value, name);\n assert(result >= BN_0, \"unsigned value cannot be negative\", \"NUMERIC_FAULT\", {\n fault: \"overflow\", operation: \"getUint\", value\n });\n return result;\n}\nconst Nibbles = \"0123456789abcdef\";\n/*\n * Converts %%value%% to a BigInt. If %%value%% is a Uint8Array, it\n * is treated as Big Endian data.\n */\nexport function toBigInt(value) {\n if (value instanceof Uint8Array) {\n let result = \"0x0\";\n for (const v of value) {\n result += Nibbles[v >> 4];\n result += Nibbles[v & 0x0f];\n }\n return BigInt(result);\n }\n return getBigInt(value);\n}\n/**\n * Gets a //number// from %%value%%. If it is an invalid value for\n * a //number//, then an ArgumentError will be thrown for %%name%%.\n */\nexport function getNumber(value, name) {\n switch (typeof (value)) {\n case \"bigint\":\n assertArgument(value >= -maxValue && value <= maxValue, \"overflow\", name || \"value\", value);\n return Number(value);\n case \"number\":\n assertArgument(Number.isInteger(value), \"underflow\", name || \"value\", value);\n assertArgument(value >= -maxValue && value <= maxValue, \"overflow\", name || \"value\", value);\n return value;\n case \"string\":\n try {\n if (value === \"\") {\n throw new Error(\"empty string\");\n }\n return getNumber(BigInt(value), name);\n }\n catch (e) {\n assertArgument(false, `invalid numeric string: ${e.message}`, name || \"value\", value);\n }\n }\n assertArgument(false, \"invalid numeric value\", name || \"value\", value);\n}\n/**\n * Converts %%value%% to a number. If %%value%% is a Uint8Array, it\n * is treated as Big Endian data. Throws if the value is not safe.\n */\nexport function toNumber(value) {\n return getNumber(toBigInt(value));\n}\n/**\n * Converts %%value%% to a Big Endian hexstring, optionally padded to\n * %%width%% bytes.\n */\nexport function toBeHex(_value, _width) {\n const value = getUint(_value, \"value\");\n let result = value.toString(16);\n if (_width == null) {\n // Ensure the value is of even length\n if (result.length % 2) {\n result = \"0\" + result;\n }\n }\n else {\n const width = getNumber(_width, \"width\");\n // Special case when both value and width are 0 (see: #5025)\n if (width === 0 && value === BN_0) {\n return \"0x\";\n }\n assert(width * 2 >= result.length, `value exceeds width (${width} bytes)`, \"NUMERIC_FAULT\", {\n operation: \"toBeHex\",\n fault: \"overflow\",\n value: _value\n });\n // Pad the value to the required width\n while (result.length < (width * 2)) {\n result = \"0\" + result;\n }\n }\n return \"0x\" + result;\n}\n/**\n * Converts %%value%% to a Big Endian Uint8Array.\n */\nexport function toBeArray(_value, _width) {\n const value = getUint(_value, \"value\");\n if (value === BN_0) {\n const width = (_width != null) ? getNumber(_width, \"width\") : 0;\n return new Uint8Array(width);\n }\n let hex = value.toString(16);\n if (hex.length % 2) {\n hex = \"0\" + hex;\n }\n if (_width != null) {\n const width = getNumber(_width, \"width\");\n while (hex.length < (width * 2)) {\n hex = \"00\" + hex;\n }\n assert((width * 2) === hex.length, `value exceeds width (${width} bytes)`, \"NUMERIC_FAULT\", {\n operation: \"toBeArray\",\n fault: \"overflow\",\n value: _value\n });\n }\n const result = new Uint8Array(hex.length / 2);\n for (let i = 0; i < result.length; i++) {\n const offset = i * 2;\n result[i] = parseInt(hex.substring(offset, offset + 2), 16);\n }\n return result;\n}\n/**\n * Returns a [[HexString]] for %%value%% safe to use as a //Quantity//.\n *\n * A //Quantity// does not have and leading 0 values unless the value is\n * the literal value `0x0`. This is most commonly used for JSSON-RPC\n * numeric values.\n */\nexport function toQuantity(value) {\n let result = hexlify(isBytesLike(value) ? value : toBeArray(value)).substring(2);\n while (result.startsWith(\"0\")) {\n result = result.substring(1);\n }\n if (result === \"\") {\n result = \"0\";\n }\n return \"0x\" + result;\n}\n//# sourceMappingURL=maths.js.map","/**\n * The **FixedNumber** class permits using values with decimal places,\n * using fixed-pont math.\n *\n * Fixed-point math is still based on integers under-the-hood, but uses an\n * internal offset to store fractional components below, and each operation\n * corrects for this after each operation.\n *\n * @_section: api/utils/fixed-point-math:Fixed-Point Maths [about-fixed-point-math]\n */\nimport { getBytes } from \"./data.js\";\nimport { assert, assertArgument, assertPrivate } from \"./errors.js\";\nimport { getBigInt, getNumber, fromTwos, mask, toBigInt } from \"./maths.js\";\nimport { defineProperties } from \"./properties.js\";\nconst BN_N1 = BigInt(-1);\nconst BN_0 = BigInt(0);\nconst BN_1 = BigInt(1);\nconst BN_5 = BigInt(5);\nconst _guard = {};\n// Constant to pull zeros from for multipliers\nlet Zeros = \"0000\";\nwhile (Zeros.length < 80) {\n Zeros += Zeros;\n}\n// Returns a string \"1\" followed by decimal \"0\"s\nfunction getTens(decimals) {\n let result = Zeros;\n while (result.length < decimals) {\n result += result;\n }\n return BigInt(\"1\" + result.substring(0, decimals));\n}\nfunction checkValue(val, format, safeOp) {\n const width = BigInt(format.width);\n if (format.signed) {\n const limit = (BN_1 << (width - BN_1));\n assert(safeOp == null || (val >= -limit && val < limit), \"overflow\", \"NUMERIC_FAULT\", {\n operation: safeOp, fault: \"overflow\", value: val\n });\n if (val > BN_0) {\n val = fromTwos(mask(val, width), width);\n }\n else {\n val = -fromTwos(mask(-val, width), width);\n }\n }\n else {\n const limit = (BN_1 << width);\n assert(safeOp == null || (val >= 0 && val < limit), \"overflow\", \"NUMERIC_FAULT\", {\n operation: safeOp, fault: \"overflow\", value: val\n });\n val = (((val % limit) + limit) % limit) & (limit - BN_1);\n }\n return val;\n}\nfunction getFormat(value) {\n if (typeof (value) === \"number\") {\n value = `fixed128x${value}`;\n }\n let signed = true;\n let width = 128;\n let decimals = 18;\n if (typeof (value) === \"string\") {\n // Parse the format string\n if (value === \"fixed\") {\n // defaults...\n }\n else if (value === \"ufixed\") {\n signed = false;\n }\n else {\n const match = value.match(/^(u?)fixed([0-9]+)x([0-9]+)$/);\n assertArgument(match, \"invalid fixed format\", \"format\", value);\n signed = (match[1] !== \"u\");\n width = parseInt(match[2]);\n decimals = parseInt(match[3]);\n }\n }\n else if (value) {\n // Extract the values from the object\n const v = value;\n const check = (key, type, defaultValue) => {\n if (v[key] == null) {\n return defaultValue;\n }\n assertArgument(typeof (v[key]) === type, \"invalid fixed format (\" + key + \" not \" + type + \")\", \"format.\" + key, v[key]);\n return v[key];\n };\n signed = check(\"signed\", \"boolean\", signed);\n width = check(\"width\", \"number\", width);\n decimals = check(\"decimals\", \"number\", decimals);\n }\n assertArgument((width % 8) === 0, \"invalid FixedNumber width (not byte aligned)\", \"format.width\", width);\n assertArgument(decimals <= 80, \"invalid FixedNumber decimals (too large)\", \"format.decimals\", decimals);\n const name = (signed ? \"\" : \"u\") + \"fixed\" + String(width) + \"x\" + String(decimals);\n return { signed, width, decimals, name };\n}\nfunction toString(val, decimals) {\n let negative = \"\";\n if (val < BN_0) {\n negative = \"-\";\n val *= BN_N1;\n }\n let str = val.toString();\n // No decimal point for whole values\n if (decimals === 0) {\n return (negative + str);\n }\n // Pad out to the whole component (including a whole digit)\n while (str.length <= decimals) {\n str = Zeros + str;\n }\n // Insert the decimal point\n const index = str.length - decimals;\n str = str.substring(0, index) + \".\" + str.substring(index);\n // Trim the whole component (leaving at least one 0)\n while (str[0] === \"0\" && str[1] !== \".\") {\n str = str.substring(1);\n }\n // Trim the decimal component (leaving at least one 0)\n while (str[str.length - 1] === \"0\" && str[str.length - 2] !== \".\") {\n str = str.substring(0, str.length - 1);\n }\n return (negative + str);\n}\n/**\n * A FixedNumber represents a value over its [[FixedFormat]]\n * arithmetic field.\n *\n * A FixedNumber can be used to perform math, losslessly, on\n * values which have decmial places.\n *\n * A FixedNumber has a fixed bit-width to store values in, and stores all\n * values internally by multiplying the value by 10 raised to the power of\n * %%decimals%%.\n *\n * If operations are performed that cause a value to grow too high (close to\n * positive infinity) or too low (close to negative infinity), the value\n * is said to //overflow//.\n *\n * For example, an 8-bit signed value, with 0 decimals may only be within\n * the range ``-128`` to ``127``; so ``-128 - 1`` will overflow and become\n * ``127``. Likewise, ``127 + 1`` will overflow and become ``-127``.\n *\n * Many operation have a normal and //unsafe// variant. The normal variant\n * will throw a [[NumericFaultError]] on any overflow, while the //unsafe//\n * variant will silently allow overflow, corrupting its value value.\n *\n * If operations are performed that cause a value to become too small\n * (close to zero), the value loses precison and is said to //underflow//.\n *\n * For example, a value with 1 decimal place may store a number as small\n * as ``0.1``, but the value of ``0.1 / 2`` is ``0.05``, which cannot fit\n * into 1 decimal place, so underflow occurs which means precision is lost\n * and the value becomes ``0``.\n *\n * Some operations have a normal and //signalling// variant. The normal\n * variant will silently ignore underflow, while the //signalling// variant\n * will thow a [[NumericFaultError]] on underflow.\n */\nexport class FixedNumber {\n /**\n * The specific fixed-point arithmetic field for this value.\n */\n format;\n #format;\n // The actual value (accounting for decimals)\n #val;\n // A base-10 value to multiple values by to maintain the magnitude\n #tens;\n /**\n * This is a property so console.log shows a human-meaningful value.\n *\n * @private\n */\n _value;\n // Use this when changing this file to get some typing info,\n // but then switch to any to mask the internal type\n //constructor(guard: any, value: bigint, format: _FixedFormat) {\n /**\n * @private\n */\n constructor(guard, value, format) {\n assertPrivate(guard, _guard, \"FixedNumber\");\n this.#val = value;\n this.#format = format;\n const _value = toString(value, format.decimals);\n defineProperties(this, { format: format.name, _value });\n this.#tens = getTens(format.decimals);\n }\n /**\n * If true, negative values are permitted, otherwise only\n * positive values and zero are allowed.\n */\n get signed() { return this.#format.signed; }\n /**\n * The number of bits available to store the value.\n */\n get width() { return this.#format.width; }\n /**\n * The number of decimal places in the fixed-point arithment field.\n */\n get decimals() { return this.#format.decimals; }\n /**\n * The value as an integer, based on the smallest unit the\n * [[decimals]] allow.\n */\n get value() { return this.#val; }\n #checkFormat(other) {\n assertArgument(this.format === other.format, \"incompatible format; use fixedNumber.toFormat\", \"other\", other);\n }\n #checkValue(val, safeOp) {\n /*\n const width = BigInt(this.width);\n if (this.signed) {\n const limit = (BN_1 << (width - BN_1));\n assert(safeOp == null || (val >= -limit && val < limit), \"overflow\", \"NUMERIC_FAULT\", {\n operation: <string>safeOp, fault: \"overflow\", value: val\n });\n \n if (val > BN_0) {\n val = fromTwos(mask(val, width), width);\n } else {\n val = -fromTwos(mask(-val, width), width);\n }\n \n } else {\n const masked = mask(val, width);\n assert(safeOp == null || (val >= 0 && val === masked), \"overflow\", \"NUMERIC_FAULT\", {\n operation: <string>safeOp, fault: \"overflow\", value: val\n });\n val = masked;\n }\n */\n val = checkValue(val, this.#format, safeOp);\n return new FixedNumber(_guard, val, this.#format);\n }\n #add(o, safeOp) {\n this.#checkFormat(o);\n return this.#checkValue(this.#val + o.#val, safeOp);\n }\n /**\n * Returns a new [[FixedNumber]] with the result of %%this%% added\n * to %%other%%, ignoring overflow.\n */\n addUnsafe(other) { return this.#add(other); }\n /**\n * Returns a new [[FixedNumber]] with the result of %%this%% added\n * to %%other%%. A [[NumericFaultError]] is thrown if overflow\n * occurs.\n */\n add(other) { return this.#add(other, \"add\"); }\n #sub(o, safeOp) {\n this.#checkFormat(o);\n return this.#checkValue(this.#val - o.#val, safeOp);\n }\n /**\n * Returns a new [[FixedNumber]] with the result of %%other%% subtracted\n * from %%this%%, ignoring overflow.\n */\n subUnsafe(other) { return this.#sub(other); }\n /**\n * Returns a new [[FixedNumber]] with the result of %%other%% subtracted\n * from %%this%%. A [[NumericFaultError]] is thrown if overflow\n * occurs.\n */\n sub(other) { return this.#sub(other, \"sub\"); }\n #mul(o, safeOp) {\n this.#checkFormat(o);\n return this.#checkValue((this.#val * o.#val) / this.#tens, safeOp);\n }\n /**\n * Returns a new [[FixedNumber]] with the result of %%this%% multiplied\n * by %%other%%, ignoring overflow and underflow (precision loss).\n */\n mulUnsafe(other) { return this.#mul(other); }\n /**\n * Returns a new [[FixedNumber]] with the result of %%this%% multiplied\n * by %%other%%. A [[NumericFaultError]] is thrown if overflow\n * occurs.\n */\n mul(other) { return this.#mul(other, \"mul\"); }\n /**\n * Returns a new [[FixedNumber]] with the result of %%this%% multiplied\n * by %%other%%. A [[NumericFaultError]] is thrown if overflow\n * occurs or if underflow (precision loss) occurs.\n */\n mulSignal(other) {\n this.#checkFormat(other);\n const value = this.#val * other.#val;\n assert((value % this.#tens) === BN_0, \"precision lost during signalling mul\", \"NUMERIC_FAULT\", {\n operation: \"mulSignal\", fault: \"underflow\", value: this\n });\n return this.#checkValue(value / this.#tens, \"mulSignal\");\n }\n #div(o, safeOp) {\n assert(o.#val !== BN_0, \"division by zero\", \"NUMERIC_FAULT\", {\n operation: \"div\", fault: \"divide-by-zero\", value: this\n });\n this.#checkFormat(o);\n return this.#checkValue((this.#val * this.#tens) / o.#val, safeOp);\n }\n /**\n * Returns a new [[FixedNumber]] with the result of %%this%% divided\n * by %%other%%, ignoring underflow (precision loss). A\n * [[NumericFaultError]] is thrown if overflow occurs.\n */\n divUnsafe(other) { return this.#div(other); }\n /**\n * Returns a new [[FixedNumber]] with the result of %%this%% divided\n * by %%other%%, ignoring underflow (precision loss). A\n * [[NumericFaultError]] is thrown if overflow occurs.\n */\n div(other) { return this.#div(other, \"div\"); }\n /**\n * Returns a new [[FixedNumber]] with the result of %%this%% divided\n * by %%other%%. A [[NumericFaultError]] is thrown if underflow\n * (precision loss) occurs.\n */\n divSignal(other) {\n assert(other.#val !== BN_0, \"division by zero\", \"NUMERIC_FAULT\", {\n operation: \"div\", fault: \"divide-by-zero\", value: this\n });\n this.#checkFormat(other);\n const value = (this.#val * this.#tens);\n assert((value % other.#val) === BN_0, \"precision lost during signalling div\", \"NUMERIC_FAULT\", {\n operation: \"divSignal\", fault: \"underflow\", value: this\n });\n return this.#checkValue(value / other.#val, \"divSignal\");\n }\n /**\n * Returns a comparison result between %%this%% and %%other%%.\n *\n * This is suitable for use in sorting, where ``-1`` implies %%this%%\n * is smaller, ``1`` implies %%this%% is larger and ``0`` implies\n * both are equal.\n */\n cmp(other) {\n let a = this.value, b = other.value;\n // Coerce a and b to the same magnitude\n const delta = this.decimals - other.decimals;\n if (delta > 0) {\n b *= getTens(delta);\n }\n else if (delta < 0) {\n a *= getTens(-delta);\n }\n // Comnpare\n if (a < b) {\n return -1;\n }\n if (a > b) {\n return 1;\n }\n return 0;\n }\n /**\n * Returns true if %%other%% is equal to %%this%%.\n */\n eq(other) { return this.cmp(other) === 0; }\n /**\n * Returns true if %%other%% is less than to %%this%%.\n */\n lt(other) { return this.cmp(other) < 0; }\n /**\n * Returns true if %%other%% is less than or equal to %%this%%.\n */\n lte(other) { return this.cmp(other) <= 0; }\n /**\n * Returns true if %%other%% is greater than to %%this%%.\n */\n gt(other) { return this.cmp(other) > 0; }\n /**\n * Returns true if %%other%% is greater than or equal to %%this%%.\n */\n gte(other) { return this.cmp(other) >= 0; }\n /**\n * Returns a new [[FixedNumber]] which is the largest **integer**\n * that is less than or equal to %%this%%.\n *\n * The decimal component of the result will always be ``0``.\n */\n floor() {\n let val = this.#val;\n if (this.#val < BN_0) {\n val -= this.#tens - BN_1;\n }\n val = (this.#val / this.#tens) * this.#tens;\n return this.#checkValue(val, \"floor\");\n }\n /**\n * Returns a new [[FixedNumber]] which is the smallest **integer**\n * that is greater than or equal to %%this%%.\n *\n * The decimal component of the result will always be ``0``.\n */\n ceiling() {\n let val = this.#val;\n if (this.#val > BN_0) {\n val += this.#tens - BN_1;\n }\n val = (this.#val / this.#tens) * this.#tens;\n return this.#checkValue(val, \"ceiling\");\n }\n /**\n * Returns a new [[FixedNumber]] with the decimal component\n * rounded up on ties at %%decimals%% places.\n */\n round(decimals) {\n if (decimals == null) {\n decimals = 0;\n }\n // Not enough precision to not already be rounded\n if (decimals >= this.decimals) {\n return this;\n }\n const delta = this.decimals - decimals;\n const bump = BN_5 * getTens(delta - 1);\n let value = this.value + bump;\n const tens = getTens(delta);\n value = (value / tens) * tens;\n checkValue(value, this.#format, \"round\");\n return new FixedNumber(_guard, value, this.#format);\n }\n /**\n * Returns true if %%this%% is equal to ``0``.\n */\n isZero() { return (this.#val === BN_0); }\n /**\n * Returns true if %%this%% is less than ``0``.\n */\n isNegative() { return (this.#val < BN_0); }\n /**\n * Returns the string representation of %%this%%.\n */\n toString() { return this._value; }\n /**\n * Returns a float approximation.\n *\n * Due to IEEE 754 precission (or lack thereof), this function\n * can only return an approximation and most values will contain\n * rounding errors.\n */\n toUnsafeFloat() { return parseFloat(this.toString()); }\n /**\n * Return a new [[FixedNumber]] with the same value but has had\n * its field set to %%format%%.\n *\n * This will throw if the value cannot fit into %%format%%.\n */\n toFormat(format) {\n return FixedNumber.fromString(this.toString(), format);\n }\n /**\n * Creates a new [[FixedNumber]] for %%value%% divided by\n * %%decimal%% places with %%format%%.\n *\n * This will throw a [[NumericFaultError]] if %%value%% (once adjusted\n * for %%decimals%%) cannot fit in %%format%%, either due to overflow\n * or underflow (precision loss).\n */\n static fromValue(_value, _decimals, _format) {\n const decimals = (_decimals == null) ? 0 : getNumber(_decimals);\n const format = getFormat(_format);\n let value = getBigInt(_value, \"value\");\n const delta = decimals - format.decimals;\n if (delta > 0) {\n const tens = getTens(delta);\n assert((value % tens) === BN_0, \"value loses precision for format\", \"NUMERIC_FAULT\", {\n operation: \"fromValue\", fault: \"underflow\", value: _value\n });\n value /= tens;\n }\n else if (delta < 0) {\n value *= getTens(-delta);\n }\n checkValue(value, format, \"fromValue\");\n return new FixedNumber(_guard, value, format);\n }\n /**\n * Creates a new [[FixedNumber]] for %%value%% with %%format%%.\n *\n * This will throw a [[NumericFaultError]] if %%value%% cannot fit\n * in %%format%%, either due to overflow or underflow (precision loss).\n */\n static fromString(_value, _format) {\n const match = _value.match(/^(-?)([0-9]*)\\.?([0-9]*)$/);\n assertArgument(match && (match[2].length + match[3].length) > 0, \"invalid FixedNumber string value\", \"value\", _value);\n const format = getFormat(_format);\n let whole = (match[2] || \"0\"), decimal = (match[3] || \"\");\n // Pad out the decimals\n while (decimal.length < format.decimals) {\n decimal += Zeros;\n }\n // Check precision is safe\n assert(decimal.substring(format.decimals).match(/^0*$/), \"too many decimals for format\", \"NUMERIC_FAULT\", {\n operation: \"fromString\", fault: \"underflow\", value: _value\n });\n // Remove extra padding\n decimal = decimal.substring(0, format.decimals);\n const value = BigInt(match[1] + whole + decimal);\n checkValue(value, format, \"fromString\");\n return new FixedNumber(_guard, value, format);\n }\n /**\n * Creates a new [[FixedNumber]] with the big-endian representation\n * %%value%% with %%format%%.\n *\n * This will throw a [[NumericFaultError]] if %%value%% cannot fit\n * in %%format%% due to overflow.\n */\n static fromBytes(_value, _format) {\n let value = toBigInt(getBytes(_value, \"value\"));\n const format = getFormat(_format);\n if (format.signed) {\n value = fromTwos(value, format.width);\n }\n checkValue(value, format, \"fromBytes\");\n return new FixedNumber(_guard, value, format);\n }\n}\n//const f1 = FixedNumber.fromString(\"12.56\", \"fixed16x2\");\n//const f2 = FixedNumber.fromString(\"0.3\", \"fixed16x2\");\n//console.log(f1.divSignal(f2));\n//const BUMP = FixedNumber.from(\"0.5\");\n//# sourceMappingURL=fixednumber.js.map","/**\n * Most interactions with Ethereum requires integer values, which use\n * the smallest magnitude unit.\n *\n * For example, imagine dealing with dollars and cents. Since dollars\n * are divisible, non-integer values are possible, such as ``$10.77``.\n * By using the smallest indivisible unit (i.e. cents), the value can\n * be kept as the integer ``1077``.\n *\n * When receiving decimal input from the user (as a decimal string),\n * the value should be converted to an integer and when showing a user\n * a value, the integer value should be converted to a decimal string.\n *\n * This creates a clear distinction, between values to be used by code\n * (integers) and values used for display logic to users (decimals).\n *\n * The native unit in Ethereum, //ether// is divisible to 18 decimal places,\n * where each individual unit is called a //wei//.\n *\n * @_subsection api/utils:Unit Conversion [about-units]\n */\nimport { assertArgument } from \"./errors.js\";\nimport { FixedNumber } from \"./fixednumber.js\";\nimport { getNumber } from \"./maths.js\";\nconst names = [\n \"wei\",\n \"kwei\",\n \"mwei\",\n \"gwei\",\n \"szabo\",\n \"finney\",\n \"ether\",\n];\n/**\n * Converts %%value%% into a //decimal string//, assuming %%unit%% decimal\n * places. The %%unit%% may be the number of decimal places or the name of\n * a unit (e.g. ``\"gwei\"`` for 9 decimal places).\n *\n */\nexport function formatUnits(value, unit) {\n let decimals = 18;\n if (typeof (unit) === \"string\") {\n const index = names.indexOf(unit);\n assertArgument(index >= 0, \"invalid unit\", \"unit\", unit);\n decimals = 3 * index;\n }\n else if (unit != null) {\n decimals = getNumber(unit, \"unit\");\n }\n return FixedNumber.fromValue(value, decimals, { decimals, width: 512 }).toString();\n}\n/**\n * Converts the //decimal string// %%value%% to a BigInt, assuming\n * %%unit%% decimal places. The %%unit%% may the number of decimal places\n * or the name of a unit (e.g. ``\"gwei\"`` for 9 decimal places).\n */\nexport function parseUnits(value, unit) {\n assertArgument(typeof (value) === \"string\", \"value must be a string\", \"value\", value);\n let decimals = 18;\n if (typeof (unit) === \"string\") {\n const index = names.indexOf(unit);\n assertArgument(index >= 0, \"invalid unit\", \"unit\", unit);\n decimals = 3 * index;\n }\n else if (unit != null) {\n decimals = getNumber(unit, \"unit\");\n }\n return FixedNumber.fromString(value, { decimals, width: 512 }).value;\n}\n/**\n * Converts %%value%% into a //decimal string// using 18 decimal places.\n */\nexport function formatEther(wei) {\n return formatUnits(wei, 18);\n}\n/**\n * Converts the //decimal string// %%ether%% to a BigInt, using 18\n * decimal places.\n */\nexport function parseEther(ether) {\n return parseUnits(ether, 18);\n}\n//# sourceMappingURL=units.js.map","/**\n * A constant for the zero address.\n *\n * (**i.e.** ``\"0x0000000000000000000000000000000000000000\"``)\n */\nexport const ZeroAddress = \"0x0000000000000000000000000000000000000000\";\n//# sourceMappingURL=addresses.js.map","import { DEFAULT_API_BASE } from \"../constants/api\";\r\n\r\nexport interface QuoteParams {\r\n originChainId: string | number;\r\n destinationChainId: string | number;\r\n originCurrency: string;\r\n destinationCurrency: string;\r\n amount: string;\r\n senderAddress: string;\r\n receiverAddress?: string;\r\n slippage?: number;\r\n}\r\n\r\nexport interface QuoteResponse {\r\n calldata?: {\r\n to?: string;\r\n data?: string;\r\n value?: string;\r\n };\r\n gas?: {\r\n gasPrice?: string;\r\n gasLimit?: string;\r\n maxFeePerGas?: string;\r\n maxPriorityFeePerGas?: string;\r\n };\r\n inputAmount?: string;\r\n outputAmount?: string;\r\n fees?: {\r\n total?: { amount: string; decimals?: number };\r\n breakdown?: Array<{ type: string; amount: string; gasPrice?: string }>;\r\n };\r\n [key: string]: unknown;\r\n}\r\n\r\nexport function parseToAmount(toAmount: string, decimals: number): string {\r\n return (Number(toAmount) / Math.pow(10, decimals)).toString();\r\n}\r\n\r\nexport async function fetchQuote(\r\n params: QuoteParams,\r\n apiBase: string = DEFAULT_API_BASE\r\n): Promise<QuoteResponse> {\r\n const searchParams = new URLSearchParams({\r\n senderAddress: params.senderAddress,\r\n receiverAddress: params.receiverAddress ?? params.senderAddress,\r\n originChainId: String(params.originChainId),\r\n destinationChainId: String(params.destinationChainId),\r\n amount: params.amount,\r\n originCurrency: params.originCurrency,\r\n destinationCurrency: params.destinationCurrency,\r\n });\r\n if (params.slippage != null) {\r\n searchParams.set(\"slippage\", String(params.slippage));\r\n }\r\n\r\n const url = `${apiBase}/v1/quotes?${searchParams.toString()}`;\r\n const res = await fetch(url);\r\n if (!res.ok) {\r\n const errBody = await res.json().catch(() => ({}));\r\n const err = new Error(errBody?.message ?? `HTTP ${res.status}`);\r\n (err as any).status = res.status;\r\n (err as any).statusCode = errBody?.statusCode;\r\n (err as any).error = errBody;\r\n throw err;\r\n }\r\n return res.json();\r\n}\r\n","import { useCallback, useRef, useState } from \"react\";\nimport { parseUnits } from \"ethers\";\nimport type { Token, TradeWidgetErrorPayload } from \"../types\";\nimport {\r\n fetchQuote,\r\n parseToAmount,\r\n type QuoteResponse,\r\n} from \"../api/tradeApi\";\r\nimport { DEFAULT_API_BASE } from \"../constants/api\";\r\n\r\nexport type ButtonState =\r\n | \"swap\"\r\n | \"finding\"\r\n | \"approve\"\r\n | \"wallet\"\r\n | \"insufficient\"\r\n | \"no-available-quotes\"\r\n | \"wrong-address\"\r\n | \"rate-limit\";\r\n\r\nexport interface UseTradeApiResult {\n quote: QuoteResponse | null;\n txData: QuoteResponse[\"calldata\"] | null;\n buyAmount: string;\n buyAmountForInput: string;\n setBuyAmount: (s: string) => void;\r\n setBuyAmountForInput: (s: string) => void;\r\n price: number;\r\n gasCostUSD: string | null;\r\n gasPriceRaw: string | undefined;\r\n gasLimitRaw: string | undefined;\r\n buttonState: ButtonState;\r\n setButtonState: (s: ButtonState) => void;\r\n fetchQuote: (params: FetchQuoteParams) => void;\r\n cancelRequest: () => void;\n invalidateQuote: () => void;\n}\n\ninterface UseTradeApiConfig {\n onError?: (payload: TradeWidgetErrorPayload) => void;\n}\n\r\nexport interface FetchQuoteParams {\r\n sellNetworkId: number;\r\n buyNetworkId: number;\r\n sellToken: Token;\r\n buyToken: Token;\r\n sellAmountStr: string;\r\n slippage: number;\r\n fromAddress: string;\r\n toAddress?: string;\r\n apiBase?: string;\r\n}\r\n\r\nfunction truncateToTokenDecimals(amountStr: string, maxDecimals: number): string {\r\n if (!amountStr || maxDecimals < 0) return amountStr;\r\n if (!amountStr.includes(\".\")) return amountStr;\r\n const [intPart, decPart] = amountStr.split(\".\");\r\n if (!decPart || decPart.length <= maxDecimals) return amountStr;\r\n const trimmed = decPart.slice(0, maxDecimals);\r\n return trimmed ? `${intPart}.${trimmed}` : intPart || \"0\";\r\n}\r\n\r\nexport function useTradeApi(config: UseTradeApiConfig = {}): UseTradeApiResult {\n const [quote, setQuote] = useState<QuoteResponse | null>(null);\n const [txData, setTxData] = useState<QuoteResponse[\"calldata\"] | null>(null);\n const [buyAmount, setBuyAmount] = useState(\"\");\r\n const [buyAmountForInput, setBuyAmountForInput] = useState(\"\");\r\n const [price, setPrice] = useState(0);\r\n const [gasCostUSD, setGasCostUSD] = useState<string | null>(null);\r\n const [gasPriceRaw, setGasPriceRaw] = useState<string | undefined>();\r\n const [gasLimitRaw, setGasLimitRaw] = useState<string | undefined>();\r\n const [buttonState, setButtonState] = useState<ButtonState>(\"swap\");\r\n\r\n const abortRef = useRef<AbortController | null>(null);\r\n const requestIdRef = useRef(0);\r\n\r\n const cancelRequest = useCallback(() => {\r\n abortRef.current?.abort();\r\n abortRef.current = null;\r\n }, []);\r\n\r\n const invalidateQuote = useCallback(() => {\n setQuote(null);\n setTxData(null);\n setButtonState(\"finding\");\n }, []);\n\r\n const fetchQuoteRequest = useCallback(\r\n (params: FetchQuoteParams) => {\r\n cancelRequest();\r\n const requestId = ++requestIdRef.current;\r\n const abort = new AbortController();\r\n abortRef.current = abort;\r\n\r\n const {\r\n sellNetworkId,\r\n buyNetworkId,\r\n sellToken,\r\n buyToken,\r\n sellAmountStr,\r\n slippage,\r\n fromAddress,\r\n toAddress,\r\n apiBase = DEFAULT_API_BASE,\r\n } = params;\r\n\r\n const truncated = truncateToTokenDecimals(\r\n sellAmountStr || \"0\",\r\n sellToken.decimals\r\n );\r\n let fromAmount: bigint;\r\n try {\r\n fromAmount = parseUnits(truncated, sellToken.decimals);\r\n } catch {\r\n setButtonState(\"swap\");\r\n return;\r\n }\r\n\r\n if (fromAmount <= 0n) {\r\n setButtonState(\"swap\");\r\n return;\r\n }\r\n\r\n setButtonState(\"finding\");\n setQuote(null);\n setTxData(null);\n setGasPriceRaw(undefined);\n setGasLimitRaw(undefined);\n\r\n const toAddr =\r\n toAddress && toAddress !== \"\" ? toAddress : undefined;\r\n\r\n fetchQuote(\r\n {\r\n originChainId: sellNetworkId,\r\n destinationChainId: buyNetworkId,\r\n originCurrency: sellToken.contractAddress,\r\n destinationCurrency: buyToken.contractAddress,\r\n amount: fromAmount.toString(),\r\n senderAddress: fromAddress,\r\n receiverAddress: toAddr,\r\n slippage: slippage ?? 0.005,\r\n },\r\n apiBase\r\n )\r\n .then((response) => {\n if (requestId !== requestIdRef.current) return;\n setQuote(response);\n\n const gasBreakdown = response?.fees?.breakdown?.find(\n (b: any) => b.type === \"gas\"\n );\r\n if (gasBreakdown) {\r\n setGasLimitRaw(String(gasBreakdown.amount));\r\n if (gasBreakdown.gasPrice !== undefined) {\r\n setGasPriceRaw(String(gasBreakdown.gasPrice));\r\n }\r\n }\r\n if (response?.calldata) {\r\n const rawOutput = response.outputAmount ?? \"0\";\r\n const toAmountNumber = String(rawOutput).includes(\".\")\r\n ? Number(rawOutput)\r\n : Number(\r\n parseToAmount(\r\n String(rawOutput),\r\n buyToken.decimals\r\n )\r\n );\r\n const readable = toAmountNumber\r\n .toFixed(buyToken.decimals)\r\n .replace(/\\.?0+$/, \"\");\r\n setBuyAmount(readable);\r\n setBuyAmountForInput(readable);\r\n\r\n const totalFeesAmount = Number(\r\n response.fees?.total?.amount || \"0\"\r\n );\r\n const totalFeesDecimals = Number(\r\n response.fees?.total?.decimals ?? 18\r\n );\r\n const gasTokenAmount =\r\n totalFeesAmount / Math.pow(10, totalFeesDecimals);\r\n setGasCostUSD(\r\n gasTokenAmount <= 0\r\n ? null\r\n : gasTokenAmount < 0.01\r\n ? \"$<0.01\"\r\n : `$${gasTokenAmount.toFixed(2)}`\r\n );\r\n\r\n const fromDecimal = parseFloat(\r\n parseToAmount(\r\n response.inputAmount ?? \"0\",\r\n sellToken.decimals\r\n )\r\n );\r\n const toDecimal = parseFloat(\r\n parseToAmount(\r\n response.outputAmount ?? \"0\",\r\n buyToken.decimals\r\n )\r\n );\r\n if (fromDecimal > 0) {\r\n setPrice(Number((toDecimal / fromDecimal).toFixed(3)));\r\n }\r\n\r\n setTxData(response.calldata ?? null);\r\n const isNative =\r\n sellToken.contractAddress ===\r\n \"0x0000000000000000000000000000000000000000\";\r\n setButtonState(isNative ? \"swap\" : \"approve\");\r\n }\r\n })\r\n .catch((err) => {\r\n if (requestId !== requestIdRef.current) return;\r\n if (err?.name === \"AbortError\") return;\r\n\r\n const msg = String(err?.error?.message ?? err?.message ?? \"\");\r\n const statusCode = err?.statusCode ?? err?.status;\r\n\r\n if (\r\n msg.includes(\"No available quotes\") ||\r\n statusCode === 422\r\n ) {\r\n setButtonState(\"no-available-quotes\");\r\n } else if (\r\n msg.includes(\"Invalid toAddress\") ||\r\n msg.includes(\"Invalid fromAddress\")\r\n ) {\r\n setButtonState(\"wrong-address\");\r\n } else if (statusCode === 429 || msg.includes(\"Rate limit\")) {\r\n setButtonState(\"rate-limit\");\r\n } else {\n setButtonState(\"no-available-quotes\");\n }\n\n config.onError?.({\n source: \"quote\",\n message: msg || \"Failed to fetch quote\",\n status: err?.status,\n statusCode,\n error: err,\n });\n });\n },\n [cancelRequest, config]\n );\n\n return {\n quote,\n txData,\n buyAmount,\n buyAmountForInput,\r\n setBuyAmount,\r\n setBuyAmountForInput,\r\n price,\r\n gasCostUSD,\r\n gasPriceRaw,\r\n gasLimitRaw,\r\n buttonState,\r\n setButtonState,\r\n fetchQuote: fetchQuoteRequest,\r\n cancelRequest,\r\n invalidateQuote,\r\n};\r\n}\r\n","import { useCallback, useEffect, useState } from \"react\";\r\n\r\nconst STORAGE_INDEX = \"delora-slippage-selectedIndex\";\r\nconst STORAGE_CUSTOM = \"delora-slippage-customValue\";\r\nconst STORAGE_VALUE = \"delora-slippage-value\";\r\n\r\nconst OPTIONS = [\"Auto\", \"0.1%\", \"0.5%\"];\r\nconst AUTO_SLIPPAGE = 0.005;\r\n\r\nexport function useSlippage() {\r\n const [selectedIndex, setSelectedIndex] = useState<number | null>(0);\r\n const [customValue, setCustomValue] = useState(\"\");\r\n const [slippage, setSlippage] = useState(AUTO_SLIPPAGE);\r\n\r\n useEffect(() => {\r\n const si = localStorage.getItem(STORAGE_INDEX);\r\n const cv = localStorage.getItem(STORAGE_CUSTOM);\r\n if (si !== null) setSelectedIndex(JSON.parse(si));\r\n if (cv) setCustomValue(cv);\r\n }, []);\r\n\r\n const selectOption = useCallback((index: number) => {\r\n setSelectedIndex(index);\r\n setCustomValue(\"\");\r\n localStorage.setItem(STORAGE_INDEX, JSON.stringify(index));\r\n localStorage.setItem(STORAGE_CUSTOM, \"\");\r\n setSlippage(index === 0 ? AUTO_SLIPPAGE : parseFloat(OPTIONS[index].replace(\"%\", \"\")) / 100);\r\n }, []);\r\n\r\n const setCustom = useCallback((value: string) => {\r\n setSelectedIndex(null);\r\n setCustomValue(value);\r\n localStorage.setItem(STORAGE_INDEX, \"null\");\r\n localStorage.setItem(STORAGE_CUSTOM, value);\r\n const num = parseFloat(value.replace(\"%\", \"\"));\r\n if (!isNaN(num) && num <= 49.9) {\r\n setSlippage(num / 100);\r\n }\r\n }, []);\r\n\r\n const save = useCallback(\r\n (value: string): number => {\r\n if (value === \"Auto\") {\r\n const s = AUTO_SLIPPAGE;\r\n setSlippage(s);\r\n localStorage.setItem(STORAGE_VALUE, value);\r\n return s;\r\n }\r\n const val = parseFloat(value.replace(\"%\", \"\"));\r\n if (val > 49.9) throw new Error(\"Slippage is too high!\");\r\n const s = val / 100;\r\n setSlippage(s);\r\n localStorage.setItem(STORAGE_VALUE, value);\r\n return s;\r\n },\r\n []\r\n );\r\n\r\n return {\r\n options: OPTIONS,\r\n selectedIndex,\r\n customValue,\r\n slippage,\r\n selectOption,\r\n setCustom,\r\n save,\r\n };\r\n}\r\n","import { useCallback, useEffect, useRef, useState } from \"react\";\nimport type {\n Token,\n TradeWidgetErrorPayload,\n TradeWidgetTokenSelection,\n} from \"../types\";\nimport { useTradeState } from \"./useTradeState\";\nimport { useTradeApi } from \"./useTradeApi\";\nimport { useSlippage } from \"./useSlippage\";\nimport { DEFAULT_API_BASE } from \"../constants/api\";\r\nimport {\r\n CONSTANT_ETH_ADDRESS,\r\n CONSTANT_SOL_ADDRESS,\r\n CONSTANT_SUI_ADDRESS,\r\n} from \"../constants/api\";\r\n\r\nconst INPUT_DEBOUNCE_MS = 1000;\r\n\r\nfunction limitDecimals(value: string, max: number): string {\r\n if (!value.includes(\".\")) return value;\r\n const [int, dec] = value.split(\".\");\r\n return `${int}.${(dec ?? \"\").slice(0, max)}`;\r\n}\r\n\r\nfunction getAddressForChainType(chainType: string | undefined): string {\r\n if (chainType === \"EVM\") return CONSTANT_ETH_ADDRESS;\r\n if (chainType === \"SVM\") return CONSTANT_SOL_ADDRESS;\r\n return CONSTANT_SUI_ADDRESS;\r\n}\r\n\r\nexport function useTrade(config: {\n apiBase?: string;\n initialSellToken?: TradeWidgetTokenSelection;\n initialBuyToken?: TradeWidgetTokenSelection;\n initialSellNetworkId?: number;\n initialBuyNetworkId?: number;\n lockBuyToken?: boolean;\n lockSellToken?: boolean;\n lockBuyNetwork?: boolean;\n lockSellNetwork?: boolean;\n onError?: (payload: TradeWidgetErrorPayload) => void;\n}) {\n const state = useTradeState({\n apiBase: config.apiBase,\n initialSellToken: config.initialSellToken,\n initialBuyToken: config.initialBuyToken,\n initialSellNetworkId: config.initialSellNetworkId,\n initialBuyNetworkId: config.initialBuyNetworkId,\n lockBuyToken: config.lockBuyToken,\n lockSellToken: config.lockSellToken,\n lockBuyNetwork: config.lockBuyNetwork,\n lockSellNetwork: config.lockSellNetwork,\n onError: config.onError,\n });\n const api = useTradeApi({ onError: config.onError });\n const slippage = useSlippage();\n\n const swapLocked =\n Boolean(config.lockBuyToken) ||\n Boolean(config.lockSellToken) ||\n Boolean(config.lockBuyNetwork) ||\n Boolean(config.lockSellNetwork);\n\r\n const [sellAmountForInput, setSellAmountForInput] = useState(\"\");\r\n const [validatedSellAmount, setValidatedSellAmount] = useState(0);\r\n const [isProcessingInput, setIsProcessingInput] = useState(false);\r\n const debounceRef = useRef<ReturnType<typeof setTimeout> | null>(null);\r\n\r\n const balance = 0;\r\n const balanceBuy = 0;\r\n\r\n const allFieldsReady =\r\n !!state.sellToken &&\r\n !!state.buyToken &&\r\n validatedSellAmount > 0;\r\n\r\n const fetchQuote = useCallback(() => {\r\n if (\r\n !state.networkSell ||\r\n !state.networkBuy ||\r\n !state.sellToken ||\r\n !state.buyToken ||\r\n validatedSellAmount <= 0 ||\r\n isProcessingInput\r\n ) {\r\n return;\r\n }\r\n\r\n const fromAddress = getAddressForChainType(state.networkSell.chainType);\r\n const toAddress = getAddressForChainType(state.networkBuy.chainType);\r\n\r\n api.fetchQuote({\r\n sellNetworkId: state.networkSell.id,\r\n buyNetworkId: state.networkBuy.id,\r\n sellToken: state.sellToken,\r\n buyToken: state.buyToken,\r\n sellAmountStr: sellAmountForInput || \"0\",\r\n slippage: slippage.slippage,\r\n fromAddress,\r\n toAddress,\r\n apiBase: config.apiBase ?? DEFAULT_API_BASE,\r\n });\r\n }, [\r\n state.networkSell,\r\n state.networkBuy,\r\n state.sellToken,\r\n state.buyToken,\r\n validatedSellAmount,\r\n sellAmountForInput,\r\n slippage.slippage,\r\n isProcessingInput,\r\n config.apiBase,\r\n api,\r\n ]);\r\n\r\n useEffect(() => {\r\n if (!allFieldsReady) {\r\n api.cancelRequest();\r\n api.setBuyAmount(\"\");\r\n api.setBuyAmountForInput(\"\");\r\n api.setButtonState(\"swap\");\r\n return;\r\n }\r\n fetchQuote();\r\n // eslint-disable-next-line react-hooks/exhaustive-deps -- fetchQuote excluded to avoid infinite loop (api changes every render)\r\n }, [\r\n allFieldsReady,\r\n state.networkSell?.id,\r\n state.networkBuy?.id,\r\n state.sellToken?.contractAddress,\r\n state.buyToken?.contractAddress,\r\n validatedSellAmount,\r\n sellAmountForInput,\r\n slippage.slippage,\r\n isProcessingInput,\r\n ]);\r\n\r\n useEffect(() => {\r\n if (validatedSellAmount === 0) {\r\n api.setBuyAmount(\"\");\r\n api.setBuyAmountForInput(\"\");\r\n }\r\n }, [validatedSellAmount]);\r\n\r\n const processSellInput = useCallback((value: string) => {\r\n const cleaned = value\r\n .replace(/[^0-9.]/g, \"\")\r\n .replace(/\\.+/g, \".\")\r\n .replace(/^(\\.)/g, \"\");\r\n const limited = limitDecimals(cleaned, 6);\r\n const num = Number(limited);\r\n\r\n setSellAmountForInput(limited);\r\n setValidatedSellAmount(isNaN(num) ? 0 : num);\r\n setIsProcessingInput(true);\r\n api.invalidateQuote();\r\n\r\n if (debounceRef.current) clearTimeout(debounceRef.current);\r\n debounceRef.current = setTimeout(() => {\r\n setIsProcessingInput(false);\r\n debounceRef.current = null;\r\n }, INPUT_DEBOUNCE_MS);\r\n }, [api]);\r\n\r\n const setMaxSellAmount = useCallback(() => {\r\n setSellAmountForInput(String(balance));\r\n setValidatedSellAmount(balance);\r\n setIsProcessingInput(false);\r\n if (allFieldsReady) fetchQuote();\r\n }, [balance, allFieldsReady, fetchQuote]);\r\n\r\n const setSellAmountByPercent = useCallback(\r\n (percent: number) => {\r\n const amount = (balance * percent) / 100;\r\n const limited = limitDecimals(String(amount), 6);\r\n setSellAmountForInput(limited);\r\n setValidatedSellAmount(amount);\r\n setIsProcessingInput(false);\r\n if (allFieldsReady) fetchQuote();\r\n },\r\n [balance, allFieldsReady, fetchQuote]\r\n );\r\n\r\n const swapTokens = useCallback(() => {\n if (swapLocked) return;\n const ts = state.sellToken;\n const tb = state.buyToken;\n if (!ts || !tb) return;\n\r\n const prevSellStr = sellAmountForInput || \"0\";\r\n const prevBuyStr = api.buyAmountForInput || api.buyAmount || \"0\";\r\n\r\n api.cancelRequest();\r\n api.invalidateQuote();\r\n\r\n state.updateNetworkSell(tb.chainId);\r\n state.updateNetworkBuy(ts.chainId);\r\n state.setSellToken(tb);\r\n state.setBuyToken(ts);\r\n\r\n if (prevBuyStr && prevBuyStr !== \"0\" && prevBuyStr !== \"0.0\") {\r\n const limited = limitDecimals(prevBuyStr, 6);\r\n setSellAmountForInput(limited);\r\n setValidatedSellAmount(Number(limited));\r\n } else {\r\n setSellAmountForInput(\"\");\r\n setValidatedSellAmount(0);\r\n }\r\n if (prevSellStr && prevSellStr !== \"0\" && prevSellStr !== \"0.0\") {\r\n api.setBuyAmount(limitDecimals(prevSellStr, 6));\r\n api.setBuyAmountForInput(limitDecimals(prevSellStr, 6));\r\n } else {\r\n api.setBuyAmount(\"\");\n api.setBuyAmountForInput(\"\");\n }\n }, [state, api, sellAmountForInput, swapLocked]);\n\r\n const isSameToken = (a?: Token, b?: Token) =>\r\n !!a && !!b && a.contractAddress === b.contractAddress && a.chainId === b.chainId;\r\n\r\n return {\r\n ...state,\n ...api,\n slippage,\n swapLocked,\n sellAmountForInput,\n setSellAmountForInput,\r\n validatedSellAmount,\r\n processSellInput,\r\n setMaxSellAmount,\r\n setSellAmountByPercent,\r\n swapTokens,\r\n balance,\r\n balanceBuy,\r\n allFieldsReady,\r\n isProcessingInput,\r\n isSameToken,\r\n };\r\n}\r\n","import { useEffect, useLayoutEffect, useRef } from \"react\";\r\n\r\nexport type GlitchTextPreset = \"trade\" | \"form\";\r\n\r\nconst PRESETS = {\r\n trade: {\r\n possibleChars:\r\n \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()_+{}:\\\"<>?|\",\r\n glitchChars: \"!@#$%^&*()_+{}:\\\"<>?|\\\\\",\r\n cyberChars: \"01010101110010101010101110101010\",\r\n animationFrames: 35,\r\n animationSpeed: 12,\r\n },\r\n form: {\r\n possibleChars: \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\",\r\n glitchChars: \"ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\",\r\n cyberChars: \"0123456789\",\r\n animationFrames: 80,\r\n animationSpeed: 25,\r\n },\r\n} as const;\r\n\r\nexport interface UseGlitchTextOptions {\r\n /** Ref to the DOM element to animate */\r\n ref: React.RefObject<HTMLElement | null>;\r\n /** Final text to display (triggers animation when it changes) */\r\n text: string;\r\n /** Whether to run the animation (e.g. when buy token selected and sell amount > 0) */\r\n enabled: boolean;\r\n /** Preset: \"trade\" for buy amount style, \"form\" for title style */\r\n preset?: GlitchTextPreset;\r\n /** Called when animation starts (use to hide React children to avoid conflicts) */\r\n onAnimationStart?: () => void;\r\n /** Called when animation ends */\r\n onAnimationEnd?: () => void;\r\n}\r\n\r\n/**\r\n * Custom hook that animates text with a glitch/cyber effect.\r\n * Matches the Angular TradeComponent.animateText and FormPageComponent.animateTitle behavior.\r\n */\r\nexport function useGlitchText({\r\n ref,\r\n text,\r\n enabled,\r\n preset = \"trade\",\r\n onAnimationStart,\r\n onAnimationEnd,\r\n}: UseGlitchTextOptions): void {\r\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\r\n\r\n // Set static content before paint when not animating\r\n useLayoutEffect(() => {\r\n const el = ref.current;\r\n if (el && (!enabled || !text || text === \"0\" || text === \"0.0\")) {\r\n el.textContent = text || \"0.0\";\r\n }\r\n }, [ref, text, enabled]);\r\n\r\n useEffect(() => {\r\n const element = ref.current;\r\n if (!element) return;\r\n\r\n if (!enabled || !text || text === \"0\" || text === \"0.0\") {\r\n element.textContent = text || \"0.0\";\r\n return;\r\n }\r\n\r\n const { possibleChars, glitchChars, cyberChars, animationFrames, animationSpeed } =\r\n PRESETS[preset];\r\n\r\n const finalText = String(text);\r\n\r\n if (timeoutRef.current) {\r\n clearTimeout(timeoutRef.current);\r\n timeoutRef.current = null;\r\n }\r\n\r\n let frame = 0;\r\n const glitchStates = Array(finalText.length).fill(false);\r\n const resolvedChars = Array(finalText.length).fill(false);\r\n\r\n const animate = () => {\r\n if (!ref.current) return;\r\n\r\n if (frame >= animationFrames) {\r\n ref.current.textContent = finalText;\r\n timeoutRef.current = null;\r\n onAnimationEnd?.();\r\n return;\r\n }\r\n\r\n if (frame === 0) onAnimationStart?.();\r\n\r\n let result = \"\";\r\n const progress = frame / animationFrames;\r\n const easedProgress = Math.pow(progress, 0.6);\r\n const resolvedCount = Math.floor(finalText.length * easedProgress);\r\n\r\n for (let i = 0; i < resolvedCount; i++) {\r\n if (!resolvedChars[i]) resolvedChars[i] = true;\r\n }\r\n\r\n if (frame % 2 === 0) {\r\n const glitchProbability = 0.05 + progress * 0.1;\r\n for (let i = 0; i < finalText.length; i++) {\r\n if (Math.random() < glitchProbability) glitchStates[i] = !glitchStates[i];\r\n }\r\n }\r\n\r\n for (let i = 0; i < finalText.length; i++) {\r\n if (resolvedChars[i]) {\r\n if (\r\n glitchStates[i] &&\r\n frame < animationFrames * 0.95 &&\r\n finalText[i] !== \" \"\r\n ) {\r\n if (Math.random() < 0.3) {\r\n result += cyberChars[Math.floor(Math.random() * cyberChars.length)];\r\n } else {\r\n result += glitchChars[Math.floor(Math.random() * glitchChars.length)];\r\n }\r\n } else {\r\n result += finalText[i];\r\n }\r\n } else {\r\n if (finalText[i] === \" \") {\r\n result += \" \";\r\n } else {\r\n const rand = Math.random();\r\n if (rand < 0.2) {\r\n result += glitchChars[Math.floor(Math.random() * glitchChars.length)];\r\n } else if (rand < 0.4) {\r\n result += cyberChars[Math.floor(Math.random() * cyberChars.length)];\r\n } else {\r\n result += possibleChars[Math.floor(Math.random() * possibleChars.length)];\r\n }\r\n }\r\n }\r\n }\r\n\r\n ref.current.textContent = result;\r\n frame++;\r\n\r\n let currentSpeed = animationSpeed;\r\n if (progress < 0.3) currentSpeed = animationSpeed * 0.8;\r\n else if (progress > 0.7) currentSpeed = animationSpeed * 0.7;\r\n else currentSpeed = animationSpeed * 1.2;\r\n\r\n timeoutRef.current = setTimeout(animate, currentSpeed);\r\n };\r\n\r\n // Defer to next tick so we run after React has committed; avoids React overwriting our content\r\n const startId = setTimeout(() => {\r\n if (ref.current) animate();\r\n }, 0);\r\n\r\n return () => {\r\n clearTimeout(startId);\r\n if (timeoutRef.current) {\r\n clearTimeout(timeoutRef.current);\r\n timeoutRef.current = null;\r\n }\r\n onAnimationEnd?.();\r\n };\r\n }, [ref, text, enabled, preset]);\r\n}\r\n","/**\r\n * Resolves relative image URLs (e.g. /img/tokens/weth.png) to absolute URLs\r\n * using the provided base URL.\r\n */\r\nexport function resolveImageUrl(\r\n url: string | undefined,\r\n baseUrl: string\r\n): string {\r\n if (!url) return \"\";\r\n if (url.startsWith(\"http://\") || url.startsWith(\"https://\") || url.startsWith(\"data:\")) {\r\n return url;\r\n }\r\n const base = baseUrl?.replace(/\\/$/, \"\") ?? \"\";\r\n return url.startsWith(\"/\") ? `${base}${url}` : `${base}/${url}`;\r\n}\r\n","export default \"data:image/svg+xml,%3csvg%20width='27'%20height='27'%20viewBox='0%200%2027%2027'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M7.42142%203.29834C6.61961%203.29834%205.85064%203.61686%205.28367%204.18383C4.71671%204.75079%204.39819%205.51976%204.39819%206.32158V22.5371H4.12335C3.90467%2022.5371%203.69495%2022.624%203.54032%2022.7786C3.3857%2022.9332%203.29883%2023.143%203.29883%2023.3616C3.29883%2023.5803%203.3857%2023.79%203.54032%2023.9447C3.69495%2024.0993%203.90467%2024.1862%204.12335%2024.1862H18.9647C19.1834%2024.1862%2019.3931%2024.0993%2019.5477%2023.9447C19.7023%2023.79%2019.7892%2023.5803%2019.7892%2023.3616C19.7892%2023.143%2019.7023%2022.9332%2019.5477%2022.7786C19.3931%2022.624%2019.1834%2022.5371%2018.9647%2022.5371H18.6899V20.555C19.1499%2020.7915%2019.6631%2020.9058%2020.1801%2020.8868C20.697%2020.8679%2021.2005%2020.7163%2021.642%2020.4468C22.0835%2020.1772%2022.4484%2019.7987%2022.7015%2019.3475C22.9546%2018.8963%2023.0874%2018.3877%2023.0873%2017.8703V11.4523C23.0873%2010.7981%2022.8751%2010.1617%2022.4826%209.63834L21.2733%208.02558C21.1421%207.85064%2020.9468%207.73499%2020.7303%207.70406C20.5139%207.67314%2020.294%207.72947%2020.119%207.86068C19.9441%207.99189%2019.8284%208.18721%2019.7975%208.40369C19.7666%208.62017%2019.8229%208.84007%2019.9541%209.01501L21.1634%2010.6278C21.3415%2010.8652%2021.4383%2011.1555%2021.4383%2011.4523V17.8703C21.4383%2018.0501%2021.4028%2018.2281%2021.3341%2018.3941C21.2653%2018.5602%2021.1645%2018.7111%2021.0374%2018.8382C20.9103%2018.9653%2020.7594%2019.0661%2020.5933%2019.1349C20.4273%2019.2036%2020.2493%2019.239%2020.0695%2019.239C19.8898%2019.239%2019.7118%2019.2036%2019.5458%2019.1349C19.3797%2019.0661%2019.2288%2018.9653%2019.1017%2018.8382C18.9746%2018.7111%2018.8738%2018.5602%2018.805%2018.3941C18.7363%2018.2281%2018.7008%2018.0501%2018.7008%2017.8703V15.941C18.6999%2015.8964%2018.6962%2015.852%2018.6899%2015.8079V6.32158C18.6899%205.92456%2018.6117%205.53143%2018.4597%205.16463C18.3078%204.79784%2018.0851%204.46456%2017.8044%204.18383C17.5236%203.90309%2017.1904%203.6804%2016.8236%203.52847C16.4568%203.37654%2016.0636%203.29834%2015.6666%203.29834H7.42142ZM7.69626%207.42094C7.69626%207.20226%207.78313%206.99254%207.93776%206.83791C8.09239%206.68329%208.30211%206.59642%208.52078%206.59642H14.5673C14.7859%206.59642%2014.9957%206.68329%2015.1503%206.83791C15.3049%206.99254%2015.3918%207.20226%2015.3918%207.42094V11.2687C15.3918%2011.4874%2015.3049%2011.6971%2015.1503%2011.8517C14.9957%2012.0063%2014.7859%2012.0932%2014.5673%2012.0932H8.52078C8.30211%2012.0932%208.09239%2012.0063%207.93776%2011.8517C7.78313%2011.6971%207.69626%2011.4874%207.69626%2011.2687V7.42094Z'%20fill='white'/%3e%3c/svg%3e\"","import { useRef } from \"react\";\r\nimport type { Token } from \"../types\";\r\nimport type { ButtonState } from \"../hooks/useTradeApi\";\r\nimport { useGlitchText } from \"../hooks/useGlitchText\";\r\nimport { resolveImageUrl } from \"../utils/resolveImageUrl\";\r\nimport gasPumpIcon from \"../assets/trade/gas-pump.svg\";\r\n\r\ninterface TradeWindowProps {\n sellToken: Token | undefined;\r\n buyToken: Token | undefined;\r\n networkSellLogo?: string;\r\n networkBuyLogo?: string;\r\n assetBaseUrl: string;\r\n sellAmountForInput: string;\r\n buyAmountForInput: string;\r\n onSellAmountChange: (value: string) => void;\r\n onSellInputProcess: (value: string) => void;\r\n onOpenSellToken: () => void;\r\n onOpenBuyToken: () => void;\r\n onSwapTokens: () => void;\r\n onRefresh: () => void;\r\n onOpenSettings: () => void;\r\n balance: number;\r\n balanceBuy: number;\r\n sellPriceUsd: string;\r\n buyPriceUsd: string;\r\n onMaxClick: () => void;\r\n onSet50Percent: () => void;\r\n onSet25Percent: () => void;\r\n buttonState: ButtonState;\r\n txData: object | null | undefined;\r\n loading: boolean;\r\n price: number;\r\n gasCostUSD: string | null;\r\n truncateTo6Decimals: (n: number) => number;\n isWalletConnected?: boolean;\n onConnectWallet?: () => void;\n onAction?: () => void;\n swapDisabled?: boolean;\n sellTokenLocked?: boolean;\n buyTokenLocked?: boolean;\n}\n\r\nconst BUTTON_LABELS: Record<ButtonState, string> = {\r\n swap: \"Swap\",\r\n finding: \"Finding Routes...\",\r\n approve: \"Approve\",\r\n wallet: \"Continue in your wallet...\",\r\n insufficient: \"Insufficient balance\",\r\n \"no-available-quotes\": \"No routes available\",\r\n \"wrong-address\": \"Wrong address\",\r\n \"rate-limit\": \"Try later\",\r\n};\r\n\r\nexport function TradeWindow(props: TradeWindowProps) {\r\n const {\r\n sellToken,\r\n buyToken,\r\n networkSellLogo,\r\n networkBuyLogo,\r\n assetBaseUrl,\r\n sellAmountForInput,\r\n buyAmountForInput,\r\n onSellAmountChange,\r\n onSellInputProcess,\r\n onOpenSellToken,\r\n onOpenBuyToken,\r\n onSwapTokens,\r\n onRefresh,\r\n onOpenSettings,\r\n balance,\r\n balanceBuy,\r\n sellPriceUsd,\r\n buyPriceUsd,\r\n onMaxClick,\r\n onSet50Percent,\r\n onSet25Percent,\r\n buttonState,\r\n txData,\r\n loading,\r\n price,\r\n gasCostUSD,\r\n truncateTo6Decimals,\n isWalletConnected = false,\n onConnectWallet,\n onAction,\n swapDisabled = false,\n sellTokenLocked = false,\n buyTokenLocked = false,\n } = props;\n\r\n const isSwapActive = !!sellAmountForInput && Number(sellAmountForInput) > 0;\r\n const isErrorState =\r\n buttonState === \"insufficient\" ||\r\n buttonState === \"no-available-quotes\" ||\r\n buttonState === \"wrong-address\";\r\n const isDisabled =\n !isSwapActive ||\n loading ||\n (isWalletConnected && !txData && buttonState !== \"finding\") ||\n buttonState === \"no-available-quotes\" ||\n buttonState === \"insufficient\";\n const isActionDisabled = isWalletConnected ? isDisabled : false;\n\r\n const buyAmountRef = useRef<HTMLParagraphElement>(null);\r\n const refreshIconRef = useRef<HTMLSpanElement>(null);\r\n const refreshRotationRef = useRef(0);\r\n\r\n const handleRefresh = () => {\r\n onRefresh();\r\n refreshRotationRef.current += 1;\r\n const el = refreshIconRef.current;\r\n if (el)\r\n el.style.transform = `rotate(${refreshRotationRef.current * -720}deg)`;\r\n };\r\n\r\n useGlitchText({\r\n ref: buyAmountRef,\r\n text: buyAmountForInput || \"0.0\",\r\n enabled:\r\n !!buyToken?.symbol &&\r\n Number(sellAmountForInput) > 0 &&\r\n !!buyAmountForInput &&\r\n buyAmountForInput !== \"0\" &&\r\n buyAmountForInput !== \"0.0\",\r\n preset: \"trade\",\r\n });\r\n\r\n const handleKeyDown = (e: React.KeyboardEvent) => {\r\n const replaceKeys = [\",\", \".\", \"/\", \"б\", \"ю\"];\r\n if (replaceKeys.includes(e.key)) {\r\n e.preventDefault();\r\n const input = e.target as HTMLInputElement;\r\n if (input.value.includes(\".\")) return;\r\n const pos = input.selectionStart ?? input.value.length;\r\n const newValue = input.value.slice(0, pos) + \".\" + input.value.slice(pos);\r\n onSellAmountChange(newValue);\r\n onSellInputProcess(newValue);\r\n }\r\n };\r\n\r\n const actionButtonClassName = isWalletConnected\r\n ? `dw-w-full dw-h-[38px] dw-rounded-[var(--dw-radius)] dw-border dw-text-[13px] dw-font-normal dw-transition-colors ${\r\n isErrorState\r\n ? \"dw-bg-[var(--dw-danger)] dw-border-[var(--dw-danger)] dw-text-white\"\r\n : isDisabled\r\n ? \"dw-bg-[var(--dw-surface-hover)] dw-border-[var(--dw-border)] dw-text-[var(--dw-muted)]\"\r\n : \"dw-bg-[var(--dw-accent)] dw-border-[var(--dw-accent)] dw-text-white hover:dw-bg-[var(--dw-accent-hover)] hover:dw-border-[var(--dw-accent-hover)]\"\r\n }`\r\n : \"dw-w-full dw-h-[38px] dw-rounded-[var(--dw-radius)] dw-border dw-border-[var(--dw-accent)] dw-text-[13px] dw-font-normal dw-transition-colors dw-bg-[var(--dw-accent)] dw-text-white hover:dw-bg-[var(--dw-accent-hover)] hover:dw-border-[var(--dw-accent-hover)]\";\r\n\r\n return (\r\n <div className=\"dw-widget-shell dw-elevated-surface dw-flex dw-flex-col dw-gap-1.5 dw-font-mono\">\r\n <div className=\"dw-flex dw-items-center dw-justify-between dw-mb-0.5\">\r\n <h3 className=\"dw-text-[14px] dw-font-normal dw-text-[var(--dw-fg)]\">\r\n Trade\r\n </h3>\r\n <div className=\"dw-flex dw-items-center dw-gap-1\">\r\n <button\r\n type=\"button\"\r\n className=\"dw-icon-button dw-w-4 dw-h-4 dw-flex dw-items-center dw-justify-center dw-rounded-[4px] dw-cursor-pointer dw-opacity-70\"\r\n onMouseDown={handleRefresh}\r\n aria-label=\"Refresh\"\r\n >\r\n <span\r\n ref={refreshIconRef}\r\n className=\"dw-w-full dw-h-full dw-flex dw-items-center dw-justify-center\"\r\n style={{ transition: \"transform 1s ease-in-out\" }}\r\n >\r\n <RefreshIcon />\r\n </span>\r\n </button>\r\n <button\r\n type=\"button\"\r\n className=\"dw-icon-button dw-w-4 dw-h-4 dw-flex dw-items-center dw-justify-center dw-rounded-[4px] dw-cursor-pointer dw-opacity-70\"\r\n onClick={onOpenSettings}\r\n aria-label=\"Settings\"\r\n >\r\n <SettingsIcon />\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div className=\"dw-relative dw-flex dw-flex-col dw-gap-1.5\">\r\n <button\n type=\"button\"\n className={`dw-widget-section dw-group dw-w-[30px] dw-h-[30px] dw-absolute dw-left-1/2 dw-top-1/2 dw-z-10 dw--translate-x-1/2 dw--translate-y-1/2 dw-flex dw-justify-center dw-items-center ${\n swapDisabled\n ? \"dw-cursor-not-allowed dw-opacity-40\"\n : \"dw-cursor-pointer\"\n }`}\n onClick={onSwapTokens}\n aria-label=\"Swap tokens\"\n disabled={swapDisabled}\n >\n <SwapArrowsBlock />\n </button>\n\r\n <AssetSection\r\n label=\"From\"\r\n labelTone=\"danger\"\r\n token={sellToken}\r\n networkLogo={networkSellLogo}\r\n assetBaseUrl={assetBaseUrl}\r\n amount={sellAmountForInput}\r\n amountPlaceholder=\"0.0\"\r\n usdValue={sellPriceUsd || \"$0.000\"}\r\n balance={truncateTo6Decimals(balance)}\n onOpenToken={onOpenSellToken}\n tokenLocked={sellTokenLocked}\n onInputChange={(value) => {\n onSellAmountChange(value);\n onSellInputProcess(value);\n }}\r\n onKeyDown={handleKeyDown}\r\n amountToneClassName={\r\n isErrorState\r\n ? \"dw-text-[var(--dw-danger)]\"\r\n : \"dw-text-[var(--dw-fg)]\"\r\n }\r\n quickActions={\r\n <>\r\n <ActionLink label=\"MAX\" onClick={onMaxClick} />\r\n <ActionLink label=\"50%\" onClick={onSet50Percent} />\r\n <ActionLink label=\"25%\" onClick={onSet25Percent} />\r\n </>\r\n }\r\n />\r\n\r\n <AssetSection\r\n label=\"To\"\r\n labelTone=\"success\"\r\n token={buyToken}\r\n networkLogo={networkBuyLogo}\r\n assetBaseUrl={assetBaseUrl}\r\n amount={buyAmountForInput || \"0.0\"}\r\n usdValue={buyPriceUsd || \"$0.000\"}\r\n balance={truncateTo6Decimals(balanceBuy)}\n onOpenToken={onOpenBuyToken}\n tokenLocked={buyTokenLocked}\n amountRef={buyAmountRef}\n readOnly\n />\n\r\n <button\r\n type=\"button\"\n className={actionButtonClassName}\n disabled={isActionDisabled}\n onClick={isWalletConnected ? onAction : onConnectWallet}\n >\n {isWalletConnected ? BUTTON_LABELS[buttonState] : \"Connect Wallet\"}\n </button>\n\r\n <div className=\"dw-flex dw-items-center dw-justify-between dw-min-h-[12px] dw-px-0.5\">\r\n <div className=\"dw-flex dw-items-center dw-gap-1 dw-min-w-0\">\r\n <img src={gasPumpIcon} alt=\"\" className=\"dw-w-[10px] dw-h-[10px]\" />\r\n <p className=\"dw-font-normal dw-text-[10px] dw-text-[var(--dw-fg)]\">\r\n {txData ? (gasCostUSD ?? \"—\") : \"$<0.01\"}\r\n </p>\r\n </div>\r\n <p className=\"dw-font-normal dw-text-[10px] dw-text-[var(--dw-text-subtle)] dw-truncate dw-ml-3\">\r\n {txData && sellToken?.symbol && buyToken?.symbol\r\n ? `1 ${sellToken.symbol} = ${price} ${buyToken.symbol}`\r\n : \"\"}\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nfunction AssetSection(props: {\r\n label: string;\r\n labelTone: \"danger\" | \"success\";\r\n token: Token | undefined;\r\n networkLogo?: string;\r\n assetBaseUrl: string;\r\n amount: string;\r\n amountPlaceholder?: string;\r\n usdValue: string;\r\n balance: number;\r\n onOpenToken: () => void;\r\n onInputChange?: (value: string) => void;\r\n onKeyDown?: (e: React.KeyboardEvent) => void;\n amountToneClassName?: string;\n amountRef?: React.RefObject<HTMLParagraphElement>;\n readOnly?: boolean;\n quickActions?: React.ReactNode;\n tokenLocked?: boolean;\n}) {\n const {\r\n label,\r\n labelTone,\r\n token,\r\n networkLogo,\r\n assetBaseUrl,\r\n amount,\r\n amountPlaceholder = \"0.0\",\r\n usdValue,\r\n balance,\r\n onOpenToken,\r\n onInputChange,\r\n onKeyDown,\r\n amountToneClassName = \"dw-text-[var(--dw-fg)]\",\r\n amountRef,\n readOnly = false,\n quickActions,\n tokenLocked = false,\n } = props;\n\r\n return (\r\n <div className=\"dw-widget-section dw-relative dw-flex dw-flex-col dw-w-full dw-min-h-[91px] dw-px-4 dw-py-3\">\r\n <div className=\"dw-flex dw-items-start dw-justify-between\">\r\n <div className=\"dw-flex dw-flex-col dw-gap-2\">\r\n <h6\r\n className={`dw-font-normal dw-text-[11px] ${\r\n labelTone === \"danger\"\r\n ? \"dw-text-[var(--dw-danger)]\"\r\n : \"dw-text-[var(--dw-success)]\"\r\n }`}\r\n >\r\n {label}\r\n </h6>\r\n <button\n type=\"button\"\n className={`dw-flex dw-items-center dw-gap-2 ${\n tokenLocked ? \"dw-cursor-not-allowed dw-opacity-60\" : \"dw-cursor-pointer\"\n }`}\n onClick={onOpenToken}\n disabled={tokenLocked}\n >\n <TokenIcon\r\n token={token}\r\n networkLogo={networkLogo}\r\n assetBaseUrl={assetBaseUrl}\r\n sizeClassName=\"dw-w-[28px] dw-h-[28px]\"\r\n badgeClassName=\"dw-w-[10px] dw-h-[10px]\"\r\n />\r\n <p className=\"dw-font-normal dw-text-[13px] dw-text-[var(--dw-fg)]\">\r\n {token?.symbol ?? \"Select\"}\r\n </p>\r\n <span className=\"dw-text-[10px] dw-text-[var(--dw-text-subtle)]\">\n {tokenLocked ? \"LOCK\" : \"▼\"}\n </span>\n </button>\n </div>\r\n <div className=\"dw-flex dw-flex-col dw-items-end dw-min-w-0\">\r\n {readOnly ? (\r\n <p\r\n ref={amountRef}\r\n className={`dw-font-normal dw-text-[20px] dw-min-w-[70px] dw-max-w-[124px] dw-text-right dw-truncate ${amountToneClassName}`}\r\n >\r\n {amount || amountPlaceholder}\r\n </p>\r\n ) : (\r\n <input\r\n type=\"text\"\r\n placeholder={amountPlaceholder}\r\n value={amount}\r\n onChange={(e) => onInputChange?.(e.target.value)}\r\n onKeyDown={onKeyDown}\r\n className={`dw-h-[28px] dw-w-[124px] dw-font-normal dw-text-right dw-bg-transparent dw-outline-none dw-border-none dw-text-[20px] ${amountToneClassName}`}\r\n />\r\n )}\r\n <p className=\"dw-mt-1 dw-text-[10px] dw-text-[var(--dw-text-subtle)]\">\r\n {usdValue}\r\n </p>\r\n </div>\r\n </div>\r\n <div className=\"dw-w-full dw-flex dw-items-center dw-justify-between dw-mt-2 dw-min-h-[12px]\">\r\n <div className=\"dw-flex dw-gap-2 dw-items-center dw-min-w-0\">\r\n <p className=\"dw-font-normal dw-text-[10px] dw-text-[var(--dw-text-subtle)]\">\r\n {balance}\r\n </p>\r\n {quickActions}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nfunction ActionLink(props: { label: string; onClick: () => void }) {\r\n return (\r\n <button\r\n type=\"button\"\r\n className=\"dw-font-normal dw-text-[10px] dw-text-[var(--dw-fg)] dw-cursor-pointer hover:dw-text-[var(--dw-text-subtle)]\"\r\n onClick={props.onClick}\r\n >\r\n {props.label}\r\n </button>\r\n );\r\n}\r\n\r\nfunction TokenIcon(props: {\r\n token: Token | undefined;\r\n networkLogo?: string;\r\n assetBaseUrl: string;\r\n sizeClassName?: string;\r\n badgeClassName?: string;\r\n}) {\r\n const {\r\n token,\r\n networkLogo,\r\n assetBaseUrl,\r\n sizeClassName = \"dw-w-[28px] dw-h-[28px]\",\r\n badgeClassName = \"dw-w-[10px] dw-h-[10px]\",\r\n } = props;\r\n\r\n if (!token) {\r\n return (\r\n <div\r\n className={`${sizeClassName} dw-rounded-full dw-bg-[var(--dw-surface-hover)] dw-flex dw-items-center dw-justify-center dw-border dw-border-[var(--dw-border)]`}\r\n >\r\n <span className=\"dw-text-[10px] dw-font-normal dw-text-[var(--dw-fg)]\">\r\n ?\r\n </span>\r\n </div>\r\n );\r\n }\r\n\r\n const tokenImg = resolveImageUrl(token.imageUrl, assetBaseUrl);\r\n const netImg = resolveImageUrl(networkLogo, assetBaseUrl);\r\n\r\n return (\r\n <div className=\"dw-relative\">\r\n <div\r\n className={`${sizeClassName} dw-rounded-full dw-bg-cover dw-flex dw-items-center dw-justify-center dw-border dw-border-[var(--dw-border)] dw-bg-[var(--dw-surface-hover)]`}\r\n style={{ backgroundImage: tokenImg ? `url(${tokenImg})` : \"none\" }}\r\n >\r\n {!tokenImg && (\r\n <span className=\"dw-text-[10px] dw-font-normal dw-text-[var(--dw-fg)]\">\r\n {token.symbol[0]?.toUpperCase() ?? \"?\"}\r\n </span>\r\n )}\r\n </div>\r\n {netImg && (\r\n <div\r\n className={`dw-absolute dw--bottom-0.5 dw--left-0.5 ${badgeClassName} dw-rounded-full dw-bg-cover dw-border dw-border-[var(--dw-surface)]`}\r\n style={{ backgroundImage: `url(${netImg})` }}\r\n />\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nfunction SwapArrowsBlock() {\r\n return (\r\n <div className=\"dw-flex dw-flex-row dw-justify-center dw-items-center dw-w-[14px] dw-h-[14px] dw-gap-0\">\r\n <svg\r\n className=\"dw-w-[7px] dw-h-[10px] dw-flex-shrink-0 dw-transition-[transform] dw-duration-200 group-hover:dw-translate-y-[-1px] dw-text-[var(--dw-fg)]\"\r\n width=\"16\"\r\n height=\"24\"\r\n viewBox=\"0 0 16 24\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <g clipPath=\"url(#clip0_6875_213)\">\r\n <path\r\n d=\"M7.74569 1.94531V22.1232M7.74569 1.94531L13.9543 8.15389M7.74569 1.94531L1.53711 8.15389\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2.1\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_6875_213\">\r\n <rect width=\"15.6814\" height=\"23.5221\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n\r\n <svg\r\n className=\"dw-w-[7px] dw-h-[10px] dw-flex-shrink-0 dw-transition-[transform] dw-duration-200 group-hover:dw-translate-y-[1px] dw-text-[var(--dw-fg)]\"\r\n width=\"16\"\r\n height=\"24\"\r\n viewBox=\"0 0 16 24\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <g clipPath=\"url(#clip0_6875_215)\">\r\n <path\r\n d=\"M7.74569 21.5769V1.39901M7.74569 21.5769L13.9543 15.3683M7.74569 21.5769L1.53711 15.3683\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2.1\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_6875_215\">\r\n <rect\r\n width=\"15.6814\"\r\n height=\"23.5221\"\r\n fill=\"white\"\r\n transform=\"matrix(1 0 0 -1 0 23.5222)\"\r\n />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </div>\r\n );\r\n}\r\n\r\nfunction RefreshIcon() {\r\n return (\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <path\r\n d=\"M20 12a8 8 0 1 1-2.34-5.66M20 4v5h-5\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"1.8\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction SettingsIcon() {\r\n return (\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <path\r\n d=\"M10 6h10M4 6h2M14 18h6M4 18h6M7 6a1 1 0 1 1-2 0 1 1 0 0 1 2 0Zm8 12a1 1 0 1 1-2 0 1 1 0 0 1 2 0Zm5-6H10M4 12h2m6 0a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"1.6\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n />\r\n </svg>\r\n );\r\n}\r\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAHaSURBVHgB7Zj/dYIwEMcPX/+vGzRuYDewG3QD7QS1G3SDugF0go4AG+gG4ASywfUi4XnEBAkJ4h983ruXQMjlm19ADuDBicARRJxTMgdHoigqIDRSDNmWLCbL0Z+YTEAIyNE72QmHYd1VR2QR90nJzlKnVOaK0K7faNozcEVOgdbbnOybbInV+uuF8pszv/su9SKDo5iSjbosyF6pp6WtUXBDkP3BZZO5j6LWy5VWJkfhB8NsmHp24s4dVdNYc9LK1jjcppEYN86Tds3X2IGPHCWJoX4B/TC9SxNq59g65fTAhvUoZvdTbE7LCj02jPI5V35y5ju9VWnLHt4xRxwBAcHrt0aj4zPteV5Y79wlu5eF/mQpfxm7teLlM7iNYPkChuHI8q0jaEJYHIWktLTXSeA9sH46H0WglUmgL5NAXyaBvkwCfZkE+qIL5N9Erx/SUOgCDyy/Dv1z2oeGQHUeqEXKEZS/4C8wIqY1+MXyAi5nZMndp/1KoBrFD8vzzzAMguULXmDcxSQyoWRB9tviKCR8GRXgwtinuq5O0rHOxZ0irFjFaEyH6r6hOFuUdtH7WIvNqENoZMxnA75gtV5kDGWPYcixij0KW5vOQXRNcK+A+rnhIYLqY/APHpl3hlZpXEMAAAAASUVORK5CYII=\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAkCAYAAADhAJiYAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAERSURBVHgB7dShDoMwEAbgK0EgJiYmEAgEAjGx93+KCR4AMTkxMYEgYXdJSbqOo4WVgrg/uRRo034pTQEkEolk3yiInGEYMmyuWNS2SqmH2Z9AxGjMDeuElWKV9phoIAOTGZ972APEYDqsuz128zM0h8Hz00FMEGLorIwH2InZFKQxtDOpL2Yz0FoMJeEm1P8+KoaiJiassCn0K11cLUTCUKZ2qDCeS1ykhEgYDvSy3p2oUBgO1GC9wRMVEkNRzCI0Od0fZ6vr60zhuBybKhSGBRkL1tjkMIHSmNrqo51t1mKcoBnUE+sCvxjamR7+iNfFyKCCY7xBDlQwzCIQgwqKWQzSqPEmp/uqCYmRSCSSI+QD+pyUWCGG+FwAAAAASUVORK5CYII=\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAwCAYAAAAhOEsMAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAABZSURBVHgB7c7RCQAgCEVRa5JGbONGKT8KgtQsCPp4FwQRDkh0WRhL5eigSC/jZxJPqVOnqLiggNIWSqjfdaghE1pIhTskQg9aoBdJMHvQAidsIoQQQgj9VgNcp//kKP+JUgAAAABJRU5ErkJggg==\"","import { useState, useMemo, useCallback } from \"react\";\r\nimport { ethers } from \"ethers\";\r\nimport type { Network, Token } from \"../types\";\r\nimport { resolveImageUrl } from \"../utils/resolveImageUrl\";\r\nimport copyHoverIcon from \"../assets/trade/copy-hover.png\";\r\nimport copyCheckIcon from \"../assets/trade/copy-check.png\";\r\nimport linkIcon from \"../assets/trade/link.png\";\r\n\r\ninterface SelectTokenWindowProps {\r\n mode: \"sell\" | \"buy\";\r\n networks: Network[];\r\n selectedNetworkId: number | undefined;\r\n selectedToken: Token | undefined;\r\n excludeToken: Token | undefined;\r\n getAllTokensForNetwork: (id: number) => Token[];\r\n getNetworkById: (id: number) => Network | undefined;\r\n onSelectToken: (t: Token) => void;\r\n onSelectNetwork: (n: Network) => void;\r\n onOpenNetworkSelector?: () => void;\r\n onClose: () => void;\r\n assetBaseUrl: string;\r\n /** Networks to display in the first row (first 6 or 5+selected). */\r\n displayedNetworks: Network[];\r\n /** Count of networks not in displayedNetworks. */\r\n additionalNetworksCount: number;\n networkSelectionLocked?: boolean;\n}\n\r\nexport function SelectTokenWindow(props: SelectTokenWindowProps) {\r\n const {\r\n mode,\r\n selectedNetworkId,\r\n selectedToken,\r\n excludeToken,\r\n getAllTokensForNetwork,\r\n getNetworkById,\r\n onSelectToken,\r\n onSelectNetwork,\r\n onOpenNetworkSelector,\r\n onClose,\r\n assetBaseUrl,\n displayedNetworks,\n additionalNetworksCount,\n networkSelectionLocked = false,\n } = props;\n\r\n const [search, setSearch] = useState(\"\");\r\n const [copiedAddresses, setCopiedAddresses] = useState<Set<string>>(\r\n new Set(),\r\n );\r\n\r\n const isNativeToken = useCallback(\r\n (token: Token) => {\r\n const network = getNetworkById(token.chainId);\r\n if (!network) return false;\r\n if (network.chainType === \"SVM\") return token.symbol === \"SOL\";\r\n if (network.chainType === \"MVM\") return token.symbol === \"SUI\";\r\n return token.contractAddress === ethers.ZeroAddress;\r\n },\r\n [getNetworkById],\r\n );\r\n\r\n const copyToClipboard = useCallback(\r\n (address: string, e: React.MouseEvent) => {\r\n e.stopPropagation();\r\n navigator.clipboard\r\n .writeText(address)\r\n .then(() => {\r\n setCopiedAddresses((prev) => new Set(prev).add(address));\r\n setTimeout(() => {\r\n setCopiedAddresses((prev) => {\r\n const next = new Set(prev);\r\n next.delete(address);\r\n return next;\r\n });\r\n }, 2000);\r\n })\r\n .catch(() => console.error(\"Failed to copy to clipboard\"));\r\n },\r\n [],\r\n );\r\n\r\n const tokens = useMemo(() => {\r\n const networkId = selectedNetworkId ?? displayedNetworks[0]?.id;\r\n if (!networkId) return [];\r\n const all = getAllTokensForNetwork(networkId);\r\n if (!search.trim()) {\r\n return all.filter(\r\n (t) =>\r\n !excludeToken ||\r\n !(\r\n t.contractAddress === excludeToken.contractAddress &&\r\n t.chainId === excludeToken.chainId\r\n ),\r\n );\r\n }\r\n const s = search.toLowerCase();\r\n return all.filter(\r\n (t) =>\r\n (t.symbol?.toLowerCase().includes(s) ||\r\n t.contractAddress?.toLowerCase().includes(s)) &&\r\n (!excludeToken ||\r\n !(\r\n t.contractAddress === excludeToken.contractAddress &&\r\n t.chainId === excludeToken.chainId\r\n )),\r\n );\r\n }, [\r\n selectedNetworkId,\r\n getAllTokensForNetwork,\r\n search,\r\n excludeToken,\r\n displayedNetworks,\r\n ]);\r\n\r\n const displayed = tokens;\r\n\r\n return (\r\n <div className=\"dw-popup-backdrop dw-absolute dw-top-0 dw-left-1/2 dw--translate-x-1/2 dw-max-h-[420px] dw-h-full dw-z-50 dw-flex dw-items-start dw-justify-center\">\r\n <div\r\n className=\"dw-modal-surface dw-popup-content dw-w-[304px] dw-h-full dw-flex dw-flex-col dw-rounded-[var(--dw-radius)] dw-p-3 dw-overflow-hidden\"\r\n onClick={(e) => e.stopPropagation()}\r\n >\r\n <div className=\"dw-flex dw-items-center dw-justify-between\">\r\n <h3 className=\"dw-text-[14px] dw-font-normal dw-text-[var(--dw-fg)]\">\r\n {mode === \"sell\" ? \"Exchange from\" : \"Exchange to\"}\r\n </h3>\r\n <button\r\n type=\"button\"\r\n className=\"dw-icon-button dw-w-4 dw-h-4 dw-rounded-[4px] dw-opacity-70 dw-cursor-pointer\"\r\n onClick={onClose}\r\n aria-label=\"Close\"\r\n >\r\n <CloseIcon />\r\n </button>\r\n </div>\r\n\r\n <div className=\"dw-flex dw-gap-1 dw-mt-3 dw-flex-wrap\">\r\n {displayedNetworks.map((n) => (\r\n <button\r\n key={n.id}\r\n type=\"button\"\n className={`dw-w-[34px] dw-h-[34px] dw-flex dw-items-center dw-justify-center dw-border dw-rounded-[6px] dw-transition ${\n selectedNetworkId === n.id\n ? \"dw-bg-[var(--dw-surface-hover)] dw-border-[var(--dw-accent)]\"\n : \"dw-bg-[var(--dw-surface-alt)] dw-border-[var(--dw-border)] hover:dw-bg-[var(--dw-surface-hover)]\"\n } ${networkSelectionLocked ? \"dw-cursor-not-allowed dw-opacity-50\" : \"\"}`}\n onClick={() => onSelectNetwork(n)}\n title={n.name}\n disabled={networkSelectionLocked}\n >\n {n.logoURI && (\r\n <img\r\n src={resolveImageUrl(n.logoURI, assetBaseUrl)}\r\n alt=\"\"\r\n className=\"dw-w-5 dw-h-5 dw-object-cover\"\r\n />\r\n )}\r\n </button>\r\n ))}\r\n {additionalNetworksCount > 0 && (\r\n <button\n type=\"button\"\n className={`dw-min-w-[34px] dw-h-[34px] dw-px-2 dw-flex dw-items-center dw-justify-center dw-rounded-[6px] dw-border dw-border-[var(--dw-border)] dw-bg-[var(--dw-surface-alt)] hover:dw-bg-[var(--dw-surface-hover)] dw-transition ${\n networkSelectionLocked\n ? \"dw-cursor-not-allowed dw-opacity-50\"\n : \"dw-cursor-pointer\"\n }`}\n onClick={onOpenNetworkSelector}\n title=\"More networks\"\n disabled={networkSelectionLocked}\n >\n <p className=\"dw-font-normal dw-text-[11px] dw-text-[var(--dw-fg)]\">\r\n {additionalNetworksCount}+\r\n </p>\r\n </button>\r\n )}\r\n </div>\r\n\r\n <div className=\"dw-field-shell dw-flex dw-items-center dw-gap-2 dw-h-[34px] dw-mt-3 dw-rounded-[6px] dw-px-3\">\r\n <input\r\n type=\"text\"\r\n placeholder=\"Search by name or contract address\"\r\n value={search}\r\n onChange={(e) => setSearch(e.target.value)}\r\n className=\"dw-flex-1 dw-h-5 dw-font-normal dw-text-[11px] dw-text-[var(--dw-fg)] dw-bg-transparent dw-outline-none dw-border-none\"\r\n />\r\n <SearchIcon />\r\n </div>\r\n\r\n <div className=\"dw-flex dw-items-center dw-justify-between dw-mt-2.5 dw-px-0.5\">\r\n <p className=\"dw-font-normal dw-text-[11px] dw-text-[var(--dw-text-subtle)]\">\r\n Token list\r\n </p>\r\n <p className=\"dw-font-normal dw-text-[11px] dw-text-[var(--dw-text-subtle)]\">\r\n Contracts\r\n </p>\r\n </div>\r\n\r\n <div className=\"dw-widget-list dw-flex-1 dw-overflow-y-auto dw-mt-2 dw-pr-1 dw-flex dw-flex-col dw-gap-1\">\r\n {displayed.map((token) => {\r\n const network = getNetworkById(token.chainId);\r\n const explorerUrl =\r\n network?.explorerUrl ?? \"https://etherscan.io/token/\";\r\n const explorerLink = `${explorerUrl}${token.contractAddress}`;\r\n const shortAddress =\r\n token.contractAddress.length > 10\r\n ? `${token.contractAddress.slice(0, 4)}…${token.contractAddress.slice(-3)}`\r\n : token.contractAddress;\r\n const isCopied = copiedAddresses.has(token.contractAddress);\r\n const showContract = !isNativeToken(token);\r\n\r\n return (\r\n <button\r\n key={`${token.chainId}-${token.contractAddress}`}\r\n type=\"button\"\r\n className={`dw-w-full dw-min-h-[48px] dw-flex dw-items-center dw-justify-between dw-rounded-[6px] dw-px-3 dw-py-2 dw-text-left dw-transition dw-cursor-pointer dw-border ${\r\n selectedToken?.contractAddress === token.contractAddress &&\r\n selectedToken?.chainId === token.chainId\r\n ? \"dw-bg-[var(--dw-surface-hover)] dw-border-[var(--dw-accent)]\"\r\n : \"dw-bg-transparent dw-border-transparent hover:dw-bg-[var(--dw-surface-alt)] hover:dw-border-[var(--dw-border)]\"\r\n }`}\r\n onClick={() => onSelectToken(token)}\r\n >\r\n <div className=\"dw-flex dw-items-center dw-gap-2 dw-min-w-0\">\r\n <div\r\n className=\"dw-w-[28px] dw-h-[28px] dw-rounded-full dw-flex dw-items-center dw-justify-center dw-bg-cover dw-bg-[var(--dw-surface-hover)] dw-border dw-border-[var(--dw-border)] dw-flex-shrink-0\"\r\n style={{\r\n backgroundImage: resolveImageUrl(\r\n token.imageUrl,\r\n assetBaseUrl,\r\n )\r\n ? `url(${resolveImageUrl(token.imageUrl, assetBaseUrl)})`\r\n : \"none\",\r\n }}\r\n >\r\n {!resolveImageUrl(token.imageUrl, assetBaseUrl) && (\r\n <span className=\"dw-font-normal dw-text-[10px] dw-text-[var(--dw-fg)]\">\r\n {token.symbol[0]?.toUpperCase() ?? \"?\"}\r\n </span>\r\n )}\r\n </div>\r\n <div className=\"dw-min-w-0\">\r\n <p className=\"dw-font-normal dw-text-[12px] dw-text-[var(--dw-fg)] dw-truncate\">\r\n {token.symbol}\r\n </p>\r\n {token.name && (\r\n <p className=\"dw-font-normal dw-text-[10px] dw-text-[var(--dw-text-subtle)] dw-truncate\">\r\n {token.name}\r\n </p>\r\n )}\r\n </div>\r\n </div>\r\n <div className=\"dw-flex dw-flex-col dw-items-end dw-gap-1 dw-flex-shrink-0\">\r\n {showContract && (\r\n <div className=\"dw-flex dw-items-center dw-gap-2.5\">\r\n <button\r\n type=\"button\"\r\n className={`dw-w-[12px] dw-h-[12px] dw-flex-shrink-0 dw-bg-cover dw-bg-no-repeat dw-cursor-pointer dw-transition-opacity hover:dw-opacity-100 ${\r\n isCopied ? \"dw-opacity-100\" : \"dw-opacity-50\"\r\n }`}\r\n style={{\r\n backgroundImage: `url(${isCopied ? copyCheckIcon : copyHoverIcon})`,\r\n }}\r\n onClick={(e) =>\r\n copyToClipboard(token.contractAddress, e)\r\n }\r\n aria-label=\"Copy address\"\r\n />\r\n <a\r\n href={explorerLink}\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n className=\"dw-flex dw-items-center dw-gap-1 dw-font-normal dw-text-[10px] dw-text-[var(--dw-text-subtle)] hover:dw-text-[var(--dw-fg)] dw-transition-colors\"\r\n onClick={(e) => e.stopPropagation()}\r\n >\r\n <span>{shortAddress}</span>\r\n <span\r\n className=\"dw-w-[6px] dw-h-[10px] dw-flex-shrink-0 dw-bg-cover dw-bg-no-repeat\"\r\n style={{ backgroundImage: `url(${linkIcon})` }}\r\n />\r\n </a>\r\n </div>\r\n )}\r\n {!showContract && (\r\n <p className=\"dw-font-normal dw-text-[10px] dw-text-[var(--dw-text-subtle)]\">\r\n Native\r\n </p>\r\n )}\r\n </div>\r\n </button>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nfunction CloseIcon() {\r\n return (\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n <path d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction SearchIcon() {\r\n return (\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <path\r\n d=\"M21 21l-4.35-4.35M10.5 18a7.5 7.5 0 1 1 0-15 7.5 7.5 0 0 1 0 15Z\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"1.7\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n />\r\n </svg>\r\n );\r\n}\r\n","import { useState, useMemo } from \"react\";\r\nimport type { Network } from \"../types\";\r\nimport { resolveImageUrl } from \"../utils/resolveImageUrl\";\r\n\r\ninterface SelectNetworkWindowProps {\r\n networks: Network[];\r\n onSelectNetwork: (n: Network) => void;\r\n onClose: () => void;\r\n assetBaseUrl: string;\r\n}\r\n\r\nexport function SelectNetworkWindow(props: SelectNetworkWindowProps) {\r\n const { networks, onSelectNetwork, onClose, assetBaseUrl } = props;\r\n const [search, setSearch] = useState(\"\");\r\n\r\n const filtered = useMemo(() => {\r\n if (!search.trim()) return networks;\r\n const s = search.toLowerCase();\r\n return networks.filter((n) => n.name.toLowerCase().includes(s));\r\n }, [networks, search]);\r\n\r\n return (\r\n <div className=\"dw-popup-backdrop dw-absolute dw-top-0 dw-left-1/2 dw--translate-x-1/2 dw-max-h-[420px] dw-h-full dw-z-[60] dw-flex dw-items-start dw-justify-center\">\r\n <div\r\n className=\"dw-modal-surface dw-popup-content dw-w-[304px] dw-h-full dw-flex dw-flex-col dw-rounded-[var(--dw-radius)] dw-p-3 dw-overflow-hidden\"\r\n onClick={(e) => e.stopPropagation()}\r\n >\r\n <div className=\"dw-flex dw-items-center dw-justify-between\">\r\n <h3 className=\"dw-text-[14px] dw-font-normal dw-text-[var(--dw-fg)]\">\r\n Select ecosystem\r\n </h3>\r\n <button\r\n type=\"button\"\r\n className=\"dw-icon-button dw-w-4 dw-h-4 dw-rounded-[4px] dw-opacity-70 dw-cursor-pointer\"\r\n onClick={onClose}\r\n aria-label=\"Close\"\r\n >\r\n <CloseIcon />\r\n </button>\r\n </div>\r\n\r\n <div className=\"dw-field-shell dw-flex dw-items-center dw-gap-2 dw-h-[34px] dw-mt-3 dw-rounded-[6px] dw-px-3\">\r\n <input\r\n type=\"text\"\r\n placeholder=\"Search by name\"\r\n value={search}\r\n onChange={(e) => setSearch(e.target.value)}\r\n className=\"dw-flex-1 dw-h-5 dw-font-normal dw-text-[11px] dw-text-[var(--dw-fg)] dw-bg-transparent dw-outline-none dw-border-none\"\r\n />\r\n <SearchIcon />\r\n </div>\r\n\r\n <div className=\"dw-widget-list dw-flex-1 dw-overflow-y-auto dw-mt-3 dw-pr-1 dw-grid dw-grid-cols-2 dw-gap-1.5\">\r\n {filtered.map((network) => (\r\n <button\r\n key={network.id}\r\n type=\"button\"\r\n className=\"dw-w-full dw-min-h-[36px] dw-flex dw-items-center dw-gap-2 dw-rounded-[6px] dw-px-2.5 dw-py-2 dw-text-left dw-transition dw-cursor-pointer dw-bg-transparent dw-border dw-border-transparent hover:dw-bg-[var(--dw-surface-alt)] hover:dw-border-[var(--dw-border)]\"\r\n onClick={() => onSelectNetwork(network)}\r\n >\r\n <div\r\n className=\"dw-w-[18px] dw-h-[18px] dw-rounded-[4px] dw-flex-shrink-0 dw-bg-cover dw-bg-center\"\r\n style={{\r\n backgroundImage: network.logoURI\r\n ? `url(${resolveImageUrl(network.logoURI, assetBaseUrl)})`\r\n : \"none\",\r\n }}\r\n />\r\n <h6 className=\"dw-font-normal dw-text-[12px] dw-text-[var(--dw-fg)] dw-truncate\">\r\n {network.name}\r\n </h6>\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nfunction CloseIcon() {\r\n return (\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n <path d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction SearchIcon() {\r\n return (\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <path\r\n d=\"M21 21l-4.35-4.35M10.5 18a7.5 7.5 0 1 1 0-15 7.5 7.5 0 0 1 0 15Z\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"1.7\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n />\r\n </svg>\r\n );\r\n}\r\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACYAAAAmCAYAAACoPemuAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAIFSURBVHgB7Vf/VcMgEL5MYJxAnMBuIBvYDewIbtJukG5QnSB1AusEwQkaJzjvBF5ICg1Jaf/ie+979KUHHNwvDiAj47ooIDEQsaRhQXwhCvNbOCItURl+EvdFURzGFl0QBcxTSBIr4hGnoyGuQguvHcHKbFSOKCOIb8Qa02Bn1y6cTTCwP1+zvX4La56zihu0DsHMESFhMmvfvRKemk1ZEVcYcAv6XqK2CN9248z98gmzWbY4H7XZKOYWh3vL4dzCdxoaJHFJfAJtNh/YNGxmG1l7SIiodOExSUuKtJCRMY7kJcnC+KUEnbcezMh++Qtd4Bxu4qsm7Nc4rSzVeCbn8aKvqJNdxRtAJFAnyxRlqWEd7LpuSWqgXyoUdHlqWP1ZzuY4CenAaeh+qNgR4mpfLPbEb9CHUoP/+EDPcPokUqTYY0/S2LnBy1DjxLKE2i+3OPL0EUbBOl6Xf0ff4AS/jEEwXWD3EmWWhnegw12BDnmukQoyMsK4WkmyML7ai9IYv7xG+yZB5ygebeD4cDD8AB1EbWhBW1okTFcmRVmq0Fcv6ePOEWqskhhIltjlvArn9ZI+1Hb92JKkoN9+lRDfuvFct9YKM9fbS/jat0s6pN6pUd+2gDNAbf7lYN9NSHhuvbS9pIQZQO0WvRssAoL2OcPRJeC061agzfNDfIdbvUQzMhLiDyT6chuOT10RAAAAAElFTkSuQmCC\"","import { useState } from \"react\";\r\nimport slippageIcon from \"../assets/trade/slippage.png\";\r\n\r\ninterface SlippagePanelProps {\r\n options: string[];\r\n selectedIndex: number | null;\r\n customValue: string;\r\n onSelectOption: (index: number) => void;\r\n onCustomChange: (value: string) => void;\r\n onSave: (value: string) => void;\r\n onClose: () => void;\r\n}\r\n\r\nexport function SlippagePanel(props: SlippagePanelProps) {\r\n const {\r\n options,\r\n selectedIndex,\r\n customValue,\r\n onSelectOption,\r\n onCustomChange,\r\n onSave,\r\n onClose,\r\n } = props;\r\n\r\n const [localCustom, setLocalCustom] = useState(customValue);\r\n\r\n const handleCustomInput = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n let v = e.target.value.replace(/,/g, \".\");\r\n if (v.startsWith(\".\")) v = \"0\" + v;\r\n v = v.replace(/[^0-9.]/g, \"\");\r\n const dotIdx = v.indexOf(\".\");\r\n if (dotIdx >= 0) {\r\n v = v.slice(0, dotIdx + 1) + v.slice(dotIdx + 1).replace(/\\./g, \"\");\r\n }\r\n v = v.slice(0, 4);\r\n setLocalCustom(v);\r\n onCustomChange(v);\r\n };\r\n\r\n const handleSave = () => {\r\n let value: string;\r\n if (selectedIndex !== null) {\r\n value = options[selectedIndex];\r\n } else if (localCustom) {\r\n value = localCustom + \"%\";\r\n } else {\r\n return;\r\n }\r\n try {\r\n onSave(value);\r\n onClose();\r\n } catch (e) {\r\n console.error(e);\r\n }\r\n };\r\n\r\n return (\r\n <div className=\"dw-popup-backdrop dw-absolute dw-inset-0 dw-z-50 dw-flex dw-items-center dw-justify-center\">\r\n <div\r\n className=\"dw-modal-surface dw-popup-content dw-w-[304px] dw-flex dw-flex-col dw-rounded-[var(--dw-radius)] dw-p-3\"\r\n onClick={(e) => e.stopPropagation()}\r\n >\r\n <div className=\"dw-flex dw-items-center dw-justify-between\">\r\n <h3 className=\"dw-font-normal dw-text-[14px] dw-text-[var(--dw-fg)]\">\r\n Settings\r\n </h3>\r\n <button\r\n type=\"button\"\r\n className=\"dw-icon-button dw-w-4 dw-h-4 dw-rounded-[4px] dw-opacity-70 dw-cursor-pointer\"\r\n onClick={onClose}\r\n aria-label=\"Close\"\r\n >\r\n <CloseIcon />\r\n </button>\r\n </div>\r\n\r\n <div className=\"dw-flex dw-items-center dw-gap-2 dw-mt-3\">\r\n <img\r\n src={slippageIcon}\r\n alt=\"\"\r\n className=\"dw-w-[14px] dw-h-[14px] dw-object-cover\"\r\n />\r\n <p className=\"dw-font-normal dw-text-[12px] dw-text-[var(--dw-fg)]\">\r\n Slippage limit\r\n </p>\r\n </div>\r\n\r\n <div className=\"dw-flex dw-items-center dw-gap-1 dw-mt-3 dw-flex-wrap\">\r\n {options.map((opt, i) => (\r\n <button\r\n key={opt}\r\n type=\"button\"\r\n className={`dw-font-normal dw-text-[11px] dw-px-3 dw-py-1.5 dw-rounded-[6px] dw-border dw-transition ${\r\n selectedIndex === i\r\n ? \"dw-bg-[var(--dw-surface-hover)] dw-border-[var(--dw-accent)] dw-text-[var(--dw-fg)]\"\r\n : \"dw-bg-transparent dw-border-[var(--dw-border)] dw-text-[var(--dw-text-subtle)] hover:dw-bg-[var(--dw-surface-alt)] hover:dw-text-[var(--dw-fg)]\"\r\n }`}\r\n onClick={() => onSelectOption(i)}\r\n >\r\n {opt}\r\n </button>\r\n ))}\r\n <div\r\n className={`dw-relative dw-w-[72px] dw-h-[30px] dw-flex dw-items-center dw-justify-center dw-rounded-[6px] dw-border ${\r\n selectedIndex === null && localCustom\r\n ? \"dw-border-[var(--dw-accent)] dw-bg-[var(--dw-surface-hover)]\"\r\n : \"dw-border-[var(--dw-border)] dw-bg-[var(--dw-surface-alt)]\"\r\n }`}\r\n >\r\n <input\r\n type=\"text\"\r\n placeholder=\"Custom\"\r\n value={localCustom}\r\n onChange={handleCustomInput}\r\n onFocus={() => onCustomChange(\"\")}\r\n maxLength={4}\r\n className=\"dw-w-10 dw-font-normal dw-text-[11px] dw-text-[var(--dw-fg)] dw-bg-transparent dw-border-none dw-outline-none dw-text-center\"\r\n />\r\n {localCustom && (\r\n <span className=\"dw-absolute dw-right-2 dw-pointer-events-none dw-font-normal dw-text-[11px] dw-text-[var(--dw-fg)]\">\r\n %\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n\r\n <button\r\n type=\"button\"\r\n className=\"dw-w-full dw-h-[34px] dw-mt-4 dw-bg-[var(--dw-accent)] dw-border dw-border-transparent dw-rounded-[6px] dw-font-normal dw-text-[12px] dw-text-white hover:dw-bg-[var(--dw-accent-hover)] dw-cursor-pointer\"\r\n onClick={handleSave}\r\n >\r\n Save\r\n </button>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nfunction CloseIcon() {\r\n return (\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n <path d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\" />\r\n </svg>\r\n );\r\n}\r\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport type { TradeWidgetProps } from \"../types\";\nimport { getThemeVars, varsToCssVars } from \"../theme\";\r\nimport { useTrade } from \"../hooks/useTrade\";\r\nimport { TradeWindow } from \"./TradeWindow\";\r\nimport { SelectTokenWindow } from \"./SelectTokenWindow\";\r\nimport { SelectNetworkWindow } from \"./SelectNetworkWindow\";\r\nimport { SlippagePanel } from \"./SlippagePanel\";\r\nimport {\r\n CONSTANT_ETH_ADDRESS,\r\n CONSTANT_SOL_ADDRESS,\r\n CONSTANT_SUI_ADDRESS,\r\n} from \"../constants/api\";\r\nimport \"../styles/index.css\";\r\n\r\nexport type PopupType =\r\n | \"tokenSell\"\r\n | \"tokenBuy\"\r\n | \"network\"\r\n | \"settings\"\r\n | null;\r\nexport type NetworkSelectorFrom = \"sell\" | \"buy\" | null;\r\n\r\nfunction getAddressForChainType(chainType?: string): string {\r\n if (chainType === \"EVM\") return CONSTANT_ETH_ADDRESS;\r\n if (chainType === \"SVM\") return CONSTANT_SOL_ADDRESS;\r\n return CONSTANT_SUI_ADDRESS;\r\n}\r\n\r\nexport function TradeWidget(props: TradeWidgetProps): JSX.Element {\r\n const {\n theme = \"dark\",\n vars: varsOverride,\n className,\n style: styleProp,\n config,\n initialSellToken,\n initialBuyToken,\n initialSellNetworkId,\n initialBuyNetworkId,\n lockBuyToken = false,\n lockSellToken = false,\n lockBuyNetwork = false,\n lockSellNetwork = false,\n onApprove,\n onSwap,\n onQuote,\n onError,\n ...rest\n } = props;\n\r\n const themeVars = getThemeVars(theme, varsOverride);\r\n const cssVars = varsToCssVars(themeVars);\r\n const mergedStyle: React.CSSProperties = {\r\n ...cssVars,\r\n ...styleProp,\r\n };\r\n\r\n const assetBaseUrl =\n config.assetBaseUrl ??\n config.dataBaseUrl ??\n config.apiBase ??\n (typeof window !== \"undefined\" ? window.location.origin : \"\");\n\r\n const [popup, setPopup] = useState<PopupType>(null);\r\n const [networkSelectorFrom, setNetworkSelectorFrom] =\r\n useState<NetworkSelectorFrom>(null);\r\n\r\n const trade = useTrade({\n apiBase: config.apiBase,\n initialSellToken,\n initialBuyToken,\n initialSellNetworkId,\n initialBuyNetworkId,\n lockBuyToken,\n lockSellToken,\n lockBuyNetwork,\n lockSellNetwork,\n onError,\n });\n\n const quoteKeyRef = useRef(\"\");\n\r\n const displayedNetworksForSell = useMemo(() => {\r\n const all = trade.networks;\r\n const sel = trade.networkSell?.id;\r\n const first6 = all.slice(0, 6);\r\n if (!sel) return first6;\r\n if (first6.some((n) => n.id === sel)) return first6;\r\n const selNet = all.find((n) => n.id === sel);\r\n if (!selNet) return first6;\r\n return [...first6.slice(0, 5), selNet];\r\n }, [trade.networks, trade.networkSell?.id]);\r\n\r\n const additionalNetworksForSell = useMemo(() => {\r\n const ids = new Set(displayedNetworksForSell.map((n) => n.id));\r\n return trade.networks.filter((n) => !ids.has(n.id));\r\n }, [trade.networks, displayedNetworksForSell]);\r\n\r\n const displayedNetworksForBuy = useMemo(() => {\r\n const all = trade.networks;\r\n const sel = trade.networkBuy?.id;\r\n const first6 = all.slice(0, 6);\r\n if (!sel) return first6;\r\n if (first6.some((n) => n.id === sel)) return first6;\r\n const selNet = all.find((n) => n.id === sel);\r\n if (!selNet) return first6;\r\n return [...first6.slice(0, 5), selNet];\r\n }, [trade.networks, trade.networkBuy?.id]);\r\n\r\n const additionalNetworksForBuy = useMemo(() => {\r\n const ids = new Set(displayedNetworksForBuy.map((n) => n.id));\r\n return trade.networks.filter((n) => !ids.has(n.id));\r\n }, [trade.networks, displayedNetworksForBuy]);\r\n\r\n const truncateTo6Decimals = (n: number) => Math.trunc(n * 1e6) / 1e6;\n\n const buildActionPayload = useCallback(\n (action: \"approve\" | \"swap\") => {\n if (\n !trade.networkSell ||\n !trade.networkBuy ||\n !trade.sellToken ||\n !trade.buyToken\n ) {\n return null;\n }\n\n return {\n action,\n sellNetwork: trade.networkSell,\n buyNetwork: trade.networkBuy,\n sellToken: trade.sellToken,\n buyToken: trade.buyToken,\n sellAmount: trade.sellAmountForInput,\n buyAmount: trade.buyAmountForInput,\n slippage: trade.slippage.slippage,\n quote: trade.quote,\n txData: trade.txData,\n price: trade.price,\n gasCostUSD: trade.gasCostUSD,\n };\n },\n [trade]\n );\n\n useEffect(() => {\n if (!trade.quote) {\n quoteKeyRef.current = \"\";\n }\n }, [trade.quote]);\n\n useEffect(() => {\n if (\n !onQuote ||\n !trade.quote ||\n !trade.networkSell ||\n !trade.networkBuy ||\n !trade.sellToken ||\n !trade.buyToken\n ) {\n return;\n }\n\n const quoteKey = [\n trade.networkSell.id,\n trade.networkBuy.id,\n trade.sellToken.contractAddress,\n trade.buyToken.contractAddress,\n trade.sellAmountForInput,\n trade.buyAmountForInput,\n trade.quote.inputAmount ?? \"\",\n trade.quote.outputAmount ?? \"\",\n trade.txData?.to ?? \"\",\n trade.txData?.data ?? \"\",\n ].join(\"|\");\n\n if (quoteKeyRef.current === quoteKey) return;\n quoteKeyRef.current = quoteKey;\n\n onQuote({\n sellNetwork: trade.networkSell,\n buyNetwork: trade.networkBuy,\n sellToken: trade.sellToken,\n buyToken: trade.buyToken,\n sellAmount: trade.sellAmountForInput,\n buyAmount: trade.buyAmountForInput,\n slippage: trade.slippage.slippage,\n quote: trade.quote,\n });\n }, [onQuote, trade]);\n\n const handleAction = useCallback(() => {\n if (trade.buttonState === \"approve\") {\n const payload = buildActionPayload(\"approve\");\n if (payload) onApprove?.(payload);\n return;\n }\n\n if (trade.buttonState === \"swap\") {\n const payload = buildActionPayload(\"swap\");\n if (payload) onSwap?.(payload);\n }\n }, [buildActionPayload, onApprove, onSwap, trade.buttonState]);\n\n if (trade.loading) {\n return (\r\n <div\r\n data-delora-widget-root\r\n className={`dw-flex dw-items-center dw-justify-center dw-p-8 ${className ?? \"\"}`}\r\n style={mergedStyle}\r\n {...rest}\r\n >\r\n <p className=\"dw-text-[var(--dw-muted)]\">Loading...</p>\r\n </div>\r\n );\r\n }\r\n\r\n if (trade.error) {\r\n return (\r\n <div\r\n data-delora-widget-root\r\n className={`dw-flex dw-items-center dw-justify-center dw-p-8 ${className ?? \"\"}`}\r\n style={mergedStyle}\r\n {...rest}\r\n >\r\n <p className=\"dw-text-[#ff7e7e]\">{trade.error}</p>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div\r\n data-delora-widget-root\r\n className={`dw-font-mono dw-relative dw-inline-block ${className ?? \"\"}`}\r\n style={mergedStyle}\r\n {...rest}\r\n >\r\n <TradeWindow\r\n assetBaseUrl={assetBaseUrl}\r\n sellToken={trade.sellToken}\r\n buyToken={trade.buyToken}\r\n networkSellLogo={trade.networkSell?.logoURI}\r\n networkBuyLogo={trade.networkBuy?.logoURI}\r\n sellAmountForInput={trade.sellAmountForInput}\r\n buyAmountForInput={trade.buyAmountForInput}\r\n onSellAmountChange={(v) => trade.setSellAmountForInput(v)}\n onSellInputProcess={trade.processSellInput}\n onOpenSellToken={() => {\n if (!lockSellToken) setPopup(\"tokenSell\");\n }}\n onOpenBuyToken={() => {\n if (!lockBuyToken) setPopup(\"tokenBuy\");\n }}\n onSwapTokens={trade.swapTokens}\n onRefresh={() => {\n if (\r\n trade.networkSell &&\r\n trade.networkBuy &&\r\n trade.sellToken &&\r\n trade.buyToken &&\r\n trade.validatedSellAmount > 0\r\n ) {\r\n trade.fetchQuote({\r\n sellNetworkId: trade.networkSell.id,\r\n buyNetworkId: trade.networkBuy.id,\r\n sellToken: trade.sellToken,\r\n buyToken: trade.buyToken,\r\n sellAmountStr: trade.sellAmountForInput || \"0\",\r\n slippage: trade.slippage.slippage,\r\n fromAddress: getAddressForChainType(trade.networkSell.chainType),\r\n toAddress: getAddressForChainType(trade.networkBuy.chainType),\r\n apiBase: config.apiBase,\r\n });\r\n }\r\n }}\r\n onOpenSettings={() => setPopup(\"settings\")}\r\n balance={trade.balance}\r\n balanceBuy={trade.balanceBuy}\r\n sellPriceUsd={\r\n trade.sellToken?.priceUSD &&\r\n trade.sellAmountForInput &&\r\n Number(trade.sellAmountForInput) > 0\r\n ? `$${(\r\n Number(trade.sellAmountForInput) *\r\n Number(trade.sellToken.priceUSD)\r\n ).toFixed(3)}`\r\n : \"\"\r\n }\r\n buyPriceUsd={\r\n trade.buyToken?.priceUSD &&\r\n trade.buyAmountForInput &&\r\n Number(trade.buyAmountForInput) > 0\r\n ? `$${(\r\n Number(trade.buyAmountForInput) *\r\n Number(trade.buyToken.priceUSD)\r\n ).toFixed(3)}`\r\n : \"\"\r\n }\r\n onMaxClick={trade.setMaxSellAmount}\r\n onSet50Percent={() => trade.setSellAmountByPercent(50)}\r\n onSet25Percent={() => trade.setSellAmountByPercent(25)}\r\n buttonState={trade.buttonState}\r\n txData={trade.txData}\r\n loading={trade.buttonState === \"finding\"}\r\n price={trade.price}\r\n gasCostUSD={trade.gasCostUSD}\r\n truncateTo6Decimals={truncateTo6Decimals}\n isWalletConnected={Boolean(config.isWalletConnected)}\n onConnectWallet={config.onConnectWallet}\n onAction={handleAction}\n swapDisabled={trade.swapLocked}\n sellTokenLocked={lockSellToken}\n buyTokenLocked={lockBuyToken}\n />\n\r\n {popup === \"tokenSell\" && (\r\n <SelectTokenWindow\r\n mode=\"sell\"\r\n networks={trade.networks}\r\n selectedNetworkId={trade.networkSell?.id}\r\n selectedToken={trade.sellToken}\r\n excludeToken={trade.buyToken}\r\n getAllTokensForNetwork={trade.getAllTokensForNetworkId}\r\n getNetworkById={trade.getNetworkById}\n displayedNetworks={displayedNetworksForSell}\n additionalNetworksCount={additionalNetworksForSell.length}\n onOpenNetworkSelector={() => {\n if (!trade.sellNetworkLocked) setNetworkSelectorFrom(\"sell\");\n }}\n onSelectToken={(t) => {\n trade.setSellToken(t);\n trade.cancelRequest();\n setPopup(null);\r\n }}\r\n onSelectNetwork={(n) => {\r\n trade.updateNetworkSell(n.id);\r\n if (trade.networkBuy?.id !== n.id) {\r\n trade.setNetworkBuy(n);\r\n }\r\n }}\n onClose={() => setPopup(null)}\n assetBaseUrl={assetBaseUrl}\n networkSelectionLocked={trade.sellNetworkLocked}\n />\n )}\n\r\n {popup === \"tokenBuy\" && (\r\n <SelectTokenWindow\r\n mode=\"buy\"\r\n networks={trade.networks}\r\n selectedNetworkId={trade.networkBuy?.id}\r\n selectedToken={trade.buyToken}\r\n excludeToken={trade.sellToken}\r\n getAllTokensForNetwork={trade.getAllTokensForNetworkId}\r\n getNetworkById={trade.getNetworkById}\n displayedNetworks={displayedNetworksForBuy}\n additionalNetworksCount={additionalNetworksForBuy.length}\n onOpenNetworkSelector={() => {\n if (!trade.buyNetworkLocked) setNetworkSelectorFrom(\"buy\");\n }}\n onSelectToken={(t) => {\n trade.setBuyToken(t);\n trade.cancelRequest();\n setPopup(null);\r\n }}\r\n onSelectNetwork={(n) => {\r\n trade.setNetworkBuy(n);\r\n }}\n onClose={() => setPopup(null)}\n assetBaseUrl={assetBaseUrl}\n networkSelectionLocked={trade.buyNetworkLocked}\n />\n )}\n\r\n {networkSelectorFrom === \"sell\" && popup === \"tokenSell\" && (\r\n <SelectNetworkWindow\r\n networks={additionalNetworksForSell}\r\n assetBaseUrl={assetBaseUrl}\r\n onSelectNetwork={(n) => {\r\n trade.updateNetworkSell(n.id);\r\n if (trade.networkBuy?.id !== n.id) {\r\n trade.setNetworkBuy(n);\r\n }\r\n setNetworkSelectorFrom(null);\r\n }}\r\n onClose={() => setNetworkSelectorFrom(null)}\r\n />\r\n )}\r\n\r\n {networkSelectorFrom === \"buy\" && popup === \"tokenBuy\" && (\r\n <SelectNetworkWindow\r\n networks={additionalNetworksForBuy}\r\n assetBaseUrl={assetBaseUrl}\r\n onSelectNetwork={(n) => {\r\n trade.setNetworkBuy(n);\r\n setNetworkSelectorFrom(null);\r\n }}\r\n onClose={() => setNetworkSelectorFrom(null)}\r\n />\r\n )}\r\n\r\n {popup === \"settings\" && (\r\n <SlippagePanel\r\n options={trade.slippage.options}\r\n selectedIndex={trade.slippage.selectedIndex}\r\n customValue={trade.slippage.customValue}\r\n onSelectOption={trade.slippage.selectOption}\r\n onCustomChange={trade.slippage.setCustom}\r\n onSave={(value) => {\r\n trade.slippage.save(value);\r\n setPopup(null);\r\n }}\r\n onClose={() => setPopup(null)}\r\n />\r\n )}\r\n </div>\r\n );\r\n}\r\n"],"names":["lightTheme","darkTheme","themes","getThemeVars","theme","overrides","VAR_MAP","varsToCssVars","vars","style","key","value","cssVar","MyWidget","props","varsOverride","className","styleProp","rest","themeVars","mergedStyle","jsxs","jsx","DEFAULT_API_BASE","CONSTANT_ETH_ADDRESS","CONSTANT_SOL_ADDRESS","CONSTANT_SUI_ADDRESS","normalizeBaseUrl","baseUrl","normalizeExplorerUrl","url","chainType","chainKey","trimmed","mapNetwork","chain","_a","_b","_c","mapToken","t","fetchNetworks","apiBase","base","res","fetchTokens","getTokensForNetwork","tokensData","networkId","getAllTokensForNetwork","tokensSearchData","getNativeTokenForNetwork","tokens","zero","sol","sui","isHexAddress","addressesEqual","a","b","findTokenBySelection","selection","token","useTradeState","config","networks","setNetworks","useState","setTokensData","setTokensSearchData","loading","setLoading","error","setError","networkSell","setNetworkSellState","networkBuy","setNetworkBuyState","sellToken","setSellTokenState","buyToken","setBuyTokenState","appliedSellNetworkRef","useRef","appliedBuyNetworkRef","appliedSellTokenRef","appliedBuyTokenRef","selectionErrorsRef","sellNetworkLocked","buyNetworkLocked","desiredSellNetworkId","useMemo","desiredBuyNetworkId","useEffect","cancelled","nets","tok","e","message","nextNetwork","network","selectionKey","selectedByHost","other","getTokensForNetworkId","useCallback","getAllTokensForNetworkId","getNativeToken","getNetworkById","id","updateNetworkSell","chainId","item","updateNetworkBuy","setNetworkSell","setNetworkBuy","setSellToken","setBuyToken","version","defineProperties","target","values","types","stringify","seen","v","HEX","result","i","keys","k","makeError","code","info","shortMessage","details","assert","check","assertArgument","name","accum","form","assertPrivate","givenGuard","guard","method","operation","_getBytes","copy","offset","getBytes","BN_0","BN_1","maxValue","fromTwos","_value","_width","getUint","width","getNumber","mask","_bits","bits","getBigInt","Nibbles","toBigInt","BN_N1","BN_5","_guard","Zeros","getTens","decimals","checkValue","val","format","safeOp","limit","getFormat","signed","match","type","defaultValue","toString","negative","str","index","_FixedNumber","__privateAdd","_FixedNumber_instances","__publicField","_format","_val","_tens","__privateSet","__privateGet","__privateMethod","add_fn","sub_fn","mul_fn","checkFormat_fn","checkValue_fn","div_fn","delta","bump","tens","_decimals","whole","decimal","o","FixedNumber","names","parseUnits","unit","ZeroAddress","parseToAmount","toAmount","fetchQuote","params","searchParams","errBody","err","truncateToTokenDecimals","amountStr","maxDecimals","intPart","decPart","useTradeApi","quote","setQuote","txData","setTxData","buyAmount","setBuyAmount","buyAmountForInput","setBuyAmountForInput","price","setPrice","gasCostUSD","setGasCostUSD","gasPriceRaw","setGasPriceRaw","gasLimitRaw","setGasLimitRaw","buttonState","setButtonState","abortRef","requestIdRef","cancelRequest","invalidateQuote","fetchQuoteRequest","requestId","abort","sellNetworkId","buyNetworkId","sellAmountStr","slippage","fromAddress","toAddress","truncated","fromAmount","toAddr","response","gasBreakdown","rawOutput","readable","totalFeesAmount","_d","totalFeesDecimals","_f","_e","gasTokenAmount","fromDecimal","toDecimal","isNative","msg","statusCode","STORAGE_INDEX","STORAGE_CUSTOM","STORAGE_VALUE","OPTIONS","AUTO_SLIPPAGE","useSlippage","selectedIndex","setSelectedIndex","customValue","setCustomValue","setSlippage","si","cv","selectOption","setCustom","num","save","s","INPUT_DEBOUNCE_MS","limitDecimals","max","int","dec","getAddressForChainType","useTrade","state","api","swapLocked","sellAmountForInput","setSellAmountForInput","validatedSellAmount","setValidatedSellAmount","isProcessingInput","setIsProcessingInput","debounceRef","balance","balanceBuy","allFieldsReady","processSellInput","cleaned","limited","setMaxSellAmount","setSellAmountByPercent","percent","amount","swapTokens","ts","tb","prevSellStr","prevBuyStr","PRESETS","useGlitchText","ref","text","enabled","preset","onAnimationStart","onAnimationEnd","timeoutRef","useLayoutEffect","el","element","possibleChars","glitchChars","cyberChars","animationFrames","animationSpeed","finalText","frame","glitchStates","resolvedChars","animate","progress","easedProgress","resolvedCount","glitchProbability","rand","currentSpeed","startId","resolveImageUrl","gasPumpIcon","BUTTON_LABELS","TradeWindow","networkSellLogo","networkBuyLogo","assetBaseUrl","onSellAmountChange","onSellInputProcess","onOpenSellToken","onOpenBuyToken","onSwapTokens","onRefresh","onOpenSettings","sellPriceUsd","buyPriceUsd","onMaxClick","onSet50Percent","onSet25Percent","truncateTo6Decimals","isWalletConnected","onConnectWallet","onAction","swapDisabled","sellTokenLocked","buyTokenLocked","isSwapActive","isErrorState","isDisabled","isActionDisabled","buyAmountRef","refreshIconRef","refreshRotationRef","handleRefresh","handleKeyDown","input","pos","newValue","actionButtonClassName","RefreshIcon","SettingsIcon","SwapArrowsBlock","AssetSection","Fragment","ActionLink","label","labelTone","networkLogo","amountPlaceholder","usdValue","onOpenToken","onInputChange","onKeyDown","amountToneClassName","amountRef","readOnly","quickActions","tokenLocked","TokenIcon","sizeClassName","badgeClassName","tokenImg","netImg","copyHoverIcon","copyCheckIcon","linkIcon","SelectTokenWindow","mode","selectedNetworkId","selectedToken","excludeToken","onSelectToken","onSelectNetwork","onOpenNetworkSelector","onClose","displayedNetworks","additionalNetworksCount","networkSelectionLocked","search","setSearch","copiedAddresses","setCopiedAddresses","isNativeToken","ethers.ZeroAddress","copyToClipboard","address","prev","next","displayed","all","CloseIcon","n","SearchIcon","explorerLink","shortAddress","isCopied","showContract","SelectNetworkWindow","filtered","slippageIcon","SlippagePanel","options","onSelectOption","onCustomChange","onSave","localCustom","setLocalCustom","handleCustomInput","dotIdx","handleSave","opt","TradeWidget","initialSellToken","initialBuyToken","initialSellNetworkId","initialBuyNetworkId","lockBuyToken","lockSellToken","lockBuyNetwork","lockSellNetwork","onApprove","onSwap","onQuote","onError","popup","setPopup","networkSelectorFrom","setNetworkSelectorFrom","trade","quoteKeyRef","displayedNetworksForSell","sel","first6","selNet","additionalNetworksForSell","ids","displayedNetworksForBuy","additionalNetworksForBuy","buildActionPayload","action","quoteKey","handleAction","payload","_g","_h"],"mappings":"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","x_google_ignoreList":[5,6,7,8,9,10,11,12]}