@latchprotocol/widgets 0.1.1 → 0.1.3

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.
Files changed (41) hide show
  1. package/README.md +2 -2
  2. package/dist/chunks/{SwapWidget-CwkRtOfn.js → SwapWidget-B0oDyBNK.js} +2 -2
  3. package/dist/chunks/SwapWidget-B0oDyBNK.js.map +1 -0
  4. package/dist/chunks/{scan-Dhu7f4Nl.js → scan-Cdm3p_wF.js} +2 -2
  5. package/dist/chunks/scan-Cdm3p_wF.js.map +1 -0
  6. package/dist/chunks/{useLocker-CGpgCh75.js → useLocker-m3WH-bQm.js} +2 -2
  7. package/dist/chunks/{useLocker-CGpgCh75.js.map → useLocker-m3WH-bQm.js.map} +1 -1
  8. package/dist/components/LaunchWidget.d.ts +7 -6
  9. package/dist/components/LaunchWidget.d.ts.map +1 -1
  10. package/dist/components/LiquidityWidget.d.ts +2 -1
  11. package/dist/components/LiquidityWidget.d.ts.map +1 -1
  12. package/dist/components/LockerWidget.d.ts +2 -1
  13. package/dist/components/LockerWidget.d.ts.map +1 -1
  14. package/dist/components/LocksWidgets.d.ts +3 -2
  15. package/dist/components/LocksWidgets.d.ts.map +1 -1
  16. package/dist/components/SwapWidget.d.ts.map +1 -1
  17. package/dist/components/TokenTrustPanel.d.ts +2 -1
  18. package/dist/components/TokenTrustPanel.d.ts.map +1 -1
  19. package/dist/components/lockCharts.d.ts +3 -2
  20. package/dist/components/lockCharts.d.ts.map +1 -1
  21. package/dist/components/primitives.d.ts +12 -11
  22. package/dist/components/primitives.d.ts.map +1 -1
  23. package/dist/components/swap/SwapSettings.d.ts +2 -1
  24. package/dist/components/swap/SwapSettings.d.ts.map +1 -1
  25. package/dist/components/swap/TokenSelect.d.ts +5 -4
  26. package/dist/components/swap/TokenSelect.d.ts.map +1 -1
  27. package/dist/context/WidgetProvider.d.ts +2 -1
  28. package/dist/context/WidgetProvider.d.ts.map +1 -1
  29. package/dist/embed/lockBadge.d.ts +1 -1
  30. package/dist/embed.js +6 -6
  31. package/dist/embed.js.map +1 -1
  32. package/dist/headless.js +2 -2
  33. package/dist/index.js +9 -9
  34. package/dist/index.js.map +1 -1
  35. package/dist/latch-embed.js +1 -1
  36. package/dist/latch-embed.js.map +1 -1
  37. package/dist/latch-embed.mjs +1 -1
  38. package/dist/latch-embed.mjs.map +1 -1
  39. package/package.json +1 -1
  40. package/dist/chunks/SwapWidget-CwkRtOfn.js.map +0 -1
  41. package/dist/chunks/scan-Dhu7f4Nl.js.map +0 -1
package/dist/embed.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"embed.js","sources":["../src/embed/webComponent.tsx","../src/embed/iframe.ts","../src/embed/lockBadge.ts"],"sourcesContent":["// SPDX-License-Identifier: MIT\n/**\n * Custom-element wrappers, for hosts that are not React.\n *\n * Vue, Svelte, Angular, Astro and plain HTML can all render a custom element.\n * These mount the same React components into a shadow root, so the widget's CSS\n * cannot leak into the host page and the host's CSS cannot break the widget -\n * while `--latch-*` custom properties still inherit through the shadow boundary,\n * which is exactly the theming behaviour an embedder wants.\n *\n * ```html\n * <script type=\"module\" src=\"/latch-widgets.js\"></script>\n * <latch-swap-widget theme=\"dark\"></latch-swap-widget>\n * ```\n *\n * The adapter cannot come from an attribute - a viem transport is not JSON -\n * so set it as a property:\n *\n * ```js\n * document.querySelector(\"latch-swap-widget\").adapter = createViemAdapter({...});\n * ```\n */\n\nimport { createElement, type ComponentType } from \"react\";\nimport { createRoot, type Root } from \"react-dom/client\";\nimport type { ProtocolAdapter } from \"../adapters/protocol.js\";\nimport type { IntegratorConfig } from \"../config/integrator.js\";\nimport { WidgetProvider, type WidgetTheme } from \"../context/WidgetProvider.js\";\nimport { LaunchWidget } from \"../components/LaunchWidget.js\";\nimport { LiquidityWidget } from \"../components/LiquidityWidget.js\";\nimport { SwapWidget } from \"../components/SwapWidget.js\";\nimport { WIDGET_CSS } from \"../styles/css.js\";\n\n/** Attributes every Latch widget element understands. */\nconst COMMON_ATTRIBUTES = [\n \"integrator\",\n \"theme\",\n \"slippage-bps\",\n \"title-text\",\n] as const;\n\nfunction parseJsonAttribute<T>(value: string | null, label: string): T | null {\n if (value === null || value.trim() === \"\") return null;\n try {\n return JSON.parse(value) as T;\n } catch (cause: unknown) {\n throw new Error(\n `[@latchprotocol/widgets] the ${label} attribute is not valid JSON: ${String(cause)}`,\n );\n }\n}\n\n/**\n * SSR-safe `HTMLElement`.\n *\n * `class X extends HTMLElement` is evaluated at module load, so importing this\n * file in Node - which any host doing server-side rendering does - would throw\n * `HTMLElement is not defined` before a single line of user code ran. On the\n * server the classes extend an inert stand-in instead. They are never\n * instantiated there: `defineLatchWidgets` no-ops without `customElements`, and\n * only the browser's custom-element machinery constructs them.\n */\nconst ElementBase: typeof HTMLElement =\n typeof HTMLElement === \"undefined\"\n ? (class {} as unknown as typeof HTMLElement)\n : HTMLElement;\n\n/** Base class shared by every widget element. */\nabstract class LatchWidgetElement extends ElementBase {\n #root: Root | null = null;\n #shadow: ShadowRoot | null = null;\n #adapter: ProtocolAdapter | null = null;\n #error: string | null = null;\n\n /** Observed attributes, extended by each subclass. */\n static get observedAttributes(): readonly string[] {\n return COMMON_ATTRIBUTES;\n }\n\n /** The adapter, when set imperatively. Takes precedence over the attribute. */\n get adapter(): ProtocolAdapter | null {\n return this.#adapter;\n }\n\n set adapter(value: ProtocolAdapter | null) {\n this.#adapter = value;\n this.#render();\n }\n\n connectedCallback(): void {\n if (this.#shadow === null) {\n this.#shadow = this.attachShadow({ mode: \"open\" });\n const style = document.createElement(\"style\");\n style.textContent = WIDGET_CSS;\n this.#shadow.appendChild(style);\n const mount = document.createElement(\"div\");\n this.#shadow.appendChild(mount);\n this.#root = createRoot(mount);\n }\n this.#render();\n }\n\n disconnectedCallback(): void {\n const root = this.#root;\n this.#root = null;\n // Unmount asynchronously: React refuses to unmount during a commit, and a\n // custom element can be disconnected from inside one.\n if (root !== null) queueMicrotask(() => root.unmount());\n }\n\n attributeChangedCallback(): void {\n this.#render();\n }\n\n /** The React component this element renders. */\n protected abstract component(): ComponentType<Record<string, unknown>>;\n\n /** Extra props derived from element attributes. */\n protected widgetProps(): Record<string, unknown> {\n const title = this.getAttribute(\"title-text\");\n return title === null ? {} : { title };\n }\n\n #resolveAdapter(): ProtocolAdapter | null {\n return this.#adapter;\n }\n\n #render(): void {\n if (this.#root === null) return;\n try {\n const adapter = this.#resolveAdapter();\n if (adapter === null) {\n this.#root.render(\n createElement(\n \"div\",\n { className: \"latch-widget\" },\n createElement(\n \"p\",\n { className: \"latch-error\", role: \"alert\" },\n \"No adapter. Set the element's `adapter` property to a live adapter \" +\n \"(createViemAdapter).\",\n ),\n ),\n );\n return;\n }\n\n const integrator = parseJsonAttribute<IntegratorConfig>(\n this.getAttribute(\"integrator\"),\n \"integrator\",\n );\n const theme = (this.getAttribute(\"theme\") ?? \"system\") as WidgetTheme;\n const slippageRaw = this.getAttribute(\"slippage-bps\");\n\n this.#error = null;\n this.#root.render(\n createElement(WidgetProvider, {\n adapter,\n theme,\n ...(integrator === null ? {} : { integrator }),\n ...(slippageRaw === null ? {} : { defaultSlippageBps: Number(slippageRaw) }),\n children: createElement(this.component(), this.widgetProps()),\n }),\n );\n } catch (cause: unknown) {\n this.#error = cause instanceof Error ? cause.message : String(cause);\n this.#root.render(\n createElement(\n \"div\",\n { className: \"latch-widget\" },\n createElement(\"p\", { className: \"latch-error\", role: \"alert\" }, this.#error),\n ),\n );\n }\n }\n}\n\n/** `<latch-swap-widget>`. */\nexport class LatchSwapWidgetElement extends LatchWidgetElement {\n static override get observedAttributes(): readonly string[] {\n return [...COMMON_ATTRIBUTES, \"token-in\", \"token-out\", \"account\", \"variant\"];\n }\n\n protected override component(): ComponentType<Record<string, unknown>> {\n return SwapWidget as ComponentType<Record<string, unknown>>;\n }\n\n protected override widgetProps(): Record<string, unknown> {\n const tokenIn = this.getAttribute(\"token-in\");\n const tokenOut = this.getAttribute(\"token-out\");\n /* `variant=\"compact\"`: the Buy / Sell pill and the always-visible lines; anything else is the default. */\n const variant = this.getAttribute(\"variant\");\n return {\n ...super.widgetProps(),\n ...(tokenIn === null ? {} : { defaultTokenIn: tokenIn }),\n ...(tokenOut === null ? {} : { defaultTokenOut: tokenOut }),\n ...(variant === \"compact\" ? { variant: \"compact\" } : {}),\n };\n }\n}\n\n/** `<latch-liquidity-widget>`. */\nexport class LatchLiquidityWidgetElement extends LatchWidgetElement {\n static override get observedAttributes(): readonly string[] {\n return [...COMMON_ATTRIBUTES, \"pool-id\", \"mode\", \"account\"];\n }\n\n protected override component(): ComponentType<Record<string, unknown>> {\n return LiquidityWidget as ComponentType<Record<string, unknown>>;\n }\n\n protected override widgetProps(): Record<string, unknown> {\n const poolId = this.getAttribute(\"pool-id\");\n const mode = this.getAttribute(\"mode\");\n return {\n ...super.widgetProps(),\n ...(poolId === null ? {} : { defaultPoolId: poolId }),\n ...(mode === \"remove\" || mode === \"add\" ? { defaultMode: mode } : {}),\n };\n }\n}\n\n/** `<latch-launch-widget>`. */\nexport class LatchLaunchWidgetElement extends LatchWidgetElement {\n static override get observedAttributes(): readonly string[] {\n return [...COMMON_ATTRIBUTES, \"pool-id\", \"account\"];\n }\n\n protected override component(): ComponentType<Record<string, unknown>> {\n return LaunchWidget as ComponentType<Record<string, unknown>>;\n }\n\n protected override widgetProps(): Record<string, unknown> {\n // A pool id, not a launchpad address: LaunchGuardHook keys every launch\n // by PoolId, and there is no per-launch contract to point at.\n const poolId = this.getAttribute(\"pool-id\");\n return {\n ...super.widgetProps(),\n ...(poolId === null ? {} : { poolId }),\n };\n }\n}\n\n/** Element tag names, so hosts do not have to hardcode strings. */\nexport const WIDGET_TAG_NAMES = {\n swap: \"latch-swap-widget\",\n liquidity: \"latch-liquidity-widget\",\n launch: \"latch-launch-widget\",\n} as const;\n\n/**\n * Registers every widget element.\n *\n * Safe to call more than once; already-registered tags are skipped rather than\n * throwing, so two copies of the bundle on one page do not break it.\n */\nexport function defineLatchWidgets(): void {\n if (typeof customElements === \"undefined\") return;\n const registry: readonly [string, CustomElementConstructor][] = [\n [WIDGET_TAG_NAMES.swap, LatchSwapWidgetElement],\n [WIDGET_TAG_NAMES.liquidity, LatchLiquidityWidgetElement],\n [WIDGET_TAG_NAMES.launch, LatchLaunchWidgetElement],\n ];\n for (const [tag, constructor] of registry) {\n if (customElements.get(tag) === undefined) {\n customElements.define(tag, constructor);\n }\n }\n}\n","// SPDX-License-Identifier: MIT\n/**\n * Iframe embedding: the postMessage contract.\n *\n * The web component is the right answer for most hosts. The iframe exists for\n * the case the web component cannot serve: a host that will not run third-party\n * script in its own realm - which, for a widget asking users to sign\n * transactions, is a reasonable position for a host to take.\n *\n * ## The split\n *\n * The **widget** runs inside the iframe and owns only rendering. It holds no\n * keys and opens no RPC connections. Every chain read and write is a request to\n * the host.\n *\n * The **host** runs in the parent page, owns the wallet and a real\n * {@link ../adapters/protocol.js | ProtocolAdapter}, and answers those requests.\n *\n * ```text\n * iframe (widget) parent (host)\n * ──────────────── ─────────────\n * ready ─────────────────────────────────▶\n * ◀───────────────────────────── init { chain, integrator, theme }\n * invoke { id, method, args } ───────────▶\n * ◀────────── result { id, ok, value } | { id, ok: false, error }\n * resize { height } ─────────────────────▶\n * event { name, payload } ──────────────▶\n * ```\n *\n * ## Message contract\n *\n * Every message is `{ channel: \"latch-widget\", version: 1, ... }`. Anything\n * without that envelope is ignored. Both sides pin the counterpart origin -\n * the host passes the widget's origin, the widget receives the host's in\n * `init` - and every later message is checked against it. `event.origin` is the\n * only trustworthy field on a `MessageEvent`; nothing inside `data` is trusted\n * for identity.\n *\n * `BigInt` survives structured clone, so amounts cross the boundary as exact\n * integers. Never stringify them for transport - a float round-trip is how\n * money goes missing.\n *\n * ## What the host must validate\n *\n * The host is the security boundary. Before signing anything it should check:\n *\n * - the transaction's `to` is a contract it expects (its own router address);\n * - `value` matches what the user was shown;\n * - `integratorFee.referrer` is the host's own address, if it configured one.\n *\n * A widget in an iframe is still third-party code. This contract makes it\n * *inspectable*, not trusted.\n */\n\nimport type {\n ProtocolAdapter,\n WidgetTransactionRequest,\n} from \"../adapters/protocol.js\";\nimport type { IntegratorConfig } from \"../config/integrator.js\";\nimport type { WidgetTheme } from \"../context/WidgetProvider.js\";\n\n/** Channel name on every message in this protocol. */\nexport const WIDGET_CHANNEL = \"latch-widget\";\n\n/** Version of the message contract. Bumped on any breaking change. */\nexport const WIDGET_PROTOCOL_VERSION = 1;\n\n/** Adapter methods the widget may invoke on the host. */\nexport type BridgeMethod = Extract<\n keyof ProtocolAdapter,\n | \"getAccount\"\n | \"listTokens\"\n | \"getToken\"\n | \"getBalance\"\n | \"listPools\"\n | \"getPoolState\"\n | \"getApprovalRequirements\"\n | \"buildApproval\"\n | \"quoteSwap\"\n | \"buildSwap\"\n | \"quoteAddLiquidity\"\n | \"buildAddLiquidity\"\n | \"listPositions\"\n | \"quoteRemoveLiquidity\"\n | \"buildRemoveLiquidity\"\n | \"listLaunches\"\n | \"getLaunch\"\n | \"getLaunchesForToken\"\n | \"sendTransaction\"\n | \"waitForTransaction\"\n>;\n\n/** Sent by the widget once it has mounted and is ready for `init`. */\nexport interface WidgetReadyMessage {\n readonly channel: typeof WIDGET_CHANNEL;\n readonly version: number;\n readonly type: \"ready\";\n}\n\n/** Sent by the host in response to `ready`. */\nexport interface HostInitMessage {\n readonly channel: typeof WIDGET_CHANNEL;\n readonly version: number;\n readonly type: \"init\";\n readonly widget: \"swap\" | \"liquidity\" | \"launch\";\n readonly integrator: IntegratorConfig | null;\n readonly theme: WidgetTheme;\n /** Chain metadata, minus anything unserialisable (no transport). */\n readonly chain: {\n readonly chainId: number;\n readonly name: string;\n readonly nativeCurrency: { name: string; symbol: string; decimals: number };\n readonly blockExplorerUrl?: string;\n };\n /** `true` when the host's adapter is a mock, so the widget can warn. */\n readonly isMock: boolean;\n}\n\n/** A remote adapter call, widget to host. */\nexport interface WidgetInvokeMessage {\n readonly channel: typeof WIDGET_CHANNEL;\n readonly version: number;\n readonly type: \"invoke\";\n readonly id: string;\n readonly method: BridgeMethod;\n readonly args: readonly unknown[];\n}\n\n/** The host's answer to an `invoke`. */\nexport type HostResultMessage =\n | {\n readonly channel: typeof WIDGET_CHANNEL;\n readonly version: number;\n readonly type: \"result\";\n readonly id: string;\n readonly ok: true;\n readonly value: unknown;\n }\n | {\n readonly channel: typeof WIDGET_CHANNEL;\n readonly version: number;\n readonly type: \"result\";\n readonly id: string;\n readonly ok: false;\n readonly error: { readonly name: string; readonly message: string };\n };\n\n/** Height report, so the host can size the iframe without scrollbars. */\nexport interface WidgetResizeMessage {\n readonly channel: typeof WIDGET_CHANNEL;\n readonly version: number;\n readonly type: \"resize\";\n readonly height: number;\n}\n\n/** Lifecycle notifications the host may log or act on. */\nexport interface WidgetEventMessage {\n readonly channel: typeof WIDGET_CHANNEL;\n readonly version: number;\n readonly type: \"event\";\n readonly name: \"quote\" | \"transaction-submitted\" | \"transaction-confirmed\" | \"error\";\n readonly payload: Record<string, unknown>;\n}\n\n/** Anything the widget sends. */\nexport type WidgetMessage =\n | WidgetReadyMessage\n | WidgetInvokeMessage\n | WidgetResizeMessage\n | WidgetEventMessage;\n\n/** Anything the host sends. */\nexport type HostMessage = HostInitMessage | HostResultMessage;\n\nfunction isEnvelope(data: unknown): data is { channel: string; version: number; type: string } {\n if (typeof data !== \"object\" || data === null) return false;\n const record = data as Record<string, unknown>;\n return (\n record[\"channel\"] === WIDGET_CHANNEL &&\n record[\"version\"] === WIDGET_PROTOCOL_VERSION &&\n typeof record[\"type\"] === \"string\"\n );\n}\n\n/** Options for {@link serveWidgetIframe}. */\nexport interface ServeWidgetIframeOptions {\n /** The iframe element the widget is running in. */\n readonly iframe: HTMLIFrameElement;\n /** Exact origin the iframe is served from. Never `\"*\"`. */\n readonly widgetOrigin: string;\n /** The adapter that answers the widget's requests. */\n readonly adapter: ProtocolAdapter;\n readonly widget: \"swap\" | \"liquidity\" | \"launch\";\n readonly integrator?: IntegratorConfig;\n readonly theme?: WidgetTheme;\n /**\n * Last-line inspection before a transaction is signed. Return `false` to\n * refuse. Use it to assert the fee recipient is you.\n */\n readonly approveTransaction?: (request: WidgetTransactionRequest) => boolean | Promise<boolean>;\n /** Called on every widget event, for analytics. */\n readonly onEvent?: (message: WidgetEventMessage) => void;\n /** Called when the widget reports its height. */\n readonly onResize?: (height: number) => void;\n}\n\n/**\n * Host side of the bridge: answers the widget's adapter calls.\n *\n * @returns a disposer that removes the listener.\n */\nexport function serveWidgetIframe(options: ServeWidgetIframeOptions): () => void {\n const { iframe, widgetOrigin, adapter } = options;\n\n if (widgetOrigin === \"*\" || widgetOrigin.trim() === \"\") {\n throw new Error(\n '[@latchprotocol/widgets] widgetOrigin must be an exact origin, never \"*\". ' +\n \"A wildcard origin lets any framed page impersonate the widget.\",\n );\n }\n\n const post = (message: HostMessage): void => {\n iframe.contentWindow?.postMessage(message, widgetOrigin);\n };\n\n const handler = async (event: MessageEvent<unknown>): Promise<void> => {\n if (event.origin !== widgetOrigin) return;\n if (event.source !== iframe.contentWindow) return;\n if (!isEnvelope(event.data)) return;\n const message = event.data as WidgetMessage;\n\n if (message.type === \"ready\") {\n post({\n channel: WIDGET_CHANNEL,\n version: WIDGET_PROTOCOL_VERSION,\n type: \"init\",\n widget: options.widget,\n integrator: options.integrator ?? null,\n theme: options.theme ?? \"system\",\n chain: {\n chainId: adapter.chain.chainId,\n name: adapter.chain.name,\n nativeCurrency: adapter.chain.nativeCurrency,\n ...(adapter.chain.blockExplorerUrl === undefined\n ? {}\n : { blockExplorerUrl: adapter.chain.blockExplorerUrl }),\n },\n isMock: adapter.isMock,\n });\n return;\n }\n\n if (message.type === \"resize\") {\n options.onResize?.(message.height);\n return;\n }\n\n if (message.type === \"event\") {\n options.onEvent?.(message);\n return;\n }\n\n if (message.type !== \"invoke\") return;\n\n try {\n if (message.method === \"sendTransaction\" && options.approveTransaction !== undefined) {\n const request = message.args[0] as WidgetTransactionRequest;\n const approved = await options.approveTransaction(request);\n if (!approved) {\n throw new Error(\"The host refused this transaction\");\n }\n }\n const method = adapter[message.method] as (...args: unknown[]) => Promise<unknown>;\n if (typeof method !== \"function\") {\n throw new Error(`Unknown bridge method: ${String(message.method)}`);\n }\n const value: unknown = await method.apply(adapter, [...message.args]);\n post({\n channel: WIDGET_CHANNEL,\n version: WIDGET_PROTOCOL_VERSION,\n type: \"result\",\n id: message.id,\n ok: true,\n value,\n });\n } catch (cause: unknown) {\n const error = cause instanceof Error ? cause : new Error(String(cause));\n post({\n channel: WIDGET_CHANNEL,\n version: WIDGET_PROTOCOL_VERSION,\n type: \"result\",\n id: message.id,\n ok: false,\n error: { name: error.name, message: error.message },\n });\n }\n };\n\n const listener = (event: MessageEvent<unknown>): void => {\n void handler(event);\n };\n\n window.addEventListener(\"message\", listener);\n return () => window.removeEventListener(\"message\", listener);\n}\n\n/** A pending remote call. */\ninterface PendingCall {\n resolve(value: unknown): void;\n reject(reason: Error): void;\n}\n\n/** Options for {@link createIframeBridgeAdapter}. */\nexport interface IframeBridgeOptions {\n /** Exact origin of the host page. */\n readonly hostOrigin: string;\n /** How long to wait for a reply before failing, in ms. */\n readonly timeoutMs?: number;\n}\n\n/**\n * Widget side of the bridge: a {@link ProtocolAdapter} that forwards every call\n * to the host page.\n *\n * Runs inside the iframe. Resolves once the host's `init` arrives, so a widget\n * never renders against a half-configured bridge.\n */\nexport async function createIframeBridgeAdapter(\n options: IframeBridgeOptions,\n): Promise<{ adapter: ProtocolAdapter; init: HostInitMessage; dispose(): void }> {\n const { hostOrigin } = options;\n const timeoutMs = options.timeoutMs ?? 60_000;\n\n if (hostOrigin === \"*\" || hostOrigin.trim() === \"\") {\n throw new Error('[@latchprotocol/widgets] hostOrigin must be an exact origin, never \"*\"');\n }\n\n const pending = new Map<string, PendingCall>();\n let counter = 0;\n let init: HostInitMessage | null = null;\n let resolveInit: ((message: HostInitMessage) => void) | null = null;\n\n const initPromise = new Promise<HostInitMessage>((resolve) => {\n resolveInit = resolve;\n });\n\n const listener = (event: MessageEvent<unknown>): void => {\n if (event.origin !== hostOrigin) return;\n if (!isEnvelope(event.data)) return;\n const message = event.data as HostMessage;\n\n if (message.type === \"init\") {\n init = message;\n resolveInit?.(message);\n return;\n }\n if (message.type !== \"result\") return;\n\n const call = pending.get(message.id);\n if (call === undefined) return;\n pending.delete(message.id);\n if (message.ok) call.resolve(message.value);\n else {\n const error = new Error(message.error.message);\n error.name = message.error.name;\n call.reject(error);\n }\n };\n\n window.addEventListener(\"message\", listener);\n\n const send = (message: WidgetMessage): void => {\n window.parent.postMessage(message, hostOrigin);\n };\n\n const invoke = (method: BridgeMethod, args: readonly unknown[]): Promise<unknown> => {\n counter += 1;\n const id = `${Date.now().toString(36)}-${counter}`;\n return new Promise<unknown>((resolve, reject) => {\n const timer = setTimeout(() => {\n pending.delete(id);\n reject(new Error(`[@latchprotocol/widgets] host did not answer ${method} in ${timeoutMs}ms`));\n }, timeoutMs);\n pending.set(id, {\n resolve: (value) => {\n clearTimeout(timer);\n resolve(value);\n },\n reject: (reason) => {\n clearTimeout(timer);\n reject(reason);\n },\n });\n send({\n channel: WIDGET_CHANNEL,\n version: WIDGET_PROTOCOL_VERSION,\n type: \"invoke\",\n id,\n method,\n args,\n });\n });\n };\n\n send({ channel: WIDGET_CHANNEL, version: WIDGET_PROTOCOL_VERSION, type: \"ready\" });\n const resolved = await initPromise;\n\n const call =\n (method: BridgeMethod) =>\n (...args: unknown[]): Promise<never> =>\n invoke(method, args) as Promise<never>;\n\n const adapter: ProtocolAdapter = {\n kind: \"iframe-bridge\",\n isMock: resolved.isMock,\n chain: {\n chainId: resolved.chain.chainId,\n name: resolved.chain.name,\n nativeCurrency: resolved.chain.nativeCurrency,\n // The bridge deliberately carries no addresses: the widget never builds\n // calldata itself, the host does.\n contracts: { vault: \"0x0000000000000000000000000000000000000000\" },\n ...(resolved.chain.blockExplorerUrl === undefined\n ? {}\n : { blockExplorerUrl: resolved.chain.blockExplorerUrl }),\n },\n getAccount: call(\"getAccount\"),\n listTokens: call(\"listTokens\"),\n getToken: call(\"getToken\"),\n getBalance: call(\"getBalance\"),\n listPools: call(\"listPools\"),\n getPoolState: call(\"getPoolState\"),\n getApprovalRequirements: call(\"getApprovalRequirements\"),\n buildApproval: call(\"buildApproval\"),\n quoteSwap: call(\"quoteSwap\"),\n buildSwap: call(\"buildSwap\"),\n quoteAddLiquidity: call(\"quoteAddLiquidity\"),\n buildAddLiquidity: call(\"buildAddLiquidity\"),\n listPositions: call(\"listPositions\"),\n quoteRemoveLiquidity: call(\"quoteRemoveLiquidity\"),\n buildRemoveLiquidity: call(\"buildRemoveLiquidity\"),\n listLaunches: call(\"listLaunches\"),\n getLaunch: call(\"getLaunch\"),\n getLaunchesForToken: call(\"getLaunchesForToken\"),\n sendTransaction: call(\"sendTransaction\"),\n waitForTransaction: call(\"waitForTransaction\"),\n };\n\n return {\n adapter,\n init: resolved,\n dispose: () => {\n window.removeEventListener(\"message\", listener);\n pending.clear();\n init = null;\n void init;\n },\n };\n}\n\n/** Reports the widget's height to the host, so the iframe can be sized to it. */\nexport function reportWidgetHeight(hostOrigin: string, element: HTMLElement): () => void {\n const send = (): void => {\n const message: WidgetResizeMessage = {\n channel: WIDGET_CHANNEL,\n version: WIDGET_PROTOCOL_VERSION,\n type: \"resize\",\n height: Math.ceil(element.getBoundingClientRect().height),\n };\n window.parent.postMessage(message, hostOrigin);\n };\n send();\n if (typeof ResizeObserver === \"undefined\") return () => undefined;\n const observer = new ResizeObserver(send);\n observer.observe(element);\n return () => observer.disconnect();\n}\n","// SPDX-License-Identifier: MIT\n/**\n * `<latch-lock-badge>`: the lock badge for any web page, with no framework.\n *\n * ```html\n * <script src=\"https://<latch site>/embed/latch-embed.js\" defer></script>\n * <latch-lock-badge chain=\"4663\" pool=\"0x…\"></latch-lock-badge>\n * <latch-lock-badge chain=\"4663\" token=\"0x…\" site=\"https://<latch site>\"></latch-lock-badge>\n * ```\n *\n * Attributes:\n * chain chain id (required); must be a chain in the SDK's address book\n * pool a pool id (bytes32), or\n * token a token address\n * pool-type `cl` (default) or `bin`\n * rpc an RPC URL to read through instead of the chain's public RPCs\n * site the Latch site origin; with it the badge links to its public\n * lock page (`/locks/pool/<id>?net=<chain>`); without it, no link\n * theme `light` | `dark` | `system` (default)\n * refresh seconds between re-reads (default 60, 0 = never)\n *\n * It reads the chain directly, through the MIT SDK, with the same readers as\n * `LocksBadge`, and renders plain DOM into a shadow root: no React, no wallet,\n * no writes. The words are only what was read (see `../locks/embedModel.ts`).\n */\n\nimport { createClient, http, isAddress, type Address, type Hex, type PublicClient } from \"viem\";\nimport { getBlock, getBlockNumber, getLogs, readContract } from \"viem/actions\";\nimport { getDeployment } from \"@latchprotocol/sdk/deployments\";\nimport { latchTransport } from \"@latchprotocol/sdk\";\n\nimport { fetchPoolLocks, fetchTokenLocks, type PoolLocksData, type TokenLocksData } from \"../locks/fetch.js\";\nimport { poolEmbedView, tokenEmbedView } from \"../locks/embedModel.js\";\nimport { advanceChainNow, formatCountdown, lockPageUrl, type LocksBadgeView } from \"../locks/model.js\";\nimport { scanClLpLockerTokenIds } from \"../locks/scan.js\";\nimport { WIDGET_CSS } from \"../styles/css.js\";\n\nexport const LOCK_BADGE_TAG = \"latch-lock-badge\";\n\n/* Latch chrome in the brand kit's colours and type: on dark grounds Latch Blue\n and Success (\"locked\"); on light grounds Deep Blue and the widget's darker\n green, which keep 4.5:1 for text. IBM Plex Sans / Mono first, then the host's\n own stack when Plex is not loaded. A host overrides with --latch-brand-*. */\nconst HOST_CSS = `\n:host { display: inline-block; max-width: 100%; vertical-align: middle; }\n.latch-embed-badge[data-latch-theme] {\n --latch-accent: var(--latch-brand-accent, #0A63E0);\n --latch-font: var(--latch-brand-font, \"IBM Plex Sans\", system-ui, -apple-system, \"Segoe UI\", sans-serif);\n --latch-font-mono: var(--latch-brand-font-mono, \"IBM Plex Mono\", ui-monospace, monospace);\n}\n.latch-embed-badge[data-latch-theme=\"dark\"] { --latch-accent: var(--latch-brand-accent, #2B8BFF); --latch-success: var(--latch-brand-success, #5FD39A); }\n@media (prefers-color-scheme: dark) {\n .latch-embed-badge[data-latch-theme=\"system\"] { --latch-accent: var(--latch-brand-accent, #2B8BFF); --latch-success: var(--latch-brand-success, #5FD39A); }\n}\n:host([hidden]) { display: none; }\n.latch-embed-badge { gap: 4px; }\n.latch-embed-badge__retry { font: inherit; font-size: 11px; background: none; border: 0; padding: 0; color: var(--latch-accent); cursor: pointer; text-decoration: underline; }\n`;\n\nconst ElementBase: typeof HTMLElement = typeof HTMLElement === \"undefined\" ? (class {} as unknown as typeof HTMLElement) : HTMLElement;\n\n/** CL LP-locker ids per chain, scanned once per page load and shared by every badge. */\nconst lpIdCache = new Map<string, Promise<bigint[]>>();\n\ntype Parsed =\n | { readonly ok: false; readonly message: string }\n | {\n readonly ok: true;\n readonly chainId: number;\n readonly target: { readonly kind: \"pool\"; readonly poolId: Hex; readonly poolType: \"cl\" | \"bin\" } | { readonly kind: \"token\"; readonly token: Address };\n };\n\n/** Pure: the element's attributes, validated. */\nexport function parseLockBadgeAttributes(get: (name: string) => string | null): Parsed {\n const chain = Number(get(\"chain\") ?? \"\");\n if (!Number.isInteger(chain) || chain <= 0) return { ok: false, message: \"Set the chain attribute to a chain id, e.g. chain=\\\"4663\\\".\" };\n const pool = get(\"pool\");\n const token = get(\"token\");\n if (pool !== null && pool !== \"\") {\n if (!/^0x[0-9a-fA-F]{64}$/.test(pool)) return { ok: false, message: \"The pool attribute is not a 32-byte pool id.\" };\n const t = (get(\"pool-type\") ?? \"cl\").toLowerCase();\n return { ok: true, chainId: chain, target: { kind: \"pool\", poolId: pool as Hex, poolType: t === \"bin\" ? \"bin\" : \"cl\" } };\n }\n if (token !== null && token !== \"\") {\n if (!isAddress(token, { strict: false })) return { ok: false, message: \"The token attribute is not an address.\" };\n return { ok: true, chainId: chain, target: { kind: \"token\", token: token as Address } };\n }\n return { ok: false, message: \"Set a pool or a token attribute.\" };\n}\n\ntype State =\n | { readonly k: \"message\"; readonly tone: \"none\" | \"error\"; readonly text: string; readonly retry: boolean }\n | { readonly k: \"loading\" }\n | { readonly k: \"ready\"; readonly view: LocksBadgeView; readonly chainNow: bigint; readonly readAtMs: number; readonly href: string | null };\n\nexport class LatchLockBadgeElement extends ElementBase {\n static get observedAttributes(): readonly string[] {\n return [\"chain\", \"pool\", \"token\", \"pool-type\", \"rpc\", \"site\", \"theme\", \"refresh\"];\n }\n\n #shadow: ShadowRoot | null = null;\n #root: HTMLDivElement | null = null;\n #state: State = { k: \"loading\" };\n #read = 0;\n #refreshTimer: ReturnType<typeof setInterval> | null = null;\n #tickTimer: ReturnType<typeof setInterval> | null = null;\n #client: { key: string; client: PublicClient } | null = null;\n\n connectedCallback(): void {\n if (this.#shadow === null) {\n this.#shadow = this.attachShadow({ mode: \"open\" });\n const style = document.createElement(\"style\");\n style.textContent = `${WIDGET_CSS}\\n${HOST_CSS}`;\n this.#shadow.appendChild(style);\n this.#root = document.createElement(\"div\");\n this.#shadow.appendChild(this.#root);\n }\n this.#start();\n }\n\n disconnectedCallback(): void {\n this.#stopTimers();\n this.#read += 1;\n }\n\n attributeChangedCallback(): void {\n if (this.#shadow !== null && this.isConnected) this.#start();\n }\n\n #stopTimers(): void {\n if (this.#refreshTimer !== null) clearInterval(this.#refreshTimer);\n if (this.#tickTimer !== null) clearInterval(this.#tickTimer);\n this.#refreshTimer = null;\n this.#tickTimer = null;\n }\n\n #start(): void {\n this.#stopTimers();\n this.#state = { k: \"loading\" };\n this.#render();\n void this.#load();\n const refresh = Number(this.getAttribute(\"refresh\") ?? \"60\");\n if (Number.isFinite(refresh) && refresh > 0) this.#refreshTimer = setInterval(() => void this.#load(), Math.max(15, refresh) * 1000);\n this.#tickTimer = setInterval(() => {\n if (this.#state.k === \"ready\" && this.#state.view.countdownTo !== null) this.#render();\n }, 1000);\n }\n\n #clientFor(chainId: number): PublicClient {\n const rpc = this.getAttribute(\"rpc\");\n const key = `${chainId}|${rpc ?? \"\"}`;\n if (this.#client?.key === key) return this.#client.client;\n const transport = rpc !== null && rpc.trim() !== \"\" ? http(rpc.trim()) : latchTransport(chainId);\n /* Only the four actions the lock readers call: a full public client would\n carry signature verification and every other action into the bundle. */\n const base = createClient({ transport });\n const client = {\n ...base,\n readContract: (args: unknown) => readContract(base, args as never),\n getBlock: (args?: unknown) => getBlock(base, args as never),\n getBlockNumber: (args?: unknown) => getBlockNumber(base, args as never),\n getLogs: (args?: unknown) => getLogs(base, args as never),\n } as unknown as PublicClient;\n this.#client = { key, client };\n return client;\n }\n\n async #load(): Promise<void> {\n const id = ++this.#read;\n const parsed = parseLockBadgeAttributes((n) => this.getAttribute(n));\n if (!parsed.ok) return this.#set(id, { k: \"message\", tone: \"error\", text: parsed.message, retry: false });\n const d = getDeployment(parsed.chainId);\n if (d === undefined) return this.#set(id, { k: \"message\", tone: \"none\", text: `Latch does not support chain ${parsed.chainId}.`, retry: false });\n const native = { symbol: d.nativeCurrency.symbol, decimals: d.nativeCurrency.decimals };\n const clLocker = d.launchpadV2.clLPLocker;\n const binLocker = d.launchpadV2.binLPLocker;\n const t = parsed.target;\n const hasLocker = t.kind === \"pool\" ? (t.poolType === \"bin\" ? binLocker !== null : d.positionLock !== null || clLocker !== null) : d.tokenLock !== null || clLocker !== null || binLocker !== null;\n if (!hasLocker) return this.#set(id, { k: \"message\", tone: \"none\", text: `Latch locks are coming soon on ${d.name}.`, retry: false });\n try {\n const client = this.#clientFor(parsed.chainId);\n let ids: bigint[] = [];\n if (clLocker !== null && !(t.kind === \"pool\" && t.poolType === \"bin\")) {\n const k = `${parsed.chainId}|${clLocker.toLowerCase()}|${this.getAttribute(\"rpc\") ?? \"\"}`;\n let p = lpIdCache.get(k);\n if (p === undefined) {\n p = scanClLpLockerTokenIds(client, clLocker, { fromBlock: d.deployedAtBlock });\n lpIdCache.set(k, p);\n p.catch(() => lpIdCache.delete(k));\n }\n ids = await p;\n }\n const lp = {\n ...(clLocker !== null ? { lpLocker: clLocker, lpLockerTokenIds: ids } : {}),\n ...(binLocker !== null ? { binLpLocker: binLocker } : {}),\n };\n let data: PoolLocksData | TokenLocksData;\n let view: LocksBadgeView;\n if (t.kind === \"pool\") {\n const pd = await fetchPoolLocks(client, d.positionLock, t.poolId, { native, lp: { ...lp, poolType: t.poolType } });\n data = pd;\n view = poolEmbedView(pd);\n } else {\n const td = await fetchTokenLocks(client, d.tokenLock, t.token, { native, lp });\n data = td;\n view = tokenEmbedView(td);\n }\n const site = this.getAttribute(\"site\");\n const href =\n site === null || site.trim() === \"\"\n ? null\n : lockPageUrl(site.trim(), t.kind === \"pool\" ? { kind: \"pool\", poolId: t.poolId } : { kind: \"token\", token: t.token }, { pathBase: \"/locks\", query: `net=${d.key}` });\n this.#set(id, { k: \"ready\", view, chainNow: data.chainNow, readAtMs: data.readAtMs, href });\n } catch {\n /* A failed refresh keeps the last good read on screen. */\n if (this.#state.k === \"ready\") return;\n this.#set(id, { k: \"message\", tone: \"error\", text: \"Couldn't load locks. Try again.\", retry: true });\n }\n }\n\n #set(id: number, state: State): void {\n if (id !== this.#read) return;\n this.#state = state;\n this.#render();\n }\n\n #render(): void {\n const root = this.#root;\n if (root === null) return;\n const theme = this.getAttribute(\"theme\");\n const s = this.#state;\n const box = document.createElement(\"div\");\n box.className = \"latch-widget latch-locks latch-locks--badge latch-embed-badge\";\n box.dataset[\"latchTheme\"] = theme === \"light\" || theme === \"dark\" ? theme : \"system\";\n const line = (cls: string, text: string, tone?: string): HTMLParagraphElement => {\n const p = document.createElement(\"p\");\n p.className = cls;\n if (tone !== undefined) {\n const dot = document.createElement(\"span\");\n dot.className = `latch-locks__dot latch-locks__dot--${tone}`;\n dot.setAttribute(\"aria-hidden\", \"true\");\n p.appendChild(dot);\n }\n const span = document.createElement(\"span\");\n span.textContent = text;\n p.appendChild(span);\n return p;\n };\n if (s.k === \"loading\") {\n box.appendChild(line(\"latch-locks__headline latch-locks__headline--muted\", \"Loading locks…\"));\n box.setAttribute(\"role\", \"status\");\n } else if (s.k === \"message\") {\n const p = line(`latch-locks__headline${s.tone === \"error\" ? \" latch-locks__headline--error\" : \"\"}`, s.text, s.tone === \"none\" ? \"none\" : undefined);\n box.appendChild(p);\n if (s.retry) {\n const b = document.createElement(\"button\");\n b.type = \"button\";\n b.className = \"latch-embed-badge__retry\";\n b.textContent = \"Retry\";\n b.addEventListener(\"click\", () => this.#start());\n box.appendChild(b);\n }\n } else {\n const headline = line(\"latch-locks__headline\", s.view.headline, s.view.tone);\n headline.title = s.view.detail ?? \"\";\n box.dataset[\"tone\"] = s.view.tone;\n box.appendChild(headline);\n if (s.view.countdownTo !== null) {\n const now = advanceChainNow(s.chainNow, s.readAtMs, Date.now());\n const p = document.createElement(\"p\");\n p.className = \"latch-locks__countdown\";\n const timer = document.createElement(\"span\");\n timer.className = \"latch-locks__timer\";\n timer.textContent = formatCountdown(s.view.countdownTo - now);\n p.append(timer, ` to ${s.view.countdownLabel ?? \"the next unlock\"}`);\n box.appendChild(p);\n }\n }\n const brand = document.createElement(\"p\");\n brand.className = \"latch-brand\";\n const site = this.getAttribute(\"site\");\n if (site !== null && site.trim() !== \"\") {\n /* The brand kit's mark, as shipped, from the Latch site: never redrawn, 24 px (the kit's\n minimum WIDTH here; the kit states 24px tall as the floor and this clears it).\n\n THE VECTOR, AND THE RIGHT ONE FOR THE GROUND. This pointed at `latch-mark-blue.png`,\n which no longer exists — the kit that replaced it drops the flat single-blue mark, so\n every third-party page embedding this badge was 404ing the image. The retired mark was\n one flat blue that read on either ground; the current one is TWO-TONE, so it needs the\n `-onlight` master on a light ground or the dark half disappears.\n\n The element already resolves its own theme (see `data-latch-theme` above), including\n `system` via matchMedia, so this reads the same value rather than guessing.\n\n INTRINSIC SIZE IS THE REAL viewBox (665 x 765), not the display size. The old code set\n 24 x 30, which is 0.800 against the master's 0.869 — a ~9% horizontal squash the moment\n the stylesheet had not loaded, against the kit's own \"do not stretch\" rule. The CSS\n (`.latch-brand__mark { width: 24px; height: auto }`) decides how big it draws; these\n attributes only reserve the correct shape. */\n const mark = document.createElement(\"img\");\n mark.className = \"latch-brand__mark\";\n /* `system` is the DEFAULT and the common case for an embed — it runs inside somebody else's\n page — so it must be resolved, not lumped in with dark. Treating it as dark would show\n the dark-ground mark on every light-themed host site. */\n const declared = box.dataset[\"latchTheme\"];\n const light =\n declared === \"light\" ||\n (declared === \"system\" &&\n typeof window.matchMedia === \"function\" &&\n window.matchMedia(\"(prefers-color-scheme: light)\").matches);\n const ground = light ? \"-onlight\" : \"\";\n mark.src = `${site.trim().replace(/\\/+$/, \"\")}/brand/masters/latch-mark${ground}.svg`;\n mark.width = 665;\n mark.height = 765;\n mark.alt = \"Latch\";\n brand.appendChild(mark);\n }\n const src = document.createElement(\"span\");\n src.textContent = \"Live from the chain\";\n brand.appendChild(src);\n const spacer = document.createElement(\"span\");\n spacer.className = \"latch-brand__spacer\";\n brand.appendChild(spacer);\n if (s.k === \"ready\" && s.href !== null) {\n const a = document.createElement(\"a\");\n a.className = \"latch-locks__link\";\n a.href = s.href;\n a.target = \"_blank\";\n a.rel = \"noopener\";\n a.textContent = \"Lock details →\";\n brand.appendChild(a);\n }\n box.appendChild(brand);\n root.replaceChildren(box);\n }\n}\n\n/** Registers `<latch-lock-badge>`. Safe to call twice. */\nexport function defineLatchLockBadge(): void {\n if (typeof customElements === \"undefined\") return;\n if (customElements.get(LOCK_BADGE_TAG) === undefined) customElements.define(LOCK_BADGE_TAG, LatchLockBadgeElement);\n}\n"],"names":["COMMON_ATTRIBUTES","parseJsonAttribute","value","label","cause","ElementBase","LatchWidgetElement","#root","#shadow","#adapter","#error","#render","style","WIDGET_CSS","mount","createRoot","root","title","#resolveAdapter","adapter","createElement","integrator","theme","slippageRaw","WidgetProvider","LatchSwapWidgetElement","SwapWidget","tokenIn","tokenOut","variant","LatchLiquidityWidgetElement","LiquidityWidget","poolId","mode","LatchLaunchWidgetElement","LaunchWidget","WIDGET_TAG_NAMES","defineLatchWidgets","registry","tag","constructor","WIDGET_CHANNEL","WIDGET_PROTOCOL_VERSION","isEnvelope","data","record","serveWidgetIframe","options","iframe","widgetOrigin","post","message","handler","event","request","method","error","listener","createIframeBridgeAdapter","hostOrigin","timeoutMs","pending","counter","resolveInit","initPromise","resolve","call","send","invoke","args","id","reject","timer","reason","resolved","reportWidgetHeight","element","observer","LOCK_BADGE_TAG","HOST_CSS","lpIdCache","parseLockBadgeAttributes","get","chain","pool","token","t","isAddress","LatchLockBadgeElement","#state","#read","#refreshTimer","#tickTimer","#client","#start","#stopTimers","#load","refresh","#clientFor","chainId","rpc","key","transport","http","latchTransport","base","createClient","client","readContract","getBlock","getBlockNumber","getLogs","parsed","n","#set","d","getDeployment","native","clLocker","binLocker","ids","k","p","scanClLpLockerTokenIds","lp","view","pd","fetchPoolLocks","poolEmbedView","td","fetchTokenLocks","tokenEmbedView","site","href","lockPageUrl","state","s","box","line","cls","text","tone","dot","span","b","headline","now","advanceChainNow","formatCountdown","brand","mark","declared","ground","src","spacer","a","defineLatchLockBadge"],"mappings":"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"}
1
+ {"version":3,"file":"embed.js","sources":["../src/embed/webComponent.tsx","../src/embed/iframe.ts","../src/embed/lockBadge.ts"],"sourcesContent":["// SPDX-License-Identifier: MIT\n/**\n * Custom-element wrappers, for hosts that are not React.\n *\n * Vue, Svelte, Angular, Astro and plain HTML can all render a custom element.\n * These mount the same React components into a shadow root, so the widget's CSS\n * cannot leak into the host page and the host's CSS cannot break the widget -\n * while `--latch-*` custom properties still inherit through the shadow boundary,\n * which is exactly the theming behaviour an embedder wants.\n *\n * ```html\n * <script type=\"module\" src=\"/latch-widgets.js\"></script>\n * <latch-swap-widget theme=\"dark\"></latch-swap-widget>\n * ```\n *\n * The adapter cannot come from an attribute - a viem transport is not JSON -\n * so set it as a property:\n *\n * ```js\n * document.querySelector(\"latch-swap-widget\").adapter = createViemAdapter({...});\n * ```\n */\n\nimport { createElement, type ComponentType } from \"react\";\nimport { createRoot, type Root } from \"react-dom/client\";\nimport type { ProtocolAdapter } from \"../adapters/protocol.js\";\nimport type { IntegratorConfig } from \"../config/integrator.js\";\nimport { WidgetProvider, type WidgetTheme } from \"../context/WidgetProvider.js\";\nimport { LaunchWidget } from \"../components/LaunchWidget.js\";\nimport { LiquidityWidget } from \"../components/LiquidityWidget.js\";\nimport { SwapWidget } from \"../components/SwapWidget.js\";\nimport { WIDGET_CSS } from \"../styles/css.js\";\n\n/** Attributes every Latch widget element understands. */\nconst COMMON_ATTRIBUTES = [\n \"integrator\",\n \"theme\",\n \"slippage-bps\",\n \"title-text\",\n] as const;\n\nfunction parseJsonAttribute<T>(value: string | null, label: string): T | null {\n if (value === null || value.trim() === \"\") return null;\n try {\n return JSON.parse(value) as T;\n } catch (cause: unknown) {\n throw new Error(\n `[@latchprotocol/widgets] the ${label} attribute is not valid JSON: ${String(cause)}`,\n );\n }\n}\n\n/**\n * SSR-safe `HTMLElement`.\n *\n * `class X extends HTMLElement` is evaluated at module load, so importing this\n * file in Node - which any host doing server-side rendering does - would throw\n * `HTMLElement is not defined` before a single line of user code ran. On the\n * server the classes extend an inert stand-in instead. They are never\n * instantiated there: `defineLatchWidgets` no-ops without `customElements`, and\n * only the browser's custom-element machinery constructs them.\n */\nconst ElementBase: typeof HTMLElement =\n typeof HTMLElement === \"undefined\"\n ? (class {} as unknown as typeof HTMLElement)\n : HTMLElement;\n\n/** Base class shared by every widget element. */\nabstract class LatchWidgetElement extends ElementBase {\n #root: Root | null = null;\n #shadow: ShadowRoot | null = null;\n #adapter: ProtocolAdapter | null = null;\n #error: string | null = null;\n\n /** Observed attributes, extended by each subclass. */\n static get observedAttributes(): readonly string[] {\n return COMMON_ATTRIBUTES;\n }\n\n /** The adapter, when set imperatively. Takes precedence over the attribute. */\n get adapter(): ProtocolAdapter | null {\n return this.#adapter;\n }\n\n set adapter(value: ProtocolAdapter | null) {\n this.#adapter = value;\n this.#render();\n }\n\n connectedCallback(): void {\n if (this.#shadow === null) {\n this.#shadow = this.attachShadow({ mode: \"open\" });\n const style = document.createElement(\"style\");\n style.textContent = WIDGET_CSS;\n this.#shadow.appendChild(style);\n const mount = document.createElement(\"div\");\n this.#shadow.appendChild(mount);\n this.#root = createRoot(mount);\n }\n this.#render();\n }\n\n disconnectedCallback(): void {\n const root = this.#root;\n this.#root = null;\n // Unmount asynchronously: React refuses to unmount during a commit, and a\n // custom element can be disconnected from inside one.\n if (root !== null) queueMicrotask(() => root.unmount());\n }\n\n attributeChangedCallback(): void {\n this.#render();\n }\n\n /** The React component this element renders. */\n protected abstract component(): ComponentType<Record<string, unknown>>;\n\n /** Extra props derived from element attributes. */\n protected widgetProps(): Record<string, unknown> {\n const title = this.getAttribute(\"title-text\");\n return title === null ? {} : { title };\n }\n\n #resolveAdapter(): ProtocolAdapter | null {\n return this.#adapter;\n }\n\n #render(): void {\n if (this.#root === null) return;\n try {\n const adapter = this.#resolveAdapter();\n if (adapter === null) {\n this.#root.render(\n createElement(\n \"div\",\n { className: \"latch-widget\" },\n createElement(\n \"p\",\n { className: \"latch-error\", role: \"alert\" },\n \"No adapter. Set the element's `adapter` property to a live adapter \" +\n \"(createViemAdapter).\",\n ),\n ),\n );\n return;\n }\n\n const integrator = parseJsonAttribute<IntegratorConfig>(\n this.getAttribute(\"integrator\"),\n \"integrator\",\n );\n const theme = (this.getAttribute(\"theme\") ?? \"dark\") as WidgetTheme;\n const slippageRaw = this.getAttribute(\"slippage-bps\");\n\n this.#error = null;\n this.#root.render(\n createElement(WidgetProvider, {\n adapter,\n theme,\n ...(integrator === null ? {} : { integrator }),\n ...(slippageRaw === null ? {} : { defaultSlippageBps: Number(slippageRaw) }),\n children: createElement(this.component(), this.widgetProps()),\n }),\n );\n } catch (cause: unknown) {\n this.#error = cause instanceof Error ? cause.message : String(cause);\n this.#root.render(\n createElement(\n \"div\",\n { className: \"latch-widget\" },\n createElement(\"p\", { className: \"latch-error\", role: \"alert\" }, this.#error),\n ),\n );\n }\n }\n}\n\n/** `<latch-swap-widget>`. */\nexport class LatchSwapWidgetElement extends LatchWidgetElement {\n static override get observedAttributes(): readonly string[] {\n return [...COMMON_ATTRIBUTES, \"token-in\", \"token-out\", \"account\", \"variant\"];\n }\n\n protected override component(): ComponentType<Record<string, unknown>> {\n return SwapWidget as ComponentType<Record<string, unknown>>;\n }\n\n protected override widgetProps(): Record<string, unknown> {\n const tokenIn = this.getAttribute(\"token-in\");\n const tokenOut = this.getAttribute(\"token-out\");\n /* `variant=\"compact\"`: the Buy / Sell pill and the always-visible lines; anything else is the default. */\n const variant = this.getAttribute(\"variant\");\n return {\n ...super.widgetProps(),\n ...(tokenIn === null ? {} : { defaultTokenIn: tokenIn }),\n ...(tokenOut === null ? {} : { defaultTokenOut: tokenOut }),\n ...(variant === \"compact\" ? { variant: \"compact\" } : {}),\n };\n }\n}\n\n/** `<latch-liquidity-widget>`. */\nexport class LatchLiquidityWidgetElement extends LatchWidgetElement {\n static override get observedAttributes(): readonly string[] {\n return [...COMMON_ATTRIBUTES, \"pool-id\", \"mode\", \"account\"];\n }\n\n protected override component(): ComponentType<Record<string, unknown>> {\n return LiquidityWidget as ComponentType<Record<string, unknown>>;\n }\n\n protected override widgetProps(): Record<string, unknown> {\n const poolId = this.getAttribute(\"pool-id\");\n const mode = this.getAttribute(\"mode\");\n return {\n ...super.widgetProps(),\n ...(poolId === null ? {} : { defaultPoolId: poolId }),\n ...(mode === \"remove\" || mode === \"add\" ? { defaultMode: mode } : {}),\n };\n }\n}\n\n/** `<latch-launch-widget>`. */\nexport class LatchLaunchWidgetElement extends LatchWidgetElement {\n static override get observedAttributes(): readonly string[] {\n return [...COMMON_ATTRIBUTES, \"pool-id\", \"account\"];\n }\n\n protected override component(): ComponentType<Record<string, unknown>> {\n return LaunchWidget as ComponentType<Record<string, unknown>>;\n }\n\n protected override widgetProps(): Record<string, unknown> {\n // A pool id, not a launchpad address: LaunchGuardHook keys every launch\n // by PoolId, and there is no per-launch contract to point at.\n const poolId = this.getAttribute(\"pool-id\");\n return {\n ...super.widgetProps(),\n ...(poolId === null ? {} : { poolId }),\n };\n }\n}\n\n/** Element tag names, so hosts do not have to hardcode strings. */\nexport const WIDGET_TAG_NAMES = {\n swap: \"latch-swap-widget\",\n liquidity: \"latch-liquidity-widget\",\n launch: \"latch-launch-widget\",\n} as const;\n\n/**\n * Registers every widget element.\n *\n * Safe to call more than once; already-registered tags are skipped rather than\n * throwing, so two copies of the bundle on one page do not break it.\n */\nexport function defineLatchWidgets(): void {\n if (typeof customElements === \"undefined\") return;\n const registry: readonly [string, CustomElementConstructor][] = [\n [WIDGET_TAG_NAMES.swap, LatchSwapWidgetElement],\n [WIDGET_TAG_NAMES.liquidity, LatchLiquidityWidgetElement],\n [WIDGET_TAG_NAMES.launch, LatchLaunchWidgetElement],\n ];\n for (const [tag, constructor] of registry) {\n if (customElements.get(tag) === undefined) {\n customElements.define(tag, constructor);\n }\n }\n}\n","// SPDX-License-Identifier: MIT\n/**\n * Iframe embedding: the postMessage contract.\n *\n * The web component is the right answer for most hosts. The iframe exists for\n * the case the web component cannot serve: a host that will not run third-party\n * script in its own realm - which, for a widget asking users to sign\n * transactions, is a reasonable position for a host to take.\n *\n * ## The split\n *\n * The **widget** runs inside the iframe and owns only rendering. It holds no\n * keys and opens no RPC connections. Every chain read and write is a request to\n * the host.\n *\n * The **host** runs in the parent page, owns the wallet and a real\n * {@link ../adapters/protocol.js | ProtocolAdapter}, and answers those requests.\n *\n * ```text\n * iframe (widget) parent (host)\n * ──────────────── ─────────────\n * ready ─────────────────────────────────▶\n * ◀───────────────────────────── init { chain, integrator, theme }\n * invoke { id, method, args } ───────────▶\n * ◀────────── result { id, ok, value } | { id, ok: false, error }\n * resize { height } ─────────────────────▶\n * event { name, payload } ──────────────▶\n * ```\n *\n * ## Message contract\n *\n * Every message is `{ channel: \"latch-widget\", version: 1, ... }`. Anything\n * without that envelope is ignored. Both sides pin the counterpart origin -\n * the host passes the widget's origin, the widget receives the host's in\n * `init` - and every later message is checked against it. `event.origin` is the\n * only trustworthy field on a `MessageEvent`; nothing inside `data` is trusted\n * for identity.\n *\n * `BigInt` survives structured clone, so amounts cross the boundary as exact\n * integers. Never stringify them for transport - a float round-trip is how\n * money goes missing.\n *\n * ## What the host must validate\n *\n * The host is the security boundary. Before signing anything it should check:\n *\n * - the transaction's `to` is a contract it expects (its own router address);\n * - `value` matches what the user was shown;\n * - `integratorFee.referrer` is the host's own address, if it configured one.\n *\n * A widget in an iframe is still third-party code. This contract makes it\n * *inspectable*, not trusted.\n */\n\nimport type {\n ProtocolAdapter,\n WidgetTransactionRequest,\n} from \"../adapters/protocol.js\";\nimport type { IntegratorConfig } from \"../config/integrator.js\";\nimport type { WidgetTheme } from \"../context/WidgetProvider.js\";\n\n/** Channel name on every message in this protocol. */\nexport const WIDGET_CHANNEL = \"latch-widget\";\n\n/** Version of the message contract. Bumped on any breaking change. */\nexport const WIDGET_PROTOCOL_VERSION = 1;\n\n/** Adapter methods the widget may invoke on the host. */\nexport type BridgeMethod = Extract<\n keyof ProtocolAdapter,\n | \"getAccount\"\n | \"listTokens\"\n | \"getToken\"\n | \"getBalance\"\n | \"listPools\"\n | \"getPoolState\"\n | \"getApprovalRequirements\"\n | \"buildApproval\"\n | \"quoteSwap\"\n | \"buildSwap\"\n | \"quoteAddLiquidity\"\n | \"buildAddLiquidity\"\n | \"listPositions\"\n | \"quoteRemoveLiquidity\"\n | \"buildRemoveLiquidity\"\n | \"listLaunches\"\n | \"getLaunch\"\n | \"getLaunchesForToken\"\n | \"sendTransaction\"\n | \"waitForTransaction\"\n>;\n\n/** Sent by the widget once it has mounted and is ready for `init`. */\nexport interface WidgetReadyMessage {\n readonly channel: typeof WIDGET_CHANNEL;\n readonly version: number;\n readonly type: \"ready\";\n}\n\n/** Sent by the host in response to `ready`. */\nexport interface HostInitMessage {\n readonly channel: typeof WIDGET_CHANNEL;\n readonly version: number;\n readonly type: \"init\";\n readonly widget: \"swap\" | \"liquidity\" | \"launch\";\n readonly integrator: IntegratorConfig | null;\n readonly theme: WidgetTheme;\n /** Chain metadata, minus anything unserialisable (no transport). */\n readonly chain: {\n readonly chainId: number;\n readonly name: string;\n readonly nativeCurrency: { name: string; symbol: string; decimals: number };\n readonly blockExplorerUrl?: string;\n };\n /** `true` when the host's adapter is a mock, so the widget can warn. */\n readonly isMock: boolean;\n}\n\n/** A remote adapter call, widget to host. */\nexport interface WidgetInvokeMessage {\n readonly channel: typeof WIDGET_CHANNEL;\n readonly version: number;\n readonly type: \"invoke\";\n readonly id: string;\n readonly method: BridgeMethod;\n readonly args: readonly unknown[];\n}\n\n/** The host's answer to an `invoke`. */\nexport type HostResultMessage =\n | {\n readonly channel: typeof WIDGET_CHANNEL;\n readonly version: number;\n readonly type: \"result\";\n readonly id: string;\n readonly ok: true;\n readonly value: unknown;\n }\n | {\n readonly channel: typeof WIDGET_CHANNEL;\n readonly version: number;\n readonly type: \"result\";\n readonly id: string;\n readonly ok: false;\n readonly error: { readonly name: string; readonly message: string };\n };\n\n/** Height report, so the host can size the iframe without scrollbars. */\nexport interface WidgetResizeMessage {\n readonly channel: typeof WIDGET_CHANNEL;\n readonly version: number;\n readonly type: \"resize\";\n readonly height: number;\n}\n\n/** Lifecycle notifications the host may log or act on. */\nexport interface WidgetEventMessage {\n readonly channel: typeof WIDGET_CHANNEL;\n readonly version: number;\n readonly type: \"event\";\n readonly name: \"quote\" | \"transaction-submitted\" | \"transaction-confirmed\" | \"error\";\n readonly payload: Record<string, unknown>;\n}\n\n/** Anything the widget sends. */\nexport type WidgetMessage =\n | WidgetReadyMessage\n | WidgetInvokeMessage\n | WidgetResizeMessage\n | WidgetEventMessage;\n\n/** Anything the host sends. */\nexport type HostMessage = HostInitMessage | HostResultMessage;\n\nfunction isEnvelope(data: unknown): data is { channel: string; version: number; type: string } {\n if (typeof data !== \"object\" || data === null) return false;\n const record = data as Record<string, unknown>;\n return (\n record[\"channel\"] === WIDGET_CHANNEL &&\n record[\"version\"] === WIDGET_PROTOCOL_VERSION &&\n typeof record[\"type\"] === \"string\"\n );\n}\n\n/** Options for {@link serveWidgetIframe}. */\nexport interface ServeWidgetIframeOptions {\n /** The iframe element the widget is running in. */\n readonly iframe: HTMLIFrameElement;\n /** Exact origin the iframe is served from. Never `\"*\"`. */\n readonly widgetOrigin: string;\n /** The adapter that answers the widget's requests. */\n readonly adapter: ProtocolAdapter;\n readonly widget: \"swap\" | \"liquidity\" | \"launch\";\n readonly integrator?: IntegratorConfig;\n readonly theme?: WidgetTheme;\n /**\n * Last-line inspection before a transaction is signed. Return `false` to\n * refuse. Use it to assert the fee recipient is you.\n */\n readonly approveTransaction?: (request: WidgetTransactionRequest) => boolean | Promise<boolean>;\n /** Called on every widget event, for analytics. */\n readonly onEvent?: (message: WidgetEventMessage) => void;\n /** Called when the widget reports its height. */\n readonly onResize?: (height: number) => void;\n}\n\n/**\n * Host side of the bridge: answers the widget's adapter calls.\n *\n * @returns a disposer that removes the listener.\n */\nexport function serveWidgetIframe(options: ServeWidgetIframeOptions): () => void {\n const { iframe, widgetOrigin, adapter } = options;\n\n if (widgetOrigin === \"*\" || widgetOrigin.trim() === \"\") {\n throw new Error(\n '[@latchprotocol/widgets] widgetOrigin must be an exact origin, never \"*\". ' +\n \"A wildcard origin lets any framed page impersonate the widget.\",\n );\n }\n\n const post = (message: HostMessage): void => {\n iframe.contentWindow?.postMessage(message, widgetOrigin);\n };\n\n const handler = async (event: MessageEvent<unknown>): Promise<void> => {\n if (event.origin !== widgetOrigin) return;\n if (event.source !== iframe.contentWindow) return;\n if (!isEnvelope(event.data)) return;\n const message = event.data as WidgetMessage;\n\n if (message.type === \"ready\") {\n post({\n channel: WIDGET_CHANNEL,\n version: WIDGET_PROTOCOL_VERSION,\n type: \"init\",\n widget: options.widget,\n integrator: options.integrator ?? null,\n theme: options.theme ?? \"dark\",\n chain: {\n chainId: adapter.chain.chainId,\n name: adapter.chain.name,\n nativeCurrency: adapter.chain.nativeCurrency,\n ...(adapter.chain.blockExplorerUrl === undefined\n ? {}\n : { blockExplorerUrl: adapter.chain.blockExplorerUrl }),\n },\n isMock: adapter.isMock,\n });\n return;\n }\n\n if (message.type === \"resize\") {\n options.onResize?.(message.height);\n return;\n }\n\n if (message.type === \"event\") {\n options.onEvent?.(message);\n return;\n }\n\n if (message.type !== \"invoke\") return;\n\n try {\n if (message.method === \"sendTransaction\" && options.approveTransaction !== undefined) {\n const request = message.args[0] as WidgetTransactionRequest;\n const approved = await options.approveTransaction(request);\n if (!approved) {\n throw new Error(\"The host refused this transaction\");\n }\n }\n const method = adapter[message.method] as (...args: unknown[]) => Promise<unknown>;\n if (typeof method !== \"function\") {\n throw new Error(`Unknown bridge method: ${String(message.method)}`);\n }\n const value: unknown = await method.apply(adapter, [...message.args]);\n post({\n channel: WIDGET_CHANNEL,\n version: WIDGET_PROTOCOL_VERSION,\n type: \"result\",\n id: message.id,\n ok: true,\n value,\n });\n } catch (cause: unknown) {\n const error = cause instanceof Error ? cause : new Error(String(cause));\n post({\n channel: WIDGET_CHANNEL,\n version: WIDGET_PROTOCOL_VERSION,\n type: \"result\",\n id: message.id,\n ok: false,\n error: { name: error.name, message: error.message },\n });\n }\n };\n\n const listener = (event: MessageEvent<unknown>): void => {\n void handler(event);\n };\n\n window.addEventListener(\"message\", listener);\n return () => window.removeEventListener(\"message\", listener);\n}\n\n/** A pending remote call. */\ninterface PendingCall {\n resolve(value: unknown): void;\n reject(reason: Error): void;\n}\n\n/** Options for {@link createIframeBridgeAdapter}. */\nexport interface IframeBridgeOptions {\n /** Exact origin of the host page. */\n readonly hostOrigin: string;\n /** How long to wait for a reply before failing, in ms. */\n readonly timeoutMs?: number;\n}\n\n/**\n * Widget side of the bridge: a {@link ProtocolAdapter} that forwards every call\n * to the host page.\n *\n * Runs inside the iframe. Resolves once the host's `init` arrives, so a widget\n * never renders against a half-configured bridge.\n */\nexport async function createIframeBridgeAdapter(\n options: IframeBridgeOptions,\n): Promise<{ adapter: ProtocolAdapter; init: HostInitMessage; dispose(): void }> {\n const { hostOrigin } = options;\n const timeoutMs = options.timeoutMs ?? 60_000;\n\n if (hostOrigin === \"*\" || hostOrigin.trim() === \"\") {\n throw new Error('[@latchprotocol/widgets] hostOrigin must be an exact origin, never \"*\"');\n }\n\n const pending = new Map<string, PendingCall>();\n let counter = 0;\n let init: HostInitMessage | null = null;\n let resolveInit: ((message: HostInitMessage) => void) | null = null;\n\n const initPromise = new Promise<HostInitMessage>((resolve) => {\n resolveInit = resolve;\n });\n\n const listener = (event: MessageEvent<unknown>): void => {\n if (event.origin !== hostOrigin) return;\n if (!isEnvelope(event.data)) return;\n const message = event.data as HostMessage;\n\n if (message.type === \"init\") {\n init = message;\n resolveInit?.(message);\n return;\n }\n if (message.type !== \"result\") return;\n\n const call = pending.get(message.id);\n if (call === undefined) return;\n pending.delete(message.id);\n if (message.ok) call.resolve(message.value);\n else {\n const error = new Error(message.error.message);\n error.name = message.error.name;\n call.reject(error);\n }\n };\n\n window.addEventListener(\"message\", listener);\n\n const send = (message: WidgetMessage): void => {\n window.parent.postMessage(message, hostOrigin);\n };\n\n const invoke = (method: BridgeMethod, args: readonly unknown[]): Promise<unknown> => {\n counter += 1;\n const id = `${Date.now().toString(36)}-${counter}`;\n return new Promise<unknown>((resolve, reject) => {\n const timer = setTimeout(() => {\n pending.delete(id);\n reject(new Error(`[@latchprotocol/widgets] host did not answer ${method} in ${timeoutMs}ms`));\n }, timeoutMs);\n pending.set(id, {\n resolve: (value) => {\n clearTimeout(timer);\n resolve(value);\n },\n reject: (reason) => {\n clearTimeout(timer);\n reject(reason);\n },\n });\n send({\n channel: WIDGET_CHANNEL,\n version: WIDGET_PROTOCOL_VERSION,\n type: \"invoke\",\n id,\n method,\n args,\n });\n });\n };\n\n send({ channel: WIDGET_CHANNEL, version: WIDGET_PROTOCOL_VERSION, type: \"ready\" });\n const resolved = await initPromise;\n\n const call =\n (method: BridgeMethod) =>\n (...args: unknown[]): Promise<never> =>\n invoke(method, args) as Promise<never>;\n\n const adapter: ProtocolAdapter = {\n kind: \"iframe-bridge\",\n isMock: resolved.isMock,\n chain: {\n chainId: resolved.chain.chainId,\n name: resolved.chain.name,\n nativeCurrency: resolved.chain.nativeCurrency,\n // The bridge deliberately carries no addresses: the widget never builds\n // calldata itself, the host does.\n contracts: { vault: \"0x0000000000000000000000000000000000000000\" },\n ...(resolved.chain.blockExplorerUrl === undefined\n ? {}\n : { blockExplorerUrl: resolved.chain.blockExplorerUrl }),\n },\n getAccount: call(\"getAccount\"),\n listTokens: call(\"listTokens\"),\n getToken: call(\"getToken\"),\n getBalance: call(\"getBalance\"),\n listPools: call(\"listPools\"),\n getPoolState: call(\"getPoolState\"),\n getApprovalRequirements: call(\"getApprovalRequirements\"),\n buildApproval: call(\"buildApproval\"),\n quoteSwap: call(\"quoteSwap\"),\n buildSwap: call(\"buildSwap\"),\n quoteAddLiquidity: call(\"quoteAddLiquidity\"),\n buildAddLiquidity: call(\"buildAddLiquidity\"),\n listPositions: call(\"listPositions\"),\n quoteRemoveLiquidity: call(\"quoteRemoveLiquidity\"),\n buildRemoveLiquidity: call(\"buildRemoveLiquidity\"),\n listLaunches: call(\"listLaunches\"),\n getLaunch: call(\"getLaunch\"),\n getLaunchesForToken: call(\"getLaunchesForToken\"),\n sendTransaction: call(\"sendTransaction\"),\n waitForTransaction: call(\"waitForTransaction\"),\n };\n\n return {\n adapter,\n init: resolved,\n dispose: () => {\n window.removeEventListener(\"message\", listener);\n pending.clear();\n init = null;\n void init;\n },\n };\n}\n\n/** Reports the widget's height to the host, so the iframe can be sized to it. */\nexport function reportWidgetHeight(hostOrigin: string, element: HTMLElement): () => void {\n const send = (): void => {\n const message: WidgetResizeMessage = {\n channel: WIDGET_CHANNEL,\n version: WIDGET_PROTOCOL_VERSION,\n type: \"resize\",\n height: Math.ceil(element.getBoundingClientRect().height),\n };\n window.parent.postMessage(message, hostOrigin);\n };\n send();\n if (typeof ResizeObserver === \"undefined\") return () => undefined;\n const observer = new ResizeObserver(send);\n observer.observe(element);\n return () => observer.disconnect();\n}\n","// SPDX-License-Identifier: MIT\n/**\n * `<latch-lock-badge>`: the lock badge for any web page, with no framework.\n *\n * ```html\n * <script src=\"https://<latch site>/embed/latch-embed.js\" defer></script>\n * <latch-lock-badge chain=\"4663\" pool=\"0x…\"></latch-lock-badge>\n * <latch-lock-badge chain=\"4663\" token=\"0x…\" site=\"https://<latch site>\"></latch-lock-badge>\n * ```\n *\n * Attributes:\n * chain chain id (required); must be a chain in the SDK's address book\n * pool a pool id (bytes32), or\n * token a token address\n * pool-type `cl` (default) or `bin`\n * rpc an RPC URL to read through instead of the chain's public RPCs\n * site the Latch site origin; with it the badge links to its public\n * lock page (`/locks/pool/<id>?net=<chain>`); without it, no link\n * theme `dark` (default) | `light` | `system`\n * refresh seconds between re-reads (default 60, 0 = never)\n *\n * It reads the chain directly, through the MIT SDK, with the same readers as\n * `LocksBadge`, and renders plain DOM into a shadow root: no React, no wallet,\n * no writes. The words are only what was read (see `../locks/embedModel.ts`).\n */\n\nimport { createClient, http, isAddress, type Address, type Hex, type PublicClient } from \"viem\";\nimport { getBlock, getBlockNumber, getLogs, readContract } from \"viem/actions\";\nimport { getDeployment } from \"@latchprotocol/sdk/deployments\";\nimport { latchTransport } from \"@latchprotocol/sdk\";\n\nimport { fetchPoolLocks, fetchTokenLocks, type PoolLocksData, type TokenLocksData } from \"../locks/fetch.js\";\nimport { poolEmbedView, tokenEmbedView } from \"../locks/embedModel.js\";\nimport { advanceChainNow, formatCountdown, lockPageUrl, type LocksBadgeView } from \"../locks/model.js\";\nimport { scanClLpLockerTokenIds } from \"../locks/scan.js\";\nimport { WIDGET_CSS } from \"../styles/css.js\";\n\nexport const LOCK_BADGE_TAG = \"latch-lock-badge\";\n\n/* Latch chrome in the brand kit's colours and type: on dark grounds Latch Blue\n and Success (\"locked\"); on light grounds Deep Blue and the widget's darker\n green, which keep 4.5:1 for text. IBM Plex Sans / Mono first, then the host's\n own stack when Plex is not loaded. A host overrides with --latch-brand-*. */\nconst HOST_CSS = `\n:host { display: inline-block; max-width: 100%; vertical-align: middle; }\n.latch-embed-badge[data-latch-theme] {\n --latch-accent: var(--latch-brand-accent, #0A63E0);\n --latch-font: var(--latch-brand-font, \"IBM Plex Sans\", system-ui, -apple-system, \"Segoe UI\", sans-serif);\n --latch-font-mono: var(--latch-brand-font-mono, \"IBM Plex Mono\", ui-monospace, monospace);\n}\n.latch-embed-badge[data-latch-theme=\"dark\"] { --latch-accent: var(--latch-brand-accent, #2B8BFF); --latch-success: var(--latch-brand-success, #5FD39A); }\n@media (prefers-color-scheme: dark) {\n .latch-embed-badge[data-latch-theme=\"system\"] { --latch-accent: var(--latch-brand-accent, #2B8BFF); --latch-success: var(--latch-brand-success, #5FD39A); }\n}\n:host([hidden]) { display: none; }\n.latch-embed-badge { gap: 4px; }\n.latch-embed-badge__retry { font: inherit; font-size: 11px; background: none; border: 0; padding: 0; color: var(--latch-accent); cursor: pointer; text-decoration: underline; }\n`;\n\nconst ElementBase: typeof HTMLElement = typeof HTMLElement === \"undefined\" ? (class {} as unknown as typeof HTMLElement) : HTMLElement;\n\n/** CL LP-locker ids per chain, scanned once per page load and shared by every badge. */\nconst lpIdCache = new Map<string, Promise<bigint[]>>();\n\ntype Parsed =\n | { readonly ok: false; readonly message: string }\n | {\n readonly ok: true;\n readonly chainId: number;\n readonly target: { readonly kind: \"pool\"; readonly poolId: Hex; readonly poolType: \"cl\" | \"bin\" } | { readonly kind: \"token\"; readonly token: Address };\n };\n\n/** Pure: the element's attributes, validated. */\nexport function parseLockBadgeAttributes(get: (name: string) => string | null): Parsed {\n const chain = Number(get(\"chain\") ?? \"\");\n if (!Number.isInteger(chain) || chain <= 0) return { ok: false, message: \"Set the chain attribute to a chain id, e.g. chain=\\\"4663\\\".\" };\n const pool = get(\"pool\");\n const token = get(\"token\");\n if (pool !== null && pool !== \"\") {\n if (!/^0x[0-9a-fA-F]{64}$/.test(pool)) return { ok: false, message: \"The pool attribute is not a 32-byte pool id.\" };\n const t = (get(\"pool-type\") ?? \"cl\").toLowerCase();\n return { ok: true, chainId: chain, target: { kind: \"pool\", poolId: pool as Hex, poolType: t === \"bin\" ? \"bin\" : \"cl\" } };\n }\n if (token !== null && token !== \"\") {\n if (!isAddress(token, { strict: false })) return { ok: false, message: \"The token attribute is not an address.\" };\n return { ok: true, chainId: chain, target: { kind: \"token\", token: token as Address } };\n }\n return { ok: false, message: \"Set a pool or a token attribute.\" };\n}\n\ntype State =\n | { readonly k: \"message\"; readonly tone: \"none\" | \"error\"; readonly text: string; readonly retry: boolean }\n | { readonly k: \"loading\" }\n | { readonly k: \"ready\"; readonly view: LocksBadgeView; readonly chainNow: bigint; readonly readAtMs: number; readonly href: string | null };\n\nexport class LatchLockBadgeElement extends ElementBase {\n static get observedAttributes(): readonly string[] {\n return [\"chain\", \"pool\", \"token\", \"pool-type\", \"rpc\", \"site\", \"theme\", \"refresh\"];\n }\n\n #shadow: ShadowRoot | null = null;\n #root: HTMLDivElement | null = null;\n #state: State = { k: \"loading\" };\n #read = 0;\n #refreshTimer: ReturnType<typeof setInterval> | null = null;\n #tickTimer: ReturnType<typeof setInterval> | null = null;\n #client: { key: string; client: PublicClient } | null = null;\n\n connectedCallback(): void {\n if (this.#shadow === null) {\n this.#shadow = this.attachShadow({ mode: \"open\" });\n const style = document.createElement(\"style\");\n style.textContent = `${WIDGET_CSS}\\n${HOST_CSS}`;\n this.#shadow.appendChild(style);\n this.#root = document.createElement(\"div\");\n this.#shadow.appendChild(this.#root);\n }\n this.#start();\n }\n\n disconnectedCallback(): void {\n this.#stopTimers();\n this.#read += 1;\n }\n\n attributeChangedCallback(): void {\n if (this.#shadow !== null && this.isConnected) this.#start();\n }\n\n #stopTimers(): void {\n if (this.#refreshTimer !== null) clearInterval(this.#refreshTimer);\n if (this.#tickTimer !== null) clearInterval(this.#tickTimer);\n this.#refreshTimer = null;\n this.#tickTimer = null;\n }\n\n #start(): void {\n this.#stopTimers();\n this.#state = { k: \"loading\" };\n this.#render();\n void this.#load();\n const refresh = Number(this.getAttribute(\"refresh\") ?? \"60\");\n if (Number.isFinite(refresh) && refresh > 0) this.#refreshTimer = setInterval(() => void this.#load(), Math.max(15, refresh) * 1000);\n this.#tickTimer = setInterval(() => {\n if (this.#state.k === \"ready\" && this.#state.view.countdownTo !== null) this.#render();\n }, 1000);\n }\n\n #clientFor(chainId: number): PublicClient {\n const rpc = this.getAttribute(\"rpc\");\n const key = `${chainId}|${rpc ?? \"\"}`;\n if (this.#client?.key === key) return this.#client.client;\n const transport = rpc !== null && rpc.trim() !== \"\" ? http(rpc.trim()) : latchTransport(chainId);\n /* Only the four actions the lock readers call: a full public client would\n carry signature verification and every other action into the bundle. */\n const base = createClient({ transport });\n const client = {\n ...base,\n readContract: (args: unknown) => readContract(base, args as never),\n getBlock: (args?: unknown) => getBlock(base, args as never),\n getBlockNumber: (args?: unknown) => getBlockNumber(base, args as never),\n getLogs: (args?: unknown) => getLogs(base, args as never),\n } as unknown as PublicClient;\n this.#client = { key, client };\n return client;\n }\n\n async #load(): Promise<void> {\n const id = ++this.#read;\n const parsed = parseLockBadgeAttributes((n) => this.getAttribute(n));\n if (!parsed.ok) return this.#set(id, { k: \"message\", tone: \"error\", text: parsed.message, retry: false });\n const d = getDeployment(parsed.chainId);\n if (d === undefined) return this.#set(id, { k: \"message\", tone: \"none\", text: `Latch does not support chain ${parsed.chainId}.`, retry: false });\n const native = { symbol: d.nativeCurrency.symbol, decimals: d.nativeCurrency.decimals };\n const clLocker = d.launchpadV2.clLPLocker;\n const binLocker = d.launchpadV2.binLPLocker;\n const t = parsed.target;\n const hasLocker = t.kind === \"pool\" ? (t.poolType === \"bin\" ? binLocker !== null : d.positionLock !== null || clLocker !== null) : d.tokenLock !== null || clLocker !== null || binLocker !== null;\n if (!hasLocker) return this.#set(id, { k: \"message\", tone: \"none\", text: `Latch locks are coming soon on ${d.name}.`, retry: false });\n try {\n const client = this.#clientFor(parsed.chainId);\n let ids: bigint[] = [];\n if (clLocker !== null && !(t.kind === \"pool\" && t.poolType === \"bin\")) {\n const k = `${parsed.chainId}|${clLocker.toLowerCase()}|${this.getAttribute(\"rpc\") ?? \"\"}`;\n let p = lpIdCache.get(k);\n if (p === undefined) {\n p = scanClLpLockerTokenIds(client, clLocker, { fromBlock: d.deployedAtBlock });\n lpIdCache.set(k, p);\n p.catch(() => lpIdCache.delete(k));\n }\n ids = await p;\n }\n const lp = {\n ...(clLocker !== null ? { lpLocker: clLocker, lpLockerTokenIds: ids } : {}),\n ...(binLocker !== null ? { binLpLocker: binLocker } : {}),\n };\n let data: PoolLocksData | TokenLocksData;\n let view: LocksBadgeView;\n if (t.kind === \"pool\") {\n const pd = await fetchPoolLocks(client, d.positionLock, t.poolId, { native, lp: { ...lp, poolType: t.poolType } });\n data = pd;\n view = poolEmbedView(pd);\n } else {\n const td = await fetchTokenLocks(client, d.tokenLock, t.token, { native, lp });\n data = td;\n view = tokenEmbedView(td);\n }\n const site = this.getAttribute(\"site\");\n const href =\n site === null || site.trim() === \"\"\n ? null\n : lockPageUrl(site.trim(), t.kind === \"pool\" ? { kind: \"pool\", poolId: t.poolId } : { kind: \"token\", token: t.token }, { pathBase: \"/locks\", query: `net=${d.key}` });\n this.#set(id, { k: \"ready\", view, chainNow: data.chainNow, readAtMs: data.readAtMs, href });\n } catch {\n /* A failed refresh keeps the last good read on screen. */\n if (this.#state.k === \"ready\") return;\n this.#set(id, { k: \"message\", tone: \"error\", text: \"Couldn't load locks. Try again.\", retry: true });\n }\n }\n\n #set(id: number, state: State): void {\n if (id !== this.#read) return;\n this.#state = state;\n this.#render();\n }\n\n #render(): void {\n const root = this.#root;\n if (root === null) return;\n const theme = this.getAttribute(\"theme\");\n const s = this.#state;\n const box = document.createElement(\"div\");\n box.className = \"latch-widget latch-locks latch-locks--badge latch-embed-badge\";\n box.dataset[\"latchTheme\"] = theme === \"light\" || theme === \"system\" ? theme : \"dark\";\n const line = (cls: string, text: string, tone?: string): HTMLParagraphElement => {\n const p = document.createElement(\"p\");\n p.className = cls;\n if (tone !== undefined) {\n const dot = document.createElement(\"span\");\n dot.className = `latch-locks__dot latch-locks__dot--${tone}`;\n dot.setAttribute(\"aria-hidden\", \"true\");\n p.appendChild(dot);\n }\n const span = document.createElement(\"span\");\n span.textContent = text;\n p.appendChild(span);\n return p;\n };\n if (s.k === \"loading\") {\n box.appendChild(line(\"latch-locks__headline latch-locks__headline--muted\", \"Loading locks…\"));\n box.setAttribute(\"role\", \"status\");\n } else if (s.k === \"message\") {\n const p = line(`latch-locks__headline${s.tone === \"error\" ? \" latch-locks__headline--error\" : \"\"}`, s.text, s.tone === \"none\" ? \"none\" : undefined);\n box.appendChild(p);\n if (s.retry) {\n const b = document.createElement(\"button\");\n b.type = \"button\";\n b.className = \"latch-embed-badge__retry\";\n b.textContent = \"Retry\";\n b.addEventListener(\"click\", () => this.#start());\n box.appendChild(b);\n }\n } else {\n const headline = line(\"latch-locks__headline\", s.view.headline, s.view.tone);\n headline.title = s.view.detail ?? \"\";\n box.dataset[\"tone\"] = s.view.tone;\n box.appendChild(headline);\n if (s.view.countdownTo !== null) {\n const now = advanceChainNow(s.chainNow, s.readAtMs, Date.now());\n const p = document.createElement(\"p\");\n p.className = \"latch-locks__countdown\";\n const timer = document.createElement(\"span\");\n timer.className = \"latch-locks__timer\";\n timer.textContent = formatCountdown(s.view.countdownTo - now);\n p.append(timer, ` to ${s.view.countdownLabel ?? \"the next unlock\"}`);\n box.appendChild(p);\n }\n }\n const brand = document.createElement(\"p\");\n brand.className = \"latch-brand\";\n const site = this.getAttribute(\"site\");\n if (site !== null && site.trim() !== \"\") {\n /* The brand kit's mark, as shipped, from the Latch site: never redrawn, 24 px (the kit's\n minimum WIDTH here; the kit states 24px tall as the floor and this clears it).\n\n THE VECTOR, AND THE RIGHT ONE FOR THE GROUND. This pointed at `latch-mark-blue.png`,\n which no longer exists — the kit that replaced it drops the flat single-blue mark, so\n every third-party page embedding this badge was 404ing the image. The retired mark was\n one flat blue that read on either ground; the current one is TWO-TONE, so it needs the\n `-onlight` master on a light ground or the dark half disappears.\n\n The element already resolves its own theme (see `data-latch-theme` above), including\n `system` via matchMedia, so this reads the same value rather than guessing.\n\n INTRINSIC SIZE IS THE REAL viewBox (665 x 765), not the display size. The old code set\n 24 x 30, which is 0.800 against the master's 0.869 — a ~9% horizontal squash the moment\n the stylesheet had not loaded, against the kit's own \"do not stretch\" rule. The CSS\n (`.latch-brand__mark { width: 24px; height: auto }`) decides how big it draws; these\n attributes only reserve the correct shape. */\n const mark = document.createElement(\"img\");\n mark.className = \"latch-brand__mark\";\n /* `system` is the DEFAULT and the common case for an embed — it runs inside somebody else's\n page — so it must be resolved, not lumped in with dark. Treating it as dark would show\n the dark-ground mark on every light-themed host site. */\n const declared = box.dataset[\"latchTheme\"];\n const light =\n declared === \"light\" ||\n (declared === \"system\" &&\n typeof window.matchMedia === \"function\" &&\n window.matchMedia(\"(prefers-color-scheme: light)\").matches);\n const ground = light ? \"-onlight\" : \"\";\n mark.src = `${site.trim().replace(/\\/+$/, \"\")}/brand/masters/latch-mark${ground}.svg`;\n mark.width = 665;\n mark.height = 765;\n mark.alt = \"Latch\";\n brand.appendChild(mark);\n }\n const src = document.createElement(\"span\");\n src.textContent = \"Live from the chain\";\n brand.appendChild(src);\n const spacer = document.createElement(\"span\");\n spacer.className = \"latch-brand__spacer\";\n brand.appendChild(spacer);\n if (s.k === \"ready\" && s.href !== null) {\n const a = document.createElement(\"a\");\n a.className = \"latch-locks__link\";\n a.href = s.href;\n a.target = \"_blank\";\n a.rel = \"noopener\";\n a.textContent = \"Lock details →\";\n brand.appendChild(a);\n }\n box.appendChild(brand);\n root.replaceChildren(box);\n }\n}\n\n/** Registers `<latch-lock-badge>`. Safe to call twice. */\nexport function defineLatchLockBadge(): void {\n if (typeof customElements === \"undefined\") return;\n if (customElements.get(LOCK_BADGE_TAG) === undefined) customElements.define(LOCK_BADGE_TAG, LatchLockBadgeElement);\n}\n"],"names":["COMMON_ATTRIBUTES","parseJsonAttribute","value","label","cause","ElementBase","LatchWidgetElement","#root","#shadow","#adapter","#error","#render","style","WIDGET_CSS","mount","createRoot","root","title","#resolveAdapter","adapter","createElement","integrator","theme","slippageRaw","WidgetProvider","LatchSwapWidgetElement","SwapWidget","tokenIn","tokenOut","variant","LatchLiquidityWidgetElement","LiquidityWidget","poolId","mode","LatchLaunchWidgetElement","LaunchWidget","WIDGET_TAG_NAMES","defineLatchWidgets","registry","tag","constructor","WIDGET_CHANNEL","WIDGET_PROTOCOL_VERSION","isEnvelope","data","record","serveWidgetIframe","options","iframe","widgetOrigin","post","message","handler","event","request","method","error","listener","createIframeBridgeAdapter","hostOrigin","timeoutMs","pending","counter","resolveInit","initPromise","resolve","call","send","invoke","args","id","reject","timer","reason","resolved","reportWidgetHeight","element","observer","LOCK_BADGE_TAG","HOST_CSS","lpIdCache","parseLockBadgeAttributes","get","chain","pool","token","t","isAddress","LatchLockBadgeElement","#state","#read","#refreshTimer","#tickTimer","#client","#start","#stopTimers","#load","refresh","#clientFor","chainId","rpc","key","transport","http","latchTransport","base","createClient","client","readContract","getBlock","getBlockNumber","getLogs","parsed","n","#set","d","getDeployment","native","clLocker","binLocker","ids","k","p","scanClLpLockerTokenIds","lp","view","pd","fetchPoolLocks","poolEmbedView","td","fetchTokenLocks","tokenEmbedView","site","href","lockPageUrl","state","s","box","line","cls","text","tone","dot","span","b","headline","now","advanceChainNow","formatCountdown","brand","mark","declared","ground","src","spacer","a","defineLatchLockBadge"],"mappings":"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"}
package/dist/headless.js CHANGED
@@ -1,5 +1,5 @@
1
- import { A as e, a as o, b as t, B as r, c as i, d as n, C as u, e as c, f as l, D as b, g as d, E as A, H as p, I as T, h as L, i as S, L as E, M as I, j as m, k as _, l as k, m as C, n as P, o as B, p as N, N as g, q as f, r as O, O as R, P as h, s as D, t as F, u as U, v as w, Q as y, S as M, T as v, U as x, w as V, W as q, x as G, y as K, Z as W, z as H, F as X, G as Q, J as z, K as j, R as Y, V as Z, X as J, Y as $, _ as aa, $ as sa, a0 as ea, a1 as oa, a2 as ta, a3 as ra, a4 as ia, a5 as na, a6 as ua, a7 as ca, a8 as la, a9 as ba, aa as da, ab as Aa, ac as pa, ad as Ta, ae as La, af as Sa, ag as Ea, ah as Ia, ai as ma, aj as _a, ak as ka, al as Ca, am as Pa, an as Ba, ao as Na, ap as ga, aq as fa, ar as Oa, as as Ra, at as ha, au as Da, av as Fa, aw as Ua, ax as wa, ay as ya, az as Ma, aA as va, aB as xa, aC as Va, aD as qa, aE as Ga, aF as Ka, aG as Wa, aH as Ha, aI as Xa, aJ as Qa, aK as za, aL as ja, aM as Ya, aN as Za, aO as Ja, aP as $a, aQ as as, aR as ss, aS as es, aT as os, aU as ts, aV as rs, aW as is, aX as ns, aY as us, aZ as cs, a_ as ls, a$ as bs, b0 as ds, b1 as As, b2 as ps, b3 as Ts, b4 as Ls, b5 as Ss, b6 as Es, b7 as Is, b8 as ms, b9 as _s, ba as ks, bb as Cs, bc as Ps, bd as Bs, be as Ns, bf as gs, bg as fs, bh as Os, bi as Rs, bj as hs, bk as Ds, bl as Fs, bm as Us, bn as ws, bo as ys, bp as Ms, bq as vs, br as xs, bs as Vs, bt as qs, bu as Gs, bv as Ks, bw as Ws, bx as Hs, by as Xs, bz as Qs, bA as zs, bB as js, bC as Ys, bD as Zs, bE as Js, bF as $s, bG as ae, bH as se, bI as ee, bJ as oe, bK as te, bL as re, bM as ie, bN as ne, bO as ue, bP as ce, bQ as le, bR as be, bS as de, bT as Ae, bU as pe, bV as Te, bW as Le, bX as Se, bY as Ee, bZ as Ie, b_ as me } from "./chunks/scan-Dhu7f4Nl.js";
2
- import { N as ke, P as Ce, T as Pe, a as Be, b as Ne, c as ge, d as fe, e as Oe, f as Re, g as he, h as De, i as Fe, l as Ue, j as we, p as ye, k as Me, m as ve, n as xe, o as Ve, q as qe, s as Ge, t as Ke, r as We, u as He, v as Xe, w as Qe, x as ze, y as je, z as Ye, A as Ze, B as Je, C as $e, D as ao } from "./chunks/useLocker-CGpgCh75.js";
1
+ import { A as e, a as o, b as t, B as r, c as i, d as n, C as u, e as c, f as l, D as b, g as d, E as A, H as p, I as T, h as L, i as S, L as E, M as I, j as m, k as _, l as k, m as C, n as P, o as B, p as N, N as g, q as f, r as O, O as R, P as h, s as D, t as F, u as U, v as w, Q as y, S as M, T as v, U as x, w as V, W as q, x as G, y as K, Z as W, z as H, F as X, G as Q, J as z, K as j, R as Y, V as Z, X as J, Y as $, _ as aa, $ as sa, a0 as ea, a1 as oa, a2 as ta, a3 as ra, a4 as ia, a5 as na, a6 as ua, a7 as ca, a8 as la, a9 as ba, aa as da, ab as Aa, ac as pa, ad as Ta, ae as La, af as Sa, ag as Ea, ah as Ia, ai as ma, aj as _a, ak as ka, al as Ca, am as Pa, an as Ba, ao as Na, ap as ga, aq as fa, ar as Oa, as as Ra, at as ha, au as Da, av as Fa, aw as Ua, ax as wa, ay as ya, az as Ma, aA as va, aB as xa, aC as Va, aD as qa, aE as Ga, aF as Ka, aG as Wa, aH as Ha, aI as Xa, aJ as Qa, aK as za, aL as ja, aM as Ya, aN as Za, aO as Ja, aP as $a, aQ as as, aR as ss, aS as es, aT as os, aU as ts, aV as rs, aW as is, aX as ns, aY as us, aZ as cs, a_ as ls, a$ as bs, b0 as ds, b1 as As, b2 as ps, b3 as Ts, b4 as Ls, b5 as Ss, b6 as Es, b7 as Is, b8 as ms, b9 as _s, ba as ks, bb as Cs, bc as Ps, bd as Bs, be as Ns, bf as gs, bg as fs, bh as Os, bi as Rs, bj as hs, bk as Ds, bl as Fs, bm as Us, bn as ws, bo as ys, bp as Ms, bq as vs, br as xs, bs as Vs, bt as qs, bu as Gs, bv as Ks, bw as Ws, bx as Hs, by as Xs, bz as Qs, bA as zs, bB as js, bC as Ys, bD as Zs, bE as Js, bF as $s, bG as ae, bH as se, bI as ee, bJ as oe, bK as te, bL as re, bM as ie, bN as ne, bO as ue, bP as ce, bQ as le, bR as be, bS as de, bT as Ae, bU as pe, bV as Te, bW as Le, bX as Se, bY as Ee, bZ as Ie, b_ as me } from "./chunks/scan-Cdm3p_wF.js";
2
+ import { N as ke, P as Ce, T as Pe, a as Be, b as Ne, c as ge, d as fe, e as Oe, f as Re, g as he, h as De, i as Fe, l as Ue, j as we, p as ye, k as Me, m as ve, n as xe, o as Ve, q as qe, s as Ge, t as Ke, r as We, u as He, v as Xe, w as Qe, x as ze, y as je, z as Ye, A as Ze, B as Je, C as $e, D as ao } from "./chunks/useLocker-m3WH-bQm.js";
3
3
  import { LAUNCH_GUARD_HOOK_ABI as eo, LAUNCH_GUARD_HOOK_BLOCK_ABI as oo, poolKeyToTuple as to } from "@latchprotocol/sdk";
4
4
  export {
5
5
  e as ACTIONS,
package/dist/index.js CHANGED
@@ -1,9 +1,9 @@
1
- import { ay as $, aD as w, ax as C, av as j, bi as _e, bL as te, bw as $e, V as Re, b7 as Ue, bv as Me, Y as Oe, ba as Fe, bx as qe, aV as De, br as Z, v as We, bZ as Y, T as Ve, bF as le } from "./chunks/scan-Dhu7f4Nl.js";
2
- import { A as Da, a as Wa, b as Va, B as Ga, c as Ha, d as Ka, C as ja, e as Xa, f as Qa, D as za, g as Za, E as Ya, H as Ja, I as et, i as at, L as tt, M as lt, j as nt, k as st, l as ct, m as ot, n as rt, o as it, p as dt, N as ut, q as ht, r as mt, O as kt, P as _t, s as ft, t as bt, u as pt, Q as gt, S as Nt, U as yt, w as vt, W as Lt, x as wt, y as Tt, Z as At, z as Ct, F as It, G as St, J as Pt, K as xt, R as Et, X as Bt, _ as $t, $ as Rt, a0 as Ut, a1 as Mt, a2 as Ot, a3 as Ft, a4 as qt, a5 as Dt, a6 as Wt, a8 as Vt, a9 as Gt, aa as Ht, ab as Kt, ac as jt, ad as Xt, ae as Qt, af as zt, ag as Zt, ah as Yt, aj as Jt, ak as el, al, am as tl, an as ll, ao as nl, ap as sl, ar as cl, as as ol, at as rl, au as il, aw as dl, az as ul, aA as hl, aB as ml, aC as kl, aE as _l, aF as fl, aG as bl, aH as pl, aI as gl, aJ as Nl, aK as yl, aL as vl, aM as Ll, aN as wl, aO as Tl, aP as Al, aR as Cl, aS as Il, aT as Sl, aU as Pl, aW as xl, aX as El, aY as Bl, aZ as $l, a_ as Rl, a$ as Ul, b0 as Ml, b1 as Ol, b2 as Fl, b3 as ql, b4 as Dl, b5 as Wl, b6 as Vl, b8 as Gl, b9 as Hl, bb as Kl, bc as jl, bd as Xl, be as Ql, bf as zl, bg as Zl, bj as Yl, bk as Jl, bl as en, bm as an, bn as tn, bo as ln, bp as nn, bq as sn, bs as cn, bt as on, bu as rn, by as dn, bz as un, bA as hn, bB as mn, bC as kn, bD as _n, bE as fn, bG as bn, bH as pn, bI as gn, bJ as Nn, bK as yn, bM as vn, bN as Ln, bO as wn, bP as Tn, bQ as An, bR as Cn, bS as In, bT as Sn, bU as Pn, bV as xn, bW as En, bX as Bn, bY as $n } from "./chunks/scan-Dhu7f4Nl.js";
3
- import { v as fe, B as Ge, C as He, D as Ke, u as je, z as Xe, w as Qe, x as ze, m as H, t as K, y as ne, n as Ze, k as Ye, l as Je, p as ue, o as ea, A as aa, q as ta, P as he, r as la, T as me, j as na } from "./chunks/useLocker-CGpgCh75.js";
4
- import { N as Un, a as Mn, b as On, c as Fn, d as qn, e as Dn, f as Wn, g as Vn, h as Gn, i as Hn, s as Kn } from "./chunks/useLocker-CGpgCh75.js";
5
- import { i as se } from "./chunks/SwapWidget-CwkRtOfn.js";
6
- import { A as Xn, b as Qn, E as zn, F as Zn, c as Yn, d as Jn, e as es, L as as, a as ts, M as ls, f as ns, P as ss, R as cs, g as os, h as rs, j as is, k as ds, S as us, W as hs, l as ms, m as ks } from "./chunks/SwapWidget-CwkRtOfn.js";
1
+ import { ay as $, aD as w, ax as C, av as j, bi as _e, bL as te, bw as $e, V as Re, b7 as Ue, bv as Me, Y as Oe, ba as Fe, bx as qe, aV as De, br as Z, v as We, bZ as Y, T as Ve, bF as le } from "./chunks/scan-Cdm3p_wF.js";
2
+ import { A as Da, a as Wa, b as Va, B as Ga, c as Ha, d as Ka, C as ja, e as Xa, f as Qa, D as za, g as Za, E as Ya, H as Ja, I as et, i as at, L as tt, M as lt, j as nt, k as st, l as ct, m as ot, n as rt, o as it, p as dt, N as ut, q as ht, r as mt, O as kt, P as _t, s as ft, t as bt, u as pt, Q as gt, S as Nt, U as yt, w as vt, W as Lt, x as wt, y as Tt, Z as At, z as Ct, F as It, G as St, J as Pt, K as xt, R as Et, X as Bt, _ as $t, $ as Rt, a0 as Ut, a1 as Mt, a2 as Ot, a3 as Ft, a4 as qt, a5 as Dt, a6 as Wt, a8 as Vt, a9 as Gt, aa as Ht, ab as Kt, ac as jt, ad as Xt, ae as Qt, af as zt, ag as Zt, ah as Yt, aj as Jt, ak as el, al, am as tl, an as ll, ao as nl, ap as sl, ar as cl, as as ol, at as rl, au as il, aw as dl, az as ul, aA as hl, aB as ml, aC as kl, aE as _l, aF as fl, aG as bl, aH as pl, aI as gl, aJ as Nl, aK as yl, aL as vl, aM as Ll, aN as wl, aO as Tl, aP as Al, aR as Cl, aS as Il, aT as Sl, aU as Pl, aW as xl, aX as El, aY as Bl, aZ as $l, a_ as Rl, a$ as Ul, b0 as Ml, b1 as Ol, b2 as Fl, b3 as ql, b4 as Dl, b5 as Wl, b6 as Vl, b8 as Gl, b9 as Hl, bb as Kl, bc as jl, bd as Xl, be as Ql, bf as zl, bg as Zl, bj as Yl, bk as Jl, bl as en, bm as an, bn as tn, bo as ln, bp as nn, bq as sn, bs as cn, bt as on, bu as rn, by as dn, bz as un, bA as hn, bB as mn, bC as kn, bD as _n, bE as fn, bG as bn, bH as pn, bI as gn, bJ as Nn, bK as yn, bM as vn, bN as Ln, bO as wn, bP as Tn, bQ as An, bR as Cn, bS as In, bT as Sn, bU as Pn, bV as xn, bW as En, bX as Bn, bY as $n } from "./chunks/scan-Cdm3p_wF.js";
3
+ import { v as fe, B as Ge, C as He, D as Ke, u as je, z as Xe, w as Qe, x as ze, m as H, t as K, y as ne, n as Ze, k as Ye, l as Je, p as ue, o as ea, A as aa, q as ta, P as he, r as la, T as me, j as na } from "./chunks/useLocker-m3WH-bQm.js";
4
+ import { N as Un, a as Mn, b as On, c as Fn, d as qn, e as Dn, f as Wn, g as Vn, h as Gn, i as Hn, s as Kn } from "./chunks/useLocker-m3WH-bQm.js";
5
+ import { i as se } from "./chunks/SwapWidget-B0oDyBNK.js";
6
+ import { A as Xn, b as Qn, E as zn, F as Zn, c as Yn, d as Jn, e as es, L as as, a as ts, M as ls, f as ns, P as ss, R as cs, g as os, h as rs, j as is, k as ds, S as us, W as hs, l as ms, m as ks } from "./chunks/SwapWidget-B0oDyBNK.js";
7
7
  import { jsxs as t, jsx as a, Fragment as U } from "react/jsx-runtime";
8
8
  import { useState as A, useMemo as be, useId as ce, useEffect as q, useCallback as sa } from "react";
9
9
  import { isAddress as J, getAddress as ee, zeroAddress as pe, erc20Abi as F } from "viem";
@@ -105,7 +105,7 @@ function Le(e) {
105
105
  const n = te();
106
106
  return q(() => {
107
107
  se();
108
- }, []), e ?? n?.theme ?? "system";
108
+ }, []), e ?? n?.theme ?? "dark";
109
109
  }
110
110
  function ae({ props: e }) {
111
111
  if (e.siteUrl === void 0) return null;
@@ -432,7 +432,7 @@ function G({ r: e, props: n }) {
432
432
  ] });
433
433
  }
434
434
  function Ma(e) {
435
- const n = te(), i = e.theme ?? n?.theme ?? "system", o = ce();
435
+ const n = te(), i = e.theme ?? n?.theme ?? "dark", o = ce();
436
436
  q(() => {
437
437
  se();
438
438
  }, []);
@@ -785,7 +785,7 @@ function Aa(e) {
785
785
  ] });
786
786
  }
787
787
  function Oa(e) {
788
- const n = te(), i = e.theme ?? n?.theme ?? "system", o = ce();
788
+ const n = te(), i = e.theme ?? n?.theme ?? "dark", o = ce();
789
789
  q(() => {
790
790
  se();
791
791
  }, []);