From 0312800f91b6ed2b19c4497115981436acec4a22 Mon Sep 17 00:00:00 2001 From: Alexander Date: Wed, 18 Feb 2026 16:42:22 +0400 Subject: [PATCH 01/22] Move to be library files into dedicated folder --- src/lib/components/BalanceField.svelte | 2 +- src/lib/components/GetQuote.svelte | 2 +- src/lib/components/InputTokenModal.svelte | 2 +- src/lib/components/OutputTokenModal.svelte | 2 +- src/lib/components/ui/FlowStepTracker.svelte | 2 +- .../{libraries => core/api}/orderServer.ts | 4 +- src/lib/{utils => core/compact}/idLib.ts | 0 src/lib/{utils => core/helpers}/convert.ts | 0 src/lib/{libraries => core}/intent.ts | 8 +-- src/lib/{utils => core}/orderLib.ts | 51 +++++++++---------- src/{types/index.ts => lib/core/types.ts} | 0 src/lib/libraries/compactLib.ts | 4 +- src/lib/libraries/flowProgress.ts | 8 +-- src/lib/libraries/intentFactory.ts | 8 +-- src/lib/libraries/intentList.ts | 8 +-- src/lib/libraries/solver.ts | 6 +-- src/lib/libraries/token.ts | 2 +- src/lib/screens/FillIntent.svelte | 8 +-- src/lib/screens/Finalise.svelte | 6 +-- src/lib/screens/IntentList.svelte | 4 +- src/lib/screens/IssueIntent.svelte | 4 +- src/lib/screens/ManageDeposit.svelte | 2 +- src/lib/screens/ReceiveMessage.svelte | 8 +-- src/lib/state.svelte.ts | 4 +- src/routes/+page.svelte | 6 +-- src/routes/allocator/+server.ts | 2 +- tests/unit/orderLib.test.ts | 10 ++-- tests/unit/orderServer.test.ts | 2 +- 28 files changed, 80 insertions(+), 85 deletions(-) rename src/lib/{libraries => core/api}/orderServer.ts (99%) rename src/lib/{utils => core/compact}/idLib.ts (100%) rename src/lib/{utils => core/helpers}/convert.ts (100%) rename src/lib/{libraries => core}/intent.ts (99%) rename src/lib/{utils => core}/orderLib.ts (84%) rename src/{types/index.ts => lib/core/types.ts} (100%) diff --git a/src/lib/components/BalanceField.svelte b/src/lib/components/BalanceField.svelte index bde44f0..d50a185 100644 --- a/src/lib/components/BalanceField.svelte +++ b/src/lib/components/BalanceField.svelte @@ -1,5 +1,5 @@ - +
+ {#each connectors as connector (connector.id)} + + {/each} + + {#if !walletConnectProjectId} +

+ WalletConnect is disabled (missing `PUBLIC_WALLET_CONNECT_PROJECT_ID`). +

+ {/if} + {#if errorMessage} +

{errorMessage}

+ {/if} +
diff --git a/src/lib/state.svelte.ts b/src/lib/state.svelte.ts index 35b118a..67eefbb 100644 --- a/src/lib/state.svelte.ts +++ b/src/lib/state.svelte.ts @@ -1,4 +1,3 @@ -import type { WalletState } from "@web3-onboard/core"; import type { OrderContainer, TokenContext } from "./core/types"; import { ALWAYS_OK_ALLOCATOR, @@ -13,11 +12,10 @@ import { type availableAllocators, type chain, type Token, - type Verifier + type Verifier, + type WC } from "./config"; import { getAllowance, getBalance, getCompactBalance } from "./libraries/token"; -import onboard from "./utils/web3-onboard"; -import { createWalletClient, custom } from "viem"; import { browser } from "$app/environment"; import { initDb, db } from "./db"; import { @@ -28,6 +26,13 @@ import { import { and, eq } from "drizzle-orm"; import { orderToIntent } from "./core/intent"; import { getOrFetchRpc, invalidateRpcPrefix } from "./libraries/rpcCache"; +import { + getCurrentConnection, + getCurrentWalletClient, + reconnectWallet, + type WalletConnection, + watchWalletConnection +} from "./utils/wagmi"; class Store { mainnet = $state(true); @@ -195,14 +200,14 @@ class Store { } } - wallets = onboard.state.select("wallets"); - activeWallet = $state<{ wallet?: WalletState }>({}); - connectedAccount = $derived(this.activeWallet.wallet?.accounts?.[0]); - walletClient = $derived( - this.activeWallet?.wallet?.provider - ? createWalletClient({ transport: custom(this.activeWallet.wallet.provider) }) + walletConnection = $state(getCurrentConnection()); + connectedAccount = $derived( + this.walletConnection.status === "connected" + ? { address: this.walletConnection.address } : undefined - )!; + ); + walletClient = $state(undefined as unknown as WC); + _unwatchWalletConnection?: () => void; inputTokens = $state([]); outputTokens = $state([]); @@ -349,6 +354,19 @@ class Store { } } + async syncWalletClient() { + if (this.walletConnection.status !== "connected") { + this.walletClient = undefined as unknown as WC; + return; + } + try { + this.walletClient = (await getCurrentWalletClient()) as unknown as WC; + } catch (error) { + console.warn("getCurrentWalletClient failed", error); + this.walletClient = undefined as unknown as WC; + } + } + async setWalletToCorrectChain(chain: chain) { try { return await this.walletClient?.switchChain({ id: chainMap[chain].id }); @@ -388,9 +406,19 @@ class Store { this.inputTokens = [{ token: coinList(this.mainnet)[0], amount: 1000000n }]; this.outputTokens = [{ token: coinList(this.mainnet)[1], amount: 1000000n }]; - this.wallets.subscribe((v) => { - this.activeWallet.wallet = v?.[0]; - }); + if (browser) { + reconnectWallet() + .catch((error) => console.warn("reconnectWallet failed", error)) + .finally(() => { + this.walletConnection = getCurrentConnection(); + this.syncWalletClient().catch((error) => console.warn("syncWalletClient failed", error)); + }); + + this._unwatchWalletConnection = watchWalletConnection((connection) => { + this.walletConnection = connection; + this.syncWalletClient().catch((error) => console.warn("syncWalletClient failed", error)); + }); + } this.startRpcRefreshLoop(); diff --git a/src/lib/utils/wagmi.ts b/src/lib/utils/wagmi.ts new file mode 100644 index 0000000..a02bb41 --- /dev/null +++ b/src/lib/utils/wagmi.ts @@ -0,0 +1,103 @@ +import { browser } from "$app/environment"; +import { env } from "$env/dynamic/public"; +import { + connect, + createConfig, + disconnect, + getConnection, + getConnectors, + http, + reconnect, + watchConnection +} from "@wagmi/core"; +import { injected, metaMask, walletConnect } from "@wagmi/connectors"; +import { createWalletClient, custom, type Chain, type EIP1193Provider } from "viem"; +import { chainMap } from "../config"; + +const APP_METADATA = { + name: "Open Intents Framework Demo", + description: "A demo website showcasing using the Open Intents Framework. Built by LIFI.", + url: "https://lintent.org", + icons: ["https://lintent.org/favicon.ico"] +}; + +export const walletConnectProjectId = env.PUBLIC_WALLET_CONNECT_PROJECT_ID?.trim(); + +export function resolveConnectorIds(projectId?: string) { + return ["injected", ...(projectId ? ["walletConnect"] : []), "metaMask"]; +} + +const wagmiChains = Object.values(chainMap) as Chain[]; + +const connectors = [ + injected(), + ...(walletConnectProjectId + ? [ + walletConnect({ + projectId: walletConnectProjectId, + showQrModal: true, + metadata: APP_METADATA + }) + ] + : []), + metaMask({ dappMetadata: APP_METADATA }) +]; + +const transports = Object.fromEntries(wagmiChains.map((chain) => [chain.id, http()])); + +export const wagmiConfig = createConfig({ + ssr: true, + chains: wagmiChains as [Chain, ...Chain[]], + connectors, + transports: transports as Record> +}); + +export type WalletConnection = ReturnType; + +export function listWalletConnectors() { + return getConnectors(wagmiConfig).map((connector) => ({ + id: connector.id, + name: connector.name + })); +} + +export async function connectWith(connectorId: string) { + const connector = getConnectors(wagmiConfig).find((candidate) => candidate.id === connectorId); + if (!connector) throw new Error(`Connector not found: ${connectorId}`); + return connect(wagmiConfig, { connector }); +} + +export async function reconnectWallet() { + return reconnect(wagmiConfig); +} + +export async function disconnectWallet() { + const connection = getConnection(wagmiConfig); + if (connection.status !== "connected") return; + return disconnect(wagmiConfig, { connector: connection.connector }); +} + +export function getCurrentConnection() { + return getConnection(wagmiConfig); +} + +export async function getCurrentProvider() { + const connection = getConnection(wagmiConfig); + if (connection.status !== "connected") return undefined; + return (await connection.connector.getProvider()) as EIP1193Provider; +} + +export async function getCurrentWalletClient() { + const provider = await getCurrentProvider(); + if (!provider) return undefined; + return createWalletClient({ transport: custom(provider) }); +} + +export function watchWalletConnection(onChange: (connection: WalletConnection) => void) { + if (!browser) return () => {}; + return watchConnection(wagmiConfig, { + onChange(connection) { + onChange(connection); + } + }); +} diff --git a/src/lib/utils/web3-onboard.ts b/src/lib/utils/web3-onboard.ts deleted file mode 100644 index 5ca6309..0000000 --- a/src/lib/utils/web3-onboard.ts +++ /dev/null @@ -1,63 +0,0 @@ -import Onboard from "@web3-onboard/core"; -import type { OnboardAPI } from "@web3-onboard/core"; -import injectedWalletsModule from "@web3-onboard/injected-wallets"; -import zealWalletModule from "@web3-onboard/zeal"; -import coinbaseWalletModule from "@web3-onboard/coinbase"; -import walletConnectModule from "@web3-onboard/walletconnect"; -import { env } from "$env/dynamic/public"; -import { chainMap } from "../config"; - -const injected = injectedWalletsModule(); -const zealWalletSdk = zealWalletModule(); -const coinbaseWalletSdk = coinbaseWalletModule(); -const walletConnectProjectId = env.PUBLIC_WALLET_CONNECT_PROJECT_ID; -const walletConnect = walletConnectProjectId - ? walletConnectModule({ - projectId: walletConnectProjectId, - dappUrl: "lintent.org" - }) - : undefined; - -const wallets = [ - injected, - zealWalletSdk, - coinbaseWalletSdk, - ...(walletConnect ? [walletConnect] : []) -]; - -const getChains = () => { - return Object.values(chainMap).map((v) => { - return { - id: v.id, - token: v.nativeCurrency.symbol, - label: v.name, - rpcUrl: v.rpcUrls.default.http[0] - }; - }); -}; - -const appMetadata = { - name: "Open Intents Framework Demo", - icon: "", - logo: "", - description: "A demo website showcasing using the Open Intents Framework. Built by LIFI.", - recommendedInjectedWallets: [ - { name: "Coinbase", url: "https://wallet.coinbase.com/" }, - { name: "MetaMask", url: "https://metamask.io" } - ] -}; -let onboard: OnboardAPI | undefined; - -if (!onboard) { - onboard = Onboard({ - // wagmi, - wallets, - chains: getChains(), - appMetadata, - connect: { - autoConnectLastWallet: true - } - }); -} - -export default onboard as OnboardAPI; diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index f1523dc..61e08d1 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -1,5 +1,4 @@
- {#if !allowanceCheck} + {#if !inputSecurityCheck} + + {:else if !allowanceCheck} {#snippet name()} Set allowance diff --git a/src/lib/state.svelte.ts b/src/lib/state.svelte.ts index 67eefbb..595cbe0 100644 --- a/src/lib/state.svelte.ts +++ b/src/lib/state.svelte.ts @@ -33,6 +33,7 @@ import { type WalletConnection, watchWalletConnection } from "./utils/wagmi"; +import { switchWalletChain } from "./utils/walletClient"; class Store { mainnet = $state(true); @@ -369,7 +370,7 @@ class Store { async setWalletToCorrectChain(chain: chain) { try { - return await this.walletClient?.switchChain({ id: chainMap[chain].id }); + return await switchWalletChain(this.walletClient, chainMap[chain].id); } catch (error) { console.warn( `Wallet does not support switchChain or failed to switch chain: ${chainMap[chain].id}`, diff --git a/src/lib/utils/walletClient.ts b/src/lib/utils/walletClient.ts new file mode 100644 index 0000000..af382fa --- /dev/null +++ b/src/lib/utils/walletClient.ts @@ -0,0 +1,53 @@ +import type { EIP1193Provider } from "viem"; +import { toHex } from "viem"; +import type { WC } from "$lib/config"; + +type SwitchableWalletClient = WC & { + switchChain?: (args: { id: number }) => Promise; +}; + +async function resolveWalletProvider( + walletClient: WC | undefined, + provider?: EIP1193Provider +): Promise { + if (provider?.request) return provider; + + const walletClientWithTransport = walletClient as + | (WC & { transport?: { value?: EIP1193Provider } }) + | undefined; + const transportProvider = walletClientWithTransport?.transport?.value; + if (transportProvider?.request) return transportProvider; + + try { + const { getCurrentProvider } = await import("./wagmi"); + return await getCurrentProvider(); + } catch { + return undefined; + } +} + +export async function switchWalletChain( + walletClient: WC | undefined, + chainId: number, + options?: { provider?: EIP1193Provider } +) { + if (!walletClient) return; + + const switchableClient = walletClient as SwitchableWalletClient; + if (typeof switchableClient.switchChain === "function") { + await switchableClient.switchChain({ id: chainId }); + return; + } + + const provider = await resolveWalletProvider(walletClient, options?.provider); + if (!provider?.request) { + throw new Error( + `Wallet client does not support switchChain and no provider is available for chain ${chainId}.` + ); + } + + await provider.request({ + method: "wallet_switchEthereumChain", + params: [{ chainId: toHex(chainId) }] + }); +} diff --git a/tests/e2e/escrow-standard-blackbox.spec.ts b/tests/e2e/escrow-standard-blackbox.spec.ts new file mode 100644 index 0000000..8e20c1c --- /dev/null +++ b/tests/e2e/escrow-standard-blackbox.spec.ts @@ -0,0 +1,236 @@ +import { expect, test, type Page } from "@playwright/test"; +import { + connectInjectedWallet, + e2eWalletAddress, + hasE2EPrivateKey, + installInjectedWalletProvider +} from "./helpers/bootstrap"; + +const REQUIRED_INPUT_USDC_HUMAN = "0.0001"; +const REQUIRED_INPUT_USDC_RAW = "100"; +const TEST_TIMEOUT_MS = 2 * 60_000; +const UI_TIMEOUT_MS = 30_000; +const TX_TIMEOUT_MS = 45_000; +const PROVE_ATTEMPT_TIMEOUT_MS = 20_000; +type FlowStepName = "Asset" | "Issue" | "Fetch" | "Fill" | "Prove" | "Claim"; +type FlowStepStatus = "Now" | "Done" | "Next" | "Locked"; +type FlowState = Record; + +test.skip(!hasE2EPrivateKey, "Skipping private-key E2E tests: E2E_PRIVATE_KEY is not defined."); + +test.setTimeout(TEST_TIMEOUT_MS); + +async function expectRightRailState(page: Page, state: FlowState) { + const entries = Object.entries(state) as Array<[FlowStepName, FlowStepStatus]>; + for (const [step, status] of entries) { + await expect(page.getByRole("button", { name: `${step} (${status})` })).toBeVisible({ + timeout: UI_TIMEOUT_MS + }); + } +} + +test("black-box escrow flow shows expected UI state transitions", async ({ page }) => { + const issuerAddress = e2eWalletAddress(); + let sawRequiredInputAmount = false; + + await page.route("**/quote/request", async (route) => { + const body = route.request().postDataJSON() as + | { + intent?: { + inputs?: Array<{ amount?: string }>; + }; + } + | undefined; + const totalInputRaw = (body?.intent?.inputs ?? []).reduce((sum, input) => { + try { + return sum + BigInt(input.amount ?? "0"); + } catch { + return sum; + } + }, 0n); + if (totalInputRaw.toString() === REQUIRED_INPUT_USDC_RAW) { + sawRequiredInputAmount = true; + } + + await route.fulfill({ + status: 200, + contentType: "application/json", + body: JSON.stringify({ + quotes: [ + { + order: null, + eta: null, + validUntil: Date.now() + 60_000, + quoteId: null, + metadata: { exclusiveFor: issuerAddress }, + preview: { + inputs: [], + outputs: [ + { + receiver: "0x0000000000000000000000000000000000000000", + asset: "0x0000000000000000000000000000000000000000", + amount: REQUIRED_INPUT_USDC_RAW + } + ] + }, + provider: null, + partialFill: false, + failureHandling: "refund-automatic" + } + ] + }) + }); + }); + + await installInjectedWalletProvider(page); + await page.goto("/"); + await connectInjectedWallet(page); + + await expect(page.getByRole("heading", { name: "Assets Management" })).toBeVisible(); + await expectRightRailState(page, { + Asset: "Now", + Issue: "Next", + Fetch: "Next", + Fill: "Locked", + Prove: "Locked", + Claim: "Locked" + }); + + await page.getByTestId("network-mainnet").click(); + await page.getByTestId("intent-type-escrow").click(); + + await page.getByRole("button", { name: "→" }).first().click(); + await expect(page.getByRole("heading", { name: "Intent Issuance" })).toBeVisible(); + await expectRightRailState(page, { + Asset: "Done", + Issue: "Now", + Fetch: "Next", + Fill: "Locked", + Prove: "Locked", + Claim: "Locked" + }); + + await page.getByTestId("open-input-modal-0").click(); + const inputModal = page.getByTestId("input-token-modal"); + await expect(inputModal).toBeVisible({ timeout: UI_TIMEOUT_MS }); + await inputModal.locator("select#tokenSelector").selectOption("usdc"); + + const baseRow = inputModal.getByTestId("input-token-row-base"); + await baseRow.locator('input[type="checkbox"]').check(); + await baseRow.locator('input[type="number"]').fill(REQUIRED_INPUT_USDC_HUMAN); + await page.getByTestId("input-token-modal-save").click(); + await expect(inputModal).toBeHidden({ timeout: UI_TIMEOUT_MS }); + + const exclusiveInput = page.getByPlaceholder("0x... (optional)"); + await exclusiveInput.fill(issuerAddress); + await page.getByLabel("Lock Exclusive").check(); + await expect(exclusiveInput).toHaveValue(issuerAddress); + + await page.getByTestId("quote-button").click(); + await expect(page.getByTestId("quote-button")).toBeVisible(); + await expect.poll(() => sawRequiredInputAmount).toBe(true); + + if ( + await page + .getByRole("button", { name: "Set allowance" }) + .isVisible() + .catch(() => false) + ) { + await page.getByRole("button", { name: "Set allowance" }).click(); + } + + const executeOpenButton = page.getByRole("button", { name: "Execute Open" }); + await expect(executeOpenButton).toBeVisible({ timeout: TX_TIMEOUT_MS }); + await executeOpenButton.click(); + + await expect(page.getByRole("heading", { name: "Select Intent To Solve" })).toBeVisible({ + timeout: TX_TIMEOUT_MS + }); + await expectRightRailState(page, { + Asset: "Done", + Issue: "Done", + Fetch: "Now", + Fill: "Locked", + Prove: "Locked", + Claim: "Locked" + }); + + const activeIntentRow = page.getByRole("button", { name: /SingleChain/i }).first(); + await expect(activeIntentRow).toBeVisible({ timeout: UI_TIMEOUT_MS }); + await expect(page.getByRole("button", { name: /IN 0\.0001 USDC on base/i }).first()).toBeVisible({ + timeout: UI_TIMEOUT_MS + }); + await activeIntentRow.click(); + + await expect(page.getByRole("heading", { name: "Fill Intent" })).toBeVisible({ + timeout: UI_TIMEOUT_MS + }); + await expectRightRailState(page, { + Asset: "Done", + Issue: "Done", + Fetch: "Done", + Fill: "Now", + Prove: "Locked", + Claim: "Locked" + }); + + const fillButton = page.getByRole("button", { name: /^Fill$/ }).first(); + await expect(fillButton).toBeEnabled({ timeout: UI_TIMEOUT_MS }); + await fillButton.click(); + + await expect(page.getByRole("heading", { name: "Submit Proof of Fill" })).toBeVisible({ + timeout: TX_TIMEOUT_MS + }); + await expectRightRailState(page, { + Asset: "Done", + Issue: "Done", + Fetch: "Done", + Fill: "Done", + Prove: "Now", + Claim: "Locked" + }); + + const proveButton = page.getByRole("button", { name: /^\d+(\.\d+)?\s+USDC$/ }).first(); + let reachedFinalise = false; + for (let attempt = 0; attempt < 4; attempt++) { + await expect(proveButton).toBeVisible({ timeout: UI_TIMEOUT_MS }); + await expect(proveButton).toBeEnabled({ timeout: UI_TIMEOUT_MS }); + await proveButton.click(); + try { + await expect(page.getByRole("heading", { name: "Finalise Intent" })).toBeVisible({ + timeout: PROVE_ATTEMPT_TIMEOUT_MS + }); + reachedFinalise = true; + break; + } catch { + await page.waitForTimeout(3_000); + } + } + expect(reachedFinalise).toBe(true); + + await expectRightRailState(page, { + Asset: "Done", + Issue: "Done", + Fetch: "Done", + Fill: "Done", + Prove: "Done", + Claim: "Now" + }); + + const claimButton = page.getByRole("button", { name: "Claim" }).first(); + await expect(claimButton).toBeEnabled({ timeout: UI_TIMEOUT_MS }); + await claimButton.click(); + + await expect(page.getByRole("button", { name: "Finalised" }).first()).toBeVisible({ + timeout: TX_TIMEOUT_MS + }); + await expect(page.getByText("All inputs finalised")).toBeVisible({ timeout: TX_TIMEOUT_MS }); + await expectRightRailState(page, { + Asset: "Done", + Issue: "Done", + Fetch: "Done", + Fill: "Done", + Prove: "Done", + Claim: "Now" + }); +}); diff --git a/tests/e2e/escrow-standard-live.spec.ts b/tests/e2e/escrow-standard-live.spec.ts new file mode 100644 index 0000000..36960fb --- /dev/null +++ b/tests/e2e/escrow-standard-live.spec.ts @@ -0,0 +1,271 @@ +import { expect, test, type Page } from "@playwright/test"; +import { + connectInjectedWallet, + e2eWalletAddress, + hasE2EPrivateKey, + installInjectedWalletProvider +} from "./helpers/bootstrap"; + +const REQUIRED_INPUT_USDC_RAW = "100"; +const TEST_TIMEOUT_MS = 2 * 60_000; +const UI_TIMEOUT_MS = 30_000; +const TX_TIMEOUT_MS = 45_000; +const ORDER_STATUS_CLAIMED = 2; +const PROVE_ATTEMPT_TIMEOUT_MS = 20_000; + +test.skip(!hasE2EPrivateKey, "Skipping private-key E2E tests: E2E_PRIVATE_KEY is not defined."); + +test.setTimeout(TEST_TIMEOUT_MS); + +async function resolveIssuanceActionState(page: Page): Promise<"execute-open" | "low-balance"> { + const executeOpenButton = page.getByRole("button", { name: "Execute Open" }); + const lowBalanceButton = page.getByRole("button", { name: "Low Balance" }); + const started = Date.now(); + + while (Date.now() - started < TX_TIMEOUT_MS) { + if (await lowBalanceButton.isVisible().catch(() => false)) return "low-balance"; + if (await executeOpenButton.isVisible().catch(() => false)) return "execute-open"; + await page.waitForTimeout(200); + } + + throw new Error("Timed out waiting for issuance action state (Execute Open or Low Balance)."); +} + +test("executes full standard escrow flow from base to arbitrum with raw input 100", async ({ + page +}) => { + const issuerAddress = e2eWalletAddress(); + let sawExpectedQuotePayload = false; + let sawExclusiveForIssuer = false; + const getReceiptCount = async () => + await page.evaluate(async () => { + const { default: store } = await import("/src/lib/state.svelte.ts"); + return Object.keys(store.transactionReceipts).length; + }); + + await page.route("**/quote/request", async (route) => { + const body = route.request().postDataJSON() as + | { + metadata?: { exclusiveFor?: string }; + intent?: { + inputs?: Array<{ amount?: string }>; + outputs?: Array<{ amount?: string }>; + }; + } + | undefined; + + const firstInputAmount = body?.intent?.inputs?.[0]?.amount; + const firstOutputAmount = body?.intent?.outputs?.[0]?.amount; + if (firstInputAmount === REQUIRED_INPUT_USDC_RAW && firstOutputAmount === "0") { + sawExpectedQuotePayload = true; + } + if ((body?.metadata?.exclusiveFor ?? "").toLowerCase() === issuerAddress.toLowerCase()) { + sawExclusiveForIssuer = true; + } + + await route.fulfill({ + status: 200, + contentType: "application/json", + body: JSON.stringify({ + quotes: [ + { + order: null, + eta: null, + validUntil: Date.now() + 60_000, + quoteId: null, + metadata: { exclusiveFor: issuerAddress }, + preview: { + inputs: [], + outputs: [ + { + receiver: "0x0000000000000000000000000000000000000000", + asset: "0x0000000000000000000000000000000000000000", + amount: REQUIRED_INPUT_USDC_RAW + } + ] + }, + provider: null, + partialFill: false, + failureHandling: "refund-automatic" + } + ] + }) + }); + }); + + await installInjectedWalletProvider(page); + await page.goto("/"); + await connectInjectedWallet(page); + + await expect(page.getByRole("heading", { name: "Assets Management" })).toBeVisible(); + await page.getByTestId("network-mainnet").click(); + await page.getByTestId("intent-type-escrow").click(); + + // Keep the flow deterministic by fixing tiny standard-order assets directly in state. + await page.evaluate( + async ({ amount, issuer }) => { + const { default: store } = await import("/src/lib/state.svelte.ts"); + const { coinList } = await import("/src/lib/config"); + const coins = coinList(true); + const baseUsdc = coins.find((token) => token.chain === "base" && token.name === "usdc"); + const arbitrumUsdc = coins.find( + (token) => token.chain === "arbitrum" && token.name === "usdc" + ); + if (!baseUsdc || !arbitrumUsdc) { + throw new Error("Could not resolve base/arbitrum USDC from coin list."); + } + + store.mainnet = true; + store.intentType = "escrow"; + store.orders = []; + store.inputTokens = [{ token: baseUsdc, amount: BigInt(amount) }]; + store.outputTokens = [{ token: arbitrumUsdc, amount: BigInt(amount) }]; + store.exclusiveFor = issuer; + store.useExclusiveForQuoteRequest = true; + }, + { amount: REQUIRED_INPUT_USDC_RAW, issuer: issuerAddress } + ); + + await page.getByRole("button", { name: "→" }).first().click(); + await expect(page.getByRole("heading", { name: "Intent Issuance" })).toBeVisible(); + + await page.getByTestId("quote-button").click(); + await expect.poll(() => sawExpectedQuotePayload).toBe(true); + await expect.poll(() => sawExclusiveForIssuer).toBe(true); + + if ( + await page + .getByRole("button", { name: "Set allowance" }) + .isVisible() + .catch(() => false) + ) { + await page.getByRole("button", { name: "Set allowance" }).click(); + } + + const actionState = await resolveIssuanceActionState(page); + if (actionState === "low-balance") { + test.skip(true, "Skipping live flow: wallet has insufficient Base USDC for Execute Open."); + } + + await page.getByRole("button", { name: "Execute Open" }).click(); + await expect(page.getByRole("heading", { name: "Select Intent To Solve" })).toBeVisible({ + timeout: TX_TIMEOUT_MS + }); + + const activeIntentRow = page.getByRole("button", { name: /SingleChain/i }).first(); + await expect(activeIntentRow).toBeVisible({ timeout: TX_TIMEOUT_MS }); + await activeIntentRow.click(); + + const currentOrder = await page.evaluate(async () => { + const { default: store } = await import("/src/lib/state.svelte.ts"); + const { orderToIntent } = await import("/src/lib/core/intent"); + const latest = store.orders.at(-1); + if (!latest) return null; + const intent = orderToIntent(latest); + const inputChain = intent.inputChains()[0]; + return { + orderId: intent.orderId(), + inputSettler: latest.inputSettler, + inputChainId: inputChain.toString() + }; + }); + expect(currentOrder).not.toBeNull(); + const hasExactInputAmount = await page.evaluate(async (expectedInputRaw) => { + const { default: store } = await import("/src/lib/state.svelte.ts"); + const latest = store.orders.at(-1) as + | { order?: { inputs?: Array<[bigint, bigint]> } } + | undefined; + const inputs = latest?.order?.inputs; + if (!inputs || inputs.length === 0) return false; + const sum = inputs.reduce((acc, input) => acc + input[1], 0n); + return sum.toString() === expectedInputRaw; + }, REQUIRED_INPUT_USDC_RAW); + expect(hasExactInputAmount).toBe(true); + + await expect(page.getByRole("heading", { name: "Fill Intent" })).toBeVisible({ + timeout: UI_TIMEOUT_MS + }); + await expect(page.getByText(/^arbitrum$/i).last()).toBeVisible(); + + const fillButton = page.getByRole("button", { name: /^Fill$/ }).first(); + await expect(fillButton).toBeEnabled({ timeout: UI_TIMEOUT_MS }); + await fillButton.click(); + + await expect + .poll( + async () => + await page.evaluate(async () => { + const { default: store } = await import("/src/lib/state.svelte.ts"); + return Object.values(store.fillTransactions).filter( + (hash) => typeof hash === "string" && hash.startsWith("0x") && hash.length === 66 + ).length; + }), + { timeout: UI_TIMEOUT_MS } + ) + .toBeGreaterThan(0); + + await expect(page.getByRole("heading", { name: "Submit Proof of Fill" })).toBeVisible({ + timeout: TX_TIMEOUT_MS + }); + + const proveButton = page.getByRole("button", { name: /^\d+(\.\d+)?\s+USDC$/ }).first(); + let validated = false; + for (let attempt = 0; attempt < 4; attempt++) { + await expect(proveButton).toBeVisible({ timeout: UI_TIMEOUT_MS }); + await expect(proveButton).toBeEnabled({ timeout: UI_TIMEOUT_MS }); + await proveButton.click(); + try { + await expect + .poll( + async () => + await page.evaluate(async () => { + const { default: store } = await import("/src/lib/state.svelte.ts"); + const { getOrderProgressChecks } = await import("/src/lib/libraries/flowProgress.ts"); + const latest = store.orders.at(-1); + if (!latest) return false; + const checks = await getOrderProgressChecks(latest, store.fillTransactions); + return checks.allValidated; + }), + { timeout: PROVE_ATTEMPT_TIMEOUT_MS, intervals: [1_000, 2_000, 4_000] } + ) + .toBe(true); + validated = true; + break; + } catch { + await page.waitForTimeout(3_000); + } + } + expect(validated).toBe(true); + + await expect(page.getByRole("heading", { name: "Finalise Intent" })).toBeVisible({ + timeout: TX_TIMEOUT_MS + }); + + const claimButton = page.getByRole("button", { name: "Claim" }).first(); + await expect(claimButton).toBeEnabled({ timeout: UI_TIMEOUT_MS }); + const receiptsBeforeClaim = await getReceiptCount(); + await claimButton.click(); + + await expect + .poll(async () => await getReceiptCount(), { timeout: TX_TIMEOUT_MS }) + .toBeGreaterThan(receiptsBeforeClaim); + + await expect + .poll( + async () => + await page.evaluate(async (orderMeta) => { + const { getClient } = await import("/src/lib/config.ts"); + const { SETTLER_ESCROW_ABI } = await import("/src/lib/abi/escrow.ts"); + if (!orderMeta) return -1; + const status = await getClient(orderMeta.inputChainId).readContract({ + address: orderMeta.inputSettler as `0x${string}`, + abi: SETTLER_ESCROW_ABI, + functionName: "orderStatus", + args: [orderMeta.orderId as `0x${string}`] + }); + return Number(status); + }, currentOrder), + { timeout: TX_TIMEOUT_MS } + ) + .toBe(ORDER_STATUS_CLAIMED); +}); diff --git a/tests/e2e/helpers/bootstrap.ts b/tests/e2e/helpers/bootstrap.ts index 798e97c..367b7a4 100644 --- a/tests/e2e/helpers/bootstrap.ts +++ b/tests/e2e/helpers/bootstrap.ts @@ -1,13 +1,261 @@ import type { Page } from "@playwright/test"; +import process from "node:process"; +import { config as loadDotenv } from "dotenv"; +import type { Hex } from "viem"; +import { createPublicClient, createWalletClient, http, toHex } from "viem"; +import { privateKeyToAccount } from "viem/accounts"; +import { arbitrum, base } from "viem/chains"; -export async function bootstrapConnectedWallet(page: Page) { - await page.evaluate(async () => { - const { default: store } = await import("/src/lib/state.svelte.ts"); - (store as any).activeWallet.wallet = { - accounts: [{ address: "0x1111111111111111111111111111111111111111" }], - provider: { - request: async () => null +type ProviderPayload = { + method: string; + params?: unknown[]; +}; + +function ensureEnvLoaded() { + const envFilePath = process.env.E2E_ENV_FILE?.trim() || ".env"; + loadDotenv({ path: envFilePath, quiet: true }); +} + +ensureEnvLoaded(); + +function getE2EEnv(name: string) { + return process.env[name]?.trim(); +} + +export const hasE2EPrivateKey = Boolean(getE2EEnv("E2E_PRIVATE_KEY")); + +const BASE_CHAIN_ID = base.id; +const ARBITRUM_CHAIN_ID = arbitrum.id; +const BASE_USDC = "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913" as const; +const ERC20_BALANCE_OF_ABI = [ + { + type: "function", + name: "balanceOf", + stateMutability: "view", + inputs: [{ name: "owner", type: "address" }], + outputs: [{ name: "", type: "uint256" }] + } +] as const; +const baseRpcUrl = getE2EEnv("E2E_BASE_RPC_URL") || "https://base-rpc.publicnode.com"; +const arbitrumRpcUrl = getE2EEnv("E2E_ARBITRUM_RPC_URL") || "https://arbitrum-rpc.publicnode.com"; + +let accountCache: ReturnType | undefined; +let walletClientByChainCache: Record> | undefined; +let basePublicClientCache: ReturnType | undefined; + +function rpcUrlForChain(chainId: number): string { + if (chainId === BASE_CHAIN_ID) return baseRpcUrl; + if (chainId === ARBITRUM_CHAIN_ID) return arbitrumRpcUrl; + throw new Error(`Unsupported chain for E2E wallet provider: ${chainId}`); +} + +function getWalletContext() { + const configuredPrivateKey = getE2EEnv("E2E_PRIVATE_KEY") as Hex | undefined; + if (!configuredPrivateKey) { + throw new Error("E2E_PRIVATE_KEY is required for E2E wallet injection."); + } + + const account = (accountCache ??= privateKeyToAccount(configuredPrivateKey)); + const walletClientByChain = + walletClientByChainCache ?? + (walletClientByChainCache = { + [BASE_CHAIN_ID]: createWalletClient({ + account, + chain: base, + transport: http(baseRpcUrl) + }), + [ARBITRUM_CHAIN_ID]: createWalletClient({ + account, + chain: arbitrum, + transport: http(arbitrumRpcUrl) + }) + }); + return { account, walletClientByChain }; +} + +function activeWalletClient() { + const { walletClientByChain } = getWalletContext(); + const walletClient = walletClientByChain[currentChainId]; + if (!walletClient) { + throw new Error(`No wallet client configured for active chain ${currentChainId}.`); + } + return walletClient; +} + +let currentChainId = Number(process.env.E2E_CHAIN_ID ?? BASE_CHAIN_ID); +if (!Number.isFinite(currentChainId)) { + currentChainId = BASE_CHAIN_ID; +} + +async function rpcRequest(method: string, params: unknown[] = []) { + const response = await fetch(rpcUrlForChain(currentChainId), { + method: "POST", + headers: { "content-type": "application/json" }, + body: JSON.stringify({ + jsonrpc: "2.0", + id: Date.now(), + method, + params + }) + }); + const payload = (await response.json()) as { result?: unknown; error?: { message?: string } }; + if (payload.error) { + throw new Error(payload.error.message ?? `RPC error for method ${method}`); + } + return payload.result; +} + +function asBigInt(value: unknown): bigint | undefined { + if (typeof value !== "string" || value.length === 0) return undefined; + return BigInt(value); +} + +async function handleProviderRequest(payload: ProviderPayload) { + const { account } = getWalletContext(); + const { method, params = [] } = payload; + + if (method === "eth_chainId") return toHex(currentChainId); + if (method === "eth_accounts" || method === "eth_requestAccounts") return [account.address]; + if (method === "wallet_switchEthereumChain") { + const nextChainHex = (params[0] as { chainId?: string } | undefined)?.chainId; + if (!nextChainHex) throw new Error("wallet_switchEthereumChain missing chainId"); + currentChainId = Number(BigInt(nextChainHex)); + return null; + } + + if (method === "eth_sendTransaction") { + const walletClient = activeWalletClient(); + const tx = (params[0] as Record | undefined) ?? {}; + return await walletClient.sendTransaction({ + account, + to: tx.to as Hex | undefined, + data: tx.data as Hex | undefined, + value: asBigInt(tx.value), + gas: asBigInt(tx.gas), + maxFeePerGas: asBigInt(tx.maxFeePerGas), + maxPriorityFeePerGas: asBigInt(tx.maxPriorityFeePerGas) + }); + } + + if (method === "eth_signTypedData_v4" || method === "eth_signTypedData") { + const rawTypedData = params[1]; + const typedData = + typeof rawTypedData === "string" + ? (JSON.parse(rawTypedData) as Record) + : ((rawTypedData ?? {}) as Record); + const types = { ...(typedData.types as Record) }; + delete (types as Record).EIP712Domain; + return account.signTypedData({ + domain: (typedData.domain as Record) ?? {}, + types: types as Record, + primaryType: typedData.primaryType as string, + message: (typedData.message as Record) ?? {} + } as never); + } + + if (method === "personal_sign") { + const message = params[0]; + if (typeof message === "string" && message.startsWith("0x")) { + return account.signMessage({ message: { raw: message as Hex } }); + } + return account.signMessage({ message: String(message ?? "") }); + } + + return rpcRequest(method, params); +} + +export async function installInjectedWalletProvider(page: Page) { + getWalletContext(); + + await page.exposeFunction("__lintentE2EProviderRequest", (payload: ProviderPayload) => { + return handleProviderRequest(payload); + }); + + await page.addInitScript(() => { + type E2EWindow = Window & + typeof globalThis & { + __lintentE2EProviderRequest: (payload: { + method: string; + params?: unknown[]; + }) => Promise; + __LINTENT_E2E_PROVIDER__?: unknown; + ethereum?: unknown; + }; + const e2eWindow = window as E2EWindow; + + const listeners = new Map void>>(); + const emit = (event: string, value: unknown) => { + const set = listeners.get(event); + if (!set) return; + for (const listener of set) listener(value); + }; + + const provider = { + isMetaMask: false, + request: async ({ method, params }: { method: string; params?: unknown[] }) => { + const result = await e2eWindow.__lintentE2EProviderRequest({ + method, + params: params ?? [] + }); + + if (method === "eth_requestAccounts") emit("accountsChanged", result); + if (method === "wallet_switchEthereumChain") { + const nextChain = (params?.[0] as { chainId?: string } | undefined)?.chainId; + if (nextChain) emit("chainChanged", nextChain); + } + + return result; + }, + enable: async () => { + return await provider.request({ method: "eth_requestAccounts", params: [] }); + }, + on: (event: string, callback: (value: unknown) => void) => { + const set = listeners.get(event) ?? new Set<(value: unknown) => void>(); + set.add(callback); + listeners.set(event, set); + }, + removeListener: (event: string, callback: (value: unknown) => void) => { + listeners.get(event)?.delete(callback); + }, + off: (event: string, callback: (value: unknown) => void) => { + listeners.get(event)?.delete(callback); } }; + + e2eWindow.__LINTENT_E2E_PROVIDER__ = provider; + e2eWindow.ethereum = provider; + }); +} + +export async function connectInjectedWallet(page: Page) { + await page.getByRole("button", { name: "Connect Injected" }).click(); +} + +export function e2eWalletAddress() { + const { account } = getWalletContext(); + return account.address; +} + +export async function hasBaseUsdcBalance(minimumRawAmount: bigint) { + const { account } = getWalletContext(); + const basePublicClient = + basePublicClientCache ?? + (basePublicClientCache = createPublicClient({ + chain: base, + transport: http(baseRpcUrl) + })); + + const balance = await basePublicClient.readContract({ + address: BASE_USDC, + abi: ERC20_BALANCE_OF_ABI, + functionName: "balanceOf", + args: [account.address] }); + return balance >= minimumRawAmount; +} + +export async function bootstrapConnectedWallet(page: Page) { + await installInjectedWalletProvider(page); + await page.goto("/"); + await connectInjectedWallet(page); } diff --git a/tests/e2e/issuance.spec.ts b/tests/e2e/issuance.spec.ts deleted file mode 100644 index 2afc8b7..0000000 --- a/tests/e2e/issuance.spec.ts +++ /dev/null @@ -1,96 +0,0 @@ -import { expect, test } from "@playwright/test"; -import { mockQuoteResponse } from "../fixtures/mockQuote"; -import { bootstrapConnectedWallet } from "./helpers/bootstrap"; - -test.beforeEach(async ({ page }) => { - await page.route("**/quote/request", async (route) => { - await route.fulfill({ - status: 200, - contentType: "application/json", - body: JSON.stringify(mockQuoteResponse) - }); - }); - await page.route("**/orders/status/*", async (route) => { - const now = Math.floor(Date.now() / 1000); - await route.fulfill({ - status: 200, - contentType: "application/json", - body: JSON.stringify({ - data: { - order: { - user: "0x1111111111111111111111111111111111111111", - nonce: "123", - originChainId: "8453", - expires: now + 3600, - fillDeadline: now + 1800, - inputOracle: "0x0000000000000000000000000000000000000001", - inputs: [["1", "1000000"]], - outputs: [ - { - oracle: "0x0000000000000000000000000000000000000000000000000000000000000001", - settler: "0x0000000000000000000000000000000000000000000000000000000000000001", - chainId: "42161", - token: "0x0000000000000000000000000000000000000000000000000000000000000001", - amount: "1000000", - recipient: "0x0000000000000000000000000000000000000000000000000000000000000001", - callbackData: "0x", - context: "0x" - } - ] - }, - inputSettler: "0x000025c3226C00B2Cdc200005a1600509f4e00C0", - sponsorSignature: null, - allocatorSignature: null - } - }) - }); - }); - - await page.goto("/"); - await bootstrapConnectedWallet(page); -}); - -test("asset management controls remain interactive", async ({ page }) => { - await expect(page.getByRole("heading", { name: "Assets Management" })).toBeVisible(); - - await page.getByTestId("network-mainnet").click(); - await page.getByTestId("network-testnet").click(); - await page.getByTestId("intent-type-compact").click(); - await page.getByTestId("intent-type-escrow").click(); - await page.getByTestId("intent-type-compact").click(); - - await expect(page.getByTestId("allocator-116450367070547927622991121")).toBeVisible(); - await page.getByTestId("allocator-116450367070547927622991121").click(); -}); - -test("input/output modals open and save in issuance screen", async ({ page }) => { - await page.getByRole("button", { name: "→" }).click(); - await expect(page.getByRole("heading", { name: "Intent Issuance" })).toBeVisible(); - - await page.getByTestId("open-input-modal-0").click(); - await expect(page.getByTestId("input-token-modal")).toBeVisible(); - await page.getByTestId("input-token-modal-save").click(); - await expect(page.getByTestId("input-token-modal")).toBeHidden(); - - await page.getByTestId("open-output-modal-0").click(); - await expect(page.getByTestId("output-token-modal")).toBeVisible(); - await page.getByTestId("output-token-add").click(); - await page.getByTestId("output-token-modal-save").click(); - await expect(page.getByTestId("output-token-modal")).toBeHidden(); - - await page.getByTestId("quote-button").click(); - await expect(page.getByTestId("quote-button")).toBeVisible(); -}); - -test("imports order by order id into intent list", async ({ page }) => { - await page.getByRole("button", { name: "→" }).click(); - await page.getByRole("button", { name: "→" }).click(); - await expect(page.getByRole("heading", { name: "Select Intent To Solve" })).toBeVisible(); - - await page - .getByTestId("intent-import-order-id") - .fill("0x1111111111111111111111111111111111111111111111111111111111111111"); - await page.getByTestId("intent-import-order-submit").click(); - - await expect(page.getByTestId("intent-import-order-id")).toHaveValue(""); -}); diff --git a/tests/unit/walletClientSwitch.test.ts b/tests/unit/walletClientSwitch.test.ts new file mode 100644 index 0000000..491e8e4 --- /dev/null +++ b/tests/unit/walletClientSwitch.test.ts @@ -0,0 +1,24 @@ +import { describe, expect, it, mock } from "bun:test"; +import { switchWalletChain } from "../../src/lib/utils/walletClient"; + +describe("switchWalletChain", () => { + it("uses walletClient.switchChain when available", async () => { + const switchChain = mock(async () => undefined); + const walletClient = { switchChain } as unknown as Parameters[0]; + await switchWalletChain(walletClient, 8453); + expect(switchChain).toHaveBeenCalledWith({ id: 8453 }); + }); + + it("falls back to provider wallet_switchEthereumChain", async () => { + const request = mock(async () => null); + const walletClient = {} as unknown as Parameters[0]; + const provider = { request } as unknown as NonNullable< + Parameters[2] + >["provider"]; + await switchWalletChain(walletClient, 8453, { provider }); + expect(request).toHaveBeenCalledWith({ + method: "wallet_switchEthereumChain", + params: [{ chainId: "0x2105" }] + }); + }); +}); From fd6b5e64dc5464c77c59bfe46e752b478cddf41d Mon Sep 17 00:00:00 2001 From: Alexander Date: Thu, 19 Feb 2026 15:04:22 +0400 Subject: [PATCH 09/22] Remove chain strings in favour of chainIds --- src/lib/appTypes.ts | 16 ++ src/lib/components/GetQuote.svelte | 12 +- src/lib/components/InputTokenModal.svelte | 28 +-- src/lib/components/OutputTokenModal.svelte | 31 ++- src/lib/config.ts | 193 +++++++++------- src/lib/core/README.md | 18 +- src/lib/core/api/orderServer.spec.ts | 2 +- src/lib/core/api/orderServer.ts | 24 +- src/lib/core/constants.ts | 13 ++ src/lib/core/deps.ts | 15 ++ src/lib/core/helpers/interopableAddress.ts | 36 +++ .../core/intent/compact/conversions.spec.ts | 18 ++ src/lib/core/intent/compact/conversions.ts | 4 +- src/lib/core/intent/compact/signing.ts | 9 +- src/lib/core/intent/create.spec.ts | 71 ++++-- src/lib/core/intent/create.ts | 35 +-- src/lib/core/intent/fromOrder.spec.ts | 12 +- .../core/intent/helpers/output-encoding.ts | 13 +- src/lib/core/intent/helpers/shared.ts | 15 +- src/lib/core/intent/multichain.spec.ts | 2 +- src/lib/core/intent/multichain.ts | 2 +- src/lib/core/intent/standard.ts | 2 +- src/lib/core/orderLib.spec.ts | 41 +++- src/lib/core/orderLib.ts | 214 +++++++++--------- src/lib/core/testing/orderFixtures.ts | 26 ++- src/lib/core/typedMessage.spec.ts | 2 +- src/lib/core/types.ts | 15 +- src/lib/libraries/compactLib.ts | 46 ++-- src/lib/libraries/coreDeps.ts | 54 +++++ src/lib/libraries/intentExecution.ts | 29 +-- src/lib/libraries/intentFactory.ts | 87 +++++-- src/lib/libraries/intentList.ts | 30 ++- src/lib/libraries/solver.ts | 94 ++++---- src/lib/screens/FillIntent.svelte | 16 +- src/lib/screens/Finalise.svelte | 15 +- src/lib/screens/IssueIntent.svelte | 34 +-- src/lib/screens/ManageDeposit.svelte | 11 +- src/lib/screens/ReceiveMessage.svelte | 16 +- src/lib/state.svelte.ts | 40 ++-- src/routes/+page.svelte | 4 +- tests/e2e/escrow-standard-blackbox.spec.ts | 12 + tests/e2e/escrow-standard-live.spec.ts | 8 +- tests/unit/intentList.test.ts | 36 +++ tests/unit/orderValidationDeps.test.ts | 48 ++++ 44 files changed, 912 insertions(+), 537 deletions(-) create mode 100644 src/lib/appTypes.ts create mode 100644 src/lib/core/constants.ts create mode 100644 src/lib/core/deps.ts create mode 100644 src/lib/core/helpers/interopableAddress.ts create mode 100644 src/lib/core/intent/compact/conversions.spec.ts create mode 100644 src/lib/libraries/coreDeps.ts create mode 100644 tests/unit/orderValidationDeps.test.ts diff --git a/src/lib/appTypes.ts b/src/lib/appTypes.ts new file mode 100644 index 0000000..108d25e --- /dev/null +++ b/src/lib/appTypes.ts @@ -0,0 +1,16 @@ +import type { Token, Verifier } from "./config"; +import type { CompactLock, EscrowLock } from "./core/types"; + +export type AppTokenContext = { + token: Token; + amount: bigint; +}; + +export type AppCreateIntentOptions = { + exclusiveFor: string; + inputTokens: AppTokenContext[]; + outputTokens: AppTokenContext[]; + verifier: Verifier; + account: () => `0x${string}`; + lock: EscrowLock | CompactLock; +}; diff --git a/src/lib/components/GetQuote.svelte b/src/lib/components/GetQuote.svelte index d604c87..fba44ec 100644 --- a/src/lib/components/GetQuote.svelte +++ b/src/lib/components/GetQuote.svelte @@ -1,6 +1,6 @@ + +
+

Intents

+ +
+ + + + +
+ + {#if data.items.length === 0} +

No intents found.

+ {:else} + + + + + + + + + + + + + {#each data.items as item} + + + + + + + + + {/each} + +
OrderStatusPathUserSolverUpdated
{item.orderId}{item.status}{item.sourceChain} to {item.destinationChain}{item.user ?? '-'}{item.solver ?? '-'}{item.updatedAt ?? '-'}
+ {/if} + + {#if data.nextCursor} +

Next page

+ {/if} +
+ + diff --git a/app/explorer/src/routes/api/intents/+server.ts b/app/explorer/src/routes/api/intents/+server.ts new file mode 100644 index 0000000..633c112 --- /dev/null +++ b/app/explorer/src/routes/api/intents/+server.ts @@ -0,0 +1,18 @@ +import { getIntentService } from '$lib/server/intents/container'; +import { json } from '@sveltejs/kit'; +import type { RequestHandler } from './$types'; + +export const GET: RequestHandler = async ({ url }) => { + const service = getIntentService(); + + const data = await service.listIntents({ + cursor: url.searchParams.get('cursor') ?? undefined, + status: url.searchParams.get('status') ?? undefined, + user: url.searchParams.get('user') ?? undefined, + orderId: url.searchParams.get('orderId') ?? undefined, + catalystOrderId: url.searchParams.get('catalystOrderId') ?? undefined, + limit: Number(url.searchParams.get('limit') ?? '25') + }); + + return json(data); +}; diff --git a/app/explorer/src/routes/api/intents/[orderId]/+server.ts b/app/explorer/src/routes/api/intents/[orderId]/+server.ts new file mode 100644 index 0000000..2495597 --- /dev/null +++ b/app/explorer/src/routes/api/intents/[orderId]/+server.ts @@ -0,0 +1,14 @@ +import { getIntentService } from '$lib/server/intents/container'; +import { error, json } from '@sveltejs/kit'; +import type { RequestHandler } from './$types'; + +export const GET: RequestHandler = async ({ params }) => { + const service = getIntentService(); + const detail = await service.getIntentDetail(params.orderId); + + if (!detail) { + throw error(404, 'Intent not found'); + } + + return json(detail); +}; diff --git a/app/explorer/src/routes/api/intents/search/+server.ts b/app/explorer/src/routes/api/intents/search/+server.ts new file mode 100644 index 0000000..ba7593f --- /dev/null +++ b/app/explorer/src/routes/api/intents/search/+server.ts @@ -0,0 +1,13 @@ +import { getIntentService } from '$lib/server/intents/container'; +import { json } from '@sveltejs/kit'; +import type { RequestHandler } from './$types'; + +export const GET: RequestHandler = async ({ url }) => { + const term = url.searchParams.get('q') ?? ''; + const limit = Number(url.searchParams.get('limit') ?? '10'); + + const service = getIntentService(); + const data = await service.searchIntents(term, limit); + + return json(data); +}; diff --git a/app/explorer/src/routes/intent/[orderId]/+page.server.ts b/app/explorer/src/routes/intent/[orderId]/+page.server.ts new file mode 100644 index 0000000..1fc5d2c --- /dev/null +++ b/app/explorer/src/routes/intent/[orderId]/+page.server.ts @@ -0,0 +1,14 @@ +import { getIntentService } from '$lib/server/intents/container'; +import { error } from '@sveltejs/kit'; +import type { PageServerLoad } from './$types'; + +export const load: PageServerLoad = async ({ params }) => { + const service = getIntentService(); + const detail = await service.getIntentDetail(params.orderId); + + if (!detail) { + throw error(404, 'Intent not found'); + } + + return { detail }; +}; diff --git a/app/explorer/src/routes/intent/[orderId]/+page.svelte b/app/explorer/src/routes/intent/[orderId]/+page.svelte new file mode 100644 index 0000000..ba95ac9 --- /dev/null +++ b/app/explorer/src/routes/intent/[orderId]/+page.svelte @@ -0,0 +1,74 @@ + + +
+ Back to intents +

Intent {data.detail.orderId}

+

Status: {data.detail.status}

+ +

Components

+
    +
  • Input settler: {data.detail.componentAddresses.inputSettler ?? '-'}
  • +
  • Input oracle: {data.detail.componentAddresses.inputOracle ?? '-'}
  • +
  • Output oracle: {data.detail.componentAddresses.outputOracle ?? '-'}
  • +
  • Output settler: {data.detail.componentAddresses.outputSettler ?? '-'}
  • +
+ +

Timeline

+ + + + + + + + + + {#each data.detail.timeline as event} + + + + + + {/each} + +
EventTimeTx
{event.label}{event.timestamp ?? '-'}{event.txHash ?? '-'}
+ +
+ Raw payload +
{JSON.stringify(data.detail.raw, null, 2)}
+
+
+ + diff --git a/app/explorer/svelte.config.js b/app/explorer/svelte.config.js new file mode 100644 index 0000000..b233db3 --- /dev/null +++ b/app/explorer/svelte.config.js @@ -0,0 +1,12 @@ +import adapter from '@sveltejs/adapter-node'; +import { vitePreprocess } from '@sveltejs/vite-plugin-svelte'; + +/** @type {import('@sveltejs/kit').Config} */ +const config = { + preprocess: vitePreprocess(), + kit: { + adapter: adapter() + } +}; + +export default config; diff --git a/app/explorer/tests/unit/domain/status.spec.ts b/app/explorer/tests/unit/domain/status.spec.ts new file mode 100644 index 0000000..66b2a03 --- /dev/null +++ b/app/explorer/tests/unit/domain/status.spec.ts @@ -0,0 +1,16 @@ +import { describe, expect, it } from 'bun:test'; +import { mapOrderServerStatus } from '$lib/domain/intents/status'; + +describe('mapOrderServerStatus', () => { + it('maps known order server statuses', () => { + expect(mapOrderServerStatus('Submitted')).toBe('created'); + expect(mapOrderServerStatus('Open')).toBe('opened'); + expect(mapOrderServerStatus('Delivered')).toBe('delivered'); + expect(mapOrderServerStatus('Settled')).toBe('finalised'); + }); + + it('returns error for unknown status', () => { + expect(mapOrderServerStatus('')).toBe('error'); + expect(mapOrderServerStatus('UNKNOWN')).toBe('error'); + }); +}); diff --git a/app/explorer/tests/unit/server/order-server/schemas.spec.ts b/app/explorer/tests/unit/server/order-server/schemas.spec.ts new file mode 100644 index 0000000..be1a275 --- /dev/null +++ b/app/explorer/tests/unit/server/order-server/schemas.spec.ts @@ -0,0 +1,32 @@ +import { describe, expect, it } from 'bun:test'; +import { listOrdersResponseSchema } from '$lib/server/order-server/schemas'; + +describe('listOrdersResponseSchema', () => { + it('accepts numeric timestamps and array-based input/output legs', () => { + const parsed = listOrdersResponseSchema.parse({ + data: [ + { + order: { + user: '0xabc', + inputs: [['0xTokenIn', 12345, 1]], + outputs: [['0xTokenOut', '67890', 8453]] + }, + meta: { + orderStatus: 'Delivered', + submitTime: 1739880000 + } + } + ], + meta: { + total: 1, + limit: 50, + offset: 0 + } + }); + + expect(parsed.data[0]?.meta?.submitTime).toBe('1739880000'); + expect(parsed.data[0]?.order?.inputs?.[0]?.token).toBe('0xTokenIn'); + expect(parsed.data[0]?.order?.inputs?.[0]?.amount).toBe('12345'); + expect(parsed.data[0]?.order?.inputs?.[0]?.chainId).toBe(1); + }); +}); diff --git a/app/explorer/tsconfig.json b/app/explorer/tsconfig.json new file mode 100644 index 0000000..b9d033b --- /dev/null +++ b/app/explorer/tsconfig.json @@ -0,0 +1,14 @@ +{ + "extends": "./.svelte-kit/tsconfig.json", + "compilerOptions": { + "allowJs": false, + "checkJs": false, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "moduleResolution": "bundler", + "resolveJsonModule": true, + "skipLibCheck": true, + "strict": true, + "types": ["bun"] + } +} diff --git a/app/explorer/vite.config.ts b/app/explorer/vite.config.ts new file mode 100644 index 0000000..3406f32 --- /dev/null +++ b/app/explorer/vite.config.ts @@ -0,0 +1,6 @@ +import { sveltekit } from '@sveltejs/kit/vite'; +import { defineConfig } from 'vite'; + +export default defineConfig({ + plugins: [sveltekit()] +}); diff --git a/.env.e2e.example b/app/issue-intent/.env.e2e.example similarity index 100% rename from .env.e2e.example rename to app/issue-intent/.env.e2e.example diff --git a/.env.example b/app/issue-intent/.env.example similarity index 100% rename from .env.example rename to app/issue-intent/.env.example diff --git a/.npmrc b/app/issue-intent/.npmrc similarity index 100% rename from .npmrc rename to app/issue-intent/.npmrc diff --git a/.prettierignore b/app/issue-intent/.prettierignore similarity index 100% rename from .prettierignore rename to app/issue-intent/.prettierignore diff --git a/.prettierrc b/app/issue-intent/.prettierrc similarity index 100% rename from .prettierrc rename to app/issue-intent/.prettierrc diff --git a/LICENSE b/app/issue-intent/LICENSE similarity index 100% rename from LICENSE rename to app/issue-intent/LICENSE diff --git a/app/issue-intent/README.md b/app/issue-intent/README.md new file mode 100644 index 0000000..534955f --- /dev/null +++ b/app/issue-intent/README.md @@ -0,0 +1,53 @@ +# LI.FI Intent Demo + +The LI.FI intent demo is hosted at lintent.org. It demonstrates the entire intent flow from resource lock mangement, intent issuance, and solving intents. + +## Project + +This project uses SvelteKit and `bun`. It is configured for a deployment to Cloudflare workers, to change the deployment target modify [/svelte.config.js](/svelte.config.js) with another [adapter](https://svelte.dev/docs/kit/adapters). + +### Development + +To start development: + +1. Copy `.env.example` to `.env`. +2. Then fill in the `env` variables by creating a [WalletConnect](https://walletconnect.com) project +3. Also create an [account](https://accounts.polymerlabs.org/) with Polymer to generation [Polymer](https://polymerlabs.org) API keys. +4. Install dependencies `bun install`. +5. Start `bun run dev`. + +### Testing + +The project now uses a two-layer automated test suite: + +1. Unit and integration tests with `bun test` +2. Browser UI-state tests with Playwright + +Run: + +- `bun run test:unit` for library/unit/integration tests with coverage output +- `bun run test:e2e` for live browser + chain escrow flow tests +- `bun run test:all` to run both + +For local Playwright setup: + +1. `bun install` +2. `bunx playwright install chromium` +3. Copy `.env.e2e.example` to `.env.e2e` and set `E2E_PRIVATE_KEY`. +4. Ensure the E2E wallet has mainnet gas + tiny USDC balances on Base and Arbitrum. +5. Start E2E with `bun run test:e2e`. +6. If `E2E_PRIVATE_KEY` is not defined, private-key E2E specs are skipped. + +## Structure + +Lintent is built around a single page [/src/routes/+page.svelte](/src/routes/+page.svelte). + +The app consists of a series of screens that are displayed in a scrollable container. Each screen can be found in [/src/lib/screens/](/src/lib/screens/). + +### Libraries + +Several helper classes that acts as wrappers for external endpoints can be found in [/src/lib/libraries/](/src/lib/libraries/). + +## License + +This project is licensed under the **[MIT License](/LICENSE)**. Any contributions to this repository is provided with a MIT License. diff --git a/app/issue-intent/_typos.toml b/app/issue-intent/_typos.toml new file mode 100644 index 0000000..70c933b --- /dev/null +++ b/app/issue-intent/_typos.toml @@ -0,0 +1,3 @@ +[default.extend-words] +oif = "oif" +OIF = "OIF" \ No newline at end of file diff --git a/app/issue-intent/bun.lock b/app/issue-intent/bun.lock new file mode 100644 index 0000000..3ad56a6 --- /dev/null +++ b/app/issue-intent/bun.lock @@ -0,0 +1,1221 @@ +{ + "lockfileVersion": 1, + "configVersion": 0, + "workspaces": { + "": { + "name": "cat-swapper", + "dependencies": { + "@electric-sql/pglite": "^0.3.15", + "@metamask/sdk": "^0.34.0", + "@sveltejs/adapter-cloudflare": "^7.0.3", + "@wagmi/connectors": "^7.2.1", + "@wagmi/core": "^3.4.0", + "axios": "^1.9.0", + "base64-js": "^1.5.1", + "drizzle-orm": "^0.45.1", + "rxjs": "^7.8.2", + "viem": "~2.45.1", + "wagmi": "^3.5.0", + }, + "devDependencies": { + "@eslint/compat": "^1.2.5", + "@eslint/js": "^9.18.0", + "@playwright/test": "^1.55.0", + "@sveltejs/kit": "^2.16.0", + "@sveltejs/vite-plugin-svelte": "^6.1.1", + "@tailwindcss/vite": "^4.0.0", + "@types/bun": "^1.3.8", + "dotenv": "^17.2.3", + "drizzle-kit": "^0.31.9", + "eslint": "^9.18.0", + "eslint-config-prettier": "^10.0.1", + "eslint-plugin-svelte": "^3.0.0", + "globals": "^16.0.0", + "husky": "^9.1.7", + "lint-staged": "^16.1.0", + "prettier": "^3.4.2", + "prettier-plugin-svelte": "^3.3.3", + "prettier-plugin-tailwindcss": "^0.6.11", + "svelte": "^5.0.0", + "svelte-check": "^4.0.0", + "tailwindcss": "^4.0.0", + "typescript": "^5.0.0", + "typescript-eslint": "^8.20.0", + "vite": "^7.1.1", + }, + }, + }, + "packages": { + "@adraffy/ens-normalize": ["@adraffy/ens-normalize@1.11.0", "", {}, "sha512-/3DDPKHqqIqxUULp8yP4zODUY1i+2xvVWsv8A79xGWdCAG+8sb0hRh0Rk2QyOJUnnbyPUAZYcpBuRe3nS2OIUg=="], + + "@ampproject/remapping": ["@ampproject/remapping@2.3.0", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw=="], + + "@babel/runtime": ["@babel/runtime@7.28.6", "", {}, "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA=="], + + "@cloudflare/kv-asset-handler": ["@cloudflare/kv-asset-handler@0.4.0", "", { "dependencies": { "mime": "^3.0.0" } }, "sha512-+tv3z+SPp+gqTIcImN9o0hqE9xyfQjI1XD9pL6NuKjua9B1y7mNYv0S9cP+QEbA4ppVgGZEmKOvHX5G5Ei1CVA=="], + + "@cloudflare/unenv-preset": ["@cloudflare/unenv-preset@2.6.0", "", { "peerDependencies": { "unenv": "2.0.0-rc.19", "workerd": "^1.20250802.0" } }, "sha512-h7Txw0WbDuUbrvZwky6+x7ft+U/Gppfn/rWx6IdR+e9gjygozRJnV26Y2TOr3yrIFa6OsZqqR2lN+jWTrakHXg=="], + + "@cloudflare/workerd-darwin-64": ["@cloudflare/workerd-darwin-64@1.20250803.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-6QciMnJp1p3F1qUiN0LaLfmw7SuZA/gfUBOe8Ft81pw16JYZ3CyiqIKPJvc1SV8jgDx8r+gz/PRi1NwOMt329A=="], + + "@cloudflare/workerd-darwin-arm64": ["@cloudflare/workerd-darwin-arm64@1.20250803.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-DoIgghDowtqoNhL6OoN/F92SKtrk7mRQKc4YSs/Dst8IwFZq+pCShOlWfB0MXqHKPSoiz5xLSrUKR9H6gQMPvw=="], + + "@cloudflare/workerd-linux-64": ["@cloudflare/workerd-linux-64@1.20250803.0", "", { "os": "linux", "cpu": "x64" }, "sha512-mYdz4vNWX3+PoqRjssepVQqgh42IBiSrl+wb7vbh7VVWUVzBnQKtW3G+UFiBF62hohCLexGIEi7L0cFfRlcKSQ=="], + + "@cloudflare/workerd-linux-arm64": ["@cloudflare/workerd-linux-arm64@1.20250803.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-RmrtUYLRUg6djKU7Z6yebS6YGJVnaDVY6bbXca+2s26vw4ibJDOTPLuBHFQF62Grw3fAfsNbjQh5i14vG2mqUg=="], + + "@cloudflare/workerd-windows-64": ["@cloudflare/workerd-windows-64@1.20250803.0", "", { "os": "win32", "cpu": "x64" }, "sha512-uLV8gdudz36o9sUaAKbBxxTwZwLFz1KyW7QpBvOo4+r3Ib8yVKXGiySIMWGD7A0urSMrjf3e5LlLcJKgZUOjMA=="], + + "@cloudflare/workers-types": ["@cloudflare/workers-types@4.20250807.0", "", {}, "sha512-Zbrz9egAfwmlkUaZ1tQ+19pt5eomCJ57mAviT1HCsvnSFP1MoffMbYiU/xUomuekHtx0aVO4EacZwchCgjSvmw=="], + + "@cspotcode/source-map-support": ["@cspotcode/source-map-support@0.8.1", "", { "dependencies": { "@jridgewell/trace-mapping": "0.3.9" } }, "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw=="], + + "@drizzle-team/brocli": ["@drizzle-team/brocli@0.10.2", "", {}, "sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w=="], + + "@ecies/ciphers": ["@ecies/ciphers@0.2.5", "", { "peerDependencies": { "@noble/ciphers": "^1.0.0" } }, "sha512-GalEZH4JgOMHYYcYmVqnFirFsjZHeoGMDt9IxEnM9F7GRUUyUksJ7Ou53L83WHJq3RWKD3AcBpo0iQh0oMpf8A=="], + + "@electric-sql/pglite": ["@electric-sql/pglite@0.3.15", "", {}, "sha512-Cj++n1Mekf9ETfdc16TlDi+cDDQF0W7EcbyRHYOAeZdsAe8M/FJg18itDTSwyHfar2WIezawM9o0EKaRGVKygQ=="], + + "@emnapi/runtime": ["@emnapi/runtime@1.4.5", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-++LApOtY0pEEz1zrd9vy1/zXVaVJJ/EbAF3u0fXIzPJEDtnITsBGbbK0EkM72amhl/R5b+5xx0Y/QhcVOpuulg=="], + + "@esbuild-kit/core-utils": ["@esbuild-kit/core-utils@3.3.2", "", { "dependencies": { "esbuild": "~0.18.20", "source-map-support": "^0.5.21" } }, "sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ=="], + + "@esbuild-kit/esm-loader": ["@esbuild-kit/esm-loader@2.6.5", "", { "dependencies": { "@esbuild-kit/core-utils": "^3.3.2", "get-tsconfig": "^4.7.0" } }, "sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA=="], + + "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.8", "", { "os": "aix", "cpu": "ppc64" }, "sha512-urAvrUedIqEiFR3FYSLTWQgLu5tb+m0qZw0NBEasUeo6wuqatkMDaRT+1uABiGXEu5vqgPd7FGE1BhsAIy9QVA=="], + + "@esbuild/android-arm": ["@esbuild/android-arm@0.25.8", "", { "os": "android", "cpu": "arm" }, "sha512-RONsAvGCz5oWyePVnLdZY/HHwA++nxYWIX1atInlaW6SEkwq6XkP3+cb825EUcRs5Vss/lGh/2YxAb5xqc07Uw=="], + + "@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.8", "", { "os": "android", "cpu": "arm64" }, "sha512-OD3p7LYzWpLhZEyATcTSJ67qB5D+20vbtr6vHlHWSQYhKtzUYrETuWThmzFpZtFsBIxRvhO07+UgVA9m0i/O1w=="], + + "@esbuild/android-x64": ["@esbuild/android-x64@0.25.8", "", { "os": "android", "cpu": "x64" }, "sha512-yJAVPklM5+4+9dTeKwHOaA+LQkmrKFX96BM0A/2zQrbS6ENCmxc4OVoBs5dPkCCak2roAD+jKCdnmOqKszPkjA=="], + + "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.8", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Jw0mxgIaYX6R8ODrdkLLPwBqHTtYHJSmzzd+QeytSugzQ0Vg4c5rDky5VgkoowbZQahCbsv1rT1KW72MPIkevw=="], + + "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.8", "", { "os": "darwin", "cpu": "x64" }, "sha512-Vh2gLxxHnuoQ+GjPNvDSDRpoBCUzY4Pu0kBqMBDlK4fuWbKgGtmDIeEC081xi26PPjn+1tct+Bh8FjyLlw1Zlg=="], + + "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.8", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-YPJ7hDQ9DnNe5vxOm6jaie9QsTwcKedPvizTVlqWG9GBSq+BuyWEDazlGaDTC5NGU4QJd666V0yqCBL2oWKPfA=="], + + "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.8", "", { "os": "freebsd", "cpu": "x64" }, "sha512-MmaEXxQRdXNFsRN/KcIimLnSJrk2r5H8v+WVafRWz5xdSVmWLoITZQXcgehI2ZE6gioE6HirAEToM/RvFBeuhw=="], + + "@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.8", "", { "os": "linux", "cpu": "arm" }, "sha512-FuzEP9BixzZohl1kLf76KEVOsxtIBFwCaLupVuk4eFVnOZfU+Wsn+x5Ryam7nILV2pkq2TqQM9EZPsOBuMC+kg=="], + + "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.8", "", { "os": "linux", "cpu": "arm64" }, "sha512-WIgg00ARWv/uYLU7lsuDK00d/hHSfES5BzdWAdAig1ioV5kaFNrtK8EqGcUBJhYqotlUByUKz5Qo6u8tt7iD/w=="], + + "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.8", "", { "os": "linux", "cpu": "ia32" }, "sha512-A1D9YzRX1i+1AJZuFFUMP1E9fMaYY+GnSQil9Tlw05utlE86EKTUA7RjwHDkEitmLYiFsRd9HwKBPEftNdBfjg=="], + + "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.8", "", { "os": "linux", "cpu": "none" }, "sha512-O7k1J/dwHkY1RMVvglFHl1HzutGEFFZ3kNiDMSOyUrB7WcoHGf96Sh+64nTRT26l3GMbCW01Ekh/ThKM5iI7hQ=="], + + "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.8", "", { "os": "linux", "cpu": "none" }, "sha512-uv+dqfRazte3BzfMp8PAQXmdGHQt2oC/y2ovwpTteqrMx2lwaksiFZ/bdkXJC19ttTvNXBuWH53zy/aTj1FgGw=="], + + "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.8", "", { "os": "linux", "cpu": "ppc64" }, "sha512-GyG0KcMi1GBavP5JgAkkstMGyMholMDybAf8wF5A70CALlDM2p/f7YFE7H92eDeH/VBtFJA5MT4nRPDGg4JuzQ=="], + + "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.8", "", { "os": "linux", "cpu": "none" }, "sha512-rAqDYFv3yzMrq7GIcen3XP7TUEG/4LK86LUPMIz6RT8A6pRIDn0sDcvjudVZBiiTcZCY9y2SgYX2lgK3AF+1eg=="], + + "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.8", "", { "os": "linux", "cpu": "s390x" }, "sha512-Xutvh6VjlbcHpsIIbwY8GVRbwoviWT19tFhgdA7DlenLGC/mbc3lBoVb7jxj9Z+eyGqvcnSyIltYUrkKzWqSvg=="], + + "@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.8", "", { "os": "linux", "cpu": "x64" }, "sha512-ASFQhgY4ElXh3nDcOMTkQero4b1lgubskNlhIfJrsH5OKZXDpUAKBlNS0Kx81jwOBp+HCeZqmoJuihTv57/jvQ=="], + + "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.25.8", "", { "os": "none", "cpu": "arm64" }, "sha512-d1KfruIeohqAi6SA+gENMuObDbEjn22olAR7egqnkCD9DGBG0wsEARotkLgXDu6c4ncgWTZJtN5vcgxzWRMzcw=="], + + "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.8", "", { "os": "none", "cpu": "x64" }, "sha512-nVDCkrvx2ua+XQNyfrujIG38+YGyuy2Ru9kKVNyh5jAys6n+l44tTtToqHjino2My8VAY6Lw9H7RI73XFi66Cg=="], + + "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.8", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-j8HgrDuSJFAujkivSMSfPQSAa5Fxbvk4rgNAS5i3K+r8s1X0p1uOO2Hl2xNsGFppOeHOLAVgYwDVlmxhq5h+SQ=="], + + "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.8", "", { "os": "openbsd", "cpu": "x64" }, "sha512-1h8MUAwa0VhNCDp6Af0HToI2TJFAn1uqT9Al6DJVzdIBAd21m/G0Yfc77KDM3uF3T/YaOgQq3qTJHPbTOInaIQ=="], + + "@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.25.8", "", { "os": "none", "cpu": "arm64" }, "sha512-r2nVa5SIK9tSWd0kJd9HCffnDHKchTGikb//9c7HX+r+wHYCpQrSgxhlY6KWV1nFo1l4KFbsMlHk+L6fekLsUg=="], + + "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.8", "", { "os": "sunos", "cpu": "x64" }, "sha512-zUlaP2S12YhQ2UzUfcCuMDHQFJyKABkAjvO5YSndMiIkMimPmxA+BYSBikWgsRpvyxuRnow4nS5NPnf9fpv41w=="], + + "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.8", "", { "os": "win32", "cpu": "arm64" }, "sha512-YEGFFWESlPva8hGL+zvj2z/SaK+pH0SwOM0Nc/d+rVnW7GSTFlLBGzZkuSU9kFIGIo8q9X3ucpZhu8PDN5A2sQ=="], + + "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.8", "", { "os": "win32", "cpu": "ia32" }, "sha512-hiGgGC6KZ5LZz58OL/+qVVoZiuZlUYlYHNAmczOm7bs2oE1XriPFi5ZHHrS8ACpV5EjySrnoCKmcbQMN+ojnHg=="], + + "@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.8", "", { "os": "win32", "cpu": "x64" }, "sha512-cn3Yr7+OaaZq1c+2pe+8yxC8E144SReCQjN6/2ynubzYjvyqZjTXfQJpAcQpsdJq3My7XADANiYGHoFC69pLQw=="], + + "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.7.0", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw=="], + + "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.1", "", {}, "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ=="], + + "@eslint/compat": ["@eslint/compat@1.3.2", "", { "peerDependencies": { "eslint": "^8.40 || 9" } }, "sha512-jRNwzTbd6p2Rw4sZ1CgWRS8YMtqG15YyZf7zvb6gY2rB2u6n+2Z+ELW0GtL0fQgyl0pr4Y/BzBfng/BdsereRA=="], + + "@eslint/config-array": ["@eslint/config-array@0.21.0", "", { "dependencies": { "@eslint/object-schema": "^2.1.6", "debug": "^4.3.1", "minimatch": "^3.1.2" } }, "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ=="], + + "@eslint/config-helpers": ["@eslint/config-helpers@0.3.1", "", {}, "sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA=="], + + "@eslint/core": ["@eslint/core@0.15.2", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg=="], + + "@eslint/eslintrc": ["@eslint/eslintrc@3.3.1", "", { "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" } }, "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ=="], + + "@eslint/js": ["@eslint/js@9.32.0", "", {}, "sha512-BBpRFZK3eX6uMLKz8WxFOBIFFcGFJ/g8XuwjTHCqHROSIsopI+ddn/d5Cfh36+7+e5edVS8dbSHnBNhrLEX0zg=="], + + "@eslint/object-schema": ["@eslint/object-schema@2.1.6", "", {}, "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA=="], + + "@eslint/plugin-kit": ["@eslint/plugin-kit@0.3.5", "", { "dependencies": { "@eslint/core": "^0.15.2", "levn": "^0.4.1" } }, "sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w=="], + + "@ethereumjs/common": ["@ethereumjs/common@3.2.0", "", { "dependencies": { "@ethereumjs/util": "^8.1.0", "crc-32": "^1.2.0" } }, "sha512-pksvzI0VyLgmuEF2FA/JR/4/y6hcPq8OUail3/AvycBaW1d5VSauOZzqGvJ3RTmR4MU35lWE8KseKOsEhrFRBA=="], + + "@ethereumjs/rlp": ["@ethereumjs/rlp@4.0.1", "", { "bin": { "rlp": "bin/rlp" } }, "sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw=="], + + "@ethereumjs/tx": ["@ethereumjs/tx@4.2.0", "", { "dependencies": { "@ethereumjs/common": "^3.2.0", "@ethereumjs/rlp": "^4.0.1", "@ethereumjs/util": "^8.1.0", "ethereum-cryptography": "^2.0.0" } }, "sha512-1nc6VO4jtFd172BbSnTnDQVr9IYBFl1y4xPzZdtkrkKIncBCkdbgfdRV+MiTkJYAtTxvV12GRZLqBFT1PNK6Yw=="], + + "@ethereumjs/util": ["@ethereumjs/util@8.1.0", "", { "dependencies": { "@ethereumjs/rlp": "^4.0.1", "ethereum-cryptography": "^2.0.0", "micro-ftch": "^0.3.1" } }, "sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA=="], + + "@humanfs/core": ["@humanfs/core@0.19.1", "", {}, "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA=="], + + "@humanfs/node": ["@humanfs/node@0.16.6", "", { "dependencies": { "@humanfs/core": "^0.19.1", "@humanwhocodes/retry": "^0.3.0" } }, "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw=="], + + "@humanwhocodes/module-importer": ["@humanwhocodes/module-importer@1.0.1", "", {}, "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA=="], + + "@humanwhocodes/retry": ["@humanwhocodes/retry@0.4.3", "", {}, "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ=="], + + "@img/sharp-darwin-arm64": ["@img/sharp-darwin-arm64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-arm64": "1.0.4" }, "os": "darwin", "cpu": "arm64" }, "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ=="], + + "@img/sharp-darwin-x64": ["@img/sharp-darwin-x64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-x64": "1.0.4" }, "os": "darwin", "cpu": "x64" }, "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q=="], + + "@img/sharp-libvips-darwin-arm64": ["@img/sharp-libvips-darwin-arm64@1.0.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg=="], + + "@img/sharp-libvips-darwin-x64": ["@img/sharp-libvips-darwin-x64@1.0.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ=="], + + "@img/sharp-libvips-linux-arm": ["@img/sharp-libvips-linux-arm@1.0.5", "", { "os": "linux", "cpu": "arm" }, "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g=="], + + "@img/sharp-libvips-linux-arm64": ["@img/sharp-libvips-linux-arm64@1.0.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA=="], + + "@img/sharp-libvips-linux-s390x": ["@img/sharp-libvips-linux-s390x@1.0.4", "", { "os": "linux", "cpu": "s390x" }, "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA=="], + + "@img/sharp-libvips-linux-x64": ["@img/sharp-libvips-linux-x64@1.0.4", "", { "os": "linux", "cpu": "x64" }, "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw=="], + + "@img/sharp-libvips-linuxmusl-arm64": ["@img/sharp-libvips-linuxmusl-arm64@1.0.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA=="], + + "@img/sharp-libvips-linuxmusl-x64": ["@img/sharp-libvips-linuxmusl-x64@1.0.4", "", { "os": "linux", "cpu": "x64" }, "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw=="], + + "@img/sharp-linux-arm": ["@img/sharp-linux-arm@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm": "1.0.5" }, "os": "linux", "cpu": "arm" }, "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ=="], + + "@img/sharp-linux-arm64": ["@img/sharp-linux-arm64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm64": "1.0.4" }, "os": "linux", "cpu": "arm64" }, "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA=="], + + "@img/sharp-linux-s390x": ["@img/sharp-linux-s390x@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-s390x": "1.0.4" }, "os": "linux", "cpu": "s390x" }, "sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q=="], + + "@img/sharp-linux-x64": ["@img/sharp-linux-x64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-x64": "1.0.4" }, "os": "linux", "cpu": "x64" }, "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA=="], + + "@img/sharp-linuxmusl-arm64": ["@img/sharp-linuxmusl-arm64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-arm64": "1.0.4" }, "os": "linux", "cpu": "arm64" }, "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g=="], + + "@img/sharp-linuxmusl-x64": ["@img/sharp-linuxmusl-x64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-x64": "1.0.4" }, "os": "linux", "cpu": "x64" }, "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw=="], + + "@img/sharp-wasm32": ["@img/sharp-wasm32@0.33.5", "", { "dependencies": { "@emnapi/runtime": "^1.2.0" }, "cpu": "none" }, "sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg=="], + + "@img/sharp-win32-ia32": ["@img/sharp-win32-ia32@0.33.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ=="], + + "@img/sharp-win32-x64": ["@img/sharp-win32-x64@0.33.5", "", { "os": "win32", "cpu": "x64" }, "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg=="], + + "@isaacs/fs-minipass": ["@isaacs/fs-minipass@4.0.1", "", { "dependencies": { "minipass": "^7.0.4" } }, "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w=="], + + "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.12", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg=="], + + "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="], + + "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.4", "", {}, "sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw=="], + + "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.29", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ=="], + + "@metamask/json-rpc-engine": ["@metamask/json-rpc-engine@8.0.2", "", { "dependencies": { "@metamask/rpc-errors": "^6.2.1", "@metamask/safe-event-emitter": "^3.0.0", "@metamask/utils": "^8.3.0" } }, "sha512-IoQPmql8q7ABLruW7i4EYVHWUbF74yrp63bRuXV5Zf9BQwcn5H9Ww1eLtROYvI1bUXwOiHZ6qT5CWTrDc/t/AA=="], + + "@metamask/json-rpc-middleware-stream": ["@metamask/json-rpc-middleware-stream@7.0.2", "", { "dependencies": { "@metamask/json-rpc-engine": "^8.0.2", "@metamask/safe-event-emitter": "^3.0.0", "@metamask/utils": "^8.3.0", "readable-stream": "^3.6.2" } }, "sha512-yUdzsJK04Ev98Ck4D7lmRNQ8FPioXYhEUZOMS01LXW8qTvPGiRVXmVltj2p4wrLkh0vW7u6nv0mNl5xzC5Qmfg=="], + + "@metamask/object-multiplex": ["@metamask/object-multiplex@2.1.0", "", { "dependencies": { "once": "^1.4.0", "readable-stream": "^3.6.2" } }, "sha512-4vKIiv0DQxljcXwfpnbsXcfa5glMj5Zg9mqn4xpIWqkv6uJ2ma5/GtUfLFSxhlxnR8asRMv8dDmWya1Tc1sDFA=="], + + "@metamask/onboarding": ["@metamask/onboarding@1.0.1", "", { "dependencies": { "bowser": "^2.9.0" } }, "sha512-FqHhAsCI+Vacx2qa5mAFcWNSrTcVGMNjzxVgaX8ECSny/BJ9/vgXP9V7WF/8vb9DltPeQkxr+Fnfmm6GHfmdTQ=="], + + "@metamask/providers": ["@metamask/providers@16.1.0", "", { "dependencies": { "@metamask/json-rpc-engine": "^8.0.1", "@metamask/json-rpc-middleware-stream": "^7.0.1", "@metamask/object-multiplex": "^2.0.0", "@metamask/rpc-errors": "^6.2.1", "@metamask/safe-event-emitter": "^3.1.1", "@metamask/utils": "^8.3.0", "detect-browser": "^5.2.0", "extension-port-stream": "^3.0.0", "fast-deep-equal": "^3.1.3", "is-stream": "^2.0.0", "readable-stream": "^3.6.2", "webextension-polyfill": "^0.10.0" } }, "sha512-znVCvux30+3SaUwcUGaSf+pUckzT5ukPRpcBmy+muBLC0yaWnBcvDqGfcsw6CBIenUdFrVoAFa8B6jsuCY/a+g=="], + + "@metamask/rpc-errors": ["@metamask/rpc-errors@6.4.0", "", { "dependencies": { "@metamask/utils": "^9.0.0", "fast-safe-stringify": "^2.0.6" } }, "sha512-1ugFO1UoirU2esS3juZanS/Fo8C8XYocCuBpfZI5N7ECtoG+zu0wF+uWZASik6CkO6w9n/Iebt4iI4pT0vptpg=="], + + "@metamask/safe-event-emitter": ["@metamask/safe-event-emitter@3.1.2", "", {}, "sha512-5yb2gMI1BDm0JybZezeoX/3XhPDOtTbcFvpTXM9kxsoZjPZFh4XciqRbpD6N86HYZqWDhEaKUDuOyR0sQHEjMA=="], + + "@metamask/sdk": ["@metamask/sdk@0.34.0", "", { "dependencies": { "@babel/runtime": "^7.26.0", "@metamask/onboarding": "^1.0.1", "@metamask/providers": "16.1.0", "@metamask/sdk-analytics": "0.0.5", "@metamask/sdk-communication-layer": "0.33.1", "@metamask/sdk-install-modal-web": "0.32.1", "@paulmillr/qr": "^0.2.1", "bowser": "^2.9.0", "cross-fetch": "^4.0.0", "debug": "4.3.4", "eciesjs": "^0.4.11", "eth-rpc-errors": "^4.0.3", "eventemitter2": "^6.4.9", "obj-multiplex": "^1.0.0", "pump": "^3.0.0", "readable-stream": "^3.6.2", "socket.io-client": "^4.5.1", "tslib": "^2.6.0", "util": "^0.12.4", "uuid": "^8.3.2" } }, "sha512-8dkJUShZ5zFqYjNmhJaqKgDzZVne+F2rNjMQJ3pxs89n3oOUNuJ8dsTo08Grf9vlQ6Ldpdt2RTwqbrxKWyyqlw=="], + + "@metamask/sdk-analytics": ["@metamask/sdk-analytics@0.0.5", "", { "dependencies": { "openapi-fetch": "^0.13.5" } }, "sha512-fDah+keS1RjSUlC8GmYXvx6Y26s3Ax1U9hGpWb6GSY5SAdmTSIqp2CvYy6yW0WgLhnYhW+6xERuD0eVqV63QIQ=="], + + "@metamask/sdk-communication-layer": ["@metamask/sdk-communication-layer@0.33.1", "", { "dependencies": { "@metamask/sdk-analytics": "0.0.5", "bufferutil": "^4.0.8", "date-fns": "^2.29.3", "debug": "4.3.4", "utf-8-validate": "^5.0.2", "uuid": "^8.3.2" }, "peerDependencies": { "cross-fetch": "^4.0.0", "eciesjs": "*", "eventemitter2": "^6.4.9", "readable-stream": "^3.6.2", "socket.io-client": "^4.5.1" } }, "sha512-0bI9hkysxcfbZ/lk0T2+aKVo1j0ynQVTuB3sJ5ssPWlz+Z3VwveCkP1O7EVu1tsVVCb0YV5WxK9zmURu2FIiaA=="], + + "@metamask/sdk-install-modal-web": ["@metamask/sdk-install-modal-web@0.32.1", "", { "dependencies": { "@paulmillr/qr": "^0.2.1" } }, "sha512-MGmAo6qSjf1tuYXhCu2EZLftq+DSt5Z7fsIKr2P+lDgdTPWgLfZB1tJKzNcwKKOdf6q9Qmmxn7lJuI/gq5LrKw=="], + + "@metamask/superstruct": ["@metamask/superstruct@3.2.1", "", {}, "sha512-fLgJnDOXFmuVlB38rUN5SmU7hAFQcCjrg3Vrxz67KTY7YHFnSNEKvX4avmEBdOI0yTCxZjwMCFEqsC8k2+Wd3g=="], + + "@metamask/utils": ["@metamask/utils@8.5.0", "", { "dependencies": { "@ethereumjs/tx": "^4.2.0", "@metamask/superstruct": "^3.0.0", "@noble/hashes": "^1.3.1", "@scure/base": "^1.1.3", "@types/debug": "^4.1.7", "debug": "^4.3.4", "pony-cause": "^2.1.10", "semver": "^7.5.4", "uuid": "^9.0.1" } }, "sha512-I6bkduevXb72TIM9q2LRO63JSsF9EXduh3sBr9oybNX2hNNpr/j1tEjXrsG0Uabm4MJ1xkGAQEMwifvKZIkyxQ=="], + + "@noble/ciphers": ["@noble/ciphers@1.3.0", "", {}, "sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw=="], + + "@noble/curves": ["@noble/curves@1.9.1", "", { "dependencies": { "@noble/hashes": "1.8.0" } }, "sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA=="], + + "@noble/hashes": ["@noble/hashes@1.8.0", "", {}, "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A=="], + + "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="], + + "@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="], + + "@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="], + + "@paulmillr/qr": ["@paulmillr/qr@0.2.1", "", {}, "sha512-IHnV6A+zxU7XwmKFinmYjUcwlyK9+xkG3/s9KcQhI9BjQKycrJ1JRO+FbNYPwZiPKW3je/DR0k7w8/gLa5eaxQ=="], + + "@playwright/test": ["@playwright/test@1.58.2", "", { "dependencies": { "playwright": "1.58.2" }, "bin": { "playwright": "cli.js" } }, "sha512-akea+6bHYBBfA9uQqSYmlJXn61cTa+jbO87xVLCWbTqbWadRVmhxlXATaOjOgcBaWU4ePo0wB41KMFv3o35IXA=="], + + "@polka/url": ["@polka/url@1.0.0-next.29", "", {}, "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww=="], + + "@poppinss/colors": ["@poppinss/colors@4.1.5", "", { "dependencies": { "kleur": "^4.1.5" } }, "sha512-FvdDqtcRCtz6hThExcFOgW0cWX+xwSMWcRuQe5ZEb2m7cVQOAVZOIMt+/v9RxGiD9/OY16qJBXK4CVKWAPalBw=="], + + "@poppinss/dumper": ["@poppinss/dumper@0.6.4", "", { "dependencies": { "@poppinss/colors": "^4.1.5", "@sindresorhus/is": "^7.0.2", "supports-color": "^10.0.0" } }, "sha512-iG0TIdqv8xJ3Lt9O8DrPRxw1MRLjNpoqiSGU03P/wNLP/s0ra0udPJ1J2Tx5M0J3H/cVyEgpbn8xUKRY9j59kQ=="], + + "@poppinss/exception": ["@poppinss/exception@1.2.2", "", {}, "sha512-m7bpKCD4QMlFCjA/nKTs23fuvoVFoA83brRKmObCUNmi/9tVu8Ve3w4YQAnJu4q3Tjf5fr685HYIC/IA2zHRSg=="], + + "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.46.2", "", { "os": "android", "cpu": "arm" }, "sha512-Zj3Hl6sN34xJtMv7Anwb5Gu01yujyE/cLBDB2gnHTAHaWS1Z38L7kuSG+oAh0giZMqG060f/YBStXtMH6FvPMA=="], + + "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.46.2", "", { "os": "android", "cpu": "arm64" }, "sha512-nTeCWY83kN64oQ5MGz3CgtPx8NSOhC5lWtsjTs+8JAJNLcP3QbLCtDDgUKQc/Ro/frpMq4SHUaHN6AMltcEoLQ=="], + + "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.46.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-HV7bW2Fb/F5KPdM/9bApunQh68YVDU8sO8BvcW9OngQVN3HHHkw99wFupuUJfGR9pYLLAjcAOA6iO+evsbBaPQ=="], + + "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.46.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-SSj8TlYV5nJixSsm/y3QXfhspSiLYP11zpfwp6G/YDXctf3Xkdnk4woJIF5VQe0of2OjzTt8EsxnJDCdHd2xMA=="], + + "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.46.2", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-ZyrsG4TIT9xnOlLsSSi9w/X29tCbK1yegE49RYm3tu3wF1L/B6LVMqnEWyDB26d9Ecx9zrmXCiPmIabVuLmNSg=="], + + "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.46.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-pCgHFoOECwVCJ5GFq8+gR8SBKnMO+xe5UEqbemxBpCKYQddRQMgomv1104RnLSg7nNvgKy05sLsY51+OVRyiVw=="], + + "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.46.2", "", { "os": "linux", "cpu": "arm" }, "sha512-EtP8aquZ0xQg0ETFcxUbU71MZlHaw9MChwrQzatiE8U/bvi5uv/oChExXC4mWhjiqK7azGJBqU0tt5H123SzVA=="], + + "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.46.2", "", { "os": "linux", "cpu": "arm" }, "sha512-qO7F7U3u1nfxYRPM8HqFtLd+raev2K137dsV08q/LRKRLEc7RsiDWihUnrINdsWQxPR9jqZ8DIIZ1zJJAm5PjQ=="], + + "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.46.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-3dRaqLfcOXYsfvw5xMrxAk9Lb1f395gkoBYzSFcc/scgRFptRXL9DOaDpMiehf9CO8ZDRJW2z45b6fpU5nwjng=="], + + "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.46.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-fhHFTutA7SM+IrR6lIfiHskxmpmPTJUXpWIsBXpeEwNgZzZZSg/q4i6FU4J8qOGyJ0TR+wXBwx/L7Ho9z0+uDg=="], + + "@rollup/rollup-linux-loongarch64-gnu": ["@rollup/rollup-linux-loongarch64-gnu@4.46.2", "", { "os": "linux", "cpu": "none" }, "sha512-i7wfGFXu8x4+FRqPymzjD+Hyav8l95UIZ773j7J7zRYc3Xsxy2wIn4x+llpunexXe6laaO72iEjeeGyUFmjKeA=="], + + "@rollup/rollup-linux-ppc64-gnu": ["@rollup/rollup-linux-ppc64-gnu@4.46.2", "", { "os": "linux", "cpu": "ppc64" }, "sha512-B/l0dFcHVUnqcGZWKcWBSV2PF01YUt0Rvlurci5P+neqY/yMKchGU8ullZvIv5e8Y1C6wOn+U03mrDylP5q9Yw=="], + + "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.46.2", "", { "os": "linux", "cpu": "none" }, "sha512-32k4ENb5ygtkMwPMucAb8MtV8olkPT03oiTxJbgkJa7lJ7dZMr0GCFJlyvy+K8iq7F/iuOr41ZdUHaOiqyR3iQ=="], + + "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.46.2", "", { "os": "linux", "cpu": "none" }, "sha512-t5B2loThlFEauloaQkZg9gxV05BYeITLvLkWOkRXogP4qHXLkWSbSHKM9S6H1schf/0YGP/qNKtiISlxvfmmZw=="], + + "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.46.2", "", { "os": "linux", "cpu": "s390x" }, "sha512-YKjekwTEKgbB7n17gmODSmJVUIvj8CX7q5442/CK80L8nqOUbMtf8b01QkG3jOqyr1rotrAnW6B/qiHwfcuWQA=="], + + "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.46.2", "", { "os": "linux", "cpu": "x64" }, "sha512-Jj5a9RUoe5ra+MEyERkDKLwTXVu6s3aACP51nkfnK9wJTraCC8IMe3snOfALkrjTYd2G1ViE1hICj0fZ7ALBPA=="], + + "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.46.2", "", { "os": "linux", "cpu": "x64" }, "sha512-7kX69DIrBeD7yNp4A5b81izs8BqoZkCIaxQaOpumcJ1S/kmqNFjPhDu1LHeVXv0SexfHQv5cqHsxLOjETuqDuA=="], + + "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.46.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-wiJWMIpeaak/jsbaq2HMh/rzZxHVW1rU6coyeNNpMwk5isiPjSTx0a4YLSlYDwBH/WBvLz+EtsNqQScZTLJy3g=="], + + "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.46.2", "", { "os": "win32", "cpu": "ia32" }, "sha512-gBgaUDESVzMgWZhcyjfs9QFK16D8K6QZpwAaVNJxYDLHWayOta4ZMjGm/vsAEy3hvlS2GosVFlBlP9/Wb85DqQ=="], + + "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.46.2", "", { "os": "win32", "cpu": "x64" }, "sha512-CvUo2ixeIQGtF6WvuB87XWqPQkoFAFqW+HUo/WzHwuHDvIwZCtjdWXoYCcr06iKGydiqTclC4jU/TNObC/xKZg=="], + + "@scure/base": ["@scure/base@1.2.6", "", {}, "sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg=="], + + "@scure/bip32": ["@scure/bip32@1.7.0", "", { "dependencies": { "@noble/curves": "~1.9.0", "@noble/hashes": "~1.8.0", "@scure/base": "~1.2.5" } }, "sha512-E4FFX/N3f4B80AKWp5dP6ow+flD1LQZo/w8UnLGYZO674jS6YnYeepycOOksv+vLPSpgN35wgKgy+ybfTb2SMw=="], + + "@scure/bip39": ["@scure/bip39@1.6.0", "", { "dependencies": { "@noble/hashes": "~1.8.0", "@scure/base": "~1.2.5" } }, "sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A=="], + + "@sindresorhus/is": ["@sindresorhus/is@7.0.2", "", {}, "sha512-d9xRovfKNz1SKieM0qJdO+PQonjnnIfSNWfHYnBSJ9hkjm0ZPw6HlxscDXYstp3z+7V2GOFHc+J0CYrYTjqCJw=="], + + "@socket.io/component-emitter": ["@socket.io/component-emitter@3.1.2", "", {}, "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA=="], + + "@speed-highlight/core": ["@speed-highlight/core@1.2.7", "", {}, "sha512-0dxmVj4gxg3Jg879kvFS/msl4s9F3T9UXC1InxgOf7t5NvcPD97u/WTA5vL/IxWHMn7qSxBozqrnnE2wvl1m8g=="], + + "@standard-schema/spec": ["@standard-schema/spec@1.0.0", "", {}, "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA=="], + + "@sveltejs/acorn-typescript": ["@sveltejs/acorn-typescript@1.0.5", "", { "peerDependencies": { "acorn": "^8.9.0" } }, "sha512-IwQk4yfwLdibDlrXVE04jTZYlLnwsTT2PIOQQGNLWfjavGifnk1JD1LcZjZaBTRcxZu2FfPfNLOE04DSu9lqtQ=="], + + "@sveltejs/adapter-cloudflare": ["@sveltejs/adapter-cloudflare@7.1.3", "", { "dependencies": { "@cloudflare/workers-types": "^4.20250507.0", "worktop": "0.8.0-next.18" }, "peerDependencies": { "@sveltejs/kit": "^2.0.0", "wrangler": "^4.0.0" } }, "sha512-QdZygPQtUjc6Jd8t/yWIOJyBGELRsLk7wag18rbGU+tIpUCLpTC4qEuBDNcER8v5EDQdOqC8CJqZ8P+Bi5ybQw=="], + + "@sveltejs/kit": ["@sveltejs/kit@2.27.3", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "@sveltejs/acorn-typescript": "^1.0.5", "@types/cookie": "^0.6.0", "acorn": "^8.14.1", "cookie": "^0.6.0", "devalue": "^5.1.0", "esm-env": "^1.2.2", "kleur": "^4.1.5", "magic-string": "^0.30.5", "mrmime": "^2.0.0", "sade": "^1.8.1", "set-cookie-parser": "^2.6.0", "sirv": "^3.0.0" }, "peerDependencies": { "@sveltejs/vite-plugin-svelte": "^3.0.0 || ^4.0.0-next.1 || ^5.0.0 || ^6.0.0-next.0", "svelte": "^4.0.0 || ^5.0.0-next.0", "vite": "^5.0.3 || ^6.0.0 || ^7.0.0-beta.0" }, "bin": { "svelte-kit": "svelte-kit.js" } }, "sha512-jiG3NGZ8RRpi+ncjVnX+oR7uWEgzy//3YLGcTU5mHtjGraeGyNDr7GJFHlk7z0vi8bMXpXIUkEXj6p70FJmHvw=="], + + "@sveltejs/vite-plugin-svelte": ["@sveltejs/vite-plugin-svelte@6.1.1", "", { "dependencies": { "@sveltejs/vite-plugin-svelte-inspector": "^5.0.0", "debug": "^4.4.1", "deepmerge": "^4.3.1", "kleur": "^4.1.5", "magic-string": "^0.30.17", "vitefu": "^1.1.1" }, "peerDependencies": { "svelte": "^5.0.0", "vite": "^6.3.0 || ^7.0.0" } }, "sha512-vB0Vq47Js7C11L2JrwhncIAoDNkdKDPI500SjLSb34X48dDcsSH5JpLl0cHT0sfO997BrzAS6PKjiZEey/S0VQ=="], + + "@sveltejs/vite-plugin-svelte-inspector": ["@sveltejs/vite-plugin-svelte-inspector@5.0.0", "", { "dependencies": { "debug": "^4.4.1" }, "peerDependencies": { "@sveltejs/vite-plugin-svelte": "^6.0.0-next.0", "svelte": "^5.0.0", "vite": "^6.3.0 || ^7.0.0" } }, "sha512-iwQ8Z4ET6ZFSt/gC+tVfcsSBHwsqc6RumSaiLUkAurW3BCpJam65cmHw0oOlDMTO0u+PZi9hilBRYN+LZNHTUQ=="], + + "@tailwindcss/node": ["@tailwindcss/node@4.1.11", "", { "dependencies": { "@ampproject/remapping": "^2.3.0", "enhanced-resolve": "^5.18.1", "jiti": "^2.4.2", "lightningcss": "1.30.1", "magic-string": "^0.30.17", "source-map-js": "^1.2.1", "tailwindcss": "4.1.11" } }, "sha512-yzhzuGRmv5QyU9qLNg4GTlYI6STedBWRE7NjxP45CsFYYq9taI0zJXZBMqIC/c8fViNLhmrbpSFS57EoxUmD6Q=="], + + "@tailwindcss/oxide": ["@tailwindcss/oxide@4.1.11", "", { "dependencies": { "detect-libc": "^2.0.4", "tar": "^7.4.3" }, "optionalDependencies": { "@tailwindcss/oxide-android-arm64": "4.1.11", "@tailwindcss/oxide-darwin-arm64": "4.1.11", "@tailwindcss/oxide-darwin-x64": "4.1.11", "@tailwindcss/oxide-freebsd-x64": "4.1.11", "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.11", "@tailwindcss/oxide-linux-arm64-gnu": "4.1.11", "@tailwindcss/oxide-linux-arm64-musl": "4.1.11", "@tailwindcss/oxide-linux-x64-gnu": "4.1.11", "@tailwindcss/oxide-linux-x64-musl": "4.1.11", "@tailwindcss/oxide-wasm32-wasi": "4.1.11", "@tailwindcss/oxide-win32-arm64-msvc": "4.1.11", "@tailwindcss/oxide-win32-x64-msvc": "4.1.11" } }, "sha512-Q69XzrtAhuyfHo+5/HMgr1lAiPP/G40OMFAnws7xcFEYqcypZmdW8eGXaOUIeOl1dzPJBPENXgbjsOyhg2nkrg=="], + + "@tailwindcss/oxide-android-arm64": ["@tailwindcss/oxide-android-arm64@4.1.11", "", { "os": "android", "cpu": "arm64" }, "sha512-3IfFuATVRUMZZprEIx9OGDjG3Ou3jG4xQzNTvjDoKmU9JdmoCohQJ83MYd0GPnQIu89YoJqvMM0G3uqLRFtetg=="], + + "@tailwindcss/oxide-darwin-arm64": ["@tailwindcss/oxide-darwin-arm64@4.1.11", "", { "os": "darwin", "cpu": "arm64" }, "sha512-ESgStEOEsyg8J5YcMb1xl8WFOXfeBmrhAwGsFxxB2CxY9evy63+AtpbDLAyRkJnxLy2WsD1qF13E97uQyP1lfQ=="], + + "@tailwindcss/oxide-darwin-x64": ["@tailwindcss/oxide-darwin-x64@4.1.11", "", { "os": "darwin", "cpu": "x64" }, "sha512-EgnK8kRchgmgzG6jE10UQNaH9Mwi2n+yw1jWmof9Vyg2lpKNX2ioe7CJdf9M5f8V9uaQxInenZkOxnTVL3fhAw=="], + + "@tailwindcss/oxide-freebsd-x64": ["@tailwindcss/oxide-freebsd-x64@4.1.11", "", { "os": "freebsd", "cpu": "x64" }, "sha512-xdqKtbpHs7pQhIKmqVpxStnY1skuNh4CtbcyOHeX1YBE0hArj2romsFGb6yUmzkq/6M24nkxDqU8GYrKrz+UcA=="], + + "@tailwindcss/oxide-linux-arm-gnueabihf": ["@tailwindcss/oxide-linux-arm-gnueabihf@4.1.11", "", { "os": "linux", "cpu": "arm" }, "sha512-ryHQK2eyDYYMwB5wZL46uoxz2zzDZsFBwfjssgB7pzytAeCCa6glsiJGjhTEddq/4OsIjsLNMAiMlHNYnkEEeg=="], + + "@tailwindcss/oxide-linux-arm64-gnu": ["@tailwindcss/oxide-linux-arm64-gnu@4.1.11", "", { "os": "linux", "cpu": "arm64" }, "sha512-mYwqheq4BXF83j/w75ewkPJmPZIqqP1nhoghS9D57CLjsh3Nfq0m4ftTotRYtGnZd3eCztgbSPJ9QhfC91gDZQ=="], + + "@tailwindcss/oxide-linux-arm64-musl": ["@tailwindcss/oxide-linux-arm64-musl@4.1.11", "", { "os": "linux", "cpu": "arm64" }, "sha512-m/NVRFNGlEHJrNVk3O6I9ggVuNjXHIPoD6bqay/pubtYC9QIdAMpS+cswZQPBLvVvEF6GtSNONbDkZrjWZXYNQ=="], + + "@tailwindcss/oxide-linux-x64-gnu": ["@tailwindcss/oxide-linux-x64-gnu@4.1.11", "", { "os": "linux", "cpu": "x64" }, "sha512-YW6sblI7xukSD2TdbbaeQVDysIm/UPJtObHJHKxDEcW2exAtY47j52f8jZXkqE1krdnkhCMGqP3dbniu1Te2Fg=="], + + "@tailwindcss/oxide-linux-x64-musl": ["@tailwindcss/oxide-linux-x64-musl@4.1.11", "", { "os": "linux", "cpu": "x64" }, "sha512-e3C/RRhGunWYNC3aSF7exsQkdXzQ/M+aYuZHKnw4U7KQwTJotnWsGOIVih0s2qQzmEzOFIJ3+xt7iq67K/p56Q=="], + + "@tailwindcss/oxide-wasm32-wasi": ["@tailwindcss/oxide-wasm32-wasi@4.1.11", "", { "cpu": "none" }, "sha512-Xo1+/GU0JEN/C/dvcammKHzeM6NqKovG+6921MR6oadee5XPBaKOumrJCXvopJ/Qb5TH7LX/UAywbqrP4lax0g=="], + + "@tailwindcss/oxide-win32-arm64-msvc": ["@tailwindcss/oxide-win32-arm64-msvc@4.1.11", "", { "os": "win32", "cpu": "arm64" }, "sha512-UgKYx5PwEKrac3GPNPf6HVMNhUIGuUh4wlDFR2jYYdkX6pL/rn73zTq/4pzUm8fOjAn5L8zDeHp9iXmUGOXZ+w=="], + + "@tailwindcss/oxide-win32-x64-msvc": ["@tailwindcss/oxide-win32-x64-msvc@4.1.11", "", { "os": "win32", "cpu": "x64" }, "sha512-YfHoggn1j0LK7wR82TOucWc5LDCguHnoS879idHekmmiR7g9HUtMw9MI0NHatS28u/Xlkfi9w5RJWgz2Dl+5Qg=="], + + "@tailwindcss/vite": ["@tailwindcss/vite@4.1.11", "", { "dependencies": { "@tailwindcss/node": "4.1.11", "@tailwindcss/oxide": "4.1.11", "tailwindcss": "4.1.11" }, "peerDependencies": { "vite": "^5.2.0 || ^6 || ^7" } }, "sha512-RHYhrR3hku0MJFRV+fN2gNbDNEh3dwKvY8XJvTxCSXeMOsCRSr+uKvDWQcbizrHgjML6ZmTE5OwMrl5wKcujCw=="], + + "@tanstack/query-core": ["@tanstack/query-core@5.90.20", "", {}, "sha512-OMD2HLpNouXEfZJWcKeVKUgQ5n+n3A2JFmBaScpNDUqSrQSjiveC7dKMe53uJUg1nDG16ttFPz2xfilz6i2uVg=="], + + "@tanstack/react-query": ["@tanstack/react-query@5.90.21", "", { "dependencies": { "@tanstack/query-core": "5.90.20" }, "peerDependencies": { "react": "^18 || ^19" } }, "sha512-0Lu6y5t+tvlTJMTO7oh5NSpJfpg/5D41LlThfepTixPYkJ0sE2Jj0m0f6yYqujBwIXlId87e234+MxG3D3g7kg=="], + + "@types/bun": ["@types/bun@1.3.8", "", { "dependencies": { "bun-types": "1.3.8" } }, "sha512-3LvWJ2q5GerAXYxO2mffLTqOzEu5qnhEAlh48Vnu8WQfnmSwbgagjGZV6BoHKJztENYEDn6QmVd949W4uESRJA=="], + + "@types/cookie": ["@types/cookie@0.6.0", "", {}, "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA=="], + + "@types/debug": ["@types/debug@4.1.12", "", { "dependencies": { "@types/ms": "*" } }, "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ=="], + + "@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], + + "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="], + + "@types/ms": ["@types/ms@2.1.0", "", {}, "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA=="], + + "@types/node": ["@types/node@25.2.2", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-BkmoP5/FhRYek5izySdkOneRyXYN35I860MFAGupTdebyE66uZaR+bXLHq8k4DirE5DwQi3NuhvRU1jqTVwUrQ=="], + + "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.39.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "8.39.0", "@typescript-eslint/type-utils": "8.39.0", "@typescript-eslint/utils": "8.39.0", "@typescript-eslint/visitor-keys": "8.39.0", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.39.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-bhEz6OZeUR+O/6yx9Jk6ohX6H9JSFTaiY0v9/PuKT3oGK0rn0jNplLmyFUGV+a9gfYnVNwGDwS/UkLIuXNb2Rw=="], + + "@typescript-eslint/parser": ["@typescript-eslint/parser@8.39.0", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.39.0", "@typescript-eslint/types": "8.39.0", "@typescript-eslint/typescript-estree": "8.39.0", "@typescript-eslint/visitor-keys": "8.39.0", "debug": "^4.3.4" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-g3WpVQHngx0aLXn6kfIYCZxM6rRJlWzEkVpqEFLT3SgEDsp9cpCbxxgwnE504q4H+ruSDh/VGS6nqZIDynP+vg=="], + + "@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.39.0", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.39.0", "@typescript-eslint/types": "^8.39.0", "debug": "^4.3.4" }, "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-CTzJqaSq30V/Z2Og9jogzZt8lJRR5TKlAdXmWgdu4hgcC9Kww5flQ+xFvMxIBWVNdxJO7OifgdOK4PokMIWPew=="], + + "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.39.0", "", { "dependencies": { "@typescript-eslint/types": "8.39.0", "@typescript-eslint/visitor-keys": "8.39.0" } }, "sha512-8QOzff9UKxOh6npZQ/4FQu4mjdOCGSdO3p44ww0hk8Vu+IGbg0tB/H1LcTARRDzGCC8pDGbh2rissBuuoPgH8A=="], + + "@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.39.0", "", { "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-Fd3/QjmFV2sKmvv3Mrj8r6N8CryYiCS8Wdb/6/rgOXAWGcFuc+VkQuG28uk/4kVNVZBQuuDHEDUpo/pQ32zsIQ=="], + + "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.39.0", "", { "dependencies": { "@typescript-eslint/types": "8.39.0", "@typescript-eslint/typescript-estree": "8.39.0", "@typescript-eslint/utils": "8.39.0", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-6B3z0c1DXVT2vYA9+z9axjtc09rqKUPRmijD5m9iv8iQpHBRYRMBcgxSiKTZKm6FwWw1/cI4v6em35OsKCiN5Q=="], + + "@typescript-eslint/types": ["@typescript-eslint/types@8.39.0", "", {}, "sha512-ArDdaOllnCj3yn/lzKn9s0pBQYmmyme/v1HbGIGB0GB/knFI3fWMHloC+oYTJW46tVbYnGKTMDK4ah1sC2v0Kg=="], + + "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.39.0", "", { "dependencies": { "@typescript-eslint/project-service": "8.39.0", "@typescript-eslint/tsconfig-utils": "8.39.0", "@typescript-eslint/types": "8.39.0", "@typescript-eslint/visitor-keys": "8.39.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-ndWdiflRMvfIgQRpckQQLiB5qAKQ7w++V4LlCHwp62eym1HLB/kw7D9f2e8ytONls/jt89TEasgvb+VwnRprsw=="], + + "@typescript-eslint/utils": ["@typescript-eslint/utils@8.39.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", "@typescript-eslint/scope-manager": "8.39.0", "@typescript-eslint/types": "8.39.0", "@typescript-eslint/typescript-estree": "8.39.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-4GVSvNA0Vx1Ktwvf4sFE+exxJ3QGUorQG1/A5mRfRNZtkBT2xrA/BCO2H0eALx/PnvCS6/vmYwRdDA41EoffkQ=="], + + "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.39.0", "", { "dependencies": { "@typescript-eslint/types": "8.39.0", "eslint-visitor-keys": "^4.2.1" } }, "sha512-ldgiJ+VAhQCfIjeOgu8Kj5nSxds0ktPOSO9p4+0VDH2R2pLvQraaM5Oen2d7NxzMCm+Sn/vJT+mv2H5u6b/3fA=="], + + "@wagmi/connectors": ["@wagmi/connectors@7.2.1", "", { "peerDependencies": { "@base-org/account": "^2.5.1", "@coinbase/wallet-sdk": "^4.3.6", "@metamask/sdk": "~0.33.1", "@safe-global/safe-apps-provider": "~0.18.6", "@safe-global/safe-apps-sdk": "^9.1.0", "@wagmi/core": "3.4.0", "@walletconnect/ethereum-provider": "^2.21.1", "porto": "~0.2.35", "typescript": ">=5.7.3", "viem": "2.x" }, "optionalPeers": ["@base-org/account", "@coinbase/wallet-sdk", "@metamask/sdk", "@safe-global/safe-apps-provider", "@safe-global/safe-apps-sdk", "@walletconnect/ethereum-provider", "porto", "typescript"] }, "sha512-/tyDepUMDM8eNzNX3ofjqHNRFZ6XcZ3u0+cQp5x0/LHCpMA8tRh7A1/e7dTrYiIJeL7iLgHzfHUXCsU02OKMLQ=="], + + "@wagmi/core": ["@wagmi/core@3.4.0", "", { "dependencies": { "eventemitter3": "5.0.1", "mipd": "0.0.7", "zustand": "5.0.0" }, "peerDependencies": { "@tanstack/query-core": ">=5.0.0", "ox": ">=0.11.1", "typescript": ">=5.7.3", "viem": "2.x" }, "optionalPeers": ["@tanstack/query-core", "ox", "typescript"] }, "sha512-EU5gDsUp5t7+cuLv12/L8hfyWfCIKsBNiiBqpOqxZJxvAcAiQk4xFe2jMgaQPqApc3Omvxrk032M8AQ4N0cQeg=="], + + "abitype": ["abitype@1.2.3", "", { "peerDependencies": { "typescript": ">=5.0.4", "zod": "^3.22.0 || ^4.0.0" } }, "sha512-Ofer5QUnuUdTFsBRwARMoWKOH1ND5ehwYhJ3OJ/BQO+StkwQjHw0XyVh4vDttzHB7QOFhPHa/o413PJ82gU/Tg=="], + + "acorn": ["acorn@8.15.0", "", { "bin": "bin/acorn" }, "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg=="], + + "acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="], + + "acorn-walk": ["acorn-walk@8.3.2", "", {}, "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A=="], + + "ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], + + "ansi-escapes": ["ansi-escapes@7.3.0", "", { "dependencies": { "environment": "^1.0.0" } }, "sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg=="], + + "ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], + + "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], + + "aria-query": ["aria-query@5.3.2", "", {}, "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw=="], + + "asynckit": ["asynckit@0.4.0", "", {}, "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="], + + "available-typed-arrays": ["available-typed-arrays@1.0.7", "", { "dependencies": { "possible-typed-array-names": "^1.0.0" } }, "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ=="], + + "axios": ["axios@1.11.0", "", { "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.4", "proxy-from-env": "^1.1.0" } }, "sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA=="], + + "axobject-query": ["axobject-query@4.1.0", "", {}, "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ=="], + + "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + + "base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="], + + "blake3-wasm": ["blake3-wasm@2.1.5", "", {}, "sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g=="], + + "bowser": ["bowser@2.14.1", "", {}, "sha512-tzPjzCxygAKWFOJP011oxFHs57HzIhOEracIgAePE4pqB3LikALKnSzUyU4MGs9/iCEUuHlAJTjTc5M+u7YEGg=="], + + "brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="], + + "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], + + "buffer-from": ["buffer-from@1.1.2", "", {}, "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="], + + "bufferutil": ["bufferutil@4.1.0", "", { "dependencies": { "node-gyp-build": "^4.3.0" } }, "sha512-ZMANVnAixE6AWWnPzlW2KpUrxhm9woycYvPOo67jWHyFowASTEd9s+QN1EIMsSDtwhIxN4sWE1jotpuDUIgyIw=="], + + "bun-types": ["bun-types@1.3.8", "", { "dependencies": { "@types/node": "*" } }, "sha512-fL99nxdOWvV4LqjmC+8Q9kW3M4QTtTR1eePs94v5ctGqU8OeceWrSUaRw3JYb7tU3FkMIAjkueehrHPPPGKi5Q=="], + + "call-bind": ["call-bind@1.0.8", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.0", "es-define-property": "^1.0.0", "get-intrinsic": "^1.2.4", "set-function-length": "^1.2.2" } }, "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww=="], + + "call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.2", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ=="], + + "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], + + "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], + + "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "chokidar": ["chokidar@4.0.3", "", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="], + + "chownr": ["chownr@3.0.0", "", {}, "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g=="], + + "cli-cursor": ["cli-cursor@5.0.0", "", { "dependencies": { "restore-cursor": "^5.0.0" } }, "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw=="], + + "cli-truncate": ["cli-truncate@5.1.1", "", { "dependencies": { "slice-ansi": "^7.1.0", "string-width": "^8.0.0" } }, "sha512-SroPvNHxUnk+vIW/dOSfNqdy1sPEFkrTk6TUtqLCnBlo3N7TNYYkzzN7uSD6+jVjrdO4+p8nH7JzH6cIvUem6A=="], + + "clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="], + + "color": ["color@4.2.3", "", { "dependencies": { "color-convert": "^2.0.1", "color-string": "^1.9.0" } }, "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A=="], + + "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], + + "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + + "color-string": ["color-string@1.9.1", "", { "dependencies": { "color-name": "^1.0.0", "simple-swizzle": "^0.2.2" } }, "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg=="], + + "colorette": ["colorette@2.0.20", "", {}, "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w=="], + + "combined-stream": ["combined-stream@1.0.8", "", { "dependencies": { "delayed-stream": "~1.0.0" } }, "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg=="], + + "commander": ["commander@14.0.3", "", {}, "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw=="], + + "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="], + + "cookie": ["cookie@0.6.0", "", {}, "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw=="], + + "core-util-is": ["core-util-is@1.0.3", "", {}, "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="], + + "crc-32": ["crc-32@1.2.2", "", { "bin": { "crc32": "bin/crc32.njs" } }, "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ=="], + + "cross-fetch": ["cross-fetch@4.1.0", "", { "dependencies": { "node-fetch": "^2.7.0" } }, "sha512-uKm5PU+MHTootlWEY+mZ4vvXoCn4fLQxT9dSc1sXVMSFkINTJVN8cAQROpwcKm8bJ/c7rgZVIBWzH5T78sNZZw=="], + + "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], + + "cssesc": ["cssesc@3.0.0", "", { "bin": "bin/cssesc" }, "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="], + + "date-fns": ["date-fns@2.30.0", "", { "dependencies": { "@babel/runtime": "^7.21.0" } }, "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw=="], + + "debug": ["debug@4.4.1", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ=="], + + "deep-is": ["deep-is@0.1.4", "", {}, "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="], + + "deepmerge": ["deepmerge@4.3.1", "", {}, "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A=="], + + "define-data-property": ["define-data-property@1.1.4", "", { "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", "gopd": "^1.0.1" } }, "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A=="], + + "defu": ["defu@6.1.4", "", {}, "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg=="], + + "delayed-stream": ["delayed-stream@1.0.0", "", {}, "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="], + + "detect-browser": ["detect-browser@5.3.0", "", {}, "sha512-53rsFbGdwMwlF7qvCt0ypLM5V5/Mbl0szB7GPN8y9NCcbknYOeVVXdrXEq+90IwAfrrzt6Hd+u2E2ntakICU8w=="], + + "detect-libc": ["detect-libc@2.0.4", "", {}, "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA=="], + + "devalue": ["devalue@5.1.1", "", {}, "sha512-maua5KUiapvEwiEAe+XnlZ3Rh0GD+qI1J/nb9vrJc3muPXvcF/8gXYTWF76+5DAqHyDUtOIImEuo0YKE9mshVw=="], + + "dotenv": ["dotenv@17.3.1", "", {}, "sha512-IO8C/dzEb6O3F9/twg6ZLXz164a2fhTnEWb95H23Dm4OuN+92NmEAlTrupP9VW6Jm3sO26tQlqyvyi4CsnY9GA=="], + + "drizzle-kit": ["drizzle-kit@0.31.9", "", { "dependencies": { "@drizzle-team/brocli": "^0.10.2", "@esbuild-kit/esm-loader": "^2.5.5", "esbuild": "^0.25.4", "esbuild-register": "^3.5.0" }, "bin": { "drizzle-kit": "bin.cjs" } }, "sha512-GViD3IgsXn7trFyBUUHyTFBpH/FsHTxYJ66qdbVggxef4UBPHRYxQaRzYLTuekYnk9i5FIEL9pbBIwMqX/Uwrg=="], + + "drizzle-orm": ["drizzle-orm@0.45.1", "", { "peerDependencies": { "@aws-sdk/client-rds-data": ">=3", "@cloudflare/workers-types": ">=4", "@electric-sql/pglite": ">=0.2.0", "@libsql/client": ">=0.10.0", "@libsql/client-wasm": ">=0.10.0", "@neondatabase/serverless": ">=0.10.0", "@op-engineering/op-sqlite": ">=2", "@opentelemetry/api": "^1.4.1", "@planetscale/database": ">=1.13", "@prisma/client": "*", "@tidbcloud/serverless": "*", "@types/better-sqlite3": "*", "@types/pg": "*", "@types/sql.js": "*", "@upstash/redis": ">=1.34.7", "@vercel/postgres": ">=0.8.0", "@xata.io/client": "*", "better-sqlite3": ">=7", "bun-types": "*", "expo-sqlite": ">=14.0.0", "gel": ">=2", "knex": "*", "kysely": "*", "mysql2": ">=2", "pg": ">=8", "postgres": ">=3", "sql.js": ">=1", "sqlite3": ">=5" }, "optionalPeers": ["@aws-sdk/client-rds-data", "@cloudflare/workers-types", "@electric-sql/pglite", "@libsql/client", "@libsql/client-wasm", "@neondatabase/serverless", "@op-engineering/op-sqlite", "@opentelemetry/api", "@planetscale/database", "@prisma/client", "@tidbcloud/serverless", "@types/better-sqlite3", "@types/pg", "@types/sql.js", "@upstash/redis", "@vercel/postgres", "@xata.io/client", "better-sqlite3", "bun-types", "expo-sqlite", "gel", "knex", "kysely", "mysql2", "pg", "postgres", "sql.js", "sqlite3"] }, "sha512-Te0FOdKIistGNPMq2jscdqngBRfBpC8uMFVwqjf6gtTVJHIQ/dosgV/CLBU2N4ZJBsXL5savCba9b0YJskKdcA=="], + + "dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="], + + "eciesjs": ["eciesjs@0.4.17", "", { "dependencies": { "@ecies/ciphers": "^0.2.5", "@noble/ciphers": "^1.3.0", "@noble/curves": "^1.9.7", "@noble/hashes": "^1.8.0" } }, "sha512-TOOURki4G7sD1wDCjj7NfLaXZZ49dFOeEb5y39IXpb8p0hRzVvfvzZHOi5JcT+PpyAbi/Y+lxPb8eTag2WYH8w=="], + + "emoji-regex": ["emoji-regex@10.6.0", "", {}, "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A=="], + + "end-of-stream": ["end-of-stream@1.4.5", "", { "dependencies": { "once": "^1.4.0" } }, "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg=="], + + "engine.io-client": ["engine.io-client@6.6.4", "", { "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.4.1", "engine.io-parser": "~5.2.1", "ws": "~8.18.3", "xmlhttprequest-ssl": "~2.1.1" } }, "sha512-+kjUJnZGwzewFDw951CDWcwj35vMNf2fcj7xQWOctq1F2i1jkDdVvdFG9kM/BEChymCH36KgjnW0NsL58JYRxw=="], + + "engine.io-parser": ["engine.io-parser@5.2.3", "", {}, "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q=="], + + "enhanced-resolve": ["enhanced-resolve@5.18.3", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" } }, "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww=="], + + "environment": ["environment@1.1.0", "", {}, "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q=="], + + "error-stack-parser-es": ["error-stack-parser-es@1.0.5", "", {}, "sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA=="], + + "es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="], + + "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="], + + "es-object-atoms": ["es-object-atoms@1.1.1", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA=="], + + "es-set-tostringtag": ["es-set-tostringtag@2.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA=="], + + "esbuild": ["esbuild@0.25.8", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.8", "@esbuild/android-arm": "0.25.8", "@esbuild/android-arm64": "0.25.8", "@esbuild/android-x64": "0.25.8", "@esbuild/darwin-arm64": "0.25.8", "@esbuild/darwin-x64": "0.25.8", "@esbuild/freebsd-arm64": "0.25.8", "@esbuild/freebsd-x64": "0.25.8", "@esbuild/linux-arm": "0.25.8", "@esbuild/linux-arm64": "0.25.8", "@esbuild/linux-ia32": "0.25.8", "@esbuild/linux-loong64": "0.25.8", "@esbuild/linux-mips64el": "0.25.8", "@esbuild/linux-ppc64": "0.25.8", "@esbuild/linux-riscv64": "0.25.8", "@esbuild/linux-s390x": "0.25.8", "@esbuild/linux-x64": "0.25.8", "@esbuild/netbsd-arm64": "0.25.8", "@esbuild/netbsd-x64": "0.25.8", "@esbuild/openbsd-arm64": "0.25.8", "@esbuild/openbsd-x64": "0.25.8", "@esbuild/openharmony-arm64": "0.25.8", "@esbuild/sunos-x64": "0.25.8", "@esbuild/win32-arm64": "0.25.8", "@esbuild/win32-ia32": "0.25.8", "@esbuild/win32-x64": "0.25.8" }, "bin": "bin/esbuild" }, "sha512-vVC0USHGtMi8+R4Kz8rt6JhEWLxsv9Rnu/lGYbPR8u47B+DCBksq9JarW0zOO7bs37hyOK1l2/oqtbciutL5+Q=="], + + "esbuild-register": ["esbuild-register@3.6.0", "", { "dependencies": { "debug": "^4.3.4" }, "peerDependencies": { "esbuild": ">=0.12 <1" } }, "sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg=="], + + "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], + + "eslint": ["eslint@9.32.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.0", "@eslint/config-helpers": "^0.3.0", "@eslint/core": "^0.15.0", "@eslint/eslintrc": "^3.3.1", "@eslint/js": "9.32.0", "@eslint/plugin-kit": "^0.3.4", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.4.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "bin": "bin/eslint.js" }, "sha512-LSehfdpgMeWcTZkWZVIJl+tkZ2nuSkyyB9C27MZqFWXuph7DvaowgcTvKqxvpLW1JZIk8PN7hFY3Rj9LQ7m7lg=="], + + "eslint-config-prettier": ["eslint-config-prettier@10.1.8", "", { "peerDependencies": { "eslint": ">=7.0.0" }, "bin": "bin/cli.js" }, "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w=="], + + "eslint-plugin-svelte": ["eslint-plugin-svelte@3.11.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.6.1", "@jridgewell/sourcemap-codec": "^1.5.0", "esutils": "^2.0.3", "globals": "^16.0.0", "known-css-properties": "^0.37.0", "postcss": "^8.4.49", "postcss-load-config": "^3.1.4", "postcss-safe-parser": "^7.0.0", "semver": "^7.6.3", "svelte-eslint-parser": "^1.3.0" }, "peerDependencies": { "eslint": "^8.57.1 || ^9.0.0", "svelte": "^3.37.0 || ^4.0.0 || ^5.0.0" } }, "sha512-KliWlkieHyEa65aQIkRwUFfHzT5Cn4u3BQQsu3KlkJOs7c1u7ryn84EWaOjEzilbKgttT4OfBURA8Uc4JBSQIw=="], + + "eslint-scope": ["eslint-scope@8.4.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg=="], + + "eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], + + "esm-env": ["esm-env@1.2.2", "", {}, "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA=="], + + "espree": ["espree@10.4.0", "", { "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.1" } }, "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ=="], + + "esquery": ["esquery@1.6.0", "", { "dependencies": { "estraverse": "^5.1.0" } }, "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg=="], + + "esrap": ["esrap@2.1.0", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" } }, "sha512-yzmPNpl7TBbMRC5Lj2JlJZNPml0tzqoqP5B1JXycNUwtqma9AKCO0M2wHrdgsHcy1WRW7S9rJknAMtByg3usgA=="], + + "esrecurse": ["esrecurse@4.3.0", "", { "dependencies": { "estraverse": "^5.2.0" } }, "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag=="], + + "estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="], + + "esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="], + + "eth-rpc-errors": ["eth-rpc-errors@4.0.3", "", { "dependencies": { "fast-safe-stringify": "^2.0.6" } }, "sha512-Z3ymjopaoft7JDoxZcEb3pwdGh7yiYMhOwm2doUt6ASXlMavpNlK6Cre0+IMl2VSGyEU9rkiperQhp5iRxn5Pg=="], + + "ethereum-cryptography": ["ethereum-cryptography@2.2.1", "", { "dependencies": { "@noble/curves": "1.4.2", "@noble/hashes": "1.4.0", "@scure/bip32": "1.4.0", "@scure/bip39": "1.3.0" } }, "sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg=="], + + "eventemitter2": ["eventemitter2@6.4.9", "", {}, "sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg=="], + + "eventemitter3": ["eventemitter3@5.0.1", "", {}, "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA=="], + + "exit-hook": ["exit-hook@2.2.1", "", {}, "sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw=="], + + "exsolve": ["exsolve@1.0.7", "", {}, "sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw=="], + + "extension-port-stream": ["extension-port-stream@3.0.0", "", { "dependencies": { "readable-stream": "^3.6.2 || ^4.4.2", "webextension-polyfill": ">=0.10.0 <1.0" } }, "sha512-an2S5quJMiy5bnZKEf6AkfH/7r8CzHvhchU40gxN+OM6HPhe7Z9T1FUychcf2M9PpPOO0Hf7BAEfJkw2TDIBDw=="], + + "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], + + "fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="], + + "fast-json-stable-stringify": ["fast-json-stable-stringify@2.1.0", "", {}, "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="], + + "fast-levenshtein": ["fast-levenshtein@2.0.6", "", {}, "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="], + + "fast-safe-stringify": ["fast-safe-stringify@2.1.1", "", {}, "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA=="], + + "fastq": ["fastq@1.19.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ=="], + + "fdir": ["fdir@6.4.6", "", { "peerDependencies": { "picomatch": "^3 || ^4" } }, "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w=="], + + "file-entry-cache": ["file-entry-cache@8.0.0", "", { "dependencies": { "flat-cache": "^4.0.0" } }, "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ=="], + + "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], + + "find-up": ["find-up@5.0.0", "", { "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="], + + "flat-cache": ["flat-cache@4.0.1", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" } }, "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw=="], + + "flatted": ["flatted@3.3.3", "", {}, "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg=="], + + "follow-redirects": ["follow-redirects@1.15.11", "", {}, "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ=="], + + "for-each": ["for-each@0.3.5", "", { "dependencies": { "is-callable": "^1.2.7" } }, "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg=="], + + "form-data": ["form-data@4.0.4", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "hasown": "^2.0.2", "mime-types": "^2.1.12" } }, "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow=="], + + "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], + + "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], + + "generator-function": ["generator-function@2.0.1", "", {}, "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g=="], + + "get-east-asian-width": ["get-east-asian-width@1.4.0", "", {}, "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q=="], + + "get-intrinsic": ["get-intrinsic@1.3.0", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "math-intrinsics": "^1.1.0" } }, "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ=="], + + "get-proto": ["get-proto@1.0.1", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="], + + "get-tsconfig": ["get-tsconfig@4.13.6", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-shZT/QMiSHc/YBLxxOkMtgSid5HFoauqCE3/exfsEcwg1WkeqjG+V40yBbBrsD+jW2HDXcs28xOfcbm2jI8Ddw=="], + + "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], + + "glob-to-regexp": ["glob-to-regexp@0.4.1", "", {}, "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw=="], + + "globals": ["globals@16.3.0", "", {}, "sha512-bqWEnJ1Nt3neqx2q5SFfGS8r/ahumIakg3HcwtNlrVlwXIeNumWn/c7Pn/wKzGhf6SaW6H6uWXLqC30STCMchQ=="], + + "gopd": ["gopd@1.2.0", "", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="], + + "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], + + "graphemer": ["graphemer@1.4.0", "", {}, "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag=="], + + "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + + "has-property-descriptors": ["has-property-descriptors@1.0.2", "", { "dependencies": { "es-define-property": "^1.0.0" } }, "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg=="], + + "has-symbols": ["has-symbols@1.1.0", "", {}, "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="], + + "has-tostringtag": ["has-tostringtag@1.0.2", "", { "dependencies": { "has-symbols": "^1.0.3" } }, "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw=="], + + "hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="], + + "husky": ["husky@9.1.7", "", { "bin": "bin.js" }, "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA=="], + + "ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + + "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], + + "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], + + "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], + + "is-arguments": ["is-arguments@1.2.0", "", { "dependencies": { "call-bound": "^1.0.2", "has-tostringtag": "^1.0.2" } }, "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA=="], + + "is-arrayish": ["is-arrayish@0.3.2", "", {}, "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ=="], + + "is-callable": ["is-callable@1.2.7", "", {}, "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA=="], + + "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], + + "is-fullwidth-code-point": ["is-fullwidth-code-point@5.1.0", "", { "dependencies": { "get-east-asian-width": "^1.3.1" } }, "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ=="], + + "is-generator-function": ["is-generator-function@1.1.2", "", { "dependencies": { "call-bound": "^1.0.4", "generator-function": "^2.0.0", "get-proto": "^1.0.1", "has-tostringtag": "^1.0.2", "safe-regex-test": "^1.1.0" } }, "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA=="], + + "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], + + "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], + + "is-reference": ["is-reference@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.6" } }, "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw=="], + + "is-regex": ["is-regex@1.2.1", "", { "dependencies": { "call-bound": "^1.0.2", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g=="], + + "is-stream": ["is-stream@2.0.1", "", {}, "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg=="], + + "is-typed-array": ["is-typed-array@1.1.15", "", { "dependencies": { "which-typed-array": "^1.1.16" } }, "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ=="], + + "isarray": ["isarray@1.0.0", "", {}, "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="], + + "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], + + "isows": ["isows@1.0.7", "", { "peerDependencies": { "ws": "*" } }, "sha512-I1fSfDCZL5P0v33sVqeTDSpcstAg/N+wF5HS033mogOVIp4B+oHC7oOCsA3axAbBSGTJ8QubbNmnIRN/h8U7hg=="], + + "jiti": ["jiti@2.5.1", "", { "bin": "lib/jiti-cli.mjs" }, "sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w=="], + + "js-yaml": ["js-yaml@4.1.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": "bin/js-yaml.js" }, "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA=="], + + "json-buffer": ["json-buffer@3.0.1", "", {}, "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="], + + "json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + + "json-stable-stringify-without-jsonify": ["json-stable-stringify-without-jsonify@1.0.1", "", {}, "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="], + + "keyv": ["keyv@4.5.4", "", { "dependencies": { "json-buffer": "3.0.1" } }, "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw=="], + + "kleur": ["kleur@4.1.5", "", {}, "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ=="], + + "known-css-properties": ["known-css-properties@0.37.0", "", {}, "sha512-JCDrsP4Z1Sb9JwG0aJ8Eo2r7k4Ou5MwmThS/6lcIe1ICyb7UBJKGRIUUdqc2ASdE/42lgz6zFUnzAIhtXnBVrQ=="], + + "levn": ["levn@0.4.1", "", { "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" } }, "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ=="], + + "lightningcss": ["lightningcss@1.30.1", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-darwin-arm64": "1.30.1", "lightningcss-darwin-x64": "1.30.1", "lightningcss-freebsd-x64": "1.30.1", "lightningcss-linux-arm-gnueabihf": "1.30.1", "lightningcss-linux-arm64-gnu": "1.30.1", "lightningcss-linux-arm64-musl": "1.30.1", "lightningcss-linux-x64-gnu": "1.30.1", "lightningcss-linux-x64-musl": "1.30.1", "lightningcss-win32-arm64-msvc": "1.30.1", "lightningcss-win32-x64-msvc": "1.30.1" } }, "sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg=="], + + "lightningcss-darwin-arm64": ["lightningcss-darwin-arm64@1.30.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ=="], + + "lightningcss-darwin-x64": ["lightningcss-darwin-x64@1.30.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA=="], + + "lightningcss-freebsd-x64": ["lightningcss-freebsd-x64@1.30.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig=="], + + "lightningcss-linux-arm-gnueabihf": ["lightningcss-linux-arm-gnueabihf@1.30.1", "", { "os": "linux", "cpu": "arm" }, "sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q=="], + + "lightningcss-linux-arm64-gnu": ["lightningcss-linux-arm64-gnu@1.30.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw=="], + + "lightningcss-linux-arm64-musl": ["lightningcss-linux-arm64-musl@1.30.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ=="], + + "lightningcss-linux-x64-gnu": ["lightningcss-linux-x64-gnu@1.30.1", "", { "os": "linux", "cpu": "x64" }, "sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw=="], + + "lightningcss-linux-x64-musl": ["lightningcss-linux-x64-musl@1.30.1", "", { "os": "linux", "cpu": "x64" }, "sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ=="], + + "lightningcss-win32-arm64-msvc": ["lightningcss-win32-arm64-msvc@1.30.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA=="], + + "lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.30.1", "", { "os": "win32", "cpu": "x64" }, "sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg=="], + + "lilconfig": ["lilconfig@2.1.0", "", {}, "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ=="], + + "lint-staged": ["lint-staged@16.2.7", "", { "dependencies": { "commander": "^14.0.2", "listr2": "^9.0.5", "micromatch": "^4.0.8", "nano-spawn": "^2.0.0", "pidtree": "^0.6.0", "string-argv": "^0.3.2", "yaml": "^2.8.1" }, "bin": { "lint-staged": "bin/lint-staged.js" } }, "sha512-lDIj4RnYmK7/kXMya+qJsmkRFkGolciXjrsZ6PC25GdTfWOAWetR0ZbsNXRAj1EHHImRSalc+whZFg56F5DVow=="], + + "listr2": ["listr2@9.0.5", "", { "dependencies": { "cli-truncate": "^5.0.0", "colorette": "^2.0.20", "eventemitter3": "^5.0.1", "log-update": "^6.1.0", "rfdc": "^1.4.1", "wrap-ansi": "^9.0.0" } }, "sha512-ME4Fb83LgEgwNw96RKNvKV4VTLuXfoKudAmm2lP8Kk87KaMK0/Xrx/aAkMWmT8mDb+3MlFDspfbCs7adjRxA2g=="], + + "locate-character": ["locate-character@3.0.0", "", {}, "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA=="], + + "locate-path": ["locate-path@6.0.0", "", { "dependencies": { "p-locate": "^5.0.0" } }, "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="], + + "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="], + + "log-update": ["log-update@6.1.0", "", { "dependencies": { "ansi-escapes": "^7.0.0", "cli-cursor": "^5.0.0", "slice-ansi": "^7.1.0", "strip-ansi": "^7.1.0", "wrap-ansi": "^9.0.0" } }, "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w=="], + + "magic-string": ["magic-string@0.30.17", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0" } }, "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA=="], + + "math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="], + + "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="], + + "micro-ftch": ["micro-ftch@0.3.1", "", {}, "sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg=="], + + "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], + + "mime": ["mime@3.0.0", "", { "bin": "cli.js" }, "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A=="], + + "mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], + + "mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], + + "mimic-function": ["mimic-function@5.0.1", "", {}, "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA=="], + + "miniflare": ["miniflare@4.20250803.0", "", { "dependencies": { "@cspotcode/source-map-support": "0.8.1", "acorn": "8.14.0", "acorn-walk": "8.3.2", "exit-hook": "2.2.1", "glob-to-regexp": "0.4.1", "sharp": "^0.33.5", "stoppable": "1.1.0", "undici": "^7.10.0", "workerd": "1.20250803.0", "ws": "8.18.0", "youch": "4.1.0-beta.10", "zod": "3.22.3" }, "bin": "bootstrap.js" }, "sha512-1tmCLfmMw0SqRBF9PPII9CVLQRzOrO7uIBmSng8BMSmtgs2kos7OeoM0sg6KbR9FrvP/zAniLyZuCAMAjuu4fQ=="], + + "minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], + + "minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="], + + "minizlib": ["minizlib@3.0.2", "", { "dependencies": { "minipass": "^7.1.2" } }, "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA=="], + + "mipd": ["mipd@0.0.7", "", { "peerDependencies": { "typescript": ">=5.0.4" }, "optionalPeers": ["typescript"] }, "sha512-aAPZPNDQ3uMTdKbuO2YmAw2TxLHO0moa4YKAyETM/DTj5FloZo+a+8tU+iv4GmW+sOxKLSRwcSFuczk+Cpt6fg=="], + + "mkdirp": ["mkdirp@3.0.1", "", { "bin": "dist/cjs/src/bin.js" }, "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg=="], + + "mri": ["mri@1.2.0", "", {}, "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA=="], + + "mrmime": ["mrmime@2.0.1", "", {}, "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ=="], + + "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + + "nano-spawn": ["nano-spawn@2.0.0", "", {}, "sha512-tacvGzUY5o2D8CBh2rrwxyNojUsZNU2zjNTzKQrkgGJQTbGAfArVWXSKMBokBeeg6C7OLRGUEyoFlYbfeWQIqw=="], + + "nanoid": ["nanoid@3.3.11", "", { "bin": "bin/nanoid.cjs" }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], + + "natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="], + + "node-fetch": ["node-fetch@2.7.0", "", { "dependencies": { "whatwg-url": "^5.0.0" }, "peerDependencies": { "encoding": "^0.1.0" }, "optionalPeers": ["encoding"] }, "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A=="], + + "node-gyp-build": ["node-gyp-build@4.8.4", "", { "bin": { "node-gyp-build": "bin.js", "node-gyp-build-optional": "optional.js", "node-gyp-build-test": "build-test.js" } }, "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ=="], + + "obj-multiplex": ["obj-multiplex@1.0.0", "", { "dependencies": { "end-of-stream": "^1.4.0", "once": "^1.4.0", "readable-stream": "^2.3.3" } }, "sha512-0GNJAOsHoBHeNTvl5Vt6IWnpUEcc3uSRxzBri7EDyIcMgYvnY2JL2qdeV5zTMjWQX5OHcD5amcW2HFfDh0gjIA=="], + + "ohash": ["ohash@2.0.11", "", {}, "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ=="], + + "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="], + + "onetime": ["onetime@7.0.0", "", { "dependencies": { "mimic-function": "^5.0.0" } }, "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ=="], + + "openapi-fetch": ["openapi-fetch@0.13.8", "", { "dependencies": { "openapi-typescript-helpers": "^0.0.15" } }, "sha512-yJ4QKRyNxE44baQ9mY5+r/kAzZ8yXMemtNAOFwOzRXJscdjSxxzWSNlyBAr+o5JjkUw9Lc3W7OIoca0cY3PYnQ=="], + + "openapi-typescript-helpers": ["openapi-typescript-helpers@0.0.15", "", {}, "sha512-opyTPaunsklCBpTK8JGef6mfPhLSnyy5a0IN9vKtx3+4aExf+KxEqYwIy3hqkedXIB97u357uLMJsOnm3GVjsw=="], + + "optionator": ["optionator@0.9.4", "", { "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", "word-wrap": "^1.2.5" } }, "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g=="], + + "ox": ["ox@0.11.3", "", { "dependencies": { "@adraffy/ens-normalize": "^1.11.0", "@noble/ciphers": "^1.3.0", "@noble/curves": "1.9.1", "@noble/hashes": "^1.8.0", "@scure/bip32": "^1.7.0", "@scure/bip39": "^1.6.0", "abitype": "^1.2.3", "eventemitter3": "5.0.1" }, "peerDependencies": { "typescript": ">=5.4.0" } }, "sha512-1bWYGk/xZel3xro3l8WGg6eq4YEKlaqvyMtVhfMFpbJzK2F6rj4EDRtqDCWVEJMkzcmEi9uW2QxsqELokOlarw=="], + + "p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="], + + "p-locate": ["p-locate@5.0.0", "", { "dependencies": { "p-limit": "^3.0.2" } }, "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="], + + "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], + + "path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="], + + "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], + + "path-to-regexp": ["path-to-regexp@6.3.0", "", {}, "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ=="], + + "pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], + + "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], + + "picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], + + "pidtree": ["pidtree@0.6.0", "", { "bin": { "pidtree": "bin/pidtree.js" } }, "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g=="], + + "playwright": ["playwright@1.58.2", "", { "dependencies": { "playwright-core": "1.58.2" }, "optionalDependencies": { "fsevents": "2.3.2" }, "bin": { "playwright": "cli.js" } }, "sha512-vA30H8Nvkq/cPBnNw4Q8TWz1EJyqgpuinBcHET0YVJVFldr8JDNiU9LaWAE1KqSkRYazuaBhTpB5ZzShOezQ6A=="], + + "playwright-core": ["playwright-core@1.58.2", "", { "bin": { "playwright-core": "cli.js" } }, "sha512-yZkEtftgwS8CsfYo7nm0KE8jsvm6i/PTgVtB8DL726wNf6H2IMsDuxCpJj59KDaxCtSnrWan2AeDqM7JBaultg=="], + + "pony-cause": ["pony-cause@2.1.11", "", {}, "sha512-M7LhCsdNbNgiLYiP4WjsfLUuFmCfnjdF6jKe2R9NKl4WFN+HZPGHJZ9lnLP7f9ZnKe3U9nuWD0szirmj+migUg=="], + + "possible-typed-array-names": ["possible-typed-array-names@1.1.0", "", {}, "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg=="], + + "postcss": ["postcss@8.5.6", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg=="], + + "postcss-load-config": ["postcss-load-config@3.1.4", "", { "dependencies": { "lilconfig": "^2.0.5", "yaml": "^1.10.2" }, "peerDependencies": { "postcss": ">=8.0.9", "ts-node": ">=9.0.0" }, "optionalPeers": ["ts-node"] }, "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg=="], + + "postcss-safe-parser": ["postcss-safe-parser@7.0.1", "", { "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A=="], + + "postcss-scss": ["postcss-scss@4.0.9", "", { "peerDependencies": { "postcss": "^8.4.29" } }, "sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A=="], + + "postcss-selector-parser": ["postcss-selector-parser@7.1.0", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA=="], + + "prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="], + + "prettier": ["prettier@3.6.2", "", { "bin": "bin/prettier.cjs" }, "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ=="], + + "prettier-plugin-svelte": ["prettier-plugin-svelte@3.4.0", "", { "peerDependencies": { "prettier": "^3.0.0", "svelte": "^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0" } }, "sha512-pn1ra/0mPObzqoIQn/vUTR3ZZI6UuZ0sHqMK5x2jMLGrs53h0sXhkVuDcrlssHwIMk7FYrMjHBPoUSyyEEDlBQ=="], + + "prettier-plugin-tailwindcss": ["prettier-plugin-tailwindcss@0.6.14", "", { "peerDependencies": { "@ianvs/prettier-plugin-sort-imports": "*", "@prettier/plugin-hermes": "*", "@prettier/plugin-oxc": "*", "@prettier/plugin-pug": "*", "@shopify/prettier-plugin-liquid": "*", "@trivago/prettier-plugin-sort-imports": "*", "@zackad/prettier-plugin-twig": "*", "prettier": "^3.0", "prettier-plugin-astro": "*", "prettier-plugin-css-order": "*", "prettier-plugin-import-sort": "*", "prettier-plugin-jsdoc": "*", "prettier-plugin-marko": "*", "prettier-plugin-multiline-arrays": "*", "prettier-plugin-organize-attributes": "*", "prettier-plugin-organize-imports": "*", "prettier-plugin-sort-imports": "*", "prettier-plugin-style-order": "*", "prettier-plugin-svelte": "*" }, "optionalPeers": ["@ianvs/prettier-plugin-sort-imports", "@prettier/plugin-hermes", "@prettier/plugin-oxc", "@prettier/plugin-pug", "@shopify/prettier-plugin-liquid", "@trivago/prettier-plugin-sort-imports", "@zackad/prettier-plugin-twig", "prettier-plugin-astro", "prettier-plugin-css-order", "prettier-plugin-import-sort", "prettier-plugin-jsdoc", "prettier-plugin-marko", "prettier-plugin-multiline-arrays", "prettier-plugin-organize-attributes", "prettier-plugin-organize-imports", "prettier-plugin-sort-imports", "prettier-plugin-style-order"] }, "sha512-pi2e/+ZygeIqntN+vC573BcW5Cve8zUB0SSAGxqpB4f96boZF4M3phPVoOFCeypwkpRYdi7+jQ5YJJUwrkGUAg=="], + + "process-nextick-args": ["process-nextick-args@2.0.1", "", {}, "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="], + + "proxy-from-env": ["proxy-from-env@1.1.0", "", {}, "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="], + + "pump": ["pump@3.0.3", "", { "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA=="], + + "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="], + + "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="], + + "react": ["react@19.2.4", "", {}, "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ=="], + + "readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], + + "readdirp": ["readdirp@4.1.2", "", {}, "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg=="], + + "regexparam": ["regexparam@3.0.0", "", {}, "sha512-RSYAtP31mvYLkAHrOlh25pCNQ5hWnT106VukGaaFfuJrZFkGRX5GhUAdPqpSDXxOhA2c4akmRuplv1mRqnBn6Q=="], + + "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], + + "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="], + + "restore-cursor": ["restore-cursor@5.1.0", "", { "dependencies": { "onetime": "^7.0.0", "signal-exit": "^4.1.0" } }, "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA=="], + + "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="], + + "rfdc": ["rfdc@1.4.1", "", {}, "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA=="], + + "rollup": ["rollup@4.46.2", "", { "dependencies": { "@types/estree": "1.0.8" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.46.2", "@rollup/rollup-android-arm64": "4.46.2", "@rollup/rollup-darwin-arm64": "4.46.2", "@rollup/rollup-darwin-x64": "4.46.2", "@rollup/rollup-freebsd-arm64": "4.46.2", "@rollup/rollup-freebsd-x64": "4.46.2", "@rollup/rollup-linux-arm-gnueabihf": "4.46.2", "@rollup/rollup-linux-arm-musleabihf": "4.46.2", "@rollup/rollup-linux-arm64-gnu": "4.46.2", "@rollup/rollup-linux-arm64-musl": "4.46.2", "@rollup/rollup-linux-loongarch64-gnu": "4.46.2", "@rollup/rollup-linux-ppc64-gnu": "4.46.2", "@rollup/rollup-linux-riscv64-gnu": "4.46.2", "@rollup/rollup-linux-riscv64-musl": "4.46.2", "@rollup/rollup-linux-s390x-gnu": "4.46.2", "@rollup/rollup-linux-x64-gnu": "4.46.2", "@rollup/rollup-linux-x64-musl": "4.46.2", "@rollup/rollup-win32-arm64-msvc": "4.46.2", "@rollup/rollup-win32-ia32-msvc": "4.46.2", "@rollup/rollup-win32-x64-msvc": "4.46.2", "fsevents": "~2.3.2" }, "bin": "dist/bin/rollup" }, "sha512-WMmLFI+Boh6xbop+OAGo9cQ3OgX9MIg7xOQjn+pTCwOkk+FNDAeAemXkJ3HzDJrVXleLOFVa1ipuc1AmEx1Dwg=="], + + "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], + + "rxjs": ["rxjs@7.8.2", "", { "dependencies": { "tslib": "^2.1.0" } }, "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA=="], + + "sade": ["sade@1.8.1", "", { "dependencies": { "mri": "^1.1.0" } }, "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A=="], + + "safe-buffer": ["safe-buffer@5.1.2", "", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="], + + "safe-regex-test": ["safe-regex-test@1.1.0", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "is-regex": "^1.2.1" } }, "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw=="], + + "semver": ["semver@7.7.2", "", { "bin": "bin/semver.js" }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="], + + "set-cookie-parser": ["set-cookie-parser@2.7.1", "", {}, "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ=="], + + "set-function-length": ["set-function-length@1.2.2", "", { "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", "has-property-descriptors": "^1.0.2" } }, "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg=="], + + "sharp": ["sharp@0.33.5", "", { "dependencies": { "color": "^4.2.3", "detect-libc": "^2.0.3", "semver": "^7.6.3" }, "optionalDependencies": { "@img/sharp-darwin-arm64": "0.33.5", "@img/sharp-darwin-x64": "0.33.5", "@img/sharp-libvips-darwin-arm64": "1.0.4", "@img/sharp-libvips-darwin-x64": "1.0.4", "@img/sharp-libvips-linux-arm": "1.0.5", "@img/sharp-libvips-linux-arm64": "1.0.4", "@img/sharp-libvips-linux-s390x": "1.0.4", "@img/sharp-libvips-linux-x64": "1.0.4", "@img/sharp-libvips-linuxmusl-arm64": "1.0.4", "@img/sharp-libvips-linuxmusl-x64": "1.0.4", "@img/sharp-linux-arm": "0.33.5", "@img/sharp-linux-arm64": "0.33.5", "@img/sharp-linux-s390x": "0.33.5", "@img/sharp-linux-x64": "0.33.5", "@img/sharp-linuxmusl-arm64": "0.33.5", "@img/sharp-linuxmusl-x64": "0.33.5", "@img/sharp-wasm32": "0.33.5", "@img/sharp-win32-ia32": "0.33.5", "@img/sharp-win32-x64": "0.33.5" } }, "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw=="], + + "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], + + "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], + + "signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], + + "simple-swizzle": ["simple-swizzle@0.2.2", "", { "dependencies": { "is-arrayish": "^0.3.1" } }, "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg=="], + + "sirv": ["sirv@3.0.1", "", { "dependencies": { "@polka/url": "^1.0.0-next.24", "mrmime": "^2.0.0", "totalist": "^3.0.0" } }, "sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A=="], + + "slice-ansi": ["slice-ansi@7.1.2", "", { "dependencies": { "ansi-styles": "^6.2.1", "is-fullwidth-code-point": "^5.0.0" } }, "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w=="], + + "socket.io-client": ["socket.io-client@4.8.3", "", { "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.4.1", "engine.io-client": "~6.6.1", "socket.io-parser": "~4.2.4" } }, "sha512-uP0bpjWrjQmUt5DTHq9RuoCBdFJF10cdX9X+a368j/Ft0wmaVgxlrjvK3kjvgCODOMMOz9lcaRzxmso0bTWZ/g=="], + + "socket.io-parser": ["socket.io-parser@4.2.5", "", { "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.4.1" } }, "sha512-bPMmpy/5WWKHea5Y/jYAP6k74A+hvmRCQaJuJB6I/ML5JZq/KfNieUVo/3Mh7SAqn7TyFdIo6wqYHInG1MU1bQ=="], + + "source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + + "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], + + "source-map-support": ["source-map-support@0.5.21", "", { "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w=="], + + "stoppable": ["stoppable@1.1.0", "", {}, "sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw=="], + + "string-argv": ["string-argv@0.3.2", "", {}, "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q=="], + + "string-width": ["string-width@8.1.1", "", { "dependencies": { "get-east-asian-width": "^1.3.0", "strip-ansi": "^7.1.0" } }, "sha512-KpqHIdDL9KwYk22wEOg/VIqYbrnLeSApsKT/bSj6Ez7pn3CftUiLAv2Lccpq1ALcpLV9UX1Ppn92npZWu2w/aw=="], + + "string_decoder": ["string_decoder@1.3.0", "", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="], + + "strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], + + "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], + + "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "svelte": ["svelte@5.38.0", "", { "dependencies": { "@ampproject/remapping": "^2.3.0", "@jridgewell/sourcemap-codec": "^1.5.0", "@sveltejs/acorn-typescript": "^1.0.5", "@types/estree": "^1.0.5", "acorn": "^8.12.1", "aria-query": "^5.3.1", "axobject-query": "^4.1.0", "clsx": "^2.1.1", "esm-env": "^1.2.1", "esrap": "^2.1.0", "is-reference": "^3.0.3", "locate-character": "^3.0.0", "magic-string": "^0.30.11", "zimmerframe": "^1.1.2" } }, "sha512-cWF1Oc2IM/QbktdK89u5lt9MdKxRtQnRKnf2tq6KOhYuhLOd2hbMuTiJ+vWMzAeMDe81AzbCgLd4GVtOJ4fDRg=="], + + "svelte-check": ["svelte-check@4.3.1", "", { "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", "chokidar": "^4.0.1", "fdir": "^6.2.0", "picocolors": "^1.0.0", "sade": "^1.7.4" }, "peerDependencies": { "svelte": "^4.0.0 || ^5.0.0-next.0", "typescript": ">=5.0.0" }, "bin": "bin/svelte-check" }, "sha512-lkh8gff5gpHLjxIV+IaApMxQhTGnir2pNUAqcNgeKkvK5bT/30Ey/nzBxNLDlkztCH4dP7PixkMt9SWEKFPBWg=="], + + "svelte-eslint-parser": ["svelte-eslint-parser@1.3.1", "", { "dependencies": { "eslint-scope": "^8.2.0", "eslint-visitor-keys": "^4.0.0", "espree": "^10.0.0", "postcss": "^8.4.49", "postcss-scss": "^4.0.9", "postcss-selector-parser": "^7.0.0" }, "peerDependencies": { "svelte": "^3.37.0 || ^4.0.0 || ^5.0.0" } }, "sha512-0Iztj5vcOVOVkhy1pbo5uA9r+d3yaVoE5XPc9eABIWDOSJZ2mOsZ4D+t45rphWCOr0uMw3jtSG2fh2e7GvKnPg=="], + + "tailwindcss": ["tailwindcss@4.1.11", "", {}, "sha512-2E9TBm6MDD/xKYe+dvJZAmg3yxIEDNRc0jwlNyDg/4Fil2QcSLjFKGVff0lAf1jjeaArlG/M75Ey/EYr/OJtBA=="], + + "tapable": ["tapable@2.2.2", "", {}, "sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg=="], + + "tar": ["tar@7.4.3", "", { "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", "minipass": "^7.1.2", "minizlib": "^3.0.1", "mkdirp": "^3.0.1", "yallist": "^5.0.0" } }, "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw=="], + + "tinyglobby": ["tinyglobby@0.2.14", "", { "dependencies": { "fdir": "^6.4.4", "picomatch": "^4.0.2" } }, "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ=="], + + "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], + + "totalist": ["totalist@3.0.1", "", {}, "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ=="], + + "tr46": ["tr46@0.0.3", "", {}, "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="], + + "ts-api-utils": ["ts-api-utils@2.1.0", "", { "peerDependencies": { "typescript": ">=4.8.4" } }, "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ=="], + + "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="], + + "typescript": ["typescript@5.9.2", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A=="], + + "typescript-eslint": ["typescript-eslint@8.39.0", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.39.0", "@typescript-eslint/parser": "8.39.0", "@typescript-eslint/typescript-estree": "8.39.0", "@typescript-eslint/utils": "8.39.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-lH8FvtdtzcHJCkMOKnN73LIn6SLTpoojgJqDAxPm1jCR14eWSGPX8ul/gggBdPMk/d5+u9V854vTYQ8T5jF/1Q=="], + + "ufo": ["ufo@1.6.1", "", {}, "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA=="], + + "undici": ["undici@7.13.0", "", {}, "sha512-l+zSMssRqrzDcb3fjMkjjLGmuiiK2pMIcV++mJaAc9vhjSGpvM7h43QgP+OAMb1GImHmbPyG2tBXeuyG5iY4gA=="], + + "undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="], + + "unenv": ["unenv@2.0.0-rc.19", "", { "dependencies": { "defu": "^6.1.4", "exsolve": "^1.0.7", "ohash": "^2.0.11", "pathe": "^2.0.3", "ufo": "^1.6.1" } }, "sha512-t/OMHBNAkknVCI7bVB9OWjUUAwhVv9vsPIAGnNUxnu3FxPQN11rjh0sksLMzc3g7IlTgvHmOTl4JM7JHpcv5wA=="], + + "uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="], + + "use-sync-external-store": ["use-sync-external-store@1.4.0", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw=="], + + "utf-8-validate": ["utf-8-validate@5.0.10", "", { "dependencies": { "node-gyp-build": "^4.3.0" } }, "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ=="], + + "util": ["util@0.12.5", "", { "dependencies": { "inherits": "^2.0.3", "is-arguments": "^1.0.4", "is-generator-function": "^1.0.7", "is-typed-array": "^1.1.3", "which-typed-array": "^1.1.2" } }, "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA=="], + + "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="], + + "uuid": ["uuid@8.3.2", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="], + + "viem": ["viem@2.45.1", "", { "dependencies": { "@noble/curves": "1.9.1", "@noble/hashes": "1.8.0", "@scure/bip32": "1.7.0", "@scure/bip39": "1.6.0", "abitype": "1.2.3", "isows": "1.0.7", "ox": "0.11.3", "ws": "8.18.3" }, "peerDependencies": { "typescript": ">=5.0.4" } }, "sha512-LN6Pp7vSfv50LgwhkfSbIXftAM5J89lP9x8TeDa8QM7o41IxlHrDh0F9X+FfnCWtsz11pEVV5sn+yBUoOHNqYA=="], + + "vite": ["vite@7.1.1", "", { "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.6", "picomatch": "^4.0.3", "postcss": "^8.5.6", "rollup": "^4.43.0", "tinyglobby": "^0.2.14" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "jiti": ">=1.21.0", "less": "^4.0.0", "lightningcss": "^1.21.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "less", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx"], "bin": "bin/vite.js" }, "sha512-yJ+Mp7OyV+4S+afWo+QyoL9jFWD11QFH0i5i7JypnfTcA1rmgxCbiA8WwAICDEtZ1Z1hzrVhN8R8rGTqkTY8ZQ=="], + + "vitefu": ["vitefu@1.1.1", "", { "peerDependencies": { "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0" } }, "sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ=="], + + "wagmi": ["wagmi@3.5.0", "", { "dependencies": { "@wagmi/connectors": "7.2.1", "@wagmi/core": "3.4.0", "use-sync-external-store": "1.4.0" }, "peerDependencies": { "@tanstack/react-query": ">=5.0.0", "react": ">=18", "typescript": ">=5.7.3", "viem": "2.x" }, "optionalPeers": ["typescript"] }, "sha512-39uiY6Vkc28NiAHrxJzVTodoRgSVGG97EewwUxRf+jcFMTe8toAnaM8pJZA3Zw/6snMg4tSgWLJAtMnOacLe7w=="], + + "webextension-polyfill": ["webextension-polyfill@0.10.0", "", {}, "sha512-c5s35LgVa5tFaHhrZDnr3FpQpjj1BB+RXhLTYUxGqBVN460HkbM8TBtEqdXWbpTKfzwCcjAZVF7zXCYSKtcp9g=="], + + "webidl-conversions": ["webidl-conversions@3.0.1", "", {}, "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="], + + "whatwg-url": ["whatwg-url@5.0.0", "", { "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw=="], + + "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], + + "which-typed-array": ["which-typed-array@1.1.20", "", { "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.4", "for-each": "^0.3.5", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2" } }, "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg=="], + + "word-wrap": ["word-wrap@1.2.5", "", {}, "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA=="], + + "workerd": ["workerd@1.20250803.0", "", { "optionalDependencies": { "@cloudflare/workerd-darwin-64": "1.20250803.0", "@cloudflare/workerd-darwin-arm64": "1.20250803.0", "@cloudflare/workerd-linux-64": "1.20250803.0", "@cloudflare/workerd-linux-arm64": "1.20250803.0", "@cloudflare/workerd-windows-64": "1.20250803.0" }, "bin": "bin/workerd" }, "sha512-oYH29mE/wNolPc32NHHQbySaNorj6+KASUtOvQHySxB5mO1NWdGuNv49woxNCF5971UYceGQndY+OLT+24C3wQ=="], + + "worktop": ["worktop@0.8.0-next.18", "", { "dependencies": { "mrmime": "^2.0.0", "regexparam": "^3.0.0" } }, "sha512-+TvsA6VAVoMC3XDKR5MoC/qlLqDixEfOBysDEKnPIPou/NvoPWCAuXHXMsswwlvmEuvX56lQjvELLyLuzTKvRw=="], + + "wrangler": ["wrangler@4.28.1", "", { "dependencies": { "@cloudflare/kv-asset-handler": "0.4.0", "@cloudflare/unenv-preset": "2.6.0", "blake3-wasm": "2.1.5", "esbuild": "0.25.4", "miniflare": "4.20250803.0", "path-to-regexp": "6.3.0", "unenv": "2.0.0-rc.19", "workerd": "1.20250803.0" }, "optionalDependencies": { "fsevents": "~2.3.2" }, "peerDependencies": { "@cloudflare/workers-types": "^4.20250803.0" }, "bin": { "wrangler": "bin/wrangler.js", "wrangler2": "bin/wrangler.js" } }, "sha512-B1w6XS3o1q1Icyx1CyirY5GNyYhucd63Jqml/EYSbB5dgv0VT8ir7L8IkCdbICEa4yYTETIgvTTZqffM6tBulA=="], + + "wrap-ansi": ["wrap-ansi@9.0.2", "", { "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", "strip-ansi": "^7.1.0" } }, "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww=="], + + "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="], + + "ws": ["ws@8.18.3", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg=="], + + "xmlhttprequest-ssl": ["xmlhttprequest-ssl@2.1.2", "", {}, "sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ=="], + + "yallist": ["yallist@5.0.0", "", {}, "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw=="], + + "yaml": ["yaml@2.8.1", "", { "bin": "bin.mjs" }, "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw=="], + + "yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], + + "youch": ["youch@4.1.0-beta.10", "", { "dependencies": { "@poppinss/colors": "^4.1.5", "@poppinss/dumper": "^0.6.4", "@speed-highlight/core": "^1.2.7", "cookie": "^1.0.2", "youch-core": "^0.3.3" } }, "sha512-rLfVLB4FgQneDr0dv1oddCVZmKjcJ6yX6mS4pU82Mq/Dt9a3cLZQ62pDBL4AUO+uVrCvtWz3ZFUL2HFAFJ/BXQ=="], + + "youch-core": ["youch-core@0.3.3", "", { "dependencies": { "@poppinss/exception": "^1.2.2", "error-stack-parser-es": "^1.0.5" } }, "sha512-ho7XuGjLaJ2hWHoK8yFnsUGy2Y5uDpqSTq1FkHLK4/oqKtyUU1AFbOOxY4IpC9f0fTLjwYbslUz0Po5BpD1wrA=="], + + "zimmerframe": ["zimmerframe@1.1.2", "", {}, "sha512-rAbqEGa8ovJy4pyBxZM70hg4pE6gDgaQ0Sl9M3enG3I0d6H4XSAM3GeNGLKnsBpuijUow064sf7ww1nutC5/3w=="], + + "zod": ["zod@3.22.4", "", {}, "sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg=="], + + "zustand": ["zustand@5.0.0", "", { "peerDependencies": { "@types/react": ">=18.0.0", "immer": ">=9.0.6", "react": ">=18.0.0", "use-sync-external-store": ">=1.2.0" }, "optionalPeers": ["@types/react", "immer", "react", "use-sync-external-store"] }, "sha512-LE+VcmbartOPM+auOjCCLQOsQ05zUTp8RkgwRzefUk+2jISdMMFnxvyTjA4YNWr5ZGXYbVsEMZosttuxUBkojQ=="], + + "@cspotcode/source-map-support/@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.9", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" } }, "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ=="], + + "@esbuild-kit/core-utils/esbuild": ["esbuild@0.18.20", "", { "optionalDependencies": { "@esbuild/android-arm": "0.18.20", "@esbuild/android-arm64": "0.18.20", "@esbuild/android-x64": "0.18.20", "@esbuild/darwin-arm64": "0.18.20", "@esbuild/darwin-x64": "0.18.20", "@esbuild/freebsd-arm64": "0.18.20", "@esbuild/freebsd-x64": "0.18.20", "@esbuild/linux-arm": "0.18.20", "@esbuild/linux-arm64": "0.18.20", "@esbuild/linux-ia32": "0.18.20", "@esbuild/linux-loong64": "0.18.20", "@esbuild/linux-mips64el": "0.18.20", "@esbuild/linux-ppc64": "0.18.20", "@esbuild/linux-riscv64": "0.18.20", "@esbuild/linux-s390x": "0.18.20", "@esbuild/linux-x64": "0.18.20", "@esbuild/netbsd-x64": "0.18.20", "@esbuild/openbsd-x64": "0.18.20", "@esbuild/sunos-x64": "0.18.20", "@esbuild/win32-arm64": "0.18.20", "@esbuild/win32-ia32": "0.18.20", "@esbuild/win32-x64": "0.18.20" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA=="], + + "@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], + + "@eslint/eslintrc/globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="], + + "@humanfs/node/@humanwhocodes/retry": ["@humanwhocodes/retry@0.3.1", "", {}, "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA=="], + + "@metamask/rpc-errors/@metamask/utils": ["@metamask/utils@9.3.0", "", { "dependencies": { "@ethereumjs/tx": "^4.2.0", "@metamask/superstruct": "^3.1.0", "@noble/hashes": "^1.3.1", "@scure/base": "^1.1.3", "@types/debug": "^4.1.7", "debug": "^4.3.4", "pony-cause": "^2.1.10", "semver": "^7.5.4", "uuid": "^9.0.1" } }, "sha512-w8CVbdkDrVXFJbfBSlDfafDR6BAkpDmv1bC1UJVCoVny5tW2RKAdn9i68Xf7asYT4TnUhl/hN4zfUiKQq9II4g=="], + + "@metamask/sdk/debug": ["debug@4.3.4", "", { "dependencies": { "ms": "2.1.2" } }, "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ=="], + + "@metamask/sdk-communication-layer/debug": ["debug@4.3.4", "", { "dependencies": { "ms": "2.1.2" } }, "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ=="], + + "@metamask/utils/uuid": ["uuid@9.0.1", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA=="], + + "@poppinss/dumper/supports-color": ["supports-color@10.1.0", "", {}, "sha512-GBuewsPrhJPftT+fqDa9oI/zc5HNsG9nREqwzoSFDOIqf0NggOZbHQj2TE1P1CDJK8ZogFnlZY9hWoUiur7I/A=="], + + "@scure/bip32/@noble/curves": ["@noble/curves@1.9.6", "", { "dependencies": { "@noble/hashes": "1.8.0" } }, "sha512-GIKz/j99FRthB8icyJQA51E8Uk5hXmdyThjgQXRKiv9h0zeRlzSCLIzFw6K1LotZ3XuB7yzlf76qk7uBmTdFqA=="], + + "@typescript-eslint/eslint-plugin/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], + + "@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], + + "eciesjs/@noble/curves": ["@noble/curves@1.9.7", "", { "dependencies": { "@noble/hashes": "1.8.0" } }, "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw=="], + + "ethereum-cryptography/@noble/curves": ["@noble/curves@1.4.2", "", { "dependencies": { "@noble/hashes": "1.4.0" } }, "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw=="], + + "ethereum-cryptography/@noble/hashes": ["@noble/hashes@1.4.0", "", {}, "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg=="], + + "ethereum-cryptography/@scure/bip32": ["@scure/bip32@1.4.0", "", { "dependencies": { "@noble/curves": "~1.4.0", "@noble/hashes": "~1.4.0", "@scure/base": "~1.1.6" } }, "sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg=="], + + "ethereum-cryptography/@scure/bip39": ["@scure/bip39@1.3.0", "", { "dependencies": { "@noble/hashes": "~1.4.0", "@scure/base": "~1.1.6" } }, "sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ=="], + + "fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], + + "micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + + "miniflare/acorn": ["acorn@8.14.0", "", { "bin": "bin/acorn" }, "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA=="], + + "miniflare/ws": ["ws@8.18.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw=="], + + "miniflare/zod": ["zod@3.22.3", "", {}, "sha512-EjIevzuJRiRPbVH4mGc8nApb/lVLKVpmUhAaR5R5doKGfAnGJ6Gr3CViAVjP+4FWSxCsybeWQdcgCtbX+7oZug=="], + + "obj-multiplex/readable-stream": ["readable-stream@2.3.8", "", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="], + + "playwright/fsevents": ["fsevents@2.3.2", "", { "os": "darwin" }, "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA=="], + + "postcss-load-config/yaml": ["yaml@1.10.2", "", {}, "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg=="], + + "slice-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + + "string_decoder/safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], + + "wrangler/esbuild": ["esbuild@0.25.4", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.4", "@esbuild/android-arm": "0.25.4", "@esbuild/android-arm64": "0.25.4", "@esbuild/android-x64": "0.25.4", "@esbuild/darwin-arm64": "0.25.4", "@esbuild/darwin-x64": "0.25.4", "@esbuild/freebsd-arm64": "0.25.4", "@esbuild/freebsd-x64": "0.25.4", "@esbuild/linux-arm": "0.25.4", "@esbuild/linux-arm64": "0.25.4", "@esbuild/linux-ia32": "0.25.4", "@esbuild/linux-loong64": "0.25.4", "@esbuild/linux-mips64el": "0.25.4", "@esbuild/linux-ppc64": "0.25.4", "@esbuild/linux-riscv64": "0.25.4", "@esbuild/linux-s390x": "0.25.4", "@esbuild/linux-x64": "0.25.4", "@esbuild/netbsd-arm64": "0.25.4", "@esbuild/netbsd-x64": "0.25.4", "@esbuild/openbsd-arm64": "0.25.4", "@esbuild/openbsd-x64": "0.25.4", "@esbuild/sunos-x64": "0.25.4", "@esbuild/win32-arm64": "0.25.4", "@esbuild/win32-ia32": "0.25.4", "@esbuild/win32-x64": "0.25.4" }, "bin": "bin/esbuild" }, "sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q=="], + + "wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + + "wrap-ansi/string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="], + + "youch/cookie": ["cookie@1.0.2", "", {}, "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.18.20", "", { "os": "android", "cpu": "arm" }, "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.18.20", "", { "os": "android", "cpu": "arm64" }, "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.18.20", "", { "os": "android", "cpu": "x64" }, "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.18.20", "", { "os": "darwin", "cpu": "arm64" }, "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.18.20", "", { "os": "darwin", "cpu": "x64" }, "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.18.20", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.18.20", "", { "os": "freebsd", "cpu": "x64" }, "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.18.20", "", { "os": "linux", "cpu": "arm" }, "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.18.20", "", { "os": "linux", "cpu": "arm64" }, "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.18.20", "", { "os": "linux", "cpu": "ia32" }, "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.18.20", "", { "os": "linux", "cpu": "none" }, "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.18.20", "", { "os": "linux", "cpu": "none" }, "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.18.20", "", { "os": "linux", "cpu": "ppc64" }, "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.18.20", "", { "os": "linux", "cpu": "none" }, "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.18.20", "", { "os": "linux", "cpu": "s390x" }, "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.18.20", "", { "os": "linux", "cpu": "x64" }, "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.18.20", "", { "os": "none", "cpu": "x64" }, "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.18.20", "", { "os": "openbsd", "cpu": "x64" }, "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.18.20", "", { "os": "sunos", "cpu": "x64" }, "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.18.20", "", { "os": "win32", "cpu": "arm64" }, "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.18.20", "", { "os": "win32", "cpu": "ia32" }, "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.18.20", "", { "os": "win32", "cpu": "x64" }, "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ=="], + + "@metamask/rpc-errors/@metamask/utils/uuid": ["uuid@9.0.1", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA=="], + + "@metamask/sdk-communication-layer/debug/ms": ["ms@2.1.2", "", {}, "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="], + + "@metamask/sdk/debug/ms": ["ms@2.1.2", "", {}, "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="], + + "@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], + + "ethereum-cryptography/@scure/bip32/@scure/base": ["@scure/base@1.1.9", "", {}, "sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg=="], + + "ethereum-cryptography/@scure/bip39/@scure/base": ["@scure/base@1.1.9", "", {}, "sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg=="], + + "obj-multiplex/readable-stream/string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="], + + "wrangler/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.4", "", { "os": "aix", "cpu": "ppc64" }, "sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q=="], + + "wrangler/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.25.4", "", { "os": "android", "cpu": "arm" }, "sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ=="], + + "wrangler/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.4", "", { "os": "android", "cpu": "arm64" }, "sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A=="], + + "wrangler/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.25.4", "", { "os": "android", "cpu": "x64" }, "sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ=="], + + "wrangler/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g=="], + + "wrangler/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A=="], + + "wrangler/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.4", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ=="], + + "wrangler/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.4", "", { "os": "freebsd", "cpu": "x64" }, "sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ=="], + + "wrangler/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.4", "", { "os": "linux", "cpu": "arm" }, "sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ=="], + + "wrangler/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ=="], + + "wrangler/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.4", "", { "os": "linux", "cpu": "ia32" }, "sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ=="], + + "wrangler/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.4", "", { "os": "linux", "cpu": "none" }, "sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA=="], + + "wrangler/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.4", "", { "os": "linux", "cpu": "none" }, "sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg=="], + + "wrangler/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.4", "", { "os": "linux", "cpu": "ppc64" }, "sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag=="], + + "wrangler/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.4", "", { "os": "linux", "cpu": "none" }, "sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA=="], + + "wrangler/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.4", "", { "os": "linux", "cpu": "s390x" }, "sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g=="], + + "wrangler/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.4", "", { "os": "linux", "cpu": "x64" }, "sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA=="], + + "wrangler/esbuild/@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.25.4", "", { "os": "none", "cpu": "arm64" }, "sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ=="], + + "wrangler/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.4", "", { "os": "none", "cpu": "x64" }, "sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw=="], + + "wrangler/esbuild/@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.4", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A=="], + + "wrangler/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.4", "", { "os": "openbsd", "cpu": "x64" }, "sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw=="], + + "wrangler/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.4", "", { "os": "sunos", "cpu": "x64" }, "sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q=="], + + "wrangler/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.4", "", { "os": "win32", "cpu": "arm64" }, "sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ=="], + + "wrangler/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.4", "", { "os": "win32", "cpu": "ia32" }, "sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg=="], + + "wrangler/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.4", "", { "os": "win32", "cpu": "x64" }, "sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ=="], + } +} diff --git a/drizzle.config.ts b/app/issue-intent/drizzle.config.ts similarity index 100% rename from drizzle.config.ts rename to app/issue-intent/drizzle.config.ts diff --git a/drizzle/0000_absent_moonstone.sql b/app/issue-intent/drizzle/0000_absent_moonstone.sql similarity index 100% rename from drizzle/0000_absent_moonstone.sql rename to app/issue-intent/drizzle/0000_absent_moonstone.sql diff --git a/drizzle/0001_nifty_mephisto.sql b/app/issue-intent/drizzle/0001_nifty_mephisto.sql similarity index 100% rename from drizzle/0001_nifty_mephisto.sql rename to app/issue-intent/drizzle/0001_nifty_mephisto.sql diff --git a/drizzle/0002_expand_intent_created_at.sql b/app/issue-intent/drizzle/0002_expand_intent_created_at.sql similarity index 100% rename from drizzle/0002_expand_intent_created_at.sql rename to app/issue-intent/drizzle/0002_expand_intent_created_at.sql diff --git a/drizzle/0003_unique_intent_order_id.sql b/app/issue-intent/drizzle/0003_unique_intent_order_id.sql similarity index 100% rename from drizzle/0003_unique_intent_order_id.sql rename to app/issue-intent/drizzle/0003_unique_intent_order_id.sql diff --git a/drizzle/0004_store_transaction_receipts.sql b/app/issue-intent/drizzle/0004_store_transaction_receipts.sql similarity index 100% rename from drizzle/0004_store_transaction_receipts.sql rename to app/issue-intent/drizzle/0004_store_transaction_receipts.sql diff --git a/drizzle/meta/0000_snapshot.json b/app/issue-intent/drizzle/meta/0000_snapshot.json similarity index 100% rename from drizzle/meta/0000_snapshot.json rename to app/issue-intent/drizzle/meta/0000_snapshot.json diff --git a/drizzle/meta/0001_snapshot.json b/app/issue-intent/drizzle/meta/0001_snapshot.json similarity index 100% rename from drizzle/meta/0001_snapshot.json rename to app/issue-intent/drizzle/meta/0001_snapshot.json diff --git a/drizzle/meta/_journal.json b/app/issue-intent/drizzle/meta/_journal.json similarity index 100% rename from drizzle/meta/_journal.json rename to app/issue-intent/drizzle/meta/_journal.json diff --git a/eslint.config.js b/app/issue-intent/eslint.config.js similarity index 100% rename from eslint.config.js rename to app/issue-intent/eslint.config.js diff --git a/app/issue-intent/package.json b/app/issue-intent/package.json new file mode 100644 index 0000000..2368ea2 --- /dev/null +++ b/app/issue-intent/package.json @@ -0,0 +1,66 @@ +{ + "name": "cat-swapper", + "private": true, + "version": "0.0.1", + "type": "module", + "scripts": { + "dev": "vite dev", + "build": "vite build", + "preview": "vite preview", + "prepare": "husky", + "test": "bun run test:all", + "test:unit": "svelte-kit sync && bun test tests/unit tests/db.test.ts --coverage", + "test:e2e": "svelte-kit sync && bunx playwright test", + "test:e2e:headed": "svelte-kit sync && bunx playwright test --headed", + "test:e2e:ui": "svelte-kit sync && bunx playwright test --ui", + "test:all": "bun run test:unit && bun run test:e2e", + "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", + "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", + "format": "prettier --write .", + "lint": "prettier --check . && eslint .", + "migrate": "bunx drizzle-kit generate && bun run ./src/lib/compile-migrations.ts" + }, + "devDependencies": { + "@eslint/compat": "^1.2.5", + "@eslint/js": "^9.18.0", + "@sveltejs/kit": "^2.16.0", + "@sveltejs/vite-plugin-svelte": "^6.1.1", + "@tailwindcss/vite": "^4.0.0", + "@types/bun": "^1.3.8", + "@playwright/test": "^1.55.0", + "drizzle-kit": "^0.31.9", + "dotenv": "^17.2.3", + "eslint": "^9.18.0", + "eslint-config-prettier": "^10.0.1", + "eslint-plugin-svelte": "^3.0.0", + "globals": "^16.0.0", + "husky": "^9.1.7", + "prettier": "^3.4.2", + "prettier-plugin-svelte": "^3.3.3", + "prettier-plugin-tailwindcss": "^0.6.11", + "svelte": "^5.0.0", + "svelte-check": "^4.0.0", + "tailwindcss": "^4.0.0", + "typescript": "^5.0.0", + "typescript-eslint": "^8.20.0", + "lint-staged": "^16.1.0", + "vite": "^7.1.1" + }, + "lint-staged": { + "*.{js,ts,svelte,css,md,json,html}": "prettier --write" + }, + "dependencies": { + "@lifi/lintent": "file:../../packages/lintent", + "@electric-sql/pglite": "^0.3.15", + "@metamask/sdk": "^0.34.0", + "@sveltejs/adapter-cloudflare": "^7.0.3", + "@wagmi/connectors": "^7.2.1", + "@wagmi/core": "^3.4.0", + "axios": "^1.9.0", + "base64-js": "^1.5.1", + "drizzle-orm": "^0.45.1", + "rxjs": "^7.8.2", + "viem": "~2.45.1", + "wagmi": "^3.5.0" + } +} diff --git a/playwright.config.ts b/app/issue-intent/playwright.config.ts similarity index 100% rename from playwright.config.ts rename to app/issue-intent/playwright.config.ts diff --git a/src/app.css b/app/issue-intent/src/app.css similarity index 100% rename from src/app.css rename to app/issue-intent/src/app.css diff --git a/src/app.d.ts b/app/issue-intent/src/app.d.ts similarity index 100% rename from src/app.d.ts rename to app/issue-intent/src/app.d.ts diff --git a/src/app.html b/app/issue-intent/src/app.html similarity index 100% rename from src/app.html rename to app/issue-intent/src/app.html diff --git a/src/favicon.png b/app/issue-intent/src/favicon.png similarity index 100% rename from src/favicon.png rename to app/issue-intent/src/favicon.png diff --git a/src/lib/abi/compact.ts b/app/issue-intent/src/lib/abi/compact.ts similarity index 100% rename from src/lib/abi/compact.ts rename to app/issue-intent/src/lib/abi/compact.ts diff --git a/src/lib/abi/erc20.ts b/app/issue-intent/src/lib/abi/erc20.ts similarity index 100% rename from src/lib/abi/erc20.ts rename to app/issue-intent/src/lib/abi/erc20.ts diff --git a/src/lib/abi/escrow.ts b/app/issue-intent/src/lib/abi/escrow.ts similarity index 100% rename from src/lib/abi/escrow.ts rename to app/issue-intent/src/lib/abi/escrow.ts diff --git a/src/lib/abi/multichain_compact.ts b/app/issue-intent/src/lib/abi/multichain_compact.ts similarity index 100% rename from src/lib/abi/multichain_compact.ts rename to app/issue-intent/src/lib/abi/multichain_compact.ts diff --git a/src/lib/abi/multichain_escrow.ts b/app/issue-intent/src/lib/abi/multichain_escrow.ts similarity index 100% rename from src/lib/abi/multichain_escrow.ts rename to app/issue-intent/src/lib/abi/multichain_escrow.ts diff --git a/src/lib/abi/outputsettler.ts b/app/issue-intent/src/lib/abi/outputsettler.ts similarity index 100% rename from src/lib/abi/outputsettler.ts rename to app/issue-intent/src/lib/abi/outputsettler.ts diff --git a/src/lib/abi/polymeroracle.ts b/app/issue-intent/src/lib/abi/polymeroracle.ts similarity index 100% rename from src/lib/abi/polymeroracle.ts rename to app/issue-intent/src/lib/abi/polymeroracle.ts diff --git a/src/lib/abi/settlercompact.ts b/app/issue-intent/src/lib/abi/settlercompact.ts similarity index 100% rename from src/lib/abi/settlercompact.ts rename to app/issue-intent/src/lib/abi/settlercompact.ts diff --git a/src/lib/abi/wormholeoracle.ts b/app/issue-intent/src/lib/abi/wormholeoracle.ts similarity index 100% rename from src/lib/abi/wormholeoracle.ts rename to app/issue-intent/src/lib/abi/wormholeoracle.ts diff --git a/src/lib/appTypes.ts b/app/issue-intent/src/lib/appTypes.ts similarity index 83% rename from src/lib/appTypes.ts rename to app/issue-intent/src/lib/appTypes.ts index 108d25e..a09d397 100644 --- a/src/lib/appTypes.ts +++ b/app/issue-intent/src/lib/appTypes.ts @@ -1,5 +1,5 @@ import type { Token, Verifier } from "./config"; -import type { CompactLock, EscrowLock } from "./core/types"; +import type { CompactLock, EscrowLock } from "@lifi/lintent/types"; export type AppTokenContext = { token: Token; diff --git a/src/lib/compile-migrations.ts b/app/issue-intent/src/lib/compile-migrations.ts similarity index 100% rename from src/lib/compile-migrations.ts rename to app/issue-intent/src/lib/compile-migrations.ts diff --git a/src/lib/components/AwaitButton.svelte b/app/issue-intent/src/lib/components/AwaitButton.svelte similarity index 100% rename from src/lib/components/AwaitButton.svelte rename to app/issue-intent/src/lib/components/AwaitButton.svelte diff --git a/src/lib/components/BalanceField.svelte b/app/issue-intent/src/lib/components/BalanceField.svelte similarity index 90% rename from src/lib/components/BalanceField.svelte rename to app/issue-intent/src/lib/components/BalanceField.svelte index d50a185..14cebc3 100644 --- a/src/lib/components/BalanceField.svelte +++ b/app/issue-intent/src/lib/components/BalanceField.svelte @@ -1,5 +1,5 @@
- {#if !inputSecurityCheck} + {#if !true} - - - {#if data.items.length === 0} -

No intents found.

- {:else} - - - - - - - - - - - - - {#each data.items as item} - - - - - - - - - {/each} - -
OrderStatusPathUserSolverUpdated
{item.orderId}{item.status}{item.sourceChain} to {item.destinationChain}{item.user ?? '-'}{item.solver ?? '-'}{item.updatedAt ?? '-'}
- {/if} - - {#if data.nextCursor} -

Next page

- {/if} - - - diff --git a/app/explorer/src/routes/api/intents/+server.ts b/app/explorer/src/routes/api/intents/+server.ts deleted file mode 100644 index 633c112..0000000 --- a/app/explorer/src/routes/api/intents/+server.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { getIntentService } from '$lib/server/intents/container'; -import { json } from '@sveltejs/kit'; -import type { RequestHandler } from './$types'; - -export const GET: RequestHandler = async ({ url }) => { - const service = getIntentService(); - - const data = await service.listIntents({ - cursor: url.searchParams.get('cursor') ?? undefined, - status: url.searchParams.get('status') ?? undefined, - user: url.searchParams.get('user') ?? undefined, - orderId: url.searchParams.get('orderId') ?? undefined, - catalystOrderId: url.searchParams.get('catalystOrderId') ?? undefined, - limit: Number(url.searchParams.get('limit') ?? '25') - }); - - return json(data); -}; diff --git a/app/explorer/src/routes/api/intents/[orderId]/+server.ts b/app/explorer/src/routes/api/intents/[orderId]/+server.ts deleted file mode 100644 index 2495597..0000000 --- a/app/explorer/src/routes/api/intents/[orderId]/+server.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { getIntentService } from '$lib/server/intents/container'; -import { error, json } from '@sveltejs/kit'; -import type { RequestHandler } from './$types'; - -export const GET: RequestHandler = async ({ params }) => { - const service = getIntentService(); - const detail = await service.getIntentDetail(params.orderId); - - if (!detail) { - throw error(404, 'Intent not found'); - } - - return json(detail); -}; diff --git a/app/explorer/src/routes/api/intents/search/+server.ts b/app/explorer/src/routes/api/intents/search/+server.ts deleted file mode 100644 index ba7593f..0000000 --- a/app/explorer/src/routes/api/intents/search/+server.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { getIntentService } from '$lib/server/intents/container'; -import { json } from '@sveltejs/kit'; -import type { RequestHandler } from './$types'; - -export const GET: RequestHandler = async ({ url }) => { - const term = url.searchParams.get('q') ?? ''; - const limit = Number(url.searchParams.get('limit') ?? '10'); - - const service = getIntentService(); - const data = await service.searchIntents(term, limit); - - return json(data); -}; diff --git a/app/explorer/src/routes/intent/[orderId]/+page.server.ts b/app/explorer/src/routes/intent/[orderId]/+page.server.ts deleted file mode 100644 index 1fc5d2c..0000000 --- a/app/explorer/src/routes/intent/[orderId]/+page.server.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { getIntentService } from '$lib/server/intents/container'; -import { error } from '@sveltejs/kit'; -import type { PageServerLoad } from './$types'; - -export const load: PageServerLoad = async ({ params }) => { - const service = getIntentService(); - const detail = await service.getIntentDetail(params.orderId); - - if (!detail) { - throw error(404, 'Intent not found'); - } - - return { detail }; -}; diff --git a/app/explorer/src/routes/intent/[orderId]/+page.svelte b/app/explorer/src/routes/intent/[orderId]/+page.svelte deleted file mode 100644 index ba95ac9..0000000 --- a/app/explorer/src/routes/intent/[orderId]/+page.svelte +++ /dev/null @@ -1,74 +0,0 @@ - - -
- Back to intents -

Intent {data.detail.orderId}

-

Status: {data.detail.status}

- -

Components

-
    -
  • Input settler: {data.detail.componentAddresses.inputSettler ?? '-'}
  • -
  • Input oracle: {data.detail.componentAddresses.inputOracle ?? '-'}
  • -
  • Output oracle: {data.detail.componentAddresses.outputOracle ?? '-'}
  • -
  • Output settler: {data.detail.componentAddresses.outputSettler ?? '-'}
  • -
- -

Timeline

- - - - - - - - - - {#each data.detail.timeline as event} - - - - - - {/each} - -
EventTimeTx
{event.label}{event.timestamp ?? '-'}{event.txHash ?? '-'}
- -
- Raw payload -
{JSON.stringify(data.detail.raw, null, 2)}
-
-
- - diff --git a/app/explorer/svelte.config.js b/app/explorer/svelte.config.js deleted file mode 100644 index b233db3..0000000 --- a/app/explorer/svelte.config.js +++ /dev/null @@ -1,12 +0,0 @@ -import adapter from '@sveltejs/adapter-node'; -import { vitePreprocess } from '@sveltejs/vite-plugin-svelte'; - -/** @type {import('@sveltejs/kit').Config} */ -const config = { - preprocess: vitePreprocess(), - kit: { - adapter: adapter() - } -}; - -export default config; diff --git a/app/explorer/tests/unit/domain/status.spec.ts b/app/explorer/tests/unit/domain/status.spec.ts deleted file mode 100644 index 48466da..0000000 --- a/app/explorer/tests/unit/domain/status.spec.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { describe, expect, it } from "bun:test"; -import { mapIntentApiStatus } from "$lib/domain/intents/status"; - -describe("mapIntentApiStatus", () => { - it("maps known intent-api statuses", () => { - expect(mapIntentApiStatus("Submitted")).toBe("created"); - expect(mapIntentApiStatus("Open")).toBe("opened"); - expect(mapIntentApiStatus("Delivered")).toBe("delivered"); - expect(mapIntentApiStatus("Settled")).toBe("finalised"); - }); - - it("returns error for unknown status", () => { - expect(mapIntentApiStatus("")).toBe("error"); - expect(mapIntentApiStatus("UNKNOWN")).toBe("error"); - }); -}); diff --git a/app/explorer/tests/unit/server/intent-api/schemas.spec.ts b/app/explorer/tests/unit/server/intent-api/schemas.spec.ts deleted file mode 100644 index d85fbc5..0000000 --- a/app/explorer/tests/unit/server/intent-api/schemas.spec.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { describe, expect, it } from "bun:test"; -import { listOrdersResponseSchema } from "../../../../src/lib/server/intent-api/schemas"; - -describe("listOrdersResponseSchema", () => { - it("accepts numeric timestamps and array-based input/output legs", () => { - const parsed = listOrdersResponseSchema.parse({ - data: [ - { - order: { - user: "0xabc", - inputs: [["0xTokenIn", 12345, 1]], - outputs: [["0xTokenOut", "67890", 8453]], - }, - meta: { - orderStatus: "Delivered", - submitTime: 1739880000, - }, - }, - ], - meta: { - total: 1, - limit: 50, - offset: 0, - }, - }); - - expect(parsed.data[0]?.meta?.submitTime).toBe("1739880000"); - expect(parsed.data[0]?.order?.inputs?.[0]?.token).toBe("0xTokenIn"); - expect(parsed.data[0]?.order?.inputs?.[0]?.amount).toBe("12345"); - expect(parsed.data[0]?.order?.inputs?.[0]?.chainId).toBe(1); - }); -}); diff --git a/app/explorer/tsconfig.json b/app/explorer/tsconfig.json deleted file mode 100644 index b9d033b..0000000 --- a/app/explorer/tsconfig.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "extends": "./.svelte-kit/tsconfig.json", - "compilerOptions": { - "allowJs": false, - "checkJs": false, - "esModuleInterop": true, - "forceConsistentCasingInFileNames": true, - "moduleResolution": "bundler", - "resolveJsonModule": true, - "skipLibCheck": true, - "strict": true, - "types": ["bun"] - } -} diff --git a/app/explorer/vite.config.ts b/app/explorer/vite.config.ts deleted file mode 100644 index 3406f32..0000000 --- a/app/explorer/vite.config.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { sveltekit } from '@sveltejs/kit/vite'; -import { defineConfig } from 'vite'; - -export default defineConfig({ - plugins: [sveltekit()] -}); diff --git a/app/issue-intent/.prettierrc b/app/issue-intent/.prettierrc deleted file mode 100644 index 1e5915a..0000000 --- a/app/issue-intent/.prettierrc +++ /dev/null @@ -1,15 +0,0 @@ -{ - "useTabs": true, - "singleQuote": false, - "trailingComma": "none", - "printWidth": 100, - "plugins": ["prettier-plugin-svelte", "prettier-plugin-tailwindcss"], - "overrides": [ - { - "files": "*.svelte", - "options": { - "parser": "svelte" - } - } - ] -} diff --git a/app/issue-intent/README.md b/app/issue-intent/README.md deleted file mode 100644 index 534955f..0000000 --- a/app/issue-intent/README.md +++ /dev/null @@ -1,53 +0,0 @@ -# LI.FI Intent Demo - -The LI.FI intent demo is hosted at lintent.org. It demonstrates the entire intent flow from resource lock mangement, intent issuance, and solving intents. - -## Project - -This project uses SvelteKit and `bun`. It is configured for a deployment to Cloudflare workers, to change the deployment target modify [/svelte.config.js](/svelte.config.js) with another [adapter](https://svelte.dev/docs/kit/adapters). - -### Development - -To start development: - -1. Copy `.env.example` to `.env`. -2. Then fill in the `env` variables by creating a [WalletConnect](https://walletconnect.com) project -3. Also create an [account](https://accounts.polymerlabs.org/) with Polymer to generation [Polymer](https://polymerlabs.org) API keys. -4. Install dependencies `bun install`. -5. Start `bun run dev`. - -### Testing - -The project now uses a two-layer automated test suite: - -1. Unit and integration tests with `bun test` -2. Browser UI-state tests with Playwright - -Run: - -- `bun run test:unit` for library/unit/integration tests with coverage output -- `bun run test:e2e` for live browser + chain escrow flow tests -- `bun run test:all` to run both - -For local Playwright setup: - -1. `bun install` -2. `bunx playwright install chromium` -3. Copy `.env.e2e.example` to `.env.e2e` and set `E2E_PRIVATE_KEY`. -4. Ensure the E2E wallet has mainnet gas + tiny USDC balances on Base and Arbitrum. -5. Start E2E with `bun run test:e2e`. -6. If `E2E_PRIVATE_KEY` is not defined, private-key E2E specs are skipped. - -## Structure - -Lintent is built around a single page [/src/routes/+page.svelte](/src/routes/+page.svelte). - -The app consists of a series of screens that are displayed in a scrollable container. Each screen can be found in [/src/lib/screens/](/src/lib/screens/). - -### Libraries - -Several helper classes that acts as wrappers for external endpoints can be found in [/src/lib/libraries/](/src/lib/libraries/). - -## License - -This project is licensed under the **[MIT License](/LICENSE)**. Any contributions to this repository is provided with a MIT License. diff --git a/app/issue-intent/_typos.toml b/app/issue-intent/_typos.toml deleted file mode 100644 index 70c933b..0000000 --- a/app/issue-intent/_typos.toml +++ /dev/null @@ -1,3 +0,0 @@ -[default.extend-words] -oif = "oif" -OIF = "OIF" \ No newline at end of file diff --git a/app/issue-intent/bun.lock b/app/issue-intent/bun.lock deleted file mode 100644 index 3ad56a6..0000000 --- a/app/issue-intent/bun.lock +++ /dev/null @@ -1,1221 +0,0 @@ -{ - "lockfileVersion": 1, - "configVersion": 0, - "workspaces": { - "": { - "name": "cat-swapper", - "dependencies": { - "@electric-sql/pglite": "^0.3.15", - "@metamask/sdk": "^0.34.0", - "@sveltejs/adapter-cloudflare": "^7.0.3", - "@wagmi/connectors": "^7.2.1", - "@wagmi/core": "^3.4.0", - "axios": "^1.9.0", - "base64-js": "^1.5.1", - "drizzle-orm": "^0.45.1", - "rxjs": "^7.8.2", - "viem": "~2.45.1", - "wagmi": "^3.5.0", - }, - "devDependencies": { - "@eslint/compat": "^1.2.5", - "@eslint/js": "^9.18.0", - "@playwright/test": "^1.55.0", - "@sveltejs/kit": "^2.16.0", - "@sveltejs/vite-plugin-svelte": "^6.1.1", - "@tailwindcss/vite": "^4.0.0", - "@types/bun": "^1.3.8", - "dotenv": "^17.2.3", - "drizzle-kit": "^0.31.9", - "eslint": "^9.18.0", - "eslint-config-prettier": "^10.0.1", - "eslint-plugin-svelte": "^3.0.0", - "globals": "^16.0.0", - "husky": "^9.1.7", - "lint-staged": "^16.1.0", - "prettier": "^3.4.2", - "prettier-plugin-svelte": "^3.3.3", - "prettier-plugin-tailwindcss": "^0.6.11", - "svelte": "^5.0.0", - "svelte-check": "^4.0.0", - "tailwindcss": "^4.0.0", - "typescript": "^5.0.0", - "typescript-eslint": "^8.20.0", - "vite": "^7.1.1", - }, - }, - }, - "packages": { - "@adraffy/ens-normalize": ["@adraffy/ens-normalize@1.11.0", "", {}, "sha512-/3DDPKHqqIqxUULp8yP4zODUY1i+2xvVWsv8A79xGWdCAG+8sb0hRh0Rk2QyOJUnnbyPUAZYcpBuRe3nS2OIUg=="], - - "@ampproject/remapping": ["@ampproject/remapping@2.3.0", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw=="], - - "@babel/runtime": ["@babel/runtime@7.28.6", "", {}, "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA=="], - - "@cloudflare/kv-asset-handler": ["@cloudflare/kv-asset-handler@0.4.0", "", { "dependencies": { "mime": "^3.0.0" } }, "sha512-+tv3z+SPp+gqTIcImN9o0hqE9xyfQjI1XD9pL6NuKjua9B1y7mNYv0S9cP+QEbA4ppVgGZEmKOvHX5G5Ei1CVA=="], - - "@cloudflare/unenv-preset": ["@cloudflare/unenv-preset@2.6.0", "", { "peerDependencies": { "unenv": "2.0.0-rc.19", "workerd": "^1.20250802.0" } }, "sha512-h7Txw0WbDuUbrvZwky6+x7ft+U/Gppfn/rWx6IdR+e9gjygozRJnV26Y2TOr3yrIFa6OsZqqR2lN+jWTrakHXg=="], - - "@cloudflare/workerd-darwin-64": ["@cloudflare/workerd-darwin-64@1.20250803.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-6QciMnJp1p3F1qUiN0LaLfmw7SuZA/gfUBOe8Ft81pw16JYZ3CyiqIKPJvc1SV8jgDx8r+gz/PRi1NwOMt329A=="], - - "@cloudflare/workerd-darwin-arm64": ["@cloudflare/workerd-darwin-arm64@1.20250803.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-DoIgghDowtqoNhL6OoN/F92SKtrk7mRQKc4YSs/Dst8IwFZq+pCShOlWfB0MXqHKPSoiz5xLSrUKR9H6gQMPvw=="], - - "@cloudflare/workerd-linux-64": ["@cloudflare/workerd-linux-64@1.20250803.0", "", { "os": "linux", "cpu": "x64" }, "sha512-mYdz4vNWX3+PoqRjssepVQqgh42IBiSrl+wb7vbh7VVWUVzBnQKtW3G+UFiBF62hohCLexGIEi7L0cFfRlcKSQ=="], - - "@cloudflare/workerd-linux-arm64": ["@cloudflare/workerd-linux-arm64@1.20250803.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-RmrtUYLRUg6djKU7Z6yebS6YGJVnaDVY6bbXca+2s26vw4ibJDOTPLuBHFQF62Grw3fAfsNbjQh5i14vG2mqUg=="], - - "@cloudflare/workerd-windows-64": ["@cloudflare/workerd-windows-64@1.20250803.0", "", { "os": "win32", "cpu": "x64" }, "sha512-uLV8gdudz36o9sUaAKbBxxTwZwLFz1KyW7QpBvOo4+r3Ib8yVKXGiySIMWGD7A0urSMrjf3e5LlLcJKgZUOjMA=="], - - "@cloudflare/workers-types": ["@cloudflare/workers-types@4.20250807.0", "", {}, "sha512-Zbrz9egAfwmlkUaZ1tQ+19pt5eomCJ57mAviT1HCsvnSFP1MoffMbYiU/xUomuekHtx0aVO4EacZwchCgjSvmw=="], - - "@cspotcode/source-map-support": ["@cspotcode/source-map-support@0.8.1", "", { "dependencies": { "@jridgewell/trace-mapping": "0.3.9" } }, "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw=="], - - "@drizzle-team/brocli": ["@drizzle-team/brocli@0.10.2", "", {}, "sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w=="], - - "@ecies/ciphers": ["@ecies/ciphers@0.2.5", "", { "peerDependencies": { "@noble/ciphers": "^1.0.0" } }, "sha512-GalEZH4JgOMHYYcYmVqnFirFsjZHeoGMDt9IxEnM9F7GRUUyUksJ7Ou53L83WHJq3RWKD3AcBpo0iQh0oMpf8A=="], - - "@electric-sql/pglite": ["@electric-sql/pglite@0.3.15", "", {}, "sha512-Cj++n1Mekf9ETfdc16TlDi+cDDQF0W7EcbyRHYOAeZdsAe8M/FJg18itDTSwyHfar2WIezawM9o0EKaRGVKygQ=="], - - "@emnapi/runtime": ["@emnapi/runtime@1.4.5", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-++LApOtY0pEEz1zrd9vy1/zXVaVJJ/EbAF3u0fXIzPJEDtnITsBGbbK0EkM72amhl/R5b+5xx0Y/QhcVOpuulg=="], - - "@esbuild-kit/core-utils": ["@esbuild-kit/core-utils@3.3.2", "", { "dependencies": { "esbuild": "~0.18.20", "source-map-support": "^0.5.21" } }, "sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ=="], - - "@esbuild-kit/esm-loader": ["@esbuild-kit/esm-loader@2.6.5", "", { "dependencies": { "@esbuild-kit/core-utils": "^3.3.2", "get-tsconfig": "^4.7.0" } }, "sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA=="], - - "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.8", "", { "os": "aix", "cpu": "ppc64" }, "sha512-urAvrUedIqEiFR3FYSLTWQgLu5tb+m0qZw0NBEasUeo6wuqatkMDaRT+1uABiGXEu5vqgPd7FGE1BhsAIy9QVA=="], - - "@esbuild/android-arm": ["@esbuild/android-arm@0.25.8", "", { "os": "android", "cpu": "arm" }, "sha512-RONsAvGCz5oWyePVnLdZY/HHwA++nxYWIX1atInlaW6SEkwq6XkP3+cb825EUcRs5Vss/lGh/2YxAb5xqc07Uw=="], - - "@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.8", "", { "os": "android", "cpu": "arm64" }, "sha512-OD3p7LYzWpLhZEyATcTSJ67qB5D+20vbtr6vHlHWSQYhKtzUYrETuWThmzFpZtFsBIxRvhO07+UgVA9m0i/O1w=="], - - "@esbuild/android-x64": ["@esbuild/android-x64@0.25.8", "", { "os": "android", "cpu": "x64" }, "sha512-yJAVPklM5+4+9dTeKwHOaA+LQkmrKFX96BM0A/2zQrbS6ENCmxc4OVoBs5dPkCCak2roAD+jKCdnmOqKszPkjA=="], - - "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.8", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Jw0mxgIaYX6R8ODrdkLLPwBqHTtYHJSmzzd+QeytSugzQ0Vg4c5rDky5VgkoowbZQahCbsv1rT1KW72MPIkevw=="], - - "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.8", "", { "os": "darwin", "cpu": "x64" }, "sha512-Vh2gLxxHnuoQ+GjPNvDSDRpoBCUzY4Pu0kBqMBDlK4fuWbKgGtmDIeEC081xi26PPjn+1tct+Bh8FjyLlw1Zlg=="], - - "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.8", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-YPJ7hDQ9DnNe5vxOm6jaie9QsTwcKedPvizTVlqWG9GBSq+BuyWEDazlGaDTC5NGU4QJd666V0yqCBL2oWKPfA=="], - - "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.8", "", { "os": "freebsd", "cpu": "x64" }, "sha512-MmaEXxQRdXNFsRN/KcIimLnSJrk2r5H8v+WVafRWz5xdSVmWLoITZQXcgehI2ZE6gioE6HirAEToM/RvFBeuhw=="], - - "@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.8", "", { "os": "linux", "cpu": "arm" }, "sha512-FuzEP9BixzZohl1kLf76KEVOsxtIBFwCaLupVuk4eFVnOZfU+Wsn+x5Ryam7nILV2pkq2TqQM9EZPsOBuMC+kg=="], - - "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.8", "", { "os": "linux", "cpu": "arm64" }, "sha512-WIgg00ARWv/uYLU7lsuDK00d/hHSfES5BzdWAdAig1ioV5kaFNrtK8EqGcUBJhYqotlUByUKz5Qo6u8tt7iD/w=="], - - "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.8", "", { "os": "linux", "cpu": "ia32" }, "sha512-A1D9YzRX1i+1AJZuFFUMP1E9fMaYY+GnSQil9Tlw05utlE86EKTUA7RjwHDkEitmLYiFsRd9HwKBPEftNdBfjg=="], - - "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.8", "", { "os": "linux", "cpu": "none" }, "sha512-O7k1J/dwHkY1RMVvglFHl1HzutGEFFZ3kNiDMSOyUrB7WcoHGf96Sh+64nTRT26l3GMbCW01Ekh/ThKM5iI7hQ=="], - - "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.8", "", { "os": "linux", "cpu": "none" }, "sha512-uv+dqfRazte3BzfMp8PAQXmdGHQt2oC/y2ovwpTteqrMx2lwaksiFZ/bdkXJC19ttTvNXBuWH53zy/aTj1FgGw=="], - - "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.8", "", { "os": "linux", "cpu": "ppc64" }, "sha512-GyG0KcMi1GBavP5JgAkkstMGyMholMDybAf8wF5A70CALlDM2p/f7YFE7H92eDeH/VBtFJA5MT4nRPDGg4JuzQ=="], - - "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.8", "", { "os": "linux", "cpu": "none" }, "sha512-rAqDYFv3yzMrq7GIcen3XP7TUEG/4LK86LUPMIz6RT8A6pRIDn0sDcvjudVZBiiTcZCY9y2SgYX2lgK3AF+1eg=="], - - "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.8", "", { "os": "linux", "cpu": "s390x" }, "sha512-Xutvh6VjlbcHpsIIbwY8GVRbwoviWT19tFhgdA7DlenLGC/mbc3lBoVb7jxj9Z+eyGqvcnSyIltYUrkKzWqSvg=="], - - "@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.8", "", { "os": "linux", "cpu": "x64" }, "sha512-ASFQhgY4ElXh3nDcOMTkQero4b1lgubskNlhIfJrsH5OKZXDpUAKBlNS0Kx81jwOBp+HCeZqmoJuihTv57/jvQ=="], - - "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.25.8", "", { "os": "none", "cpu": "arm64" }, "sha512-d1KfruIeohqAi6SA+gENMuObDbEjn22olAR7egqnkCD9DGBG0wsEARotkLgXDu6c4ncgWTZJtN5vcgxzWRMzcw=="], - - "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.8", "", { "os": "none", "cpu": "x64" }, "sha512-nVDCkrvx2ua+XQNyfrujIG38+YGyuy2Ru9kKVNyh5jAys6n+l44tTtToqHjino2My8VAY6Lw9H7RI73XFi66Cg=="], - - "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.8", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-j8HgrDuSJFAujkivSMSfPQSAa5Fxbvk4rgNAS5i3K+r8s1X0p1uOO2Hl2xNsGFppOeHOLAVgYwDVlmxhq5h+SQ=="], - - "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.8", "", { "os": "openbsd", "cpu": "x64" }, "sha512-1h8MUAwa0VhNCDp6Af0HToI2TJFAn1uqT9Al6DJVzdIBAd21m/G0Yfc77KDM3uF3T/YaOgQq3qTJHPbTOInaIQ=="], - - "@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.25.8", "", { "os": "none", "cpu": "arm64" }, "sha512-r2nVa5SIK9tSWd0kJd9HCffnDHKchTGikb//9c7HX+r+wHYCpQrSgxhlY6KWV1nFo1l4KFbsMlHk+L6fekLsUg=="], - - "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.8", "", { "os": "sunos", "cpu": "x64" }, "sha512-zUlaP2S12YhQ2UzUfcCuMDHQFJyKABkAjvO5YSndMiIkMimPmxA+BYSBikWgsRpvyxuRnow4nS5NPnf9fpv41w=="], - - "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.8", "", { "os": "win32", "cpu": "arm64" }, "sha512-YEGFFWESlPva8hGL+zvj2z/SaK+pH0SwOM0Nc/d+rVnW7GSTFlLBGzZkuSU9kFIGIo8q9X3ucpZhu8PDN5A2sQ=="], - - "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.8", "", { "os": "win32", "cpu": "ia32" }, "sha512-hiGgGC6KZ5LZz58OL/+qVVoZiuZlUYlYHNAmczOm7bs2oE1XriPFi5ZHHrS8ACpV5EjySrnoCKmcbQMN+ojnHg=="], - - "@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.8", "", { "os": "win32", "cpu": "x64" }, "sha512-cn3Yr7+OaaZq1c+2pe+8yxC8E144SReCQjN6/2ynubzYjvyqZjTXfQJpAcQpsdJq3My7XADANiYGHoFC69pLQw=="], - - "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.7.0", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw=="], - - "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.1", "", {}, "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ=="], - - "@eslint/compat": ["@eslint/compat@1.3.2", "", { "peerDependencies": { "eslint": "^8.40 || 9" } }, "sha512-jRNwzTbd6p2Rw4sZ1CgWRS8YMtqG15YyZf7zvb6gY2rB2u6n+2Z+ELW0GtL0fQgyl0pr4Y/BzBfng/BdsereRA=="], - - "@eslint/config-array": ["@eslint/config-array@0.21.0", "", { "dependencies": { "@eslint/object-schema": "^2.1.6", "debug": "^4.3.1", "minimatch": "^3.1.2" } }, "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ=="], - - "@eslint/config-helpers": ["@eslint/config-helpers@0.3.1", "", {}, "sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA=="], - - "@eslint/core": ["@eslint/core@0.15.2", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg=="], - - "@eslint/eslintrc": ["@eslint/eslintrc@3.3.1", "", { "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" } }, "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ=="], - - "@eslint/js": ["@eslint/js@9.32.0", "", {}, "sha512-BBpRFZK3eX6uMLKz8WxFOBIFFcGFJ/g8XuwjTHCqHROSIsopI+ddn/d5Cfh36+7+e5edVS8dbSHnBNhrLEX0zg=="], - - "@eslint/object-schema": ["@eslint/object-schema@2.1.6", "", {}, "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA=="], - - "@eslint/plugin-kit": ["@eslint/plugin-kit@0.3.5", "", { "dependencies": { "@eslint/core": "^0.15.2", "levn": "^0.4.1" } }, "sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w=="], - - "@ethereumjs/common": ["@ethereumjs/common@3.2.0", "", { "dependencies": { "@ethereumjs/util": "^8.1.0", "crc-32": "^1.2.0" } }, "sha512-pksvzI0VyLgmuEF2FA/JR/4/y6hcPq8OUail3/AvycBaW1d5VSauOZzqGvJ3RTmR4MU35lWE8KseKOsEhrFRBA=="], - - "@ethereumjs/rlp": ["@ethereumjs/rlp@4.0.1", "", { "bin": { "rlp": "bin/rlp" } }, "sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw=="], - - "@ethereumjs/tx": ["@ethereumjs/tx@4.2.0", "", { "dependencies": { "@ethereumjs/common": "^3.2.0", "@ethereumjs/rlp": "^4.0.1", "@ethereumjs/util": "^8.1.0", "ethereum-cryptography": "^2.0.0" } }, "sha512-1nc6VO4jtFd172BbSnTnDQVr9IYBFl1y4xPzZdtkrkKIncBCkdbgfdRV+MiTkJYAtTxvV12GRZLqBFT1PNK6Yw=="], - - "@ethereumjs/util": ["@ethereumjs/util@8.1.0", "", { "dependencies": { "@ethereumjs/rlp": "^4.0.1", "ethereum-cryptography": "^2.0.0", "micro-ftch": "^0.3.1" } }, "sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA=="], - - "@humanfs/core": ["@humanfs/core@0.19.1", "", {}, "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA=="], - - "@humanfs/node": ["@humanfs/node@0.16.6", "", { "dependencies": { "@humanfs/core": "^0.19.1", "@humanwhocodes/retry": "^0.3.0" } }, "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw=="], - - "@humanwhocodes/module-importer": ["@humanwhocodes/module-importer@1.0.1", "", {}, "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA=="], - - "@humanwhocodes/retry": ["@humanwhocodes/retry@0.4.3", "", {}, "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ=="], - - "@img/sharp-darwin-arm64": ["@img/sharp-darwin-arm64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-arm64": "1.0.4" }, "os": "darwin", "cpu": "arm64" }, "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ=="], - - "@img/sharp-darwin-x64": ["@img/sharp-darwin-x64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-x64": "1.0.4" }, "os": "darwin", "cpu": "x64" }, "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q=="], - - "@img/sharp-libvips-darwin-arm64": ["@img/sharp-libvips-darwin-arm64@1.0.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg=="], - - "@img/sharp-libvips-darwin-x64": ["@img/sharp-libvips-darwin-x64@1.0.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ=="], - - "@img/sharp-libvips-linux-arm": ["@img/sharp-libvips-linux-arm@1.0.5", "", { "os": "linux", "cpu": "arm" }, "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g=="], - - "@img/sharp-libvips-linux-arm64": ["@img/sharp-libvips-linux-arm64@1.0.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA=="], - - "@img/sharp-libvips-linux-s390x": ["@img/sharp-libvips-linux-s390x@1.0.4", "", { "os": "linux", "cpu": "s390x" }, "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA=="], - - "@img/sharp-libvips-linux-x64": ["@img/sharp-libvips-linux-x64@1.0.4", "", { "os": "linux", "cpu": "x64" }, "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw=="], - - "@img/sharp-libvips-linuxmusl-arm64": ["@img/sharp-libvips-linuxmusl-arm64@1.0.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA=="], - - "@img/sharp-libvips-linuxmusl-x64": ["@img/sharp-libvips-linuxmusl-x64@1.0.4", "", { "os": "linux", "cpu": "x64" }, "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw=="], - - "@img/sharp-linux-arm": ["@img/sharp-linux-arm@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm": "1.0.5" }, "os": "linux", "cpu": "arm" }, "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ=="], - - "@img/sharp-linux-arm64": ["@img/sharp-linux-arm64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm64": "1.0.4" }, "os": "linux", "cpu": "arm64" }, "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA=="], - - "@img/sharp-linux-s390x": ["@img/sharp-linux-s390x@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-s390x": "1.0.4" }, "os": "linux", "cpu": "s390x" }, "sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q=="], - - "@img/sharp-linux-x64": ["@img/sharp-linux-x64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-x64": "1.0.4" }, "os": "linux", "cpu": "x64" }, "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA=="], - - "@img/sharp-linuxmusl-arm64": ["@img/sharp-linuxmusl-arm64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-arm64": "1.0.4" }, "os": "linux", "cpu": "arm64" }, "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g=="], - - "@img/sharp-linuxmusl-x64": ["@img/sharp-linuxmusl-x64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-x64": "1.0.4" }, "os": "linux", "cpu": "x64" }, "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw=="], - - "@img/sharp-wasm32": ["@img/sharp-wasm32@0.33.5", "", { "dependencies": { "@emnapi/runtime": "^1.2.0" }, "cpu": "none" }, "sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg=="], - - "@img/sharp-win32-ia32": ["@img/sharp-win32-ia32@0.33.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ=="], - - "@img/sharp-win32-x64": ["@img/sharp-win32-x64@0.33.5", "", { "os": "win32", "cpu": "x64" }, "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg=="], - - "@isaacs/fs-minipass": ["@isaacs/fs-minipass@4.0.1", "", { "dependencies": { "minipass": "^7.0.4" } }, "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w=="], - - "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.12", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg=="], - - "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="], - - "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.4", "", {}, "sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw=="], - - "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.29", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ=="], - - "@metamask/json-rpc-engine": ["@metamask/json-rpc-engine@8.0.2", "", { "dependencies": { "@metamask/rpc-errors": "^6.2.1", "@metamask/safe-event-emitter": "^3.0.0", "@metamask/utils": "^8.3.0" } }, "sha512-IoQPmql8q7ABLruW7i4EYVHWUbF74yrp63bRuXV5Zf9BQwcn5H9Ww1eLtROYvI1bUXwOiHZ6qT5CWTrDc/t/AA=="], - - "@metamask/json-rpc-middleware-stream": ["@metamask/json-rpc-middleware-stream@7.0.2", "", { "dependencies": { "@metamask/json-rpc-engine": "^8.0.2", "@metamask/safe-event-emitter": "^3.0.0", "@metamask/utils": "^8.3.0", "readable-stream": "^3.6.2" } }, "sha512-yUdzsJK04Ev98Ck4D7lmRNQ8FPioXYhEUZOMS01LXW8qTvPGiRVXmVltj2p4wrLkh0vW7u6nv0mNl5xzC5Qmfg=="], - - "@metamask/object-multiplex": ["@metamask/object-multiplex@2.1.0", "", { "dependencies": { "once": "^1.4.0", "readable-stream": "^3.6.2" } }, "sha512-4vKIiv0DQxljcXwfpnbsXcfa5glMj5Zg9mqn4xpIWqkv6uJ2ma5/GtUfLFSxhlxnR8asRMv8dDmWya1Tc1sDFA=="], - - "@metamask/onboarding": ["@metamask/onboarding@1.0.1", "", { "dependencies": { "bowser": "^2.9.0" } }, "sha512-FqHhAsCI+Vacx2qa5mAFcWNSrTcVGMNjzxVgaX8ECSny/BJ9/vgXP9V7WF/8vb9DltPeQkxr+Fnfmm6GHfmdTQ=="], - - "@metamask/providers": ["@metamask/providers@16.1.0", "", { "dependencies": { "@metamask/json-rpc-engine": "^8.0.1", "@metamask/json-rpc-middleware-stream": "^7.0.1", "@metamask/object-multiplex": "^2.0.0", "@metamask/rpc-errors": "^6.2.1", "@metamask/safe-event-emitter": "^3.1.1", "@metamask/utils": "^8.3.0", "detect-browser": "^5.2.0", "extension-port-stream": "^3.0.0", "fast-deep-equal": "^3.1.3", "is-stream": "^2.0.0", "readable-stream": "^3.6.2", "webextension-polyfill": "^0.10.0" } }, "sha512-znVCvux30+3SaUwcUGaSf+pUckzT5ukPRpcBmy+muBLC0yaWnBcvDqGfcsw6CBIenUdFrVoAFa8B6jsuCY/a+g=="], - - "@metamask/rpc-errors": ["@metamask/rpc-errors@6.4.0", "", { "dependencies": { "@metamask/utils": "^9.0.0", "fast-safe-stringify": "^2.0.6" } }, "sha512-1ugFO1UoirU2esS3juZanS/Fo8C8XYocCuBpfZI5N7ECtoG+zu0wF+uWZASik6CkO6w9n/Iebt4iI4pT0vptpg=="], - - "@metamask/safe-event-emitter": ["@metamask/safe-event-emitter@3.1.2", "", {}, "sha512-5yb2gMI1BDm0JybZezeoX/3XhPDOtTbcFvpTXM9kxsoZjPZFh4XciqRbpD6N86HYZqWDhEaKUDuOyR0sQHEjMA=="], - - "@metamask/sdk": ["@metamask/sdk@0.34.0", "", { "dependencies": { "@babel/runtime": "^7.26.0", "@metamask/onboarding": "^1.0.1", "@metamask/providers": "16.1.0", "@metamask/sdk-analytics": "0.0.5", "@metamask/sdk-communication-layer": "0.33.1", "@metamask/sdk-install-modal-web": "0.32.1", "@paulmillr/qr": "^0.2.1", "bowser": "^2.9.0", "cross-fetch": "^4.0.0", "debug": "4.3.4", "eciesjs": "^0.4.11", "eth-rpc-errors": "^4.0.3", "eventemitter2": "^6.4.9", "obj-multiplex": "^1.0.0", "pump": "^3.0.0", "readable-stream": "^3.6.2", "socket.io-client": "^4.5.1", "tslib": "^2.6.0", "util": "^0.12.4", "uuid": "^8.3.2" } }, "sha512-8dkJUShZ5zFqYjNmhJaqKgDzZVne+F2rNjMQJ3pxs89n3oOUNuJ8dsTo08Grf9vlQ6Ldpdt2RTwqbrxKWyyqlw=="], - - "@metamask/sdk-analytics": ["@metamask/sdk-analytics@0.0.5", "", { "dependencies": { "openapi-fetch": "^0.13.5" } }, "sha512-fDah+keS1RjSUlC8GmYXvx6Y26s3Ax1U9hGpWb6GSY5SAdmTSIqp2CvYy6yW0WgLhnYhW+6xERuD0eVqV63QIQ=="], - - "@metamask/sdk-communication-layer": ["@metamask/sdk-communication-layer@0.33.1", "", { "dependencies": { "@metamask/sdk-analytics": "0.0.5", "bufferutil": "^4.0.8", "date-fns": "^2.29.3", "debug": "4.3.4", "utf-8-validate": "^5.0.2", "uuid": "^8.3.2" }, "peerDependencies": { "cross-fetch": "^4.0.0", "eciesjs": "*", "eventemitter2": "^6.4.9", "readable-stream": "^3.6.2", "socket.io-client": "^4.5.1" } }, "sha512-0bI9hkysxcfbZ/lk0T2+aKVo1j0ynQVTuB3sJ5ssPWlz+Z3VwveCkP1O7EVu1tsVVCb0YV5WxK9zmURu2FIiaA=="], - - "@metamask/sdk-install-modal-web": ["@metamask/sdk-install-modal-web@0.32.1", "", { "dependencies": { "@paulmillr/qr": "^0.2.1" } }, "sha512-MGmAo6qSjf1tuYXhCu2EZLftq+DSt5Z7fsIKr2P+lDgdTPWgLfZB1tJKzNcwKKOdf6q9Qmmxn7lJuI/gq5LrKw=="], - - "@metamask/superstruct": ["@metamask/superstruct@3.2.1", "", {}, "sha512-fLgJnDOXFmuVlB38rUN5SmU7hAFQcCjrg3Vrxz67KTY7YHFnSNEKvX4avmEBdOI0yTCxZjwMCFEqsC8k2+Wd3g=="], - - "@metamask/utils": ["@metamask/utils@8.5.0", "", { "dependencies": { "@ethereumjs/tx": "^4.2.0", "@metamask/superstruct": "^3.0.0", "@noble/hashes": "^1.3.1", "@scure/base": "^1.1.3", "@types/debug": "^4.1.7", "debug": "^4.3.4", "pony-cause": "^2.1.10", "semver": "^7.5.4", "uuid": "^9.0.1" } }, "sha512-I6bkduevXb72TIM9q2LRO63JSsF9EXduh3sBr9oybNX2hNNpr/j1tEjXrsG0Uabm4MJ1xkGAQEMwifvKZIkyxQ=="], - - "@noble/ciphers": ["@noble/ciphers@1.3.0", "", {}, "sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw=="], - - "@noble/curves": ["@noble/curves@1.9.1", "", { "dependencies": { "@noble/hashes": "1.8.0" } }, "sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA=="], - - "@noble/hashes": ["@noble/hashes@1.8.0", "", {}, "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A=="], - - "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="], - - "@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="], - - "@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="], - - "@paulmillr/qr": ["@paulmillr/qr@0.2.1", "", {}, "sha512-IHnV6A+zxU7XwmKFinmYjUcwlyK9+xkG3/s9KcQhI9BjQKycrJ1JRO+FbNYPwZiPKW3je/DR0k7w8/gLa5eaxQ=="], - - "@playwright/test": ["@playwright/test@1.58.2", "", { "dependencies": { "playwright": "1.58.2" }, "bin": { "playwright": "cli.js" } }, "sha512-akea+6bHYBBfA9uQqSYmlJXn61cTa+jbO87xVLCWbTqbWadRVmhxlXATaOjOgcBaWU4ePo0wB41KMFv3o35IXA=="], - - "@polka/url": ["@polka/url@1.0.0-next.29", "", {}, "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww=="], - - "@poppinss/colors": ["@poppinss/colors@4.1.5", "", { "dependencies": { "kleur": "^4.1.5" } }, "sha512-FvdDqtcRCtz6hThExcFOgW0cWX+xwSMWcRuQe5ZEb2m7cVQOAVZOIMt+/v9RxGiD9/OY16qJBXK4CVKWAPalBw=="], - - "@poppinss/dumper": ["@poppinss/dumper@0.6.4", "", { "dependencies": { "@poppinss/colors": "^4.1.5", "@sindresorhus/is": "^7.0.2", "supports-color": "^10.0.0" } }, "sha512-iG0TIdqv8xJ3Lt9O8DrPRxw1MRLjNpoqiSGU03P/wNLP/s0ra0udPJ1J2Tx5M0J3H/cVyEgpbn8xUKRY9j59kQ=="], - - "@poppinss/exception": ["@poppinss/exception@1.2.2", "", {}, "sha512-m7bpKCD4QMlFCjA/nKTs23fuvoVFoA83brRKmObCUNmi/9tVu8Ve3w4YQAnJu4q3Tjf5fr685HYIC/IA2zHRSg=="], - - "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.46.2", "", { "os": "android", "cpu": "arm" }, "sha512-Zj3Hl6sN34xJtMv7Anwb5Gu01yujyE/cLBDB2gnHTAHaWS1Z38L7kuSG+oAh0giZMqG060f/YBStXtMH6FvPMA=="], - - "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.46.2", "", { "os": "android", "cpu": "arm64" }, "sha512-nTeCWY83kN64oQ5MGz3CgtPx8NSOhC5lWtsjTs+8JAJNLcP3QbLCtDDgUKQc/Ro/frpMq4SHUaHN6AMltcEoLQ=="], - - "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.46.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-HV7bW2Fb/F5KPdM/9bApunQh68YVDU8sO8BvcW9OngQVN3HHHkw99wFupuUJfGR9pYLLAjcAOA6iO+evsbBaPQ=="], - - "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.46.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-SSj8TlYV5nJixSsm/y3QXfhspSiLYP11zpfwp6G/YDXctf3Xkdnk4woJIF5VQe0of2OjzTt8EsxnJDCdHd2xMA=="], - - "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.46.2", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-ZyrsG4TIT9xnOlLsSSi9w/X29tCbK1yegE49RYm3tu3wF1L/B6LVMqnEWyDB26d9Ecx9zrmXCiPmIabVuLmNSg=="], - - "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.46.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-pCgHFoOECwVCJ5GFq8+gR8SBKnMO+xe5UEqbemxBpCKYQddRQMgomv1104RnLSg7nNvgKy05sLsY51+OVRyiVw=="], - - "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.46.2", "", { "os": "linux", "cpu": "arm" }, "sha512-EtP8aquZ0xQg0ETFcxUbU71MZlHaw9MChwrQzatiE8U/bvi5uv/oChExXC4mWhjiqK7azGJBqU0tt5H123SzVA=="], - - "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.46.2", "", { "os": "linux", "cpu": "arm" }, "sha512-qO7F7U3u1nfxYRPM8HqFtLd+raev2K137dsV08q/LRKRLEc7RsiDWihUnrINdsWQxPR9jqZ8DIIZ1zJJAm5PjQ=="], - - "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.46.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-3dRaqLfcOXYsfvw5xMrxAk9Lb1f395gkoBYzSFcc/scgRFptRXL9DOaDpMiehf9CO8ZDRJW2z45b6fpU5nwjng=="], - - "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.46.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-fhHFTutA7SM+IrR6lIfiHskxmpmPTJUXpWIsBXpeEwNgZzZZSg/q4i6FU4J8qOGyJ0TR+wXBwx/L7Ho9z0+uDg=="], - - "@rollup/rollup-linux-loongarch64-gnu": ["@rollup/rollup-linux-loongarch64-gnu@4.46.2", "", { "os": "linux", "cpu": "none" }, "sha512-i7wfGFXu8x4+FRqPymzjD+Hyav8l95UIZ773j7J7zRYc3Xsxy2wIn4x+llpunexXe6laaO72iEjeeGyUFmjKeA=="], - - "@rollup/rollup-linux-ppc64-gnu": ["@rollup/rollup-linux-ppc64-gnu@4.46.2", "", { "os": "linux", "cpu": "ppc64" }, "sha512-B/l0dFcHVUnqcGZWKcWBSV2PF01YUt0Rvlurci5P+neqY/yMKchGU8ullZvIv5e8Y1C6wOn+U03mrDylP5q9Yw=="], - - "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.46.2", "", { "os": "linux", "cpu": "none" }, "sha512-32k4ENb5ygtkMwPMucAb8MtV8olkPT03oiTxJbgkJa7lJ7dZMr0GCFJlyvy+K8iq7F/iuOr41ZdUHaOiqyR3iQ=="], - - "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.46.2", "", { "os": "linux", "cpu": "none" }, "sha512-t5B2loThlFEauloaQkZg9gxV05BYeITLvLkWOkRXogP4qHXLkWSbSHKM9S6H1schf/0YGP/qNKtiISlxvfmmZw=="], - - "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.46.2", "", { "os": "linux", "cpu": "s390x" }, "sha512-YKjekwTEKgbB7n17gmODSmJVUIvj8CX7q5442/CK80L8nqOUbMtf8b01QkG3jOqyr1rotrAnW6B/qiHwfcuWQA=="], - - "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.46.2", "", { "os": "linux", "cpu": "x64" }, "sha512-Jj5a9RUoe5ra+MEyERkDKLwTXVu6s3aACP51nkfnK9wJTraCC8IMe3snOfALkrjTYd2G1ViE1hICj0fZ7ALBPA=="], - - "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.46.2", "", { "os": "linux", "cpu": "x64" }, "sha512-7kX69DIrBeD7yNp4A5b81izs8BqoZkCIaxQaOpumcJ1S/kmqNFjPhDu1LHeVXv0SexfHQv5cqHsxLOjETuqDuA=="], - - "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.46.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-wiJWMIpeaak/jsbaq2HMh/rzZxHVW1rU6coyeNNpMwk5isiPjSTx0a4YLSlYDwBH/WBvLz+EtsNqQScZTLJy3g=="], - - "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.46.2", "", { "os": "win32", "cpu": "ia32" }, "sha512-gBgaUDESVzMgWZhcyjfs9QFK16D8K6QZpwAaVNJxYDLHWayOta4ZMjGm/vsAEy3hvlS2GosVFlBlP9/Wb85DqQ=="], - - "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.46.2", "", { "os": "win32", "cpu": "x64" }, "sha512-CvUo2ixeIQGtF6WvuB87XWqPQkoFAFqW+HUo/WzHwuHDvIwZCtjdWXoYCcr06iKGydiqTclC4jU/TNObC/xKZg=="], - - "@scure/base": ["@scure/base@1.2.6", "", {}, "sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg=="], - - "@scure/bip32": ["@scure/bip32@1.7.0", "", { "dependencies": { "@noble/curves": "~1.9.0", "@noble/hashes": "~1.8.0", "@scure/base": "~1.2.5" } }, "sha512-E4FFX/N3f4B80AKWp5dP6ow+flD1LQZo/w8UnLGYZO674jS6YnYeepycOOksv+vLPSpgN35wgKgy+ybfTb2SMw=="], - - "@scure/bip39": ["@scure/bip39@1.6.0", "", { "dependencies": { "@noble/hashes": "~1.8.0", "@scure/base": "~1.2.5" } }, "sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A=="], - - "@sindresorhus/is": ["@sindresorhus/is@7.0.2", "", {}, "sha512-d9xRovfKNz1SKieM0qJdO+PQonjnnIfSNWfHYnBSJ9hkjm0ZPw6HlxscDXYstp3z+7V2GOFHc+J0CYrYTjqCJw=="], - - "@socket.io/component-emitter": ["@socket.io/component-emitter@3.1.2", "", {}, "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA=="], - - "@speed-highlight/core": ["@speed-highlight/core@1.2.7", "", {}, "sha512-0dxmVj4gxg3Jg879kvFS/msl4s9F3T9UXC1InxgOf7t5NvcPD97u/WTA5vL/IxWHMn7qSxBozqrnnE2wvl1m8g=="], - - "@standard-schema/spec": ["@standard-schema/spec@1.0.0", "", {}, "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA=="], - - "@sveltejs/acorn-typescript": ["@sveltejs/acorn-typescript@1.0.5", "", { "peerDependencies": { "acorn": "^8.9.0" } }, "sha512-IwQk4yfwLdibDlrXVE04jTZYlLnwsTT2PIOQQGNLWfjavGifnk1JD1LcZjZaBTRcxZu2FfPfNLOE04DSu9lqtQ=="], - - "@sveltejs/adapter-cloudflare": ["@sveltejs/adapter-cloudflare@7.1.3", "", { "dependencies": { "@cloudflare/workers-types": "^4.20250507.0", "worktop": "0.8.0-next.18" }, "peerDependencies": { "@sveltejs/kit": "^2.0.0", "wrangler": "^4.0.0" } }, "sha512-QdZygPQtUjc6Jd8t/yWIOJyBGELRsLk7wag18rbGU+tIpUCLpTC4qEuBDNcER8v5EDQdOqC8CJqZ8P+Bi5ybQw=="], - - "@sveltejs/kit": ["@sveltejs/kit@2.27.3", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "@sveltejs/acorn-typescript": "^1.0.5", "@types/cookie": "^0.6.0", "acorn": "^8.14.1", "cookie": "^0.6.0", "devalue": "^5.1.0", "esm-env": "^1.2.2", "kleur": "^4.1.5", "magic-string": "^0.30.5", "mrmime": "^2.0.0", "sade": "^1.8.1", "set-cookie-parser": "^2.6.0", "sirv": "^3.0.0" }, "peerDependencies": { "@sveltejs/vite-plugin-svelte": "^3.0.0 || ^4.0.0-next.1 || ^5.0.0 || ^6.0.0-next.0", "svelte": "^4.0.0 || ^5.0.0-next.0", "vite": "^5.0.3 || ^6.0.0 || ^7.0.0-beta.0" }, "bin": { "svelte-kit": "svelte-kit.js" } }, "sha512-jiG3NGZ8RRpi+ncjVnX+oR7uWEgzy//3YLGcTU5mHtjGraeGyNDr7GJFHlk7z0vi8bMXpXIUkEXj6p70FJmHvw=="], - - "@sveltejs/vite-plugin-svelte": ["@sveltejs/vite-plugin-svelte@6.1.1", "", { "dependencies": { "@sveltejs/vite-plugin-svelte-inspector": "^5.0.0", "debug": "^4.4.1", "deepmerge": "^4.3.1", "kleur": "^4.1.5", "magic-string": "^0.30.17", "vitefu": "^1.1.1" }, "peerDependencies": { "svelte": "^5.0.0", "vite": "^6.3.0 || ^7.0.0" } }, "sha512-vB0Vq47Js7C11L2JrwhncIAoDNkdKDPI500SjLSb34X48dDcsSH5JpLl0cHT0sfO997BrzAS6PKjiZEey/S0VQ=="], - - "@sveltejs/vite-plugin-svelte-inspector": ["@sveltejs/vite-plugin-svelte-inspector@5.0.0", "", { "dependencies": { "debug": "^4.4.1" }, "peerDependencies": { "@sveltejs/vite-plugin-svelte": "^6.0.0-next.0", "svelte": "^5.0.0", "vite": "^6.3.0 || ^7.0.0" } }, "sha512-iwQ8Z4ET6ZFSt/gC+tVfcsSBHwsqc6RumSaiLUkAurW3BCpJam65cmHw0oOlDMTO0u+PZi9hilBRYN+LZNHTUQ=="], - - "@tailwindcss/node": ["@tailwindcss/node@4.1.11", "", { "dependencies": { "@ampproject/remapping": "^2.3.0", "enhanced-resolve": "^5.18.1", "jiti": "^2.4.2", "lightningcss": "1.30.1", "magic-string": "^0.30.17", "source-map-js": "^1.2.1", "tailwindcss": "4.1.11" } }, "sha512-yzhzuGRmv5QyU9qLNg4GTlYI6STedBWRE7NjxP45CsFYYq9taI0zJXZBMqIC/c8fViNLhmrbpSFS57EoxUmD6Q=="], - - "@tailwindcss/oxide": ["@tailwindcss/oxide@4.1.11", "", { "dependencies": { "detect-libc": "^2.0.4", "tar": "^7.4.3" }, "optionalDependencies": { "@tailwindcss/oxide-android-arm64": "4.1.11", "@tailwindcss/oxide-darwin-arm64": "4.1.11", "@tailwindcss/oxide-darwin-x64": "4.1.11", "@tailwindcss/oxide-freebsd-x64": "4.1.11", "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.11", "@tailwindcss/oxide-linux-arm64-gnu": "4.1.11", "@tailwindcss/oxide-linux-arm64-musl": "4.1.11", "@tailwindcss/oxide-linux-x64-gnu": "4.1.11", "@tailwindcss/oxide-linux-x64-musl": "4.1.11", "@tailwindcss/oxide-wasm32-wasi": "4.1.11", "@tailwindcss/oxide-win32-arm64-msvc": "4.1.11", "@tailwindcss/oxide-win32-x64-msvc": "4.1.11" } }, "sha512-Q69XzrtAhuyfHo+5/HMgr1lAiPP/G40OMFAnws7xcFEYqcypZmdW8eGXaOUIeOl1dzPJBPENXgbjsOyhg2nkrg=="], - - "@tailwindcss/oxide-android-arm64": ["@tailwindcss/oxide-android-arm64@4.1.11", "", { "os": "android", "cpu": "arm64" }, "sha512-3IfFuATVRUMZZprEIx9OGDjG3Ou3jG4xQzNTvjDoKmU9JdmoCohQJ83MYd0GPnQIu89YoJqvMM0G3uqLRFtetg=="], - - "@tailwindcss/oxide-darwin-arm64": ["@tailwindcss/oxide-darwin-arm64@4.1.11", "", { "os": "darwin", "cpu": "arm64" }, "sha512-ESgStEOEsyg8J5YcMb1xl8WFOXfeBmrhAwGsFxxB2CxY9evy63+AtpbDLAyRkJnxLy2WsD1qF13E97uQyP1lfQ=="], - - "@tailwindcss/oxide-darwin-x64": ["@tailwindcss/oxide-darwin-x64@4.1.11", "", { "os": "darwin", "cpu": "x64" }, "sha512-EgnK8kRchgmgzG6jE10UQNaH9Mwi2n+yw1jWmof9Vyg2lpKNX2ioe7CJdf9M5f8V9uaQxInenZkOxnTVL3fhAw=="], - - "@tailwindcss/oxide-freebsd-x64": ["@tailwindcss/oxide-freebsd-x64@4.1.11", "", { "os": "freebsd", "cpu": "x64" }, "sha512-xdqKtbpHs7pQhIKmqVpxStnY1skuNh4CtbcyOHeX1YBE0hArj2romsFGb6yUmzkq/6M24nkxDqU8GYrKrz+UcA=="], - - "@tailwindcss/oxide-linux-arm-gnueabihf": ["@tailwindcss/oxide-linux-arm-gnueabihf@4.1.11", "", { "os": "linux", "cpu": "arm" }, "sha512-ryHQK2eyDYYMwB5wZL46uoxz2zzDZsFBwfjssgB7pzytAeCCa6glsiJGjhTEddq/4OsIjsLNMAiMlHNYnkEEeg=="], - - "@tailwindcss/oxide-linux-arm64-gnu": ["@tailwindcss/oxide-linux-arm64-gnu@4.1.11", "", { "os": "linux", "cpu": "arm64" }, "sha512-mYwqheq4BXF83j/w75ewkPJmPZIqqP1nhoghS9D57CLjsh3Nfq0m4ftTotRYtGnZd3eCztgbSPJ9QhfC91gDZQ=="], - - "@tailwindcss/oxide-linux-arm64-musl": ["@tailwindcss/oxide-linux-arm64-musl@4.1.11", "", { "os": "linux", "cpu": "arm64" }, "sha512-m/NVRFNGlEHJrNVk3O6I9ggVuNjXHIPoD6bqay/pubtYC9QIdAMpS+cswZQPBLvVvEF6GtSNONbDkZrjWZXYNQ=="], - - "@tailwindcss/oxide-linux-x64-gnu": ["@tailwindcss/oxide-linux-x64-gnu@4.1.11", "", { "os": "linux", "cpu": "x64" }, "sha512-YW6sblI7xukSD2TdbbaeQVDysIm/UPJtObHJHKxDEcW2exAtY47j52f8jZXkqE1krdnkhCMGqP3dbniu1Te2Fg=="], - - "@tailwindcss/oxide-linux-x64-musl": ["@tailwindcss/oxide-linux-x64-musl@4.1.11", "", { "os": "linux", "cpu": "x64" }, "sha512-e3C/RRhGunWYNC3aSF7exsQkdXzQ/M+aYuZHKnw4U7KQwTJotnWsGOIVih0s2qQzmEzOFIJ3+xt7iq67K/p56Q=="], - - "@tailwindcss/oxide-wasm32-wasi": ["@tailwindcss/oxide-wasm32-wasi@4.1.11", "", { "cpu": "none" }, "sha512-Xo1+/GU0JEN/C/dvcammKHzeM6NqKovG+6921MR6oadee5XPBaKOumrJCXvopJ/Qb5TH7LX/UAywbqrP4lax0g=="], - - "@tailwindcss/oxide-win32-arm64-msvc": ["@tailwindcss/oxide-win32-arm64-msvc@4.1.11", "", { "os": "win32", "cpu": "arm64" }, "sha512-UgKYx5PwEKrac3GPNPf6HVMNhUIGuUh4wlDFR2jYYdkX6pL/rn73zTq/4pzUm8fOjAn5L8zDeHp9iXmUGOXZ+w=="], - - "@tailwindcss/oxide-win32-x64-msvc": ["@tailwindcss/oxide-win32-x64-msvc@4.1.11", "", { "os": "win32", "cpu": "x64" }, "sha512-YfHoggn1j0LK7wR82TOucWc5LDCguHnoS879idHekmmiR7g9HUtMw9MI0NHatS28u/Xlkfi9w5RJWgz2Dl+5Qg=="], - - "@tailwindcss/vite": ["@tailwindcss/vite@4.1.11", "", { "dependencies": { "@tailwindcss/node": "4.1.11", "@tailwindcss/oxide": "4.1.11", "tailwindcss": "4.1.11" }, "peerDependencies": { "vite": "^5.2.0 || ^6 || ^7" } }, "sha512-RHYhrR3hku0MJFRV+fN2gNbDNEh3dwKvY8XJvTxCSXeMOsCRSr+uKvDWQcbizrHgjML6ZmTE5OwMrl5wKcujCw=="], - - "@tanstack/query-core": ["@tanstack/query-core@5.90.20", "", {}, "sha512-OMD2HLpNouXEfZJWcKeVKUgQ5n+n3A2JFmBaScpNDUqSrQSjiveC7dKMe53uJUg1nDG16ttFPz2xfilz6i2uVg=="], - - "@tanstack/react-query": ["@tanstack/react-query@5.90.21", "", { "dependencies": { "@tanstack/query-core": "5.90.20" }, "peerDependencies": { "react": "^18 || ^19" } }, "sha512-0Lu6y5t+tvlTJMTO7oh5NSpJfpg/5D41LlThfepTixPYkJ0sE2Jj0m0f6yYqujBwIXlId87e234+MxG3D3g7kg=="], - - "@types/bun": ["@types/bun@1.3.8", "", { "dependencies": { "bun-types": "1.3.8" } }, "sha512-3LvWJ2q5GerAXYxO2mffLTqOzEu5qnhEAlh48Vnu8WQfnmSwbgagjGZV6BoHKJztENYEDn6QmVd949W4uESRJA=="], - - "@types/cookie": ["@types/cookie@0.6.0", "", {}, "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA=="], - - "@types/debug": ["@types/debug@4.1.12", "", { "dependencies": { "@types/ms": "*" } }, "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ=="], - - "@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], - - "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="], - - "@types/ms": ["@types/ms@2.1.0", "", {}, "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA=="], - - "@types/node": ["@types/node@25.2.2", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-BkmoP5/FhRYek5izySdkOneRyXYN35I860MFAGupTdebyE66uZaR+bXLHq8k4DirE5DwQi3NuhvRU1jqTVwUrQ=="], - - "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.39.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "8.39.0", "@typescript-eslint/type-utils": "8.39.0", "@typescript-eslint/utils": "8.39.0", "@typescript-eslint/visitor-keys": "8.39.0", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.39.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-bhEz6OZeUR+O/6yx9Jk6ohX6H9JSFTaiY0v9/PuKT3oGK0rn0jNplLmyFUGV+a9gfYnVNwGDwS/UkLIuXNb2Rw=="], - - "@typescript-eslint/parser": ["@typescript-eslint/parser@8.39.0", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.39.0", "@typescript-eslint/types": "8.39.0", "@typescript-eslint/typescript-estree": "8.39.0", "@typescript-eslint/visitor-keys": "8.39.0", "debug": "^4.3.4" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-g3WpVQHngx0aLXn6kfIYCZxM6rRJlWzEkVpqEFLT3SgEDsp9cpCbxxgwnE504q4H+ruSDh/VGS6nqZIDynP+vg=="], - - "@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.39.0", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.39.0", "@typescript-eslint/types": "^8.39.0", "debug": "^4.3.4" }, "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-CTzJqaSq30V/Z2Og9jogzZt8lJRR5TKlAdXmWgdu4hgcC9Kww5flQ+xFvMxIBWVNdxJO7OifgdOK4PokMIWPew=="], - - "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.39.0", "", { "dependencies": { "@typescript-eslint/types": "8.39.0", "@typescript-eslint/visitor-keys": "8.39.0" } }, "sha512-8QOzff9UKxOh6npZQ/4FQu4mjdOCGSdO3p44ww0hk8Vu+IGbg0tB/H1LcTARRDzGCC8pDGbh2rissBuuoPgH8A=="], - - "@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.39.0", "", { "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-Fd3/QjmFV2sKmvv3Mrj8r6N8CryYiCS8Wdb/6/rgOXAWGcFuc+VkQuG28uk/4kVNVZBQuuDHEDUpo/pQ32zsIQ=="], - - "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.39.0", "", { "dependencies": { "@typescript-eslint/types": "8.39.0", "@typescript-eslint/typescript-estree": "8.39.0", "@typescript-eslint/utils": "8.39.0", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-6B3z0c1DXVT2vYA9+z9axjtc09rqKUPRmijD5m9iv8iQpHBRYRMBcgxSiKTZKm6FwWw1/cI4v6em35OsKCiN5Q=="], - - "@typescript-eslint/types": ["@typescript-eslint/types@8.39.0", "", {}, "sha512-ArDdaOllnCj3yn/lzKn9s0pBQYmmyme/v1HbGIGB0GB/knFI3fWMHloC+oYTJW46tVbYnGKTMDK4ah1sC2v0Kg=="], - - "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.39.0", "", { "dependencies": { "@typescript-eslint/project-service": "8.39.0", "@typescript-eslint/tsconfig-utils": "8.39.0", "@typescript-eslint/types": "8.39.0", "@typescript-eslint/visitor-keys": "8.39.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-ndWdiflRMvfIgQRpckQQLiB5qAKQ7w++V4LlCHwp62eym1HLB/kw7D9f2e8ytONls/jt89TEasgvb+VwnRprsw=="], - - "@typescript-eslint/utils": ["@typescript-eslint/utils@8.39.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", "@typescript-eslint/scope-manager": "8.39.0", "@typescript-eslint/types": "8.39.0", "@typescript-eslint/typescript-estree": "8.39.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-4GVSvNA0Vx1Ktwvf4sFE+exxJ3QGUorQG1/A5mRfRNZtkBT2xrA/BCO2H0eALx/PnvCS6/vmYwRdDA41EoffkQ=="], - - "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.39.0", "", { "dependencies": { "@typescript-eslint/types": "8.39.0", "eslint-visitor-keys": "^4.2.1" } }, "sha512-ldgiJ+VAhQCfIjeOgu8Kj5nSxds0ktPOSO9p4+0VDH2R2pLvQraaM5Oen2d7NxzMCm+Sn/vJT+mv2H5u6b/3fA=="], - - "@wagmi/connectors": ["@wagmi/connectors@7.2.1", "", { "peerDependencies": { "@base-org/account": "^2.5.1", "@coinbase/wallet-sdk": "^4.3.6", "@metamask/sdk": "~0.33.1", "@safe-global/safe-apps-provider": "~0.18.6", "@safe-global/safe-apps-sdk": "^9.1.0", "@wagmi/core": "3.4.0", "@walletconnect/ethereum-provider": "^2.21.1", "porto": "~0.2.35", "typescript": ">=5.7.3", "viem": "2.x" }, "optionalPeers": ["@base-org/account", "@coinbase/wallet-sdk", "@metamask/sdk", "@safe-global/safe-apps-provider", "@safe-global/safe-apps-sdk", "@walletconnect/ethereum-provider", "porto", "typescript"] }, "sha512-/tyDepUMDM8eNzNX3ofjqHNRFZ6XcZ3u0+cQp5x0/LHCpMA8tRh7A1/e7dTrYiIJeL7iLgHzfHUXCsU02OKMLQ=="], - - "@wagmi/core": ["@wagmi/core@3.4.0", "", { "dependencies": { "eventemitter3": "5.0.1", "mipd": "0.0.7", "zustand": "5.0.0" }, "peerDependencies": { "@tanstack/query-core": ">=5.0.0", "ox": ">=0.11.1", "typescript": ">=5.7.3", "viem": "2.x" }, "optionalPeers": ["@tanstack/query-core", "ox", "typescript"] }, "sha512-EU5gDsUp5t7+cuLv12/L8hfyWfCIKsBNiiBqpOqxZJxvAcAiQk4xFe2jMgaQPqApc3Omvxrk032M8AQ4N0cQeg=="], - - "abitype": ["abitype@1.2.3", "", { "peerDependencies": { "typescript": ">=5.0.4", "zod": "^3.22.0 || ^4.0.0" } }, "sha512-Ofer5QUnuUdTFsBRwARMoWKOH1ND5ehwYhJ3OJ/BQO+StkwQjHw0XyVh4vDttzHB7QOFhPHa/o413PJ82gU/Tg=="], - - "acorn": ["acorn@8.15.0", "", { "bin": "bin/acorn" }, "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg=="], - - "acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="], - - "acorn-walk": ["acorn-walk@8.3.2", "", {}, "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A=="], - - "ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], - - "ansi-escapes": ["ansi-escapes@7.3.0", "", { "dependencies": { "environment": "^1.0.0" } }, "sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg=="], - - "ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], - - "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], - - "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], - - "aria-query": ["aria-query@5.3.2", "", {}, "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw=="], - - "asynckit": ["asynckit@0.4.0", "", {}, "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="], - - "available-typed-arrays": ["available-typed-arrays@1.0.7", "", { "dependencies": { "possible-typed-array-names": "^1.0.0" } }, "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ=="], - - "axios": ["axios@1.11.0", "", { "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.4", "proxy-from-env": "^1.1.0" } }, "sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA=="], - - "axobject-query": ["axobject-query@4.1.0", "", {}, "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ=="], - - "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], - - "base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="], - - "blake3-wasm": ["blake3-wasm@2.1.5", "", {}, "sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g=="], - - "bowser": ["bowser@2.14.1", "", {}, "sha512-tzPjzCxygAKWFOJP011oxFHs57HzIhOEracIgAePE4pqB3LikALKnSzUyU4MGs9/iCEUuHlAJTjTc5M+u7YEGg=="], - - "brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="], - - "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], - - "buffer-from": ["buffer-from@1.1.2", "", {}, "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="], - - "bufferutil": ["bufferutil@4.1.0", "", { "dependencies": { "node-gyp-build": "^4.3.0" } }, "sha512-ZMANVnAixE6AWWnPzlW2KpUrxhm9woycYvPOo67jWHyFowASTEd9s+QN1EIMsSDtwhIxN4sWE1jotpuDUIgyIw=="], - - "bun-types": ["bun-types@1.3.8", "", { "dependencies": { "@types/node": "*" } }, "sha512-fL99nxdOWvV4LqjmC+8Q9kW3M4QTtTR1eePs94v5ctGqU8OeceWrSUaRw3JYb7tU3FkMIAjkueehrHPPPGKi5Q=="], - - "call-bind": ["call-bind@1.0.8", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.0", "es-define-property": "^1.0.0", "get-intrinsic": "^1.2.4", "set-function-length": "^1.2.2" } }, "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww=="], - - "call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.2", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ=="], - - "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], - - "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], - - "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], - - "chokidar": ["chokidar@4.0.3", "", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="], - - "chownr": ["chownr@3.0.0", "", {}, "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g=="], - - "cli-cursor": ["cli-cursor@5.0.0", "", { "dependencies": { "restore-cursor": "^5.0.0" } }, "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw=="], - - "cli-truncate": ["cli-truncate@5.1.1", "", { "dependencies": { "slice-ansi": "^7.1.0", "string-width": "^8.0.0" } }, "sha512-SroPvNHxUnk+vIW/dOSfNqdy1sPEFkrTk6TUtqLCnBlo3N7TNYYkzzN7uSD6+jVjrdO4+p8nH7JzH6cIvUem6A=="], - - "clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="], - - "color": ["color@4.2.3", "", { "dependencies": { "color-convert": "^2.0.1", "color-string": "^1.9.0" } }, "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A=="], - - "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], - - "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], - - "color-string": ["color-string@1.9.1", "", { "dependencies": { "color-name": "^1.0.0", "simple-swizzle": "^0.2.2" } }, "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg=="], - - "colorette": ["colorette@2.0.20", "", {}, "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w=="], - - "combined-stream": ["combined-stream@1.0.8", "", { "dependencies": { "delayed-stream": "~1.0.0" } }, "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg=="], - - "commander": ["commander@14.0.3", "", {}, "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw=="], - - "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="], - - "cookie": ["cookie@0.6.0", "", {}, "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw=="], - - "core-util-is": ["core-util-is@1.0.3", "", {}, "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="], - - "crc-32": ["crc-32@1.2.2", "", { "bin": { "crc32": "bin/crc32.njs" } }, "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ=="], - - "cross-fetch": ["cross-fetch@4.1.0", "", { "dependencies": { "node-fetch": "^2.7.0" } }, "sha512-uKm5PU+MHTootlWEY+mZ4vvXoCn4fLQxT9dSc1sXVMSFkINTJVN8cAQROpwcKm8bJ/c7rgZVIBWzH5T78sNZZw=="], - - "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], - - "cssesc": ["cssesc@3.0.0", "", { "bin": "bin/cssesc" }, "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="], - - "date-fns": ["date-fns@2.30.0", "", { "dependencies": { "@babel/runtime": "^7.21.0" } }, "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw=="], - - "debug": ["debug@4.4.1", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ=="], - - "deep-is": ["deep-is@0.1.4", "", {}, "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="], - - "deepmerge": ["deepmerge@4.3.1", "", {}, "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A=="], - - "define-data-property": ["define-data-property@1.1.4", "", { "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", "gopd": "^1.0.1" } }, "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A=="], - - "defu": ["defu@6.1.4", "", {}, "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg=="], - - "delayed-stream": ["delayed-stream@1.0.0", "", {}, "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="], - - "detect-browser": ["detect-browser@5.3.0", "", {}, "sha512-53rsFbGdwMwlF7qvCt0ypLM5V5/Mbl0szB7GPN8y9NCcbknYOeVVXdrXEq+90IwAfrrzt6Hd+u2E2ntakICU8w=="], - - "detect-libc": ["detect-libc@2.0.4", "", {}, "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA=="], - - "devalue": ["devalue@5.1.1", "", {}, "sha512-maua5KUiapvEwiEAe+XnlZ3Rh0GD+qI1J/nb9vrJc3muPXvcF/8gXYTWF76+5DAqHyDUtOIImEuo0YKE9mshVw=="], - - "dotenv": ["dotenv@17.3.1", "", {}, "sha512-IO8C/dzEb6O3F9/twg6ZLXz164a2fhTnEWb95H23Dm4OuN+92NmEAlTrupP9VW6Jm3sO26tQlqyvyi4CsnY9GA=="], - - "drizzle-kit": ["drizzle-kit@0.31.9", "", { "dependencies": { "@drizzle-team/brocli": "^0.10.2", "@esbuild-kit/esm-loader": "^2.5.5", "esbuild": "^0.25.4", "esbuild-register": "^3.5.0" }, "bin": { "drizzle-kit": "bin.cjs" } }, "sha512-GViD3IgsXn7trFyBUUHyTFBpH/FsHTxYJ66qdbVggxef4UBPHRYxQaRzYLTuekYnk9i5FIEL9pbBIwMqX/Uwrg=="], - - "drizzle-orm": ["drizzle-orm@0.45.1", "", { "peerDependencies": { "@aws-sdk/client-rds-data": ">=3", "@cloudflare/workers-types": ">=4", "@electric-sql/pglite": ">=0.2.0", "@libsql/client": ">=0.10.0", "@libsql/client-wasm": ">=0.10.0", "@neondatabase/serverless": ">=0.10.0", "@op-engineering/op-sqlite": ">=2", "@opentelemetry/api": "^1.4.1", "@planetscale/database": ">=1.13", "@prisma/client": "*", "@tidbcloud/serverless": "*", "@types/better-sqlite3": "*", "@types/pg": "*", "@types/sql.js": "*", "@upstash/redis": ">=1.34.7", "@vercel/postgres": ">=0.8.0", "@xata.io/client": "*", "better-sqlite3": ">=7", "bun-types": "*", "expo-sqlite": ">=14.0.0", "gel": ">=2", "knex": "*", "kysely": "*", "mysql2": ">=2", "pg": ">=8", "postgres": ">=3", "sql.js": ">=1", "sqlite3": ">=5" }, "optionalPeers": ["@aws-sdk/client-rds-data", "@cloudflare/workers-types", "@electric-sql/pglite", "@libsql/client", "@libsql/client-wasm", "@neondatabase/serverless", "@op-engineering/op-sqlite", "@opentelemetry/api", "@planetscale/database", "@prisma/client", "@tidbcloud/serverless", "@types/better-sqlite3", "@types/pg", "@types/sql.js", "@upstash/redis", "@vercel/postgres", "@xata.io/client", "better-sqlite3", "bun-types", "expo-sqlite", "gel", "knex", "kysely", "mysql2", "pg", "postgres", "sql.js", "sqlite3"] }, "sha512-Te0FOdKIistGNPMq2jscdqngBRfBpC8uMFVwqjf6gtTVJHIQ/dosgV/CLBU2N4ZJBsXL5savCba9b0YJskKdcA=="], - - "dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="], - - "eciesjs": ["eciesjs@0.4.17", "", { "dependencies": { "@ecies/ciphers": "^0.2.5", "@noble/ciphers": "^1.3.0", "@noble/curves": "^1.9.7", "@noble/hashes": "^1.8.0" } }, "sha512-TOOURki4G7sD1wDCjj7NfLaXZZ49dFOeEb5y39IXpb8p0hRzVvfvzZHOi5JcT+PpyAbi/Y+lxPb8eTag2WYH8w=="], - - "emoji-regex": ["emoji-regex@10.6.0", "", {}, "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A=="], - - "end-of-stream": ["end-of-stream@1.4.5", "", { "dependencies": { "once": "^1.4.0" } }, "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg=="], - - "engine.io-client": ["engine.io-client@6.6.4", "", { "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.4.1", "engine.io-parser": "~5.2.1", "ws": "~8.18.3", "xmlhttprequest-ssl": "~2.1.1" } }, "sha512-+kjUJnZGwzewFDw951CDWcwj35vMNf2fcj7xQWOctq1F2i1jkDdVvdFG9kM/BEChymCH36KgjnW0NsL58JYRxw=="], - - "engine.io-parser": ["engine.io-parser@5.2.3", "", {}, "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q=="], - - "enhanced-resolve": ["enhanced-resolve@5.18.3", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" } }, "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww=="], - - "environment": ["environment@1.1.0", "", {}, "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q=="], - - "error-stack-parser-es": ["error-stack-parser-es@1.0.5", "", {}, "sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA=="], - - "es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="], - - "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="], - - "es-object-atoms": ["es-object-atoms@1.1.1", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA=="], - - "es-set-tostringtag": ["es-set-tostringtag@2.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA=="], - - "esbuild": ["esbuild@0.25.8", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.8", "@esbuild/android-arm": "0.25.8", "@esbuild/android-arm64": "0.25.8", "@esbuild/android-x64": "0.25.8", "@esbuild/darwin-arm64": "0.25.8", "@esbuild/darwin-x64": "0.25.8", "@esbuild/freebsd-arm64": "0.25.8", "@esbuild/freebsd-x64": "0.25.8", "@esbuild/linux-arm": "0.25.8", "@esbuild/linux-arm64": "0.25.8", "@esbuild/linux-ia32": "0.25.8", "@esbuild/linux-loong64": "0.25.8", "@esbuild/linux-mips64el": "0.25.8", "@esbuild/linux-ppc64": "0.25.8", "@esbuild/linux-riscv64": "0.25.8", "@esbuild/linux-s390x": "0.25.8", "@esbuild/linux-x64": "0.25.8", "@esbuild/netbsd-arm64": "0.25.8", "@esbuild/netbsd-x64": "0.25.8", "@esbuild/openbsd-arm64": "0.25.8", "@esbuild/openbsd-x64": "0.25.8", "@esbuild/openharmony-arm64": "0.25.8", "@esbuild/sunos-x64": "0.25.8", "@esbuild/win32-arm64": "0.25.8", "@esbuild/win32-ia32": "0.25.8", "@esbuild/win32-x64": "0.25.8" }, "bin": "bin/esbuild" }, "sha512-vVC0USHGtMi8+R4Kz8rt6JhEWLxsv9Rnu/lGYbPR8u47B+DCBksq9JarW0zOO7bs37hyOK1l2/oqtbciutL5+Q=="], - - "esbuild-register": ["esbuild-register@3.6.0", "", { "dependencies": { "debug": "^4.3.4" }, "peerDependencies": { "esbuild": ">=0.12 <1" } }, "sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg=="], - - "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], - - "eslint": ["eslint@9.32.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.0", "@eslint/config-helpers": "^0.3.0", "@eslint/core": "^0.15.0", "@eslint/eslintrc": "^3.3.1", "@eslint/js": "9.32.0", "@eslint/plugin-kit": "^0.3.4", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.4.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "bin": "bin/eslint.js" }, "sha512-LSehfdpgMeWcTZkWZVIJl+tkZ2nuSkyyB9C27MZqFWXuph7DvaowgcTvKqxvpLW1JZIk8PN7hFY3Rj9LQ7m7lg=="], - - "eslint-config-prettier": ["eslint-config-prettier@10.1.8", "", { "peerDependencies": { "eslint": ">=7.0.0" }, "bin": "bin/cli.js" }, "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w=="], - - "eslint-plugin-svelte": ["eslint-plugin-svelte@3.11.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.6.1", "@jridgewell/sourcemap-codec": "^1.5.0", "esutils": "^2.0.3", "globals": "^16.0.0", "known-css-properties": "^0.37.0", "postcss": "^8.4.49", "postcss-load-config": "^3.1.4", "postcss-safe-parser": "^7.0.0", "semver": "^7.6.3", "svelte-eslint-parser": "^1.3.0" }, "peerDependencies": { "eslint": "^8.57.1 || ^9.0.0", "svelte": "^3.37.0 || ^4.0.0 || ^5.0.0" } }, "sha512-KliWlkieHyEa65aQIkRwUFfHzT5Cn4u3BQQsu3KlkJOs7c1u7ryn84EWaOjEzilbKgttT4OfBURA8Uc4JBSQIw=="], - - "eslint-scope": ["eslint-scope@8.4.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg=="], - - "eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], - - "esm-env": ["esm-env@1.2.2", "", {}, "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA=="], - - "espree": ["espree@10.4.0", "", { "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.1" } }, "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ=="], - - "esquery": ["esquery@1.6.0", "", { "dependencies": { "estraverse": "^5.1.0" } }, "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg=="], - - "esrap": ["esrap@2.1.0", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" } }, "sha512-yzmPNpl7TBbMRC5Lj2JlJZNPml0tzqoqP5B1JXycNUwtqma9AKCO0M2wHrdgsHcy1WRW7S9rJknAMtByg3usgA=="], - - "esrecurse": ["esrecurse@4.3.0", "", { "dependencies": { "estraverse": "^5.2.0" } }, "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag=="], - - "estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="], - - "esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="], - - "eth-rpc-errors": ["eth-rpc-errors@4.0.3", "", { "dependencies": { "fast-safe-stringify": "^2.0.6" } }, "sha512-Z3ymjopaoft7JDoxZcEb3pwdGh7yiYMhOwm2doUt6ASXlMavpNlK6Cre0+IMl2VSGyEU9rkiperQhp5iRxn5Pg=="], - - "ethereum-cryptography": ["ethereum-cryptography@2.2.1", "", { "dependencies": { "@noble/curves": "1.4.2", "@noble/hashes": "1.4.0", "@scure/bip32": "1.4.0", "@scure/bip39": "1.3.0" } }, "sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg=="], - - "eventemitter2": ["eventemitter2@6.4.9", "", {}, "sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg=="], - - "eventemitter3": ["eventemitter3@5.0.1", "", {}, "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA=="], - - "exit-hook": ["exit-hook@2.2.1", "", {}, "sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw=="], - - "exsolve": ["exsolve@1.0.7", "", {}, "sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw=="], - - "extension-port-stream": ["extension-port-stream@3.0.0", "", { "dependencies": { "readable-stream": "^3.6.2 || ^4.4.2", "webextension-polyfill": ">=0.10.0 <1.0" } }, "sha512-an2S5quJMiy5bnZKEf6AkfH/7r8CzHvhchU40gxN+OM6HPhe7Z9T1FUychcf2M9PpPOO0Hf7BAEfJkw2TDIBDw=="], - - "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], - - "fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="], - - "fast-json-stable-stringify": ["fast-json-stable-stringify@2.1.0", "", {}, "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="], - - "fast-levenshtein": ["fast-levenshtein@2.0.6", "", {}, "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="], - - "fast-safe-stringify": ["fast-safe-stringify@2.1.1", "", {}, "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA=="], - - "fastq": ["fastq@1.19.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ=="], - - "fdir": ["fdir@6.4.6", "", { "peerDependencies": { "picomatch": "^3 || ^4" } }, "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w=="], - - "file-entry-cache": ["file-entry-cache@8.0.0", "", { "dependencies": { "flat-cache": "^4.0.0" } }, "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ=="], - - "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], - - "find-up": ["find-up@5.0.0", "", { "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="], - - "flat-cache": ["flat-cache@4.0.1", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" } }, "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw=="], - - "flatted": ["flatted@3.3.3", "", {}, "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg=="], - - "follow-redirects": ["follow-redirects@1.15.11", "", {}, "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ=="], - - "for-each": ["for-each@0.3.5", "", { "dependencies": { "is-callable": "^1.2.7" } }, "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg=="], - - "form-data": ["form-data@4.0.4", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "hasown": "^2.0.2", "mime-types": "^2.1.12" } }, "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow=="], - - "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], - - "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], - - "generator-function": ["generator-function@2.0.1", "", {}, "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g=="], - - "get-east-asian-width": ["get-east-asian-width@1.4.0", "", {}, "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q=="], - - "get-intrinsic": ["get-intrinsic@1.3.0", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "math-intrinsics": "^1.1.0" } }, "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ=="], - - "get-proto": ["get-proto@1.0.1", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="], - - "get-tsconfig": ["get-tsconfig@4.13.6", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-shZT/QMiSHc/YBLxxOkMtgSid5HFoauqCE3/exfsEcwg1WkeqjG+V40yBbBrsD+jW2HDXcs28xOfcbm2jI8Ddw=="], - - "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], - - "glob-to-regexp": ["glob-to-regexp@0.4.1", "", {}, "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw=="], - - "globals": ["globals@16.3.0", "", {}, "sha512-bqWEnJ1Nt3neqx2q5SFfGS8r/ahumIakg3HcwtNlrVlwXIeNumWn/c7Pn/wKzGhf6SaW6H6uWXLqC30STCMchQ=="], - - "gopd": ["gopd@1.2.0", "", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="], - - "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], - - "graphemer": ["graphemer@1.4.0", "", {}, "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag=="], - - "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], - - "has-property-descriptors": ["has-property-descriptors@1.0.2", "", { "dependencies": { "es-define-property": "^1.0.0" } }, "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg=="], - - "has-symbols": ["has-symbols@1.1.0", "", {}, "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="], - - "has-tostringtag": ["has-tostringtag@1.0.2", "", { "dependencies": { "has-symbols": "^1.0.3" } }, "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw=="], - - "hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="], - - "husky": ["husky@9.1.7", "", { "bin": "bin.js" }, "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA=="], - - "ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], - - "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], - - "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], - - "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], - - "is-arguments": ["is-arguments@1.2.0", "", { "dependencies": { "call-bound": "^1.0.2", "has-tostringtag": "^1.0.2" } }, "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA=="], - - "is-arrayish": ["is-arrayish@0.3.2", "", {}, "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ=="], - - "is-callable": ["is-callable@1.2.7", "", {}, "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA=="], - - "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], - - "is-fullwidth-code-point": ["is-fullwidth-code-point@5.1.0", "", { "dependencies": { "get-east-asian-width": "^1.3.1" } }, "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ=="], - - "is-generator-function": ["is-generator-function@1.1.2", "", { "dependencies": { "call-bound": "^1.0.4", "generator-function": "^2.0.0", "get-proto": "^1.0.1", "has-tostringtag": "^1.0.2", "safe-regex-test": "^1.1.0" } }, "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA=="], - - "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], - - "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], - - "is-reference": ["is-reference@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.6" } }, "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw=="], - - "is-regex": ["is-regex@1.2.1", "", { "dependencies": { "call-bound": "^1.0.2", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g=="], - - "is-stream": ["is-stream@2.0.1", "", {}, "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg=="], - - "is-typed-array": ["is-typed-array@1.1.15", "", { "dependencies": { "which-typed-array": "^1.1.16" } }, "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ=="], - - "isarray": ["isarray@1.0.0", "", {}, "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="], - - "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], - - "isows": ["isows@1.0.7", "", { "peerDependencies": { "ws": "*" } }, "sha512-I1fSfDCZL5P0v33sVqeTDSpcstAg/N+wF5HS033mogOVIp4B+oHC7oOCsA3axAbBSGTJ8QubbNmnIRN/h8U7hg=="], - - "jiti": ["jiti@2.5.1", "", { "bin": "lib/jiti-cli.mjs" }, "sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w=="], - - "js-yaml": ["js-yaml@4.1.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": "bin/js-yaml.js" }, "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA=="], - - "json-buffer": ["json-buffer@3.0.1", "", {}, "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="], - - "json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], - - "json-stable-stringify-without-jsonify": ["json-stable-stringify-without-jsonify@1.0.1", "", {}, "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="], - - "keyv": ["keyv@4.5.4", "", { "dependencies": { "json-buffer": "3.0.1" } }, "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw=="], - - "kleur": ["kleur@4.1.5", "", {}, "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ=="], - - "known-css-properties": ["known-css-properties@0.37.0", "", {}, "sha512-JCDrsP4Z1Sb9JwG0aJ8Eo2r7k4Ou5MwmThS/6lcIe1ICyb7UBJKGRIUUdqc2ASdE/42lgz6zFUnzAIhtXnBVrQ=="], - - "levn": ["levn@0.4.1", "", { "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" } }, "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ=="], - - "lightningcss": ["lightningcss@1.30.1", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-darwin-arm64": "1.30.1", "lightningcss-darwin-x64": "1.30.1", "lightningcss-freebsd-x64": "1.30.1", "lightningcss-linux-arm-gnueabihf": "1.30.1", "lightningcss-linux-arm64-gnu": "1.30.1", "lightningcss-linux-arm64-musl": "1.30.1", "lightningcss-linux-x64-gnu": "1.30.1", "lightningcss-linux-x64-musl": "1.30.1", "lightningcss-win32-arm64-msvc": "1.30.1", "lightningcss-win32-x64-msvc": "1.30.1" } }, "sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg=="], - - "lightningcss-darwin-arm64": ["lightningcss-darwin-arm64@1.30.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ=="], - - "lightningcss-darwin-x64": ["lightningcss-darwin-x64@1.30.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA=="], - - "lightningcss-freebsd-x64": ["lightningcss-freebsd-x64@1.30.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig=="], - - "lightningcss-linux-arm-gnueabihf": ["lightningcss-linux-arm-gnueabihf@1.30.1", "", { "os": "linux", "cpu": "arm" }, "sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q=="], - - "lightningcss-linux-arm64-gnu": ["lightningcss-linux-arm64-gnu@1.30.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw=="], - - "lightningcss-linux-arm64-musl": ["lightningcss-linux-arm64-musl@1.30.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ=="], - - "lightningcss-linux-x64-gnu": ["lightningcss-linux-x64-gnu@1.30.1", "", { "os": "linux", "cpu": "x64" }, "sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw=="], - - "lightningcss-linux-x64-musl": ["lightningcss-linux-x64-musl@1.30.1", "", { "os": "linux", "cpu": "x64" }, "sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ=="], - - "lightningcss-win32-arm64-msvc": ["lightningcss-win32-arm64-msvc@1.30.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA=="], - - "lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.30.1", "", { "os": "win32", "cpu": "x64" }, "sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg=="], - - "lilconfig": ["lilconfig@2.1.0", "", {}, "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ=="], - - "lint-staged": ["lint-staged@16.2.7", "", { "dependencies": { "commander": "^14.0.2", "listr2": "^9.0.5", "micromatch": "^4.0.8", "nano-spawn": "^2.0.0", "pidtree": "^0.6.0", "string-argv": "^0.3.2", "yaml": "^2.8.1" }, "bin": { "lint-staged": "bin/lint-staged.js" } }, "sha512-lDIj4RnYmK7/kXMya+qJsmkRFkGolciXjrsZ6PC25GdTfWOAWetR0ZbsNXRAj1EHHImRSalc+whZFg56F5DVow=="], - - "listr2": ["listr2@9.0.5", "", { "dependencies": { "cli-truncate": "^5.0.0", "colorette": "^2.0.20", "eventemitter3": "^5.0.1", "log-update": "^6.1.0", "rfdc": "^1.4.1", "wrap-ansi": "^9.0.0" } }, "sha512-ME4Fb83LgEgwNw96RKNvKV4VTLuXfoKudAmm2lP8Kk87KaMK0/Xrx/aAkMWmT8mDb+3MlFDspfbCs7adjRxA2g=="], - - "locate-character": ["locate-character@3.0.0", "", {}, "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA=="], - - "locate-path": ["locate-path@6.0.0", "", { "dependencies": { "p-locate": "^5.0.0" } }, "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="], - - "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="], - - "log-update": ["log-update@6.1.0", "", { "dependencies": { "ansi-escapes": "^7.0.0", "cli-cursor": "^5.0.0", "slice-ansi": "^7.1.0", "strip-ansi": "^7.1.0", "wrap-ansi": "^9.0.0" } }, "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w=="], - - "magic-string": ["magic-string@0.30.17", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0" } }, "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA=="], - - "math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="], - - "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="], - - "micro-ftch": ["micro-ftch@0.3.1", "", {}, "sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg=="], - - "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], - - "mime": ["mime@3.0.0", "", { "bin": "cli.js" }, "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A=="], - - "mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], - - "mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], - - "mimic-function": ["mimic-function@5.0.1", "", {}, "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA=="], - - "miniflare": ["miniflare@4.20250803.0", "", { "dependencies": { "@cspotcode/source-map-support": "0.8.1", "acorn": "8.14.0", "acorn-walk": "8.3.2", "exit-hook": "2.2.1", "glob-to-regexp": "0.4.1", "sharp": "^0.33.5", "stoppable": "1.1.0", "undici": "^7.10.0", "workerd": "1.20250803.0", "ws": "8.18.0", "youch": "4.1.0-beta.10", "zod": "3.22.3" }, "bin": "bootstrap.js" }, "sha512-1tmCLfmMw0SqRBF9PPII9CVLQRzOrO7uIBmSng8BMSmtgs2kos7OeoM0sg6KbR9FrvP/zAniLyZuCAMAjuu4fQ=="], - - "minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], - - "minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="], - - "minizlib": ["minizlib@3.0.2", "", { "dependencies": { "minipass": "^7.1.2" } }, "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA=="], - - "mipd": ["mipd@0.0.7", "", { "peerDependencies": { "typescript": ">=5.0.4" }, "optionalPeers": ["typescript"] }, "sha512-aAPZPNDQ3uMTdKbuO2YmAw2TxLHO0moa4YKAyETM/DTj5FloZo+a+8tU+iv4GmW+sOxKLSRwcSFuczk+Cpt6fg=="], - - "mkdirp": ["mkdirp@3.0.1", "", { "bin": "dist/cjs/src/bin.js" }, "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg=="], - - "mri": ["mri@1.2.0", "", {}, "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA=="], - - "mrmime": ["mrmime@2.0.1", "", {}, "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ=="], - - "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], - - "nano-spawn": ["nano-spawn@2.0.0", "", {}, "sha512-tacvGzUY5o2D8CBh2rrwxyNojUsZNU2zjNTzKQrkgGJQTbGAfArVWXSKMBokBeeg6C7OLRGUEyoFlYbfeWQIqw=="], - - "nanoid": ["nanoid@3.3.11", "", { "bin": "bin/nanoid.cjs" }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], - - "natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="], - - "node-fetch": ["node-fetch@2.7.0", "", { "dependencies": { "whatwg-url": "^5.0.0" }, "peerDependencies": { "encoding": "^0.1.0" }, "optionalPeers": ["encoding"] }, "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A=="], - - "node-gyp-build": ["node-gyp-build@4.8.4", "", { "bin": { "node-gyp-build": "bin.js", "node-gyp-build-optional": "optional.js", "node-gyp-build-test": "build-test.js" } }, "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ=="], - - "obj-multiplex": ["obj-multiplex@1.0.0", "", { "dependencies": { "end-of-stream": "^1.4.0", "once": "^1.4.0", "readable-stream": "^2.3.3" } }, "sha512-0GNJAOsHoBHeNTvl5Vt6IWnpUEcc3uSRxzBri7EDyIcMgYvnY2JL2qdeV5zTMjWQX5OHcD5amcW2HFfDh0gjIA=="], - - "ohash": ["ohash@2.0.11", "", {}, "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ=="], - - "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="], - - "onetime": ["onetime@7.0.0", "", { "dependencies": { "mimic-function": "^5.0.0" } }, "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ=="], - - "openapi-fetch": ["openapi-fetch@0.13.8", "", { "dependencies": { "openapi-typescript-helpers": "^0.0.15" } }, "sha512-yJ4QKRyNxE44baQ9mY5+r/kAzZ8yXMemtNAOFwOzRXJscdjSxxzWSNlyBAr+o5JjkUw9Lc3W7OIoca0cY3PYnQ=="], - - "openapi-typescript-helpers": ["openapi-typescript-helpers@0.0.15", "", {}, "sha512-opyTPaunsklCBpTK8JGef6mfPhLSnyy5a0IN9vKtx3+4aExf+KxEqYwIy3hqkedXIB97u357uLMJsOnm3GVjsw=="], - - "optionator": ["optionator@0.9.4", "", { "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", "word-wrap": "^1.2.5" } }, "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g=="], - - "ox": ["ox@0.11.3", "", { "dependencies": { "@adraffy/ens-normalize": "^1.11.0", "@noble/ciphers": "^1.3.0", "@noble/curves": "1.9.1", "@noble/hashes": "^1.8.0", "@scure/bip32": "^1.7.0", "@scure/bip39": "^1.6.0", "abitype": "^1.2.3", "eventemitter3": "5.0.1" }, "peerDependencies": { "typescript": ">=5.4.0" } }, "sha512-1bWYGk/xZel3xro3l8WGg6eq4YEKlaqvyMtVhfMFpbJzK2F6rj4EDRtqDCWVEJMkzcmEi9uW2QxsqELokOlarw=="], - - "p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="], - - "p-locate": ["p-locate@5.0.0", "", { "dependencies": { "p-limit": "^3.0.2" } }, "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="], - - "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], - - "path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="], - - "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], - - "path-to-regexp": ["path-to-regexp@6.3.0", "", {}, "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ=="], - - "pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], - - "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], - - "picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], - - "pidtree": ["pidtree@0.6.0", "", { "bin": { "pidtree": "bin/pidtree.js" } }, "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g=="], - - "playwright": ["playwright@1.58.2", "", { "dependencies": { "playwright-core": "1.58.2" }, "optionalDependencies": { "fsevents": "2.3.2" }, "bin": { "playwright": "cli.js" } }, "sha512-vA30H8Nvkq/cPBnNw4Q8TWz1EJyqgpuinBcHET0YVJVFldr8JDNiU9LaWAE1KqSkRYazuaBhTpB5ZzShOezQ6A=="], - - "playwright-core": ["playwright-core@1.58.2", "", { "bin": { "playwright-core": "cli.js" } }, "sha512-yZkEtftgwS8CsfYo7nm0KE8jsvm6i/PTgVtB8DL726wNf6H2IMsDuxCpJj59KDaxCtSnrWan2AeDqM7JBaultg=="], - - "pony-cause": ["pony-cause@2.1.11", "", {}, "sha512-M7LhCsdNbNgiLYiP4WjsfLUuFmCfnjdF6jKe2R9NKl4WFN+HZPGHJZ9lnLP7f9ZnKe3U9nuWD0szirmj+migUg=="], - - "possible-typed-array-names": ["possible-typed-array-names@1.1.0", "", {}, "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg=="], - - "postcss": ["postcss@8.5.6", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg=="], - - "postcss-load-config": ["postcss-load-config@3.1.4", "", { "dependencies": { "lilconfig": "^2.0.5", "yaml": "^1.10.2" }, "peerDependencies": { "postcss": ">=8.0.9", "ts-node": ">=9.0.0" }, "optionalPeers": ["ts-node"] }, "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg=="], - - "postcss-safe-parser": ["postcss-safe-parser@7.0.1", "", { "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A=="], - - "postcss-scss": ["postcss-scss@4.0.9", "", { "peerDependencies": { "postcss": "^8.4.29" } }, "sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A=="], - - "postcss-selector-parser": ["postcss-selector-parser@7.1.0", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA=="], - - "prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="], - - "prettier": ["prettier@3.6.2", "", { "bin": "bin/prettier.cjs" }, "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ=="], - - "prettier-plugin-svelte": ["prettier-plugin-svelte@3.4.0", "", { "peerDependencies": { "prettier": "^3.0.0", "svelte": "^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0" } }, "sha512-pn1ra/0mPObzqoIQn/vUTR3ZZI6UuZ0sHqMK5x2jMLGrs53h0sXhkVuDcrlssHwIMk7FYrMjHBPoUSyyEEDlBQ=="], - - "prettier-plugin-tailwindcss": ["prettier-plugin-tailwindcss@0.6.14", "", { "peerDependencies": { "@ianvs/prettier-plugin-sort-imports": "*", "@prettier/plugin-hermes": "*", "@prettier/plugin-oxc": "*", "@prettier/plugin-pug": "*", "@shopify/prettier-plugin-liquid": "*", "@trivago/prettier-plugin-sort-imports": "*", "@zackad/prettier-plugin-twig": "*", "prettier": "^3.0", "prettier-plugin-astro": "*", "prettier-plugin-css-order": "*", "prettier-plugin-import-sort": "*", "prettier-plugin-jsdoc": "*", "prettier-plugin-marko": "*", "prettier-plugin-multiline-arrays": "*", "prettier-plugin-organize-attributes": "*", "prettier-plugin-organize-imports": "*", "prettier-plugin-sort-imports": "*", "prettier-plugin-style-order": "*", "prettier-plugin-svelte": "*" }, "optionalPeers": ["@ianvs/prettier-plugin-sort-imports", "@prettier/plugin-hermes", "@prettier/plugin-oxc", "@prettier/plugin-pug", "@shopify/prettier-plugin-liquid", "@trivago/prettier-plugin-sort-imports", "@zackad/prettier-plugin-twig", "prettier-plugin-astro", "prettier-plugin-css-order", "prettier-plugin-import-sort", "prettier-plugin-jsdoc", "prettier-plugin-marko", "prettier-plugin-multiline-arrays", "prettier-plugin-organize-attributes", "prettier-plugin-organize-imports", "prettier-plugin-sort-imports", "prettier-plugin-style-order"] }, "sha512-pi2e/+ZygeIqntN+vC573BcW5Cve8zUB0SSAGxqpB4f96boZF4M3phPVoOFCeypwkpRYdi7+jQ5YJJUwrkGUAg=="], - - "process-nextick-args": ["process-nextick-args@2.0.1", "", {}, "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="], - - "proxy-from-env": ["proxy-from-env@1.1.0", "", {}, "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="], - - "pump": ["pump@3.0.3", "", { "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA=="], - - "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="], - - "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="], - - "react": ["react@19.2.4", "", {}, "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ=="], - - "readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], - - "readdirp": ["readdirp@4.1.2", "", {}, "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg=="], - - "regexparam": ["regexparam@3.0.0", "", {}, "sha512-RSYAtP31mvYLkAHrOlh25pCNQ5hWnT106VukGaaFfuJrZFkGRX5GhUAdPqpSDXxOhA2c4akmRuplv1mRqnBn6Q=="], - - "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], - - "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="], - - "restore-cursor": ["restore-cursor@5.1.0", "", { "dependencies": { "onetime": "^7.0.0", "signal-exit": "^4.1.0" } }, "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA=="], - - "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="], - - "rfdc": ["rfdc@1.4.1", "", {}, "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA=="], - - "rollup": ["rollup@4.46.2", "", { "dependencies": { "@types/estree": "1.0.8" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.46.2", "@rollup/rollup-android-arm64": "4.46.2", "@rollup/rollup-darwin-arm64": "4.46.2", "@rollup/rollup-darwin-x64": "4.46.2", "@rollup/rollup-freebsd-arm64": "4.46.2", "@rollup/rollup-freebsd-x64": "4.46.2", "@rollup/rollup-linux-arm-gnueabihf": "4.46.2", "@rollup/rollup-linux-arm-musleabihf": "4.46.2", "@rollup/rollup-linux-arm64-gnu": "4.46.2", "@rollup/rollup-linux-arm64-musl": "4.46.2", "@rollup/rollup-linux-loongarch64-gnu": "4.46.2", "@rollup/rollup-linux-ppc64-gnu": "4.46.2", "@rollup/rollup-linux-riscv64-gnu": "4.46.2", "@rollup/rollup-linux-riscv64-musl": "4.46.2", "@rollup/rollup-linux-s390x-gnu": "4.46.2", "@rollup/rollup-linux-x64-gnu": "4.46.2", "@rollup/rollup-linux-x64-musl": "4.46.2", "@rollup/rollup-win32-arm64-msvc": "4.46.2", "@rollup/rollup-win32-ia32-msvc": "4.46.2", "@rollup/rollup-win32-x64-msvc": "4.46.2", "fsevents": "~2.3.2" }, "bin": "dist/bin/rollup" }, "sha512-WMmLFI+Boh6xbop+OAGo9cQ3OgX9MIg7xOQjn+pTCwOkk+FNDAeAemXkJ3HzDJrVXleLOFVa1ipuc1AmEx1Dwg=="], - - "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], - - "rxjs": ["rxjs@7.8.2", "", { "dependencies": { "tslib": "^2.1.0" } }, "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA=="], - - "sade": ["sade@1.8.1", "", { "dependencies": { "mri": "^1.1.0" } }, "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A=="], - - "safe-buffer": ["safe-buffer@5.1.2", "", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="], - - "safe-regex-test": ["safe-regex-test@1.1.0", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "is-regex": "^1.2.1" } }, "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw=="], - - "semver": ["semver@7.7.2", "", { "bin": "bin/semver.js" }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="], - - "set-cookie-parser": ["set-cookie-parser@2.7.1", "", {}, "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ=="], - - "set-function-length": ["set-function-length@1.2.2", "", { "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", "has-property-descriptors": "^1.0.2" } }, "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg=="], - - "sharp": ["sharp@0.33.5", "", { "dependencies": { "color": "^4.2.3", "detect-libc": "^2.0.3", "semver": "^7.6.3" }, "optionalDependencies": { "@img/sharp-darwin-arm64": "0.33.5", "@img/sharp-darwin-x64": "0.33.5", "@img/sharp-libvips-darwin-arm64": "1.0.4", "@img/sharp-libvips-darwin-x64": "1.0.4", "@img/sharp-libvips-linux-arm": "1.0.5", "@img/sharp-libvips-linux-arm64": "1.0.4", "@img/sharp-libvips-linux-s390x": "1.0.4", "@img/sharp-libvips-linux-x64": "1.0.4", "@img/sharp-libvips-linuxmusl-arm64": "1.0.4", "@img/sharp-libvips-linuxmusl-x64": "1.0.4", "@img/sharp-linux-arm": "0.33.5", "@img/sharp-linux-arm64": "0.33.5", "@img/sharp-linux-s390x": "0.33.5", "@img/sharp-linux-x64": "0.33.5", "@img/sharp-linuxmusl-arm64": "0.33.5", "@img/sharp-linuxmusl-x64": "0.33.5", "@img/sharp-wasm32": "0.33.5", "@img/sharp-win32-ia32": "0.33.5", "@img/sharp-win32-x64": "0.33.5" } }, "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw=="], - - "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], - - "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], - - "signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], - - "simple-swizzle": ["simple-swizzle@0.2.2", "", { "dependencies": { "is-arrayish": "^0.3.1" } }, "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg=="], - - "sirv": ["sirv@3.0.1", "", { "dependencies": { "@polka/url": "^1.0.0-next.24", "mrmime": "^2.0.0", "totalist": "^3.0.0" } }, "sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A=="], - - "slice-ansi": ["slice-ansi@7.1.2", "", { "dependencies": { "ansi-styles": "^6.2.1", "is-fullwidth-code-point": "^5.0.0" } }, "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w=="], - - "socket.io-client": ["socket.io-client@4.8.3", "", { "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.4.1", "engine.io-client": "~6.6.1", "socket.io-parser": "~4.2.4" } }, "sha512-uP0bpjWrjQmUt5DTHq9RuoCBdFJF10cdX9X+a368j/Ft0wmaVgxlrjvK3kjvgCODOMMOz9lcaRzxmso0bTWZ/g=="], - - "socket.io-parser": ["socket.io-parser@4.2.5", "", { "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.4.1" } }, "sha512-bPMmpy/5WWKHea5Y/jYAP6k74A+hvmRCQaJuJB6I/ML5JZq/KfNieUVo/3Mh7SAqn7TyFdIo6wqYHInG1MU1bQ=="], - - "source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], - - "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], - - "source-map-support": ["source-map-support@0.5.21", "", { "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w=="], - - "stoppable": ["stoppable@1.1.0", "", {}, "sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw=="], - - "string-argv": ["string-argv@0.3.2", "", {}, "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q=="], - - "string-width": ["string-width@8.1.1", "", { "dependencies": { "get-east-asian-width": "^1.3.0", "strip-ansi": "^7.1.0" } }, "sha512-KpqHIdDL9KwYk22wEOg/VIqYbrnLeSApsKT/bSj6Ez7pn3CftUiLAv2Lccpq1ALcpLV9UX1Ppn92npZWu2w/aw=="], - - "string_decoder": ["string_decoder@1.3.0", "", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="], - - "strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], - - "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], - - "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], - - "svelte": ["svelte@5.38.0", "", { "dependencies": { "@ampproject/remapping": "^2.3.0", "@jridgewell/sourcemap-codec": "^1.5.0", "@sveltejs/acorn-typescript": "^1.0.5", "@types/estree": "^1.0.5", "acorn": "^8.12.1", "aria-query": "^5.3.1", "axobject-query": "^4.1.0", "clsx": "^2.1.1", "esm-env": "^1.2.1", "esrap": "^2.1.0", "is-reference": "^3.0.3", "locate-character": "^3.0.0", "magic-string": "^0.30.11", "zimmerframe": "^1.1.2" } }, "sha512-cWF1Oc2IM/QbktdK89u5lt9MdKxRtQnRKnf2tq6KOhYuhLOd2hbMuTiJ+vWMzAeMDe81AzbCgLd4GVtOJ4fDRg=="], - - "svelte-check": ["svelte-check@4.3.1", "", { "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", "chokidar": "^4.0.1", "fdir": "^6.2.0", "picocolors": "^1.0.0", "sade": "^1.7.4" }, "peerDependencies": { "svelte": "^4.0.0 || ^5.0.0-next.0", "typescript": ">=5.0.0" }, "bin": "bin/svelte-check" }, "sha512-lkh8gff5gpHLjxIV+IaApMxQhTGnir2pNUAqcNgeKkvK5bT/30Ey/nzBxNLDlkztCH4dP7PixkMt9SWEKFPBWg=="], - - "svelte-eslint-parser": ["svelte-eslint-parser@1.3.1", "", { "dependencies": { "eslint-scope": "^8.2.0", "eslint-visitor-keys": "^4.0.0", "espree": "^10.0.0", "postcss": "^8.4.49", "postcss-scss": "^4.0.9", "postcss-selector-parser": "^7.0.0" }, "peerDependencies": { "svelte": "^3.37.0 || ^4.0.0 || ^5.0.0" } }, "sha512-0Iztj5vcOVOVkhy1pbo5uA9r+d3yaVoE5XPc9eABIWDOSJZ2mOsZ4D+t45rphWCOr0uMw3jtSG2fh2e7GvKnPg=="], - - "tailwindcss": ["tailwindcss@4.1.11", "", {}, "sha512-2E9TBm6MDD/xKYe+dvJZAmg3yxIEDNRc0jwlNyDg/4Fil2QcSLjFKGVff0lAf1jjeaArlG/M75Ey/EYr/OJtBA=="], - - "tapable": ["tapable@2.2.2", "", {}, "sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg=="], - - "tar": ["tar@7.4.3", "", { "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", "minipass": "^7.1.2", "minizlib": "^3.0.1", "mkdirp": "^3.0.1", "yallist": "^5.0.0" } }, "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw=="], - - "tinyglobby": ["tinyglobby@0.2.14", "", { "dependencies": { "fdir": "^6.4.4", "picomatch": "^4.0.2" } }, "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ=="], - - "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], - - "totalist": ["totalist@3.0.1", "", {}, "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ=="], - - "tr46": ["tr46@0.0.3", "", {}, "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="], - - "ts-api-utils": ["ts-api-utils@2.1.0", "", { "peerDependencies": { "typescript": ">=4.8.4" } }, "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ=="], - - "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], - - "type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="], - - "typescript": ["typescript@5.9.2", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A=="], - - "typescript-eslint": ["typescript-eslint@8.39.0", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.39.0", "@typescript-eslint/parser": "8.39.0", "@typescript-eslint/typescript-estree": "8.39.0", "@typescript-eslint/utils": "8.39.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-lH8FvtdtzcHJCkMOKnN73LIn6SLTpoojgJqDAxPm1jCR14eWSGPX8ul/gggBdPMk/d5+u9V854vTYQ8T5jF/1Q=="], - - "ufo": ["ufo@1.6.1", "", {}, "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA=="], - - "undici": ["undici@7.13.0", "", {}, "sha512-l+zSMssRqrzDcb3fjMkjjLGmuiiK2pMIcV++mJaAc9vhjSGpvM7h43QgP+OAMb1GImHmbPyG2tBXeuyG5iY4gA=="], - - "undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="], - - "unenv": ["unenv@2.0.0-rc.19", "", { "dependencies": { "defu": "^6.1.4", "exsolve": "^1.0.7", "ohash": "^2.0.11", "pathe": "^2.0.3", "ufo": "^1.6.1" } }, "sha512-t/OMHBNAkknVCI7bVB9OWjUUAwhVv9vsPIAGnNUxnu3FxPQN11rjh0sksLMzc3g7IlTgvHmOTl4JM7JHpcv5wA=="], - - "uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="], - - "use-sync-external-store": ["use-sync-external-store@1.4.0", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw=="], - - "utf-8-validate": ["utf-8-validate@5.0.10", "", { "dependencies": { "node-gyp-build": "^4.3.0" } }, "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ=="], - - "util": ["util@0.12.5", "", { "dependencies": { "inherits": "^2.0.3", "is-arguments": "^1.0.4", "is-generator-function": "^1.0.7", "is-typed-array": "^1.1.3", "which-typed-array": "^1.1.2" } }, "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA=="], - - "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="], - - "uuid": ["uuid@8.3.2", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="], - - "viem": ["viem@2.45.1", "", { "dependencies": { "@noble/curves": "1.9.1", "@noble/hashes": "1.8.0", "@scure/bip32": "1.7.0", "@scure/bip39": "1.6.0", "abitype": "1.2.3", "isows": "1.0.7", "ox": "0.11.3", "ws": "8.18.3" }, "peerDependencies": { "typescript": ">=5.0.4" } }, "sha512-LN6Pp7vSfv50LgwhkfSbIXftAM5J89lP9x8TeDa8QM7o41IxlHrDh0F9X+FfnCWtsz11pEVV5sn+yBUoOHNqYA=="], - - "vite": ["vite@7.1.1", "", { "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.6", "picomatch": "^4.0.3", "postcss": "^8.5.6", "rollup": "^4.43.0", "tinyglobby": "^0.2.14" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "jiti": ">=1.21.0", "less": "^4.0.0", "lightningcss": "^1.21.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "less", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx"], "bin": "bin/vite.js" }, "sha512-yJ+Mp7OyV+4S+afWo+QyoL9jFWD11QFH0i5i7JypnfTcA1rmgxCbiA8WwAICDEtZ1Z1hzrVhN8R8rGTqkTY8ZQ=="], - - "vitefu": ["vitefu@1.1.1", "", { "peerDependencies": { "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0" } }, "sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ=="], - - "wagmi": ["wagmi@3.5.0", "", { "dependencies": { "@wagmi/connectors": "7.2.1", "@wagmi/core": "3.4.0", "use-sync-external-store": "1.4.0" }, "peerDependencies": { "@tanstack/react-query": ">=5.0.0", "react": ">=18", "typescript": ">=5.7.3", "viem": "2.x" }, "optionalPeers": ["typescript"] }, "sha512-39uiY6Vkc28NiAHrxJzVTodoRgSVGG97EewwUxRf+jcFMTe8toAnaM8pJZA3Zw/6snMg4tSgWLJAtMnOacLe7w=="], - - "webextension-polyfill": ["webextension-polyfill@0.10.0", "", {}, "sha512-c5s35LgVa5tFaHhrZDnr3FpQpjj1BB+RXhLTYUxGqBVN460HkbM8TBtEqdXWbpTKfzwCcjAZVF7zXCYSKtcp9g=="], - - "webidl-conversions": ["webidl-conversions@3.0.1", "", {}, "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="], - - "whatwg-url": ["whatwg-url@5.0.0", "", { "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw=="], - - "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], - - "which-typed-array": ["which-typed-array@1.1.20", "", { "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.4", "for-each": "^0.3.5", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2" } }, "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg=="], - - "word-wrap": ["word-wrap@1.2.5", "", {}, "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA=="], - - "workerd": ["workerd@1.20250803.0", "", { "optionalDependencies": { "@cloudflare/workerd-darwin-64": "1.20250803.0", "@cloudflare/workerd-darwin-arm64": "1.20250803.0", "@cloudflare/workerd-linux-64": "1.20250803.0", "@cloudflare/workerd-linux-arm64": "1.20250803.0", "@cloudflare/workerd-windows-64": "1.20250803.0" }, "bin": "bin/workerd" }, "sha512-oYH29mE/wNolPc32NHHQbySaNorj6+KASUtOvQHySxB5mO1NWdGuNv49woxNCF5971UYceGQndY+OLT+24C3wQ=="], - - "worktop": ["worktop@0.8.0-next.18", "", { "dependencies": { "mrmime": "^2.0.0", "regexparam": "^3.0.0" } }, "sha512-+TvsA6VAVoMC3XDKR5MoC/qlLqDixEfOBysDEKnPIPou/NvoPWCAuXHXMsswwlvmEuvX56lQjvELLyLuzTKvRw=="], - - "wrangler": ["wrangler@4.28.1", "", { "dependencies": { "@cloudflare/kv-asset-handler": "0.4.0", "@cloudflare/unenv-preset": "2.6.0", "blake3-wasm": "2.1.5", "esbuild": "0.25.4", "miniflare": "4.20250803.0", "path-to-regexp": "6.3.0", "unenv": "2.0.0-rc.19", "workerd": "1.20250803.0" }, "optionalDependencies": { "fsevents": "~2.3.2" }, "peerDependencies": { "@cloudflare/workers-types": "^4.20250803.0" }, "bin": { "wrangler": "bin/wrangler.js", "wrangler2": "bin/wrangler.js" } }, "sha512-B1w6XS3o1q1Icyx1CyirY5GNyYhucd63Jqml/EYSbB5dgv0VT8ir7L8IkCdbICEa4yYTETIgvTTZqffM6tBulA=="], - - "wrap-ansi": ["wrap-ansi@9.0.2", "", { "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", "strip-ansi": "^7.1.0" } }, "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww=="], - - "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="], - - "ws": ["ws@8.18.3", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg=="], - - "xmlhttprequest-ssl": ["xmlhttprequest-ssl@2.1.2", "", {}, "sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ=="], - - "yallist": ["yallist@5.0.0", "", {}, "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw=="], - - "yaml": ["yaml@2.8.1", "", { "bin": "bin.mjs" }, "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw=="], - - "yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], - - "youch": ["youch@4.1.0-beta.10", "", { "dependencies": { "@poppinss/colors": "^4.1.5", "@poppinss/dumper": "^0.6.4", "@speed-highlight/core": "^1.2.7", "cookie": "^1.0.2", "youch-core": "^0.3.3" } }, "sha512-rLfVLB4FgQneDr0dv1oddCVZmKjcJ6yX6mS4pU82Mq/Dt9a3cLZQ62pDBL4AUO+uVrCvtWz3ZFUL2HFAFJ/BXQ=="], - - "youch-core": ["youch-core@0.3.3", "", { "dependencies": { "@poppinss/exception": "^1.2.2", "error-stack-parser-es": "^1.0.5" } }, "sha512-ho7XuGjLaJ2hWHoK8yFnsUGy2Y5uDpqSTq1FkHLK4/oqKtyUU1AFbOOxY4IpC9f0fTLjwYbslUz0Po5BpD1wrA=="], - - "zimmerframe": ["zimmerframe@1.1.2", "", {}, "sha512-rAbqEGa8ovJy4pyBxZM70hg4pE6gDgaQ0Sl9M3enG3I0d6H4XSAM3GeNGLKnsBpuijUow064sf7ww1nutC5/3w=="], - - "zod": ["zod@3.22.4", "", {}, "sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg=="], - - "zustand": ["zustand@5.0.0", "", { "peerDependencies": { "@types/react": ">=18.0.0", "immer": ">=9.0.6", "react": ">=18.0.0", "use-sync-external-store": ">=1.2.0" }, "optionalPeers": ["@types/react", "immer", "react", "use-sync-external-store"] }, "sha512-LE+VcmbartOPM+auOjCCLQOsQ05zUTp8RkgwRzefUk+2jISdMMFnxvyTjA4YNWr5ZGXYbVsEMZosttuxUBkojQ=="], - - "@cspotcode/source-map-support/@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.9", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" } }, "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ=="], - - "@esbuild-kit/core-utils/esbuild": ["esbuild@0.18.20", "", { "optionalDependencies": { "@esbuild/android-arm": "0.18.20", "@esbuild/android-arm64": "0.18.20", "@esbuild/android-x64": "0.18.20", "@esbuild/darwin-arm64": "0.18.20", "@esbuild/darwin-x64": "0.18.20", "@esbuild/freebsd-arm64": "0.18.20", "@esbuild/freebsd-x64": "0.18.20", "@esbuild/linux-arm": "0.18.20", "@esbuild/linux-arm64": "0.18.20", "@esbuild/linux-ia32": "0.18.20", "@esbuild/linux-loong64": "0.18.20", "@esbuild/linux-mips64el": "0.18.20", "@esbuild/linux-ppc64": "0.18.20", "@esbuild/linux-riscv64": "0.18.20", "@esbuild/linux-s390x": "0.18.20", "@esbuild/linux-x64": "0.18.20", "@esbuild/netbsd-x64": "0.18.20", "@esbuild/openbsd-x64": "0.18.20", "@esbuild/sunos-x64": "0.18.20", "@esbuild/win32-arm64": "0.18.20", "@esbuild/win32-ia32": "0.18.20", "@esbuild/win32-x64": "0.18.20" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA=="], - - "@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], - - "@eslint/eslintrc/globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="], - - "@humanfs/node/@humanwhocodes/retry": ["@humanwhocodes/retry@0.3.1", "", {}, "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA=="], - - "@metamask/rpc-errors/@metamask/utils": ["@metamask/utils@9.3.0", "", { "dependencies": { "@ethereumjs/tx": "^4.2.0", "@metamask/superstruct": "^3.1.0", "@noble/hashes": "^1.3.1", "@scure/base": "^1.1.3", "@types/debug": "^4.1.7", "debug": "^4.3.4", "pony-cause": "^2.1.10", "semver": "^7.5.4", "uuid": "^9.0.1" } }, "sha512-w8CVbdkDrVXFJbfBSlDfafDR6BAkpDmv1bC1UJVCoVny5tW2RKAdn9i68Xf7asYT4TnUhl/hN4zfUiKQq9II4g=="], - - "@metamask/sdk/debug": ["debug@4.3.4", "", { "dependencies": { "ms": "2.1.2" } }, "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ=="], - - "@metamask/sdk-communication-layer/debug": ["debug@4.3.4", "", { "dependencies": { "ms": "2.1.2" } }, "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ=="], - - "@metamask/utils/uuid": ["uuid@9.0.1", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA=="], - - "@poppinss/dumper/supports-color": ["supports-color@10.1.0", "", {}, "sha512-GBuewsPrhJPftT+fqDa9oI/zc5HNsG9nREqwzoSFDOIqf0NggOZbHQj2TE1P1CDJK8ZogFnlZY9hWoUiur7I/A=="], - - "@scure/bip32/@noble/curves": ["@noble/curves@1.9.6", "", { "dependencies": { "@noble/hashes": "1.8.0" } }, "sha512-GIKz/j99FRthB8icyJQA51E8Uk5hXmdyThjgQXRKiv9h0zeRlzSCLIzFw6K1LotZ3XuB7yzlf76qk7uBmTdFqA=="], - - "@typescript-eslint/eslint-plugin/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], - - "@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], - - "eciesjs/@noble/curves": ["@noble/curves@1.9.7", "", { "dependencies": { "@noble/hashes": "1.8.0" } }, "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw=="], - - "ethereum-cryptography/@noble/curves": ["@noble/curves@1.4.2", "", { "dependencies": { "@noble/hashes": "1.4.0" } }, "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw=="], - - "ethereum-cryptography/@noble/hashes": ["@noble/hashes@1.4.0", "", {}, "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg=="], - - "ethereum-cryptography/@scure/bip32": ["@scure/bip32@1.4.0", "", { "dependencies": { "@noble/curves": "~1.4.0", "@noble/hashes": "~1.4.0", "@scure/base": "~1.1.6" } }, "sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg=="], - - "ethereum-cryptography/@scure/bip39": ["@scure/bip39@1.3.0", "", { "dependencies": { "@noble/hashes": "~1.4.0", "@scure/base": "~1.1.6" } }, "sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ=="], - - "fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], - - "micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], - - "miniflare/acorn": ["acorn@8.14.0", "", { "bin": "bin/acorn" }, "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA=="], - - "miniflare/ws": ["ws@8.18.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw=="], - - "miniflare/zod": ["zod@3.22.3", "", {}, "sha512-EjIevzuJRiRPbVH4mGc8nApb/lVLKVpmUhAaR5R5doKGfAnGJ6Gr3CViAVjP+4FWSxCsybeWQdcgCtbX+7oZug=="], - - "obj-multiplex/readable-stream": ["readable-stream@2.3.8", "", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="], - - "playwright/fsevents": ["fsevents@2.3.2", "", { "os": "darwin" }, "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA=="], - - "postcss-load-config/yaml": ["yaml@1.10.2", "", {}, "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg=="], - - "slice-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], - - "string_decoder/safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], - - "wrangler/esbuild": ["esbuild@0.25.4", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.4", "@esbuild/android-arm": "0.25.4", "@esbuild/android-arm64": "0.25.4", "@esbuild/android-x64": "0.25.4", "@esbuild/darwin-arm64": "0.25.4", "@esbuild/darwin-x64": "0.25.4", "@esbuild/freebsd-arm64": "0.25.4", "@esbuild/freebsd-x64": "0.25.4", "@esbuild/linux-arm": "0.25.4", "@esbuild/linux-arm64": "0.25.4", "@esbuild/linux-ia32": "0.25.4", "@esbuild/linux-loong64": "0.25.4", "@esbuild/linux-mips64el": "0.25.4", "@esbuild/linux-ppc64": "0.25.4", "@esbuild/linux-riscv64": "0.25.4", "@esbuild/linux-s390x": "0.25.4", "@esbuild/linux-x64": "0.25.4", "@esbuild/netbsd-arm64": "0.25.4", "@esbuild/netbsd-x64": "0.25.4", "@esbuild/openbsd-arm64": "0.25.4", "@esbuild/openbsd-x64": "0.25.4", "@esbuild/sunos-x64": "0.25.4", "@esbuild/win32-arm64": "0.25.4", "@esbuild/win32-ia32": "0.25.4", "@esbuild/win32-x64": "0.25.4" }, "bin": "bin/esbuild" }, "sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q=="], - - "wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], - - "wrap-ansi/string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="], - - "youch/cookie": ["cookie@1.0.2", "", {}, "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA=="], - - "@esbuild-kit/core-utils/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.18.20", "", { "os": "android", "cpu": "arm" }, "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw=="], - - "@esbuild-kit/core-utils/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.18.20", "", { "os": "android", "cpu": "arm64" }, "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ=="], - - "@esbuild-kit/core-utils/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.18.20", "", { "os": "android", "cpu": "x64" }, "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg=="], - - "@esbuild-kit/core-utils/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.18.20", "", { "os": "darwin", "cpu": "arm64" }, "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA=="], - - "@esbuild-kit/core-utils/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.18.20", "", { "os": "darwin", "cpu": "x64" }, "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ=="], - - "@esbuild-kit/core-utils/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.18.20", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw=="], - - "@esbuild-kit/core-utils/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.18.20", "", { "os": "freebsd", "cpu": "x64" }, "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ=="], - - "@esbuild-kit/core-utils/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.18.20", "", { "os": "linux", "cpu": "arm" }, "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg=="], - - "@esbuild-kit/core-utils/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.18.20", "", { "os": "linux", "cpu": "arm64" }, "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA=="], - - "@esbuild-kit/core-utils/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.18.20", "", { "os": "linux", "cpu": "ia32" }, "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA=="], - - "@esbuild-kit/core-utils/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.18.20", "", { "os": "linux", "cpu": "none" }, "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg=="], - - "@esbuild-kit/core-utils/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.18.20", "", { "os": "linux", "cpu": "none" }, "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ=="], - - "@esbuild-kit/core-utils/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.18.20", "", { "os": "linux", "cpu": "ppc64" }, "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA=="], - - "@esbuild-kit/core-utils/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.18.20", "", { "os": "linux", "cpu": "none" }, "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A=="], - - "@esbuild-kit/core-utils/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.18.20", "", { "os": "linux", "cpu": "s390x" }, "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ=="], - - "@esbuild-kit/core-utils/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.18.20", "", { "os": "linux", "cpu": "x64" }, "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w=="], - - "@esbuild-kit/core-utils/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.18.20", "", { "os": "none", "cpu": "x64" }, "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A=="], - - "@esbuild-kit/core-utils/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.18.20", "", { "os": "openbsd", "cpu": "x64" }, "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg=="], - - "@esbuild-kit/core-utils/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.18.20", "", { "os": "sunos", "cpu": "x64" }, "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ=="], - - "@esbuild-kit/core-utils/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.18.20", "", { "os": "win32", "cpu": "arm64" }, "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg=="], - - "@esbuild-kit/core-utils/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.18.20", "", { "os": "win32", "cpu": "ia32" }, "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g=="], - - "@esbuild-kit/core-utils/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.18.20", "", { "os": "win32", "cpu": "x64" }, "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ=="], - - "@metamask/rpc-errors/@metamask/utils/uuid": ["uuid@9.0.1", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA=="], - - "@metamask/sdk-communication-layer/debug/ms": ["ms@2.1.2", "", {}, "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="], - - "@metamask/sdk/debug/ms": ["ms@2.1.2", "", {}, "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="], - - "@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], - - "ethereum-cryptography/@scure/bip32/@scure/base": ["@scure/base@1.1.9", "", {}, "sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg=="], - - "ethereum-cryptography/@scure/bip39/@scure/base": ["@scure/base@1.1.9", "", {}, "sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg=="], - - "obj-multiplex/readable-stream/string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="], - - "wrangler/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.4", "", { "os": "aix", "cpu": "ppc64" }, "sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q=="], - - "wrangler/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.25.4", "", { "os": "android", "cpu": "arm" }, "sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ=="], - - "wrangler/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.4", "", { "os": "android", "cpu": "arm64" }, "sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A=="], - - "wrangler/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.25.4", "", { "os": "android", "cpu": "x64" }, "sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ=="], - - "wrangler/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g=="], - - "wrangler/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A=="], - - "wrangler/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.4", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ=="], - - "wrangler/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.4", "", { "os": "freebsd", "cpu": "x64" }, "sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ=="], - - "wrangler/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.4", "", { "os": "linux", "cpu": "arm" }, "sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ=="], - - "wrangler/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ=="], - - "wrangler/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.4", "", { "os": "linux", "cpu": "ia32" }, "sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ=="], - - "wrangler/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.4", "", { "os": "linux", "cpu": "none" }, "sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA=="], - - "wrangler/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.4", "", { "os": "linux", "cpu": "none" }, "sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg=="], - - "wrangler/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.4", "", { "os": "linux", "cpu": "ppc64" }, "sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag=="], - - "wrangler/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.4", "", { "os": "linux", "cpu": "none" }, "sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA=="], - - "wrangler/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.4", "", { "os": "linux", "cpu": "s390x" }, "sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g=="], - - "wrangler/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.4", "", { "os": "linux", "cpu": "x64" }, "sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA=="], - - "wrangler/esbuild/@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.25.4", "", { "os": "none", "cpu": "arm64" }, "sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ=="], - - "wrangler/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.4", "", { "os": "none", "cpu": "x64" }, "sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw=="], - - "wrangler/esbuild/@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.4", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A=="], - - "wrangler/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.4", "", { "os": "openbsd", "cpu": "x64" }, "sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw=="], - - "wrangler/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.4", "", { "os": "sunos", "cpu": "x64" }, "sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q=="], - - "wrangler/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.4", "", { "os": "win32", "cpu": "arm64" }, "sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ=="], - - "wrangler/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.4", "", { "os": "win32", "cpu": "ia32" }, "sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg=="], - - "wrangler/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.4", "", { "os": "win32", "cpu": "x64" }, "sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ=="], - } -} diff --git a/app/issue-intent/package.json b/app/issue-intent/package.json deleted file mode 100644 index 1ba6d99..0000000 --- a/app/issue-intent/package.json +++ /dev/null @@ -1,57 +0,0 @@ -{ - "name": "cat-swapper", - "private": true, - "version": "0.0.1", - "type": "module", - "scripts": { - "dev": "vite dev", - "build": "vite build", - "preview": "vite preview", - "test": "bun run test:all", - "test:unit": "svelte-kit sync && bun test tests/unit tests/db.test.ts --coverage", - "test:e2e": "svelte-kit sync && bunx playwright test", - "test:e2e:headed": "svelte-kit sync && bunx playwright test --headed", - "test:e2e:ui": "svelte-kit sync && bunx playwright test --ui", - "test:all": "bun run test:unit && bun run test:e2e", - "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", - "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", - "format": "prettier --write .", - "lint": "prettier --check . && eslint .", - "migrate": "bunx drizzle-kit generate && bun run ./src/lib/compile-migrations.ts" - }, - "devDependencies": { - "@eslint/compat": "^1.2.5", - "@eslint/js": "^9.18.0", - "@sveltejs/kit": "^2.16.0", - "@sveltejs/vite-plugin-svelte": "^6.1.1", - "@tailwindcss/vite": "^4.0.0", - "@types/bun": "^1.3.8", - "@playwright/test": "^1.55.0", - "drizzle-kit": "^0.31.9", - "dotenv": "^17.2.3", - "eslint": "^9.18.0", - "eslint-config-prettier": "^10.0.1", - "eslint-plugin-svelte": "^3.0.0", - "globals": "^16.0.0", - "svelte": "^5.0.0", - "svelte-check": "^4.0.0", - "tailwindcss": "^4.0.0", - "typescript": "^5.0.0", - "typescript-eslint": "^8.20.0", - "vite": "^7.1.1" - }, - "dependencies": { - "@lifi/lintent": "file:../../packages/lintent", - "@electric-sql/pglite": "^0.3.15", - "@metamask/sdk": "^0.34.0", - "@sveltejs/adapter-cloudflare": "^7.0.3", - "@wagmi/connectors": "^7.2.1", - "@wagmi/core": "^3.4.0", - "axios": "^1.9.0", - "base64-js": "^1.5.1", - "drizzle-orm": "^0.45.1", - "rxjs": "^7.8.2", - "viem": "~2.45.1", - "wagmi": "^3.5.0" - } -} diff --git a/app/issue-intent/src/lib/utils/interopableAddresses.ts b/app/issue-intent/src/lib/utils/interopableAddresses.ts deleted file mode 100644 index 0ff6e4b..0000000 --- a/app/issue-intent/src/lib/utils/interopableAddresses.ts +++ /dev/null @@ -1,36 +0,0 @@ -function padEven(s: string, minimal = 2, pad: string = "0") { - return s.padStart(((Math.max(s.length + 1, minimal) / 2) | 0) * 2, pad); -} - -export function toHex( - num: number | bigint, - bytes: number = 1, - prefix?: T -): `${T}${string}` { - const p = (prefix ?? "") as T; - return `${p}${padEven(num.toString(16), bytes * 2)}` as `${T}${string}`; -} - -type Version = "0001"; -type ChainType = "0000"; -type ChainReferenceLength = string; -type ChainReference = string; -type Address = string; - -export type InteropableAddress = - `0x${Version}${ChainType}${ChainReferenceLength}${ChainReference}${Address}`; - -export const getInteropableAddress = ( - address: `0x${string}`, - chainId: number | bigint -): InteropableAddress => { - const version = "0001"; - const chainType = "0000"; - - const chainReference = padEven(chainId.toString(16)); - const chainReferenceLength = toHex(chainReference.length / 2); - - return `0x${version}${chainType}${chainReferenceLength}${chainReference}${toHex( - address.replace("0x", "").length / 2 - )}${address.replace("0x", "")}`; -}; diff --git a/app/issue-intent/src/lib/utils/walletClient.ts b/app/issue-intent/src/lib/utils/walletClient.ts deleted file mode 100644 index af382fa..0000000 --- a/app/issue-intent/src/lib/utils/walletClient.ts +++ /dev/null @@ -1,53 +0,0 @@ -import type { EIP1193Provider } from "viem"; -import { toHex } from "viem"; -import type { WC } from "$lib/config"; - -type SwitchableWalletClient = WC & { - switchChain?: (args: { id: number }) => Promise; -}; - -async function resolveWalletProvider( - walletClient: WC | undefined, - provider?: EIP1193Provider -): Promise { - if (provider?.request) return provider; - - const walletClientWithTransport = walletClient as - | (WC & { transport?: { value?: EIP1193Provider } }) - | undefined; - const transportProvider = walletClientWithTransport?.transport?.value; - if (transportProvider?.request) return transportProvider; - - try { - const { getCurrentProvider } = await import("./wagmi"); - return await getCurrentProvider(); - } catch { - return undefined; - } -} - -export async function switchWalletChain( - walletClient: WC | undefined, - chainId: number, - options?: { provider?: EIP1193Provider } -) { - if (!walletClient) return; - - const switchableClient = walletClient as SwitchableWalletClient; - if (typeof switchableClient.switchChain === "function") { - await switchableClient.switchChain({ id: chainId }); - return; - } - - const provider = await resolveWalletProvider(walletClient, options?.provider); - if (!provider?.request) { - throw new Error( - `Wallet client does not support switchChain and no provider is available for chain ${chainId}.` - ); - } - - await provider.request({ - method: "wallet_switchEthereumChain", - params: [{ chainId: toHex(chainId) }] - }); -} diff --git a/app/issue-intent/tests/unit/walletClientSwitch.test.ts b/app/issue-intent/tests/unit/walletClientSwitch.test.ts deleted file mode 100644 index 491e8e4..0000000 --- a/app/issue-intent/tests/unit/walletClientSwitch.test.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { describe, expect, it, mock } from "bun:test"; -import { switchWalletChain } from "../../src/lib/utils/walletClient"; - -describe("switchWalletChain", () => { - it("uses walletClient.switchChain when available", async () => { - const switchChain = mock(async () => undefined); - const walletClient = { switchChain } as unknown as Parameters[0]; - await switchWalletChain(walletClient, 8453); - expect(switchChain).toHaveBeenCalledWith({ id: 8453 }); - }); - - it("falls back to provider wallet_switchEthereumChain", async () => { - const request = mock(async () => null); - const walletClient = {} as unknown as Parameters[0]; - const provider = { request } as unknown as NonNullable< - Parameters[2] - >["provider"]; - await switchWalletChain(walletClient, 8453, { provider }); - expect(request).toHaveBeenCalledWith({ - method: "wallet_switchEthereumChain", - params: [{ chainId: "0x2105" }] - }); - }); -}); diff --git a/bun.lock b/bun.lock index 235fa2b..d4c4d90 100644 --- a/bun.lock +++ b/bun.lock @@ -1,43 +1,12 @@ { "lockfileVersion": 1, - "configVersion": 1, + "configVersion": 0, "workspaces": { "": { - "name": "lintent-monorepo", - "devDependencies": { - "husky": "9.1.7", - "lint-staged": "16.1.0", - "prettier": "3.4.2", - "prettier-plugin-svelte": "3.3.3", - "prettier-plugin-tailwindcss": "0.6.11", - }, - }, - "app/explorer": { - "name": "intent-explorer", - "version": "0.1.0", - "dependencies": { - "ky": "^1.14.3", - "tailwindcss": "^4.1.18", - "viem": "^2.46.2", - "zod": "^3.23.8", - }, - "devDependencies": { - "@sveltejs/adapter-node": "^5.2.12", - "@sveltejs/kit": "^2.16.0", - "@sveltejs/vite-plugin-svelte": "^4.0.0", - "@types/bun": "^1.3.0", - "svelte": "^5.0.0", - "svelte-check": "^4.0.0", - "typescript": "^5.6.3", - "vite": "^5.4.11", - }, - }, - "app/issue-intent": { "name": "cat-swapper", - "version": "0.0.1", "dependencies": { "@electric-sql/pglite": "^0.3.15", - "@lifi/lintent": "file:../../packages/lintent", + "@lifi/intent": "^0.0.2-alpha", "@metamask/sdk": "^0.34.0", "@sveltejs/adapter-cloudflare": "^7.0.3", "@wagmi/connectors": "^7.2.1", @@ -63,6 +32,11 @@ "eslint-config-prettier": "^10.0.1", "eslint-plugin-svelte": "^3.0.0", "globals": "^16.0.0", + "husky": "9.1.7", + "lint-staged": "16.1.0", + "prettier": "3.4.2", + "prettier-plugin-svelte": "3.3.3", + "prettier-plugin-tailwindcss": "0.6.11", "svelte": "^5.0.0", "svelte-check": "^4.0.0", "tailwindcss": "^4.0.0", @@ -71,39 +45,29 @@ "vite": "^7.1.1", }, }, - "packages/lintent": { - "name": "@lifi/lintent", - "version": "0.1.0", - "dependencies": { - "axios": "^1.9.0", - "viem": "~2.45.1", - }, - "devDependencies": { - "@types/bun": "^1.3.8", - "typescript": "^5.6.3", - }, - }, }, "packages": { - "@adraffy/ens-normalize": ["@adraffy/ens-normalize@1.11.1", "", {}, "sha512-nhCBV3quEgesuf7c7KYfperqSS14T8bYuvJ8PcLJp6znkZpFc0AuW4qBtr8eKVyPPe/8RSr7sglCWPU5eaxwKQ=="], + "@adraffy/ens-normalize": ["@adraffy/ens-normalize@1.11.0", "", {}, "sha512-/3DDPKHqqIqxUULp8yP4zODUY1i+2xvVWsv8A79xGWdCAG+8sb0hRh0Rk2QyOJUnnbyPUAZYcpBuRe3nS2OIUg=="], + + "@ampproject/remapping": ["@ampproject/remapping@2.3.0", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw=="], "@babel/runtime": ["@babel/runtime@7.28.6", "", {}, "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA=="], - "@cloudflare/kv-asset-handler": ["@cloudflare/kv-asset-handler@0.4.2", "", {}, "sha512-SIOD2DxrRRwQ+jgzlXCqoEFiKOFqaPjhnNTGKXSRLvp1HiOvapLaFG2kEr9dYQTYe8rKrd9uvDUzmAITeNyaHQ=="], + "@cloudflare/kv-asset-handler": ["@cloudflare/kv-asset-handler@0.4.0", "", { "dependencies": { "mime": "^3.0.0" } }, "sha512-+tv3z+SPp+gqTIcImN9o0hqE9xyfQjI1XD9pL6NuKjua9B1y7mNYv0S9cP+QEbA4ppVgGZEmKOvHX5G5Ei1CVA=="], - "@cloudflare/unenv-preset": ["@cloudflare/unenv-preset@2.13.0", "", { "peerDependencies": { "unenv": "2.0.0-rc.24", "workerd": "^1.20260213.0" }, "optionalPeers": ["workerd"] }, "sha512-bT2rnecesLjDBHgouMEPW9EQ7iLE8OG58srMuCEpAGp75xabi6j124SdS8XZ+dzB3sYBW4iQvVeCTCbAnMMVtA=="], + "@cloudflare/unenv-preset": ["@cloudflare/unenv-preset@2.6.0", "", { "peerDependencies": { "unenv": "2.0.0-rc.19", "workerd": "^1.20250802.0" } }, "sha512-h7Txw0WbDuUbrvZwky6+x7ft+U/Gppfn/rWx6IdR+e9gjygozRJnV26Y2TOr3yrIFa6OsZqqR2lN+jWTrakHXg=="], - "@cloudflare/workerd-darwin-64": ["@cloudflare/workerd-darwin-64@1.20260217.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-t1KRT0j4gwLntixMoNujv/UaS89Q7+MPRhkklaSup5tNhl3zBZOIlasBUSir69eXetqLZu8sypx3i7zE395XXA=="], + "@cloudflare/workerd-darwin-64": ["@cloudflare/workerd-darwin-64@1.20250803.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-6QciMnJp1p3F1qUiN0LaLfmw7SuZA/gfUBOe8Ft81pw16JYZ3CyiqIKPJvc1SV8jgDx8r+gz/PRi1NwOMt329A=="], - "@cloudflare/workerd-darwin-arm64": ["@cloudflare/workerd-darwin-arm64@1.20260217.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-9pEZ15BmELt0Opy79LTxUvbo55QAI4GnsnsvmgBxaQlc4P0dC8iycBGxbOpegkXnRx/LFj51l2zunfTo0EdATg=="], + "@cloudflare/workerd-darwin-arm64": ["@cloudflare/workerd-darwin-arm64@1.20250803.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-DoIgghDowtqoNhL6OoN/F92SKtrk7mRQKc4YSs/Dst8IwFZq+pCShOlWfB0MXqHKPSoiz5xLSrUKR9H6gQMPvw=="], - "@cloudflare/workerd-linux-64": ["@cloudflare/workerd-linux-64@1.20260217.0", "", { "os": "linux", "cpu": "x64" }, "sha512-IrZfxQ4b/4/RDQCJsyoxKrCR+cEqKl81yZOirMOKoRrDOmTjn4evYXaHoLBh2PjUKY1Imly7ZiC6G1p0xNIOwg=="], + "@cloudflare/workerd-linux-64": ["@cloudflare/workerd-linux-64@1.20250803.0", "", { "os": "linux", "cpu": "x64" }, "sha512-mYdz4vNWX3+PoqRjssepVQqgh42IBiSrl+wb7vbh7VVWUVzBnQKtW3G+UFiBF62hohCLexGIEi7L0cFfRlcKSQ=="], - "@cloudflare/workerd-linux-arm64": ["@cloudflare/workerd-linux-arm64@1.20260217.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-RGU1wq69ym4sFBVWhQeddZrRrG0hJM/SlZ5DwVDga/zBJ3WXxcDsFAgg1dToDfildTde5ySXN7jAasSmWko9rg=="], + "@cloudflare/workerd-linux-arm64": ["@cloudflare/workerd-linux-arm64@1.20250803.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-RmrtUYLRUg6djKU7Z6yebS6YGJVnaDVY6bbXca+2s26vw4ibJDOTPLuBHFQF62Grw3fAfsNbjQh5i14vG2mqUg=="], - "@cloudflare/workerd-windows-64": ["@cloudflare/workerd-windows-64@1.20260217.0", "", { "os": "win32", "cpu": "x64" }, "sha512-4T65u1321z1Zet9n7liQsSW7g3EXM5SWIT7kJ/uqkEtkPnIzZBIowMQgkvL5W9SpGZks9t3mTQj7hiUia8Gq9Q=="], + "@cloudflare/workerd-windows-64": ["@cloudflare/workerd-windows-64@1.20250803.0", "", { "os": "win32", "cpu": "x64" }, "sha512-uLV8gdudz36o9sUaAKbBxxTwZwLFz1KyW7QpBvOo4+r3Ib8yVKXGiySIMWGD7A0urSMrjf3e5LlLcJKgZUOjMA=="], - "@cloudflare/workers-types": ["@cloudflare/workers-types@4.20260219.0", "", {}, "sha512-jL2BNnDqbKXDrxhtKx+wVmQpv/P6w8J4WVFiuT9OMEPsw8V2TfTozoWTcCZ2AhE09yK406xQFE4mBq9IIgobuw=="], + "@cloudflare/workers-types": ["@cloudflare/workers-types@4.20250807.0", "", {}, "sha512-Zbrz9egAfwmlkUaZ1tQ+19pt5eomCJ57mAviT1HCsvnSFP1MoffMbYiU/xUomuekHtx0aVO4EacZwchCgjSvmw=="], "@cspotcode/source-map-support": ["@cspotcode/source-map-support@0.8.1", "", { "dependencies": { "@jridgewell/trace-mapping": "0.3.9" } }, "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw=="], @@ -113,83 +77,83 @@ "@electric-sql/pglite": ["@electric-sql/pglite@0.3.15", "", {}, "sha512-Cj++n1Mekf9ETfdc16TlDi+cDDQF0W7EcbyRHYOAeZdsAe8M/FJg18itDTSwyHfar2WIezawM9o0EKaRGVKygQ=="], - "@emnapi/runtime": ["@emnapi/runtime@1.8.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg=="], + "@emnapi/runtime": ["@emnapi/runtime@1.4.5", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-++LApOtY0pEEz1zrd9vy1/zXVaVJJ/EbAF3u0fXIzPJEDtnITsBGbbK0EkM72amhl/R5b+5xx0Y/QhcVOpuulg=="], "@esbuild-kit/core-utils": ["@esbuild-kit/core-utils@3.3.2", "", { "dependencies": { "esbuild": "~0.18.20", "source-map-support": "^0.5.21" } }, "sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ=="], "@esbuild-kit/esm-loader": ["@esbuild-kit/esm-loader@2.6.5", "", { "dependencies": { "@esbuild-kit/core-utils": "^3.3.2", "get-tsconfig": "^4.7.0" } }, "sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA=="], - "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.12", "", { "os": "aix", "cpu": "ppc64" }, "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA=="], + "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.8", "", { "os": "aix", "cpu": "ppc64" }, "sha512-urAvrUedIqEiFR3FYSLTWQgLu5tb+m0qZw0NBEasUeo6wuqatkMDaRT+1uABiGXEu5vqgPd7FGE1BhsAIy9QVA=="], - "@esbuild/android-arm": ["@esbuild/android-arm@0.25.12", "", { "os": "android", "cpu": "arm" }, "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg=="], + "@esbuild/android-arm": ["@esbuild/android-arm@0.25.8", "", { "os": "android", "cpu": "arm" }, "sha512-RONsAvGCz5oWyePVnLdZY/HHwA++nxYWIX1atInlaW6SEkwq6XkP3+cb825EUcRs5Vss/lGh/2YxAb5xqc07Uw=="], - "@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.12", "", { "os": "android", "cpu": "arm64" }, "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg=="], + "@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.8", "", { "os": "android", "cpu": "arm64" }, "sha512-OD3p7LYzWpLhZEyATcTSJ67qB5D+20vbtr6vHlHWSQYhKtzUYrETuWThmzFpZtFsBIxRvhO07+UgVA9m0i/O1w=="], - "@esbuild/android-x64": ["@esbuild/android-x64@0.25.12", "", { "os": "android", "cpu": "x64" }, "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg=="], + "@esbuild/android-x64": ["@esbuild/android-x64@0.25.8", "", { "os": "android", "cpu": "x64" }, "sha512-yJAVPklM5+4+9dTeKwHOaA+LQkmrKFX96BM0A/2zQrbS6ENCmxc4OVoBs5dPkCCak2roAD+jKCdnmOqKszPkjA=="], - "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.12", "", { "os": "darwin", "cpu": "arm64" }, "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg=="], + "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.8", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Jw0mxgIaYX6R8ODrdkLLPwBqHTtYHJSmzzd+QeytSugzQ0Vg4c5rDky5VgkoowbZQahCbsv1rT1KW72MPIkevw=="], - "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.12", "", { "os": "darwin", "cpu": "x64" }, "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA=="], + "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.8", "", { "os": "darwin", "cpu": "x64" }, "sha512-Vh2gLxxHnuoQ+GjPNvDSDRpoBCUzY4Pu0kBqMBDlK4fuWbKgGtmDIeEC081xi26PPjn+1tct+Bh8FjyLlw1Zlg=="], - "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.12", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg=="], + "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.8", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-YPJ7hDQ9DnNe5vxOm6jaie9QsTwcKedPvizTVlqWG9GBSq+BuyWEDazlGaDTC5NGU4QJd666V0yqCBL2oWKPfA=="], - "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.12", "", { "os": "freebsd", "cpu": "x64" }, "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ=="], + "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.8", "", { "os": "freebsd", "cpu": "x64" }, "sha512-MmaEXxQRdXNFsRN/KcIimLnSJrk2r5H8v+WVafRWz5xdSVmWLoITZQXcgehI2ZE6gioE6HirAEToM/RvFBeuhw=="], - "@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.12", "", { "os": "linux", "cpu": "arm" }, "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw=="], + "@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.8", "", { "os": "linux", "cpu": "arm" }, "sha512-FuzEP9BixzZohl1kLf76KEVOsxtIBFwCaLupVuk4eFVnOZfU+Wsn+x5Ryam7nILV2pkq2TqQM9EZPsOBuMC+kg=="], - "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.12", "", { "os": "linux", "cpu": "arm64" }, "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ=="], + "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.8", "", { "os": "linux", "cpu": "arm64" }, "sha512-WIgg00ARWv/uYLU7lsuDK00d/hHSfES5BzdWAdAig1ioV5kaFNrtK8EqGcUBJhYqotlUByUKz5Qo6u8tt7iD/w=="], - "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.12", "", { "os": "linux", "cpu": "ia32" }, "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA=="], + "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.8", "", { "os": "linux", "cpu": "ia32" }, "sha512-A1D9YzRX1i+1AJZuFFUMP1E9fMaYY+GnSQil9Tlw05utlE86EKTUA7RjwHDkEitmLYiFsRd9HwKBPEftNdBfjg=="], - "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng=="], + "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.8", "", { "os": "linux", "cpu": "none" }, "sha512-O7k1J/dwHkY1RMVvglFHl1HzutGEFFZ3kNiDMSOyUrB7WcoHGf96Sh+64nTRT26l3GMbCW01Ekh/ThKM5iI7hQ=="], - "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw=="], + "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.8", "", { "os": "linux", "cpu": "none" }, "sha512-uv+dqfRazte3BzfMp8PAQXmdGHQt2oC/y2ovwpTteqrMx2lwaksiFZ/bdkXJC19ttTvNXBuWH53zy/aTj1FgGw=="], - "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.12", "", { "os": "linux", "cpu": "ppc64" }, "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA=="], + "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.8", "", { "os": "linux", "cpu": "ppc64" }, "sha512-GyG0KcMi1GBavP5JgAkkstMGyMholMDybAf8wF5A70CALlDM2p/f7YFE7H92eDeH/VBtFJA5MT4nRPDGg4JuzQ=="], - "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w=="], + "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.8", "", { "os": "linux", "cpu": "none" }, "sha512-rAqDYFv3yzMrq7GIcen3XP7TUEG/4LK86LUPMIz6RT8A6pRIDn0sDcvjudVZBiiTcZCY9y2SgYX2lgK3AF+1eg=="], - "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.12", "", { "os": "linux", "cpu": "s390x" }, "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg=="], + "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.8", "", { "os": "linux", "cpu": "s390x" }, "sha512-Xutvh6VjlbcHpsIIbwY8GVRbwoviWT19tFhgdA7DlenLGC/mbc3lBoVb7jxj9Z+eyGqvcnSyIltYUrkKzWqSvg=="], - "@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.12", "", { "os": "linux", "cpu": "x64" }, "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw=="], + "@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.8", "", { "os": "linux", "cpu": "x64" }, "sha512-ASFQhgY4ElXh3nDcOMTkQero4b1lgubskNlhIfJrsH5OKZXDpUAKBlNS0Kx81jwOBp+HCeZqmoJuihTv57/jvQ=="], - "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.25.12", "", { "os": "none", "cpu": "arm64" }, "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg=="], + "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.25.8", "", { "os": "none", "cpu": "arm64" }, "sha512-d1KfruIeohqAi6SA+gENMuObDbEjn22olAR7egqnkCD9DGBG0wsEARotkLgXDu6c4ncgWTZJtN5vcgxzWRMzcw=="], - "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.12", "", { "os": "none", "cpu": "x64" }, "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ=="], + "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.8", "", { "os": "none", "cpu": "x64" }, "sha512-nVDCkrvx2ua+XQNyfrujIG38+YGyuy2Ru9kKVNyh5jAys6n+l44tTtToqHjino2My8VAY6Lw9H7RI73XFi66Cg=="], - "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.12", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A=="], + "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.8", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-j8HgrDuSJFAujkivSMSfPQSAa5Fxbvk4rgNAS5i3K+r8s1X0p1uOO2Hl2xNsGFppOeHOLAVgYwDVlmxhq5h+SQ=="], - "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.12", "", { "os": "openbsd", "cpu": "x64" }, "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw=="], + "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.8", "", { "os": "openbsd", "cpu": "x64" }, "sha512-1h8MUAwa0VhNCDp6Af0HToI2TJFAn1uqT9Al6DJVzdIBAd21m/G0Yfc77KDM3uF3T/YaOgQq3qTJHPbTOInaIQ=="], - "@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.25.12", "", { "os": "none", "cpu": "arm64" }, "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg=="], + "@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.25.8", "", { "os": "none", "cpu": "arm64" }, "sha512-r2nVa5SIK9tSWd0kJd9HCffnDHKchTGikb//9c7HX+r+wHYCpQrSgxhlY6KWV1nFo1l4KFbsMlHk+L6fekLsUg=="], - "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.12", "", { "os": "sunos", "cpu": "x64" }, "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w=="], + "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.8", "", { "os": "sunos", "cpu": "x64" }, "sha512-zUlaP2S12YhQ2UzUfcCuMDHQFJyKABkAjvO5YSndMiIkMimPmxA+BYSBikWgsRpvyxuRnow4nS5NPnf9fpv41w=="], - "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.12", "", { "os": "win32", "cpu": "arm64" }, "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg=="], + "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.8", "", { "os": "win32", "cpu": "arm64" }, "sha512-YEGFFWESlPva8hGL+zvj2z/SaK+pH0SwOM0Nc/d+rVnW7GSTFlLBGzZkuSU9kFIGIo8q9X3ucpZhu8PDN5A2sQ=="], - "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.12", "", { "os": "win32", "cpu": "ia32" }, "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ=="], + "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.8", "", { "os": "win32", "cpu": "ia32" }, "sha512-hiGgGC6KZ5LZz58OL/+qVVoZiuZlUYlYHNAmczOm7bs2oE1XriPFi5ZHHrS8ACpV5EjySrnoCKmcbQMN+ojnHg=="], - "@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.12", "", { "os": "win32", "cpu": "x64" }, "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA=="], + "@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.8", "", { "os": "win32", "cpu": "x64" }, "sha512-cn3Yr7+OaaZq1c+2pe+8yxC8E144SReCQjN6/2ynubzYjvyqZjTXfQJpAcQpsdJq3My7XADANiYGHoFC69pLQw=="], - "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.9.1", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ=="], + "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.7.0", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw=="], - "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.2", "", {}, "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew=="], + "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.1", "", {}, "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ=="], - "@eslint/compat": ["@eslint/compat@1.4.1", "", { "dependencies": { "@eslint/core": "^0.17.0" }, "peerDependencies": { "eslint": "^8.40 || 9" }, "optionalPeers": ["eslint"] }, "sha512-cfO82V9zxxGBxcQDr1lfaYB7wykTa0b00mGa36FrJl7iTFd0Z2cHfEYuxcBRP/iNijCsWsEkA+jzT8hGYmv33w=="], + "@eslint/compat": ["@eslint/compat@1.3.2", "", { "peerDependencies": { "eslint": "^8.40 || 9" } }, "sha512-jRNwzTbd6p2Rw4sZ1CgWRS8YMtqG15YyZf7zvb6gY2rB2u6n+2Z+ELW0GtL0fQgyl0pr4Y/BzBfng/BdsereRA=="], - "@eslint/config-array": ["@eslint/config-array@0.21.1", "", { "dependencies": { "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", "minimatch": "^3.1.2" } }, "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA=="], + "@eslint/config-array": ["@eslint/config-array@0.21.0", "", { "dependencies": { "@eslint/object-schema": "^2.1.6", "debug": "^4.3.1", "minimatch": "^3.1.2" } }, "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ=="], - "@eslint/config-helpers": ["@eslint/config-helpers@0.4.2", "", { "dependencies": { "@eslint/core": "^0.17.0" } }, "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw=="], + "@eslint/config-helpers": ["@eslint/config-helpers@0.3.1", "", {}, "sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA=="], - "@eslint/core": ["@eslint/core@0.17.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ=="], + "@eslint/core": ["@eslint/core@0.15.2", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg=="], - "@eslint/eslintrc": ["@eslint/eslintrc@3.3.3", "", { "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.1", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" } }, "sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ=="], + "@eslint/eslintrc": ["@eslint/eslintrc@3.3.1", "", { "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" } }, "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ=="], - "@eslint/js": ["@eslint/js@9.39.2", "", {}, "sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA=="], + "@eslint/js": ["@eslint/js@9.32.0", "", {}, "sha512-BBpRFZK3eX6uMLKz8WxFOBIFFcGFJ/g8XuwjTHCqHROSIsopI+ddn/d5Cfh36+7+e5edVS8dbSHnBNhrLEX0zg=="], - "@eslint/object-schema": ["@eslint/object-schema@2.1.7", "", {}, "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA=="], + "@eslint/object-schema": ["@eslint/object-schema@2.1.6", "", {}, "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA=="], - "@eslint/plugin-kit": ["@eslint/plugin-kit@0.4.1", "", { "dependencies": { "@eslint/core": "^0.17.0", "levn": "^0.4.1" } }, "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA=="], + "@eslint/plugin-kit": ["@eslint/plugin-kit@0.3.5", "", { "dependencies": { "@eslint/core": "^0.15.2", "levn": "^0.4.1" } }, "sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w=="], "@ethereumjs/common": ["@ethereumjs/common@3.2.0", "", { "dependencies": { "@ethereumjs/util": "^8.1.0", "crc-32": "^1.2.0" } }, "sha512-pksvzI0VyLgmuEF2FA/JR/4/y6hcPq8OUail3/AvycBaW1d5VSauOZzqGvJ3RTmR4MU35lWE8KseKOsEhrFRBA=="], @@ -201,73 +165,61 @@ "@humanfs/core": ["@humanfs/core@0.19.1", "", {}, "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA=="], - "@humanfs/node": ["@humanfs/node@0.16.7", "", { "dependencies": { "@humanfs/core": "^0.19.1", "@humanwhocodes/retry": "^0.4.0" } }, "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ=="], + "@humanfs/node": ["@humanfs/node@0.16.6", "", { "dependencies": { "@humanfs/core": "^0.19.1", "@humanwhocodes/retry": "^0.3.0" } }, "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw=="], "@humanwhocodes/module-importer": ["@humanwhocodes/module-importer@1.0.1", "", {}, "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA=="], "@humanwhocodes/retry": ["@humanwhocodes/retry@0.4.3", "", {}, "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ=="], - "@img/colour": ["@img/colour@1.0.0", "", {}, "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw=="], - - "@img/sharp-darwin-arm64": ["@img/sharp-darwin-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-arm64": "1.2.4" }, "os": "darwin", "cpu": "arm64" }, "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w=="], - - "@img/sharp-darwin-x64": ["@img/sharp-darwin-x64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-x64": "1.2.4" }, "os": "darwin", "cpu": "x64" }, "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw=="], - - "@img/sharp-libvips-darwin-arm64": ["@img/sharp-libvips-darwin-arm64@1.2.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g=="], - - "@img/sharp-libvips-darwin-x64": ["@img/sharp-libvips-darwin-x64@1.2.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg=="], + "@img/sharp-darwin-arm64": ["@img/sharp-darwin-arm64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-arm64": "1.0.4" }, "os": "darwin", "cpu": "arm64" }, "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ=="], - "@img/sharp-libvips-linux-arm": ["@img/sharp-libvips-linux-arm@1.2.4", "", { "os": "linux", "cpu": "arm" }, "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A=="], + "@img/sharp-darwin-x64": ["@img/sharp-darwin-x64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-x64": "1.0.4" }, "os": "darwin", "cpu": "x64" }, "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q=="], - "@img/sharp-libvips-linux-arm64": ["@img/sharp-libvips-linux-arm64@1.2.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw=="], + "@img/sharp-libvips-darwin-arm64": ["@img/sharp-libvips-darwin-arm64@1.0.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg=="], - "@img/sharp-libvips-linux-ppc64": ["@img/sharp-libvips-linux-ppc64@1.2.4", "", { "os": "linux", "cpu": "ppc64" }, "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA=="], + "@img/sharp-libvips-darwin-x64": ["@img/sharp-libvips-darwin-x64@1.0.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ=="], - "@img/sharp-libvips-linux-riscv64": ["@img/sharp-libvips-linux-riscv64@1.2.4", "", { "os": "linux", "cpu": "none" }, "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA=="], + "@img/sharp-libvips-linux-arm": ["@img/sharp-libvips-linux-arm@1.0.5", "", { "os": "linux", "cpu": "arm" }, "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g=="], - "@img/sharp-libvips-linux-s390x": ["@img/sharp-libvips-linux-s390x@1.2.4", "", { "os": "linux", "cpu": "s390x" }, "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ=="], + "@img/sharp-libvips-linux-arm64": ["@img/sharp-libvips-linux-arm64@1.0.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA=="], - "@img/sharp-libvips-linux-x64": ["@img/sharp-libvips-linux-x64@1.2.4", "", { "os": "linux", "cpu": "x64" }, "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw=="], + "@img/sharp-libvips-linux-s390x": ["@img/sharp-libvips-linux-s390x@1.0.4", "", { "os": "linux", "cpu": "s390x" }, "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA=="], - "@img/sharp-libvips-linuxmusl-arm64": ["@img/sharp-libvips-linuxmusl-arm64@1.2.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw=="], + "@img/sharp-libvips-linux-x64": ["@img/sharp-libvips-linux-x64@1.0.4", "", { "os": "linux", "cpu": "x64" }, "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw=="], - "@img/sharp-libvips-linuxmusl-x64": ["@img/sharp-libvips-linuxmusl-x64@1.2.4", "", { "os": "linux", "cpu": "x64" }, "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg=="], + "@img/sharp-libvips-linuxmusl-arm64": ["@img/sharp-libvips-linuxmusl-arm64@1.0.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA=="], - "@img/sharp-linux-arm": ["@img/sharp-linux-arm@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm": "1.2.4" }, "os": "linux", "cpu": "arm" }, "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw=="], + "@img/sharp-libvips-linuxmusl-x64": ["@img/sharp-libvips-linuxmusl-x64@1.0.4", "", { "os": "linux", "cpu": "x64" }, "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw=="], - "@img/sharp-linux-arm64": ["@img/sharp-linux-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm64": "1.2.4" }, "os": "linux", "cpu": "arm64" }, "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg=="], + "@img/sharp-linux-arm": ["@img/sharp-linux-arm@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm": "1.0.5" }, "os": "linux", "cpu": "arm" }, "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ=="], - "@img/sharp-linux-ppc64": ["@img/sharp-linux-ppc64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-ppc64": "1.2.4" }, "os": "linux", "cpu": "ppc64" }, "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA=="], + "@img/sharp-linux-arm64": ["@img/sharp-linux-arm64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm64": "1.0.4" }, "os": "linux", "cpu": "arm64" }, "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA=="], - "@img/sharp-linux-riscv64": ["@img/sharp-linux-riscv64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-riscv64": "1.2.4" }, "os": "linux", "cpu": "none" }, "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw=="], + "@img/sharp-linux-s390x": ["@img/sharp-linux-s390x@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-s390x": "1.0.4" }, "os": "linux", "cpu": "s390x" }, "sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q=="], - "@img/sharp-linux-s390x": ["@img/sharp-linux-s390x@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-s390x": "1.2.4" }, "os": "linux", "cpu": "s390x" }, "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg=="], + "@img/sharp-linux-x64": ["@img/sharp-linux-x64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-x64": "1.0.4" }, "os": "linux", "cpu": "x64" }, "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA=="], - "@img/sharp-linux-x64": ["@img/sharp-linux-x64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-x64": "1.2.4" }, "os": "linux", "cpu": "x64" }, "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ=="], + "@img/sharp-linuxmusl-arm64": ["@img/sharp-linuxmusl-arm64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-arm64": "1.0.4" }, "os": "linux", "cpu": "arm64" }, "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g=="], - "@img/sharp-linuxmusl-arm64": ["@img/sharp-linuxmusl-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" }, "os": "linux", "cpu": "arm64" }, "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg=="], + "@img/sharp-linuxmusl-x64": ["@img/sharp-linuxmusl-x64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-x64": "1.0.4" }, "os": "linux", "cpu": "x64" }, "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw=="], - "@img/sharp-linuxmusl-x64": ["@img/sharp-linuxmusl-x64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-x64": "1.2.4" }, "os": "linux", "cpu": "x64" }, "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q=="], + "@img/sharp-wasm32": ["@img/sharp-wasm32@0.33.5", "", { "dependencies": { "@emnapi/runtime": "^1.2.0" }, "cpu": "none" }, "sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg=="], - "@img/sharp-wasm32": ["@img/sharp-wasm32@0.34.5", "", { "dependencies": { "@emnapi/runtime": "^1.7.0" }, "cpu": "none" }, "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw=="], + "@img/sharp-win32-ia32": ["@img/sharp-win32-ia32@0.33.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ=="], - "@img/sharp-win32-arm64": ["@img/sharp-win32-arm64@0.34.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g=="], + "@img/sharp-win32-x64": ["@img/sharp-win32-x64@0.33.5", "", { "os": "win32", "cpu": "x64" }, "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg=="], - "@img/sharp-win32-ia32": ["@img/sharp-win32-ia32@0.34.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg=="], + "@isaacs/fs-minipass": ["@isaacs/fs-minipass@4.0.1", "", { "dependencies": { "minipass": "^7.0.4" } }, "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w=="], - "@img/sharp-win32-x64": ["@img/sharp-win32-x64@0.34.5", "", { "os": "win32", "cpu": "x64" }, "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw=="], - - "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="], - - "@jridgewell/remapping": ["@jridgewell/remapping@2.3.5", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ=="], + "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.12", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg=="], "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="], - "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="], + "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.4", "", {}, "sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw=="], - "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="], + "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.29", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ=="], - "@lifi/lintent": ["@lifi/lintent@workspace:packages/lintent"], + "@lifi/intent": ["@lifi/intent@0.0.2-alpha", "", { "dependencies": { "ky": "^1.12.0", "viem": "~2.45.1" } }, "sha512-N9hjHmJD/t1PAR/KQ4EiOYs9YPfMHXTzn2x2R7qScaq/FXm+qSZt7BmkbGtg/KcvIwhMwcFf1+nBTEYW1KUOgA=="], "@metamask/json-rpc-engine": ["@metamask/json-rpc-engine@8.0.2", "", { "dependencies": { "@metamask/rpc-errors": "^6.2.1", "@metamask/safe-event-emitter": "^3.0.0", "@metamask/utils": "^8.3.0" } }, "sha512-IoQPmql8q7ABLruW7i4EYVHWUbF74yrp63bRuXV5Zf9BQwcn5H9Ww1eLtROYvI1bUXwOiHZ6qT5CWTrDc/t/AA=="], @@ -301,75 +253,63 @@ "@noble/hashes": ["@noble/hashes@1.8.0", "", {}, "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A=="], - "@paulmillr/qr": ["@paulmillr/qr@0.2.1", "", {}, "sha512-IHnV6A+zxU7XwmKFinmYjUcwlyK9+xkG3/s9KcQhI9BjQKycrJ1JRO+FbNYPwZiPKW3je/DR0k7w8/gLa5eaxQ=="], - - "@playwright/test": ["@playwright/test@1.58.2", "", { "dependencies": { "playwright": "1.58.2" }, "bin": { "playwright": "cli.js" } }, "sha512-akea+6bHYBBfA9uQqSYmlJXn61cTa+jbO87xVLCWbTqbWadRVmhxlXATaOjOgcBaWU4ePo0wB41KMFv3o35IXA=="], - - "@polka/url": ["@polka/url@1.0.0-next.29", "", {}, "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww=="], - - "@poppinss/colors": ["@poppinss/colors@4.1.6", "", { "dependencies": { "kleur": "^4.1.5" } }, "sha512-H9xkIdFswbS8n1d6vmRd8+c10t2Qe+rZITbbDHHkQixH5+2x1FDGmi/0K+WgWiqQFKPSlIYB7jlH6Kpfn6Fleg=="], - - "@poppinss/dumper": ["@poppinss/dumper@0.6.5", "", { "dependencies": { "@poppinss/colors": "^4.1.5", "@sindresorhus/is": "^7.0.2", "supports-color": "^10.0.0" } }, "sha512-NBdYIb90J7LfOI32dOewKI1r7wnkiH6m920puQ3qHUeZkxNkQiFnXVWoE6YtFSv6QOiPPf7ys6i+HWWecDz7sw=="], + "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="], - "@poppinss/exception": ["@poppinss/exception@1.2.3", "", {}, "sha512-dCED+QRChTVatE9ibtoaxc+WkdzOSjYTKi/+uacHWIsfodVfpsueo3+DKpgU5Px8qXjgmXkSvhXvSCz3fnP9lw=="], + "@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="], - "@rollup/plugin-commonjs": ["@rollup/plugin-commonjs@29.0.0", "", { "dependencies": { "@rollup/pluginutils": "^5.0.1", "commondir": "^1.0.1", "estree-walker": "^2.0.2", "fdir": "^6.2.0", "is-reference": "1.2.1", "magic-string": "^0.30.3", "picomatch": "^4.0.2" }, "peerDependencies": { "rollup": "^2.68.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-U2YHaxR2cU/yAiwKJtJRhnyLk7cifnQw0zUpISsocBDoHDJn+HTV74ABqnwr5bEgWUwFZC9oFL6wLe21lHu5eQ=="], + "@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="], - "@rollup/plugin-json": ["@rollup/plugin-json@6.1.0", "", { "dependencies": { "@rollup/pluginutils": "^5.1.0" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA=="], - - "@rollup/plugin-node-resolve": ["@rollup/plugin-node-resolve@16.0.3", "", { "dependencies": { "@rollup/pluginutils": "^5.0.1", "@types/resolve": "1.20.2", "deepmerge": "^4.2.2", "is-module": "^1.0.0", "resolve": "^1.22.1" }, "peerDependencies": { "rollup": "^2.78.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-lUYM3UBGuM93CnMPG1YocWu7X802BrNF3jW2zny5gQyLQgRFJhV1Sq0Zi74+dh/6NBx1DxFC4b4GXg9wUCG5Qg=="], - - "@rollup/pluginutils": ["@rollup/pluginutils@5.3.0", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^2.0.2", "picomatch": "^4.0.2" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q=="], + "@paulmillr/qr": ["@paulmillr/qr@0.2.1", "", {}, "sha512-IHnV6A+zxU7XwmKFinmYjUcwlyK9+xkG3/s9KcQhI9BjQKycrJ1JRO+FbNYPwZiPKW3je/DR0k7w8/gLa5eaxQ=="], - "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.57.1", "", { "os": "android", "cpu": "arm" }, "sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg=="], + "@playwright/test": ["@playwright/test@1.58.2", "", { "dependencies": { "playwright": "1.58.2" }, "bin": { "playwright": "cli.js" } }, "sha512-akea+6bHYBBfA9uQqSYmlJXn61cTa+jbO87xVLCWbTqbWadRVmhxlXATaOjOgcBaWU4ePo0wB41KMFv3o35IXA=="], - "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.57.1", "", { "os": "android", "cpu": "arm64" }, "sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w=="], + "@polka/url": ["@polka/url@1.0.0-next.29", "", {}, "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww=="], - "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.57.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg=="], + "@poppinss/colors": ["@poppinss/colors@4.1.5", "", { "dependencies": { "kleur": "^4.1.5" } }, "sha512-FvdDqtcRCtz6hThExcFOgW0cWX+xwSMWcRuQe5ZEb2m7cVQOAVZOIMt+/v9RxGiD9/OY16qJBXK4CVKWAPalBw=="], - "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.57.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w=="], + "@poppinss/dumper": ["@poppinss/dumper@0.6.4", "", { "dependencies": { "@poppinss/colors": "^4.1.5", "@sindresorhus/is": "^7.0.2", "supports-color": "^10.0.0" } }, "sha512-iG0TIdqv8xJ3Lt9O8DrPRxw1MRLjNpoqiSGU03P/wNLP/s0ra0udPJ1J2Tx5M0J3H/cVyEgpbn8xUKRY9j59kQ=="], - "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.57.1", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug=="], + "@poppinss/exception": ["@poppinss/exception@1.2.2", "", {}, "sha512-m7bpKCD4QMlFCjA/nKTs23fuvoVFoA83brRKmObCUNmi/9tVu8Ve3w4YQAnJu4q3Tjf5fr685HYIC/IA2zHRSg=="], - "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.57.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q=="], + "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.46.2", "", { "os": "android", "cpu": "arm" }, "sha512-Zj3Hl6sN34xJtMv7Anwb5Gu01yujyE/cLBDB2gnHTAHaWS1Z38L7kuSG+oAh0giZMqG060f/YBStXtMH6FvPMA=="], - "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.57.1", "", { "os": "linux", "cpu": "arm" }, "sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw=="], + "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.46.2", "", { "os": "android", "cpu": "arm64" }, "sha512-nTeCWY83kN64oQ5MGz3CgtPx8NSOhC5lWtsjTs+8JAJNLcP3QbLCtDDgUKQc/Ro/frpMq4SHUaHN6AMltcEoLQ=="], - "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.57.1", "", { "os": "linux", "cpu": "arm" }, "sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw=="], + "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.46.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-HV7bW2Fb/F5KPdM/9bApunQh68YVDU8sO8BvcW9OngQVN3HHHkw99wFupuUJfGR9pYLLAjcAOA6iO+evsbBaPQ=="], - "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.57.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g=="], + "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.46.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-SSj8TlYV5nJixSsm/y3QXfhspSiLYP11zpfwp6G/YDXctf3Xkdnk4woJIF5VQe0of2OjzTt8EsxnJDCdHd2xMA=="], - "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.57.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q=="], + "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.46.2", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-ZyrsG4TIT9xnOlLsSSi9w/X29tCbK1yegE49RYm3tu3wF1L/B6LVMqnEWyDB26d9Ecx9zrmXCiPmIabVuLmNSg=="], - "@rollup/rollup-linux-loong64-gnu": ["@rollup/rollup-linux-loong64-gnu@4.57.1", "", { "os": "linux", "cpu": "none" }, "sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA=="], + "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.46.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-pCgHFoOECwVCJ5GFq8+gR8SBKnMO+xe5UEqbemxBpCKYQddRQMgomv1104RnLSg7nNvgKy05sLsY51+OVRyiVw=="], - "@rollup/rollup-linux-loong64-musl": ["@rollup/rollup-linux-loong64-musl@4.57.1", "", { "os": "linux", "cpu": "none" }, "sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw=="], + "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.46.2", "", { "os": "linux", "cpu": "arm" }, "sha512-EtP8aquZ0xQg0ETFcxUbU71MZlHaw9MChwrQzatiE8U/bvi5uv/oChExXC4mWhjiqK7azGJBqU0tt5H123SzVA=="], - "@rollup/rollup-linux-ppc64-gnu": ["@rollup/rollup-linux-ppc64-gnu@4.57.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w=="], + "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.46.2", "", { "os": "linux", "cpu": "arm" }, "sha512-qO7F7U3u1nfxYRPM8HqFtLd+raev2K137dsV08q/LRKRLEc7RsiDWihUnrINdsWQxPR9jqZ8DIIZ1zJJAm5PjQ=="], - "@rollup/rollup-linux-ppc64-musl": ["@rollup/rollup-linux-ppc64-musl@4.57.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw=="], + "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.46.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-3dRaqLfcOXYsfvw5xMrxAk9Lb1f395gkoBYzSFcc/scgRFptRXL9DOaDpMiehf9CO8ZDRJW2z45b6fpU5nwjng=="], - "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.57.1", "", { "os": "linux", "cpu": "none" }, "sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A=="], + "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.46.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-fhHFTutA7SM+IrR6lIfiHskxmpmPTJUXpWIsBXpeEwNgZzZZSg/q4i6FU4J8qOGyJ0TR+wXBwx/L7Ho9z0+uDg=="], - "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.57.1", "", { "os": "linux", "cpu": "none" }, "sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw=="], + "@rollup/rollup-linux-loongarch64-gnu": ["@rollup/rollup-linux-loongarch64-gnu@4.46.2", "", { "os": "linux", "cpu": "none" }, "sha512-i7wfGFXu8x4+FRqPymzjD+Hyav8l95UIZ773j7J7zRYc3Xsxy2wIn4x+llpunexXe6laaO72iEjeeGyUFmjKeA=="], - "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.57.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg=="], + "@rollup/rollup-linux-ppc64-gnu": ["@rollup/rollup-linux-ppc64-gnu@4.46.2", "", { "os": "linux", "cpu": "ppc64" }, "sha512-B/l0dFcHVUnqcGZWKcWBSV2PF01YUt0Rvlurci5P+neqY/yMKchGU8ullZvIv5e8Y1C6wOn+U03mrDylP5q9Yw=="], - "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.57.1", "", { "os": "linux", "cpu": "x64" }, "sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg=="], + "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.46.2", "", { "os": "linux", "cpu": "none" }, "sha512-32k4ENb5ygtkMwPMucAb8MtV8olkPT03oiTxJbgkJa7lJ7dZMr0GCFJlyvy+K8iq7F/iuOr41ZdUHaOiqyR3iQ=="], - "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.57.1", "", { "os": "linux", "cpu": "x64" }, "sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw=="], + "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.46.2", "", { "os": "linux", "cpu": "none" }, "sha512-t5B2loThlFEauloaQkZg9gxV05BYeITLvLkWOkRXogP4qHXLkWSbSHKM9S6H1schf/0YGP/qNKtiISlxvfmmZw=="], - "@rollup/rollup-openbsd-x64": ["@rollup/rollup-openbsd-x64@4.57.1", "", { "os": "openbsd", "cpu": "x64" }, "sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw=="], + "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.46.2", "", { "os": "linux", "cpu": "s390x" }, "sha512-YKjekwTEKgbB7n17gmODSmJVUIvj8CX7q5442/CK80L8nqOUbMtf8b01QkG3jOqyr1rotrAnW6B/qiHwfcuWQA=="], - "@rollup/rollup-openharmony-arm64": ["@rollup/rollup-openharmony-arm64@4.57.1", "", { "os": "none", "cpu": "arm64" }, "sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ=="], + "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.46.2", "", { "os": "linux", "cpu": "x64" }, "sha512-Jj5a9RUoe5ra+MEyERkDKLwTXVu6s3aACP51nkfnK9wJTraCC8IMe3snOfALkrjTYd2G1ViE1hICj0fZ7ALBPA=="], - "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.57.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ=="], + "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.46.2", "", { "os": "linux", "cpu": "x64" }, "sha512-7kX69DIrBeD7yNp4A5b81izs8BqoZkCIaxQaOpumcJ1S/kmqNFjPhDu1LHeVXv0SexfHQv5cqHsxLOjETuqDuA=="], - "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.57.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew=="], + "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.46.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-wiJWMIpeaak/jsbaq2HMh/rzZxHVW1rU6coyeNNpMwk5isiPjSTx0a4YLSlYDwBH/WBvLz+EtsNqQScZTLJy3g=="], - "@rollup/rollup-win32-x64-gnu": ["@rollup/rollup-win32-x64-gnu@4.57.1", "", { "os": "win32", "cpu": "x64" }, "sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ=="], + "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.46.2", "", { "os": "win32", "cpu": "ia32" }, "sha512-gBgaUDESVzMgWZhcyjfs9QFK16D8K6QZpwAaVNJxYDLHWayOta4ZMjGm/vsAEy3hvlS2GosVFlBlP9/Wb85DqQ=="], - "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.57.1", "", { "os": "win32", "cpu": "x64" }, "sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA=="], + "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.46.2", "", { "os": "win32", "cpu": "x64" }, "sha512-CvUo2ixeIQGtF6WvuB87XWqPQkoFAFqW+HUo/WzHwuHDvIwZCtjdWXoYCcr06iKGydiqTclC4jU/TNObC/xKZg=="], "@scure/base": ["@scure/base@1.2.6", "", {}, "sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg=="], @@ -377,61 +317,59 @@ "@scure/bip39": ["@scure/bip39@1.6.0", "", { "dependencies": { "@noble/hashes": "~1.8.0", "@scure/base": "~1.2.5" } }, "sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A=="], - "@sindresorhus/is": ["@sindresorhus/is@7.2.0", "", {}, "sha512-P1Cz1dWaFfR4IR+U13mqqiGsLFf1KbayybWwdd2vfctdV6hDpUkgCY0nKOLLTMSoRd/jJNjtbqzf13K8DCCXQw=="], + "@sindresorhus/is": ["@sindresorhus/is@7.0.2", "", {}, "sha512-d9xRovfKNz1SKieM0qJdO+PQonjnnIfSNWfHYnBSJ9hkjm0ZPw6HlxscDXYstp3z+7V2GOFHc+J0CYrYTjqCJw=="], "@socket.io/component-emitter": ["@socket.io/component-emitter@3.1.2", "", {}, "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA=="], - "@speed-highlight/core": ["@speed-highlight/core@1.2.14", "", {}, "sha512-G4ewlBNhUtlLvrJTb88d2mdy2KRijzs4UhnlrOSRT4bmjh/IqNElZa3zkrZ+TC47TwtlDWzVLFADljF1Ijp5hA=="], + "@speed-highlight/core": ["@speed-highlight/core@1.2.7", "", {}, "sha512-0dxmVj4gxg3Jg879kvFS/msl4s9F3T9UXC1InxgOf7t5NvcPD97u/WTA5vL/IxWHMn7qSxBozqrnnE2wvl1m8g=="], - "@standard-schema/spec": ["@standard-schema/spec@1.1.0", "", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="], + "@standard-schema/spec": ["@standard-schema/spec@1.0.0", "", {}, "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA=="], - "@sveltejs/acorn-typescript": ["@sveltejs/acorn-typescript@1.0.9", "", { "peerDependencies": { "acorn": "^8.9.0" } }, "sha512-lVJX6qEgs/4DOcRTpo56tmKzVPtoWAaVbL4hfO7t7NVwl9AAXzQR6cihesW1BmNMPl+bK6dreu2sOKBP2Q9CIA=="], + "@sveltejs/acorn-typescript": ["@sveltejs/acorn-typescript@1.0.5", "", { "peerDependencies": { "acorn": "^8.9.0" } }, "sha512-IwQk4yfwLdibDlrXVE04jTZYlLnwsTT2PIOQQGNLWfjavGifnk1JD1LcZjZaBTRcxZu2FfPfNLOE04DSu9lqtQ=="], - "@sveltejs/adapter-cloudflare": ["@sveltejs/adapter-cloudflare@7.2.8", "", { "dependencies": { "@cloudflare/workers-types": "^4.20250507.0", "worktop": "0.8.0-next.18" }, "peerDependencies": { "@sveltejs/kit": "^2.0.0", "wrangler": "^4.0.0" } }, "sha512-bIdhY/Fi4AQmqiBdQVKnafH1h9Gw+xbCvHyUu4EouC8rJOU02zwhi14k/FDhQ0mJF1iblIu3m8UNQ8GpGIvIOQ=="], + "@sveltejs/adapter-cloudflare": ["@sveltejs/adapter-cloudflare@7.1.3", "", { "dependencies": { "@cloudflare/workers-types": "^4.20250507.0", "worktop": "0.8.0-next.18" }, "peerDependencies": { "@sveltejs/kit": "^2.0.0", "wrangler": "^4.0.0" } }, "sha512-QdZygPQtUjc6Jd8t/yWIOJyBGELRsLk7wag18rbGU+tIpUCLpTC4qEuBDNcER8v5EDQdOqC8CJqZ8P+Bi5ybQw=="], - "@sveltejs/adapter-node": ["@sveltejs/adapter-node@5.5.3", "", { "dependencies": { "@rollup/plugin-commonjs": "^29.0.0", "@rollup/plugin-json": "^6.1.0", "@rollup/plugin-node-resolve": "^16.0.0", "rollup": "^4.9.5" }, "peerDependencies": { "@sveltejs/kit": "^2.4.0" } }, "sha512-yeWbKXBL9vqDb/7R8ebvRHeuBHN4cRYYBSquNJSMQtS6rIYkXxsVSveaMTUaLvHYQsb1zNa+nH2iLTOMawBohA=="], + "@sveltejs/kit": ["@sveltejs/kit@2.27.3", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "@sveltejs/acorn-typescript": "^1.0.5", "@types/cookie": "^0.6.0", "acorn": "^8.14.1", "cookie": "^0.6.0", "devalue": "^5.1.0", "esm-env": "^1.2.2", "kleur": "^4.1.5", "magic-string": "^0.30.5", "mrmime": "^2.0.0", "sade": "^1.8.1", "set-cookie-parser": "^2.6.0", "sirv": "^3.0.0" }, "peerDependencies": { "@sveltejs/vite-plugin-svelte": "^3.0.0 || ^4.0.0-next.1 || ^5.0.0 || ^6.0.0-next.0", "svelte": "^4.0.0 || ^5.0.0-next.0", "vite": "^5.0.3 || ^6.0.0 || ^7.0.0-beta.0" }, "bin": { "svelte-kit": "svelte-kit.js" } }, "sha512-jiG3NGZ8RRpi+ncjVnX+oR7uWEgzy//3YLGcTU5mHtjGraeGyNDr7GJFHlk7z0vi8bMXpXIUkEXj6p70FJmHvw=="], - "@sveltejs/kit": ["@sveltejs/kit@2.52.2", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "@sveltejs/acorn-typescript": "^1.0.5", "@types/cookie": "^0.6.0", "acorn": "^8.14.1", "cookie": "^0.6.0", "devalue": "^5.6.3", "esm-env": "^1.2.2", "kleur": "^4.1.5", "magic-string": "^0.30.5", "mrmime": "^2.0.0", "set-cookie-parser": "^3.0.0", "sirv": "^3.0.0" }, "peerDependencies": { "@opentelemetry/api": "^1.0.0", "@sveltejs/vite-plugin-svelte": "^3.0.0 || ^4.0.0-next.1 || ^5.0.0 || ^6.0.0-next.0", "svelte": "^4.0.0 || ^5.0.0-next.0", "typescript": "^5.3.3", "vite": "^5.0.3 || ^6.0.0 || ^7.0.0-beta.0" }, "optionalPeers": ["@opentelemetry/api", "typescript"], "bin": { "svelte-kit": "svelte-kit.js" } }, "sha512-1in76dftrofUt138rVLvYuwiQLkg9K3cG8agXEE6ksf7gCGs8oIr3+pFrVtbRmY9JvW+psW5fvLM/IwVybOLBA=="], + "@sveltejs/vite-plugin-svelte": ["@sveltejs/vite-plugin-svelte@6.1.1", "", { "dependencies": { "@sveltejs/vite-plugin-svelte-inspector": "^5.0.0", "debug": "^4.4.1", "deepmerge": "^4.3.1", "kleur": "^4.1.5", "magic-string": "^0.30.17", "vitefu": "^1.1.1" }, "peerDependencies": { "svelte": "^5.0.0", "vite": "^6.3.0 || ^7.0.0" } }, "sha512-vB0Vq47Js7C11L2JrwhncIAoDNkdKDPI500SjLSb34X48dDcsSH5JpLl0cHT0sfO997BrzAS6PKjiZEey/S0VQ=="], - "@sveltejs/vite-plugin-svelte": ["@sveltejs/vite-plugin-svelte@6.2.4", "", { "dependencies": { "@sveltejs/vite-plugin-svelte-inspector": "^5.0.0", "deepmerge": "^4.3.1", "magic-string": "^0.30.21", "obug": "^2.1.0", "vitefu": "^1.1.1" }, "peerDependencies": { "svelte": "^5.0.0", "vite": "^6.3.0 || ^7.0.0" } }, "sha512-ou/d51QSdTyN26D7h6dSpusAKaZkAiGM55/AKYi+9AGZw7q85hElbjK3kEyzXHhLSnRISHOYzVge6x0jRZ7DXA=="], + "@sveltejs/vite-plugin-svelte-inspector": ["@sveltejs/vite-plugin-svelte-inspector@5.0.0", "", { "dependencies": { "debug": "^4.4.1" }, "peerDependencies": { "@sveltejs/vite-plugin-svelte": "^6.0.0-next.0", "svelte": "^5.0.0", "vite": "^6.3.0 || ^7.0.0" } }, "sha512-iwQ8Z4ET6ZFSt/gC+tVfcsSBHwsqc6RumSaiLUkAurW3BCpJam65cmHw0oOlDMTO0u+PZi9hilBRYN+LZNHTUQ=="], - "@sveltejs/vite-plugin-svelte-inspector": ["@sveltejs/vite-plugin-svelte-inspector@5.0.2", "", { "dependencies": { "obug": "^2.1.0" }, "peerDependencies": { "@sveltejs/vite-plugin-svelte": "^6.0.0-next.0", "svelte": "^5.0.0", "vite": "^6.3.0 || ^7.0.0" } }, "sha512-TZzRTcEtZffICSAoZGkPSl6Etsj2torOVrx6Uw0KpXxrec9Gg6jFWQ60Q3+LmNGfZSxHRCZL7vXVZIWmuV50Ig=="], + "@tailwindcss/node": ["@tailwindcss/node@4.1.11", "", { "dependencies": { "@ampproject/remapping": "^2.3.0", "enhanced-resolve": "^5.18.1", "jiti": "^2.4.2", "lightningcss": "1.30.1", "magic-string": "^0.30.17", "source-map-js": "^1.2.1", "tailwindcss": "4.1.11" } }, "sha512-yzhzuGRmv5QyU9qLNg4GTlYI6STedBWRE7NjxP45CsFYYq9taI0zJXZBMqIC/c8fViNLhmrbpSFS57EoxUmD6Q=="], - "@tailwindcss/node": ["@tailwindcss/node@4.2.0", "", { "dependencies": { "@jridgewell/remapping": "^2.3.5", "enhanced-resolve": "^5.19.0", "jiti": "^2.6.1", "lightningcss": "1.31.1", "magic-string": "^0.30.21", "source-map-js": "^1.2.1", "tailwindcss": "4.2.0" } }, "sha512-Yv+fn/o2OmL5fh/Ir62VXItdShnUxfpkMA4Y7jdeC8O81WPB8Kf6TT6GSHvnqgSwDzlB5iT7kDpeXxLsUS0T6Q=="], + "@tailwindcss/oxide": ["@tailwindcss/oxide@4.1.11", "", { "dependencies": { "detect-libc": "^2.0.4", "tar": "^7.4.3" }, "optionalDependencies": { "@tailwindcss/oxide-android-arm64": "4.1.11", "@tailwindcss/oxide-darwin-arm64": "4.1.11", "@tailwindcss/oxide-darwin-x64": "4.1.11", "@tailwindcss/oxide-freebsd-x64": "4.1.11", "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.11", "@tailwindcss/oxide-linux-arm64-gnu": "4.1.11", "@tailwindcss/oxide-linux-arm64-musl": "4.1.11", "@tailwindcss/oxide-linux-x64-gnu": "4.1.11", "@tailwindcss/oxide-linux-x64-musl": "4.1.11", "@tailwindcss/oxide-wasm32-wasi": "4.1.11", "@tailwindcss/oxide-win32-arm64-msvc": "4.1.11", "@tailwindcss/oxide-win32-x64-msvc": "4.1.11" } }, "sha512-Q69XzrtAhuyfHo+5/HMgr1lAiPP/G40OMFAnws7xcFEYqcypZmdW8eGXaOUIeOl1dzPJBPENXgbjsOyhg2nkrg=="], - "@tailwindcss/oxide": ["@tailwindcss/oxide@4.2.0", "", { "optionalDependencies": { "@tailwindcss/oxide-android-arm64": "4.2.0", "@tailwindcss/oxide-darwin-arm64": "4.2.0", "@tailwindcss/oxide-darwin-x64": "4.2.0", "@tailwindcss/oxide-freebsd-x64": "4.2.0", "@tailwindcss/oxide-linux-arm-gnueabihf": "4.2.0", "@tailwindcss/oxide-linux-arm64-gnu": "4.2.0", "@tailwindcss/oxide-linux-arm64-musl": "4.2.0", "@tailwindcss/oxide-linux-x64-gnu": "4.2.0", "@tailwindcss/oxide-linux-x64-musl": "4.2.0", "@tailwindcss/oxide-wasm32-wasi": "4.2.0", "@tailwindcss/oxide-win32-arm64-msvc": "4.2.0", "@tailwindcss/oxide-win32-x64-msvc": "4.2.0" } }, "sha512-AZqQzADaj742oqn2xjl5JbIOzZB/DGCYF/7bpvhA8KvjUj9HJkag6bBuwZvH1ps6dfgxNHyuJVlzSr2VpMgdTQ=="], + "@tailwindcss/oxide-android-arm64": ["@tailwindcss/oxide-android-arm64@4.1.11", "", { "os": "android", "cpu": "arm64" }, "sha512-3IfFuATVRUMZZprEIx9OGDjG3Ou3jG4xQzNTvjDoKmU9JdmoCohQJ83MYd0GPnQIu89YoJqvMM0G3uqLRFtetg=="], - "@tailwindcss/oxide-android-arm64": ["@tailwindcss/oxide-android-arm64@4.2.0", "", { "os": "android", "cpu": "arm64" }, "sha512-F0QkHAVaW/JNBWl4CEKWdZ9PMb0khw5DCELAOnu+RtjAfx5Zgw+gqCHFvqg3AirU1IAd181fwOtJQ5I8Yx5wtw=="], + "@tailwindcss/oxide-darwin-arm64": ["@tailwindcss/oxide-darwin-arm64@4.1.11", "", { "os": "darwin", "cpu": "arm64" }, "sha512-ESgStEOEsyg8J5YcMb1xl8WFOXfeBmrhAwGsFxxB2CxY9evy63+AtpbDLAyRkJnxLy2WsD1qF13E97uQyP1lfQ=="], - "@tailwindcss/oxide-darwin-arm64": ["@tailwindcss/oxide-darwin-arm64@4.2.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-I0QylkXsBsJMZ4nkUNSR04p6+UptjcwhcVo3Zu828ikiEqHjVmQL9RuQ6uT/cVIiKpvtVA25msu/eRV97JeNSA=="], + "@tailwindcss/oxide-darwin-x64": ["@tailwindcss/oxide-darwin-x64@4.1.11", "", { "os": "darwin", "cpu": "x64" }, "sha512-EgnK8kRchgmgzG6jE10UQNaH9Mwi2n+yw1jWmof9Vyg2lpKNX2ioe7CJdf9M5f8V9uaQxInenZkOxnTVL3fhAw=="], - "@tailwindcss/oxide-darwin-x64": ["@tailwindcss/oxide-darwin-x64@4.2.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-6TmQIn4p09PBrmnkvbYQ0wbZhLtbaksCDx7Y7R3FYYx0yxNA7xg5KP7dowmQ3d2JVdabIHvs3Hx4K3d5uCf8xg=="], + "@tailwindcss/oxide-freebsd-x64": ["@tailwindcss/oxide-freebsd-x64@4.1.11", "", { "os": "freebsd", "cpu": "x64" }, "sha512-xdqKtbpHs7pQhIKmqVpxStnY1skuNh4CtbcyOHeX1YBE0hArj2romsFGb6yUmzkq/6M24nkxDqU8GYrKrz+UcA=="], - "@tailwindcss/oxide-freebsd-x64": ["@tailwindcss/oxide-freebsd-x64@4.2.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-qBudxDvAa2QwGlq9y7VIzhTvp2mLJ6nD/G8/tI70DCDoneaUeLWBJaPcbfzqRIWraj+o969aDQKvKW9dvkUizw=="], + "@tailwindcss/oxide-linux-arm-gnueabihf": ["@tailwindcss/oxide-linux-arm-gnueabihf@4.1.11", "", { "os": "linux", "cpu": "arm" }, "sha512-ryHQK2eyDYYMwB5wZL46uoxz2zzDZsFBwfjssgB7pzytAeCCa6glsiJGjhTEddq/4OsIjsLNMAiMlHNYnkEEeg=="], - "@tailwindcss/oxide-linux-arm-gnueabihf": ["@tailwindcss/oxide-linux-arm-gnueabihf@4.2.0", "", { "os": "linux", "cpu": "arm" }, "sha512-7XKkitpy5NIjFZNUQPeUyNJNJn1CJeV7rmMR+exHfTuOsg8rxIO9eNV5TSEnqRcaOK77zQpsyUkBWmPy8FgdSg=="], + "@tailwindcss/oxide-linux-arm64-gnu": ["@tailwindcss/oxide-linux-arm64-gnu@4.1.11", "", { "os": "linux", "cpu": "arm64" }, "sha512-mYwqheq4BXF83j/w75ewkPJmPZIqqP1nhoghS9D57CLjsh3Nfq0m4ftTotRYtGnZd3eCztgbSPJ9QhfC91gDZQ=="], - "@tailwindcss/oxide-linux-arm64-gnu": ["@tailwindcss/oxide-linux-arm64-gnu@4.2.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-Mff5a5Q3WoQR01pGU1gr29hHM1N93xYrKkGXfPw/aRtK4bOc331Ho4Tgfsm5WDGvpevqMpdlkCojT3qlCQbCpA=="], + "@tailwindcss/oxide-linux-arm64-musl": ["@tailwindcss/oxide-linux-arm64-musl@4.1.11", "", { "os": "linux", "cpu": "arm64" }, "sha512-m/NVRFNGlEHJrNVk3O6I9ggVuNjXHIPoD6bqay/pubtYC9QIdAMpS+cswZQPBLvVvEF6GtSNONbDkZrjWZXYNQ=="], - "@tailwindcss/oxide-linux-arm64-musl": ["@tailwindcss/oxide-linux-arm64-musl@4.2.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-XKcSStleEVnbH6W/9DHzZv1YhjE4eSS6zOu2eRtYAIh7aV4o3vIBs+t/B15xlqoxt6ef/0uiqJVB6hkHjWD/0A=="], + "@tailwindcss/oxide-linux-x64-gnu": ["@tailwindcss/oxide-linux-x64-gnu@4.1.11", "", { "os": "linux", "cpu": "x64" }, "sha512-YW6sblI7xukSD2TdbbaeQVDysIm/UPJtObHJHKxDEcW2exAtY47j52f8jZXkqE1krdnkhCMGqP3dbniu1Te2Fg=="], - "@tailwindcss/oxide-linux-x64-gnu": ["@tailwindcss/oxide-linux-x64-gnu@4.2.0", "", { "os": "linux", "cpu": "x64" }, "sha512-/hlXCBqn9K6fi7eAM0RsobHwJYa5V/xzWspVTzxnX+Ft9v6n+30Pz8+RxCn7sQL/vRHHLS30iQPrHQunu6/vJA=="], + "@tailwindcss/oxide-linux-x64-musl": ["@tailwindcss/oxide-linux-x64-musl@4.1.11", "", { "os": "linux", "cpu": "x64" }, "sha512-e3C/RRhGunWYNC3aSF7exsQkdXzQ/M+aYuZHKnw4U7KQwTJotnWsGOIVih0s2qQzmEzOFIJ3+xt7iq67K/p56Q=="], - "@tailwindcss/oxide-linux-x64-musl": ["@tailwindcss/oxide-linux-x64-musl@4.2.0", "", { "os": "linux", "cpu": "x64" }, "sha512-lKUaygq4G7sWkhQbfdRRBkaq4LY39IriqBQ+Gk6l5nKq6Ay2M2ZZb1tlIyRNgZKS8cbErTwuYSor0IIULC0SHw=="], + "@tailwindcss/oxide-wasm32-wasi": ["@tailwindcss/oxide-wasm32-wasi@4.1.11", "", { "cpu": "none" }, "sha512-Xo1+/GU0JEN/C/dvcammKHzeM6NqKovG+6921MR6oadee5XPBaKOumrJCXvopJ/Qb5TH7LX/UAywbqrP4lax0g=="], - "@tailwindcss/oxide-wasm32-wasi": ["@tailwindcss/oxide-wasm32-wasi@4.2.0", "", { "dependencies": { "@emnapi/core": "^1.8.1", "@emnapi/runtime": "^1.8.1", "@emnapi/wasi-threads": "^1.1.0", "@napi-rs/wasm-runtime": "^1.1.1", "@tybys/wasm-util": "^0.10.1", "tslib": "^2.8.1" }, "cpu": "none" }, "sha512-xuDjhAsFdUuFP5W9Ze4k/o4AskUtI8bcAGU4puTYprr89QaYFmhYOPfP+d1pH+k9ets6RoE23BXZM1X1jJqoyw=="], + "@tailwindcss/oxide-win32-arm64-msvc": ["@tailwindcss/oxide-win32-arm64-msvc@4.1.11", "", { "os": "win32", "cpu": "arm64" }, "sha512-UgKYx5PwEKrac3GPNPf6HVMNhUIGuUh4wlDFR2jYYdkX6pL/rn73zTq/4pzUm8fOjAn5L8zDeHp9iXmUGOXZ+w=="], - "@tailwindcss/oxide-win32-arm64-msvc": ["@tailwindcss/oxide-win32-arm64-msvc@4.2.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-2UU/15y1sWDEDNJXxEIrfWKC2Yb4YgIW5Xz2fKFqGzFWfoMHWFlfa1EJlGO2Xzjkq/tvSarh9ZTjvbxqWvLLXA=="], + "@tailwindcss/oxide-win32-x64-msvc": ["@tailwindcss/oxide-win32-x64-msvc@4.1.11", "", { "os": "win32", "cpu": "x64" }, "sha512-YfHoggn1j0LK7wR82TOucWc5LDCguHnoS879idHekmmiR7g9HUtMw9MI0NHatS28u/Xlkfi9w5RJWgz2Dl+5Qg=="], - "@tailwindcss/oxide-win32-x64-msvc": ["@tailwindcss/oxide-win32-x64-msvc@4.2.0", "", { "os": "win32", "cpu": "x64" }, "sha512-CrFadmFoc+z76EV6LPG1jx6XceDsaCG3lFhyLNo/bV9ByPrE+FnBPckXQVP4XRkN76h3Fjt/a+5Er/oA/nCBvQ=="], - - "@tailwindcss/vite": ["@tailwindcss/vite@4.2.0", "", { "dependencies": { "@tailwindcss/node": "4.2.0", "@tailwindcss/oxide": "4.2.0", "tailwindcss": "4.2.0" }, "peerDependencies": { "vite": "^5.2.0 || ^6 || ^7" } }, "sha512-da9mFCaHpoOgtQiWtDGIikTrSpUFBtIZCG3jy/u2BGV+l/X1/pbxzmIUxNt6JWm19N3WtGi4KlJdSH/Si83WOA=="], + "@tailwindcss/vite": ["@tailwindcss/vite@4.1.11", "", { "dependencies": { "@tailwindcss/node": "4.1.11", "@tailwindcss/oxide": "4.1.11", "tailwindcss": "4.1.11" }, "peerDependencies": { "vite": "^5.2.0 || ^6 || ^7" } }, "sha512-RHYhrR3hku0MJFRV+fN2gNbDNEh3dwKvY8XJvTxCSXeMOsCRSr+uKvDWQcbizrHgjML6ZmTE5OwMrl5wKcujCw=="], "@tanstack/query-core": ["@tanstack/query-core@5.90.20", "", {}, "sha512-OMD2HLpNouXEfZJWcKeVKUgQ5n+n3A2JFmBaScpNDUqSrQSjiveC7dKMe53uJUg1nDG16ttFPz2xfilz6i2uVg=="], "@tanstack/react-query": ["@tanstack/react-query@5.90.21", "", { "dependencies": { "@tanstack/query-core": "5.90.20" }, "peerDependencies": { "react": "^18 || ^19" } }, "sha512-0Lu6y5t+tvlTJMTO7oh5NSpJfpg/5D41LlThfepTixPYkJ0sE2Jj0m0f6yYqujBwIXlId87e234+MxG3D3g7kg=="], - "@types/bun": ["@types/bun@1.3.9", "", { "dependencies": { "bun-types": "1.3.9" } }, "sha512-KQ571yULOdWJiMH+RIWIOZ7B2RXQGpL1YQrBtLIV3FqDcCu6FsbFUBwhdKUlCKUpS3PJDsHlJ1QKlpxoVR+xtw=="], + "@types/bun": ["@types/bun@1.3.8", "", { "dependencies": { "bun-types": "1.3.8" } }, "sha512-3LvWJ2q5GerAXYxO2mffLTqOzEu5qnhEAlh48Vnu8WQfnmSwbgagjGZV6BoHKJztENYEDn6QmVd949W4uESRJA=="], "@types/cookie": ["@types/cookie@0.6.0", "", {}, "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA=="], @@ -443,42 +381,40 @@ "@types/ms": ["@types/ms@2.1.0", "", {}, "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA=="], - "@types/node": ["@types/node@25.3.0", "", { "dependencies": { "undici-types": "~7.18.0" } }, "sha512-4K3bqJpXpqfg2XKGK9bpDTc6xO/xoUP/RBWS7AtRMug6zZFaRekiLzjVtAoZMquxoAbzBvy5nxQ7veS5eYzf8A=="], - - "@types/resolve": ["@types/resolve@1.20.2", "", {}, "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q=="], - - "@types/trusted-types": ["@types/trusted-types@2.0.7", "", {}, "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw=="], + "@types/node": ["@types/node@25.2.2", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-BkmoP5/FhRYek5izySdkOneRyXYN35I860MFAGupTdebyE66uZaR+bXLHq8k4DirE5DwQi3NuhvRU1jqTVwUrQ=="], - "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.56.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.12.2", "@typescript-eslint/scope-manager": "8.56.0", "@typescript-eslint/type-utils": "8.56.0", "@typescript-eslint/utils": "8.56.0", "@typescript-eslint/visitor-keys": "8.56.0", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.4.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.56.0", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-lRyPDLzNCuae71A3t9NEINBiTn7swyOhvUj3MyUOxb8x6g6vPEFoOU+ZRmGMusNC3X3YMhqMIX7i8ShqhT74Pw=="], + "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.39.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "8.39.0", "@typescript-eslint/type-utils": "8.39.0", "@typescript-eslint/utils": "8.39.0", "@typescript-eslint/visitor-keys": "8.39.0", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.39.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-bhEz6OZeUR+O/6yx9Jk6ohX6H9JSFTaiY0v9/PuKT3oGK0rn0jNplLmyFUGV+a9gfYnVNwGDwS/UkLIuXNb2Rw=="], - "@typescript-eslint/parser": ["@typescript-eslint/parser@8.56.0", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.56.0", "@typescript-eslint/types": "8.56.0", "@typescript-eslint/typescript-estree": "8.56.0", "@typescript-eslint/visitor-keys": "8.56.0", "debug": "^4.4.3" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-IgSWvLobTDOjnaxAfDTIHaECbkNlAlKv2j5SjpB2v7QHKv1FIfjwMy8FsDbVfDX/KjmCmYICcw7uGaXLhtsLNg=="], + "@typescript-eslint/parser": ["@typescript-eslint/parser@8.39.0", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.39.0", "@typescript-eslint/types": "8.39.0", "@typescript-eslint/typescript-estree": "8.39.0", "@typescript-eslint/visitor-keys": "8.39.0", "debug": "^4.3.4" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-g3WpVQHngx0aLXn6kfIYCZxM6rRJlWzEkVpqEFLT3SgEDsp9cpCbxxgwnE504q4H+ruSDh/VGS6nqZIDynP+vg=="], - "@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.56.0", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.56.0", "@typescript-eslint/types": "^8.56.0", "debug": "^4.4.3" }, "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-M3rnyL1vIQOMeWxTWIW096/TtVP+8W3p/XnaFflhmcFp+U4zlxUxWj4XwNs6HbDeTtN4yun0GNTTDBw/SvufKg=="], + "@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.39.0", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.39.0", "@typescript-eslint/types": "^8.39.0", "debug": "^4.3.4" }, "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-CTzJqaSq30V/Z2Og9jogzZt8lJRR5TKlAdXmWgdu4hgcC9Kww5flQ+xFvMxIBWVNdxJO7OifgdOK4PokMIWPew=="], - "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.56.0", "", { "dependencies": { "@typescript-eslint/types": "8.56.0", "@typescript-eslint/visitor-keys": "8.56.0" } }, "sha512-7UiO/XwMHquH+ZzfVCfUNkIXlp/yQjjnlYUyYz7pfvlK3/EyyN6BK+emDmGNyQLBtLGaYrTAI6KOw8tFucWL2w=="], + "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.39.0", "", { "dependencies": { "@typescript-eslint/types": "8.39.0", "@typescript-eslint/visitor-keys": "8.39.0" } }, "sha512-8QOzff9UKxOh6npZQ/4FQu4mjdOCGSdO3p44ww0hk8Vu+IGbg0tB/H1LcTARRDzGCC8pDGbh2rissBuuoPgH8A=="], - "@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.56.0", "", { "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-bSJoIIt4o3lKXD3xmDh9chZcjCz5Lk8xS7Rxn+6l5/pKrDpkCwtQNQQwZ2qRPk7TkUYhrq3WPIHXOXlbXP0itg=="], + "@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.39.0", "", { "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-Fd3/QjmFV2sKmvv3Mrj8r6N8CryYiCS8Wdb/6/rgOXAWGcFuc+VkQuG28uk/4kVNVZBQuuDHEDUpo/pQ32zsIQ=="], - "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.56.0", "", { "dependencies": { "@typescript-eslint/types": "8.56.0", "@typescript-eslint/typescript-estree": "8.56.0", "@typescript-eslint/utils": "8.56.0", "debug": "^4.4.3", "ts-api-utils": "^2.4.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-qX2L3HWOU2nuDs6GzglBeuFXviDODreS58tLY/BALPC7iu3Fa+J7EOTwnX9PdNBxUI7Uh0ntP0YWGnxCkXzmfA=="], + "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.39.0", "", { "dependencies": { "@typescript-eslint/types": "8.39.0", "@typescript-eslint/typescript-estree": "8.39.0", "@typescript-eslint/utils": "8.39.0", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-6B3z0c1DXVT2vYA9+z9axjtc09rqKUPRmijD5m9iv8iQpHBRYRMBcgxSiKTZKm6FwWw1/cI4v6em35OsKCiN5Q=="], - "@typescript-eslint/types": ["@typescript-eslint/types@8.56.0", "", {}, "sha512-DBsLPs3GsWhX5HylbP9HNG15U0bnwut55Lx12bHB9MpXxQ+R5GC8MwQe+N1UFXxAeQDvEsEDY6ZYwX03K7Z6HQ=="], + "@typescript-eslint/types": ["@typescript-eslint/types@8.39.0", "", {}, "sha512-ArDdaOllnCj3yn/lzKn9s0pBQYmmyme/v1HbGIGB0GB/knFI3fWMHloC+oYTJW46tVbYnGKTMDK4ah1sC2v0Kg=="], - "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.56.0", "", { "dependencies": { "@typescript-eslint/project-service": "8.56.0", "@typescript-eslint/tsconfig-utils": "8.56.0", "@typescript-eslint/types": "8.56.0", "@typescript-eslint/visitor-keys": "8.56.0", "debug": "^4.4.3", "minimatch": "^9.0.5", "semver": "^7.7.3", "tinyglobby": "^0.2.15", "ts-api-utils": "^2.4.0" }, "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-ex1nTUMWrseMltXUHmR2GAQ4d+WjkZCT4f+4bVsps8QEdh0vlBsaCokKTPlnqBFqqGaxilDNJG7b8dolW2m43Q=="], + "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.39.0", "", { "dependencies": { "@typescript-eslint/project-service": "8.39.0", "@typescript-eslint/tsconfig-utils": "8.39.0", "@typescript-eslint/types": "8.39.0", "@typescript-eslint/visitor-keys": "8.39.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-ndWdiflRMvfIgQRpckQQLiB5qAKQ7w++V4LlCHwp62eym1HLB/kw7D9f2e8ytONls/jt89TEasgvb+VwnRprsw=="], - "@typescript-eslint/utils": ["@typescript-eslint/utils@8.56.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", "@typescript-eslint/scope-manager": "8.56.0", "@typescript-eslint/types": "8.56.0", "@typescript-eslint/typescript-estree": "8.56.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-RZ3Qsmi2nFGsS+n+kjLAYDPVlrzf7UhTffrDIKr+h2yzAlYP/y5ZulU0yeDEPItos2Ph46JAL5P/On3pe7kDIQ=="], + "@typescript-eslint/utils": ["@typescript-eslint/utils@8.39.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", "@typescript-eslint/scope-manager": "8.39.0", "@typescript-eslint/types": "8.39.0", "@typescript-eslint/typescript-estree": "8.39.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-4GVSvNA0Vx1Ktwvf4sFE+exxJ3QGUorQG1/A5mRfRNZtkBT2xrA/BCO2H0eALx/PnvCS6/vmYwRdDA41EoffkQ=="], - "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.56.0", "", { "dependencies": { "@typescript-eslint/types": "8.56.0", "eslint-visitor-keys": "^5.0.0" } }, "sha512-q+SL+b+05Ud6LbEE35qe4A99P+htKTKVbyiNEe45eCbJFyh/HVK9QXwlrbz+Q4L8SOW4roxSVwXYj4DMBT7Ieg=="], + "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.39.0", "", { "dependencies": { "@typescript-eslint/types": "8.39.0", "eslint-visitor-keys": "^4.2.1" } }, "sha512-ldgiJ+VAhQCfIjeOgu8Kj5nSxds0ktPOSO9p4+0VDH2R2pLvQraaM5Oen2d7NxzMCm+Sn/vJT+mv2H5u6b/3fA=="], "@wagmi/connectors": ["@wagmi/connectors@7.2.1", "", { "peerDependencies": { "@base-org/account": "^2.5.1", "@coinbase/wallet-sdk": "^4.3.6", "@metamask/sdk": "~0.33.1", "@safe-global/safe-apps-provider": "~0.18.6", "@safe-global/safe-apps-sdk": "^9.1.0", "@wagmi/core": "3.4.0", "@walletconnect/ethereum-provider": "^2.21.1", "porto": "~0.2.35", "typescript": ">=5.7.3", "viem": "2.x" }, "optionalPeers": ["@base-org/account", "@coinbase/wallet-sdk", "@metamask/sdk", "@safe-global/safe-apps-provider", "@safe-global/safe-apps-sdk", "@walletconnect/ethereum-provider", "porto", "typescript"] }, "sha512-/tyDepUMDM8eNzNX3ofjqHNRFZ6XcZ3u0+cQp5x0/LHCpMA8tRh7A1/e7dTrYiIJeL7iLgHzfHUXCsU02OKMLQ=="], "@wagmi/core": ["@wagmi/core@3.4.0", "", { "dependencies": { "eventemitter3": "5.0.1", "mipd": "0.0.7", "zustand": "5.0.0" }, "peerDependencies": { "@tanstack/query-core": ">=5.0.0", "ox": ">=0.11.1", "typescript": ">=5.7.3", "viem": "2.x" }, "optionalPeers": ["@tanstack/query-core", "ox", "typescript"] }, "sha512-EU5gDsUp5t7+cuLv12/L8hfyWfCIKsBNiiBqpOqxZJxvAcAiQk4xFe2jMgaQPqApc3Omvxrk032M8AQ4N0cQeg=="], - "abitype": ["abitype@1.2.3", "", { "peerDependencies": { "typescript": ">=5.0.4", "zod": "^3.22.0 || ^4.0.0" }, "optionalPeers": ["typescript", "zod"] }, "sha512-Ofer5QUnuUdTFsBRwARMoWKOH1ND5ehwYhJ3OJ/BQO+StkwQjHw0XyVh4vDttzHB7QOFhPHa/o413PJ82gU/Tg=="], + "abitype": ["abitype@1.2.3", "", { "peerDependencies": { "typescript": ">=5.0.4", "zod": "^3.22.0 || ^4.0.0" } }, "sha512-Ofer5QUnuUdTFsBRwARMoWKOH1ND5ehwYhJ3OJ/BQO+StkwQjHw0XyVh4vDttzHB7QOFhPHa/o413PJ82gU/Tg=="], - "acorn": ["acorn@8.15.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg=="], + "acorn": ["acorn@8.15.0", "", { "bin": "bin/acorn" }, "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg=="], "acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="], + "acorn-walk": ["acorn-walk@8.3.2", "", {}, "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A=="], + "ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], "ansi-escapes": ["ansi-escapes@7.3.0", "", { "dependencies": { "environment": "^1.0.0" } }, "sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg=="], @@ -495,7 +431,7 @@ "available-typed-arrays": ["available-typed-arrays@1.0.7", "", { "dependencies": { "possible-typed-array-names": "^1.0.0" } }, "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ=="], - "axios": ["axios@1.13.5", "", { "dependencies": { "follow-redirects": "^1.15.11", "form-data": "^4.0.5", "proxy-from-env": "^1.1.0" } }, "sha512-cz4ur7Vb0xS4/KUN0tPWe44eqxrIu31me+fbang3ijiNscE129POzipJJA6zniq2C/Z6sJCjMimjS8Lc/GAs8Q=="], + "axios": ["axios@1.11.0", "", { "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.4", "proxy-from-env": "^1.1.0" } }, "sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA=="], "axobject-query": ["axobject-query@4.1.0", "", {}, "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ=="], @@ -515,7 +451,7 @@ "bufferutil": ["bufferutil@4.1.0", "", { "dependencies": { "node-gyp-build": "^4.3.0" } }, "sha512-ZMANVnAixE6AWWnPzlW2KpUrxhm9woycYvPOo67jWHyFowASTEd9s+QN1EIMsSDtwhIxN4sWE1jotpuDUIgyIw=="], - "bun-types": ["bun-types@1.3.9", "", { "dependencies": { "@types/node": "*" } }, "sha512-+UBWWOakIP4Tswh0Bt0QD0alpTY8cb5hvgiYeWCMet9YukHbzuruIEeXC2D7nMJPB12kbh8C7XJykSexEqGKJg=="], + "bun-types": ["bun-types@1.3.8", "", { "dependencies": { "@types/node": "*" } }, "sha512-fL99nxdOWvV4LqjmC+8Q9kW3M4QTtTR1eePs94v5ctGqU8OeceWrSUaRw3JYb7tU3FkMIAjkueehrHPPPGKi5Q=="], "call-bind": ["call-bind@1.0.8", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.0", "es-define-property": "^1.0.0", "get-intrinsic": "^1.2.4", "set-function-length": "^1.2.2" } }, "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww=="], @@ -525,30 +461,32 @@ "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], - "cat-swapper": ["cat-swapper@workspace:app/issue-intent"], - - "chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="], + "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], "chokidar": ["chokidar@4.0.3", "", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="], + "chownr": ["chownr@3.0.0", "", {}, "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g=="], + "cli-cursor": ["cli-cursor@5.0.0", "", { "dependencies": { "restore-cursor": "^5.0.0" } }, "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw=="], "cli-truncate": ["cli-truncate@4.0.0", "", { "dependencies": { "slice-ansi": "^5.0.0", "string-width": "^7.0.0" } }, "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA=="], "clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="], + "color": ["color@4.2.3", "", { "dependencies": { "color-convert": "^2.0.1", "color-string": "^1.9.0" } }, "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A=="], + "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + "color-string": ["color-string@1.9.1", "", { "dependencies": { "color-name": "^1.0.0", "simple-swizzle": "^0.2.2" } }, "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg=="], + "colorette": ["colorette@2.0.20", "", {}, "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w=="], "combined-stream": ["combined-stream@1.0.8", "", { "dependencies": { "delayed-stream": "~1.0.0" } }, "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg=="], "commander": ["commander@14.0.3", "", {}, "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw=="], - "commondir": ["commondir@1.0.1", "", {}, "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg=="], - "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="], "cookie": ["cookie@0.6.0", "", {}, "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw=="], @@ -561,11 +499,11 @@ "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], - "cssesc": ["cssesc@3.0.0", "", { "bin": { "cssesc": "bin/cssesc" } }, "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="], + "cssesc": ["cssesc@3.0.0", "", { "bin": "bin/cssesc" }, "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="], "date-fns": ["date-fns@2.30.0", "", { "dependencies": { "@babel/runtime": "^7.21.0" } }, "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw=="], - "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], + "debug": ["debug@4.4.1", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ=="], "deep-is": ["deep-is@0.1.4", "", {}, "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="], @@ -573,13 +511,15 @@ "define-data-property": ["define-data-property@1.1.4", "", { "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", "gopd": "^1.0.1" } }, "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A=="], + "defu": ["defu@6.1.4", "", {}, "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg=="], + "delayed-stream": ["delayed-stream@1.0.0", "", {}, "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="], "detect-browser": ["detect-browser@5.3.0", "", {}, "sha512-53rsFbGdwMwlF7qvCt0ypLM5V5/Mbl0szB7GPN8y9NCcbknYOeVVXdrXEq+90IwAfrrzt6Hd+u2E2ntakICU8w=="], - "detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="], + "detect-libc": ["detect-libc@2.0.4", "", {}, "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA=="], - "devalue": ["devalue@5.6.3", "", {}, "sha512-nc7XjUU/2Lb+SvEFVGcWLiKkzfw8+qHI7zn8WYXKkLMgfGSHbgCEaR6bJpev8Cm6Rmrb19Gfd/tZvGqx9is3wg=="], + "devalue": ["devalue@5.1.1", "", {}, "sha512-maua5KUiapvEwiEAe+XnlZ3Rh0GD+qI1J/nb9vrJc3muPXvcF/8gXYTWF76+5DAqHyDUtOIImEuo0YKE9mshVw=="], "dotenv": ["dotenv@17.3.1", "", {}, "sha512-IO8C/dzEb6O3F9/twg6ZLXz164a2fhTnEWb95H23Dm4OuN+92NmEAlTrupP9VW6Jm3sO26tQlqyvyi4CsnY9GA=="], @@ -599,7 +539,7 @@ "engine.io-parser": ["engine.io-parser@5.2.3", "", {}, "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q=="], - "enhanced-resolve": ["enhanced-resolve@5.19.0", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.3.0" } }, "sha512-phv3E1Xl4tQOShqSte26C7Fl84EwUdZsyOuSSk9qtAGyyQs2s3jJzComh+Abf4g187lUUAvH+H26omrqia2aGg=="], + "enhanced-resolve": ["enhanced-resolve@5.18.3", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" } }, "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww=="], "environment": ["environment@1.1.0", "", {}, "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q=="], @@ -613,17 +553,17 @@ "es-set-tostringtag": ["es-set-tostringtag@2.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA=="], - "esbuild": ["esbuild@0.25.12", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.12", "@esbuild/android-arm": "0.25.12", "@esbuild/android-arm64": "0.25.12", "@esbuild/android-x64": "0.25.12", "@esbuild/darwin-arm64": "0.25.12", "@esbuild/darwin-x64": "0.25.12", "@esbuild/freebsd-arm64": "0.25.12", "@esbuild/freebsd-x64": "0.25.12", "@esbuild/linux-arm": "0.25.12", "@esbuild/linux-arm64": "0.25.12", "@esbuild/linux-ia32": "0.25.12", "@esbuild/linux-loong64": "0.25.12", "@esbuild/linux-mips64el": "0.25.12", "@esbuild/linux-ppc64": "0.25.12", "@esbuild/linux-riscv64": "0.25.12", "@esbuild/linux-s390x": "0.25.12", "@esbuild/linux-x64": "0.25.12", "@esbuild/netbsd-arm64": "0.25.12", "@esbuild/netbsd-x64": "0.25.12", "@esbuild/openbsd-arm64": "0.25.12", "@esbuild/openbsd-x64": "0.25.12", "@esbuild/openharmony-arm64": "0.25.12", "@esbuild/sunos-x64": "0.25.12", "@esbuild/win32-arm64": "0.25.12", "@esbuild/win32-ia32": "0.25.12", "@esbuild/win32-x64": "0.25.12" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg=="], + "esbuild": ["esbuild@0.25.8", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.8", "@esbuild/android-arm": "0.25.8", "@esbuild/android-arm64": "0.25.8", "@esbuild/android-x64": "0.25.8", "@esbuild/darwin-arm64": "0.25.8", "@esbuild/darwin-x64": "0.25.8", "@esbuild/freebsd-arm64": "0.25.8", "@esbuild/freebsd-x64": "0.25.8", "@esbuild/linux-arm": "0.25.8", "@esbuild/linux-arm64": "0.25.8", "@esbuild/linux-ia32": "0.25.8", "@esbuild/linux-loong64": "0.25.8", "@esbuild/linux-mips64el": "0.25.8", "@esbuild/linux-ppc64": "0.25.8", "@esbuild/linux-riscv64": "0.25.8", "@esbuild/linux-s390x": "0.25.8", "@esbuild/linux-x64": "0.25.8", "@esbuild/netbsd-arm64": "0.25.8", "@esbuild/netbsd-x64": "0.25.8", "@esbuild/openbsd-arm64": "0.25.8", "@esbuild/openbsd-x64": "0.25.8", "@esbuild/openharmony-arm64": "0.25.8", "@esbuild/sunos-x64": "0.25.8", "@esbuild/win32-arm64": "0.25.8", "@esbuild/win32-ia32": "0.25.8", "@esbuild/win32-x64": "0.25.8" }, "bin": "bin/esbuild" }, "sha512-vVC0USHGtMi8+R4Kz8rt6JhEWLxsv9Rnu/lGYbPR8u47B+DCBksq9JarW0zOO7bs37hyOK1l2/oqtbciutL5+Q=="], "esbuild-register": ["esbuild-register@3.6.0", "", { "dependencies": { "debug": "^4.3.4" }, "peerDependencies": { "esbuild": ">=0.12 <1" } }, "sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg=="], "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], - "eslint": ["eslint@9.39.2", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.1", "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.1", "@eslint/js": "9.39.2", "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.4.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw=="], + "eslint": ["eslint@9.32.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.0", "@eslint/config-helpers": "^0.3.0", "@eslint/core": "^0.15.0", "@eslint/eslintrc": "^3.3.1", "@eslint/js": "9.32.0", "@eslint/plugin-kit": "^0.3.4", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.4.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "bin": "bin/eslint.js" }, "sha512-LSehfdpgMeWcTZkWZVIJl+tkZ2nuSkyyB9C27MZqFWXuph7DvaowgcTvKqxvpLW1JZIk8PN7hFY3Rj9LQ7m7lg=="], - "eslint-config-prettier": ["eslint-config-prettier@10.1.8", "", { "peerDependencies": { "eslint": ">=7.0.0" }, "bin": { "eslint-config-prettier": "bin/cli.js" } }, "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w=="], + "eslint-config-prettier": ["eslint-config-prettier@10.1.8", "", { "peerDependencies": { "eslint": ">=7.0.0" }, "bin": "bin/cli.js" }, "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w=="], - "eslint-plugin-svelte": ["eslint-plugin-svelte@3.15.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.6.1", "@jridgewell/sourcemap-codec": "^1.5.0", "esutils": "^2.0.3", "globals": "^16.0.0", "known-css-properties": "^0.37.0", "postcss": "^8.4.49", "postcss-load-config": "^3.1.4", "postcss-safe-parser": "^7.0.0", "semver": "^7.6.3", "svelte-eslint-parser": "^1.4.0" }, "peerDependencies": { "eslint": "^8.57.1 || ^9.0.0 || ^10.0.0", "svelte": "^3.37.0 || ^4.0.0 || ^5.0.0" }, "optionalPeers": ["svelte"] }, "sha512-QKB7zqfuB8aChOfBTComgDptMf2yxiJx7FE04nneCmtQzgTHvY8UJkuh8J2Rz7KB9FFV9aTHX6r7rdYGvG8T9Q=="], + "eslint-plugin-svelte": ["eslint-plugin-svelte@3.11.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.6.1", "@jridgewell/sourcemap-codec": "^1.5.0", "esutils": "^2.0.3", "globals": "^16.0.0", "known-css-properties": "^0.37.0", "postcss": "^8.4.49", "postcss-load-config": "^3.1.4", "postcss-safe-parser": "^7.0.0", "semver": "^7.6.3", "svelte-eslint-parser": "^1.3.0" }, "peerDependencies": { "eslint": "^8.57.1 || ^9.0.0", "svelte": "^3.37.0 || ^4.0.0 || ^5.0.0" } }, "sha512-KliWlkieHyEa65aQIkRwUFfHzT5Cn4u3BQQsu3KlkJOs7c1u7ryn84EWaOjEzilbKgttT4OfBURA8Uc4JBSQIw=="], "eslint-scope": ["eslint-scope@8.4.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg=="], @@ -633,16 +573,14 @@ "espree": ["espree@10.4.0", "", { "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.1" } }, "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ=="], - "esquery": ["esquery@1.7.0", "", { "dependencies": { "estraverse": "^5.1.0" } }, "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g=="], + "esquery": ["esquery@1.6.0", "", { "dependencies": { "estraverse": "^5.1.0" } }, "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg=="], - "esrap": ["esrap@2.2.3", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" } }, "sha512-8fOS+GIGCQZl/ZIlhl59htOlms6U8NvX6ZYgYHpRU/b6tVSh3uHkOHZikl3D4cMbYM0JlpBe+p/BkZEi8J9XIQ=="], + "esrap": ["esrap@2.1.0", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" } }, "sha512-yzmPNpl7TBbMRC5Lj2JlJZNPml0tzqoqP5B1JXycNUwtqma9AKCO0M2wHrdgsHcy1WRW7S9rJknAMtByg3usgA=="], "esrecurse": ["esrecurse@4.3.0", "", { "dependencies": { "estraverse": "^5.2.0" } }, "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag=="], "estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="], - "estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="], - "esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="], "eth-rpc-errors": ["eth-rpc-errors@4.0.3", "", { "dependencies": { "fast-safe-stringify": "^2.0.6" } }, "sha512-Z3ymjopaoft7JDoxZcEb3pwdGh7yiYMhOwm2doUt6ASXlMavpNlK6Cre0+IMl2VSGyEU9rkiperQhp5iRxn5Pg=="], @@ -653,17 +591,25 @@ "eventemitter3": ["eventemitter3@5.0.1", "", {}, "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA=="], + "exit-hook": ["exit-hook@2.2.1", "", {}, "sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw=="], + + "exsolve": ["exsolve@1.0.7", "", {}, "sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw=="], + "extension-port-stream": ["extension-port-stream@3.0.0", "", { "dependencies": { "readable-stream": "^3.6.2 || ^4.4.2", "webextension-polyfill": ">=0.10.0 <1.0" } }, "sha512-an2S5quJMiy5bnZKEf6AkfH/7r8CzHvhchU40gxN+OM6HPhe7Z9T1FUychcf2M9PpPOO0Hf7BAEfJkw2TDIBDw=="], "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], + "fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="], + "fast-json-stable-stringify": ["fast-json-stable-stringify@2.1.0", "", {}, "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="], "fast-levenshtein": ["fast-levenshtein@2.0.6", "", {}, "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="], "fast-safe-stringify": ["fast-safe-stringify@2.1.1", "", {}, "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA=="], - "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="], + "fastq": ["fastq@1.19.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ=="], + + "fdir": ["fdir@6.4.6", "", { "peerDependencies": { "picomatch": "^3 || ^4" } }, "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w=="], "file-entry-cache": ["file-entry-cache@8.0.0", "", { "dependencies": { "flat-cache": "^4.0.0" } }, "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ=="], @@ -679,7 +625,7 @@ "for-each": ["for-each@0.3.5", "", { "dependencies": { "is-callable": "^1.2.7" } }, "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg=="], - "form-data": ["form-data@4.0.5", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "hasown": "^2.0.2", "mime-types": "^2.1.12" } }, "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w=="], + "form-data": ["form-data@4.0.4", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "hasown": "^2.0.2", "mime-types": "^2.1.12" } }, "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow=="], "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], @@ -697,12 +643,16 @@ "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], - "globals": ["globals@16.5.0", "", {}, "sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ=="], + "glob-to-regexp": ["glob-to-regexp@0.4.1", "", {}, "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw=="], + + "globals": ["globals@16.3.0", "", {}, "sha512-bqWEnJ1Nt3neqx2q5SFfGS8r/ahumIakg3HcwtNlrVlwXIeNumWn/c7Pn/wKzGhf6SaW6H6uWXLqC30STCMchQ=="], "gopd": ["gopd@1.2.0", "", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="], "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], + "graphemer": ["graphemer@1.4.0", "", {}, "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag=="], + "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], "has-property-descriptors": ["has-property-descriptors@1.0.2", "", { "dependencies": { "es-define-property": "^1.0.0" } }, "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg=="], @@ -723,13 +673,11 @@ "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], - "intent-explorer": ["intent-explorer@workspace:app/explorer"], - "is-arguments": ["is-arguments@1.2.0", "", { "dependencies": { "call-bound": "^1.0.2", "has-tostringtag": "^1.0.2" } }, "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA=="], - "is-callable": ["is-callable@1.2.7", "", {}, "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA=="], + "is-arrayish": ["is-arrayish@0.3.2", "", {}, "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ=="], - "is-core-module": ["is-core-module@2.16.1", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w=="], + "is-callable": ["is-callable@1.2.7", "", {}, "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA=="], "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], @@ -739,8 +687,6 @@ "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], - "is-module": ["is-module@1.0.0", "", {}, "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g=="], - "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], "is-reference": ["is-reference@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.6" } }, "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw=="], @@ -757,9 +703,9 @@ "isows": ["isows@1.0.7", "", { "peerDependencies": { "ws": "*" } }, "sha512-I1fSfDCZL5P0v33sVqeTDSpcstAg/N+wF5HS033mogOVIp4B+oHC7oOCsA3axAbBSGTJ8QubbNmnIRN/h8U7hg=="], - "jiti": ["jiti@2.6.1", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ=="], + "jiti": ["jiti@2.5.1", "", { "bin": "lib/jiti-cli.mjs" }, "sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w=="], - "js-yaml": ["js-yaml@4.1.1", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA=="], + "js-yaml": ["js-yaml@4.1.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": "bin/js-yaml.js" }, "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA=="], "json-buffer": ["json-buffer@3.0.1", "", {}, "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="], @@ -777,29 +723,27 @@ "levn": ["levn@0.4.1", "", { "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" } }, "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ=="], - "lightningcss": ["lightningcss@1.31.1", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-android-arm64": "1.31.1", "lightningcss-darwin-arm64": "1.31.1", "lightningcss-darwin-x64": "1.31.1", "lightningcss-freebsd-x64": "1.31.1", "lightningcss-linux-arm-gnueabihf": "1.31.1", "lightningcss-linux-arm64-gnu": "1.31.1", "lightningcss-linux-arm64-musl": "1.31.1", "lightningcss-linux-x64-gnu": "1.31.1", "lightningcss-linux-x64-musl": "1.31.1", "lightningcss-win32-arm64-msvc": "1.31.1", "lightningcss-win32-x64-msvc": "1.31.1" } }, "sha512-l51N2r93WmGUye3WuFoN5k10zyvrVs0qfKBhyC5ogUQ6Ew6JUSswh78mbSO+IU3nTWsyOArqPCcShdQSadghBQ=="], - - "lightningcss-android-arm64": ["lightningcss-android-arm64@1.31.1", "", { "os": "android", "cpu": "arm64" }, "sha512-HXJF3x8w9nQ4jbXRiNppBCqeZPIAfUo8zE/kOEGbW5NZvGc/K7nMxbhIr+YlFlHW5mpbg/YFPdbnCh1wAXCKFg=="], + "lightningcss": ["lightningcss@1.30.1", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-darwin-arm64": "1.30.1", "lightningcss-darwin-x64": "1.30.1", "lightningcss-freebsd-x64": "1.30.1", "lightningcss-linux-arm-gnueabihf": "1.30.1", "lightningcss-linux-arm64-gnu": "1.30.1", "lightningcss-linux-arm64-musl": "1.30.1", "lightningcss-linux-x64-gnu": "1.30.1", "lightningcss-linux-x64-musl": "1.30.1", "lightningcss-win32-arm64-msvc": "1.30.1", "lightningcss-win32-x64-msvc": "1.30.1" } }, "sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg=="], - "lightningcss-darwin-arm64": ["lightningcss-darwin-arm64@1.31.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-02uTEqf3vIfNMq3h/z2cJfcOXnQ0GRwQrkmPafhueLb2h7mqEidiCzkE4gBMEH65abHRiQvhdcQ+aP0D0g67sg=="], + "lightningcss-darwin-arm64": ["lightningcss-darwin-arm64@1.30.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ=="], - "lightningcss-darwin-x64": ["lightningcss-darwin-x64@1.31.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-1ObhyoCY+tGxtsz1lSx5NXCj3nirk0Y0kB/g8B8DT+sSx4G9djitg9ejFnjb3gJNWo7qXH4DIy2SUHvpoFwfTA=="], + "lightningcss-darwin-x64": ["lightningcss-darwin-x64@1.30.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA=="], - "lightningcss-freebsd-x64": ["lightningcss-freebsd-x64@1.31.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-1RINmQKAItO6ISxYgPwszQE1BrsVU5aB45ho6O42mu96UiZBxEXsuQ7cJW4zs4CEodPUioj/QrXW1r9pLUM74A=="], + "lightningcss-freebsd-x64": ["lightningcss-freebsd-x64@1.30.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig=="], - "lightningcss-linux-arm-gnueabihf": ["lightningcss-linux-arm-gnueabihf@1.31.1", "", { "os": "linux", "cpu": "arm" }, "sha512-OOCm2//MZJ87CdDK62rZIu+aw9gBv4azMJuA8/KB74wmfS3lnC4yoPHm0uXZ/dvNNHmnZnB8XLAZzObeG0nS1g=="], + "lightningcss-linux-arm-gnueabihf": ["lightningcss-linux-arm-gnueabihf@1.30.1", "", { "os": "linux", "cpu": "arm" }, "sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q=="], - "lightningcss-linux-arm64-gnu": ["lightningcss-linux-arm64-gnu@1.31.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-WKyLWztD71rTnou4xAD5kQT+982wvca7E6QoLpoawZ1gP9JM0GJj4Tp5jMUh9B3AitHbRZ2/H3W5xQmdEOUlLg=="], + "lightningcss-linux-arm64-gnu": ["lightningcss-linux-arm64-gnu@1.30.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw=="], - "lightningcss-linux-arm64-musl": ["lightningcss-linux-arm64-musl@1.31.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-mVZ7Pg2zIbe3XlNbZJdjs86YViQFoJSpc41CbVmKBPiGmC4YrfeOyz65ms2qpAobVd7WQsbW4PdsSJEMymyIMg=="], + "lightningcss-linux-arm64-musl": ["lightningcss-linux-arm64-musl@1.30.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ=="], - "lightningcss-linux-x64-gnu": ["lightningcss-linux-x64-gnu@1.31.1", "", { "os": "linux", "cpu": "x64" }, "sha512-xGlFWRMl+0KvUhgySdIaReQdB4FNudfUTARn7q0hh/V67PVGCs3ADFjw+6++kG1RNd0zdGRlEKa+T13/tQjPMA=="], + "lightningcss-linux-x64-gnu": ["lightningcss-linux-x64-gnu@1.30.1", "", { "os": "linux", "cpu": "x64" }, "sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw=="], - "lightningcss-linux-x64-musl": ["lightningcss-linux-x64-musl@1.31.1", "", { "os": "linux", "cpu": "x64" }, "sha512-eowF8PrKHw9LpoZii5tdZwnBcYDxRw2rRCyvAXLi34iyeYfqCQNA9rmUM0ce62NlPhCvof1+9ivRaTY6pSKDaA=="], + "lightningcss-linux-x64-musl": ["lightningcss-linux-x64-musl@1.30.1", "", { "os": "linux", "cpu": "x64" }, "sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ=="], - "lightningcss-win32-arm64-msvc": ["lightningcss-win32-arm64-msvc@1.31.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-aJReEbSEQzx1uBlQizAOBSjcmr9dCdL3XuC/6HLXAxmtErsj2ICo5yYggg1qOODQMtnjNQv2UHb9NpOuFtYe4w=="], + "lightningcss-win32-arm64-msvc": ["lightningcss-win32-arm64-msvc@1.30.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA=="], - "lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.31.1", "", { "os": "win32", "cpu": "x64" }, "sha512-I9aiFrbd7oYHwlnQDqr1Roz+fTz61oDDJX7n9tYF9FJymH1cIN1DtKw3iYt6b8WZgEjoNwVSncwF4wx/ZedMhw=="], + "lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.30.1", "", { "os": "win32", "cpu": "x64" }, "sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg=="], "lilconfig": ["lilconfig@3.1.3", "", {}, "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw=="], @@ -815,26 +759,36 @@ "log-update": ["log-update@6.1.0", "", { "dependencies": { "ansi-escapes": "^7.0.0", "cli-cursor": "^5.0.0", "slice-ansi": "^7.1.0", "strip-ansi": "^7.1.0", "wrap-ansi": "^9.0.0" } }, "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w=="], - "magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="], + "magic-string": ["magic-string@0.30.17", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0" } }, "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA=="], "math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="], + "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="], + "micro-ftch": ["micro-ftch@0.3.1", "", {}, "sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg=="], "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], + "mime": ["mime@3.0.0", "", { "bin": "cli.js" }, "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A=="], + "mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], "mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], "mimic-function": ["mimic-function@5.0.1", "", {}, "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA=="], - "miniflare": ["miniflare@4.20260217.0", "", { "dependencies": { "@cspotcode/source-map-support": "0.8.1", "sharp": "^0.34.5", "undici": "7.18.2", "workerd": "1.20260217.0", "ws": "8.18.0", "youch": "4.1.0-beta.10" }, "bin": { "miniflare": "bootstrap.js" } }, "sha512-t2v02Vi9SUiiXoHoxLvsntli7N35e/35PuRAYEqHWtHOdDX3bqQ73dBQ0tI12/8ThCb2by2tVs7qOvgwn6xSBQ=="], + "miniflare": ["miniflare@4.20250803.0", "", { "dependencies": { "@cspotcode/source-map-support": "0.8.1", "acorn": "8.14.0", "acorn-walk": "8.3.2", "exit-hook": "2.2.1", "glob-to-regexp": "0.4.1", "sharp": "^0.33.5", "stoppable": "1.1.0", "undici": "^7.10.0", "workerd": "1.20250803.0", "ws": "8.18.0", "youch": "4.1.0-beta.10", "zod": "3.22.3" }, "bin": "bootstrap.js" }, "sha512-1tmCLfmMw0SqRBF9PPII9CVLQRzOrO7uIBmSng8BMSmtgs2kos7OeoM0sg6KbR9FrvP/zAniLyZuCAMAjuu4fQ=="], "minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], + "minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="], + + "minizlib": ["minizlib@3.0.2", "", { "dependencies": { "minipass": "^7.1.2" } }, "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA=="], + "mipd": ["mipd@0.0.7", "", { "peerDependencies": { "typescript": ">=5.0.4" }, "optionalPeers": ["typescript"] }, "sha512-aAPZPNDQ3uMTdKbuO2YmAw2TxLHO0moa4YKAyETM/DTj5FloZo+a+8tU+iv4GmW+sOxKLSRwcSFuczk+Cpt6fg=="], + "mkdirp": ["mkdirp@3.0.1", "", { "bin": "dist/cjs/src/bin.js" }, "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg=="], + "mri": ["mri@1.2.0", "", {}, "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA=="], "mrmime": ["mrmime@2.0.1", "", {}, "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ=="], @@ -843,7 +797,7 @@ "nano-spawn": ["nano-spawn@1.0.3", "", {}, "sha512-jtpsQDetTnvS2Ts1fiRdci5rx0VYws5jGyC+4IYOTnIQ/wwdf6JdomlHBwqC3bJYOvaKu0C2GSZ1A60anrYpaA=="], - "nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], + "nanoid": ["nanoid@3.3.11", "", { "bin": "bin/nanoid.cjs" }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], "natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="], @@ -853,7 +807,7 @@ "obj-multiplex": ["obj-multiplex@1.0.0", "", { "dependencies": { "end-of-stream": "^1.4.0", "once": "^1.4.0", "readable-stream": "^2.3.3" } }, "sha512-0GNJAOsHoBHeNTvl5Vt6IWnpUEcc3uSRxzBri7EDyIcMgYvnY2JL2qdeV5zTMjWQX5OHcD5amcW2HFfDh0gjIA=="], - "obug": ["obug@2.1.1", "", {}, "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ=="], + "ohash": ["ohash@2.0.11", "", {}, "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ=="], "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="], @@ -865,7 +819,7 @@ "optionator": ["optionator@0.9.4", "", { "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", "word-wrap": "^1.2.5" } }, "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g=="], - "ox": ["ox@0.12.1", "", { "dependencies": { "@adraffy/ens-normalize": "^1.11.0", "@noble/ciphers": "^1.3.0", "@noble/curves": "1.9.1", "@noble/hashes": "^1.8.0", "@scure/bip32": "^1.7.0", "@scure/bip39": "^1.6.0", "abitype": "^1.2.3", "eventemitter3": "5.0.1" }, "peerDependencies": { "typescript": ">=5.4.0" }, "optionalPeers": ["typescript"] }, "sha512-uU0llpthaaw4UJoXlseCyBHmQ3bLrQmz9rRLIAUHqv46uHuae9SE+ukYBRIPVCnlEnHKuWjDUcDFHWx9gbGNoA=="], + "ox": ["ox@0.11.3", "", { "dependencies": { "@adraffy/ens-normalize": "^1.11.0", "@noble/ciphers": "^1.3.0", "@noble/curves": "1.9.1", "@noble/hashes": "^1.8.0", "@scure/bip32": "^1.7.0", "@scure/bip39": "^1.6.0", "abitype": "^1.2.3", "eventemitter3": "5.0.1" }, "peerDependencies": { "typescript": ">=5.4.0" } }, "sha512-1bWYGk/xZel3xro3l8WGg6eq4YEKlaqvyMtVhfMFpbJzK2F6rj4EDRtqDCWVEJMkzcmEi9uW2QxsqELokOlarw=="], "p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="], @@ -877,8 +831,6 @@ "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], - "path-parse": ["path-parse@1.0.7", "", {}, "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="], - "path-to-regexp": ["path-to-regexp@6.3.0", "", {}, "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ=="], "pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], @@ -899,13 +851,13 @@ "postcss": ["postcss@8.5.6", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg=="], - "postcss-load-config": ["postcss-load-config@3.1.4", "", { "dependencies": { "lilconfig": "^2.0.5", "yaml": "^1.10.2" }, "peerDependencies": { "postcss": ">=8.0.9", "ts-node": ">=9.0.0" }, "optionalPeers": ["postcss", "ts-node"] }, "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg=="], + "postcss-load-config": ["postcss-load-config@3.1.4", "", { "dependencies": { "lilconfig": "^2.0.5", "yaml": "^1.10.2" }, "peerDependencies": { "postcss": ">=8.0.9", "ts-node": ">=9.0.0" }, "optionalPeers": ["ts-node"] }, "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg=="], "postcss-safe-parser": ["postcss-safe-parser@7.0.1", "", { "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A=="], "postcss-scss": ["postcss-scss@4.0.9", "", { "peerDependencies": { "postcss": "^8.4.29" } }, "sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A=="], - "postcss-selector-parser": ["postcss-selector-parser@7.1.1", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg=="], + "postcss-selector-parser": ["postcss-selector-parser@7.1.0", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA=="], "prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="], @@ -923,6 +875,8 @@ "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="], + "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="], + "react": ["react@19.2.4", "", {}, "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ=="], "readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], @@ -931,17 +885,19 @@ "regexparam": ["regexparam@3.0.0", "", {}, "sha512-RSYAtP31mvYLkAHrOlh25pCNQ5hWnT106VukGaaFfuJrZFkGRX5GhUAdPqpSDXxOhA2c4akmRuplv1mRqnBn6Q=="], - "resolve": ["resolve@1.22.11", "", { "dependencies": { "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ=="], - "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="], "restore-cursor": ["restore-cursor@5.1.0", "", { "dependencies": { "onetime": "^7.0.0", "signal-exit": "^4.1.0" } }, "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA=="], + "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="], + "rfdc": ["rfdc@1.4.1", "", {}, "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA=="], - "rollup": ["rollup@4.57.1", "", { "dependencies": { "@types/estree": "1.0.8" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.57.1", "@rollup/rollup-android-arm64": "4.57.1", "@rollup/rollup-darwin-arm64": "4.57.1", "@rollup/rollup-darwin-x64": "4.57.1", "@rollup/rollup-freebsd-arm64": "4.57.1", "@rollup/rollup-freebsd-x64": "4.57.1", "@rollup/rollup-linux-arm-gnueabihf": "4.57.1", "@rollup/rollup-linux-arm-musleabihf": "4.57.1", "@rollup/rollup-linux-arm64-gnu": "4.57.1", "@rollup/rollup-linux-arm64-musl": "4.57.1", "@rollup/rollup-linux-loong64-gnu": "4.57.1", "@rollup/rollup-linux-loong64-musl": "4.57.1", "@rollup/rollup-linux-ppc64-gnu": "4.57.1", "@rollup/rollup-linux-ppc64-musl": "4.57.1", "@rollup/rollup-linux-riscv64-gnu": "4.57.1", "@rollup/rollup-linux-riscv64-musl": "4.57.1", "@rollup/rollup-linux-s390x-gnu": "4.57.1", "@rollup/rollup-linux-x64-gnu": "4.57.1", "@rollup/rollup-linux-x64-musl": "4.57.1", "@rollup/rollup-openbsd-x64": "4.57.1", "@rollup/rollup-openharmony-arm64": "4.57.1", "@rollup/rollup-win32-arm64-msvc": "4.57.1", "@rollup/rollup-win32-ia32-msvc": "4.57.1", "@rollup/rollup-win32-x64-gnu": "4.57.1", "@rollup/rollup-win32-x64-msvc": "4.57.1", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A=="], + "rollup": ["rollup@4.46.2", "", { "dependencies": { "@types/estree": "1.0.8" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.46.2", "@rollup/rollup-android-arm64": "4.46.2", "@rollup/rollup-darwin-arm64": "4.46.2", "@rollup/rollup-darwin-x64": "4.46.2", "@rollup/rollup-freebsd-arm64": "4.46.2", "@rollup/rollup-freebsd-x64": "4.46.2", "@rollup/rollup-linux-arm-gnueabihf": "4.46.2", "@rollup/rollup-linux-arm-musleabihf": "4.46.2", "@rollup/rollup-linux-arm64-gnu": "4.46.2", "@rollup/rollup-linux-arm64-musl": "4.46.2", "@rollup/rollup-linux-loongarch64-gnu": "4.46.2", "@rollup/rollup-linux-ppc64-gnu": "4.46.2", "@rollup/rollup-linux-riscv64-gnu": "4.46.2", "@rollup/rollup-linux-riscv64-musl": "4.46.2", "@rollup/rollup-linux-s390x-gnu": "4.46.2", "@rollup/rollup-linux-x64-gnu": "4.46.2", "@rollup/rollup-linux-x64-musl": "4.46.2", "@rollup/rollup-win32-arm64-msvc": "4.46.2", "@rollup/rollup-win32-ia32-msvc": "4.46.2", "@rollup/rollup-win32-x64-msvc": "4.46.2", "fsevents": "~2.3.2" }, "bin": "dist/bin/rollup" }, "sha512-WMmLFI+Boh6xbop+OAGo9cQ3OgX9MIg7xOQjn+pTCwOkk+FNDAeAemXkJ3HzDJrVXleLOFVa1ipuc1AmEx1Dwg=="], + + "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], "rxjs": ["rxjs@7.8.2", "", { "dependencies": { "tslib": "^2.1.0" } }, "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA=="], @@ -951,13 +907,13 @@ "safe-regex-test": ["safe-regex-test@1.1.0", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "is-regex": "^1.2.1" } }, "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw=="], - "semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="], + "semver": ["semver@7.7.2", "", { "bin": "bin/semver.js" }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="], - "set-cookie-parser": ["set-cookie-parser@3.0.1", "", {}, "sha512-n7Z7dXZhJbwuAHhNzkTti6Aw9QDDjZtm3JTpTGATIdNzdQz5GuFs22w90BcvF4INfnrL5xrX3oGsuqO5Dx3A1Q=="], + "set-cookie-parser": ["set-cookie-parser@2.7.1", "", {}, "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ=="], "set-function-length": ["set-function-length@1.2.2", "", { "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", "has-property-descriptors": "^1.0.2" } }, "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg=="], - "sharp": ["sharp@0.34.5", "", { "dependencies": { "@img/colour": "^1.0.0", "detect-libc": "^2.1.2", "semver": "^7.7.3" }, "optionalDependencies": { "@img/sharp-darwin-arm64": "0.34.5", "@img/sharp-darwin-x64": "0.34.5", "@img/sharp-libvips-darwin-arm64": "1.2.4", "@img/sharp-libvips-darwin-x64": "1.2.4", "@img/sharp-libvips-linux-arm": "1.2.4", "@img/sharp-libvips-linux-arm64": "1.2.4", "@img/sharp-libvips-linux-ppc64": "1.2.4", "@img/sharp-libvips-linux-riscv64": "1.2.4", "@img/sharp-libvips-linux-s390x": "1.2.4", "@img/sharp-libvips-linux-x64": "1.2.4", "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", "@img/sharp-libvips-linuxmusl-x64": "1.2.4", "@img/sharp-linux-arm": "0.34.5", "@img/sharp-linux-arm64": "0.34.5", "@img/sharp-linux-ppc64": "0.34.5", "@img/sharp-linux-riscv64": "0.34.5", "@img/sharp-linux-s390x": "0.34.5", "@img/sharp-linux-x64": "0.34.5", "@img/sharp-linuxmusl-arm64": "0.34.5", "@img/sharp-linuxmusl-x64": "0.34.5", "@img/sharp-wasm32": "0.34.5", "@img/sharp-win32-arm64": "0.34.5", "@img/sharp-win32-ia32": "0.34.5", "@img/sharp-win32-x64": "0.34.5" } }, "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg=="], + "sharp": ["sharp@0.33.5", "", { "dependencies": { "color": "^4.2.3", "detect-libc": "^2.0.3", "semver": "^7.6.3" }, "optionalDependencies": { "@img/sharp-darwin-arm64": "0.33.5", "@img/sharp-darwin-x64": "0.33.5", "@img/sharp-libvips-darwin-arm64": "1.0.4", "@img/sharp-libvips-darwin-x64": "1.0.4", "@img/sharp-libvips-linux-arm": "1.0.5", "@img/sharp-libvips-linux-arm64": "1.0.4", "@img/sharp-libvips-linux-s390x": "1.0.4", "@img/sharp-libvips-linux-x64": "1.0.4", "@img/sharp-libvips-linuxmusl-arm64": "1.0.4", "@img/sharp-libvips-linuxmusl-x64": "1.0.4", "@img/sharp-linux-arm": "0.33.5", "@img/sharp-linux-arm64": "0.33.5", "@img/sharp-linux-s390x": "0.33.5", "@img/sharp-linux-x64": "0.33.5", "@img/sharp-linuxmusl-arm64": "0.33.5", "@img/sharp-linuxmusl-x64": "0.33.5", "@img/sharp-wasm32": "0.33.5", "@img/sharp-win32-ia32": "0.33.5", "@img/sharp-win32-x64": "0.33.5" } }, "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw=="], "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], @@ -965,7 +921,9 @@ "signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], - "sirv": ["sirv@3.0.2", "", { "dependencies": { "@polka/url": "^1.0.0-next.24", "mrmime": "^2.0.0", "totalist": "^3.0.0" } }, "sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g=="], + "simple-swizzle": ["simple-swizzle@0.2.2", "", { "dependencies": { "is-arrayish": "^0.3.1" } }, "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg=="], + + "sirv": ["sirv@3.0.1", "", { "dependencies": { "@polka/url": "^1.0.0-next.24", "mrmime": "^2.0.0", "totalist": "^3.0.0" } }, "sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A=="], "slice-ansi": ["slice-ansi@5.0.0", "", { "dependencies": { "ansi-styles": "^6.0.0", "is-fullwidth-code-point": "^4.0.0" } }, "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ=="], @@ -979,31 +937,33 @@ "source-map-support": ["source-map-support@0.5.21", "", { "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w=="], + "stoppable": ["stoppable@1.1.0", "", {}, "sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw=="], + "string-argv": ["string-argv@0.3.2", "", {}, "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q=="], "string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="], "string_decoder": ["string_decoder@1.3.0", "", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="], - "strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], + "strip-ansi": ["strip-ansi@7.2.0", "", { "dependencies": { "ansi-regex": "^6.2.2" } }, "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w=="], "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], - "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], + "svelte": ["svelte@5.38.0", "", { "dependencies": { "@ampproject/remapping": "^2.3.0", "@jridgewell/sourcemap-codec": "^1.5.0", "@sveltejs/acorn-typescript": "^1.0.5", "@types/estree": "^1.0.5", "acorn": "^8.12.1", "aria-query": "^5.3.1", "axobject-query": "^4.1.0", "clsx": "^2.1.1", "esm-env": "^1.2.1", "esrap": "^2.1.0", "is-reference": "^3.0.3", "locate-character": "^3.0.0", "magic-string": "^0.30.11", "zimmerframe": "^1.1.2" } }, "sha512-cWF1Oc2IM/QbktdK89u5lt9MdKxRtQnRKnf2tq6KOhYuhLOd2hbMuTiJ+vWMzAeMDe81AzbCgLd4GVtOJ4fDRg=="], - "svelte": ["svelte@5.53.0", "", { "dependencies": { "@jridgewell/remapping": "^2.3.4", "@jridgewell/sourcemap-codec": "^1.5.0", "@sveltejs/acorn-typescript": "^1.0.5", "@types/estree": "^1.0.5", "@types/trusted-types": "^2.0.7", "acorn": "^8.12.1", "aria-query": "^5.3.1", "axobject-query": "^4.1.0", "clsx": "^2.1.1", "devalue": "^5.6.3", "esm-env": "^1.2.1", "esrap": "^2.2.2", "is-reference": "^3.0.3", "locate-character": "^3.0.0", "magic-string": "^0.30.11", "zimmerframe": "^1.1.2" } }, "sha512-7dhHkSamGS2vtoBmIW2hRab+gl5Z60alEHZB4910ePqqJNxAWnDAxsofVmlZ2tREmWyHNE+A1nCKwICAquoD2A=="], + "svelte-check": ["svelte-check@4.3.1", "", { "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", "chokidar": "^4.0.1", "fdir": "^6.2.0", "picocolors": "^1.0.0", "sade": "^1.7.4" }, "peerDependencies": { "svelte": "^4.0.0 || ^5.0.0-next.0", "typescript": ">=5.0.0" }, "bin": "bin/svelte-check" }, "sha512-lkh8gff5gpHLjxIV+IaApMxQhTGnir2pNUAqcNgeKkvK5bT/30Ey/nzBxNLDlkztCH4dP7PixkMt9SWEKFPBWg=="], - "svelte-check": ["svelte-check@4.4.1", "", { "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", "chokidar": "^4.0.1", "fdir": "^6.2.0", "picocolors": "^1.0.0", "sade": "^1.7.4" }, "peerDependencies": { "svelte": "^4.0.0 || ^5.0.0-next.0", "typescript": ">=5.0.0" }, "bin": { "svelte-check": "bin/svelte-check" } }, "sha512-y1bBT0CRCMMfdjyqX1e5zCygLgEEr4KJV1qP6GSUReHl90bmcQaAWjZygHPfQ8K63f1eR8IuivuZMwmCg3zT2Q=="], + "svelte-eslint-parser": ["svelte-eslint-parser@1.3.1", "", { "dependencies": { "eslint-scope": "^8.2.0", "eslint-visitor-keys": "^4.0.0", "espree": "^10.0.0", "postcss": "^8.4.49", "postcss-scss": "^4.0.9", "postcss-selector-parser": "^7.0.0" }, "peerDependencies": { "svelte": "^3.37.0 || ^4.0.0 || ^5.0.0" } }, "sha512-0Iztj5vcOVOVkhy1pbo5uA9r+d3yaVoE5XPc9eABIWDOSJZ2mOsZ4D+t45rphWCOr0uMw3jtSG2fh2e7GvKnPg=="], - "svelte-eslint-parser": ["svelte-eslint-parser@1.4.1", "", { "dependencies": { "eslint-scope": "^8.2.0", "eslint-visitor-keys": "^4.0.0", "espree": "^10.0.0", "postcss": "^8.4.49", "postcss-scss": "^4.0.9", "postcss-selector-parser": "^7.0.0" }, "peerDependencies": { "svelte": "^3.37.0 || ^4.0.0 || ^5.0.0" }, "optionalPeers": ["svelte"] }, "sha512-1eqkfQ93goAhjAXxZiu1SaKI9+0/sxp4JIWQwUpsz7ybehRE5L8dNuz7Iry7K22R47p5/+s9EM+38nHV2OlgXA=="], + "tailwindcss": ["tailwindcss@4.1.11", "", {}, "sha512-2E9TBm6MDD/xKYe+dvJZAmg3yxIEDNRc0jwlNyDg/4Fil2QcSLjFKGVff0lAf1jjeaArlG/M75Ey/EYr/OJtBA=="], - "tailwindcss": ["tailwindcss@4.2.0", "", {}, "sha512-yYzTZ4++b7fNYxFfpnberEEKu43w44aqDMNM9MHMmcKuCH7lL8jJ4yJ7LGHv7rSwiqM0nkiobF9I6cLlpS2P7Q=="], + "tapable": ["tapable@2.2.2", "", {}, "sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg=="], - "tapable": ["tapable@2.3.0", "", {}, "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg=="], + "tar": ["tar@7.4.3", "", { "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", "minipass": "^7.1.2", "minizlib": "^3.0.1", "mkdirp": "^3.0.1", "yallist": "^5.0.0" } }, "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw=="], - "tinyglobby": ["tinyglobby@0.2.15", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.3" } }, "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ=="], + "tinyglobby": ["tinyglobby@0.2.14", "", { "dependencies": { "fdir": "^6.4.4", "picomatch": "^4.0.2" } }, "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ=="], "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], @@ -1011,21 +971,23 @@ "tr46": ["tr46@0.0.3", "", {}, "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="], - "ts-api-utils": ["ts-api-utils@2.4.0", "", { "peerDependencies": { "typescript": ">=4.8.4" } }, "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA=="], + "ts-api-utils": ["ts-api-utils@2.1.0", "", { "peerDependencies": { "typescript": ">=4.8.4" } }, "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ=="], "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], "type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="], - "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], + "typescript": ["typescript@5.9.2", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A=="], + + "typescript-eslint": ["typescript-eslint@8.39.0", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.39.0", "@typescript-eslint/parser": "8.39.0", "@typescript-eslint/typescript-estree": "8.39.0", "@typescript-eslint/utils": "8.39.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-lH8FvtdtzcHJCkMOKnN73LIn6SLTpoojgJqDAxPm1jCR14eWSGPX8ul/gggBdPMk/d5+u9V854vTYQ8T5jF/1Q=="], - "typescript-eslint": ["typescript-eslint@8.56.0", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.56.0", "@typescript-eslint/parser": "8.56.0", "@typescript-eslint/typescript-estree": "8.56.0", "@typescript-eslint/utils": "8.56.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-c7toRLrotJ9oixgdW7liukZpsnq5CZ7PuKztubGYlNppuTqhIoWfhgHo/7EU0v06gS2l/x0i2NEFK1qMIf0rIg=="], + "ufo": ["ufo@1.6.1", "", {}, "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA=="], - "undici": ["undici@7.18.2", "", {}, "sha512-y+8YjDFzWdQlSE9N5nzKMT3g4a5UBX1HKowfdXh0uvAnTaqqwqB92Jt4UXBAeKekDs5IaDKyJFR4X1gYVCgXcw=="], + "undici": ["undici@7.13.0", "", {}, "sha512-l+zSMssRqrzDcb3fjMkjjLGmuiiK2pMIcV++mJaAc9vhjSGpvM7h43QgP+OAMb1GImHmbPyG2tBXeuyG5iY4gA=="], - "undici-types": ["undici-types@7.18.2", "", {}, "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w=="], + "undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="], - "unenv": ["unenv@2.0.0-rc.24", "", { "dependencies": { "pathe": "^2.0.3" } }, "sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw=="], + "unenv": ["unenv@2.0.0-rc.19", "", { "dependencies": { "defu": "^6.1.4", "exsolve": "^1.0.7", "ohash": "^2.0.11", "pathe": "^2.0.3", "ufo": "^1.6.1" } }, "sha512-t/OMHBNAkknVCI7bVB9OWjUUAwhVv9vsPIAGnNUxnu3FxPQN11rjh0sksLMzc3g7IlTgvHmOTl4JM7JHpcv5wA=="], "uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="], @@ -1039,11 +1001,11 @@ "uuid": ["uuid@8.3.2", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="], - "viem": ["viem@2.45.3", "", { "dependencies": { "@noble/curves": "1.9.1", "@noble/hashes": "1.8.0", "@scure/bip32": "1.7.0", "@scure/bip39": "1.6.0", "abitype": "1.2.3", "isows": "1.0.7", "ox": "0.12.1", "ws": "8.18.3" }, "peerDependencies": { "typescript": ">=5.0.4" }, "optionalPeers": ["typescript"] }, "sha512-axOD7rIbGiDHHA1MHKmpqqTz3CMCw7YpE/FVypddQMXL5i364VkNZh9JeEJH17NO484LaZUOMueo35IXyL76Mw=="], + "viem": ["viem@2.45.1", "", { "dependencies": { "@noble/curves": "1.9.1", "@noble/hashes": "1.8.0", "@scure/bip32": "1.7.0", "@scure/bip39": "1.6.0", "abitype": "1.2.3", "isows": "1.0.7", "ox": "0.11.3", "ws": "8.18.3" }, "peerDependencies": { "typescript": ">=5.0.4" } }, "sha512-LN6Pp7vSfv50LgwhkfSbIXftAM5J89lP9x8TeDa8QM7o41IxlHrDh0F9X+FfnCWtsz11pEVV5sn+yBUoOHNqYA=="], - "vite": ["vite@7.3.1", "", { "dependencies": { "esbuild": "^0.27.0", "fdir": "^6.5.0", "picomatch": "^4.0.3", "postcss": "^8.5.6", "rollup": "^4.43.0", "tinyglobby": "^0.2.15" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "jiti": ">=1.21.0", "less": "^4.0.0", "lightningcss": "^1.21.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA=="], + "vite": ["vite@7.1.1", "", { "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.6", "picomatch": "^4.0.3", "postcss": "^8.5.6", "rollup": "^4.43.0", "tinyglobby": "^0.2.14" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "jiti": ">=1.21.0", "less": "^4.0.0", "lightningcss": "^1.21.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "less", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx"], "bin": "bin/vite.js" }, "sha512-yJ+Mp7OyV+4S+afWo+QyoL9jFWD11QFH0i5i7JypnfTcA1rmgxCbiA8WwAICDEtZ1Z1hzrVhN8R8rGTqkTY8ZQ=="], - "vitefu": ["vitefu@1.1.1", "", { "peerDependencies": { "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0" }, "optionalPeers": ["vite"] }, "sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ=="], + "vitefu": ["vitefu@1.1.1", "", { "peerDependencies": { "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0" } }, "sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ=="], "wagmi": ["wagmi@3.5.0", "", { "dependencies": { "@wagmi/connectors": "7.2.1", "@wagmi/core": "3.4.0", "use-sync-external-store": "1.4.0" }, "peerDependencies": { "@tanstack/react-query": ">=5.0.0", "react": ">=18", "typescript": ">=5.7.3", "viem": "2.x" }, "optionalPeers": ["typescript"] }, "sha512-39uiY6Vkc28NiAHrxJzVTodoRgSVGG97EewwUxRf+jcFMTe8toAnaM8pJZA3Zw/6snMg4tSgWLJAtMnOacLe7w=="], @@ -1053,17 +1015,17 @@ "whatwg-url": ["whatwg-url@5.0.0", "", { "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw=="], - "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], + "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], "which-typed-array": ["which-typed-array@1.1.20", "", { "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.4", "for-each": "^0.3.5", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2" } }, "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg=="], "word-wrap": ["word-wrap@1.2.5", "", {}, "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA=="], - "workerd": ["workerd@1.20260217.0", "", { "optionalDependencies": { "@cloudflare/workerd-darwin-64": "1.20260217.0", "@cloudflare/workerd-darwin-arm64": "1.20260217.0", "@cloudflare/workerd-linux-64": "1.20260217.0", "@cloudflare/workerd-linux-arm64": "1.20260217.0", "@cloudflare/workerd-windows-64": "1.20260217.0" }, "bin": { "workerd": "bin/workerd" } }, "sha512-6jVisS6wB6KbF+F9DVoDUy9p7MON8qZCFSaL8OcDUioMwknsUPFojUISu3/c30ZOZ24D4h7oqaahFc5C6huilw=="], + "workerd": ["workerd@1.20250803.0", "", { "optionalDependencies": { "@cloudflare/workerd-darwin-64": "1.20250803.0", "@cloudflare/workerd-darwin-arm64": "1.20250803.0", "@cloudflare/workerd-linux-64": "1.20250803.0", "@cloudflare/workerd-linux-arm64": "1.20250803.0", "@cloudflare/workerd-windows-64": "1.20250803.0" }, "bin": "bin/workerd" }, "sha512-oYH29mE/wNolPc32NHHQbySaNorj6+KASUtOvQHySxB5mO1NWdGuNv49woxNCF5971UYceGQndY+OLT+24C3wQ=="], "worktop": ["worktop@0.8.0-next.18", "", { "dependencies": { "mrmime": "^2.0.0", "regexparam": "^3.0.0" } }, "sha512-+TvsA6VAVoMC3XDKR5MoC/qlLqDixEfOBysDEKnPIPou/NvoPWCAuXHXMsswwlvmEuvX56lQjvELLyLuzTKvRw=="], - "wrangler": ["wrangler@4.66.0", "", { "dependencies": { "@cloudflare/kv-asset-handler": "0.4.2", "@cloudflare/unenv-preset": "2.13.0", "blake3-wasm": "2.1.5", "esbuild": "0.27.3", "miniflare": "4.20260217.0", "path-to-regexp": "6.3.0", "unenv": "2.0.0-rc.24", "workerd": "1.20260217.0" }, "optionalDependencies": { "fsevents": "~2.3.2" }, "peerDependencies": { "@cloudflare/workers-types": "^4.20260217.0" }, "optionalPeers": ["@cloudflare/workers-types"], "bin": { "wrangler": "bin/wrangler.js", "wrangler2": "bin/wrangler.js" } }, "sha512-b9RVIdKai0BXDuYg0iN0zwVnVbULkvdKGP7Bf1uFY2GhJ/nzDGqgwQbCwgDIOhmaBC8ynhk/p22M2jc8tJy+dQ=="], + "wrangler": ["wrangler@4.28.1", "", { "dependencies": { "@cloudflare/kv-asset-handler": "0.4.0", "@cloudflare/unenv-preset": "2.6.0", "blake3-wasm": "2.1.5", "esbuild": "0.25.4", "miniflare": "4.20250803.0", "path-to-regexp": "6.3.0", "unenv": "2.0.0-rc.19", "workerd": "1.20250803.0" }, "optionalDependencies": { "fsevents": "~2.3.2" }, "peerDependencies": { "@cloudflare/workers-types": "^4.20250803.0" }, "bin": { "wrangler": "bin/wrangler.js", "wrangler2": "bin/wrangler.js" } }, "sha512-B1w6XS3o1q1Icyx1CyirY5GNyYhucd63Jqml/EYSbB5dgv0VT8ir7L8IkCdbICEa4yYTETIgvTTZqffM6tBulA=="], "wrap-ansi": ["wrap-ansi@9.0.2", "", { "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", "strip-ansi": "^7.1.0" } }, "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww=="], @@ -1073,7 +1035,9 @@ "xmlhttprequest-ssl": ["xmlhttprequest-ssl@2.1.2", "", {}, "sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ=="], - "yaml": ["yaml@2.8.2", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A=="], + "yallist": ["yallist@5.0.0", "", {}, "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw=="], + + "yaml": ["yaml@2.8.1", "", { "bin": "bin.mjs" }, "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw=="], "yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], @@ -1081,9 +1045,9 @@ "youch-core": ["youch-core@0.3.3", "", { "dependencies": { "@poppinss/exception": "^1.2.2", "error-stack-parser-es": "^1.0.5" } }, "sha512-ho7XuGjLaJ2hWHoK8yFnsUGy2Y5uDpqSTq1FkHLK4/oqKtyUU1AFbOOxY4IpC9f0fTLjwYbslUz0Po5BpD1wrA=="], - "zimmerframe": ["zimmerframe@1.1.4", "", {}, "sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ=="], + "zimmerframe": ["zimmerframe@1.1.2", "", {}, "sha512-rAbqEGa8ovJy4pyBxZM70hg4pE6gDgaQ0Sl9M3enG3I0d6H4XSAM3GeNGLKnsBpuijUow064sf7ww1nutC5/3w=="], - "zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], + "zod": ["zod@3.22.4", "", {}, "sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg=="], "zustand": ["zustand@5.0.0", "", { "peerDependencies": { "@types/react": ">=18.0.0", "immer": ">=9.0.6", "react": ">=18.0.0", "use-sync-external-store": ">=1.2.0" }, "optionalPeers": ["@types/react", "immer", "react", "use-sync-external-store"] }, "sha512-LE+VcmbartOPM+auOjCCLQOsQ05zUTp8RkgwRzefUk+2jISdMMFnxvyTjA4YNWr5ZGXYbVsEMZosttuxUBkojQ=="], @@ -1095,6 +1059,8 @@ "@eslint/eslintrc/globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="], + "@humanfs/node/@humanwhocodes/retry": ["@humanwhocodes/retry@0.3.1", "", {}, "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA=="], + "@metamask/rpc-errors/@metamask/utils": ["@metamask/utils@9.3.0", "", { "dependencies": { "@ethereumjs/tx": "^4.2.0", "@metamask/superstruct": "^3.1.0", "@noble/hashes": "^1.3.1", "@scure/base": "^1.1.3", "@types/debug": "^4.1.7", "debug": "^4.3.4", "pony-cause": "^2.1.10", "semver": "^7.5.4", "uuid": "^9.0.1" } }, "sha512-w8CVbdkDrVXFJbfBSlDfafDR6BAkpDmv1bC1UJVCoVny5tW2RKAdn9i68Xf7asYT4TnUhl/hN4zfUiKQq9II4g=="], "@metamask/sdk/debug": ["debug@4.3.4", "", { "dependencies": { "ms": "2.1.2" } }, "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ=="], @@ -1103,34 +1069,16 @@ "@metamask/utils/uuid": ["uuid@9.0.1", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA=="], - "@poppinss/dumper/supports-color": ["supports-color@10.2.2", "", {}, "sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g=="], - - "@rollup/plugin-commonjs/is-reference": ["is-reference@1.2.1", "", { "dependencies": { "@types/estree": "*" } }, "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ=="], + "@poppinss/dumper/supports-color": ["supports-color@10.1.0", "", {}, "sha512-GBuewsPrhJPftT+fqDa9oI/zc5HNsG9nREqwzoSFDOIqf0NggOZbHQj2TE1P1CDJK8ZogFnlZY9hWoUiur7I/A=="], - "@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.8.1", "", { "dependencies": { "@emnapi/wasi-threads": "1.1.0", "tslib": "^2.4.0" }, "bundled": true }, "sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg=="], - - "@tailwindcss/oxide-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.8.1", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg=="], - - "@tailwindcss/oxide-wasm32-wasi/@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.1.0", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ=="], - - "@tailwindcss/oxide-wasm32-wasi/@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.1", "", { "dependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1", "@tybys/wasm-util": "^0.10.1" }, "bundled": true }, "sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A=="], - - "@tailwindcss/oxide-wasm32-wasi/@tybys/wasm-util": ["@tybys/wasm-util@0.10.1", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg=="], - - "@tailwindcss/oxide-wasm32-wasi/tslib": ["tslib@2.8.1", "", { "bundled": true }, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + "@scure/bip32/@noble/curves": ["@noble/curves@1.9.6", "", { "dependencies": { "@noble/hashes": "1.8.0" } }, "sha512-GIKz/j99FRthB8icyJQA51E8Uk5hXmdyThjgQXRKiv9h0zeRlzSCLIzFw6K1LotZ3XuB7yzlf76qk7uBmTdFqA=="], "@typescript-eslint/eslint-plugin/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], "@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], - "@typescript-eslint/visitor-keys/eslint-visitor-keys": ["eslint-visitor-keys@5.0.0", "", {}, "sha512-A0XeIi7CXU7nPlfHS9loMYEKxUaONu/hTEzHTGba9Huu94Cq1hPivf+DE5erJozZOky0LfvXAyrV/tcswpLI0Q=="], - - "cat-swapper/@lifi/lintent": ["@lifi/lintent@file:packages/lintent", { "dependencies": { "axios": "^1.9.0", "viem": "~2.45.1" }, "devDependencies": { "@types/bun": "^1.3.8", "typescript": "^5.6.3" } }], - "eciesjs/@noble/curves": ["@noble/curves@1.9.7", "", { "dependencies": { "@noble/hashes": "1.8.0" } }, "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw=="], - "eslint/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], - "ethereum-cryptography/@noble/curves": ["@noble/curves@1.4.2", "", { "dependencies": { "@noble/hashes": "1.4.0" } }, "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw=="], "ethereum-cryptography/@noble/hashes": ["@noble/hashes@1.4.0", "", {}, "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg=="], @@ -1139,20 +1087,20 @@ "ethereum-cryptography/@scure/bip39": ["@scure/bip39@1.3.0", "", { "dependencies": { "@noble/hashes": "~1.4.0", "@scure/base": "~1.1.6" } }, "sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ=="], - "intent-explorer/@sveltejs/vite-plugin-svelte": ["@sveltejs/vite-plugin-svelte@4.0.4", "", { "dependencies": { "@sveltejs/vite-plugin-svelte-inspector": "^3.0.0-next.0||^3.0.0", "debug": "^4.3.7", "deepmerge": "^4.3.1", "kleur": "^4.1.5", "magic-string": "^0.30.12", "vitefu": "^1.0.3" }, "peerDependencies": { "svelte": "^5.0.0-next.96 || ^5.0.0", "vite": "^5.0.0" } }, "sha512-0ba1RQ/PHen5FGpdSrW7Y3fAMQjrXantECALeOiOdBdzR5+5vPP6HVZRLmZaQL+W8m++o+haIAKq5qT+MiZ7VA=="], - - "intent-explorer/viem": ["viem@2.46.2", "", { "dependencies": { "@noble/curves": "1.9.1", "@noble/hashes": "1.8.0", "@scure/bip32": "1.7.0", "@scure/bip39": "1.6.0", "abitype": "1.2.3", "isows": "1.0.7", "ox": "0.12.4", "ws": "8.18.3" }, "peerDependencies": { "typescript": ">=5.0.4" }, "optionalPeers": ["typescript"] }, "sha512-w8Qv5Vyo7TfXcH3vgmxRa1NRvzJCDy2aSGSRsJn3503nC/qVbgEQ+n3aj/CkqWXbloudZh97h5o5aQrQSVGy0w=="], + "fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], - "intent-explorer/vite": ["vite@5.4.21", "", { "dependencies": { "esbuild": "^0.21.3", "postcss": "^8.4.43", "rollup": "^4.20.0" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || >=20.0.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.4.0" }, "optionalPeers": ["@types/node", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser"], "bin": { "vite": "bin/vite.js" } }, "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw=="], - - "listr2/eventemitter3": ["eventemitter3@5.0.4", "", {}, "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw=="], + "lint-staged/chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="], "log-update/slice-ansi": ["slice-ansi@7.1.2", "", { "dependencies": { "ansi-styles": "^6.2.1", "is-fullwidth-code-point": "^5.0.0" } }, "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w=="], "micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + "miniflare/acorn": ["acorn@8.14.0", "", { "bin": "bin/acorn" }, "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA=="], + "miniflare/ws": ["ws@8.18.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw=="], + "miniflare/zod": ["zod@3.22.3", "", {}, "sha512-EjIevzuJRiRPbVH4mGc8nApb/lVLKVpmUhAaR5R5doKGfAnGJ6Gr3CViAVjP+4FWSxCsybeWQdcgCtbX+7oZug=="], + "obj-multiplex/readable-stream": ["readable-stream@2.3.8", "", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="], "playwright/fsevents": ["fsevents@2.3.2", "", { "os": "darwin" }, "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA=="], @@ -1165,13 +1113,11 @@ "string_decoder/safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], - "vite/esbuild": ["esbuild@0.27.3", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.27.3", "@esbuild/android-arm": "0.27.3", "@esbuild/android-arm64": "0.27.3", "@esbuild/android-x64": "0.27.3", "@esbuild/darwin-arm64": "0.27.3", "@esbuild/darwin-x64": "0.27.3", "@esbuild/freebsd-arm64": "0.27.3", "@esbuild/freebsd-x64": "0.27.3", "@esbuild/linux-arm": "0.27.3", "@esbuild/linux-arm64": "0.27.3", "@esbuild/linux-ia32": "0.27.3", "@esbuild/linux-loong64": "0.27.3", "@esbuild/linux-mips64el": "0.27.3", "@esbuild/linux-ppc64": "0.27.3", "@esbuild/linux-riscv64": "0.27.3", "@esbuild/linux-s390x": "0.27.3", "@esbuild/linux-x64": "0.27.3", "@esbuild/netbsd-arm64": "0.27.3", "@esbuild/netbsd-x64": "0.27.3", "@esbuild/openbsd-arm64": "0.27.3", "@esbuild/openbsd-x64": "0.27.3", "@esbuild/openharmony-arm64": "0.27.3", "@esbuild/sunos-x64": "0.27.3", "@esbuild/win32-arm64": "0.27.3", "@esbuild/win32-ia32": "0.27.3", "@esbuild/win32-x64": "0.27.3" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg=="], - - "wrangler/esbuild": ["esbuild@0.27.3", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.27.3", "@esbuild/android-arm": "0.27.3", "@esbuild/android-arm64": "0.27.3", "@esbuild/android-x64": "0.27.3", "@esbuild/darwin-arm64": "0.27.3", "@esbuild/darwin-x64": "0.27.3", "@esbuild/freebsd-arm64": "0.27.3", "@esbuild/freebsd-x64": "0.27.3", "@esbuild/linux-arm": "0.27.3", "@esbuild/linux-arm64": "0.27.3", "@esbuild/linux-ia32": "0.27.3", "@esbuild/linux-loong64": "0.27.3", "@esbuild/linux-mips64el": "0.27.3", "@esbuild/linux-ppc64": "0.27.3", "@esbuild/linux-riscv64": "0.27.3", "@esbuild/linux-s390x": "0.27.3", "@esbuild/linux-x64": "0.27.3", "@esbuild/netbsd-arm64": "0.27.3", "@esbuild/netbsd-x64": "0.27.3", "@esbuild/openbsd-arm64": "0.27.3", "@esbuild/openbsd-x64": "0.27.3", "@esbuild/openharmony-arm64": "0.27.3", "@esbuild/sunos-x64": "0.27.3", "@esbuild/win32-arm64": "0.27.3", "@esbuild/win32-ia32": "0.27.3", "@esbuild/win32-x64": "0.27.3" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg=="], + "wrangler/esbuild": ["esbuild@0.25.4", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.4", "@esbuild/android-arm": "0.25.4", "@esbuild/android-arm64": "0.25.4", "@esbuild/android-x64": "0.25.4", "@esbuild/darwin-arm64": "0.25.4", "@esbuild/darwin-x64": "0.25.4", "@esbuild/freebsd-arm64": "0.25.4", "@esbuild/freebsd-x64": "0.25.4", "@esbuild/linux-arm": "0.25.4", "@esbuild/linux-arm64": "0.25.4", "@esbuild/linux-ia32": "0.25.4", "@esbuild/linux-loong64": "0.25.4", "@esbuild/linux-mips64el": "0.25.4", "@esbuild/linux-ppc64": "0.25.4", "@esbuild/linux-riscv64": "0.25.4", "@esbuild/linux-s390x": "0.25.4", "@esbuild/linux-x64": "0.25.4", "@esbuild/netbsd-arm64": "0.25.4", "@esbuild/netbsd-x64": "0.25.4", "@esbuild/openbsd-arm64": "0.25.4", "@esbuild/openbsd-x64": "0.25.4", "@esbuild/sunos-x64": "0.25.4", "@esbuild/win32-arm64": "0.25.4", "@esbuild/win32-ia32": "0.25.4", "@esbuild/win32-x64": "0.25.4" }, "bin": "bin/esbuild" }, "sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q=="], "wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], - "youch/cookie": ["cookie@1.1.1", "", {}, "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ=="], + "youch/cookie": ["cookie@1.0.2", "", {}, "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA=="], "@esbuild-kit/core-utils/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.18.20", "", { "os": "android", "cpu": "arm" }, "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw=="], @@ -1229,166 +1175,60 @@ "ethereum-cryptography/@scure/bip39/@scure/base": ["@scure/base@1.1.9", "", {}, "sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg=="], - "intent-explorer/@sveltejs/vite-plugin-svelte/@sveltejs/vite-plugin-svelte-inspector": ["@sveltejs/vite-plugin-svelte-inspector@3.0.1", "", { "dependencies": { "debug": "^4.3.7" }, "peerDependencies": { "@sveltejs/vite-plugin-svelte": "^4.0.0-next.0||^4.0.0", "svelte": "^5.0.0-next.96 || ^5.0.0", "vite": "^5.0.0" } }, "sha512-2CKypmj1sM4GE7HjllT7UKmo4Q6L5xFRd7VMGEWhYnZ+wc6AUVU01IBd7yUi6WnFndEwWoMNOd6e8UjoN0nbvQ=="], - - "intent-explorer/viem/ox": ["ox@0.12.4", "", { "dependencies": { "@adraffy/ens-normalize": "^1.11.0", "@noble/ciphers": "^1.3.0", "@noble/curves": "1.9.1", "@noble/hashes": "^1.8.0", "@scure/bip32": "^1.7.0", "@scure/bip39": "^1.6.0", "abitype": "^1.2.3", "eventemitter3": "5.0.1" }, "peerDependencies": { "typescript": ">=5.4.0" }, "optionalPeers": ["typescript"] }, "sha512-+P+C7QzuwPV8lu79dOwjBKfB2CbnbEXe/hfyyrff1drrO1nOOj3Hc87svHfcW1yneRr3WXaKr6nz11nq+/DF9Q=="], - - "intent-explorer/vite/esbuild": ["esbuild@0.21.5", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.21.5", "@esbuild/android-arm": "0.21.5", "@esbuild/android-arm64": "0.21.5", "@esbuild/android-x64": "0.21.5", "@esbuild/darwin-arm64": "0.21.5", "@esbuild/darwin-x64": "0.21.5", "@esbuild/freebsd-arm64": "0.21.5", "@esbuild/freebsd-x64": "0.21.5", "@esbuild/linux-arm": "0.21.5", "@esbuild/linux-arm64": "0.21.5", "@esbuild/linux-ia32": "0.21.5", "@esbuild/linux-loong64": "0.21.5", "@esbuild/linux-mips64el": "0.21.5", "@esbuild/linux-ppc64": "0.21.5", "@esbuild/linux-riscv64": "0.21.5", "@esbuild/linux-s390x": "0.21.5", "@esbuild/linux-x64": "0.21.5", "@esbuild/netbsd-x64": "0.21.5", "@esbuild/openbsd-x64": "0.21.5", "@esbuild/sunos-x64": "0.21.5", "@esbuild/win32-arm64": "0.21.5", "@esbuild/win32-ia32": "0.21.5", "@esbuild/win32-x64": "0.21.5" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw=="], - "log-update/slice-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], "log-update/slice-ansi/is-fullwidth-code-point": ["is-fullwidth-code-point@5.1.0", "", { "dependencies": { "get-east-asian-width": "^1.3.1" } }, "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ=="], "obj-multiplex/readable-stream/string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="], - "vite/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.27.3", "", { "os": "aix", "cpu": "ppc64" }, "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg=="], - - "vite/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.27.3", "", { "os": "android", "cpu": "arm" }, "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA=="], - - "vite/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.27.3", "", { "os": "android", "cpu": "arm64" }, "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg=="], - - "vite/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.27.3", "", { "os": "android", "cpu": "x64" }, "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ=="], - - "vite/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.27.3", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg=="], - - "vite/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.27.3", "", { "os": "darwin", "cpu": "x64" }, "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg=="], - - "vite/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.27.3", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w=="], - - "vite/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.27.3", "", { "os": "freebsd", "cpu": "x64" }, "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA=="], - - "vite/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.27.3", "", { "os": "linux", "cpu": "arm" }, "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw=="], - - "vite/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.27.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg=="], - - "vite/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.27.3", "", { "os": "linux", "cpu": "ia32" }, "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg=="], - - "vite/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.27.3", "", { "os": "linux", "cpu": "none" }, "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA=="], - - "vite/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.27.3", "", { "os": "linux", "cpu": "none" }, "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw=="], - - "vite/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.27.3", "", { "os": "linux", "cpu": "ppc64" }, "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA=="], - - "vite/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.27.3", "", { "os": "linux", "cpu": "none" }, "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ=="], - - "vite/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.27.3", "", { "os": "linux", "cpu": "s390x" }, "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw=="], - - "vite/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.27.3", "", { "os": "linux", "cpu": "x64" }, "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA=="], - - "vite/esbuild/@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.27.3", "", { "os": "none", "cpu": "arm64" }, "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA=="], - - "vite/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.27.3", "", { "os": "none", "cpu": "x64" }, "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA=="], - - "vite/esbuild/@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.27.3", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw=="], - - "vite/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.27.3", "", { "os": "openbsd", "cpu": "x64" }, "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ=="], - - "vite/esbuild/@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.27.3", "", { "os": "none", "cpu": "arm64" }, "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g=="], - - "vite/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.27.3", "", { "os": "sunos", "cpu": "x64" }, "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA=="], - - "vite/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.27.3", "", { "os": "win32", "cpu": "arm64" }, "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA=="], - - "vite/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.27.3", "", { "os": "win32", "cpu": "ia32" }, "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q=="], - - "vite/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.27.3", "", { "os": "win32", "cpu": "x64" }, "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA=="], - - "wrangler/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.27.3", "", { "os": "aix", "cpu": "ppc64" }, "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg=="], - - "wrangler/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.27.3", "", { "os": "android", "cpu": "arm" }, "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA=="], - - "wrangler/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.27.3", "", { "os": "android", "cpu": "arm64" }, "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg=="], - - "wrangler/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.27.3", "", { "os": "android", "cpu": "x64" }, "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ=="], - - "wrangler/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.27.3", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg=="], - - "wrangler/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.27.3", "", { "os": "darwin", "cpu": "x64" }, "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg=="], - - "wrangler/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.27.3", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w=="], - - "wrangler/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.27.3", "", { "os": "freebsd", "cpu": "x64" }, "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA=="], - - "wrangler/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.27.3", "", { "os": "linux", "cpu": "arm" }, "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw=="], - - "wrangler/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.27.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg=="], - - "wrangler/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.27.3", "", { "os": "linux", "cpu": "ia32" }, "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg=="], - - "wrangler/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.27.3", "", { "os": "linux", "cpu": "none" }, "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA=="], - - "wrangler/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.27.3", "", { "os": "linux", "cpu": "none" }, "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw=="], - - "wrangler/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.27.3", "", { "os": "linux", "cpu": "ppc64" }, "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA=="], - - "wrangler/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.27.3", "", { "os": "linux", "cpu": "none" }, "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ=="], - - "wrangler/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.27.3", "", { "os": "linux", "cpu": "s390x" }, "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw=="], - - "wrangler/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.27.3", "", { "os": "linux", "cpu": "x64" }, "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA=="], - - "wrangler/esbuild/@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.27.3", "", { "os": "none", "cpu": "arm64" }, "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA=="], - - "wrangler/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.27.3", "", { "os": "none", "cpu": "x64" }, "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA=="], - - "wrangler/esbuild/@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.27.3", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw=="], - - "wrangler/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.27.3", "", { "os": "openbsd", "cpu": "x64" }, "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ=="], - - "wrangler/esbuild/@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.27.3", "", { "os": "none", "cpu": "arm64" }, "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g=="], - - "wrangler/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.27.3", "", { "os": "sunos", "cpu": "x64" }, "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA=="], - - "wrangler/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.27.3", "", { "os": "win32", "cpu": "arm64" }, "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA=="], - - "wrangler/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.27.3", "", { "os": "win32", "cpu": "ia32" }, "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q=="], + "wrangler/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.4", "", { "os": "aix", "cpu": "ppc64" }, "sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q=="], - "wrangler/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.27.3", "", { "os": "win32", "cpu": "x64" }, "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA=="], + "wrangler/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.25.4", "", { "os": "android", "cpu": "arm" }, "sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ=="], - "intent-explorer/vite/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.21.5", "", { "os": "aix", "cpu": "ppc64" }, "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ=="], + "wrangler/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.4", "", { "os": "android", "cpu": "arm64" }, "sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A=="], - "intent-explorer/vite/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.21.5", "", { "os": "android", "cpu": "arm" }, "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg=="], + "wrangler/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.25.4", "", { "os": "android", "cpu": "x64" }, "sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ=="], - "intent-explorer/vite/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.21.5", "", { "os": "android", "cpu": "arm64" }, "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A=="], + "wrangler/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g=="], - "intent-explorer/vite/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.21.5", "", { "os": "android", "cpu": "x64" }, "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA=="], + "wrangler/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A=="], - "intent-explorer/vite/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.21.5", "", { "os": "darwin", "cpu": "arm64" }, "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ=="], + "wrangler/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.4", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ=="], - "intent-explorer/vite/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.21.5", "", { "os": "darwin", "cpu": "x64" }, "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw=="], + "wrangler/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.4", "", { "os": "freebsd", "cpu": "x64" }, "sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ=="], - "intent-explorer/vite/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.21.5", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g=="], + "wrangler/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.4", "", { "os": "linux", "cpu": "arm" }, "sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ=="], - "intent-explorer/vite/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.21.5", "", { "os": "freebsd", "cpu": "x64" }, "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ=="], + "wrangler/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ=="], - "intent-explorer/vite/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.21.5", "", { "os": "linux", "cpu": "arm" }, "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA=="], + "wrangler/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.4", "", { "os": "linux", "cpu": "ia32" }, "sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ=="], - "intent-explorer/vite/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.21.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q=="], + "wrangler/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.4", "", { "os": "linux", "cpu": "none" }, "sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA=="], - "intent-explorer/vite/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.21.5", "", { "os": "linux", "cpu": "ia32" }, "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg=="], + "wrangler/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.4", "", { "os": "linux", "cpu": "none" }, "sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg=="], - "intent-explorer/vite/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.21.5", "", { "os": "linux", "cpu": "none" }, "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg=="], + "wrangler/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.4", "", { "os": "linux", "cpu": "ppc64" }, "sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag=="], - "intent-explorer/vite/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.21.5", "", { "os": "linux", "cpu": "none" }, "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg=="], + "wrangler/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.4", "", { "os": "linux", "cpu": "none" }, "sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA=="], - "intent-explorer/vite/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.21.5", "", { "os": "linux", "cpu": "ppc64" }, "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w=="], + "wrangler/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.4", "", { "os": "linux", "cpu": "s390x" }, "sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g=="], - "intent-explorer/vite/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.21.5", "", { "os": "linux", "cpu": "none" }, "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA=="], + "wrangler/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.4", "", { "os": "linux", "cpu": "x64" }, "sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA=="], - "intent-explorer/vite/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.21.5", "", { "os": "linux", "cpu": "s390x" }, "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A=="], + "wrangler/esbuild/@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.25.4", "", { "os": "none", "cpu": "arm64" }, "sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ=="], - "intent-explorer/vite/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.21.5", "", { "os": "linux", "cpu": "x64" }, "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ=="], + "wrangler/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.4", "", { "os": "none", "cpu": "x64" }, "sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw=="], - "intent-explorer/vite/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.21.5", "", { "os": "none", "cpu": "x64" }, "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg=="], + "wrangler/esbuild/@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.4", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A=="], - "intent-explorer/vite/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.21.5", "", { "os": "openbsd", "cpu": "x64" }, "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow=="], + "wrangler/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.4", "", { "os": "openbsd", "cpu": "x64" }, "sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw=="], - "intent-explorer/vite/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.21.5", "", { "os": "sunos", "cpu": "x64" }, "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg=="], + "wrangler/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.4", "", { "os": "sunos", "cpu": "x64" }, "sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q=="], - "intent-explorer/vite/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.21.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A=="], + "wrangler/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.4", "", { "os": "win32", "cpu": "arm64" }, "sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ=="], - "intent-explorer/vite/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.21.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA=="], + "wrangler/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.4", "", { "os": "win32", "cpu": "ia32" }, "sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg=="], - "intent-explorer/vite/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.21.5", "", { "os": "win32", "cpu": "x64" }, "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw=="], + "wrangler/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.4", "", { "os": "win32", "cpu": "x64" }, "sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ=="], } } diff --git a/app/issue-intent/drizzle.config.ts b/drizzle.config.ts similarity index 100% rename from app/issue-intent/drizzle.config.ts rename to drizzle.config.ts diff --git a/app/issue-intent/drizzle/0000_absent_moonstone.sql b/drizzle/0000_absent_moonstone.sql similarity index 100% rename from app/issue-intent/drizzle/0000_absent_moonstone.sql rename to drizzle/0000_absent_moonstone.sql diff --git a/app/issue-intent/drizzle/0001_nifty_mephisto.sql b/drizzle/0001_nifty_mephisto.sql similarity index 100% rename from app/issue-intent/drizzle/0001_nifty_mephisto.sql rename to drizzle/0001_nifty_mephisto.sql diff --git a/app/issue-intent/drizzle/0002_expand_intent_created_at.sql b/drizzle/0002_expand_intent_created_at.sql similarity index 100% rename from app/issue-intent/drizzle/0002_expand_intent_created_at.sql rename to drizzle/0002_expand_intent_created_at.sql diff --git a/app/issue-intent/drizzle/0003_unique_intent_order_id.sql b/drizzle/0003_unique_intent_order_id.sql similarity index 100% rename from app/issue-intent/drizzle/0003_unique_intent_order_id.sql rename to drizzle/0003_unique_intent_order_id.sql diff --git a/app/issue-intent/drizzle/0004_store_transaction_receipts.sql b/drizzle/0004_store_transaction_receipts.sql similarity index 100% rename from app/issue-intent/drizzle/0004_store_transaction_receipts.sql rename to drizzle/0004_store_transaction_receipts.sql diff --git a/app/issue-intent/drizzle/meta/0000_snapshot.json b/drizzle/meta/0000_snapshot.json similarity index 100% rename from app/issue-intent/drizzle/meta/0000_snapshot.json rename to drizzle/meta/0000_snapshot.json diff --git a/app/issue-intent/drizzle/meta/0001_snapshot.json b/drizzle/meta/0001_snapshot.json similarity index 100% rename from app/issue-intent/drizzle/meta/0001_snapshot.json rename to drizzle/meta/0001_snapshot.json diff --git a/app/issue-intent/drizzle/meta/_journal.json b/drizzle/meta/_journal.json similarity index 100% rename from app/issue-intent/drizzle/meta/_journal.json rename to drizzle/meta/_journal.json diff --git a/app/issue-intent/eslint.config.js b/eslint.config.js similarity index 100% rename from app/issue-intent/eslint.config.js rename to eslint.config.js diff --git a/package.json b/package.json index e6a7d58..31b7108 100644 --- a/package.json +++ b/package.json @@ -1,35 +1,62 @@ { - "name": "lintent-monorepo", - "private": true, - "version": "0.1.0", - "type": "module", - "workspaces": [ - "app/*", - "packages/*" - ], - "scripts": { - "prepare": "husky", - "test": "bun run test:package && bun run test:explorer && bun run test:issue-intent", - "test:package": "bun run --cwd packages/lintent test", - "test:explorer": "bun run --cwd app/explorer test", - "test:issue-intent": "bun run --cwd app/issue-intent test:all", - "check": "bun run check:package && bun run check:explorer && bun run check:issue-intent", - "check:package": "bun run --cwd packages/lintent check", - "check:explorer": "bun run --cwd app/explorer check", - "check:issue-intent": "bun run --cwd app/issue-intent check", - "build": "bun run build:package && bun run build:explorer && bun run build:issue-intent", - "build:package": "bun run --cwd packages/lintent build", - "build:explorer": "bun run --cwd app/explorer build", - "build:issue-intent": "bun run --cwd app/issue-intent build" - }, - "lint-staged": { - "*.{js,ts,svelte,css,md,json,html}": "prettier --write" - }, - "devDependencies": { - "husky": "9.1.7", - "lint-staged": "16.1.0", - "prettier": "3.4.2", - "prettier-plugin-svelte": "3.3.3", - "prettier-plugin-tailwindcss": "0.6.11" - } + "name": "cat-swapper", + "private": true, + "version": "0.0.1", + "type": "module", + "scripts": { + "dev": "vite dev", + "build": "vite build", + "preview": "vite preview", + "test": "bun run test:all", + "test:unit": "svelte-kit sync && bun test tests/unit tests/db.test.ts --coverage", + "test:e2e": "svelte-kit sync && bunx playwright test", + "test:e2e:headed": "svelte-kit sync && bunx playwright test --headed", + "test:e2e:ui": "svelte-kit sync && bunx playwright test --ui", + "test:all": "bun run test:unit && bun run test:e2e", + "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", + "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", + "format": "prettier --write .", + "lint": "prettier --check . && eslint .", + "migrate": "bunx drizzle-kit generate && bun run ./src/lib/compile-migrations.ts" + }, + "devDependencies": { + "@eslint/compat": "^1.2.5", + "@eslint/js": "^9.18.0", + "@sveltejs/kit": "^2.16.0", + "@sveltejs/vite-plugin-svelte": "^6.1.1", + "@tailwindcss/vite": "^4.0.0", + "@types/bun": "^1.3.8", + "@playwright/test": "^1.55.0", + "drizzle-kit": "^0.31.9", + "dotenv": "^17.2.3", + "eslint": "^9.18.0", + "eslint-config-prettier": "^10.0.1", + "eslint-plugin-svelte": "^3.0.0", + "globals": "^16.0.0", + "husky": "9.1.7", + "lint-staged": "16.1.0", + "prettier": "3.4.2", + "prettier-plugin-svelte": "3.3.3", + "prettier-plugin-tailwindcss": "0.6.11", + "svelte": "^5.0.0", + "svelte-check": "^4.0.0", + "tailwindcss": "^4.0.0", + "typescript": "^5.0.0", + "typescript-eslint": "^8.20.0", + "vite": "^7.1.1" + }, + "dependencies": { + "@lifi/intent": "^0.0.2-alpha", + "@electric-sql/pglite": "^0.3.15", + "@metamask/sdk": "^0.34.0", + "@sveltejs/adapter-cloudflare": "^7.0.3", + "@wagmi/connectors": "^7.2.1", + "@wagmi/core": "^3.4.0", + "axios": "^1.9.0", + "base64-js": "^1.5.1", + "drizzle-orm": "^0.45.1", + "rxjs": "^7.8.2", + "viem": "~2.45.1", + "wagmi": "^3.5.0" + } } diff --git a/packages/lintent/README.md b/packages/lintent/README.md deleted file mode 100644 index bcd4869..0000000 --- a/packages/lintent/README.md +++ /dev/null @@ -1,150 +0,0 @@ -# Core Library - -`src` is the domain layer for orders and intents. - -It owns: - -- Order data models and type guards. -- Intent creation and conversion logic. -- Order id and hashing logic for standard + multichain flows. -- Core validation/parsing used by higher-level libraries/screens. -- Dependency-injected domain behavior (for chain/oracle policy), without importing app config. - -It does not own: - -- UI behavior from app workspaces (`app/*`). -- External orchestration wrappers that live outside this package (except core parsing helpers in `api/`). - -## Architecture - -- `types.ts` - - Canonical types such as `StandardOrder`, `MultichainOrder`, and `OrderContainer`. - - Core token model is chain-id based (`token.chainId`), not chain-name based. -- `deps.ts` - - Minimal dependency interfaces consumed by core constructors/functions. -- `intent/` - - `create.ts`: High-level `Intent` builder. - - `fromOrder.ts`: `orderToIntent(...)` and `isStandardOrder(...)`. - - `standard.ts` / `multichain.ts`: Concrete intent implementations and order-id derivation. - - `compact/*`: Compact conversions/signing/claims helpers used by intent flows. -- `orderLib.ts` - - Validation helpers (`validateOrder...`) and output encoding/hash helpers. - - Multi-argument helpers accept object params, e.g. `validateOrderWithReason({ order, deps })`. -- `api/intentApi.ts` - - Normalization/parsing for intent-api payloads. -- `typedMessage.ts` - - EIP-712 type definitions and precomputed type hashes used in compact flows. -- `helpers/` and `compact/` - - Shared low-level helpers (conversions and compact lock/id utilities). - -## Core Entry Points - -Most contributors start with `intent/index.ts`: - -- `orderToIntent(...)` -- `isStandardOrder(...)` -- `StandardOrderIntent` -- `MultichainOrderIntent` -- `computeStandardOrderId(...)` -- `computeMultichainEscrowOrderId(...)` -- `computeMultichainCompactOrderId(...)` -- `hashMultichainInputs(...)` - -## Order Models - -`OrderContainer` wraps: - -- `inputSettler` -- `order` (`StandardOrder | MultichainOrder`) -- sponsor/allocator signatures - -Use `isStandardOrder(...)` as the canonical discriminator for branching between single-chain and multichain order logic. - -## Order Creation Flow - -Typical contributor path: - -1. Build an intent with `Intent` in `intent/create.ts` and inject `IntentDeps`. -2. Convert/hydrate with `orderToIntent(...)` from `intent/fromOrder.ts`. -3. Compute `orderId()` and chain-specific behavior through `StandardOrderIntent` or `MultichainOrderIntent`. - -Example: create/convert and derive order id. - -```ts -import { orderToIntent } from "@lifi/lintent/intent"; -import type { OrderContainer } from "@lifi/lintent/types"; - -function getOrderId(orderContainer: OrderContainer): `0x${string}` { - return orderToIntent(orderContainer).orderId(); -} -``` - -Example: branch behavior by order type during creation/execution logic. - -```ts -import { isStandardOrder, orderToIntent } from "@lifi/lintent/intent"; -import type { OrderContainer } from "@lifi/lintent/types"; - -function getInputCount(orderContainer: OrderContainer): number { - if (isStandardOrder(orderContainer.order)) - return orderContainer.order.inputs.length; - return orderContainer.order.inputs.reduce( - (sum, v) => sum + v.inputs.length, - 0, - ); -} - -function getInputChains(orderContainer: OrderContainer): bigint[] { - return orderToIntent(orderContainer).inputChains(); -} -``` - -## Hashing and Typed Messages - -`typedMessage.ts` defines EIP-712 type structures and verifies that computed type hashes match expected on-chain constants. Any change here can break compact claim/signature compatibility. - -When touching compact hashing or typed message definitions: - -- Keep encodings aligned with contracts. -- Treat hash constant changes as protocol-level changes. - -## Validation and Parsing - -- `orderLib.ts` - - `validateOrderWithReason(...)` - - `validateOrderContainerWithReason(...)` -- `api/intentApi.ts` - - `parseOrderStatusPayload(...)` - -These utilities are the core gate for normalizing and validating inbound order data before execution paths consume it. - -## Dependency Model - -- Core has no direct imports from app config/util modules. -- Dependencies are passed in scope at creation time (constructor/function), never via global mutable runtime. -- Keep dependencies minimal: - - `Intent` receives `IntentDeps`. - - Standard order validation receives `StandardOrderValidationDeps` (`{ order, deps }`). - - Container validation receives `OrderContainerValidationDeps` (`{ orderContainer, deps }`), adding `inputSettlers` for compact input-settler policy. - - Core-internal protocol constants live in `constants.ts`. - -## Safe Change Checklist - -- Use `isStandardOrder(...)` for order branching, not ad-hoc property checks. -- Keep hashing/encoding behavior stable unless you are intentionally changing protocol semantics. -- Keep core APIs chain-id based. Map app chain names to ids at app boundaries. -- Update/add tests when changing order construction, parsing, or hashing behavior. -- Run `bun run check` and relevant unit tests before merging. - -## File References - -- `src/types/index.ts` -- `src/intent/index.ts` -- `src/intent/create.ts` -- `src/intent/fromOrder.ts` -- `src/intent/standard.ts` -- `src/intent/multichain.ts` -- `src/output.ts` -- `src/validation.ts` -- `src/api/intentApi.ts` -- `src/typedMessage.ts` diff --git a/packages/lintent/_typos.toml b/packages/lintent/_typos.toml deleted file mode 100644 index 70c933b..0000000 --- a/packages/lintent/_typos.toml +++ /dev/null @@ -1,3 +0,0 @@ -[default.extend-words] -oif = "oif" -OIF = "OIF" \ No newline at end of file diff --git a/packages/lintent/package.json b/packages/lintent/package.json deleted file mode 100644 index f9df9c5..0000000 --- a/packages/lintent/package.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "name": "@lifi/lintent", - "private": true, - "version": "0.1.0", - "type": "module", - "files": [ - "src", - "tests" - ], - "exports": { - ".": "./src/index.ts", - "./types": "./src/types/index.ts", - "./types/*": "./src/types/*.ts", - "./intent": "./src/intent/index.ts", - "./intent/*": "./src/intent/*.ts", - "./api/*": "./src/api/*.ts", - "./helpers/*": "./src/helpers/*.ts", - "./compact/*": "./src/compact/*.ts", - "./testing/*": "./tests/*.ts", - "./*": "./src/*.ts" - }, - "scripts": { - "test": "bun test", - "check": "tsc --noEmit -p tsconfig.json", - "build": "tsc --noEmit -p tsconfig.json" - }, - "dependencies": { - "axios": "^1.9.0", - "viem": "~2.45.1" - }, - "devDependencies": { - "@types/bun": "^1.3.8", - "typescript": "^5.6.3" - } -} diff --git a/packages/lintent/src/api/intentApi.spec.ts b/packages/lintent/src/api/intentApi.spec.ts deleted file mode 100644 index b253e43..0000000 --- a/packages/lintent/src/api/intentApi.spec.ts +++ /dev/null @@ -1,152 +0,0 @@ -import { describe, expect, it } from "bun:test"; -import { INPUT_SETTLER_ESCROW_LIFI } from "../constants"; -import { isStandardOrder } from "../intent"; -import { parseOrderStatusPayload } from "./intentApi"; - -const BYTES32_ONE = - "0x0000000000000000000000000000000000000000000000000000000000000001" as const; -const INPUT_SETTLER = INPUT_SETTLER_ESCROW_LIFI; - -describe("parseOrderStatusPayload", () => { - it("parses a status payload into an OrderContainer", () => { - const payload = { - data: { - order: { - user: "0x1111111111111111111111111111111111111111", - nonce: "123", - originChainId: "8453", - expires: Math.floor(Date.now() / 1000) + 3600, - fillDeadline: Math.floor(Date.now() / 1000) + 1800, - inputOracle: "0x0000000000000000000000000000000000000001", - inputs: [["1", "1000000"]], - outputs: [ - { - oracle: BYTES32_ONE, - settler: BYTES32_ONE, - chainId: "42161", - token: BYTES32_ONE, - amount: "1000000", - recipient: BYTES32_ONE, - callbackData: "0x", - context: "0x", - }, - ], - }, - inputSettler: INPUT_SETTLER, - sponsorSignature: null, - allocatorSignature: "0x1234", - }, - }; - - const parsed = parseOrderStatusPayload(payload); - - expect(parsed.inputSettler).toBe(INPUT_SETTLER); - expect(parsed.order.nonce).toBe(123n); - expect(isStandardOrder(parsed.order) && parsed.order.originChainId).toBe( - 8453n, - ); - expect(parsed.sponsorSignature).toEqual({ type: "None", payload: "0x" }); - expect(parsed.allocatorSignature).toEqual({ - type: "ECDSA", - payload: "0x1234", - }); - }); - - it("parses a multichain payload nested under data[0].intent", () => { - const payload = { - data: [ - { - intent: { - order: { - user: "0x1111111111111111111111111111111111111111", - nonce: "12", - expires: 2_000_000_000, - fillDeadline: 1_999_999_900, - inputOracle: "0x0000000000000000000000000000000000000001", - outputs: [ - { - oracle: BYTES32_ONE, - settler: BYTES32_ONE, - chainId: "8453", - token: BYTES32_ONE, - amount: "100", - recipient: BYTES32_ONE, - callbackData: "0x", - context: "0x", - }, - ], - inputs: [ - { chainId: "1", inputs: [["1", "10"]] }, - { chainId: "42161", inputs: [["2", "20"]] }, - ], - }, - inputSettler: INPUT_SETTLER, - sponsorSignature: "0xbeef", - allocatorSignature: null, - }, - }, - ], - }; - - const parsed = parseOrderStatusPayload(payload); - expect(isStandardOrder(parsed.order)).toBe(false); - if (isStandardOrder(parsed.order)) - throw new Error("Expected multichain order"); - - expect(parsed.order.inputs.length).toBe(2); - expect(parsed.order.inputs[1].chainId).toBe(42161n); - expect(parsed.sponsorSignature).toEqual({ - type: "ECDSA", - payload: "0xbeef", - }); - expect(parsed.allocatorSignature).toEqual({ type: "None", payload: "0x" }); - }); - - it("throws for invalid payload", () => { - expect(() => parseOrderStatusPayload({ data: {} })).toThrow(); - }); - - it("throws when user is not a hex address", () => { - const payload = { - data: { - order: { - user: "not-a-hex-address", - nonce: "123", - originChainId: "8453", - expires: 2_000_000_000, - fillDeadline: 1_999_999_900, - inputOracle: "0x0000000000000000000000000000000000000001", - inputs: [["1", "1000000"]], - outputs: [], - }, - inputSettler: INPUT_SETTLER, - }, - }; - - expect(() => parseOrderStatusPayload(payload)).toThrow( - "Order payload invalid: order.user", - ); - }); - - it("throws when standard order input tuple is malformed", () => { - const payload = { - data: { - order: { - user: "0x1111111111111111111111111111111111111111", - nonce: "123", - originChainId: "8453", - expires: 2_000_000_000, - fillDeadline: 1_999_999_900, - inputOracle: "0x0000000000000000000000000000000000000001", - inputs: [["1"]], - outputs: [], - }, - inputSettler: INPUT_SETTLER, - }, - }; - - expect(() => parseOrderStatusPayload(payload)).toThrow( - "Order payload invalid: inputs[0]", - ); - }); -}); diff --git a/packages/lintent/src/api/intentApi.ts b/packages/lintent/src/api/intentApi.ts deleted file mode 100644 index b5cfada..0000000 --- a/packages/lintent/src/api/intentApi.ts +++ /dev/null @@ -1,591 +0,0 @@ -import axios from "axios"; -import type { - MultichainOrder, - NoSignature, - OrderContainer, - Quote, - Signature, - StandardOrder, -} from "../types"; -import { isStandardOrder } from "../intent"; -import { getInteropableAddress } from "../helpers/interopableAddress"; - -type OrderStatus = "Signed" | "Delivered" | "Settled"; - -type SubmitOrderDto = { - orderType: "CatalystCompactOrder"; - order: StandardOrder; - inputSettler: `0x${string}`; - sponsorSignature?: `0x${string}`; - allocatorSignature?: `0x${string}`; - compactRegistrationTxHash?: `0x${string}`; -}; - -type intentApiPush = (orderArr: { - order: StandardOrder; - inputSettler: `0x${string}`; - sponsorSignature?: `0x${string}`; - allocatorSignature?: `0x${string}`; -}) => void; - -type GetOrderResponse = { - data: { - order: StandardOrder; - quote: Quote; - sponsorSignature: `0x${string}` | null; - allocatorSignature?: `0x${string}` | null; - inputSettler: `0x${string}`; - meta: { - submitTime: number; - orderStatus: OrderStatus; - destinationAddress: `0x${string}`; - orderIdentifier: string; - onChainOrderId: `0x${string}`; - signedAt: string; - expiredAt: string | null; - }; - }[]; - meta: { - limit: number; - offset: number; - total: number; - }; -}; - -type GetQuoteOptions = { - user: `0x${string}`; - userChainId: number | bigint; - inputs: { - sender: `0x${string}`; - asset: `0x${string}`; - chainId: number | bigint; - amount: bigint; - }[]; - outputs: { - receiver: `0x${string}`; - asset: `0x${string}`; - chainId: number | bigint; - amount: bigint; - }[]; - minValidUntil?: number; - exclusiveFor?: `0x${string}`[]; -}; - -type GetQuoteResponse = { - quotes: { - order: null; - eta: null; - validUntil: null; - quoteId: null; - metadata: { - exclusiveFor: `0x${string}` | `0x${string}`[]; - }; - preview: { - inputs: { - user: `0x${string}`; - asset: `0x${string}`; - amount: string; - }[]; - outputs: { - receiver: `0x${string}`; - asset: `0x${string}`; - amount: string; - }[]; - }; - provider: null; - partialFill: false; - failureHandling: "refund-automatic"; - }[]; -}; - -type OrderEnvelope = { - order: unknown; - inputSettler: unknown; - sponsorSignature?: unknown; - allocatorSignature?: unknown; -}; - -function toHexString(value: unknown, field: string): `0x${string}` { - if (typeof value !== "string" || !value.startsWith("0x")) { - throw new Error(`Order payload invalid: ${field}`); - } - return value as `0x${string}`; -} - -function toBigIntValue(value: unknown, field: string): bigint { - if (typeof value === "bigint") return value; - if (typeof value === "number" && Number.isFinite(value)) return BigInt(value); - if (typeof value === "string" && value.length > 0) return BigInt(value); - throw new Error(`Order payload invalid: ${field}`); -} - -function toNumberValue(value: unknown, field: string): number { - if (typeof value === "number" && Number.isFinite(value)) return value; - if (typeof value === "bigint") return Number(value); - if (typeof value === "string" && value.length > 0) return Number(value); - throw new Error(`Order payload invalid: ${field}`); -} - -function normalizeSignature(value: unknown): Signature | NoSignature { - if (!value) return { type: "None", payload: "0x" }; - return { - type: "ECDSA", - payload: toHexString(value, "signature"), - }; -} - -function normalizeOutputs(value: unknown) { - if (!Array.isArray(value)) throw new Error("Order payload invalid: outputs"); - return value.map((output, index) => { - if (!output || typeof output !== "object") { - throw new Error(`Order payload invalid: outputs[${index}]`); - } - const o = output as Record; - return { - oracle: toHexString(o.oracle, `outputs[${index}].oracle`), - settler: toHexString(o.settler, `outputs[${index}].settler`), - chainId: toBigIntValue(o.chainId, `outputs[${index}].chainId`), - token: toHexString(o.token, `outputs[${index}].token`), - amount: toBigIntValue(o.amount, `outputs[${index}].amount`), - recipient: toHexString(o.recipient, `outputs[${index}].recipient`), - callbackData: toHexString( - o.callbackData ?? "0x", - `outputs[${index}].callbackData`, - ), - context: toHexString(o.context ?? "0x", `outputs[${index}].context`), - }; - }); -} - -function normalizeStandardOrder(order: Record): StandardOrder { - if (!Array.isArray(order.inputs)) - throw new Error("Order payload invalid: inputs"); - return { - user: toHexString(order.user, "order.user"), - nonce: toBigIntValue(order.nonce, "order.nonce"), - originChainId: toBigIntValue(order.originChainId, "order.originChainId"), - expires: toNumberValue(order.expires, "order.expires"), - fillDeadline: toNumberValue(order.fillDeadline, "order.fillDeadline"), - inputOracle: toHexString(order.inputOracle, "order.inputOracle"), - inputs: order.inputs.map((input, index) => { - if (!Array.isArray(input) || input.length !== 2) { - throw new Error(`Order payload invalid: inputs[${index}]`); - } - return [ - toBigIntValue(input[0], `inputs[${index}][0]`), - toBigIntValue(input[1], `inputs[${index}][1]`), - ]; - }), - outputs: normalizeOutputs(order.outputs), - }; -} - -function normalizeMultichainOrder( - order: Record, -): MultichainOrder { - if (!Array.isArray(order.inputs)) - throw new Error("Order payload invalid: inputs"); - return { - user: toHexString(order.user, "order.user"), - nonce: toBigIntValue(order.nonce, "order.nonce"), - expires: toNumberValue(order.expires, "order.expires"), - fillDeadline: toNumberValue(order.fillDeadline, "order.fillDeadline"), - inputOracle: toHexString(order.inputOracle, "order.inputOracle"), - outputs: normalizeOutputs(order.outputs), - inputs: order.inputs.map((input, index) => { - if (!input || typeof input !== "object") { - throw new Error(`Order payload invalid: inputs[${index}]`); - } - const i = input as Record; - if (!Array.isArray(i.inputs)) { - throw new Error(`Order payload invalid: inputs[${index}].inputs`); - } - return { - chainId: toBigIntValue(i.chainId, `inputs[${index}].chainId`), - inputs: i.inputs.map((tuple, tupleIndex) => { - if (!Array.isArray(tuple) || tuple.length !== 2) { - throw new Error( - `Order payload invalid: inputs[${index}].inputs[${tupleIndex}]`, - ); - } - return [ - toBigIntValue( - tuple[0], - `inputs[${index}].inputs[${tupleIndex}][0]`, - ), - toBigIntValue( - tuple[1], - `inputs[${index}].inputs[${tupleIndex}][1]`, - ), - ]; - }), - }; - }), - }; -} - -function extractOrderEnvelope(payload: unknown): OrderEnvelope { - const root = - payload && typeof payload === "object" && "data" in payload - ? (payload as Record).data - : payload; - const candidateRaw = Array.isArray(root) ? root[0] : root; - if (!candidateRaw || typeof candidateRaw !== "object") { - throw new Error("Order payload invalid: data"); - } - const candidate = candidateRaw as Record; - const c = - candidate.intent && typeof candidate.intent === "object" - ? (candidate.intent as Record) - : candidate; - if (!("order" in c) || !("inputSettler" in c)) { - throw new Error("Order payload invalid: missing order fields"); - } - return c as OrderEnvelope; -} - -export function parseOrderStatusPayload(payload: unknown): OrderContainer { - const envelope = extractOrderEnvelope(payload); - const rawOrder = envelope.order as Record; - if (!rawOrder || typeof rawOrder !== "object") { - throw new Error("Order payload invalid: order"); - } - const orderLike = rawOrder as StandardOrder | MultichainOrder; - const order = isStandardOrder(orderLike) - ? normalizeStandardOrder(rawOrder) - : normalizeMultichainOrder(rawOrder); - - return { - inputSettler: toHexString(envelope.inputSettler, "inputSettler"), - order, - sponsorSignature: normalizeSignature(envelope.sponsorSignature), - allocatorSignature: normalizeSignature(envelope.allocatorSignature), - }; -} - -export class IntentApi { - baseUrl: string; - websocketUrl: string; - - api; - - constructor(mainnet: boolean) { - this.baseUrl = IntentApi.getIntentApiUrl(mainnet); - this.websocketUrl = IntentApi.getIntentApiWssUrl(mainnet); - - this.api = axios.create({ - baseURL: this.baseUrl, - timeout: 15000, - }); - } - - private static sleep(ms: number) { - return new Promise((resolve) => setTimeout(resolve, ms)); - } - - private static isNetworkError(error: unknown): boolean { - if (!axios.isAxiosError(error)) return false; - return error.code === "ERR_NETWORK" || error.code === "ECONNABORTED"; - } - - private async waitForOnline(maxWaitMs = 15000) { - if (typeof window === "undefined" || typeof navigator === "undefined") - return; - if (navigator.onLine) return; - await Promise.race([ - new Promise((resolve) => { - const onOnline = () => { - window.removeEventListener("online", onOnline); - resolve(); - }; - window.addEventListener("online", onOnline, { once: true }); - }), - IntentApi.sleep(maxWaitMs), - ]); - } - - private async postWithRetry( - path: string, - body: unknown, - opts: { retries?: number; baseDelayMs?: number } = {}, - ): Promise { - const retries = opts.retries ?? 2; - const baseDelayMs = opts.baseDelayMs ?? 500; - let attempt = 0; - while (true) { - try { - const response = await this.api.post(path, body); - return response.data as T; - } catch (error) { - if (!IntentApi.isNetworkError(error) || attempt >= retries) throw error; - await this.waitForOnline(); - await IntentApi.sleep(baseDelayMs * 2 ** attempt); - attempt += 1; - } - } - } - - static getIntentApiUrl(mainnet: boolean) { - return mainnet ? "https://order.li.fi" : "https://order-dev.li.fi"; - } - - static getIntentApiWssUrl(mainnet: boolean) { - return mainnet ? "wss://order.li.fi" : "wss://order-dev.li.fi"; - } - - /** - * @notice Submits an order to the intent-api - * @param request The order submission request - * @returns The response data from the intent-api - */ - async submitOrder(request: SubmitOrderDto) { - try { - return await this.postWithRetry("/orders/submit", request, { - retries: 2, - baseDelayMs: 600, - }); - } catch (error) { - console.error("Error submitting order:", error); - throw error; - } - } - - /** - * @notice Gets latest orders from the intent-api - * @param options Optional parameters to filter orders - * @returns The response data containing the orders - */ - async getOrders(options?: { user?: `0x${string}`; status?: OrderStatus }) { - try { - const response = await this.api.get("/orders", { - params: { limit: 50, offset: 0, ...options }, - }); - return response.data as GetOrderResponse; - } catch (error) { - console.error("Error getting orders:", error); - throw error; - } - } - - /** - * @notice Gets an order by on-chain order id. - * @param orderId On-chain order id (0x-prefixed hash) - */ - async getOrderByOnChainOrderId( - orderId: `0x${string}`, - ): Promise { - try { - const response = await this.api.get("/orders/status/", { - params: { onChainOrderId: orderId }, - }); - return parseOrderStatusPayload(response.data); - } catch (error) { - if (axios.isAxiosError(error) && error.response?.status === 404) { - throw new Error("Order not found"); - } - if ( - error instanceof Error && - error.message.startsWith("Order payload invalid") - ) { - throw error; - } - console.error("Error getting order by id:", error); - throw new Error("Failed to fetch order"); - } - } - - /** - * @notice Fetch an intent quote for a set of inputs and outputs. - * @param options The intent specifications - * @returns The response data containing the quotes - */ - async getQuotes(options: GetQuoteOptions): Promise { - const { user, userChainId, inputs, outputs, minValidUntil, exclusiveFor } = - options; - - const lockType: undefined | { kind: "the-compact" } = undefined; - - const rq: { - user: string; - intent: { - intentType: "oif-swap"; - inputs: { - user: string; - asset: string; - amount: string; - lock: { kind: "the-compact" } | undefined; - }[]; - outputs: { - receiver: string; - asset: string; - amount: string; - }[]; - swapType: "exact-input"; - minValidUntil: number | undefined; - metadata?: { - exclusiveFor: `0x${string}`[]; - }; - }; - supportedTypes: ["oif-escrow-v0"]; - } = { - user: getInteropableAddress(user, userChainId), - intent: { - intentType: "oif-swap", - inputs: inputs.map((input) => { - return { - user: getInteropableAddress(input.sender, input.chainId), - asset: getInteropableAddress(input.asset, input.chainId), - amount: input.amount.toString(), - lock: lockType, - }; - }), - outputs: outputs.map((output) => { - return { - receiver: getInteropableAddress(output.receiver, output.chainId), - asset: getInteropableAddress(output.asset, output.chainId), - amount: output.amount.toString(), - }; - }), - swapType: "exact-input", - minValidUntil, - }, - supportedTypes: ["oif-escrow-v0"], - }; - if (exclusiveFor && exclusiveFor.length > 0) - rq.intent.metadata = { exclusiveFor }; - - try { - return await this.postWithRetry("/quote/request", rq, { - retries: 3, - baseDelayMs: 700, - }); - } catch (error) { - console.error("Error fetching quote:", error); - throw error; - } - } - - connectIntentApiSocket(newOrderFunction: intentApiPush) { - let shouldReconnect = true; - let backoffMs = 1000; - const MAX_BACKOFF = 30000; - let socket: WebSocket; - let reconnectTimer: ReturnType | undefined; - - const connect = () => { - if (!shouldReconnect) return; - socket = new WebSocket(this.websocketUrl); - - socket.onmessage = function (event) { - const message = JSON.parse(event.data); - - switch (message.event) { - case "user:vm-order-submit": { - const incomingOrder = message.data as SubmitOrderDto; - newOrderFunction(incomingOrder); - break; - } - case "ping": - socket.send( - JSON.stringify({ - event: "pong", - }), - ); - break; - default: - break; - } - }; - - socket.addEventListener("open", () => { - console.log("Connected to Catalyst intent-api"); - backoffMs = 1000; // Reset backoff on successful connection - }); - - socket.addEventListener("close", () => { - console.log("Disconnected from Catalyst intent-api"); - if (shouldReconnect) { - console.log(`Reconnecting in ${backoffMs}ms...`); - if (reconnectTimer) clearTimeout(reconnectTimer); - reconnectTimer = setTimeout(() => { - reconnectTimer = undefined; - connect(); - }, backoffMs); - backoffMs = Math.min(backoffMs * 2, MAX_BACKOFF); - } - }); - - socket.addEventListener("error", (event) => { - console.error("WebSocket error:", event); - }); - }; - - connect(); - - return { - get socket() { - return socket; - }, - disconnect: () => { - shouldReconnect = false; - if (reconnectTimer) { - clearTimeout(reconnectTimer); - reconnectTimer = undefined; - } - socket.close(); - }, - }; - } - - // -- Translations -- // - - /** - * @notice Fetches all intents from the LI.FI intent-api and then transmutes them into OrderContainers. - */ - async getAndParseOrders(): Promise { - const response = await this.getOrders(); - const parsedOrders = response.data; - if (parsedOrders) { - if (Array.isArray(parsedOrders)) { - // For each order, if a field is string ending in n, convert it to bigint. - return parsedOrders.map((instance) => { - instance.order.nonce = BigInt(instance.order.nonce); - instance.order.originChainId = BigInt(instance.order.originChainId); - if (instance.order.inputs) { - instance.order.inputs = instance.order.inputs.map((input) => { - return [BigInt(input[0]), BigInt(input[1])]; - }); - } - if (instance.order.outputs) { - instance.order.outputs = instance.order.outputs.map((output) => { - return { - ...output, - chainId: BigInt(output.chainId), - amount: BigInt(output.amount), - }; - }); - } - const allocatorSignature = instance.allocatorSignature - ? ({ - type: "ECDSA", - payload: instance.allocatorSignature, - } as Signature) - : ({ - type: "None", - payload: "0x", - } as NoSignature); - const sponsorSignature = instance.sponsorSignature - ? ({ - type: "ECDSA", - payload: instance.sponsorSignature, - } as Signature) - : ({ - type: "None", - payload: "0x", - } as NoSignature); - return { ...instance, allocatorSignature, sponsorSignature }; - }); - } - } - } -} diff --git a/packages/lintent/src/compact/idLib.spec.ts b/packages/lintent/src/compact/idLib.spec.ts deleted file mode 100644 index e0283e3..0000000 --- a/packages/lintent/src/compact/idLib.spec.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { describe, expect, it } from "bun:test"; -import { toId } from "./idLib"; - -const CHECKSUMMED_TOKEN = "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"; -const LOWERCASE_TOKEN = "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48"; - -describe("idLib.toId", () => { - it("returns deterministic lock ids for identical inputs", () => { - const id1 = toId(true, 0, "1", CHECKSUMMED_TOKEN); - const id2 = toId(true, 0, "1", CHECKSUMMED_TOKEN); - expect(id1).toBe(id2); - }); - - it("sets scope bit based on inputChains flag", () => { - const multichainId = toId(true, 0, "1", CHECKSUMMED_TOKEN); - const singlechainId = toId(false, 0, "1", CHECKSUMMED_TOKEN); - - expect((multichainId >> 255n) & 1n).toBe(0n); - expect((singlechainId >> 255n) & 1n).toBe(1n); - }); - - it("normalizes token addresses regardless of checksum casing", () => { - const checksummed = toId(true, 0, "1", CHECKSUMMED_TOKEN); - const lowercase = toId(true, 0, "1", LOWERCASE_TOKEN); - expect(checksummed).toBe(lowercase); - }); - - it("throws for reset period outside [0, 7]", () => { - expect(() => toId(true, -1, "1", CHECKSUMMED_TOKEN)).toThrow( - "Reset period must be between 0 and 7" - ); - expect(() => toId(true, 8, "1", CHECKSUMMED_TOKEN)).toThrow( - "Reset period must be between 0 and 7" - ); - }); - - it("throws when allocator id does not fit in 92 bits", () => { - const tooLargeAllocator = (1n << 92n).toString(); - expect(() => toId(true, 0, tooLargeAllocator, CHECKSUMMED_TOKEN)).toThrow( - "AllocatorId must fit in 92 bits" - ); - }); -}); diff --git a/packages/lintent/src/compact/idLib.ts b/packages/lintent/src/compact/idLib.ts deleted file mode 100644 index 3f1010e..0000000 --- a/packages/lintent/src/compact/idLib.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { getAddress, hexToBigInt } from "viem"; - -// source: https://github.com/Uniswap/CompactX/blob/main/src/utils/lockId.ts#L17 - -export enum ResetPeriod { - OneSecond = 0, - FifteenSeconds, - OneMinute, - TenMinutes, - OneHourAndFiveMinutes, - OneDay, - SevenDaysAndOneHour, - ThirtyDays -} - -/** - * Converts lock parameters to a unique ID. - * The ID consists of: - * - Bit 255: scope (0 for multichain, 1 for single chain) - * - Bits 252-254: reset period - * - Bits 160-251: allocator ID (92 bits) - * - Bits 0-159: token address (20 bytes = 160 bits) - * - * @param inputChains Whether the lock is multichain (maps to scope) - * @param resetPeriod Reset period (0-7) - * @param allocatorId Allocator ID as string - * @param token Token address as hex string - * @returns The derived resource lock ID as a BigInt - */ -export function toId( - inputChains: boolean, - resetPeriod: number, - allocatorId: string, - token: string -): bigint { - // Validate inputs - if (resetPeriod < 0 || resetPeriod > 7) { - throw new Error("Reset period must be between 0 and 7"); - } - // Validate token is a valid address and normalize it - const normalizedToken = getAddress(token); - - // Convert inputChains to scope (inverse relationship) - const scope = inputChains ? 0n : 1n; - - // Convert allocatorId from decimal string to BigInt - const allocatorBigInt = BigInt(allocatorId); - if (allocatorBigInt > (1n << 92n) - 1n) { - throw new Error("AllocatorId must fit in 92 bits"); - } - - // Convert token address to BigInt using viem - const tokenBigInt = hexToBigInt(normalizedToken); - - // Perform bitwise operations - const scopeBits = scope << 255n; - const resetPeriodBits = BigInt(resetPeriod) << 252n; - const allocatorBits = allocatorBigInt << 160n; - - // Combine all bits using bitwise OR - const id = scopeBits | resetPeriodBits | allocatorBits | tokenBigInt; - - return id; -} diff --git a/packages/lintent/src/constants.ts b/packages/lintent/src/constants.ts deleted file mode 100644 index b5031d5..0000000 --- a/packages/lintent/src/constants.ts +++ /dev/null @@ -1,13 +0,0 @@ -export const ADDRESS_ZERO = "0x0000000000000000000000000000000000000000" as const; -export const BYTES32_ZERO = - "0x0000000000000000000000000000000000000000000000000000000000000000" as const; - -export const COMPACT = "0x00000000000000171ede64904551eeDF3C6C9788" as const; -export const COIN_FILLER = "0x0000000000eC36B683C2E6AC89e9A75989C22a2e" as const; - -export const INPUT_SETTLER_COMPACT_LIFI = "0x0000000000cd5f7fDEc90a03a31F79E5Fbc6A9Cf" as const; -export const INPUT_SETTLER_ESCROW_LIFI = "0x000025c3226C00B2Cdc200005a1600509f4e00C0" as const; -export const MULTICHAIN_INPUT_SETTLER_ESCROW = - "0xb912b4c38ab54b94D45Ac001484dEBcbb519Bc2B" as const; -export const MULTICHAIN_INPUT_SETTLER_COMPACT = - "0x1fccC0807F25A58eB531a0B5b4bf3dCE88808Ed7" as const; diff --git a/packages/lintent/src/deps.ts b/packages/lintent/src/deps.ts deleted file mode 100644 index db99abd..0000000 --- a/packages/lintent/src/deps.ts +++ /dev/null @@ -1,24 +0,0 @@ -export type CoreVerifier = "wormhole" | "polymer" | (string & {}); - -export type IntentDeps = { - getOracle: ( - verifier: CoreVerifier, - chainId: bigint, - ) => `0x${string}` | undefined; -}; - -export type StandardOrderValidationDeps = { - allowedInputOracles: ( - args: Readonly<{ chainId: bigint; sameChainFill: boolean }>, - ) => readonly `0x${string}`[] | undefined; - allowedOutputOracles: ( - chainId: bigint, - ) => readonly `0x${string}`[] | undefined; - allowedOutputSettlers: () => readonly `0x${string}`[]; -}; - -export type OrderContainerValidationDeps = StandardOrderValidationDeps & { - inputSettlers: readonly `0x${string}`[]; -}; - -export type OrderValidationDeps = OrderContainerValidationDeps; diff --git a/packages/lintent/src/helpers/convert.ts b/packages/lintent/src/helpers/convert.ts deleted file mode 100644 index ee97ecc..0000000 --- a/packages/lintent/src/helpers/convert.ts +++ /dev/null @@ -1,53 +0,0 @@ -// --- Type conversion helpers --- // - -import { checksumAddress } from "viem"; - -export function toBigIntWithDecimals(value: number, decimals: number): bigint { - // Convert number to string in full precision - const [intPart, decPart = ""] = value.toString().split("."); - - // Take up to `decimals` digits of the decimal part - const truncatedDec = decPart.slice(0, decimals); - - // Pad the decimal part to ensure we have exactly `decimals` digits - const paddedDec = truncatedDec.padEnd(decimals, "0"); - - // Remove leading zeros from intPart just in case - const normalizedInt = intPart.replace(/^(-?)0+(?=\d)/, "$1"); - // Combine parts - const combined = (normalizedInt + paddedDec).replace(".", ""); - - return BigInt(combined); -} - -export function addressToBytes32(address: `0x${string}`): `0x${string}` { - if (address.length !== 42 && address.length !== 40) { - throw new Error(`Invalid address length: ${address.length}`); - } - return `0x${address.replace("0x", "").padStart(64, "0")}`; -} - -export function bytes32ToAddress(bytes: `0x${string}`): `0x${string}` { - if (bytes.length != 66 && bytes.length != 64) { - throw new Error(`Invalid bytes length: ${bytes.length}`); - } - return `0x${bytes.replace("0x", "").slice(24, 64)}`; -} - -export function idToToken(id: `0x${string}` | bigint): `0x${string}` { - if (typeof id === "string" && id.indexOf("0x") != 0) { - id = BigInt(id); - } - if (typeof id === "bigint") { - // Convert bigint to hex string and pad it to 64 characters. - id = `0x${id.toString(16).padStart(64, "0")}`; - } - // Remove the first 12 bytes (24 hex characters) and keep the last 20 bytes (40 hex characters). - return checksumAddress(bytes32ToAddress(id)); -} - -export function trunc(value: `0x${string}`, length: number = 6): `0x${string}...${string}` { - return `0x${value.replace("0x", "").slice(0, length)}...${value - .replace("0x", "") - .slice(-length)}`; -} diff --git a/packages/lintent/src/helpers/interopableAddress.ts b/packages/lintent/src/helpers/interopableAddress.ts deleted file mode 100644 index 39de6cc..0000000 --- a/packages/lintent/src/helpers/interopableAddress.ts +++ /dev/null @@ -1,36 +0,0 @@ -function padEven(s: string, minimal = 2, pad: string = "0") { - return s.padStart(((Math.max(s.length + 1, minimal) / 2) | 0) * 2, pad); -} - -function toHex( - num: number | bigint, - bytes: number = 1, - prefix?: T -): `${T}${string}` { - const p = (prefix ?? "") as T; - return `${p}${padEven(num.toString(16), bytes * 2)}` as `${T}${string}`; -} - -type Version = "0001"; -type ChainType = "0000"; -type ChainReferenceLength = string; -type ChainReference = string; -type Address = string; - -export type InteropableAddress = - `0x${Version}${ChainType}${ChainReferenceLength}${ChainReference}${Address}`; - -export const getInteropableAddress = ( - address: `0x${string}`, - chainId: number | bigint -): InteropableAddress => { - const version = "0001"; - const chainType = "0000"; - - const chainReference = padEven(chainId.toString(16)); - const chainReferenceLength = toHex(chainReference.length / 2); - - return `0x${version}${chainType}${chainReferenceLength}${chainReference}${toHex( - address.replace("0x", "").length / 2 - )}${address.replace("0x", "")}`; -}; diff --git a/packages/lintent/src/index.ts b/packages/lintent/src/index.ts deleted file mode 100644 index e4174be..0000000 --- a/packages/lintent/src/index.ts +++ /dev/null @@ -1,12 +0,0 @@ -export * from "./types"; -export * from "./deps"; -export * from "./constants"; -export * from "./output"; -export * from "./validation"; -export { - compactTypes, - compact_type_hash, - multichain_compact_type_hash, -} from "./typedMessage"; -export * from "./intent"; -export * from "./api/intentApi"; diff --git a/packages/lintent/src/intent/compact/claims.ts b/packages/lintent/src/intent/compact/claims.ts deleted file mode 100644 index c89cb6a..0000000 --- a/packages/lintent/src/intent/compact/claims.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { encodePacked, hashStruct, keccak256 } from "viem"; -import { compactTypes } from "../../typedMessage"; -import type { BatchCompact, MultichainCompact } from "../../types"; - -export const MULTICHAIN_COMPACT_TYPEHASH_WITH_WITNESS = keccak256( - encodePacked( - ["string"], - [ - "MultichainCompact(address sponsor,uint256 nonce,uint256 expires,Element[] elements)Element(address arbiter,uint256 chainId,Lock[] commitments,Mandate mandate)Lock(bytes12 lockTag,address token,uint256 amount)Mandate(uint32 fillDeadline,address inputOracle,MandateOutput[] outputs)MandateOutput(bytes32 oracle,bytes32 settler,uint256 chainId,bytes32 token,uint256 amount,bytes32 recipient,bytes callbackData,bytes context)", - ], - ), -); - -export function compactClaimHash(batchCompact: BatchCompact): `0x${string}` { - return hashStruct({ - data: batchCompact, - types: compactTypes, - primaryType: "BatchCompact", - }); -} - -export function multichainCompactClaimHash( - multichainCompact: MultichainCompact, -): `0x${string}` { - return hashStruct({ - data: multichainCompact, - types: compactTypes, - primaryType: "MultichainCompact", - }); -} diff --git a/packages/lintent/src/intent/compact/conversions.spec.ts b/packages/lintent/src/intent/compact/conversions.spec.ts deleted file mode 100644 index 6887b52..0000000 --- a/packages/lintent/src/intent/compact/conversions.spec.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { describe, expect, it } from "bun:test"; -import { toHex } from "viem"; -import { tokenIdToLock } from "./conversions"; - -describe("compact conversions", () => { - it("splits tokenId into lockTag and token without corrupting hex boundaries", () => { - const tokenId = BigInt("0x112233445566778899aabbcc00112233445566778899aabbccddeeff00112233"); - const amount = 42n; - const lock = tokenIdToLock(tokenId, amount); - const raw = toHex(tokenId, { size: 32 }).slice(2); - - expect(lock.amount).toBe(amount); - expect(lock.lockTag).toMatch(/^0x[0-9a-fA-F]{24}$/); - expect(lock.token).toMatch(/^0x[0-9a-fA-F]{40}$/); - expect(lock.lockTag.startsWith("0x0x")).toBe(false); - expect(`${lock.lockTag.slice(2)}${lock.token.slice(2)}`).toBe(raw); - }); -}); diff --git a/packages/lintent/src/intent/compact/conversions.ts b/packages/lintent/src/intent/compact/conversions.ts deleted file mode 100644 index 110b3e6..0000000 --- a/packages/lintent/src/intent/compact/conversions.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { toHex } from "viem"; -import type { - BatchCompact, - CompactMandate, - Element, - Lock, - MultichainCompact, - MultichainOrder, - StandardOrder, -} from "../../types"; - -export function tokenIdToLock(tokenId: bigint, amount: bigint): Lock { - const bytes32 = toHex(tokenId, { size: 32 }).slice(2); - return { - lockTag: `0x${bytes32.slice(0, 12 * 2)}`, - token: `0x${bytes32.slice(12 * 2, 32 * 2)}`, - amount, - }; -} - -export function inputsToLocks(inputs: [bigint, bigint][]): Lock[] { - return inputs.map(([tokenId, amount]) => tokenIdToLock(tokenId, amount)); -} - -export function toStandardBatchCompact( - order: StandardOrder, - arbiter: `0x${string}`, -): BatchCompact { - const mandate: CompactMandate = { - fillDeadline: order.fillDeadline, - inputOracle: order.inputOracle, - outputs: order.outputs, - }; - return { - arbiter, - sponsor: order.user, - nonce: order.nonce, - expires: BigInt(order.expires), - commitments: inputsToLocks(order.inputs), - mandate, - }; -} - -export function toMultichainElements( - order: MultichainOrder, - arbiter: `0x${string}`, -): Element[] { - const mandate: CompactMandate = { - fillDeadline: order.fillDeadline, - inputOracle: order.inputOracle, - outputs: order.outputs, - }; - return order.inputs.map((inputs) => { - return { - arbiter, - chainId: inputs.chainId, - commitments: inputsToLocks(inputs.inputs), - mandate, - }; - }); -} - -export function toMultichainBatchCompact( - order: MultichainOrder, - arbiter: `0x${string}`, -): MultichainCompact { - const mandate: CompactMandate = { - fillDeadline: order.fillDeadline, - inputOracle: order.inputOracle, - outputs: order.outputs, - }; - return { - sponsor: order.user, - nonce: order.nonce, - expires: BigInt(order.expires), - elements: toMultichainElements(order, arbiter), - mandate, - }; -} diff --git a/packages/lintent/src/intent/compact/signing.ts b/packages/lintent/src/intent/compact/signing.ts deleted file mode 100644 index 38e7706..0000000 --- a/packages/lintent/src/intent/compact/signing.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { COMPACT } from "../../constants"; -import { compactTypes } from "../../typedMessage"; -import type { BatchCompact, MultichainCompact } from "../../types"; -import type { WalletClient } from "viem"; - -export type TypedDataSigner = Pick; - -export function signStandardCompact( - account: `0x${string}`, - walletClient: TypedDataSigner, - chainId: bigint, - message: BatchCompact -): Promise<`0x${string}`> { - return walletClient.signTypedData({ - account, - domain: { - name: "The Compact", - version: "1", - chainId, - verifyingContract: COMPACT - } as const, - types: compactTypes, - primaryType: "BatchCompact", - message - }); -} - -export function signMultichainCompact( - account: `0x${string}`, - walletClient: TypedDataSigner, - chainId: bigint, - message: MultichainCompact -): Promise<`0x${string}`> { - return walletClient.signTypedData({ - account, - domain: { - name: "The Compact", - version: "1", - chainId, - verifyingContract: COMPACT - } as const, - types: compactTypes, - primaryType: "MultichainCompact", - message - }); -} diff --git a/packages/lintent/src/intent/create.spec.ts b/packages/lintent/src/intent/create.spec.ts deleted file mode 100644 index 89332d7..0000000 --- a/packages/lintent/src/intent/create.spec.ts +++ /dev/null @@ -1,182 +0,0 @@ -import { afterEach, beforeEach, describe, expect, it } from "bun:test"; -import { - COIN_FILLER, - INPUT_SETTLER_ESCROW_LIFI, - MULTICHAIN_INPUT_SETTLER_ESCROW, -} from "../constants"; -import type { IntentDeps } from "../deps"; -import { - CHAIN_ID_ARBITRUM, - CHAIN_ID_BASE, - CHAIN_ID_ETHEREUM, - TEST_NOW_SECONDS, - TEST_POLYMER_ORACLE, - TEST_USER, -} from "../../tests/orderFixtures"; -import type { - CoreToken, - CreateIntentOptionsEscrow, - TokenContext, -} from "../types"; -import { Intent } from "./create"; -import { MultichainOrderIntent } from "./multichain"; -import { StandardOrderIntent } from "./standard"; - -const originalDateNow = Date.now; -const originalMathRandom = Math.random; - -const intentDeps: IntentDeps = { - getOracle(verifier, chainId) { - if (verifier !== "polymer") return undefined; - return [CHAIN_ID_ETHEREUM, CHAIN_ID_ARBITRUM, CHAIN_ID_BASE].includes( - chainId, - ) - ? TEST_POLYMER_ORACLE - : undefined; - }, -}; - -const ETH_USDC: CoreToken = { - address: "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", - name: "usdc", - chainId: CHAIN_ID_ETHEREUM, - decimals: 6, -}; - -const ETH_WETH: CoreToken = { - address: "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", - name: "weth", - chainId: CHAIN_ID_ETHEREUM, - decimals: 18, -}; - -const ARB_USDC: CoreToken = { - address: "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", - name: "usdc", - chainId: CHAIN_ID_ARBITRUM, - decimals: 6, -}; - -const BASE_USDC: CoreToken = { - address: "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", - name: "usdc", - chainId: CHAIN_ID_BASE, - decimals: 6, -}; - -function ctx(token: CoreToken, amount: bigint): TokenContext { - return { token, amount }; -} - -function makeEscrowOptions( - inputTokens: TokenContext[], - outputTokens: TokenContext[], -): CreateIntentOptionsEscrow { - return { - exclusiveFor: TEST_USER, - inputTokens, - outputTokens, - verifier: "polymer", - account: () => TEST_USER, - lock: { type: "escrow" }, - }; -} - -describe("Intent", () => { - beforeEach(() => { - Date.now = () => TEST_NOW_SECONDS * 1000; - Math.random = () => 0.5; - }); - - afterEach(() => { - Date.now = originalDateNow; - Math.random = originalMathRandom; - }); - - it("counts unique input chains and detects multichain", () => { - const intent = new Intent( - makeEscrowOptions( - [ctx(ETH_USDC, 10n), ctx(ETH_WETH, 1n), ctx(ARB_USDC, 20n)], - [ctx(BASE_USDC, 10n)], - ), - intentDeps, - ); - - expect(intent.numInputChains()).toBe(2); - expect(intent.isMultichain()).toBe(true); - }); - - it("detects same-chain when single input and output chains match", () => { - const intent = new Intent( - makeEscrowOptions([ctx(ETH_USDC, 10n)], [ctx(ETH_WETH, 1n)]), - intentDeps, - ); - - expect(intent.isMultichain()).toBe(false); - expect(intent.isSameChain()).toBe(true); - }); - - it("builds a single-chain intent with default deadlines and same-chain oracle", () => { - const intent = new Intent( - makeEscrowOptions([ctx(ETH_USDC, 10n)], [ctx(ETH_WETH, 1n)]), - intentDeps, - ); - const single = intent.singlechain(); - const order = single.asOrder(); - - expect(single).toBeInstanceOf(StandardOrderIntent); - expect(single.inputSettler).toBe(INPUT_SETTLER_ESCROW_LIFI); - expect(order.inputOracle).toBe(COIN_FILLER); - expect(order.fillDeadline).toBe(TEST_NOW_SECONDS + 2 * 60 * 60); - expect(order.expires).toBe(TEST_NOW_SECONDS + 24 * 60 * 60); - expect(order.nonce).toBe(2_147_483_648n); - expect(intent.nonce()).toBe(2_147_483_648n); - }); - - it("throws when singlechain() is called for multichain input set", () => { - const intent = new Intent( - makeEscrowOptions( - [ctx(ETH_USDC, 10n), ctx(ARB_USDC, 20n)], - [ctx(BASE_USDC, 10n)], - ), - intentDeps, - ); - - expect(() => intent.singlechain()).toThrow("Not supported as single chain"); - }); - - it("builds multichain orders grouped by chain", () => { - const intent = new Intent( - makeEscrowOptions( - [ctx(ETH_USDC, 10n), ctx(ETH_WETH, 2n), ctx(ARB_USDC, 20n)], - [ctx(BASE_USDC, 10n)], - ), - intentDeps, - ); - const multi = intent.multichain(); - const order = multi.asOrder(); - - expect(multi).toBeInstanceOf(MultichainOrderIntent); - expect(multi.inputSettler).toBe(MULTICHAIN_INPUT_SETTLER_ESCROW); - expect(order.inputs.length).toBe(2); - expect(order.inputs[0].inputs.length).toBe(2); - expect(order.inputs[1].inputs.length).toBe(1); - }); - - it("order() dispatches to singlechain or multichain intent", () => { - const single = new Intent( - makeEscrowOptions([ctx(ETH_USDC, 1n)], [ctx(ETH_WETH, 1n)]), - intentDeps, - ).order(); - const multi = new Intent( - makeEscrowOptions( - [ctx(ETH_USDC, 1n), ctx(ARB_USDC, 1n)], - [ctx(BASE_USDC, 1n)], - ), - intentDeps, - ).order(); - - expect(single).toBeInstanceOf(StandardOrderIntent); - expect(multi).toBeInstanceOf(MultichainOrderIntent); - }); -}); diff --git a/packages/lintent/src/intent/create.ts b/packages/lintent/src/intent/create.ts deleted file mode 100644 index 8c9b15c..0000000 --- a/packages/lintent/src/intent/create.ts +++ /dev/null @@ -1,181 +0,0 @@ -import { COIN_FILLER } from "../constants"; -import { toId } from "../compact/idLib"; -import type { IntentDeps } from "../deps"; -import type { - CompactLock, - CreateIntentOptions, - CreateIntentOptionsCompact, - CreateIntentOptionsEscrow, - EscrowLock, - MultichainOrder, - StandardOrder, - TokenContext, -} from "../types"; -import { MultichainOrderIntent } from "./multichain"; -import { StandardOrderIntent } from "./standard"; -import { buildMandateOutputs } from "./helpers/output-encoding"; -import { ONE_DAY, ONE_HOUR, inputSettlerForLock } from "./helpers/shared"; - -/** - * @notice Class representing a Li.Fi Intent. Contains intent abstractions and helpers. - */ -export class Intent { - private lock: EscrowLock | CompactLock; - - private user: () => `0x${string}`; - private inputs: TokenContext[]; - private outputs: TokenContext[]; - private getOracle: IntentDeps["getOracle"]; - private verifier: string; - private exclusiveFor: `0x${string}`; - - private _nonce?: bigint; - private expiry = ONE_DAY; - private fillDeadline = 2 * ONE_HOUR; - - constructor( - opts: CreateIntentOptionsEscrow | CreateIntentOptionsCompact, - deps: IntentDeps, - ) { - this.lock = opts.lock; - this.user = opts.account; - this.inputs = opts.inputTokens; - this.outputs = opts.outputTokens; - this.verifier = opts.verifier; - this.getOracle = deps.getOracle; - this.exclusiveFor = opts.exclusiveFor as `0x${string}`; - } - - numInputChains() { - const tokenChains = this.inputs.map(({ token }) => token.chainId); - return [...new Set(tokenChains)].length; - } - - isMultichain() { - return this.numInputChains() > 1; - } - - isSameChain() { - if (this.isMultichain()) return false; - const inputChain = this.inputs[0].token.chainId; - const outputChains = this.outputs.map((o) => o.token.chainId); - const numOutputChains = [...new Set(outputChains)].length; - if (numOutputChains > 1) return false; - const outputChain = this.outputs[0].token.chainId; - return inputChain === outputChain; - } - - nonce() { - if (this._nonce) return this._nonce; - this._nonce = BigInt(Math.floor(Math.random() * 2 ** 32)); - return this._nonce; - } - - inputSettler(multichain: boolean) { - return inputSettlerForLock(this.lock, multichain); - } - - singlechain() { - if (this.isMultichain()) { - throw new Error( - `Not supported as single chain with ${this.numInputChains()} chains`, - ); - } - - const inputChain = this.inputs[0].token.chainId; - const inputs: [bigint, bigint][] = this.inputs.map(({ token, amount }) => [ - this.lock.type === "compact" - ? toId( - true, - this.lock.resetPeriod, - this.lock.allocatorId, - token.address, - ) - : BigInt(token.address), - amount, - ]); - - const currentTime = Math.floor(Date.now() / 1000); - const inputOracle = this.isSameChain() - ? COIN_FILLER - : this.getOracle(this.verifier, inputChain)!; - - const order: StandardOrder = { - user: this.user(), - nonce: this.nonce(), - originChainId: inputChain, - fillDeadline: currentTime + this.fillDeadline, - expires: currentTime + this.expiry, - inputOracle, - inputs, - outputs: buildMandateOutputs({ - exclusiveFor: this.exclusiveFor, - outputTokens: this.outputs, - getOracle: this.getOracle, - verifier: this.verifier, - sameChain: this.isSameChain(), - recipient: this.user(), - currentTime, - }), - }; - - return new StandardOrderIntent(this.inputSettler(false), order); - } - - multichain() { - const currentTime = Math.floor(Date.now() / 1000); - const inputOracle = this.getOracle( - this.verifier, - this.inputs[0].token.chainId, - )!; - - const inputs: { chainId: bigint; inputs: [bigint, bigint][] }[] = [ - ...new Set(this.inputs.map(({ token }) => token.chainId)), - ].map((chain) => { - const chainInputs = this.inputs.filter( - ({ token }) => token.chainId === chain, - ); - return { - chainId: chain, - inputs: chainInputs.map(({ token, amount }) => [ - this.lock.type === "compact" - ? toId( - true, - this.lock.resetPeriod, - this.lock.allocatorId, - token.address, - ) - : BigInt(token.address), - amount, - ]), - }; - }); - - const order: MultichainOrder = { - user: this.user(), - nonce: this.nonce(), - fillDeadline: currentTime + this.fillDeadline, - expires: currentTime + this.expiry, - inputOracle, - outputs: buildMandateOutputs({ - exclusiveFor: this.exclusiveFor, - outputTokens: this.outputs, - getOracle: this.getOracle, - verifier: this.verifier, - sameChain: false, - recipient: this.user(), - currentTime, - }), - inputs, - }; - - return new MultichainOrderIntent(this.inputSettler(true), order, this.lock); - } - - order() { - if (this.isMultichain()) return this.multichain(); - return this.singlechain(); - } -} - -export type { CreateIntentOptions }; diff --git a/packages/lintent/src/intent/fromOrder.spec.ts b/packages/lintent/src/intent/fromOrder.spec.ts deleted file mode 100644 index 2fc2d8c..0000000 --- a/packages/lintent/src/intent/fromOrder.spec.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { describe, expect, it } from "bun:test"; -import { - INPUT_SETTLER_ESCROW_LIFI, - MULTICHAIN_INPUT_SETTLER_ESCROW, -} from "../constants"; -import { isStandardOrder, orderToIntent } from "."; -import { MultichainOrderIntent } from "./multichain"; -import { StandardOrderIntent } from "./standard"; -import { - CHAIN_ID_ETHEREUM, - makeMultichainOrder, - makeStandardOrder, -} from "../../tests/orderFixtures"; - -describe("intent core split", () => { - it("hydrates a standard order and keeps orderId deterministic", () => { - const order = makeStandardOrder({ - originChainId: CHAIN_ID_ETHEREUM, - }); - const intent = orderToIntent({ - inputSettler: INPUT_SETTLER_ESCROW_LIFI, - order, - }); - - expect(intent).toBeInstanceOf(StandardOrderIntent); - expect(intent.inputChains()).toEqual([CHAIN_ID_ETHEREUM]); - expect(intent.orderId()).toBe(intent.orderId()); - }); - - it("hydrates a multichain order and computes one shared orderId", () => { - const intent = orderToIntent({ - inputSettler: MULTICHAIN_INPUT_SETTLER_ESCROW, - order: makeMultichainOrder(), - }); - - expect(intent).toBeInstanceOf(MultichainOrderIntent); - expect(intent.inputChains().length).toBe(2); - const orderId = intent.orderId(); - expect(orderId.startsWith("0x")).toBe(true); - expect(orderId.length).toBe(66); - }); - - it("uses originChainId as the standard-vs-multichain discriminator", () => { - expect(isStandardOrder(makeStandardOrder())).toBe(true); - expect(isStandardOrder(makeMultichainOrder())).toBe(false); - }); -}); diff --git a/packages/lintent/src/intent/fromOrder.ts b/packages/lintent/src/intent/fromOrder.ts deleted file mode 100644 index 330f87d..0000000 --- a/packages/lintent/src/intent/fromOrder.ts +++ /dev/null @@ -1,41 +0,0 @@ -import type { - CompactLock, - EscrowLock, - MultichainOrder, - StandardOrder, -} from "../types"; -import { MultichainOrderIntent } from "./multichain"; -import { StandardOrderIntent } from "./standard"; - -type OrderLike = StandardOrder | MultichainOrder; - -type IntentForOrder = TOrder extends StandardOrder - ? StandardOrderIntent - : MultichainOrderIntent; - -type OrderToIntentOptions = { - inputSettler: `0x${string}`; - order: TOrder; - lock?: EscrowLock | CompactLock; -}; - -export function isStandardOrder(order: OrderLike): order is StandardOrder { - return "originChainId" in order; -} - -export function orderToIntent( - options: OrderToIntentOptions, -): IntentForOrder { - const { inputSettler, order, lock } = options; - if (isStandardOrder(order)) { - return new StandardOrderIntent( - inputSettler, - order, - ) as IntentForOrder; - } - return new MultichainOrderIntent( - inputSettler, - order, - lock, - ) as IntentForOrder; -} diff --git a/packages/lintent/src/intent/helpers/output-encoding.ts b/packages/lintent/src/intent/helpers/output-encoding.ts deleted file mode 100644 index a58bdf4..0000000 --- a/packages/lintent/src/intent/helpers/output-encoding.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { encodeAbiParameters, encodePacked, parseAbiParameters } from "viem"; -import { COIN_FILLER } from "../../constants"; -import type { CoreVerifier, IntentDeps } from "../../deps"; -import { addressToBytes32 } from "../../helpers/convert"; -import type { MandateOutput, TokenContext } from "../../types"; -import { ONE_MINUTE } from "./shared"; - -export function encodeOutputs(outputs: MandateOutput[]) { - return encodeAbiParameters( - parseAbiParameters( - "(bytes32 oracle, bytes32 settler, uint256 chainId, bytes32 token, uint256 amount, bytes32 recipient, bytes callbackData, bytes context)[]", - ), - [outputs], - ); -} - -export function buildMandateOutputs(options: { - exclusiveFor: `0x${string}`; - outputTokens: TokenContext[]; - getOracle: IntentDeps["getOracle"]; - verifier: CoreVerifier; - sameChain: boolean; - recipient: `0x${string}`; - currentTime: number; -}): MandateOutput[] { - const { - exclusiveFor, - outputTokens, - getOracle, - verifier, - sameChain, - recipient, - currentTime, - } = options; - - if (exclusiveFor) { - const formattedCorrectly = - exclusiveFor.length === 42 && exclusiveFor.slice(0, 2) === "0x"; - if (!formattedCorrectly) { - throw new Error(`ExclusiveFor not formatted correctly ${exclusiveFor}`); - } - } - - let context: `0x${string}` = "0x"; - if (exclusiveFor) { - const paddedExclusiveFor: `0x${string}` = `0x${exclusiveFor.replace("0x", "").padStart(64, "0")}`; - context = encodePacked( - ["bytes1", "bytes32", "uint32"], - ["0xe0", paddedExclusiveFor, currentTime + ONE_MINUTE], - ); - } - - const outputSettler = COIN_FILLER; - return outputTokens.map(({ token, amount }) => { - const outputOracle = sameChain - ? addressToBytes32(outputSettler) - : addressToBytes32(getOracle(verifier, token.chainId)!); - return { - oracle: outputOracle, - settler: addressToBytes32(outputSettler), - chainId: token.chainId, - token: addressToBytes32(token.address), - amount: amount, - recipient: addressToBytes32(recipient), - callbackData: "0x", - context, - }; - }) as MandateOutput[]; -} diff --git a/packages/lintent/src/intent/helpers/shared.ts b/packages/lintent/src/intent/helpers/shared.ts deleted file mode 100644 index 837469a..0000000 --- a/packages/lintent/src/intent/helpers/shared.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { - INPUT_SETTLER_COMPACT_LIFI, - INPUT_SETTLER_ESCROW_LIFI, - MULTICHAIN_INPUT_SETTLER_COMPACT, - MULTICHAIN_INPUT_SETTLER_ESCROW, -} from "../../constants"; -import type { CompactLock, EscrowLock } from "../../types"; - -export const ONE_MINUTE = 60; -export const ONE_HOUR = 60 * ONE_MINUTE; -export const ONE_DAY = 24 * ONE_HOUR; - -export function selectAllBut(arr: T[], index: number): T[] { - return [...arr.slice(0, index), ...arr.slice(index + 1, arr.length)]; -} - -export function inputSettlerForLock( - lock: EscrowLock | CompactLock, - multichain: boolean, -) { - if (lock.type === "compact" && multichain === false) - return INPUT_SETTLER_COMPACT_LIFI; - if (lock.type === "compact" && multichain === true) - return MULTICHAIN_INPUT_SETTLER_COMPACT; - if (lock.type === "escrow" && multichain === false) - return INPUT_SETTLER_ESCROW_LIFI; - if (lock.type === "escrow" && multichain === true) - return MULTICHAIN_INPUT_SETTLER_ESCROW; - - throw new Error( - `Not supported | multichain: ${multichain}, type: ${lock.type}`, - ); -} diff --git a/packages/lintent/src/intent/index.ts b/packages/lintent/src/intent/index.ts deleted file mode 100644 index d35ace0..0000000 --- a/packages/lintent/src/intent/index.ts +++ /dev/null @@ -1,11 +0,0 @@ -export { Intent } from "./create"; -export { isStandardOrder, orderToIntent } from "./fromOrder"; -export { StandardOrderIntent, computeStandardOrderId } from "./standard"; -export type { OrderIntentCommon } from "./types"; -export { - MultichainOrderIntent, - hashMultichainInputs, - constructInputHash, - computeMultichainEscrowOrderId, - computeMultichainCompactOrderId -} from "./multichain"; diff --git a/packages/lintent/src/intent/multichain.spec.ts b/packages/lintent/src/intent/multichain.spec.ts deleted file mode 100644 index 0ef8b98..0000000 --- a/packages/lintent/src/intent/multichain.spec.ts +++ /dev/null @@ -1,111 +0,0 @@ -import { describe, expect, it } from "bun:test"; -import { encodePacked, keccak256 } from "viem"; -import { - MULTICHAIN_INPUT_SETTLER_COMPACT, - MULTICHAIN_INPUT_SETTLER_ESCROW, -} from "../constants"; -import { ResetPeriod } from "../compact/idLib"; -import { - constructInputHash, - hashMultichainInputs, - MultichainOrderIntent, -} from "./multichain"; -import { b32, makeMultichainOrder } from "../../tests/orderFixtures"; - -function expectBytes32Hex(value: `0x${string}`) { - expect(value.startsWith("0x")).toBe(true); - expect(value.length).toBe(66); -} - -describe("multichain intent", () => { - describe("hash helpers", () => { - it("hashMultichainInputs is deterministic and sensitive to input amounts", () => { - const h1 = hashMultichainInputs(1n, [[1n, 10n]]); - const h2 = hashMultichainInputs(1n, [[1n, 10n]]); - const h3 = hashMultichainInputs(1n, [[1n, 11n]]); - - expect(h1).toBe(h2); - expect(h1).not.toBe(h3); - expectBytes32Hex(h1); - }); - - it("constructInputHash builds expected claim structure and validates chain index", () => { - const additionalChains = [b32("a"), b32("b")]; - const inputHash = hashMultichainInputs(1n, [[1n, 10n]]); - const expected = keccak256( - encodePacked( - ["bytes32[]"], - [[additionalChains[0], inputHash, additionalChains[1]]], - ), - ); - - expect(constructInputHash(1n, 1n, [[1n, 10n]], additionalChains)).toBe( - expected, - ); - expect(() => - constructInputHash(1n, 3n, [[1n, 10n]], additionalChains), - ).toThrow("ChainIndexOutOfRange"); - }); - }); - - describe("MultichainOrderIntent", () => { - it("returns the original multichain order from asOrder", () => { - const order = makeMultichainOrder(); - const intent = new MultichainOrderIntent( - MULTICHAIN_INPUT_SETTLER_ESCROW, - order, - { type: "escrow" }, - ); - - expect(intent.asOrder()).toBe(order); - expect(intent.inputChains().length).toBe(2); - }); - - it("builds components for every input chain and computes a stable escrow order id", () => { - const order = makeMultichainOrder(); - const intent = new MultichainOrderIntent( - MULTICHAIN_INPUT_SETTLER_ESCROW, - order, - { - type: "escrow", - }, - ); - const components = intent.asComponents(); - - expect(components.length).toBe(order.inputs.length); - expect(components[0].orderComponent.chainIndex).toBe(0n); - expect(components[1].orderComponent.chainIndex).toBe(1n); - expect(components[0].orderComponent.additionalChains.length).toBe(1); - expect(components[1].orderComponent.additionalChains.length).toBe(1); - - const orderId1 = intent.orderId(); - const orderId2 = intent.orderId(); - expect(orderId1).toBe(orderId2); - expectBytes32Hex(orderId1); - }); - - it("computes compact multichain order ids and uses compact secondaries layout", () => { - const order = makeMultichainOrder(); - const intent = new MultichainOrderIntent( - MULTICHAIN_INPUT_SETTLER_COMPACT, - order, - { - type: "compact", - resetPeriod: ResetPeriod.OneSecond, - allocatorId: "1", - }, - ); - const components = intent.asComponents(); - const compactOrderId = intent.orderId(); - - expect(components.length).toBe(order.inputs.length); - expect( - components.every( - (component) => - component.orderComponent.chainIdField === order.inputs[0].chainId, - ), - ).toBe(true); - expectBytes32Hex(compactOrderId); - }); - }); -}); diff --git a/packages/lintent/src/intent/multichain.ts b/packages/lintent/src/intent/multichain.ts deleted file mode 100644 index ca07f21..0000000 --- a/packages/lintent/src/intent/multichain.ts +++ /dev/null @@ -1,312 +0,0 @@ -import { - encodeAbiParameters, - encodePacked, - hashStruct, - keccak256, - parseAbiParameters, -} from "viem"; -import { - INPUT_SETTLER_COMPACT_LIFI, - MULTICHAIN_INPUT_SETTLER_COMPACT, -} from "../constants"; -import { - MULTICHAIN_COMPACT_TYPEHASH_WITH_WITNESS, - multichainCompactClaimHash, -} from "./compact/claims"; -import { - inputsToLocks, - toMultichainBatchCompact, - toMultichainElements, -} from "./compact/conversions"; -import { encodeOutputs } from "./helpers/output-encoding"; -import { selectAllBut } from "./helpers/shared"; -import { compactTypes } from "../typedMessage"; -import type { - CompactLock, - CompactMandate, - Element, - EscrowLock, - MultichainCompact, - MultichainOrder, - MultichainOrderComponent, -} from "../types"; -import type { OrderIntentCommon } from "./types"; - -/** - * @notice Hashes a multichain input segment using the chain id and encoded input locks. - * @dev Mirrors the multichain input hashing shape used by OIF multichain order components. - * @param chainId The chain id for this input segment. - * @param inputs The ordered input locks encoded as token/amount tuples. - * @return The keccak256 hash of `abi.encodePacked(chainId, inputs)`. - * @see https://github.com/openintentsframework/oif-contracts/blob/d9d9768f035656c8e49bdfbd9e1f88d4a207d69a/src/input/types/MultichainOrderComponentType.sol#L49-L58 - */ -export function hashMultichainInputs( - chainId: bigint, - inputs: [bigint, bigint][], -) { - return keccak256( - encodePacked(["uint256", "uint256[2][]"], [chainId, inputs]), - ); -} - -export function constructInputHash( - inputsChainId: bigint, - chainIndex: bigint, - inputs: [bigint, bigint][], - additionalChains: `0x${string}`[], -) { - const inputHash = hashMultichainInputs(inputsChainId, inputs); - const numSegments = additionalChains.length + 1; - if (numSegments <= chainIndex) - throw new Error(`ChainIndexOutOfRange(${chainIndex},${numSegments})`); - const claimStructure: `0x${string}`[] = []; - for (let i = 0; i < numSegments; ++i) { - const additionalChainsIndex = i > chainIndex ? i - 1 : i; - const inputHashElement = - chainIndex === BigInt(i) - ? inputHash - : additionalChains[additionalChainsIndex]; - claimStructure[i] = inputHashElement; - } - return keccak256(encodePacked(["bytes32[]"], [claimStructure])); -} - -export function computeMultichainEscrowOrderId( - inputSettler: `0x${string}`, - orderComponent: MultichainOrderComponent, -) { - return keccak256( - encodePacked( - [ - "address", - "address", - "uint256", - "uint32", - "uint32", - "address", - "bytes32", - "bytes", - ], - [ - inputSettler, - orderComponent.user, - orderComponent.nonce, - orderComponent.expires, - orderComponent.fillDeadline, - orderComponent.inputOracle, - constructInputHash( - orderComponent.chainIdField, - orderComponent.chainIndex, - orderComponent.inputs, - orderComponent.additionalChains, - ), - encodeOutputs(orderComponent.outputs), - ], - ), - ); -} - -export function computeMultichainCompactOrderId( - inputSettler: `0x${string}`, - orderComponent: MultichainOrderComponent, - chainId: bigint, -) { - const { fillDeadline, inputOracle, outputs, inputs } = orderComponent; - const mandate: CompactMandate = { - fillDeadline, - inputOracle, - outputs, - }; - const element: Element = { - arbiter: inputSettler, - chainId: chainId, - commitments: inputsToLocks(inputs), - mandate, - }; - - const elementHash = hashStruct({ - types: compactTypes, - primaryType: "Element", - data: element, - }); - - const elementHashes = [ - ...orderComponent.additionalChains.slice( - 0, - Number(orderComponent.chainIndex), - ), - elementHash, - ...orderComponent.additionalChains.slice(Number(orderComponent.chainIndex)), - ]; - - return keccak256( - encodeAbiParameters( - parseAbiParameters([ - "bytes32", - "address", - "uint256", - "uint256", - "bytes32", - ]), - [ - MULTICHAIN_COMPACT_TYPEHASH_WITH_WITNESS, - orderComponent.user, - orderComponent.nonce, - BigInt(orderComponent.expires), - keccak256(encodePacked(["bytes32[]"], [elementHashes])), - ], - ), - ); -} - -export class MultichainOrderIntent implements OrderIntentCommon { - lock?: EscrowLock | CompactLock; - inputSettler: `0x${string}`; - order: MultichainOrder; - - constructor( - inputSetter: `0x${string}`, - order: MultichainOrder, - lock?: EscrowLock | CompactLock, - ) { - this.inputSettler = inputSetter; - this.order = order; - - const isCompact = - this.inputSettler === INPUT_SETTLER_COMPACT_LIFI || - this.inputSettler === MULTICHAIN_INPUT_SETTLER_COMPACT; - - this.lock = - lock ?? - ({ type: isCompact ? "compact" : "escrow" } as EscrowLock | CompactLock); - } - - asOrder(): MultichainOrder { - return this.order; - } - - inputChains(): bigint[] { - return [...new Set(this.order.inputs.map((i) => i.chainId))]; - } - - orderId(): `0x${string}` { - const components = this.asComponents(); - const computedOrderIds = components.map((c) => - this.lock?.type === "escrow" - ? computeMultichainEscrowOrderId(this.inputSettler, c.orderComponent) - : computeMultichainCompactOrderId( - this.inputSettler, - c.orderComponent, - c.chainId, - ), - ); - - const orderId = computedOrderIds[0]; - computedOrderIds.map((v) => { - if (v !== orderId) - throw new Error(`Order ids are not equal ${computedOrderIds}`); - }); - - if (this.lock?.type === "compact") { - const multichainCompactHash = multichainCompactClaimHash( - this.asMultichainBatchCompact(), - ); - if (multichainCompactHash !== orderId) { - throw new Error( - `MultichainCompact does not match orderId, ${multichainCompactHash} ${orderId}`, - ); - } - } - return orderId; - } - - secondariesEscrow(): { - chainIdField: bigint; - additionalChains: `0x${string}`[]; - }[] { - const inputsHash: `0x${string}`[] = this.order.inputs.map((input) => - keccak256( - encodePacked( - ["uint256", "uint256[2][]"], - [input.chainId, input.inputs], - ), - ), - ); - return this.order.inputs.map((v, i) => { - return { - chainIdField: v.chainId, - additionalChains: selectAllBut(inputsHash, i), - }; - }); - } - - asCompactElements() { - return toMultichainElements(this.order, this.inputSettler); - } - - secondariesCompact(): { - chainIdField: bigint; - additionalChains: `0x${string}`[]; - }[] { - const { inputs } = this.order; - const elements = this.asCompactElements().map((element) => { - return hashStruct({ - types: compactTypes, - primaryType: "Element", - data: element, - }); - }); - return inputs.map((_, i) => { - return { - // Preserve existing behaviour: chainIdField for compact uses the first input chain. - chainIdField: inputs[0].chainId, - additionalChains: selectAllBut(elements, i), - }; - }); - } - - asComponents(): { - chainId: bigint; - orderComponent: MultichainOrderComponent; - }[] { - const { inputs, user, nonce, expires, fillDeadline, inputOracle, outputs } = - this.order; - if (!this.lock) - throw new Error(`No lock provided, cannot compute secondaries.`); - const secondaries = - this.lock.type === "escrow" - ? this.secondariesEscrow() - : this.secondariesCompact(); - const components: { - chainId: bigint; - orderComponent: MultichainOrderComponent; - }[] = []; - for (let i = 0; i < inputs.length; ++i) { - const { chainIdField, additionalChains } = secondaries[i]; - components.push({ - chainId: inputs[i].chainId, - orderComponent: { - user, - nonce, - chainIdField, - chainIndex: BigInt(i), - expires, - fillDeadline, - inputOracle, - inputs: inputs[i].inputs, - outputs, - additionalChains, - }, - }); - } - return components; - } - - asMultichainBatchCompact(): MultichainCompact { - return toMultichainBatchCompact(this.order, this.inputSettler); - } - - compactClaimHash(): `0x${string}` { - return multichainCompactClaimHash(this.asMultichainBatchCompact()); - } -} diff --git a/packages/lintent/src/intent/standard.spec.ts b/packages/lintent/src/intent/standard.spec.ts deleted file mode 100644 index b50c0b6..0000000 --- a/packages/lintent/src/intent/standard.spec.ts +++ /dev/null @@ -1,195 +0,0 @@ -import { describe, expect, it } from "bun:test"; -import { - INPUT_SETTLER_COMPACT_LIFI, - INPUT_SETTLER_ESCROW_LIFI, -} from "../constants"; -import { compactClaimHash as computeCompactClaimHash } from "./compact/claims"; -import { toStandardBatchCompact } from "./compact/conversions"; -import { computeStandardOrderId, StandardOrderIntent } from "./standard"; -import { makeStandardOrder } from "../../tests/orderFixtures"; -import type { StandardOrder } from "../types"; - -function expectBytes32Hex(value: `0x${string}`) { - expect(value.startsWith("0x")).toBe(true); - expect(value.length).toBe(66); -} - -describe("standard intent", () => { - describe("computeStandardOrderId", () => { - it("is deterministic for identical inputs", () => { - const order = makeStandardOrder(); - const id1 = computeStandardOrderId(INPUT_SETTLER_ESCROW_LIFI, order); - const id2 = computeStandardOrderId(INPUT_SETTLER_ESCROW_LIFI, order); - - expect(id1).toBe(id2); - expectBytes32Hex(id1); - }); - - it("changes when inputSettler changes", () => { - const order = makeStandardOrder(); - const id1 = computeStandardOrderId(INPUT_SETTLER_ESCROW_LIFI, order); - const id2 = computeStandardOrderId(INPUT_SETTLER_COMPACT_LIFI, order); - - expect(id1).not.toBe(id2); - }); - - it("changes when order-id fields change", () => { - const baseOrder = makeStandardOrder(); - const baseId = computeStandardOrderId( - INPUT_SETTLER_ESCROW_LIFI, - baseOrder, - ); - - const mutations: { - name: string; - mutate: (order: StandardOrder) => StandardOrder; - }[] = [ - { - name: "originChainId", - mutate: (order) => ({ - ...order, - originChainId: order.originChainId + 1n, - }), - }, - { - name: "user", - mutate: (order) => ({ - ...order, - user: "0x2222222222222222222222222222222222222222", - }), - }, - { - name: "nonce", - mutate: (order) => ({ - ...order, - nonce: order.nonce + 1n, - }), - }, - { - name: "expires", - mutate: (order) => ({ - ...order, - expires: order.expires + 1, - }), - }, - { - name: "fillDeadline", - mutate: (order) => ({ - ...order, - fillDeadline: order.fillDeadline + 1, - }), - }, - { - name: "inputOracle", - mutate: (order) => ({ - ...order, - inputOracle: "0x0000000000000000000000000000000000000001", - }), - }, - { - name: "inputs", - mutate: (order) => ({ - ...order, - inputs: [[order.inputs[0][0], order.inputs[0][1] + 1n]], - }), - }, - { - name: "outputs", - mutate: (order) => ({ - ...order, - outputs: [ - { ...order.outputs[0], amount: order.outputs[0].amount + 1n }, - ], - }), - }, - ]; - - for (const mutation of mutations) { - const mutatedOrder = mutation.mutate(baseOrder); - const mutatedId = computeStandardOrderId( - INPUT_SETTLER_ESCROW_LIFI, - mutatedOrder, - ); - expect(mutatedId).not.toBe(baseId); - } - }); - }); - - describe("StandardOrderIntent", () => { - it("returns the original order from accessor methods", () => { - const order = makeStandardOrder(); - const intent = new StandardOrderIntent(INPUT_SETTLER_ESCROW_LIFI, order); - - expect(intent.asOrder()).toBe(order); - expect(intent.asStandardOrder()).toBe(order); - }); - - it("returns the origin chain as the only input chain", () => { - const order = makeStandardOrder(); - const intent = new StandardOrderIntent(INPUT_SETTLER_ESCROW_LIFI, order); - - expect(intent.inputChains()).toEqual([order.originChainId]); - }); - - it("computes a deterministic orderId from its current state", () => { - const order = makeStandardOrder(); - const intent = new StandardOrderIntent(INPUT_SETTLER_ESCROW_LIFI, order); - const id1 = intent.orderId(); - const id2 = intent.orderId(); - - expect(id1).toBe(id2); - expect(id1).toBe( - computeStandardOrderId(INPUT_SETTLER_ESCROW_LIFI, order), - ); - expectBytes32Hex(id1); - }); - - it("asBatchCompact maps order fields and uses compact arbiter constant", () => { - const order = makeStandardOrder(); - const intent = new StandardOrderIntent(INPUT_SETTLER_ESCROW_LIFI, order); - const batch = intent.asBatchCompact(); - const expected = toStandardBatchCompact( - order, - INPUT_SETTLER_COMPACT_LIFI, - ); - - expect(batch).toEqual(expected); - expect(batch.arbiter).toBe(INPUT_SETTLER_COMPACT_LIFI); - }); - - it("compactClaimHash matches claim hash of asBatchCompact and is deterministic", () => { - const order = makeStandardOrder(); - const intent = new StandardOrderIntent(INPUT_SETTLER_ESCROW_LIFI, order); - const claimHash1 = intent.compactClaimHash(); - const claimHash2 = intent.compactClaimHash(); - const expected = computeCompactClaimHash(intent.asBatchCompact()); - - expect(claimHash1).toBe(claimHash2); - expect(claimHash1).toBe(expected); - expectBytes32Hex(claimHash1); - }); - - it("compactClaimHash changes when commitments or mandate fields change", () => { - const baseOrder = makeStandardOrder(); - const baseIntent = new StandardOrderIntent( - INPUT_SETTLER_ESCROW_LIFI, - baseOrder, - ); - const changedIntent = new StandardOrderIntent( - INPUT_SETTLER_ESCROW_LIFI, - makeStandardOrder({ - outputs: [ - { - ...baseOrder.outputs[0], - amount: baseOrder.outputs[0].amount + 1n, - }, - ], - }), - ); - - expect(changedIntent.compactClaimHash()).not.toBe( - baseIntent.compactClaimHash(), - ); - }); - }); -}); diff --git a/packages/lintent/src/intent/standard.ts b/packages/lintent/src/intent/standard.ts deleted file mode 100644 index 7e818c5..0000000 --- a/packages/lintent/src/intent/standard.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { encodePacked, keccak256 } from "viem"; -import { INPUT_SETTLER_COMPACT_LIFI } from "../constants"; -import { compactClaimHash } from "./compact/claims"; -import { toStandardBatchCompact } from "./compact/conversions"; -import { encodeOutputs } from "./helpers/output-encoding"; -import type { BatchCompact, StandardOrder } from "../types"; -import type { OrderIntentCommon } from "./types"; - -export function computeStandardOrderId( - inputSettler: `0x${string}`, - order: StandardOrder, -): `0x${string}` { - return keccak256( - encodePacked( - [ - "uint256", - "address", - "address", - "uint256", - "uint32", - "uint32", - "address", - "bytes32", - "bytes", - ], - [ - order.originChainId, - inputSettler, - order.user, - order.nonce, - order.expires, - order.fillDeadline, - order.inputOracle, - keccak256(encodePacked(["uint256[2][]"], [order.inputs])), - encodeOutputs(order.outputs), - ], - ), - ); -} - -export class StandardOrderIntent implements OrderIntentCommon { - inputSettler: `0x${string}`; - order: StandardOrder; - - constructor(inputSetter: `0x${string}`, order: StandardOrder) { - this.inputSettler = inputSetter; - this.order = order; - } - - asOrder(): StandardOrder { - return this.order; - } - - asStandardOrder(): StandardOrder { - return this.order; - } - - asBatchCompact(): BatchCompact { - return toStandardBatchCompact(this.order, INPUT_SETTLER_COMPACT_LIFI); - } - - inputChains(): bigint[] { - return [this.order.originChainId]; - } - - orderId(): `0x${string}` { - return computeStandardOrderId(this.inputSettler, this.order); - } - - compactClaimHash(): `0x${string}` { - return compactClaimHash(this.asBatchCompact()); - } -} diff --git a/packages/lintent/src/intent/types.ts b/packages/lintent/src/intent/types.ts deleted file mode 100644 index a7466bc..0000000 --- a/packages/lintent/src/intent/types.ts +++ /dev/null @@ -1,14 +0,0 @@ -import type { MultichainOrder, StandardOrder } from "../types"; - -export interface OrderIntentCommon< - TOrder extends StandardOrder | MultichainOrder = - | StandardOrder - | MultichainOrder, -> { - inputSettler: `0x${string}`; - order: TOrder; - asOrder(): TOrder; - inputChains(): bigint[]; - orderId(): `0x${string}`; - compactClaimHash(): `0x${string}`; -} diff --git a/packages/lintent/src/orderLib.spec.ts b/packages/lintent/src/orderLib.spec.ts deleted file mode 100644 index 84bd9c2..0000000 --- a/packages/lintent/src/orderLib.spec.ts +++ /dev/null @@ -1,276 +0,0 @@ -import { describe, expect, it } from "bun:test"; -import { - COIN_FILLER, - INPUT_SETTLER_COMPACT_LIFI, - INPUT_SETTLER_ESCROW_LIFI, - MULTICHAIN_INPUT_SETTLER_ESCROW, -} from "./constants"; -import type { OrderContainerValidationDeps } from "./deps"; -import { - validateOrder, - validateOrderContainer, - validateOrderContainerWithReason, - validateOrderWithReason, - VALIDATION_ERRORS, -} from "./validation"; -import { encodeMandateOutput, getOutputHash } from "./output"; -import type { OrderContainer } from "./types"; -import { - b32, - CHAIN_ID_ARBITRUM, - CHAIN_ID_ETHEREUM, - makeMandateOutput, - makeMultichainOrder, - makeStandardOrder, -} from "../tests/orderFixtures"; - -const output = makeMandateOutput(CHAIN_ID_ARBITRUM, 1n, { context: "0x00" }); - -const validationDeps: OrderContainerValidationDeps = { - inputSettlers: [INPUT_SETTLER_COMPACT_LIFI], - allowedInputOracles({ chainId, sameChainFill }) { - if (chainId !== CHAIN_ID_ETHEREUM) return undefined; - const allowed = [ - "0x0000003E06000007A224AeE90052fA6bb46d43C9" as `0x${string}`, - ]; - if (sameChainFill) allowed.push(COIN_FILLER); - return allowed; - }, - allowedOutputOracles(chainId) { - if (chainId !== CHAIN_ID_ARBITRUM && chainId !== CHAIN_ID_ETHEREUM) - return undefined; - return ["0x0000003E06000007A224AeE90052fA6bb46d43C9"]; - }, - allowedOutputSettlers() { - return [COIN_FILLER]; - }, -}; - -describe("orderLib", () => { - it("produces stable output hashes", () => { - const h1 = getOutputHash(output); - const h2 = getOutputHash(output); - expect(h1).toBe(h2); - }); - - it("changes hash when output amount changes", () => { - const h1 = getOutputHash(output); - const h2 = getOutputHash({ ...output, amount: output.amount + 1n }); - expect(h1).not.toBe(h2); - }); - - it("rejects orders where fillDeadline is later than expires", () => { - const invalidTiming = makeStandardOrder({ - expires: 2_000_000_000, - fillDeadline: 2_000_000_001, - }); - const result = validateOrderWithReason({ - order: invalidTiming, - deps: validationDeps, - }); - expect(result.passed).toBe(false); - expect(result.reason).toBe(VALIDATION_ERRORS.FILL_DEADLINE_AFTER_EXPIRES); - }); - - it("accepts orders with multiple outputs", () => { - const multiOutput = makeStandardOrder({ - outputs: [output, { ...output, amount: 2n }], - }); - expect(validateOrder({ order: multiOutput, deps: validationDeps })).toBe( - true, - ); - }); - - it("rejects orders with unknown source oracle", () => { - const invalidOracle = makeStandardOrder({ - inputOracle: "0x0000000000000000000000000000000000000001", - }); - const result = validateOrderWithReason({ - order: invalidOracle, - deps: validationDeps, - }); - expect(result.passed).toBe(false); - expect(result.reason).toBe(VALIDATION_ERRORS.INPUT_ORACLE_NOT_ALLOWED); - }); - - it("accepts same-chain intents with COIN_FILLER as inputOracle", () => { - const sameChainCoinFiller = makeStandardOrder({ - inputOracle: COIN_FILLER, - outputs: [{ ...output, chainId: CHAIN_ID_ETHEREUM }], - }); - expect( - validateOrder({ order: sameChainCoinFiller, deps: validationDeps }), - ).toBe(true); - }); - - it("rejects orders with empty inputs", () => { - const emptyInputs = makeStandardOrder({ inputs: [] }); - const result = validateOrderWithReason({ - order: emptyInputs, - deps: validationDeps, - }); - expect(result.passed).toBe(false); - expect(result.reason).toBe(VALIDATION_ERRORS.NO_INPUTS); - }); - - it("rejects orders with non-positive input amount", () => { - const invalidInputAmount = makeStandardOrder({ inputs: [[1n, 0n]] }); - const result = validateOrderWithReason({ - order: invalidInputAmount, - deps: validationDeps, - }); - expect(result.passed).toBe(false); - expect(result.reason).toBe(VALIDATION_ERRORS.INPUT_AMOUNT_NON_POSITIVE); - }); - - it("accepts orders with zero output amount", () => { - const zeroOutputAmount = makeStandardOrder({ - outputs: [{ ...output, amount: 0n }], - }); - expect( - validateOrder({ order: zeroOutputAmount, deps: validationDeps }), - ).toBe(true); - }); - - it("rejects orders with negative output amount", () => { - const negativeOutputAmount = makeStandardOrder({ - outputs: [{ ...output, amount: -1n }], - }); - const result = validateOrderWithReason({ - order: negativeOutputAmount, - deps: validationDeps, - }); - expect(result.passed).toBe(false); - expect(result.reason).toBe(VALIDATION_ERRORS.OUTPUT_AMOUNT_NON_POSITIVE); - }); - - it("rejects orders with unknown output chain", () => { - const badOutputChain = makeStandardOrder({ - outputs: [{ ...output, chainId: 999999999n }], - }); - const result = validateOrderWithReason({ - order: badOutputChain, - deps: validationDeps, - }); - expect(result.passed).toBe(false); - expect(result.reason).toBe(VALIDATION_ERRORS.UNKNOWN_OUTPUT_CHAIN); - }); - - it("rejects orders with non-whitelisted output oracle", () => { - const badOutputOracle = makeStandardOrder({ - outputs: [{ ...output, oracle: b32("a") }], - }); - const result = validateOrderWithReason({ - order: badOutputOracle, - deps: validationDeps, - }); - expect(result.passed).toBe(false); - expect(result.reason).toBe(VALIDATION_ERRORS.INVALID_OUTPUT_ORACLE); - }); - - it("rejects orders with non-whitelisted output settler", () => { - const badOutputSettler = makeStandardOrder({ - outputs: [{ ...output, settler: b32("b") }], - }); - const result = validateOrderWithReason({ - order: badOutputSettler, - deps: validationDeps, - }); - expect(result.passed).toBe(false); - expect(result.reason).toBe(VALIDATION_ERRORS.INVALID_OUTPUT_SETTLER); - }); - - it("rejects orders with zero token", () => { - const invalidToken = makeStandardOrder({ - outputs: [{ ...output, token: b32("0") }], - }); - const result = validateOrderWithReason({ - order: invalidToken, - deps: validationDeps, - }); - expect(result.passed).toBe(false); - expect(result.reason).toBe(VALIDATION_ERRORS.OUTPUT_TOKEN_ZERO); - }); - - it("rejects orders with zero recipient", () => { - const invalidRecipient = makeStandardOrder({ - outputs: [{ ...output, recipient: b32("0") }], - }); - const result = validateOrderWithReason({ - order: invalidRecipient, - deps: validationDeps, - }); - expect(result.passed).toBe(false); - expect(result.reason).toBe(VALIDATION_ERRORS.OUTPUT_RECIPIENT_ZERO); - }); - - it("returns standard-order validation result from container validator", () => { - const invalidStandardContainer: OrderContainer = { - inputSettler: INPUT_SETTLER_ESCROW_LIFI, - order: makeStandardOrder({ - inputOracle: "0x0000000000000000000000000000000000000001", - }), - sponsorSignature: { type: "None", payload: "0x" }, - allocatorSignature: { type: "None", payload: "0x" }, - }; - - const result = validateOrderContainerWithReason({ - orderContainer: invalidStandardContainer, - deps: validationDeps, - }); - expect(result.passed).toBe(false); - expect(result.reason).toBe(VALIDATION_ERRORS.INPUT_ORACLE_NOT_ALLOWED); - }); - - it("accepts multichain containers in TODO validation path", () => { - const multichainContainer: OrderContainer = { - inputSettler: MULTICHAIN_INPUT_SETTLER_ESCROW, - order: makeMultichainOrder(), - sponsorSignature: { type: "None", payload: "0x" }, - allocatorSignature: { type: "None", payload: "0x" }, - }; - expect( - validateOrderContainer({ - orderContainer: multichainContainer, - deps: validationDeps, - }), - ).toBe(true); - }); - - it("treats compact intents as valid in container validator (TODO path)", () => { - const compactContainer: OrderContainer = { - inputSettler: INPUT_SETTLER_COMPACT_LIFI, - order: makeStandardOrder({ - inputOracle: "0x0000000000000000000000000000000000000001", - }), - sponsorSignature: { type: "None", payload: "0x" }, - allocatorSignature: { type: "None", payload: "0x" }, - }; - expect( - validateOrderContainer({ - orderContainer: compactContainer, - deps: validationDeps, - }), - ).toBe(true); - }); - - it("encodes mandate output deterministically", () => { - const solver = b32("1"); - const orderId = b32("2"); - const encoded1 = encodeMandateOutput({ - solver, - orderId, - timestamp: 1234, - output, - }); - const encoded2 = encodeMandateOutput({ - solver, - orderId, - timestamp: 1234, - output, - }); - - expect(encoded1).toBe(encoded2); - expect(encoded1.startsWith("0x")).toBe(true); - }); -}); diff --git a/packages/lintent/src/output.ts b/packages/lintent/src/output.ts deleted file mode 100644 index 4d3d57b..0000000 --- a/packages/lintent/src/output.ts +++ /dev/null @@ -1,72 +0,0 @@ -import { encodePacked, keccak256 } from "viem"; -import type { MandateOutput } from "./types"; - -export function getOutputHash(output: MandateOutput) { - return keccak256( - encodePacked( - [ - "bytes32", - "bytes32", - "uint256", - "bytes32", - "uint256", - "bytes32", - "uint16", - "bytes", - "uint16", - "bytes", - ], - [ - output.oracle, - output.settler, - output.chainId, - output.token, - output.amount, - output.recipient, - output.callbackData.replace("0x", "").length / 2, - output.callbackData, - output.context.replace("0x", "").length / 2, - output.context, - ], - ), - ); -} - -export function encodeMandateOutput({ - solver, - orderId, - timestamp, - output, -}: Readonly<{ - solver: `0x${string}`; - orderId: `0x${string}`; - timestamp: number; - output: MandateOutput; -}>) { - return encodePacked( - [ - "bytes32", - "bytes32", - "uint32", - "bytes32", - "uint256", - "bytes32", - "uint16", - "bytes", - "uint16", - "bytes", - ], - [ - solver, - orderId, - timestamp, - output.token, - output.amount, - output.recipient, - output.callbackData.replace("0x", "").length / 2, - output.callbackData, - output.context.replace("0x", "").length / 2, - output.context, - ], - ); -} diff --git a/packages/lintent/src/typedMessage.spec.ts b/packages/lintent/src/typedMessage.spec.ts deleted file mode 100644 index 336a23b..0000000 --- a/packages/lintent/src/typedMessage.spec.ts +++ /dev/null @@ -1,71 +0,0 @@ -import { describe, expect, it } from "bun:test"; -import { - INPUT_SETTLER_COMPACT_LIFI, - MULTICHAIN_INPUT_SETTLER_COMPACT, -} from "./constants"; -import { - compactClaimHash, - multichainCompactClaimHash, -} from "./intent/compact/claims"; -import { - toMultichainBatchCompact, - toStandardBatchCompact, -} from "./intent/compact/conversions"; -import { - compact_type_hash, - compactTypes, - multichain_compact_type_hash, -} from "./typedMessage"; -import { makeMultichainOrder, makeStandardOrder } from "../tests/orderFixtures"; - -const HEX_32_REGEX = /^0x[0-9a-fA-F]{64}$/; -const COMPACT_TYPE_HASH_CONTRACT = - "0x5f094e58b077a941d99d3449bd1be66fd3bc9d23ab9e4c06a8713cabc3e3b634"; -const MULTICHAIN_COMPACT_TYPE_HASH_CONTRACT = - "0x6bc0624272798c7a3ff97563d8a009ea96cffd8ea74a971b2946ca790fc50319"; - -describe("typedMessage", () => { - it("exports stable 32-byte type hashes", () => { - expect(compact_type_hash).toMatch(HEX_32_REGEX); - expect(multichain_compact_type_hash).toMatch(HEX_32_REGEX); - }); - - it("matches contract type hashes", () => { - expect(compact_type_hash).toBe(COMPACT_TYPE_HASH_CONTRACT); - expect(multichain_compact_type_hash).toBe( - MULTICHAIN_COMPACT_TYPE_HASH_CONTRACT, - ); - }); - - it("includes all expected compact type groups", () => { - expect(Object.keys(compactTypes)).toEqual([ - "BatchCompact", - "Lock", - "Mandate", - "MandateOutput", - "Element", - "MultichainCompact", - ]); - }); - - it("computes deterministic compact and multichain compact claim hashes", () => { - const batchCompact = toStandardBatchCompact( - makeStandardOrder(), - INPUT_SETTLER_COMPACT_LIFI, - ); - const multichainCompact = toMultichainBatchCompact( - makeMultichainOrder(), - MULTICHAIN_INPUT_SETTLER_COMPACT, - ); - - const compactHash1 = compactClaimHash(batchCompact); - const compactHash2 = compactClaimHash(batchCompact); - const multichainHash1 = multichainCompactClaimHash(multichainCompact); - const multichainHash2 = multichainCompactClaimHash(multichainCompact); - - expect(compactHash1).toBe(compactHash2); - expect(multichainHash1).toBe(multichainHash2); - expect(compactHash1).toMatch(HEX_32_REGEX); - expect(multichainHash1).toMatch(HEX_32_REGEX); - }); -}); diff --git a/packages/lintent/src/typedMessage.ts b/packages/lintent/src/typedMessage.ts deleted file mode 100644 index e075e6e..0000000 --- a/packages/lintent/src/typedMessage.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { keccak256, toHex } from "viem"; - -const BatchCompact = [ - { name: "arbiter", type: "address" }, - { name: "sponsor", type: "address" }, - { name: "nonce", type: "uint256" }, - { name: "expires", type: "uint256" }, - { name: "commitments", type: "Lock[]" }, - { name: "mandate", type: "Mandate" }, -] as const; - -const MultichainCompact = [ - { name: "sponsor", type: "address" }, - { name: "nonce", type: "uint256" }, - { name: "expires", type: "uint256" }, - { name: "elements", type: "Element[]" }, -] as const; - -const Lock = [ - { name: "lockTag", type: "bytes12" }, - { name: "token", type: "address" }, - { name: "amount", type: "uint256" }, -] as const; - -const Element = [ - { name: "arbiter", type: "address" }, - { name: "chainId", type: "uint256" }, - { name: "commitments", type: "Lock[]" }, - { name: "mandate", type: "Mandate" }, -] as const; - -const Mandate = [ - { name: "fillDeadline", type: "uint32" }, - { name: "inputOracle", type: "address" }, - { name: "outputs", type: "MandateOutput[]" }, -] as const; - -export const MandateOutput = [ - { name: "oracle", type: "bytes32" }, - { name: "settler", type: "bytes32" }, - { name: "chainId", type: "uint256" }, - { name: "token", type: "bytes32" }, - { name: "amount", type: "uint256" }, - { name: "recipient", type: "bytes32" }, - { name: "callbackData", type: "bytes" }, - { name: "context", type: "bytes" }, -] as const; - -// The named list of all type definitions -export const compactTypes = { - BatchCompact, - Lock, - Mandate, - MandateOutput, - Element, - MultichainCompact, -} as const; - -const compact_type = - "BatchCompact(address arbiter,address sponsor,uint256 nonce,uint256 expires,Lock[] commitments,Mandate mandate)Lock(bytes12 lockTag,address token,uint256 amount)Mandate(uint32 fillDeadline,address inputOracle,MandateOutput[] outputs)MandateOutput(bytes32 oracle,bytes32 settler,uint256 chainId,bytes32 token,uint256 amount,bytes32 recipient,bytes callbackData,bytes context)" as const; -export const compact_type_hash = keccak256(toHex(compact_type)); - -const multichain_compact_type = - "MultichainCompact(address sponsor,uint256 nonce,uint256 expires,Element[] elements)Element(address arbiter,uint256 chainId,Lock[] commitments,Mandate mandate)Lock(bytes12 lockTag,address token,uint256 amount)Mandate(uint32 fillDeadline,address inputOracle,MandateOutput[] outputs)MandateOutput(bytes32 oracle,bytes32 settler,uint256 chainId,bytes32 token,uint256 amount,bytes32 recipient,bytes callbackData,bytes context)" as const; -export const multichain_compact_type_hash = keccak256( - toHex(multichain_compact_type), -); diff --git a/packages/lintent/src/types/compact.ts b/packages/lintent/src/types/compact.ts deleted file mode 100644 index 4803abf..0000000 --- a/packages/lintent/src/types/compact.ts +++ /dev/null @@ -1,26 +0,0 @@ -import type { CompactMandate } from "./mandate"; -import type { Lock } from "./lock"; - -export type BatchCompact = { - arbiter: `0x${string}`; // The account tasked with verifying and submitting the claim. - sponsor: `0x${string}`; // The account to source the tokens from. - nonce: bigint; // A parameter to enforce replay protection, scoped to allocator. - expires: bigint; // The time at which the claim expires. - commitments: Lock[]; // The allocated token IDs and amounts. - mandate: CompactMandate; -}; - -export type Element = { - arbiter: `0x${string}`; - chainId: bigint; - commitments: Lock[]; - mandate: CompactMandate; -}; - -export type MultichainCompact = { - sponsor: `0x${string}`; // The account tasked with verifying and submitting the claim. - nonce: bigint; // A parameter to enforce replay protection, scoped to allocator. - expires: bigint; // The time at which the claim expires. - elements: Element[]; - mandate: CompactMandate; -}; diff --git a/packages/lintent/src/types/createIntent.ts b/packages/lintent/src/types/createIntent.ts deleted file mode 100644 index a6e313a..0000000 --- a/packages/lintent/src/types/createIntent.ts +++ /dev/null @@ -1,25 +0,0 @@ -import type { CoreVerifier } from "../deps"; -import type { CompactLock, EscrowLock } from "./lock"; -import type { TokenContext } from "./token"; - -export type CreateIntentOptionsEscrow = { - exclusiveFor: string; - inputTokens: TokenContext[]; - outputTokens: TokenContext[]; - verifier: CoreVerifier; - account: () => `0x${string}`; - lock: EscrowLock; -}; - -export type CreateIntentOptionsCompact = { - exclusiveFor: string; - inputTokens: TokenContext[]; - outputTokens: TokenContext[]; - verifier: CoreVerifier; - account: () => `0x${string}`; - lock: CompactLock; -}; - -export type CreateIntentOptions = - | CreateIntentOptionsEscrow - | CreateIntentOptionsCompact; diff --git a/packages/lintent/src/types/index.ts b/packages/lintent/src/types/index.ts deleted file mode 100644 index f673f4e..0000000 --- a/packages/lintent/src/types/index.ts +++ /dev/null @@ -1,8 +0,0 @@ -export * from "./compact"; -export * from "./createIntent"; -export * from "./lock"; -export * from "./mandate"; -export * from "./order"; -export * from "./quote"; -export * from "./signature"; -export * from "./token"; diff --git a/packages/lintent/src/types/lock.ts b/packages/lintent/src/types/lock.ts deleted file mode 100644 index 021a372..0000000 --- a/packages/lintent/src/types/lock.ts +++ /dev/null @@ -1,17 +0,0 @@ -import type { ResetPeriod } from "../compact/idLib"; - -export type Lock = { - lockTag: `0x${string}`; - token: `0x${string}`; - amount: bigint; -}; - -export type EscrowLock = { - type: "escrow"; -}; - -export type CompactLock = { - type: "compact"; - resetPeriod: ResetPeriod; - allocatorId: string; -}; diff --git a/packages/lintent/src/types/mandate.ts b/packages/lintent/src/types/mandate.ts deleted file mode 100644 index 8a0928a..0000000 --- a/packages/lintent/src/types/mandate.ts +++ /dev/null @@ -1,16 +0,0 @@ -export type MandateOutput = { - oracle: `0x${string}`; - settler: `0x${string}`; - chainId: bigint; - token: `0x${string}`; - amount: bigint; - recipient: `0x${string}`; - callbackData: `0x${string}`; - context: `0x${string}`; -}; - -export type CompactMandate = { - fillDeadline: number; - inputOracle: `0x${string}`; - outputs: MandateOutput[]; -}; diff --git a/packages/lintent/src/types/order.ts b/packages/lintent/src/types/order.ts deleted file mode 100644 index d443b7a..0000000 --- a/packages/lintent/src/types/order.ts +++ /dev/null @@ -1,43 +0,0 @@ -import type { MandateOutput } from "./mandate"; -import type { NoSignature, Signature } from "./signature"; - -export type StandardOrder = { - user: `0x${string}`; - nonce: bigint; - originChainId: bigint; - expires: number; - fillDeadline: number; - inputOracle: `0x${string}`; - inputs: [bigint, bigint][]; - outputs: MandateOutput[]; -}; - -export type MultichainOrderComponent = { - user: `0x${string}`; - nonce: bigint; - chainIdField: bigint; - chainIndex: bigint; - expires: number; - fillDeadline: number; - inputOracle: `0x${string}`; - inputs: [bigint, bigint][]; - outputs: MandateOutput[]; - additionalChains: `0x${string}`[]; -}; - -export type MultichainOrder = { - user: `0x${string}`; - nonce: bigint; - expires: number; - fillDeadline: number; - inputOracle: `0x${string}`; - outputs: MandateOutput[]; - inputs: { chainId: bigint; inputs: [bigint, bigint][] }[]; -}; - -export type OrderContainer = { - inputSettler: `0x${string}`; - order: StandardOrder | MultichainOrder; - sponsorSignature: Signature | NoSignature; - allocatorSignature: Signature | NoSignature; -}; diff --git a/packages/lintent/src/types/quote.ts b/packages/lintent/src/types/quote.ts deleted file mode 100644 index 710a6c2..0000000 --- a/packages/lintent/src/types/quote.ts +++ /dev/null @@ -1,8 +0,0 @@ -export type Quote = { - fromAsset: string; - toAsset: string; - fromPrice: string; - toPrice: string; - intermediary: string; - discount?: string; -}; diff --git a/packages/lintent/src/types/signature.ts b/packages/lintent/src/types/signature.ts deleted file mode 100644 index 2458c22..0000000 --- a/packages/lintent/src/types/signature.ts +++ /dev/null @@ -1,9 +0,0 @@ -export type NoSignature = { - type: "None"; - payload: "0x"; -}; - -export type Signature = { - type: "ECDSA" | "ERC-1271"; - payload: `0x${string}`; -}; diff --git a/packages/lintent/src/types/token.ts b/packages/lintent/src/types/token.ts deleted file mode 100644 index bc21868..0000000 --- a/packages/lintent/src/types/token.ts +++ /dev/null @@ -1,11 +0,0 @@ -export type CoreToken = { - address: `0x${string}`; - name: string; - chainId: bigint; - decimals: number; -}; - -export type TokenContext = { - token: CoreToken; - amount: bigint; -}; diff --git a/packages/lintent/src/validation.ts b/packages/lintent/src/validation.ts deleted file mode 100644 index ffbd3b8..0000000 --- a/packages/lintent/src/validation.ts +++ /dev/null @@ -1,225 +0,0 @@ -import type { - OrderContainerValidationDeps, - StandardOrderValidationDeps, -} from "./deps"; -import { - BYTES32_ZERO, - COIN_FILLER, - INPUT_SETTLER_COMPACT_LIFI, - MULTICHAIN_INPUT_SETTLER_COMPACT, -} from "./constants"; -import { addressToBytes32 } from "./helpers/convert"; -import { isStandardOrder } from "./intent"; -import type { OrderContainer, StandardOrder } from "./types"; - -export type ValidationResult = { - passed: boolean; - reason: string; -}; - -export const VALIDATION_PASS_REASON = "" as const; - -export enum VALIDATION_ERRORS { - FILL_DEADLINE_AFTER_EXPIRES = "fillDeadline > expires", - UNKNOWN_ORIGIN_CHAIN = "input chain", - INPUT_ORACLE_NOT_ALLOWED = "inputOracle", - NO_INPUTS = "inputs", - INPUT_AMOUNT_NON_POSITIVE = "input amount", - NO_OUTPUTS = "outputs", - UNKNOWN_OUTPUT_CHAIN = "output chain", - OUTPUT_AMOUNT_NON_POSITIVE = "output amount", - INVALID_OUTPUT_ORACLE = "output oracle", - INVALID_OUTPUT_SETTLER = "output settler", - OUTPUT_TOKEN_ZERO = "output token", - OUTPUT_RECIPIENT_ZERO = "output recipient", -} - -function normalize(value: string) { - return value.toLowerCase(); -} - -function isZeroBytes32(value: string) { - return normalize(value) === normalize(BYTES32_ZERO); -} - -function pass(): ValidationResult { - return { passed: true, reason: VALIDATION_PASS_REASON }; -} - -function fail(reason: string): ValidationResult { - return { passed: false, reason }; -} - -function getAllowedInputOracles({ - allowedInputOracles, - chainId, - sameChainFill, -}: Readonly<{ - allowedInputOracles: StandardOrderValidationDeps["allowedInputOracles"]; - chainId: bigint; - sameChainFill: boolean; -}>): string[] | undefined { - const allowed = allowedInputOracles({ chainId, sameChainFill }); - if (!allowed) return undefined; - return allowed.map(normalize); -} - -function getAllowedOutputOracles({ - allowedOutputOracles, - chainId, -}: Readonly<{ - allowedOutputOracles: StandardOrderValidationDeps["allowedOutputOracles"]; - chainId: bigint; -}>): string[] | undefined { - const allowed = allowedOutputOracles(chainId); - if (!allowed) return undefined; - return [COIN_FILLER, ...allowed] - .map((oracle) => addressToBytes32(oracle)) - .map(normalize); -} - -function getAllowedOutputSettlers( - allowedOutputSettlers: StandardOrderValidationDeps["allowedOutputSettlers"], -): string[] { - return allowedOutputSettlers() - .map((settler) => addressToBytes32(settler)) - .map(normalize); -} - -/// https://docs.li.fi/lifi-intents/for-solvers/orderflow#order-validation -export function validateOrderWithReason({ - order, - deps, -}: Readonly<{ - order: StandardOrder; - deps: StandardOrderValidationDeps; -}>): ValidationResult { - const { - allowedInputOracles: resolveInputOracles, - allowedOutputOracles: resolveOutputOracles, - allowedOutputSettlers: resolveOutputSettlers, - } = deps; - - // 1-2. temporal consistency only - if (order.fillDeadline > order.expires) - return fail(VALIDATION_ERRORS.FILL_DEADLINE_AFTER_EXPIRES); - - // 3. validation layer - const sameChainFill = order.outputs.every( - (output) => output.chainId === order.originChainId, - ); - const allowedInputOracles = getAllowedInputOracles({ - allowedInputOracles: resolveInputOracles, - chainId: order.originChainId, - sameChainFill, - }); - if (!allowedInputOracles) return fail(VALIDATION_ERRORS.UNKNOWN_ORIGIN_CHAIN); - if (!allowedInputOracles.includes(normalize(order.inputOracle))) { - return fail(VALIDATION_ERRORS.INPUT_ORACLE_NOT_ALLOWED); - } - - // 4. inputs - if (!Array.isArray(order.inputs) || order.inputs.length === 0) - return fail(VALIDATION_ERRORS.NO_INPUTS); - for (const input of order.inputs) { - const [, amount] = input; - if (amount <= 0n) return fail(VALIDATION_ERRORS.INPUT_AMOUNT_NON_POSITIVE); - } - - // 5. lock ID semantics are not validated yet. - // TODO: validate lock IDs for escrow/compact compatibility and token mapping. - // 6. reset period semantics are not validated yet. - // TODO: decode and validate reset period constraints from lock IDs. - // 7. allocator ID policy is not validated yet. - // TODO: enforce allocator policy rules for active environments. - // 8. claim/signature verification is not validated here. - // TODO: validate sponsor/allocator signatures when required. - - // 9. outputs - if (!Array.isArray(order.outputs) || order.outputs.length === 0) - return fail(VALIDATION_ERRORS.NO_OUTPUTS); - for (const output of order.outputs) { - const allowedOutputOracles = getAllowedOutputOracles({ - allowedOutputOracles: resolveOutputOracles, - chainId: output.chainId, - }); - if (!allowedOutputOracles) - return fail(VALIDATION_ERRORS.UNKNOWN_OUTPUT_CHAIN); - if (output.amount < 0n) - return fail(VALIDATION_ERRORS.OUTPUT_AMOUNT_NON_POSITIVE); - if (isZeroBytes32(output.oracle)) - return fail(VALIDATION_ERRORS.INVALID_OUTPUT_ORACLE); - if (!allowedOutputOracles.includes(normalize(output.oracle))) { - return fail(VALIDATION_ERRORS.INVALID_OUTPUT_ORACLE); - } - if (isZeroBytes32(output.settler)) - return fail(VALIDATION_ERRORS.INVALID_OUTPUT_SETTLER); - const allowedOutputSettlers = getAllowedOutputSettlers( - resolveOutputSettlers, - ); - if (!allowedOutputSettlers.includes(normalize(output.settler))) { - return fail(VALIDATION_ERRORS.INVALID_OUTPUT_SETTLER); - } - if (isZeroBytes32(output.token)) - return fail(VALIDATION_ERRORS.OUTPUT_TOKEN_ZERO); - if (isZeroBytes32(output.recipient)) - return fail(VALIDATION_ERRORS.OUTPUT_RECIPIENT_ZERO); - } - - // 11. allocatorData is not validated yet. - // TODO: parse and validate allocatorData. - // 12. nonce freshness/replay checks require chain state. - // TODO: validate nonce freshness against chain state. - return pass(); -} - -export function validateOrder({ - order, - deps, -}: Readonly<{ - order: StandardOrder; - deps: StandardOrderValidationDeps; -}>): boolean { - return validateOrderWithReason({ order, deps }).passed; -} - -export function validateOrderContainerWithReason({ - orderContainer, - deps, -}: Readonly<{ - orderContainer: OrderContainer; - deps: OrderContainerValidationDeps; -}>): ValidationResult { - const inputSettlers = ( - deps.inputSettlers.length > 0 - ? deps.inputSettlers - : [INPUT_SETTLER_COMPACT_LIFI, MULTICHAIN_INPUT_SETTLER_COMPACT] - ).map(normalize); - if (inputSettlers.includes(normalize(orderContainer.inputSettler))) { - // TODO: implement compact validation from LI.FI orderflow docs. - return pass(); - } - - if (isStandardOrder(orderContainer.order)) { - return validateOrderWithReason({ - order: orderContainer.order, - deps: { - allowedInputOracles: deps.allowedInputOracles, - allowedOutputOracles: deps.allowedOutputOracles, - allowedOutputSettlers: deps.allowedOutputSettlers, - }, - }); - } - - return pass(); -} - -export function validateOrderContainer({ - orderContainer, - deps, -}: Readonly<{ - orderContainer: OrderContainer; - deps: OrderContainerValidationDeps; -}>): boolean { - return validateOrderContainerWithReason({ orderContainer, deps }).passed; -} diff --git a/packages/lintent/tests/orderFixtures.ts b/packages/lintent/tests/orderFixtures.ts deleted file mode 100644 index d181a05..0000000 --- a/packages/lintent/tests/orderFixtures.ts +++ /dev/null @@ -1,72 +0,0 @@ -import { COIN_FILLER } from "../src/constants"; -import { addressToBytes32 } from "../src/helpers/convert"; -import type { - MandateOutput, - MultichainOrder, - StandardOrder, -} from "../src/types"; - -export const CHAIN_ID_ETHEREUM = 1n; -export const CHAIN_ID_ARBITRUM = 42161n; -export const CHAIN_ID_BASE = 8453n; - -export const TEST_POLYMER_ORACLE = - "0x0000003E06000007A224AeE90052fA6bb46d43C9" as const; - -export const TEST_USER = "0x1111111111111111111111111111111111111111" as const; -export const TEST_NOW_SECONDS = 1_700_000_000; - -export const b32 = (nibble: string) => - `0x${nibble.repeat(64)}` as `0x${string}`; - -export function makeMandateOutput( - chainId: bigint = CHAIN_ID_ARBITRUM, - amount: bigint = 1n, - overrides: Partial = {}, -): MandateOutput { - return { - oracle: addressToBytes32(COIN_FILLER), - settler: addressToBytes32(COIN_FILLER), - chainId, - token: b32("3"), - amount, - recipient: b32("4"), - callbackData: "0x", - context: "0x", - ...overrides, - }; -} - -export function makeStandardOrder( - overrides: Partial = {}, -): StandardOrder { - return { - user: TEST_USER, - nonce: 1n, - originChainId: CHAIN_ID_ETHEREUM, - expires: TEST_NOW_SECONDS + 1000, - fillDeadline: TEST_NOW_SECONDS + 900, - inputOracle: TEST_POLYMER_ORACLE, - inputs: [[1n, 1n]], - outputs: [makeMandateOutput(CHAIN_ID_ARBITRUM)], - ...overrides, - }; -} - -export function makeMultichainOrder( - overrides: Partial = {}, -): MultichainOrder { - return { - user: TEST_USER, - nonce: 2n, - expires: TEST_NOW_SECONDS + 1000, - fillDeadline: TEST_NOW_SECONDS + 900, - inputOracle: TEST_POLYMER_ORACLE, - outputs: [makeMandateOutput(CHAIN_ID_BASE, 2n)], - inputs: [ - { chainId: CHAIN_ID_ETHEREUM, inputs: [[1n, 1n]] }, - { chainId: CHAIN_ID_ARBITRUM, inputs: [[2n, 2n]] }, - ], - ...overrides, - }; -} diff --git a/packages/lintent/tsconfig.json b/packages/lintent/tsconfig.json deleted file mode 100644 index dea8a31..0000000 --- a/packages/lintent/tsconfig.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "compilerOptions": { - "target": "ESNext", - "module": "ESNext", - "moduleResolution": "bundler", - "strict": true, - "skipLibCheck": true, - "resolveJsonModule": true, - "forceConsistentCasingInFileNames": true, - "types": ["bun"] - }, - "include": ["src/**/*.ts"] -} diff --git a/app/issue-intent/playwright.config.ts b/playwright.config.ts similarity index 100% rename from app/issue-intent/playwright.config.ts rename to playwright.config.ts diff --git a/app/issue-intent/src/app.css b/src/app.css similarity index 100% rename from app/issue-intent/src/app.css rename to src/app.css diff --git a/app/issue-intent/src/app.d.ts b/src/app.d.ts similarity index 100% rename from app/issue-intent/src/app.d.ts rename to src/app.d.ts diff --git a/app/issue-intent/src/app.html b/src/app.html similarity index 100% rename from app/issue-intent/src/app.html rename to src/app.html diff --git a/app/issue-intent/src/favicon.png b/src/favicon.png similarity index 100% rename from app/issue-intent/src/favicon.png rename to src/favicon.png diff --git a/app/issue-intent/src/lib/abi/compact.ts b/src/lib/abi/compact.ts similarity index 100% rename from app/issue-intent/src/lib/abi/compact.ts rename to src/lib/abi/compact.ts diff --git a/app/issue-intent/src/lib/abi/erc20.ts b/src/lib/abi/erc20.ts similarity index 100% rename from app/issue-intent/src/lib/abi/erc20.ts rename to src/lib/abi/erc20.ts diff --git a/app/issue-intent/src/lib/abi/escrow.ts b/src/lib/abi/escrow.ts similarity index 100% rename from app/issue-intent/src/lib/abi/escrow.ts rename to src/lib/abi/escrow.ts diff --git a/app/issue-intent/src/lib/abi/multichain_compact.ts b/src/lib/abi/multichain_compact.ts similarity index 100% rename from app/issue-intent/src/lib/abi/multichain_compact.ts rename to src/lib/abi/multichain_compact.ts diff --git a/app/issue-intent/src/lib/abi/multichain_escrow.ts b/src/lib/abi/multichain_escrow.ts similarity index 100% rename from app/issue-intent/src/lib/abi/multichain_escrow.ts rename to src/lib/abi/multichain_escrow.ts diff --git a/app/issue-intent/src/lib/abi/outputsettler.ts b/src/lib/abi/outputsettler.ts similarity index 100% rename from app/issue-intent/src/lib/abi/outputsettler.ts rename to src/lib/abi/outputsettler.ts diff --git a/app/issue-intent/src/lib/abi/polymeroracle.ts b/src/lib/abi/polymeroracle.ts similarity index 100% rename from app/issue-intent/src/lib/abi/polymeroracle.ts rename to src/lib/abi/polymeroracle.ts diff --git a/app/issue-intent/src/lib/abi/settlercompact.ts b/src/lib/abi/settlercompact.ts similarity index 100% rename from app/issue-intent/src/lib/abi/settlercompact.ts rename to src/lib/abi/settlercompact.ts diff --git a/app/issue-intent/src/lib/abi/wormholeoracle.ts b/src/lib/abi/wormholeoracle.ts similarity index 100% rename from app/issue-intent/src/lib/abi/wormholeoracle.ts rename to src/lib/abi/wormholeoracle.ts diff --git a/app/issue-intent/src/lib/appTypes.ts b/src/lib/appTypes.ts similarity index 58% rename from app/issue-intent/src/lib/appTypes.ts rename to src/lib/appTypes.ts index a09d397..336ba4f 100644 --- a/app/issue-intent/src/lib/appTypes.ts +++ b/src/lib/appTypes.ts @@ -1,16 +1,17 @@ import type { Token, Verifier } from "./config"; -import type { CompactLock, EscrowLock } from "@lifi/lintent/types"; +import type { CreateIntentOptions } from "@lifi/intent"; export type AppTokenContext = { token: Token; amount: bigint; }; -export type AppCreateIntentOptions = { - exclusiveFor: string; +export type AppCreateIntentOptions = Omit< + CreateIntentOptions, + "account" | "inputTokens" | "outputTokens" +> & { inputTokens: AppTokenContext[]; outputTokens: AppTokenContext[]; verifier: Verifier; account: () => `0x${string}`; - lock: EscrowLock | CompactLock; }; diff --git a/app/issue-intent/src/lib/compile-migrations.ts b/src/lib/compile-migrations.ts similarity index 100% rename from app/issue-intent/src/lib/compile-migrations.ts rename to src/lib/compile-migrations.ts diff --git a/app/issue-intent/src/lib/components/AwaitButton.svelte b/src/lib/components/AwaitButton.svelte similarity index 100% rename from app/issue-intent/src/lib/components/AwaitButton.svelte rename to src/lib/components/AwaitButton.svelte diff --git a/app/issue-intent/src/lib/components/BalanceField.svelte b/src/lib/components/BalanceField.svelte similarity index 90% rename from app/issue-intent/src/lib/components/BalanceField.svelte rename to src/lib/components/BalanceField.svelte index 14cebc3..701bc3d 100644 --- a/app/issue-intent/src/lib/components/BalanceField.svelte +++ b/src/lib/components/BalanceField.svelte @@ -1,5 +1,5 @@ {#await buttonPromise} - + {:then} - + {:catch} - + {/await} diff --git a/src/lib/components/BalanceField.svelte b/src/lib/components/BalanceField.svelte index 701bc3d..7e33d51 100644 --- a/src/lib/components/BalanceField.svelte +++ b/src/lib/components/BalanceField.svelte @@ -1,34 +1,34 @@ {#await value} - + {:then value} - + {:catch error} - + {/await} diff --git a/src/lib/components/GetQuote.svelte b/src/lib/components/GetQuote.svelte index bf78c89..3bb606c 100644 --- a/src/lib/components/GetQuote.svelte +++ b/src/lib/components/GetQuote.svelte @@ -1,156 +1,158 @@
- {#await quoteRequest} -
- Quote -
- {:then _} - - {#if quoteExpires !== 0} -
- - {:else} -
- - {/if} - {/await} + {#await quoteRequest} +
+ Quote +
+ {:then _} + + {#if quoteExpires !== 0} +
+ + {:else} +
+ + {/if} + {/await}
diff --git a/src/lib/components/InputTokenModal.svelte b/src/lib/components/InputTokenModal.svelte index ea7bcf3..6014a13 100644 --- a/src/lib/components/InputTokenModal.svelte +++ b/src/lib/components/InputTokenModal.svelte @@ -1,255 +1,251 @@
-
-
-
-

Select Input

-

Choose token amount distribution across chains.

-
- -
- -
-
- - - - - - - {#each uniqueInputTokens as token} - - {/each} - -
- -
- -
Chain
-
Amount / Balance
-
Use
-
-
- {#each tokenSet as tkn, rowIndex} - {@const iaddr = iaddrFor(tkn)} -
- -
- {getChainName(tkn.chainId)} -
- {#await (store.intentType === "compact" ? store.compactBalances : store.balances)[tkn.chainId][tkn.address]} - - {:then balance} - - {:catch _} - - {/await} -
- -
-
-
- {/each} -
-
- - -
-
+
+
+
+

Select Input

+

Choose token amount distribution across chains.

+
+ +
+ +
+
+ + + + + + + {#each uniqueInputTokens as token} + + {/each} + +
+ +
+ +
Chain
+
Amount / Balance
+
Use
+
+
+ {#each tokenSet as tkn, rowIndex} + {@const iaddr = iaddrFor(tkn)} +
+ +
+ {getChainName(tkn.chainId)} +
+ {#await (store.intentType === "compact" ? store.compactBalances : store.balances)[tkn.chainId][tkn.address]} + + {:then balance} + + {:catch _} + + {/await} +
+ +
+
+
+ {/each} +
+
+ + +
+
diff --git a/src/lib/components/IntentListDetailRow.svelte b/src/lib/components/IntentListDetailRow.svelte index 8763ada..24cda4f 100644 --- a/src/lib/components/IntentListDetailRow.svelte +++ b/src/lib/components/IntentListDetailRow.svelte @@ -1,74 +1,74 @@
-
-
- IN - {#each row.inputChips as chip (chip.key)} - {chip.text} - {/each} - {#if row.inputOverflow > 0} - +{row.inputOverflow} - {/if} - -
-
- OUT - {#each row.outputChips as chip (chip.key)} - {chip.text} - {/each} - {#if row.outputOverflow > 0} - +{row.outputOverflow} - {/if} -
-
-
- {rightBadge} - {rightText} -
+
+
+ IN + {#each row.inputChips as chip (chip.key)} + {chip.text} + {/each} + {#if row.inputOverflow > 0} + +{row.inputOverflow} + {/if} + +
+
+ OUT + {#each row.outputChips as chip (chip.key)} + {chip.text} + {/each} + {#if row.outputOverflow > 0} + +{row.outputOverflow} + {/if} +
+
+
+ {rightBadge} + {rightText} +
- {row.chainScopeBadge} - {#if row.inputSchemeBadge} - {row.inputSchemeBadge} - {/if} - {#each row.protocolBadges as badge (badge)} - {badge} - {/each} - Order {row.orderIdShort} - User {row.userShort} - {row.inputCount} inputs • {row.outputCount} outputs - - {row.validationPassed ? "Validation Pass" : `Invalid: ${row.validationReason}`} - + {row.chainScopeBadge} + {#if row.inputSchemeBadge} + {row.inputSchemeBadge} + {/if} + {#each row.protocolBadges as badge (badge)} + {badge} + {/each} + Order {row.orderIdShort} + User {row.userShort} + {row.inputCount} inputs • {row.outputCount} outputs + + {row.validationPassed ? "Validation Pass" : `Invalid: ${row.validationReason}`} +
diff --git a/src/lib/components/Introduction.svelte b/src/lib/components/Introduction.svelte index ea22fea..623630a 100644 --- a/src/lib/components/Introduction.svelte +++ b/src/lib/components/Introduction.svelte @@ -1,82 +1,82 @@
-

- This webapp demonstrates chain abstraction using the - Open Intents Framework. It currently support a seamless resource lock flow using - The Compact and a traditional escrow flow, along with a work in progress multichain flow. -

+

+ This webapp demonstrates chain abstraction using the + Open Intents Framework. It currently support a seamless resource lock flow using + The Compact and a traditional escrow flow, along with a work in progress multichain flow. +

-
+
-

Multichain

-

- A multichain intent is an intent that collects inputs on multiple chains, providing the result - on one or more chains. In other words, a multichain intent is an any to any intent. - Multichain intents are currently work in progress and will break in the future. If you are using - this interface for testing, ensure the multichain flag is not shown. -

+

Multichain

+

+ A multichain intent is an intent that collects inputs on multiple chains, providing the result + on one or more chains. In other words, a multichain intent is an any to any intent. + Multichain intents are currently work in progress and will break in the future. If you are using + this interface for testing, ensure the multichain flag is not shown. +

-
+
-

Why Resource Locks?

-

- Resource Locks improve asset availability guarantees in cross-chain contexts and asynchronous - environments, offering several key advantages: -

+

Why Resource Locks?

+

+ Resource Locks improve asset availability guarantees in cross-chain contexts and asynchronous + environments, offering several key advantages: +

-
    -
  • Funds are only debited after successful delivery has been proven.
  • -
  • - Enables efficient short-lived interactions—intents can expire within seconds without - consequence. -
  • -
  • No upfront deposit or initiation transaction are required.
  • -
  • Fully composable with other protocols and settlement layers.
  • -
+
    +
  • Funds are only debited after successful delivery has been proven.
  • +
  • + Enables efficient short-lived interactions—intents can expire within seconds without + consequence. +
  • +
  • No upfront deposit or initiation transaction are required.
  • +
  • Fully composable with other protocols and settlement layers.
  • +
-

- Learn more about - Resource Locks. -

+

+ Learn more about + Resource Locks. +

-
+
-

Why the Open Intents Framework?

-

- The Open Intents Framework (OIF) is an open coordination layer for standardizing and scaling - intent-based workflows across chains. The goal is to: -

+

Why the Open Intents Framework?

+

+ The Open Intents Framework (OIF) is an open coordination layer for standardizing and scaling + intent-based workflows across chains. The goal is to: +

-
    -
  • Standardise cross-chain interactions.
  • -
  • Define a permissionless intent implementation that can scale across all chains.
  • -
  • Create a reference implementation for cross-chain solvers & searchers.
  • -
  • Provide tooling for wallet and app developers.
  • -
-

- Learn more about - Open Intents Framework. -

+
    +
  • Standardise cross-chain interactions.
  • +
  • Define a permissionless intent implementation that can scale across all chains.
  • +
  • Create a reference implementation for cross-chain solvers & searchers.
  • +
  • Provide tooling for wallet and app developers.
  • +
+

+ Learn more about + Open Intents Framework. +

-
+
-

Same Chain

-

- A same chain intent is an intent that only has inputs and outputs on the same chain. The oracle - is configured different to a cross-chain intent. SetAttestation has to be called on the output - settler to expose the filled output. Learm more about same chain intents or explore a demo of how to collect inputs before delivering outputs. -

+

Same Chain

+

+ A same chain intent is an intent that only has inputs and outputs on the same chain. The oracle + is configured different to a cross-chain intent. SetAttestation has to be called on the output + settler to expose the filled output. Learm more about same chain intents or explore a demo of how to collect inputs before delivering outputs. +

diff --git a/src/lib/components/OutputTokenModal.svelte b/src/lib/components/OutputTokenModal.svelte index c47c460..43802ce 100644 --- a/src/lib/components/OutputTokenModal.svelte +++ b/src/lib/components/OutputTokenModal.svelte @@ -1,140 +1,138 @@
-
-
-
-

Select Output

-

Configure one or more destination token outputs.

-
- -
+
+
+
+

Select Output

+

Configure one or more destination token outputs.

+
+ +
-
-
- -
Chain
-
Amount
-
Token
-
-
- {#each outputs as output, rowIndex} - - - {#each chainIdList(store.mainnet) as chainId} - - {/each} - - - - {#each getTokensForChain(output.chainId) as token} - - {/each} - - - {/each} -
-
+
+
+ +
Chain
+
Amount
+
Token
+
+
+ {#each outputs as output, rowIndex} + + + {#each chainIdList(store.mainnet) as chainId} + + {/each} + + + + {#each getTokensForChain(output.chainId) as token} + + {/each} + + + {/each} +
+
-
- - - -
-
-
+
+ + + +
+
+
diff --git a/src/lib/components/ui/ChainActionRow.svelte b/src/lib/components/ui/ChainActionRow.svelte index 4350a30..b0f7ef9 100644 --- a/src/lib/components/ui/ChainActionRow.svelte +++ b/src/lib/components/ui/ChainActionRow.svelte @@ -1,40 +1,40 @@
-
- {chainLabel} -
-
-
- {@render action?.()} -
-
-
- {@render chips?.()} -
-
-
+
+ {chainLabel} +
+
+
+ {@render action?.()} +
+
+
+ {@render chips?.()} +
+
+
diff --git a/src/lib/components/ui/FieldRow.svelte b/src/lib/components/ui/FieldRow.svelte index 413d829..77000ee 100644 --- a/src/lib/components/ui/FieldRow.svelte +++ b/src/lib/components/ui/FieldRow.svelte @@ -1,33 +1,33 @@
- {@render children?.()} + {@render children?.()}
diff --git a/src/lib/components/ui/FlowProgressList.svelte b/src/lib/components/ui/FlowProgressList.svelte index 6d9f76a..e6f14ca 100644 --- a/src/lib/components/ui/FlowProgressList.svelte +++ b/src/lib/components/ui/FlowProgressList.svelte @@ -1,82 +1,108 @@ -
-
- Progress -
-
-
- {#each steps as step, i (step.id)} - - {#if i < steps.length - 1} -
-
-
-
- {/if} - {/each} -
-
+
+ +
+
+ {#each steps as step, i (step.id)} + + {#if i < steps.length - 1} +
+
+
+
+ {/if} + {/each} +
+
+ + diff --git a/src/lib/components/ui/FlowStepTracker.svelte b/src/lib/components/ui/FlowStepTracker.svelte index 9034160..434ed6b 100644 --- a/src/lib/components/ui/FlowStepTracker.svelte +++ b/src/lib/components/ui/FlowStepTracker.svelte @@ -1,230 +1,230 @@ diff --git a/src/lib/components/ui/FormControl.svelte b/src/lib/components/ui/FormControl.svelte index 1553054..bc4e34a 100644 --- a/src/lib/components/ui/FormControl.svelte +++ b/src/lib/components/ui/FormControl.svelte @@ -1,60 +1,60 @@ {#if as === "select"} - + {:else} - + {/if} diff --git a/src/lib/components/ui/InlineMetaField.svelte b/src/lib/components/ui/InlineMetaField.svelte index c1adac7..95e2eb4 100644 --- a/src/lib/components/ui/InlineMetaField.svelte +++ b/src/lib/components/ui/InlineMetaField.svelte @@ -1,27 +1,27 @@
- -
- {metaPrefix} - {metaText} -
+ +
+ {metaPrefix} + {metaText} +
diff --git a/src/lib/components/ui/ScreenFrame.svelte b/src/lib/components/ui/ScreenFrame.svelte index b9b30ed..af421a3 100644 --- a/src/lib/components/ui/ScreenFrame.svelte +++ b/src/lib/components/ui/ScreenFrame.svelte @@ -1,29 +1,29 @@
- {#if title} -

{title}

- {/if} - {#if description} -

{description}

- {/if} -
- {@render children?.()} -
+ {#if title} +

{title}

+ {/if} + {#if description} +

{description}

+ {/if} +
+ {@render children?.()} +
diff --git a/src/lib/components/ui/SectionCard.svelte b/src/lib/components/ui/SectionCard.svelte index ed08b64..d03bffc 100644 --- a/src/lib/components/ui/SectionCard.svelte +++ b/src/lib/components/ui/SectionCard.svelte @@ -1,40 +1,40 @@
- {#if title || headerRight} -
- {#if title} -

{title}

- {/if} - {#if headerRight} -
- {@render headerRight()} -
- {/if} -
- {/if} -
- {@render children?.()} -
+ {#if title || headerRight} +
+ {#if title} +

{title}

+ {/if} + {#if headerRight} +
+ {@render headerRight()} +
+ {/if} +
+ {/if} +
+ {@render children?.()} +
diff --git a/src/lib/components/ui/SegmentedControl.svelte b/src/lib/components/ui/SegmentedControl.svelte index 959d745..2812812 100644 --- a/src/lib/components/ui/SegmentedControl.svelte +++ b/src/lib/components/ui/SegmentedControl.svelte @@ -1,45 +1,45 @@
- {#each options as option, i (option.value)} - - {/each} + {#each options as option, i (option.value)} + + {/each}
diff --git a/src/lib/components/ui/TokenAmountChip.svelte b/src/lib/components/ui/TokenAmountChip.svelte index bf953f2..efeafbc 100644 --- a/src/lib/components/ui/TokenAmountChip.svelte +++ b/src/lib/components/ui/TokenAmountChip.svelte @@ -1,34 +1,34 @@
- {amountText} - {symbol.toUpperCase()} + {amountText} + {symbol.toUpperCase()}
diff --git a/src/lib/config.ts b/src/lib/config.ts index d9bb9b0..122936a 100644 --- a/src/lib/config.ts +++ b/src/lib/config.ts @@ -1,79 +1,91 @@ import { createPublicClient, createWalletClient, custom, fallback, http } from "viem"; import { - arbitrum, - arbitrumSepolia, - base, - baseSepolia, - mainnet as ethereum, - optimismSepolia, - sepolia, - polygon, - bsc, - katana, - megaeth + arbitrum, + arbitrumSepolia, + base, + baseSepolia, + mainnet as ethereum, + optimismSepolia, + sepolia, + polygon, + bsc, + katana, + megaeth, + optimism, + arcTestnet } from "viem/chains"; export const ADDRESS_ZERO = "0x0000000000000000000000000000000000000000" as const; export const BYTES32_ZERO = - "0x0000000000000000000000000000000000000000000000000000000000000000" as const; + "0x0000000000000000000000000000000000000000000000000000000000000000" as const; export const COMPACT = "0x00000000000000171ede64904551eeDF3C6C9788" as const; export const INPUT_SETTLER_COMPACT_LIFI = "0x0000000000cd5f7fDEc90a03a31F79E5Fbc6A9Cf" as const; export const INPUT_SETTLER_ESCROW_LIFI = "0x000025c3226C00B2Cdc200005a1600509f4e00C0" as const; export const MULTICHAIN_INPUT_SETTLER_ESCROW = - "0xb912b4c38ab54b94D45Ac001484dEBcbb519Bc2B" as const; + "0xb912b4c38ab54b94D45Ac001484dEBcbb519Bc2B" as const; export const MULTICHAIN_INPUT_SETTLER_COMPACT = - "0x1fccC0807F25A58eB531a0B5b4bf3dCE88808Ed7" as const; + "0x1fccC0807F25A58eB531a0B5b4bf3dCE88808Ed7" as const; export const ALWAYS_OK_ALLOCATOR = "281773970620737143753120258" as const; export const POLYMER_ALLOCATOR = "116450367070547927622991121" as const; // 0x02ecC89C25A5DCB1206053530c58E002a737BD11 signing by 0x934244C8cd6BeBDBd0696A659D77C9BDfE86Efe6 export const COIN_FILLER = "0x0000000000eC36B683C2E6AC89e9A75989C22a2e" as const; export const WORMHOLE_ORACLE: Partial> = { - [ethereum.id]: "0x0000000000000000000000000000000000000000", - [arbitrum.id]: "0x0000000000000000000000000000000000000000", - [base.id]: "0x0000000000000000000000000000000000000000" + [ethereum.id]: "0x0000000000000000000000000000000000000000", + [arbitrum.id]: "0x0000000000000000000000000000000000000000", + [base.id]: "0x0000000000000000000000000000000000000000" }; export const POLYMER_ORACLE: Partial> = { - [ethereum.id]: "0x0000003E06000007A224AeE90052fA6bb46d43C9", - [arbitrum.id]: "0x0000003E06000007A224AeE90052fA6bb46d43C9", - [base.id]: "0x0000003E06000007A224AeE90052fA6bb46d43C9", - [megaeth.id]: "0x0000003E06000007A224AeE90052fA6bb46d43C9", - [katana.id]: "0x0000003E06000007A224AeE90052fA6bb46d43C9", - [polygon.id]: "0x0000003E06000007A224AeE90052fA6bb46d43C9", - [bsc.id]: "0x0000003E06000007A224AeE90052fA6bb46d43C9", - // testnet - [sepolia.id]: "0x00d5b500ECa100F7cdeDC800eC631Aca00BaAC00", - [baseSepolia.id]: "0x00d5b500ECa100F7cdeDC800eC631Aca00BaAC00", - [arbitrumSepolia.id]: "0x00d5b500ECa100F7cdeDC800eC631Aca00BaAC00", - [optimismSepolia.id]: "0x00d5b500ECa100F7cdeDC800eC631Aca00BaAC00" + [ethereum.id]: "0x0000003E06000007A224AeE90052fA6bb46d43C9", + [arbitrum.id]: "0x0000003E06000007A224AeE90052fA6bb46d43C9", + [base.id]: "0x0000003E06000007A224AeE90052fA6bb46d43C9", + [megaeth.id]: "0x0000003E06000007A224AeE90052fA6bb46d43C9", + [katana.id]: "0x0000003E06000007A224AeE90052fA6bb46d43C9", + [polygon.id]: "0x0000003E06000007A224AeE90052fA6bb46d43C9", + [bsc.id]: "0x0000003E06000007A224AeE90052fA6bb46d43C9", + // testnet + [sepolia.id]: "0xe15b438C6267B0011aDa1e40fD8757Aa8Fe1E5a0", + [baseSepolia.id]: "0xe15b438C6267B0011aDa1e40fD8757Aa8Fe1E5a0", + [arbitrumSepolia.id]: "0xe15b438C6267B0011aDa1e40fD8757Aa8Fe1E5a0", + [optimismSepolia.id]: "0xe15b438C6267B0011aDa1e40fD8757Aa8Fe1E5a0", + [arcTestnet.id]: "0xe15b438C6267B0011aDa1e40fD8757Aa8Fe1E5a0" }; export type availableAllocators = typeof ALWAYS_OK_ALLOCATOR | typeof POLYMER_ALLOCATOR; export type availableInputSettlers = - | typeof INPUT_SETTLER_COMPACT_LIFI - | typeof INPUT_SETTLER_ESCROW_LIFI; + | typeof INPUT_SETTLER_COMPACT_LIFI + | typeof INPUT_SETTLER_ESCROW_LIFI; export const chainMap = { - ethereum, - base, - arbitrum, - sepolia, - arbitrumSepolia, - optimismSepolia, - baseSepolia, - katana, - megaeth, - bsc, - polygon + ethereum, + base, + arbitrum, + optimism, + sepolia, + arbitrumSepolia, + optimismSepolia, + baseSepolia, + katana, + megaeth, + bsc, + polygon, + arcTestnet } as const; type ChainName = keyof typeof chainMap; export const chains = Object.keys(chainMap) as ChainName[]; export const chainList = (mainnet: boolean) => { - if (mainnet == true) { - return ["ethereum", "base", "arbitrum", "megaeth", "katana", "polygon", "bsc"] as ChainName[]; - } else return ["sepolia", "optimismSepolia", "baseSepolia", "arbitrumSepolia"] as ChainName[]; + if (mainnet == true) { + return ["ethereum", "base", "arbitrum", "megaeth", "katana", "polygon", "bsc"] as ChainName[]; + } else + return [ + "sepolia", + "optimismSepolia", + "baseSepolia", + "arbitrumSepolia", + "arcTestnet" + ] as ChainName[]; }; export const chainIdList = (mainnet: boolean) => { - return chainList(mainnet).map((name) => chainMap[name].id); + return chainList(mainnet).map((name) => chainMap[name].id); }; const chainEntries = chains.map((name) => [chainMap[name].id, chainMap[name]] as const); @@ -82,406 +94,437 @@ const chainNameEntries = chains.map((name) => [chainMap[name].id, name] as const export type balanceQuery = Record>>; export type Token = { - address: `0x${string}`; - name: string; - chainId: number; - decimals: number; + address: `0x${string}`; + name: string; + chainId: number; + decimals: number; }; export const coinList = (mainnet: boolean) => { - if (mainnet == true) - return [ - { - address: `0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913`, - name: "usdc", - chainId: base.id, - decimals: 6 - }, - { - address: `0xaf88d065e77c8cC2239327C5EDb3A432268e5831`, - name: "usdc", - chainId: arbitrum.id, - decimals: 6 - }, - { - address: `0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48`, - name: "usdc", - chainId: ethereum.id, - decimals: 6 - }, - { - address: ADDRESS_ZERO, - name: "eth", - chainId: base.id, - decimals: 18 - }, - { - address: ADDRESS_ZERO, - name: "eth", - chainId: arbitrum.id, - decimals: 18 - }, - { - address: ADDRESS_ZERO, - name: "eth", - chainId: ethereum.id, - decimals: 18 - }, - { - address: `0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2`, - name: "weth", - chainId: ethereum.id, - decimals: 18 - }, - { - address: `0x4200000000000000000000000000000000000006`, - name: "weth", - chainId: base.id, - decimals: 18 - }, - { - address: `0x82aF49447D8a07e3bd95BD0d56f35241523fBab1`, - name: "weth", - chainId: arbitrum.id, - decimals: 18 - }, - { - address: `0x4200000000000000000000000000000000000006`, - name: "weth", - chainId: megaeth.id, - decimals: 18 - }, - { - address: `0xFAfDdbb3FC7688494971a79cc65DCa3EF82079E7`, - name: "usdm", - chainId: megaeth.id, - decimals: 18 - }, - { - address: `0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d`, - name: "usdc-b", - chainId: bsc.id, - decimals: 18 - }, - { - address: `0x55d398326f99059ff775485246999027b3197955`, - name: "usdt-b", - chainId: bsc.id, - decimals: 18 - }, - { - address: `0x203a662b0bd271a6ed5a60edfbd04bfce608fd36`, - name: "vbUSDC", - chainId: katana.id, - decimals: 6 - }, - { - address: `0x7ceb23fd6bc0add59e62ac25578270cff1b9f619`, - name: "weth", - chainId: polygon.id, - decimals: 18 - }, - { - address: `0x3c499c542cef5e3811e1192ce70d8cc03d5c3359`, - name: "usdc", - chainId: polygon.id, - decimals: 6 - }, - { - address: `0x2791bca1f2de4661ed88a30c99a7a9449aa84174`, - name: "usdc.e", - chainId: polygon.id, - decimals: 6 - } - ] as const; - else - return [ - { - address: `0x5fd84259d66Cd46123540766Be93DFE6D43130D7`, - name: "usdc", - chainId: optimismSepolia.id, - decimals: 6 - }, - { - address: `0x036CbD53842c5426634e7929541eC2318f3dCF7e`, - name: "usdc", - chainId: baseSepolia.id, - decimals: 6 - }, - { - address: `0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238`, - name: "usdc", - chainId: sepolia.id, - decimals: 6 - }, - { - address: "0x75faf114eafb1BDbe2F0316DF893fd58CE46AA4d", - name: "usdc", - chainId: arbitrumSepolia.id, - decimals: 6 - }, - { - address: ADDRESS_ZERO, - name: "eth", - chainId: sepolia.id, - decimals: 18 - }, - { - address: ADDRESS_ZERO, - name: "eth", - chainId: baseSepolia.id, - decimals: 18 - }, - { - address: ADDRESS_ZERO, - name: "eth", - chainId: optimismSepolia.id, - decimals: 18 - }, - { - address: ADDRESS_ZERO, - name: "eth", - chainId: arbitrumSepolia.id, - decimals: 6 - }, - { - address: `0xfFf9976782d46CC05630D1f6eBAb18b2324d6B14`, - name: "weth", - chainId: sepolia.id, - decimals: 18 - }, - { - address: `0x4200000000000000000000000000000000000006`, - name: "weth", - chainId: baseSepolia.id, - decimals: 18 - }, - { - address: `0x4200000000000000000000000000000000000006`, - name: "weth", - chainId: optimismSepolia.id, - decimals: 18 - }, - { - address: `0x980B62Da83eFf3D4576C647993b0c1D7faf17c73`, - name: "weth", - chainId: arbitrumSepolia.id, - decimals: 18 - } - ] as const; + if (mainnet == true) + return [ + { + address: `0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913`, + name: "usdc", + chainId: base.id, + decimals: 6 + }, + { + address: `0xaf88d065e77c8cC2239327C5EDb3A432268e5831`, + name: "usdc", + chainId: arbitrum.id, + decimals: 6 + }, + { + address: `0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48`, + name: "usdc", + chainId: ethereum.id, + decimals: 6 + }, + { + address: ADDRESS_ZERO, + name: "eth", + chainId: base.id, + decimals: 18 + }, + { + address: ADDRESS_ZERO, + name: "eth", + chainId: arbitrum.id, + decimals: 18 + }, + { + address: ADDRESS_ZERO, + name: "eth", + chainId: ethereum.id, + decimals: 18 + }, + { + address: `0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2`, + name: "weth", + chainId: ethereum.id, + decimals: 18 + }, + { + address: `0x82106347dDbB23cE44Cf4cE4053Ef1adf8b9323B`, + name: "wmton", + chainId: ethereum.id, + decimals: 18 + }, + { + address: `0x4200000000000000000000000000000000000006`, + name: "weth", + chainId: base.id, + decimals: 18 + }, + { + address: `0x4200000000000000000000000000000000000006`, + name: "weth", + chainId: optimism.id, + decimals: 18 + }, + { + address: `0x82aF49447D8a07e3bd95BD0d56f35241523fBab1`, + name: "weth", + chainId: arbitrum.id, + decimals: 18 + }, + { + address: `0x4200000000000000000000000000000000000006`, + name: "weth", + chainId: megaeth.id, + decimals: 18 + }, + { + address: `0xFAfDdbb3FC7688494971a79cc65DCa3EF82079E7`, + name: "usdm", + chainId: megaeth.id, + decimals: 18 + }, + { + address: `0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d`, + name: "usdc-b", + chainId: bsc.id, + decimals: 18 + }, + { + address: `0x55d398326f99059ff775485246999027b3197955`, + name: "usdt-b", + chainId: bsc.id, + decimals: 18 + }, + { + address: `0x203a662b0bd271a6ed5a60edfbd04bfce608fd36`, + name: "vbUSDC", + chainId: katana.id, + decimals: 6 + }, + { + address: `0x7ceb23fd6bc0add59e62ac25578270cff1b9f619`, + name: "weth", + chainId: polygon.id, + decimals: 18 + }, + { + address: `0x3c499c542cef5e3811e1192ce70d8cc03d5c3359`, + name: "usdc", + chainId: polygon.id, + decimals: 6 + }, + { + address: `0x2791bca1f2de4661ed88a30c99a7a9449aa84174`, + name: "usdc.e", + chainId: polygon.id, + decimals: 6 + } + ] as const; + else + return [ + { + address: `0x5fd84259d66Cd46123540766Be93DFE6D43130D7`, + name: "usdc", + chainId: optimismSepolia.id, + decimals: 6 + }, + { + address: `0x036CbD53842c5426634e7929541eC2318f3dCF7e`, + name: "usdc", + chainId: baseSepolia.id, + decimals: 6 + }, + { + address: `0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238`, + name: "usdc", + chainId: sepolia.id, + decimals: 6 + }, + { + address: "0x75faf114eafb1BDbe2F0316DF893fd58CE46AA4d", + name: "usdc", + chainId: arbitrumSepolia.id, + decimals: 6 + }, + { + address: ADDRESS_ZERO, + name: "eth", + chainId: sepolia.id, + decimals: 18 + }, + { + address: ADDRESS_ZERO, + name: "eth", + chainId: baseSepolia.id, + decimals: 18 + }, + { + address: ADDRESS_ZERO, + name: "eth", + chainId: optimismSepolia.id, + decimals: 18 + }, + { + address: ADDRESS_ZERO, + name: "eth", + chainId: arbitrumSepolia.id, + decimals: 6 + }, + { + address: `0xfFf9976782d46CC05630D1f6eBAb18b2324d6B14`, + name: "weth", + chainId: sepolia.id, + decimals: 18 + }, + { + address: `0x4200000000000000000000000000000000000006`, + name: "weth", + chainId: baseSepolia.id, + decimals: 18 + }, + { + address: `0x4200000000000000000000000000000000000006`, + name: "weth", + chainId: optimismSepolia.id, + decimals: 18 + }, + { + address: `0x980B62Da83eFf3D4576C647993b0c1D7faf17c73`, + name: "weth", + chainId: arbitrumSepolia.id, + decimals: 18 + }, + { + address: `0x3600000000000000000000000000000000000000`, + name: "usdc", + chainId: arcTestnet.id, + decimals: 6 + } + ] as const; }; export function printToken(token: Token) { - return `${token.name.toUpperCase()}, ${getChainName(token.chainId)}`; + return `${token.name.toUpperCase()}, ${getChainName(token.chainId)}`; } export function formatTokenAmount(amount: bigint, tokenDecimals: number, decimals = 4) { - const formattedAmount = Number(amount) / 10 ** tokenDecimals; - return formattedAmount.toFixed(decimals); + const formattedAmount = Number(amount) / 10 ** tokenDecimals; + return formattedAmount.toFixed(decimals); } export function getIndexOf(token: Token) { - const coins = coinList(!isChainIdTestnet(token.chainId)); - for (let i = 0; i < coins.length; ++i) { - const elem = coins[i]; - if (token.chainId === elem.chainId && token.address === elem.address) return i; - } - return -1; + const coins = coinList(!isChainIdTestnet(token.chainId)); + for (let i = 0; i < coins.length; ++i) { + const elem = coins[i]; + if (token.chainId === elem.chainId && token.address === elem.address) return i; + } + return -1; } export type coin = ReturnType[number]["address"]; export const wormholeChainIds = { - sepolia: 10002, - arbitrumSepolia: 10003, - baseSepolia: 10004, - optimismSepolia: 10005 + sepolia: 10002, + arbitrumSepolia: 10003, + baseSepolia: 10004, + optimismSepolia: 10005 } as const; export const polymerChainIds = { - ethereum: ethereum.id, - base: base.id, - arbitrum: arbitrum.id, - sepolia: sepolia.id, - arbitrumSepolia: arbitrumSepolia.id, - baseSepolia: baseSepolia.id, - optimismSepolia: optimismSepolia.id, - megaeth: megaeth.id, - katana: katana.id, - bsc: bsc.id, - polygon: polygon.id + ethereum: ethereum.id, + base: base.id, + arbitrum: arbitrum.id, + sepolia: sepolia.id, + arbitrumSepolia: arbitrumSepolia.id, + baseSepolia: baseSepolia.id, + optimismSepolia: optimismSepolia.id, + optimism: optimism.id, + megaeth: megaeth.id, + katana: katana.id, + bsc: bsc.id, + polygon: polygon.id, + arcTestnet: arcTestnet.id } as const; export type Verifier = "wormhole" | "polymer"; export function getCoin( - args: - | { name: string; chainId: number | bigint | string; address?: undefined } - | { - address: `0x${string}`; - chainId: number | bigint | string; - name?: undefined; - } + args: + | { name: string; chainId: number | bigint | string; address?: undefined } + | { + address: `0x${string}`; + chainId: number | bigint | string; + name?: undefined; + } ) { - const { name = undefined, address = undefined } = args; - const chainId = normalizeChainId(args.chainId); - // ensure the address is ERC20-sized. - const concatedAddress = - "0x" + address?.replace("0x", "")?.slice(address.length - 42, address.length); - for (const token of coinList(!isChainIdTestnet(chainId))) { - // check chain first. - if (token.chainId === chainId) { - if (name === undefined) { - if (concatedAddress?.toLowerCase() === token.address.toLowerCase()) return token; - } - if (name?.toLowerCase() === token.name.toLowerCase()) return token; - } - } - return { - name: name ?? "Unknown", - address: address ?? ADDRESS_ZERO, - chainId, - decimals: 1 - }; - // throw new Error(`No coins found for chain: ${concatedAddress} ${chain}`); + const { name = undefined, address = undefined } = args; + const chainId = normalizeChainId(args.chainId); + // ensure the address is ERC20-sized. + const concatedAddress = + "0x" + address?.replace("0x", "")?.slice(address.length - 42, address.length); + for (const token of coinList(!isChainIdTestnet(chainId))) { + // check chain first. + if (token.chainId === chainId) { + if (name === undefined) { + if (concatedAddress?.toLowerCase() === token.address.toLowerCase()) return token; + } + if (name?.toLowerCase() === token.name.toLowerCase()) return token; + } + } + return { + name: name ?? "Unknown", + address: address ?? ADDRESS_ZERO, + chainId, + decimals: 1 + }; + // throw new Error(`No coins found for chain: ${concatedAddress} ${chain}`); } function normalizeChainId(chainId: number | bigint | string) { - if (typeof chainId === "string") return Number(chainId); - if (typeof chainId === "bigint") return Number(chainId); - return chainId; + if (typeof chainId === "string") return Number(chainId); + if (typeof chainId === "bigint") return Number(chainId); + return chainId; } export function isChainIdTestnet(chainId: number | bigint | string) { - const normalized = normalizeChainId(chainId); - const chain = chainById[normalized]; - if (!chain) throw new Error(`Chain is not known: ${normalized}`); - return chain.testnet; + const normalized = normalizeChainId(chainId); + const chain = chainById[normalized]; + if (!chain) throw new Error(`Chain is not known: ${normalized}`); + return chain.testnet; } export function getChainName(chainId: number | bigint | string) { - const normalized = normalizeChainId(chainId); - const name = chainNameById[normalized]; - if (!name) throw new Error(`Chain is not known: ${normalized}`); - return name; + const normalized = normalizeChainId(chainId); + const name = chainNameById[normalized]; + if (!name) throw new Error(`Chain is not known: ${normalized}`); + return name; } export function formatTokenDecimals( - value: bigint | number, - coin: Token, - as: "number" | "string" = "string" + value: bigint | number, + coin: Token, + as: "number" | "string" = "string" ) { - const decimals = coin.decimals; - const result = Number(value) / 10 ** decimals; - return as === "string" ? result.toString() : result; + const decimals = coin.decimals; + const result = Number(value) / 10 ** decimals; + return as === "string" ? result.toString() : result; } export function getOracle(verifier: Verifier, chainId: number | bigint | string) { - const normalized = normalizeChainId(chainId); - if (verifier === "polymer") return POLYMER_ORACLE[normalized]; - if (verifier === "wormhole") return WORMHOLE_ORACLE[normalized]; - return undefined; + const normalized = normalizeChainId(chainId); + if (verifier === "polymer") return POLYMER_ORACLE[normalized]; + if (verifier === "wormhole") return WORMHOLE_ORACLE[normalized]; + return undefined; } export function getChain(chainId: number | bigint | string) { - const normalized = normalizeChainId(chainId); - const chain = chainById[normalized]; - if (!chain) throw new Error(`Could not find chain for chainId ${normalized}`); - return chain; + const normalized = normalizeChainId(chainId); + const chain = chainById[normalized]; + if (!chain) throw new Error(`Could not find chain for chainId ${normalized}`); + return chain; } export function getClient(chainId: number | bigint | string) { - const normalized = normalizeChainId(chainId); - const client = clientsById[normalized]; - if (!client) throw new Error(`Could not find client for chainId ${normalized}`); - return client; + const normalized = normalizeChainId(chainId); + const client = clientsById[normalized]; + if (!client) throw new Error(`Could not find client for chainId ${normalized}`); + return client; } export const clients = { - ethereum: createPublicClient({ - chain: ethereum, - transport: fallback([ - http("https://ethereum-rpc.publicnode.com"), - ...ethereum.rpcUrls.default.http.map((v) => http(v)) - ]) - }), - arbitrum: createPublicClient({ - chain: arbitrum, - transport: fallback([ - http("https://arbitrum-rpc.publicnode.com"), - ...arbitrum.rpcUrls.default.http.map((v) => http(v)) - ]) - }), - base: createPublicClient({ - chain: base, - transport: fallback([ - http("https://base-rpc.publicnode.com"), - ...base.rpcUrls.default.http.map((v) => http(v)) - ]) - }), - bsc: createPublicClient({ - chain: bsc, - transport: fallback([ - http("https://bsc-rpc.publicnode.com"), - ...bsc.rpcUrls.default.http.map((v) => http(v)) - ]) - }), - polygon: createPublicClient({ - chain: base, - transport: fallback([ - http("https://polygon-bor-rpc.publicnode.com"), - ...polygon.rpcUrls.default.http.map((v) => http(v)) - ]) - }), - megaeth: createPublicClient({ - chain: megaeth, - transport: fallback([...megaeth.rpcUrls.default.http.map((v) => http(v))]) - }), - katana: createPublicClient({ - chain: katana, - transport: fallback([...katana.rpcUrls.default.http.map((v) => http(v))]) - }), - // Testnet - sepolia: createPublicClient({ - chain: sepolia, - transport: fallback([ - http("https://ethereum-sepolia-rpc.publicnode.com"), - ...sepolia.rpcUrls.default.http.map((v) => http(v)) - ]) - }), - arbitrumSepolia: createPublicClient({ - chain: arbitrumSepolia, - transport: fallback([ - http("https://arbitrum-sepolia-rpc.publicnode.com"), - ...arbitrumSepolia.rpcUrls.default.http.map((v) => http(v)) - ]) - }), - baseSepolia: createPublicClient({ - chain: baseSepolia, - transport: fallback([ - http("https://base-sepolia-rpc.publicnode.com"), - ...baseSepolia.rpcUrls.default.http.map((v) => http(v)) - ]) - }), - optimismSepolia: createPublicClient({ - chain: optimismSepolia, - transport: fallback([ - http("https://optimism-sepolia-rpc.publicnode.com"), - ...optimismSepolia.rpcUrls.default.http.map((v) => http(v)) - ]) - }) + ethereum: createPublicClient({ + chain: ethereum, + transport: fallback([ + http("https://ethereum-rpc.publicnode.com"), + ...ethereum.rpcUrls.default.http.map((v) => http(v)) + ]) + }), + arbitrum: createPublicClient({ + chain: arbitrum, + transport: fallback([ + http("https://arbitrum-rpc.publicnode.com"), + ...arbitrum.rpcUrls.default.http.map((v) => http(v)) + ]) + }), + base: createPublicClient({ + chain: base, + transport: fallback([ + http("https://base-rpc.publicnode.com"), + ...base.rpcUrls.default.http.map((v) => http(v)) + ]) + }), + optimism: createPublicClient({ + chain: optimism, + transport: fallback([ + http("https://optimism-rpc.publicnode.com"), + ...optimism.rpcUrls.default.http.map((v) => http(v)) + ]) + }), + bsc: createPublicClient({ + chain: bsc, + transport: fallback([ + http("https://bsc-rpc.publicnode.com"), + ...bsc.rpcUrls.default.http.map((v) => http(v)) + ]) + }), + polygon: createPublicClient({ + chain: base, + transport: fallback([ + http("https://polygon-bor-rpc.publicnode.com"), + ...polygon.rpcUrls.default.http.map((v) => http(v)) + ]) + }), + megaeth: createPublicClient({ + chain: megaeth, + transport: fallback([...megaeth.rpcUrls.default.http.map((v) => http(v))]) + }), + katana: createPublicClient({ + chain: katana, + transport: fallback([...katana.rpcUrls.default.http.map((v) => http(v))]) + }), + // Testnet + sepolia: createPublicClient({ + chain: sepolia, + transport: fallback([ + http("https://ethereum-sepolia-rpc.publicnode.com"), + ...sepolia.rpcUrls.default.http.map((v) => http(v)) + ]) + }), + arbitrumSepolia: createPublicClient({ + chain: arbitrumSepolia, + transport: fallback([ + http("https://arbitrum-sepolia-rpc.publicnode.com"), + ...arbitrumSepolia.rpcUrls.default.http.map((v) => http(v)) + ]) + }), + baseSepolia: createPublicClient({ + chain: baseSepolia, + transport: fallback([ + http("https://base-sepolia-rpc.publicnode.com"), + ...baseSepolia.rpcUrls.default.http.map((v) => http(v)) + ]) + }), + optimismSepolia: createPublicClient({ + chain: optimismSepolia, + transport: fallback([ + http("https://optimism-sepolia-rpc.publicnode.com"), + ...optimismSepolia.rpcUrls.default.http.map((v) => http(v)) + ]) + }), + arcTestnet: createPublicClient({ + chain: arcTestnet, + transport: fallback([...arcTestnet.rpcUrls.default.http.map((v) => http(v))]) + }) } as const; export const chainById = Object.fromEntries(chainEntries) as Record< - number, - (typeof chainMap)[keyof typeof chainMap] + number, + (typeof chainMap)[keyof typeof chainMap] >; export const chainNameById = Object.fromEntries(chainNameEntries) as Record; export const clientsById = Object.fromEntries( - chains.map((name) => [chainMap[name].id, clients[name]]) + chains.map((name) => [chainMap[name].id, clients[name]]) ) as Record; export type WC = ReturnType< - typeof createWalletClient, undefined, undefined, undefined> + typeof createWalletClient, undefined, undefined, undefined> >; diff --git a/src/lib/db.ts b/src/lib/db.ts index 4cbcba7..23116dc 100644 --- a/src/lib/db.ts +++ b/src/lib/db.ts @@ -9,35 +9,36 @@ export let db: ReturnType | undefined; let initDbPromise: Promise | undefined> | null = null; async function migrateDb(instance: ReturnType) { - // dialect and session will appear to not exist...but they do on the pglite drizzle instance - // @ts-ignore - await instance.dialect.migrate(migrations, instance.session, { - migrationsTable: "drizzle_migrations" - } satisfies Omit); + // dialect and session will appear to not exist...but they do on the pglite drizzle instance + // @ts-expect-error pglite drizzle exposes migrate internals not present in the public type + await instance.dialect.migrate(migrations, instance.session, { + migrationsTable: "drizzle_migrations" + } satisfies Omit); } export async function initDb() { - if (db) return db; - if (!browser) return undefined; - if (initDbPromise) return initDbPromise; + if (db) return db; + if (!browser) return undefined; + if (initDbPromise) return initDbPromise; - initDbPromise = (async () => { - // Open a PGLite database; this will persist to IndexedDB in the browser - const pglite = new PGlite("idb://orders"); + initDbPromise = (async () => { + // Open a PGLite database; this will persist to IndexedDB in the browser + const pglite = new PGlite("idb://orders"); - // Create a Drizzle instance over the opened SQLite-compatible database - db = drizzle(pglite); + // Create a Drizzle instance over the opened SQLite-compatible database + const instance = drizzle(pglite); - // Run migrations so tables are created on first load - await migrateDb(db); + // Run migrations so tables are created on first load + await migrateDb(instance); - return db; - })().catch((error) => { - initDbPromise = null; - throw error; - }); + db = instance; + return db; + })().catch((error) => { + initDbPromise = null; + throw error; + }); - return initDbPromise; + return initDbPromise; } export default initDb; diff --git a/src/lib/libraries/assetSelection.ts b/src/lib/libraries/assetSelection.ts index 810ea4b..0aad289 100644 --- a/src/lib/libraries/assetSelection.ts +++ b/src/lib/libraries/assetSelection.ts @@ -1,80 +1,80 @@ const bigIntSum = (...nums: bigint[]) => nums.reduce((a, b) => a + b, 0n); export class AssetSelection { - goal: bigint; - values: bigint[]; - weights?: bigint[]; - - sortedValues: bigint[]; - - static Sum(values: bigint[]) { - return bigIntSum(...values); - } - - static feasible(goal: bigint, values: bigint[]) { - if (bigIntSum(...values) < goal) - throw Error(`Values makes ${bigIntSum(...values)} cannot sum ${goal}`); - } - - static zip(arr: bigint[]): [bigint, number][] { - return arr.map((v, i) => [v, i]); - } - - static unzip(arr: [bigint, number][]): bigint[] { - arr.sort((a, b) => a[1] - b[1]); - return arr.map((v) => v[0]); - } - - static takeFromArray(goal: bigint, values: [bigint, T][]) { - let sum = 0n; - for (let i = 0; i < values.length; ++i) { - const value = values[i][0]; - const less = goal - sum; - const diff = less < value ? less : value; - sum += diff; - values[i][0] = diff; - } - } - - constructor(opts: { goal: bigint; values: bigint[]; weights?: bigint[] }) { - AssetSelection.feasible(opts.goal, opts.values); - this.goal = opts.goal; - this.values = opts.values; - this.weights = opts.weights; - - this.sortedValues = this.values; - } - - // --- Get sorted values as --- // - - asValues() { - return this.sortedValues; - } - - asIndices() { - const zipped = AssetSelection.zip(this.sortedValues); - return zipped.filter((v) => v[0] > 0); - } - - // --- Sorting Methods --- // - - largest() { - const values = AssetSelection.zip(this.values); - values.sort((a, b) => Number(b[0] - a[0])); - - AssetSelection.takeFromArray(this.goal, values); - - this.sortedValues = AssetSelection.unzip(values); - return this; - } - - smallest() { - const values = AssetSelection.zip(this.values); - values.sort((a, b) => Number(a[0] - b[0])); - - AssetSelection.takeFromArray(this.goal, values); - - this.sortedValues = AssetSelection.unzip(values); - return this; - } + goal: bigint; + values: bigint[]; + weights?: bigint[]; + + sortedValues: bigint[]; + + static Sum(values: bigint[]) { + return bigIntSum(...values); + } + + static feasible(goal: bigint, values: bigint[]) { + if (bigIntSum(...values) < goal) + throw Error(`Values makes ${bigIntSum(...values)} cannot sum ${goal}`); + } + + static zip(arr: bigint[]): [bigint, number][] { + return arr.map((v, i) => [v, i]); + } + + static unzip(arr: [bigint, number][]): bigint[] { + arr.sort((a, b) => a[1] - b[1]); + return arr.map((v) => v[0]); + } + + static takeFromArray(goal: bigint, values: [bigint, T][]) { + let sum = 0n; + for (let i = 0; i < values.length; ++i) { + const value = values[i][0]; + const less = goal - sum; + const diff = less < value ? less : value; + sum += diff; + values[i][0] = diff; + } + } + + constructor(opts: { goal: bigint; values: bigint[]; weights?: bigint[] }) { + AssetSelection.feasible(opts.goal, opts.values); + this.goal = opts.goal; + this.values = opts.values; + this.weights = opts.weights; + + this.sortedValues = this.values; + } + + // --- Get sorted values as --- // + + asValues() { + return this.sortedValues; + } + + asIndices() { + const zipped = AssetSelection.zip(this.sortedValues); + return zipped.filter((v) => v[0] > 0); + } + + // --- Sorting Methods --- // + + largest() { + const values = AssetSelection.zip(this.values); + values.sort((a, b) => Number(b[0] - a[0])); + + AssetSelection.takeFromArray(this.goal, values); + + this.sortedValues = AssetSelection.unzip(values); + return this; + } + + smallest() { + const values = AssetSelection.zip(this.values); + values.sort((a, b) => Number(a[0] - b[0])); + + AssetSelection.takeFromArray(this.goal, values); + + this.sortedValues = AssetSelection.unzip(values); + return this; + } } diff --git a/src/lib/libraries/compactLib.ts b/src/lib/libraries/compactLib.ts index c59d862..594f0d4 100644 --- a/src/lib/libraries/compactLib.ts +++ b/src/lib/libraries/compactLib.ts @@ -8,150 +8,150 @@ import { ERC20_ABI } from "$lib/abi/erc20"; import type { AppTokenContext } from "$lib/appTypes"; export class CompactLib { - static compactDeposit( - walletClient: WC, - opts: { - preHook?: (chainId: number) => Promise; - postHook?: () => Promise; - inputToken: AppTokenContext; - account: () => `0x${string}`; - allocatorId: string; - } - ) { - return async () => { - const { preHook, postHook, inputToken, account, allocatorId } = opts; - const { token, amount } = inputToken; - if (preHook) await preHook(token.chainId); - const lockTag: `0x${string}` = `0x${toHex( - toId(true, ResetPeriod.OneDay, allocatorId, ADDRESS_ZERO), - { - size: 32 - } - ) - .replace("0x", "") - .slice(0, 24)}`; - const recipient = ADDRESS_ZERO; // This means sender. + static compactDeposit( + walletClient: WC, + opts: { + preHook?: (chainId: number) => Promise; + postHook?: () => Promise; + inputToken: AppTokenContext; + account: () => `0x${string}`; + allocatorId: string; + } + ) { + return async () => { + const { preHook, postHook, inputToken, account, allocatorId } = opts; + const { token, amount } = inputToken; + if (preHook) await preHook(token.chainId); + const lockTag: `0x${string}` = `0x${toHex( + toId(true, ResetPeriod.OneDay, allocatorId, ADDRESS_ZERO), + { + size: 32 + } + ) + .replace("0x", "") + .slice(0, 24)}`; + const recipient = ADDRESS_ZERO; // This means sender. - let transactionHash: `0x${string}`; - if (token.address === ADDRESS_ZERO) { - transactionHash = await walletClient.writeContract({ - chain: getChain(token.chainId), - account: account(), - address: COMPACT, - abi: COMPACT_ABI, - functionName: "depositNative", - value: amount, - args: [lockTag, recipient] - }); - } else { - transactionHash = await walletClient.writeContract({ - chain: getChain(token.chainId), - account: account(), - address: COMPACT, - abi: COMPACT_ABI, - functionName: "depositERC20", - args: [token.address, lockTag, amount, recipient] - }); - } - await getClient(token.chainId).waitForTransactionReceipt({ - hash: await transactionHash - }); - if (postHook) await postHook(); - return transactionHash; - }; - } + let transactionHash: `0x${string}`; + if (token.address === ADDRESS_ZERO) { + transactionHash = await walletClient.writeContract({ + chain: getChain(token.chainId), + account: account(), + address: COMPACT, + abi: COMPACT_ABI, + functionName: "depositNative", + value: amount, + args: [lockTag, recipient] + }); + } else { + transactionHash = await walletClient.writeContract({ + chain: getChain(token.chainId), + account: account(), + address: COMPACT, + abi: COMPACT_ABI, + functionName: "depositERC20", + args: [token.address, lockTag, amount, recipient] + }); + } + await getClient(token.chainId).waitForTransactionReceipt({ + hash: await transactionHash + }); + if (postHook) await postHook(); + return transactionHash; + }; + } - static compactWithdraw( - walletClient: WC, - opts: { - preHook?: (chainId: number) => Promise; - postHook?: () => Promise; - inputToken: AppTokenContext; - account: () => `0x${string}`; - allocatorId: string; - } - ) { - return async () => { - const { preHook, postHook, inputToken, account, allocatorId } = opts; - const { token, amount } = inputToken; - const assetId = toId(true, ResetPeriod.OneDay, allocatorId, token.address); + static compactWithdraw( + walletClient: WC, + opts: { + preHook?: (chainId: number) => Promise; + postHook?: () => Promise; + inputToken: AppTokenContext; + account: () => `0x${string}`; + allocatorId: string; + } + ) { + return async () => { + const { preHook, postHook, inputToken, account, allocatorId } = opts; + const { token, amount } = inputToken; + const assetId = toId(true, ResetPeriod.OneDay, allocatorId, token.address); - const allocatedTransferStruct: { - allocatorData: `0x${string}`; - nonce: bigint; - expires: bigint; - id: bigint; - recipients: { - claimant: bigint; - amount: bigint; - }[]; - } = { - allocatorData: "0x", // TODO: Get from allocator - nonce: BigInt(Math.floor(Math.random() * 2 ** 32)), - expires: maxInt32, // TODO: - id: assetId, - recipients: [ - { - claimant: BigInt(addressToBytes32(account())), - amount: amount - } - ] - }; + const allocatedTransferStruct: { + allocatorData: `0x${string}`; + nonce: bigint; + expires: bigint; + id: bigint; + recipients: { + claimant: bigint; + amount: bigint; + }[]; + } = { + allocatorData: "0x", // TODO: Get from allocator + nonce: BigInt(Math.floor(Math.random() * 2 ** 32)), + expires: maxInt32, // TODO: + id: assetId, + recipients: [ + { + claimant: BigInt(addressToBytes32(account())), + amount: amount + } + ] + }; - if (preHook) await preHook(token.chainId); - const transactionHash = walletClient.writeContract({ - chain: getChain(token.chainId), - account: account(), - address: COMPACT, - abi: COMPACT_ABI, - functionName: "allocatedTransfer", - args: [allocatedTransferStruct] - }); - await getClient(token.chainId).waitForTransactionReceipt({ - hash: await transactionHash - }); - if (postHook) await postHook(); - return transactionHash; - }; - } + if (preHook) await preHook(token.chainId); + const transactionHash = walletClient.writeContract({ + chain: getChain(token.chainId), + account: account(), + address: COMPACT, + abi: COMPACT_ABI, + functionName: "allocatedTransfer", + args: [allocatedTransferStruct] + }); + await getClient(token.chainId).waitForTransactionReceipt({ + hash: await transactionHash + }); + if (postHook) await postHook(); + return transactionHash; + }; + } - static compactApprove( - walletClient: WC, - opts: { - preHook?: (chainId: number) => Promise; - postHook?: () => Promise; - inputTokens: AppTokenContext[]; - account: () => `0x${string}`; - } - ) { - return async () => { - const { preHook, postHook, inputTokens, account } = opts; - for (let i = 0; i < inputTokens.length; ++i) { - const { token: inputToken, amount } = inputTokens[i]; - if (preHook) await preHook(inputToken.chainId); - const publicClient = getClient(inputToken.chainId); - // Check if we have sufficient allowance already. - const currentAllowance = await publicClient.readContract({ - address: inputToken.address, - abi: ERC20_ABI, - functionName: "allowance", - args: [account(), COMPACT] - }); - if (currentAllowance >= amount) continue; - const transactionHash = walletClient.writeContract({ - chain: getChain(inputToken.chainId), - account: account(), - address: inputToken.address, - abi: ERC20_ABI, - functionName: "approve", - args: [COMPACT, maxUint256] - }); + static compactApprove( + walletClient: WC, + opts: { + preHook?: (chainId: number) => Promise; + postHook?: () => Promise; + inputTokens: AppTokenContext[]; + account: () => `0x${string}`; + } + ) { + return async () => { + const { preHook, postHook, inputTokens, account } = opts; + for (let i = 0; i < inputTokens.length; ++i) { + const { token: inputToken, amount } = inputTokens[i]; + if (preHook) await preHook(inputToken.chainId); + const publicClient = getClient(inputToken.chainId); + // Check if we have sufficient allowance already. + const currentAllowance = await publicClient.readContract({ + address: inputToken.address, + abi: ERC20_ABI, + functionName: "allowance", + args: [account(), COMPACT] + }); + if (currentAllowance >= amount) continue; + const transactionHash = walletClient.writeContract({ + chain: getChain(inputToken.chainId), + account: account(), + address: inputToken.address, + abi: ERC20_ABI, + functionName: "approve", + args: [COMPACT, maxUint256] + }); - await publicClient.waitForTransactionReceipt({ - hash: await transactionHash - }); - } - if (postHook) await postHook(); - }; - } + await publicClient.waitForTransactionReceipt({ + hash: await transactionHash + }); + } + if (postHook) await postHook(); + }; + } } diff --git a/src/lib/libraries/coreDeps.ts b/src/lib/libraries/coreDeps.ts index e2e75bb..947449d 100644 --- a/src/lib/libraries/coreDeps.ts +++ b/src/lib/libraries/coreDeps.ts @@ -1,54 +1,54 @@ import { - COIN_FILLER, - INPUT_SETTLER_COMPACT_LIFI, - MULTICHAIN_INPUT_SETTLER_COMPACT, - POLYMER_ORACLE, - WORMHOLE_ORACLE + COIN_FILLER, + INPUT_SETTLER_COMPACT_LIFI, + MULTICHAIN_INPUT_SETTLER_COMPACT, + POLYMER_ORACLE, + WORMHOLE_ORACLE } from "$lib/config"; import type { IntentDeps, OrderContainerValidationDeps } from "@lifi/intent"; function isNonZeroAddress(value: string | undefined): value is `0x${string}` { - return !!value && value.toLowerCase() !== "0x0000000000000000000000000000000000000000"; + return !!value && value.toLowerCase() !== "0x0000000000000000000000000000000000000000"; } export const intentDeps: IntentDeps = { - getOracle(verifier, chainId) { - const key = Number(chainId); - if (!Number.isFinite(key)) return undefined; - if (verifier === "polymer") return POLYMER_ORACLE[key]; - if (verifier === "wormhole") { - return WORMHOLE_ORACLE[key]; - } - return undefined; - } + getOracle(verifier, chainId) { + const key = Number(chainId); + if (!Number.isFinite(key)) return undefined; + if (verifier === "polymer") return POLYMER_ORACLE[key]; + if (verifier === "wormhole") { + return WORMHOLE_ORACLE[key]; + } + return undefined; + } }; export const orderValidationDeps: OrderContainerValidationDeps = { - inputSettlers: [INPUT_SETTLER_COMPACT_LIFI, MULTICHAIN_INPUT_SETTLER_COMPACT], - allowedInputOracles({ chainId, sameChainFill }) { - const key = Number(chainId); - if (!Number.isFinite(key)) return undefined; - const polymer = POLYMER_ORACLE[key]; - const wormhole = WORMHOLE_ORACLE[key]; - const allowed: `0x${string}`[] = []; - if (polymer) allowed.push(polymer); - if (isNonZeroAddress(wormhole)) allowed.push(wormhole); - if (allowed.length === 0) return undefined; - if (sameChainFill) allowed.push(COIN_FILLER); - return allowed; - }, - allowedOutputOracles(chainId) { - const key = Number(chainId); - if (!Number.isFinite(key)) return undefined; - const polymer = POLYMER_ORACLE[key]; - const wormhole = WORMHOLE_ORACLE[key]; - const allowed: `0x${string}`[] = []; - if (polymer) allowed.push(polymer); - if (isNonZeroAddress(wormhole)) allowed.push(wormhole); - if (allowed.length === 0) return undefined; - return allowed; - }, - allowedOutputSettlers() { - return [COIN_FILLER]; - } + inputSettlers: [INPUT_SETTLER_COMPACT_LIFI, MULTICHAIN_INPUT_SETTLER_COMPACT], + allowedInputOracles({ chainId, sameChainFill }) { + const key = Number(chainId); + if (!Number.isFinite(key)) return undefined; + const polymer = POLYMER_ORACLE[key]; + const wormhole = WORMHOLE_ORACLE[key]; + const allowed: `0x${string}`[] = []; + if (polymer) allowed.push(polymer); + if (isNonZeroAddress(wormhole)) allowed.push(wormhole); + if (allowed.length === 0) return undefined; + if (sameChainFill) allowed.push(COIN_FILLER); + return allowed; + }, + allowedOutputOracles(chainId) { + const key = Number(chainId); + if (!Number.isFinite(key)) return undefined; + const polymer = POLYMER_ORACLE[key]; + const wormhole = WORMHOLE_ORACLE[key]; + const allowed: `0x${string}`[] = []; + if (polymer) allowed.push(polymer); + if (isNonZeroAddress(wormhole)) allowed.push(wormhole); + if (allowed.length === 0) return undefined; + return allowed; + }, + allowedOutputSettlers() { + return [COIN_FILLER]; + } }; diff --git a/src/lib/libraries/flowProgress.ts b/src/lib/libraries/flowProgress.ts index 510e33f..c4e59a3 100644 --- a/src/lib/libraries/flowProgress.ts +++ b/src/lib/libraries/flowProgress.ts @@ -1,11 +1,11 @@ import { - BYTES32_ZERO, - COMPACT, - INPUT_SETTLER_COMPACT_LIFI, - INPUT_SETTLER_ESCROW_LIFI, - MULTICHAIN_INPUT_SETTLER_COMPACT, - MULTICHAIN_INPUT_SETTLER_ESCROW, - getClient + BYTES32_ZERO, + COMPACT, + INPUT_SETTLER_COMPACT_LIFI, + INPUT_SETTLER_ESCROW_LIFI, + MULTICHAIN_INPUT_SETTLER_COMPACT, + MULTICHAIN_INPUT_SETTLER_ESCROW, + getClient } from "$lib/config"; import { COIN_FILLER_ABI } from "$lib/abi/outputsettler"; import { POLYMER_ORACLE_ABI } from "$lib/abi/polymeroracle"; @@ -25,209 +25,209 @@ const OrderStatus_Claimed = 2; const OrderStatus_Refunded = 3; export type FlowCheckState = { - allFilled: boolean; - allValidated: boolean; - allFinalised: boolean; + allFilled: boolean; + allValidated: boolean; + allFinalised: boolean; }; export function getOutputStorageKey(output: MandateOutput) { - return hashStruct({ - data: output, - types: compactTypes, - primaryType: "MandateOutput" - }); + return hashStruct({ + data: output, + types: compactTypes, + primaryType: "MandateOutput" + }); } function isValidHash(hash: string | undefined): hash is `0x${string}` { - return !!hash && hash.startsWith("0x") && hash.length === 66; + return !!hash && hash.startsWith("0x") && hash.length === 66; } async function isOutputFilled(orderId: `0x${string}`, output: MandateOutput) { - const outputKey = getOutputStorageKey(output); - return getOrFetchRpc( - `progress:filled:${orderId}:${outputKey}`, - async () => { - const outputClient = getClient(output.chainId); - const outputHash = getOutputHash(output); - const result = await outputClient.readContract({ - address: bytes32ToAddress(output.settler), - abi: COIN_FILLER_ABI, - functionName: "getFillRecord", - args: [orderId, outputHash] - }); - return result !== BYTES32_ZERO; - }, - { ttlMs: PROGRESS_TTL_MS } - ); + const outputKey = getOutputStorageKey(output); + return getOrFetchRpc( + `progress:filled:${orderId}:${outputKey}`, + async () => { + const outputClient = getClient(output.chainId); + const outputHash = getOutputHash(output); + const result = await outputClient.readContract({ + address: bytes32ToAddress(output.settler), + abi: COIN_FILLER_ABI, + functionName: "getFillRecord", + args: [orderId, outputHash] + }); + return result !== BYTES32_ZERO; + }, + { ttlMs: PROGRESS_TTL_MS } + ); } async function isOutputValidatedOnChain( - orderId: `0x${string}`, - inputChain: bigint, - orderContainer: OrderContainer, - output: MandateOutput, - fillTransactionHash: `0x${string}` + orderId: `0x${string}`, + inputChain: bigint, + orderContainer: OrderContainer, + output: MandateOutput, + fillTransactionHash: `0x${string}` ) { - const outputKey = getOutputStorageKey(output); - const cachedReceipt = store.getTransactionReceipt(output.chainId, fillTransactionHash); - const receipt = ( - cachedReceipt - ? cachedReceipt - : await getOrFetchRpc( - `progress:receipt:${output.chainId.toString()}:${fillTransactionHash}`, - async () => { - const outputClient = getClient(output.chainId); - return outputClient.getTransactionReceipt({ - hash: fillTransactionHash - }); - }, - { ttlMs: PROGRESS_TTL_MS } - ) - ) as { - blockHash: `0x${string}`; - from: `0x${string}`; - }; - if (!cachedReceipt) { - store - .saveTransactionReceipt(output.chainId, fillTransactionHash, receipt) - .catch((error) => console.warn("saveTransactionReceipt error", error)); - } - - const block = await getOrFetchRpc( - `progress:block:${output.chainId.toString()}:${receipt.blockHash}`, - async () => { - const outputClient = getClient(output.chainId); - return outputClient.getBlock({ blockHash: receipt.blockHash }); - }, - { ttlMs: PROGRESS_TTL_MS } - ); - - const encodedOutput = encodeMandateOutput({ - solver: addressToBytes32(receipt.from), - orderId, - timestamp: Number(block.timestamp), - output - }); - const outputHash = keccak256(encodedOutput); - - return getOrFetchRpc( - `progress:proven:${orderId}:${inputChain.toString()}:${outputKey}:${fillTransactionHash}`, - async () => { - const sourceChainClient = getClient(inputChain); - return sourceChainClient.readContract({ - address: orderContainer.order.inputOracle, - abi: POLYMER_ORACLE_ABI, - functionName: "isProven", - args: [output.chainId, output.oracle, output.settler, outputHash] - }); - }, - { ttlMs: PROGRESS_TTL_MS } - ); + const outputKey = getOutputStorageKey(output); + const cachedReceipt = store.getTransactionReceipt(output.chainId, fillTransactionHash); + const receipt = ( + cachedReceipt + ? cachedReceipt + : await getOrFetchRpc( + `progress:receipt:${output.chainId.toString()}:${fillTransactionHash}`, + async () => { + const outputClient = getClient(output.chainId); + return outputClient.getTransactionReceipt({ + hash: fillTransactionHash + }); + }, + { ttlMs: PROGRESS_TTL_MS } + ) + ) as { + blockHash: `0x${string}`; + from: `0x${string}`; + }; + if (!cachedReceipt) { + store + .saveTransactionReceipt(output.chainId, fillTransactionHash, receipt) + .catch((error) => console.warn("saveTransactionReceipt error", error)); + } + + const block = await getOrFetchRpc( + `progress:block:${output.chainId.toString()}:${receipt.blockHash}`, + async () => { + const outputClient = getClient(output.chainId); + return outputClient.getBlock({ blockHash: receipt.blockHash }); + }, + { ttlMs: PROGRESS_TTL_MS } + ); + + const encodedOutput = encodeMandateOutput({ + solver: addressToBytes32(receipt.from), + orderId, + timestamp: Number(block.timestamp), + output + }); + const outputHash = keccak256(encodedOutput); + + return getOrFetchRpc( + `progress:proven:${orderId}:${inputChain.toString()}:${outputKey}:${fillTransactionHash}`, + async () => { + const sourceChainClient = getClient(inputChain); + return sourceChainClient.readContract({ + address: orderContainer.order.inputOracle, + abi: POLYMER_ORACLE_ABI, + functionName: "isProven", + args: [output.chainId, output.oracle, output.settler, outputHash] + }); + }, + { ttlMs: PROGRESS_TTL_MS } + ); } async function isInputChainFinalised(chainId: bigint, container: OrderContainer) { - const { order, inputSettler } = container; - const inputChainClient = getClient(chainId); - const intent = orderToIntent(container); - const orderId = intent.orderId(); - - if ( - inputSettler === INPUT_SETTLER_ESCROW_LIFI || - inputSettler === MULTICHAIN_INPUT_SETTLER_ESCROW - ) { - return getOrFetchRpc( - `progress:finalised:escrow:${orderId}:${chainId.toString()}`, - async () => { - const orderStatus = await inputChainClient.readContract({ - address: inputSettler, - abi: SETTLER_ESCROW_ABI, - functionName: "orderStatus", - args: [orderId] - }); - return orderStatus === OrderStatus_Claimed || orderStatus === OrderStatus_Refunded; - }, - { ttlMs: PROGRESS_TTL_MS } - ); - } - - if ( - inputSettler === INPUT_SETTLER_COMPACT_LIFI || - inputSettler === MULTICHAIN_INPUT_SETTLER_COMPACT - ) { - const flattenedInputs = "originChainId" in order ? order.inputs : order.inputs[0]?.inputs; - if (!flattenedInputs || flattenedInputs.length === 0) return false; - - return getOrFetchRpc( - `progress:finalised:compact:${orderId}:${chainId.toString()}`, - async () => { - const [, allocator] = await inputChainClient.readContract({ - address: COMPACT, - abi: COMPACT_ABI, - functionName: "getLockDetails", - args: [flattenedInputs[0][0]] - }); - return inputChainClient.readContract({ - address: COMPACT, - abi: COMPACT_ABI, - functionName: "hasConsumedAllocatorNonce", - args: [order.nonce, allocator] - }); - }, - { ttlMs: PROGRESS_TTL_MS } - ); - } - - return false; + const { order, inputSettler } = container; + const inputChainClient = getClient(chainId); + const intent = orderToIntent(container); + const orderId = intent.orderId(); + + if ( + inputSettler === INPUT_SETTLER_ESCROW_LIFI || + inputSettler === MULTICHAIN_INPUT_SETTLER_ESCROW + ) { + return getOrFetchRpc( + `progress:finalised:escrow:${orderId}:${chainId.toString()}`, + async () => { + const orderStatus = await inputChainClient.readContract({ + address: inputSettler, + abi: SETTLER_ESCROW_ABI, + functionName: "orderStatus", + args: [orderId] + }); + return orderStatus === OrderStatus_Claimed || orderStatus === OrderStatus_Refunded; + }, + { ttlMs: PROGRESS_TTL_MS } + ); + } + + if ( + inputSettler === INPUT_SETTLER_COMPACT_LIFI || + inputSettler === MULTICHAIN_INPUT_SETTLER_COMPACT + ) { + const flattenedInputs = "originChainId" in order ? order.inputs : order.inputs[0]?.inputs; + if (!flattenedInputs || flattenedInputs.length === 0) return false; + + return getOrFetchRpc( + `progress:finalised:compact:${orderId}:${chainId.toString()}`, + async () => { + const [, allocator] = await inputChainClient.readContract({ + address: COMPACT, + abi: COMPACT_ABI, + functionName: "getLockDetails", + args: [flattenedInputs[0][0]] + }); + return inputChainClient.readContract({ + address: COMPACT, + abi: COMPACT_ABI, + functionName: "hasConsumedAllocatorNonce", + args: [order.nonce, allocator] + }); + }, + { ttlMs: PROGRESS_TTL_MS } + ); + } + + return false; } export async function getOrderProgressChecks( - orderContainer: OrderContainer, - fillTransactions: Record + orderContainer: OrderContainer, + fillTransactions: Record ): Promise { - try { - const intent = orderToIntent(orderContainer); - const orderId = intent.orderId(); - const inputChains = intent.inputChains(); - const outputs = orderContainer.order.outputs; - - const filledStates = await Promise.all( - outputs.map((output) => isOutputFilled(orderId, output)) - ); - const allFilled = outputs.length > 0 && filledStates.every(Boolean); - - let allValidated = false; - if (allFilled && inputChains.length > 0) { - const validatedPairs = await Promise.all( - inputChains.flatMap((inputChain) => - outputs.map(async (output) => { - const fillHash = fillTransactions[getOutputStorageKey(output)]; - if (!isValidHash(fillHash)) return false; - return isOutputValidatedOnChain(orderId, inputChain, orderContainer, output, fillHash); - }) - ) - ); - allValidated = validatedPairs.length > 0 && validatedPairs.every(Boolean); - } - - let allFinalised = false; - if (allValidated && inputChains.length > 0) { - const finalisedStates = await Promise.all( - inputChains.map((chainId) => isInputChainFinalised(chainId, orderContainer)) - ); - allFinalised = finalisedStates.every(Boolean); - } - - return { - allFilled, - allValidated, - allFinalised - }; - } catch (error) { - console.warn("progress checks failed", error); - return { - allFilled: false, - allValidated: false, - allFinalised: false - }; - } + try { + const intent = orderToIntent(orderContainer); + const orderId = intent.orderId(); + const inputChains = intent.inputChains(); + const outputs = orderContainer.order.outputs; + + const filledStates = await Promise.all( + outputs.map((output) => isOutputFilled(orderId, output)) + ); + const allFilled = outputs.length > 0 && filledStates.every(Boolean); + + let allValidated = false; + if (allFilled && inputChains.length > 0) { + const validatedPairs = await Promise.all( + inputChains.flatMap((inputChain) => + outputs.map(async (output) => { + const fillHash = fillTransactions[getOutputStorageKey(output)]; + if (!isValidHash(fillHash)) return false; + return isOutputValidatedOnChain(orderId, inputChain, orderContainer, output, fillHash); + }) + ) + ); + allValidated = validatedPairs.length > 0 && validatedPairs.every(Boolean); + } + + let allFinalised = false; + if (allValidated && inputChains.length > 0) { + const finalisedStates = await Promise.all( + inputChains.map((chainId) => isInputChainFinalised(chainId, orderContainer)) + ); + allFinalised = finalisedStates.every(Boolean); + } + + return { + allFilled, + allValidated, + allFinalised + }; + } catch (error) { + console.warn("progress checks failed", error); + return { + allFilled: false, + allValidated: false, + allFinalised: false + }; + } } diff --git a/src/lib/libraries/intentExecution.ts b/src/lib/libraries/intentExecution.ts index 1c95197..c09e07f 100644 --- a/src/lib/libraries/intentExecution.ts +++ b/src/lib/libraries/intentExecution.ts @@ -5,13 +5,13 @@ import { MULTICHAIN_SETTLER_ESCROW_ABI } from "$lib/abi/multichain_escrow"; import { SETTLER_ESCROW_ABI } from "$lib/abi/escrow"; import { SETTLER_COMPACT_ABI } from "$lib/abi/settlercompact"; import { - COMPACT, - INPUT_SETTLER_COMPACT_LIFI, - INPUT_SETTLER_ESCROW_LIFI, - MULTICHAIN_INPUT_SETTLER_COMPACT, - MULTICHAIN_INPUT_SETTLER_ESCROW, - getChain, - type WC + COMPACT, + INPUT_SETTLER_COMPACT_LIFI, + INPUT_SETTLER_ESCROW_LIFI, + MULTICHAIN_INPUT_SETTLER_COMPACT, + MULTICHAIN_INPUT_SETTLER_ESCROW, + getChain, + type WC } from "$lib/config"; import { compact_type_hash } from "@lifi/intent"; import { addressToBytes32 } from "@lifi/intent"; @@ -22,172 +22,172 @@ import type { TypedDataSigner } from "@lifi/intent"; import { switchWalletChain } from "$lib/utils/walletClientRuntime"; function combineSignatures(signatures: { - sponsorSignature: Signature | NoSignature; - allocatorSignature: Signature | NoSignature; + sponsorSignature: Signature | NoSignature; + allocatorSignature: Signature | NoSignature; }) { - const { sponsorSignature, allocatorSignature } = signatures; - return encodeAbiParameters(parseAbiParameters(["bytes", "bytes"]), [ - sponsorSignature.payload ?? "0x", - allocatorSignature.payload - ]); + const { sponsorSignature, allocatorSignature } = signatures; + return encodeAbiParameters(parseAbiParameters(["bytes", "bytes"]), [ + sponsorSignature.payload ?? "0x", + allocatorSignature.payload + ]); } export function signIntentCompact( - intent: StandardOrderIntent | MultichainOrderIntent, - account: `0x${string}`, - walletClient: WC + intent: StandardOrderIntent | MultichainOrderIntent, + account: `0x${string}`, + walletClient: WC ): Promise<`0x${string}`> { - const signer = walletClient as unknown as TypedDataSigner; - if (intent instanceof StandardOrderIntent) { - const order = intent.asOrder(); - return signStandardCompact(account, signer, order.originChainId, intent.asBatchCompact()); - } - const order = intent.asOrder(); - return signMultichainCompact( - account, - signer, - order.inputs[0].chainId, - intent.asMultichainBatchCompact() - ); + const signer = walletClient as unknown as TypedDataSigner; + if (intent instanceof StandardOrderIntent) { + const order = intent.asOrder(); + return signStandardCompact(account, signer, order.originChainId, intent.asBatchCompact()); + } + const order = intent.asOrder(); + return signMultichainCompact( + account, + signer, + order.inputs[0].chainId, + intent.asMultichainBatchCompact() + ); } export async function depositAndRegisterCompact( - intent: StandardOrderIntent, - account: `0x${string}`, - walletClient: WC + intent: StandardOrderIntent, + account: `0x${string}`, + walletClient: WC ): Promise<`0x${string}`> { - const order = intent.asOrder(); - const chain = getChain(order.originChainId); - return walletClient.writeContract({ - chain, - account, - address: COMPACT, - abi: COMPACT_ABI, - functionName: "batchDepositAndRegisterMultiple", - args: [order.inputs, [[intent.compactClaimHash(), compact_type_hash]]] - }); + const order = intent.asOrder(); + const chain = getChain(order.originChainId); + return walletClient.writeContract({ + chain, + account, + address: COMPACT, + abi: COMPACT_ABI, + functionName: "batchDepositAndRegisterMultiple", + args: [order.inputs, [[intent.compactClaimHash(), compact_type_hash]]] + }); } export async function openEscrowIntent( - intent: StandardOrderIntent | MultichainOrderIntent, - account: `0x${string}`, - walletClient: WC + intent: StandardOrderIntent | MultichainOrderIntent, + account: `0x${string}`, + walletClient: WC ): Promise<`0x${string}`[]> { - if (intent instanceof StandardOrderIntent) { - const order = intent.asOrder(); - await switchWalletChain(walletClient, Number(order.originChainId)); - const chain = getChain(order.originChainId); - return [ - await walletClient.writeContract({ - chain, - account, - address: INPUT_SETTLER_ESCROW_LIFI, - abi: SETTLER_ESCROW_ABI, - functionName: "open", - args: [order] - }) - ]; - } + if (intent instanceof StandardOrderIntent) { + const order = intent.asOrder(); + await switchWalletChain(walletClient, Number(order.originChainId)); + const chain = getChain(order.originChainId); + return [ + await walletClient.writeContract({ + chain, + account, + address: INPUT_SETTLER_ESCROW_LIFI, + abi: SETTLER_ESCROW_ABI, + functionName: "open", + args: [order] + }) + ]; + } - const components = intent.asComponents(); - const results: `0x${string}`[] = []; - for (const { chainId, orderComponent } of components) { - const chain = getChain(chainId); - await switchWalletChain(walletClient, chain.id); - results.push( - await walletClient.writeContract({ - chain, - account, - address: intent.inputSettler, - abi: MULTICHAIN_SETTLER_ESCROW_ABI, - functionName: "open", - args: [orderComponent] - }) - ); - } - return results; + const components = intent.asComponents(); + const results: `0x${string}`[] = []; + for (const { chainId, orderComponent } of components) { + const chain = getChain(chainId); + await switchWalletChain(walletClient, chain.id); + results.push( + await walletClient.writeContract({ + chain, + account, + address: intent.inputSettler, + abi: MULTICHAIN_SETTLER_ESCROW_ABI, + functionName: "open", + args: [orderComponent] + }) + ); + } + return results; } export async function finaliseIntent(options: { - intent: StandardOrderIntent | MultichainOrderIntent; - sourceChainId: number | bigint; - account: `0x${string}`; - walletClient: WC; - solveParams: { timestamp: number; solver: `0x${string}` }[]; - signatures: { - sponsorSignature: Signature | NoSignature; - allocatorSignature: Signature | NoSignature; - }; + intent: StandardOrderIntent | MultichainOrderIntent; + sourceChainId: number | bigint; + account: `0x${string}`; + walletClient: WC; + solveParams: { timestamp: number; solver: `0x${string}` }[]; + signatures: { + sponsorSignature: Signature | NoSignature; + allocatorSignature: Signature | NoSignature; + }; }) { - const { intent, sourceChainId, account, walletClient, solveParams, signatures } = options; - const actionChain = getChain(sourceChainId); + const { intent, sourceChainId, account, walletClient, solveParams, signatures } = options; + const actionChain = getChain(sourceChainId); - if (intent instanceof StandardOrderIntent) { - const order = intent.asOrder(); - if (actionChain.id !== Number(order.originChainId)) { - throw new Error( - `Origin chain id and action ID does not match: ${order.originChainId}, ${actionChain.id}` - ); - } - if (intent.inputSettler.toLowerCase() === INPUT_SETTLER_ESCROW_LIFI.toLowerCase()) { - return walletClient.writeContract({ - chain: actionChain, - account, - address: intent.inputSettler, - abi: SETTLER_ESCROW_ABI, - functionName: "finalise", - args: [order, solveParams, addressToBytes32(account), "0x"] - }); - } - if (intent.inputSettler.toLowerCase() === INPUT_SETTLER_COMPACT_LIFI.toLowerCase()) { - const combinedSignatures = combineSignatures(signatures); - return walletClient.writeContract({ - chain: actionChain, - account, - address: intent.inputSettler, - abi: SETTLER_COMPACT_ABI, - functionName: "finalise", - args: [order, combinedSignatures, solveParams, addressToBytes32(account), "0x"] - }); - } - throw new Error(`Could not detect settler type ${intent.inputSettler}`); - } + if (intent instanceof StandardOrderIntent) { + const order = intent.asOrder(); + if (actionChain.id !== Number(order.originChainId)) { + throw new Error( + `Origin chain id and action ID does not match: ${order.originChainId}, ${actionChain.id}` + ); + } + if (intent.inputSettler.toLowerCase() === INPUT_SETTLER_ESCROW_LIFI.toLowerCase()) { + return walletClient.writeContract({ + chain: actionChain, + account, + address: intent.inputSettler, + abi: SETTLER_ESCROW_ABI, + functionName: "finalise", + args: [order, solveParams, addressToBytes32(account), "0x"] + }); + } + if (intent.inputSettler.toLowerCase() === INPUT_SETTLER_COMPACT_LIFI.toLowerCase()) { + const combinedSignatures = combineSignatures(signatures); + return walletClient.writeContract({ + chain: actionChain, + account, + address: intent.inputSettler, + abi: SETTLER_COMPACT_ABI, + functionName: "finalise", + args: [order, combinedSignatures, solveParams, addressToBytes32(account), "0x"] + }); + } + throw new Error(`Could not detect settler type ${intent.inputSettler}`); + } - const inputChainIds = intent.inputChains().map((v) => Number(v)); - if (!inputChainIds.includes(actionChain.id)) { - throw new Error( - `Action chain must be one of input chains for finalise: ${inputChainIds}, action=${actionChain.id}` - ); - } - const components = intent.asComponents().filter((c) => Number(c.chainId) === actionChain.id); - if (components.length === 0) { - throw new Error(`No multichain order component found for action chain ${actionChain.id}.`); - } + const inputChainIds = intent.inputChains().map((v) => Number(v)); + if (!inputChainIds.includes(actionChain.id)) { + throw new Error( + `Action chain must be one of input chains for finalise: ${inputChainIds}, action=${actionChain.id}` + ); + } + const components = intent.asComponents().filter((c) => Number(c.chainId) === actionChain.id); + if (components.length === 0) { + throw new Error(`No multichain order component found for action chain ${actionChain.id}.`); + } - for (const { orderComponent } of components) { - if (intent.inputSettler.toLowerCase() === MULTICHAIN_INPUT_SETTLER_ESCROW.toLowerCase()) { - return walletClient.writeContract({ - chain: actionChain, - account, - address: intent.inputSettler, - abi: MULTICHAIN_SETTLER_ESCROW_ABI, - functionName: "finalise", - args: [orderComponent, solveParams, addressToBytes32(account), "0x"] - }); - } - if (intent.inputSettler.toLowerCase() === MULTICHAIN_INPUT_SETTLER_COMPACT.toLowerCase()) { - const combinedSignatures = combineSignatures(signatures); - return walletClient.writeContract({ - chain: actionChain, - account, - address: intent.inputSettler, - abi: MULTICHAIN_SETTLER_COMPACT_ABI, - functionName: "finalise", - args: [orderComponent, combinedSignatures, solveParams, addressToBytes32(account), "0x"] - }); - } - throw new Error(`Could not detect settler type ${intent.inputSettler}`); - } + for (const { orderComponent } of components) { + if (intent.inputSettler.toLowerCase() === MULTICHAIN_INPUT_SETTLER_ESCROW.toLowerCase()) { + return walletClient.writeContract({ + chain: actionChain, + account, + address: intent.inputSettler, + abi: MULTICHAIN_SETTLER_ESCROW_ABI, + functionName: "finalise", + args: [orderComponent, solveParams, addressToBytes32(account), "0x"] + }); + } + if (intent.inputSettler.toLowerCase() === MULTICHAIN_INPUT_SETTLER_COMPACT.toLowerCase()) { + const combinedSignatures = combineSignatures(signatures); + return walletClient.writeContract({ + chain: actionChain, + account, + address: intent.inputSettler, + abi: MULTICHAIN_SETTLER_COMPACT_ABI, + functionName: "finalise", + args: [orderComponent, combinedSignatures, solveParams, addressToBytes32(account), "0x"] + }); + } + throw new Error(`Could not detect settler type ${intent.inputSettler}`); + } - throw new Error(`Failed to finalise multichain order on chain ${actionChain.id}.`); + throw new Error(`Failed to finalise multichain order on chain ${actionChain.id}.`); } diff --git a/src/lib/libraries/intentFactory.ts b/src/lib/libraries/intentFactory.ts index 5b1b7a1..2e7f194 100644 --- a/src/lib/libraries/intentFactory.ts +++ b/src/lib/libraries/intentFactory.ts @@ -1,20 +1,20 @@ import { - getChain, - getClient, - INPUT_SETTLER_COMPACT_LIFI, - INPUT_SETTLER_ESCROW_LIFI, - MULTICHAIN_INPUT_SETTLER_ESCROW, - type WC + getChain, + getClient, + INPUT_SETTLER_COMPACT_LIFI, + INPUT_SETTLER_ESCROW_LIFI, + MULTICHAIN_INPUT_SETTLER_ESCROW, + type WC } from "$lib/config"; -import { maxUint256 } from "viem"; +import { encodePacked, maxUint256 } from "viem"; import type { - CreateIntentOptions, - TokenContext, - MultichainOrder, - NoSignature, - OrderContainer, - Signature, - StandardOrder + CreateIntentOptions, + TokenContext, + MultichainOrder, + NoSignature, + OrderContainer, + Signature, + StandardOrder } from "@lifi/intent"; import type { AppCreateIntentOptions, AppTokenContext } from "$lib/appTypes"; import { ERC20_ABI } from "$lib/abi/erc20"; @@ -24,245 +24,288 @@ import { store } from "$lib/state.svelte"; import { depositAndRegisterCompact, openEscrowIntent, signIntentCompact } from "./intentExecution"; import { intentDeps } from "./coreDeps"; +const SAME_CHAIN_DURATION_SECONDS = 10 * 60; // 10 minutes +const SAME_CHAIN_EXCLUSIVITY_SECONDS = 12 * 3; // 36 seconds + +function applySameChainTimings(intent: Intent): void { + if (!intent.isSameChain()) return; + (intent as any).expiry = SAME_CHAIN_DURATION_SECONDS; + (intent as any).fillDeadline = SAME_CHAIN_DURATION_SECONDS; +} + +function applyExclusivityOverride( + orderIntent: ReturnType, + exclusiveFor: string | undefined, + isSameChain: boolean +): void { + if (!isSameChain || !exclusiveFor) return; + const order = orderIntent.asOrder() as StandardOrder; + const currentTime = Math.floor(Date.now() / 1000); + const paddedExclusiveFor = + `0x${exclusiveFor.replace("0x", "").padStart(64, "0")}` as `0x${string}`; + const newContext = encodePacked( + ["bytes1", "bytes32", "uint32"], + ["0xe0", paddedExclusiveFor, currentTime + SAME_CHAIN_EXCLUSIVITY_SECONDS] + ); + for (const output of order.outputs) { + if (output.context !== "0x") { + (output as any).context = newContext; + } + } +} + function toCoreTokenContext(input: AppTokenContext): TokenContext { - return { - token: { - address: input.token.address, - name: input.token.name, - chainId: BigInt(input.token.chainId), - decimals: input.token.decimals - }, - amount: input.amount - }; + return { + token: { + address: input.token.address, + name: input.token.name, + chainId: BigInt(input.token.chainId), + decimals: input.token.decimals + }, + amount: input.amount + }; } function toCoreCreateIntentOptions(opts: AppCreateIntentOptions): CreateIntentOptions { - const account = opts.account(); - if (opts.lock.type === "compact") { - return { - exclusiveFor: opts.exclusiveFor, - inputTokens: opts.inputTokens.map(toCoreTokenContext), - outputTokens: opts.outputTokens.map(toCoreTokenContext), - verifier: opts.verifier, - account, - lock: { - type: "compact", - resetPeriod: opts.lock.resetPeriod, - allocatorId: opts.lock.allocatorId - } - }; - } - - return { - exclusiveFor: opts.exclusiveFor, - inputTokens: opts.inputTokens.map(toCoreTokenContext), - outputTokens: opts.outputTokens.map(toCoreTokenContext), - verifier: opts.verifier, - account, - lock: { - type: "escrow" - } - }; + const account = opts.account(); + if (opts.lock.type === "compact") { + return { + exclusiveFor: opts.exclusiveFor, + inputTokens: opts.inputTokens.map(toCoreTokenContext), + outputTokens: opts.outputTokens.map(toCoreTokenContext), + verifier: opts.verifier, + account, + lock: { + type: "compact", + resetPeriod: opts.lock.resetPeriod, + allocatorId: opts.lock.allocatorId + } + }; + } + + return { + exclusiveFor: opts.exclusiveFor, + inputTokens: opts.inputTokens.map(toCoreTokenContext), + outputTokens: opts.outputTokens.map(toCoreTokenContext), + verifier: opts.verifier, + account, + lock: { + type: "escrow" + } + }; } /** * @notice Factory class for creating and managing intents. Functions called by integrators. */ export class IntentFactory { - mainnet: boolean; - intentApi: IntentApi; - - walletClient: WC; - - preHook?: (chainId: number) => Promise; - postHook?: () => Promise; - - orders: OrderContainer[] = []; - - constructor(options: { - mainnet: boolean; - walletClient: WC; - preHook?: (chainId: number) => Promise; - postHook?: () => Promise; - ordersPointer?: OrderContainer[]; - }) { - const { mainnet, walletClient, preHook, postHook, ordersPointer } = options; - this.mainnet = mainnet; - this.intentApi = new IntentApi(mainnet); - this.walletClient = walletClient; - - this.preHook = preHook; - this.postHook = postHook; - - if (ordersPointer) this.orders = ordersPointer; - } - - private saveOrder(options: { - order: StandardOrder | MultichainOrder; - inputSettler: `0x${string}`; - sponsorSignature?: Signature | NoSignature; - allocatorSignature?: Signature | NoSignature; - }) { - const { order, inputSettler, sponsorSignature, allocatorSignature } = options; - - const orderContainer: OrderContainer = { - order, - inputSettler, - sponsorSignature: sponsorSignature ?? { - type: "None", - payload: "0x" - }, - allocatorSignature: allocatorSignature ?? { - type: "None", - payload: "0x" - } - }; - this.orders.push(orderContainer); - store.saveOrderToDb(orderContainer).catch((e) => console.warn("saveOrderToDb error", e)); - } - - compact(opts: AppCreateIntentOptions) { - return async () => { - const { account, inputTokens } = opts; - const inputChain = inputTokens[0].token.chainId; - if (this.preHook) await this.preHook(inputChain); - const intent = new Intent(toCoreCreateIntentOptions(opts), intentDeps).order(); - - const sponsorSignature = await signIntentCompact(intent, account(), this.walletClient); - - console.log({ - order: intent.asOrder(), - sponsorSignature - }); - - this.saveOrder({ - order: intent.asOrder(), - inputSettler: intent.inputSettler, - sponsorSignature: { - type: "ECDSA", - payload: sponsorSignature - } - }); - - const order = intent.asOrder(); - if (!("originChainId" in order)) { - throw new Error("CatalystCompactOrder submission currently supports standard orders."); - } - const signedOrder = await this.intentApi.submitOrder({ - orderType: "CatalystCompactOrder", - order, - inputSettler: INPUT_SETTLER_COMPACT_LIFI, - sponsorSignature, - allocatorSignature: "0x" - }); - console.log("signedOrder", signedOrder); - - if (this.postHook) await this.postHook(); - }; - } - - compactDepositAndRegister(opts: AppCreateIntentOptions) { - return async () => { - const { inputTokens, account } = opts; - const intent = new Intent(toCoreCreateIntentOptions(opts), intentDeps).singlechain(); - - if (this.preHook) await this.preHook(inputTokens[0].token.chainId); - - let transactionHash = await depositAndRegisterCompact(intent, account(), this.walletClient); - - const receipt = await getClient(inputTokens[0].token.chainId).waitForTransactionReceipt({ - hash: transactionHash - }); - - // If you use another allocator than polymer, there should be logic for potentially getting the allocator signature here. - // You may consider getting the allocator signature before you call depositAndRegisterCompact - - // Add the order to our local order list. - this.saveOrder({ - order: intent.asOrder(), - inputSettler: INPUT_SETTLER_COMPACT_LIFI - }); - - // Submit the order to the intent-api. - const unsignedOrder = await this.intentApi.submitOrder({ - orderType: "CatalystCompactOrder", - order: intent.asOrder(), - inputSettler: INPUT_SETTLER_COMPACT_LIFI, - compactRegistrationTxHash: transactionHash - }); - - console.log("unsignedOrder", unsignedOrder); - if (this.postHook) await this.postHook(); - }; - } - - openIntent(opts: AppCreateIntentOptions) { - return async () => { - const { inputTokens, account } = opts; - const intent = new Intent(toCoreCreateIntentOptions(opts), intentDeps).order(); - - const inputChain = inputTokens[0].token.chainId; - if (this.preHook) await this.preHook(inputChain); - - // Execute the open. - const transactionHashes = await openEscrowIntent(intent, account(), this.walletClient); - console.log({ tsh: transactionHashes }); - - // for (const hash of transactionHashes) { - // await clients[inputChain].waitForTransactionReceipt({ - // hash: await hash - // }); - // } - - if (this.postHook) await this.postHook(); - - this.saveOrder({ - order: intent.asOrder(), - inputSettler: store.inputSettler - }); - - return transactionHashes; - }; - } + mainnet: boolean; + intentApi: IntentApi; + + walletClient: WC; + + preHook?: (chainId: number) => Promise; + postHook?: () => Promise; + + orders: OrderContainer[] = []; + + constructor(options: { + mainnet: boolean; + useProductionApi?: boolean | null; + walletClient: WC; + preHook?: (chainId: number) => Promise; + postHook?: () => Promise; + ordersPointer?: OrderContainer[]; + }) { + const { mainnet, useProductionApi, walletClient, preHook, postHook, ordersPointer } = options; + this.mainnet = mainnet; + this.intentApi = new IntentApi(useProductionApi ?? mainnet); + this.walletClient = walletClient; + + this.preHook = preHook; + this.postHook = postHook; + + if (ordersPointer) this.orders = ordersPointer; + } + + private saveOrder(options: { + order: StandardOrder | MultichainOrder; + inputSettler: `0x${string}`; + sponsorSignature?: Signature | NoSignature; + allocatorSignature?: Signature | NoSignature; + }) { + const { order, inputSettler, sponsorSignature, allocatorSignature } = options; + + const orderContainer: OrderContainer = { + order, + inputSettler, + sponsorSignature: sponsorSignature ?? { + type: "None", + payload: "0x" + }, + allocatorSignature: allocatorSignature ?? { + type: "None", + payload: "0x" + } + }; + this.orders.push(orderContainer); + store.saveOrderToDb(orderContainer).catch((e) => console.warn("saveOrderToDb error", e)); + } + + compact(opts: AppCreateIntentOptions) { + return async () => { + const { account, inputTokens } = opts; + const inputChain = inputTokens[0].token.chainId; + if (this.preHook) await this.preHook(inputChain); + const intentInstance = new Intent(toCoreCreateIntentOptions(opts), intentDeps); + applySameChainTimings(intentInstance); + const sameChain = intentInstance.isSameChain(); + const intent = intentInstance.order(); + applyExclusivityOverride(intent, opts.exclusiveFor, sameChain); + + const sponsorSignature = await signIntentCompact(intent, account(), this.walletClient); + + console.log({ + order: intent.asOrder(), + sponsorSignature + }); + + this.saveOrder({ + order: intent.asOrder(), + inputSettler: intent.inputSettler, + sponsorSignature: { + type: "ECDSA", + payload: sponsorSignature + } + }); + + const order = intent.asOrder(); + if (!("originChainId" in order)) { + throw new Error("CatalystCompactOrder submission currently supports standard orders."); + } + const signedOrder = await this.intentApi.submitOrder({ + orderType: "CatalystCompactOrder", + order, + inputSettler: INPUT_SETTLER_COMPACT_LIFI, + sponsorSignature, + allocatorSignature: "0x" + }); + console.log("signedOrder", signedOrder); + + if (this.postHook) await this.postHook(); + }; + } + + compactDepositAndRegister(opts: AppCreateIntentOptions) { + return async () => { + const { inputTokens, account } = opts; + const intentInstance2 = new Intent(toCoreCreateIntentOptions(opts), intentDeps); + applySameChainTimings(intentInstance2); + const sameChain2 = intentInstance2.isSameChain(); + const intent = intentInstance2.singlechain(); + applyExclusivityOverride(intent, opts.exclusiveFor, sameChain2); + + if (this.preHook) await this.preHook(inputTokens[0].token.chainId); + + let transactionHash = await depositAndRegisterCompact(intent, account(), this.walletClient); + + const receipt = await getClient(inputTokens[0].token.chainId).waitForTransactionReceipt({ + hash: transactionHash + }); + + // If you use another allocator than polymer, there should be logic for potentially getting the allocator signature here. + // You may consider getting the allocator signature before you call depositAndRegisterCompact + + // Add the order to our local order list. + this.saveOrder({ + order: intent.asOrder(), + inputSettler: INPUT_SETTLER_COMPACT_LIFI + }); + + // Submit the order to the intent-api. + const unsignedOrder = await this.intentApi.submitOrder({ + orderType: "CatalystCompactOrder", + order: intent.asOrder(), + inputSettler: INPUT_SETTLER_COMPACT_LIFI, + compactRegistrationTxHash: transactionHash + }); + + console.log("unsignedOrder", unsignedOrder); + if (this.postHook) await this.postHook(); + }; + } + + openIntent(opts: AppCreateIntentOptions) { + return async () => { + const { inputTokens, account } = opts; + const intentInstance3 = new Intent(toCoreCreateIntentOptions(opts), intentDeps); + applySameChainTimings(intentInstance3); + const sameChain3 = intentInstance3.isSameChain(); + const intent = intentInstance3.order(); + applyExclusivityOverride(intent, opts.exclusiveFor, sameChain3); + + const inputChain = inputTokens[0].token.chainId; + if (this.preHook) await this.preHook(inputChain); + + // Execute the open. + const transactionHashes = await openEscrowIntent(intent, account(), this.walletClient); + console.log({ tsh: transactionHashes }); + + // for (const hash of transactionHashes) { + // await clients[inputChain].waitForTransactionReceipt({ + // hash: await hash + // }); + // } + + if (this.postHook) await this.postHook(); + + this.saveOrder({ + order: intent.asOrder(), + inputSettler: store.inputSettler + }); + + return transactionHashes; + }; + } } export function escrowApprove( - walletClient: WC, - opts: { - preHook?: (chainId: number) => Promise; - postHook?: () => Promise; - inputTokens: AppTokenContext[]; - account: () => `0x${string}`; - } + walletClient: WC, + opts: { + preHook?: (chainId: number) => Promise; + postHook?: () => Promise; + inputTokens: AppTokenContext[]; + account: () => `0x${string}`; + } ) { - return async () => { - const settler = store.multichain ? MULTICHAIN_INPUT_SETTLER_ESCROW : INPUT_SETTLER_ESCROW_LIFI; - - const { preHook, postHook, inputTokens, account } = opts; - for (let i = 0; i < inputTokens.length; ++i) { - const { token, amount } = inputTokens[i]; - if (preHook) await preHook(token.chainId); - const publicClient = getClient(token.chainId); - const currentAllowance = await publicClient.readContract({ - address: token.address, - abi: ERC20_ABI, - functionName: "allowance", - args: [account(), settler] - }); - if (currentAllowance >= amount) continue; - const transactionHash = walletClient.writeContract({ - chain: getChain(token.chainId), - account: account(), - address: token.address, - abi: ERC20_ABI, - functionName: "approve", - args: [settler, maxUint256] - }); - - await publicClient.waitForTransactionReceipt({ - hash: await transactionHash - }); - } - if (postHook) await postHook(); - }; + return async () => { + const settler = store.multichain ? MULTICHAIN_INPUT_SETTLER_ESCROW : INPUT_SETTLER_ESCROW_LIFI; + + const { preHook, postHook, inputTokens, account } = opts; + for (let i = 0; i < inputTokens.length; ++i) { + const { token, amount } = inputTokens[i]; + if (preHook) await preHook(token.chainId); + const publicClient = getClient(token.chainId); + const currentAllowance = await publicClient.readContract({ + address: token.address, + abi: ERC20_ABI, + functionName: "allowance", + args: [account(), settler] + }); + if (currentAllowance >= amount) continue; + const transactionHash = walletClient.writeContract({ + chain: getChain(token.chainId), + account: account(), + address: token.address, + abi: ERC20_ABI, + functionName: "approve", + args: [settler, maxUint256] + }); + + await publicClient.waitForTransactionReceipt({ + hash: await transactionHash + }); + } + if (postHook) await postHook(); + }; } diff --git a/src/lib/libraries/intentList.ts b/src/lib/libraries/intentList.ts index 4689d51..d0c3d54 100644 --- a/src/lib/libraries/intentList.ts +++ b/src/lib/libraries/intentList.ts @@ -1,11 +1,11 @@ import { - formatTokenAmount, - getChainName, - getCoin, - INPUT_SETTLER_ESCROW_LIFI, - INPUT_SETTLER_COMPACT_LIFI, - MULTICHAIN_INPUT_SETTLER_ESCROW, - MULTICHAIN_INPUT_SETTLER_COMPACT + formatTokenAmount, + getChainName, + getCoin, + INPUT_SETTLER_ESCROW_LIFI, + INPUT_SETTLER_COMPACT_LIFI, + MULTICHAIN_INPUT_SETTLER_ESCROW, + MULTICHAIN_INPUT_SETTLER_COMPACT } from "../config"; import { orderToIntent } from "@lifi/intent"; import { bytes32ToAddress, idToToken } from "@lifi/intent"; @@ -14,264 +14,264 @@ import { validateOrderContainerWithReason } from "@lifi/intent"; import { orderValidationDeps } from "./coreDeps"; export type Chip = { - key: string; - text: string; + key: string; + text: string; }; export type Status = "active" | "expiring" | "expired"; export type ChainScope = "singlechain" | "multichain" | "samechain"; export type BaseIntentRow = { - orderContainer: OrderContainer; - orderId: string; - orderIdShort: string; - userShort: string; - fillDeadline: number; - inputCount: number; - outputCount: number; - chainScope: ChainScope; - chainScopeBadge: string; - inputSchemeBadge?: string; - orderTypeBadge?: string; - exclusiveForAddress?: string; - exclusiveUntil?: number; - inputChips: Chip[]; - inputOverflow: number; - outputChips: Chip[]; - outputOverflow: number; - validationPassed: boolean; - validationReason: string; + orderContainer: OrderContainer; + orderId: string; + orderIdShort: string; + userShort: string; + fillDeadline: number; + inputCount: number; + outputCount: number; + chainScope: ChainScope; + chainScopeBadge: string; + inputSchemeBadge?: string; + orderTypeBadge?: string; + exclusiveForAddress?: string; + exclusiveUntil?: number; + inputChips: Chip[]; + inputOverflow: number; + outputChips: Chip[]; + outputOverflow: number; + validationPassed: boolean; + validationReason: string; }; export type TimedIntentRow = BaseIntentRow & { - status: Status; - secondsToDeadline: number; - protocolBadges: string[]; + status: Status; + secondsToDeadline: number; + protocolBadges: string[]; }; export const EXPIRING_THRESHOLD_SECONDS = 5 * 60; export const MAX_CHIPS_PER_SIDE = 2; function flattenInputs(inputs: { chainId: bigint; inputs: [bigint, bigint][] }[]) { - return inputs.flatMap((chainInput) => { - return chainInput.inputs.map((input) => ({ - chainId: chainInput.chainId, - input - })); - }); + return inputs.flatMap((chainInput) => { + return chainInput.inputs.map((input) => ({ + chainId: chainInput.chainId, + input + })); + }); } function safeChainName(chainId: bigint): string | undefined { - try { - return getChainName(chainId); - } catch { - return undefined; - } + try { + return getChainName(chainId); + } catch { + return undefined; + } } function shortAddress(value: string, start = 6, end = 4) { - if (value.length <= start + end) return value; - return `${value.slice(0, start)}...${value.slice(-end)}`; + if (value.length <= start + end) return value; + return `${value.slice(0, start)}...${value.slice(-end)}`; } function summarizeInput(chainId: bigint, tokenId: bigint, amount: bigint): string { - const tokenAddress = idToToken(tokenId); - const chainName = safeChainName(chainId); - if (!chainName) { - return `${amount.toString()} ${shortAddress(tokenAddress)} on chain-${chainId.toString()}`; - } - const coin = getCoin({ address: tokenAddress, chainId }); - const amountText = formatTokenAmount(amount, coin.decimals); - return `${amountText} ${coin.name.toUpperCase()} on ${chainName}`; + const tokenAddress = idToToken(tokenId); + const chainName = safeChainName(chainId); + if (!chainName) { + return `${amount.toString()} ${shortAddress(tokenAddress)} on chain-${chainId.toString()}`; + } + const coin = getCoin({ address: tokenAddress, chainId }); + const amountText = formatTokenAmount(amount, coin.decimals); + return `${amountText} ${coin.name.toUpperCase()} on ${chainName}`; } function summarizeOutput(chainId: bigint, token: `0x${string}`, amount: bigint): string { - const chainName = safeChainName(chainId); - if (!chainName) { - return `${amount.toString()} ${shortAddress(token)} on chain-${chainId.toString()}`; - } - const coin = getCoin({ address: token, chainId }); - const amountText = formatTokenAmount(amount, coin.decimals); - return `${amountText} ${coin.name.toUpperCase()} on ${chainName}`; + const chainName = safeChainName(chainId); + if (!chainName) { + return `${amount.toString()} ${shortAddress(token)} on chain-${chainId.toString()}`; + } + const coin = getCoin({ address: token, chainId }); + const amountText = formatTokenAmount(amount, coin.decimals); + return `${amountText} ${coin.name.toUpperCase()} on ${chainName}`; } function getInputs(order: StandardOrder | MultichainOrder) { - if ("originChainId" in order) { - return order.inputs.map((input, index) => ({ - key: `s-${index}-${input[0].toString()}`, - text: summarizeInput(order.originChainId, input[0], input[1]) - })); - } - - return flattenInputs(order.inputs).map((input, index) => ({ - key: `m-${index}-${input.input[0].toString()}`, - text: summarizeInput(input.chainId, input.input[0], input.input[1]) - })); + if ("originChainId" in order) { + return order.inputs.map((input, index) => ({ + key: `s-${index}-${input[0].toString()}`, + text: summarizeInput(order.originChainId, input[0], input[1]) + })); + } + + return flattenInputs(order.inputs).map((input, index) => ({ + key: `m-${index}-${input.input[0].toString()}`, + text: summarizeInput(input.chainId, input.input[0], input.input[1]) + })); } function getOutputs(order: StandardOrder | MultichainOrder) { - return order.outputs.map((output, index) => ({ - key: `o-${index}-${output.token}`, - text: summarizeOutput(output.chainId, output.token, output.amount) - })); + return order.outputs.map((output, index) => ({ + key: `o-${index}-${output.token}`, + text: summarizeOutput(output.chainId, output.token, output.amount) + })); } function getChainScope(order: StandardOrder | MultichainOrder): ChainScope { - if (!("originChainId" in order)) return "multichain"; - const isSameChain = order.outputs.every((output) => output.chainId === order.originChainId); - return isSameChain ? "samechain" : "singlechain"; + if (!("originChainId" in order)) return "multichain"; + const isSameChain = order.outputs.every((output) => output.chainId === order.originChainId); + return isSameChain ? "samechain" : "singlechain"; } function toChainScopeBadge(scope: ChainScope) { - if (scope === "samechain") return "SameChain"; - if (scope === "singlechain") return "SingleChain"; - return "MultiChain"; + if (scope === "samechain") return "SameChain"; + if (scope === "singlechain") return "SingleChain"; + return "MultiChain"; } function shortHexAddress(value: `0x${string}`) { - return `${value.slice(0, 6)}...${value.slice(-4)}`; + return `${value.slice(0, 6)}...${value.slice(-4)}`; } function normalizeAddress(value: string) { - return value.toLowerCase(); + return value.toLowerCase(); } function mapInputScheme(inputSettler: `0x${string}`): string | undefined { - const settler = normalizeAddress(inputSettler); - if (settler === normalizeAddress(INPUT_SETTLER_ESCROW_LIFI)) return "Escrow"; - if (settler === normalizeAddress(INPUT_SETTLER_COMPACT_LIFI)) return "Compact"; - if (settler === normalizeAddress(MULTICHAIN_INPUT_SETTLER_ESCROW)) return "MultichainEscrow"; - if (settler === normalizeAddress(MULTICHAIN_INPUT_SETTLER_COMPACT)) return "MultichainCompact"; - return undefined; + const settler = normalizeAddress(inputSettler); + if (settler === normalizeAddress(INPUT_SETTLER_ESCROW_LIFI)) return "Escrow"; + if (settler === normalizeAddress(INPUT_SETTLER_COMPACT_LIFI)) return "Compact"; + if (settler === normalizeAddress(MULTICHAIN_INPUT_SETTLER_ESCROW)) return "MultichainEscrow"; + if (settler === normalizeAddress(MULTICHAIN_INPUT_SETTLER_COMPACT)) return "MultichainCompact"; + return undefined; } function parseContextType(context: `0x${string}`) { - if (context === "0x" || context === "0x00") return "Limit"; - const typeByte = context.slice(2, 4).toLowerCase(); - if (typeByte === "00") return "Limit"; - if (typeByte === "01") return "Dutch"; - if (typeByte === "e0") return "Limit"; - if (typeByte === "e1") return "Dutch"; - return undefined; + if (context === "0x" || context === "0x00") return "Limit"; + const typeByte = context.slice(2, 4).toLowerCase(); + if (typeByte === "00") return "Limit"; + if (typeByte === "01") return "Dutch"; + if (typeByte === "e0") return "Limit"; + if (typeByte === "e1") return "Dutch"; + return undefined; } function decodeExclusiveFor(context: `0x${string}`): `0x${string}` | undefined { - if (context.length < 2 + 2 + 64) return undefined; - const exclusiveHex = context.slice(4, 68); - try { - return bytes32ToAddress(`0x${exclusiveHex}`); - } catch { - return undefined; - } + if (context.length < 2 + 2 + 64) return undefined; + const exclusiveHex = context.slice(4, 68); + try { + return bytes32ToAddress(`0x${exclusiveHex}`); + } catch { + return undefined; + } } type ContextDetails = { - orderTypeBadge?: string; - exclusiveForAddress?: string; - exclusiveUntil?: number; + orderTypeBadge?: string; + exclusiveForAddress?: string; + exclusiveUntil?: number; }; function getContextDetails(orderContainer: OrderContainer): ContextDetails { - const order = orderContainer.order; - const details: ContextDetails = {}; + const order = orderContainer.order; + const details: ContextDetails = {}; - const contexts = order.outputs.map((o) => o.context); - const firstContext = contexts[0]; - const allContextsMatch = contexts.every((c) => c === firstContext); - if (!firstContext || !allContextsMatch) return details; + const contexts = order.outputs.map((o) => o.context); + const firstContext = contexts[0]; + const allContextsMatch = contexts.every((c) => c === firstContext); + if (!firstContext || !allContextsMatch) return details; - details.orderTypeBadge = parseContextType(firstContext); + details.orderTypeBadge = parseContextType(firstContext); - const typeByte = firstContext.slice(2, 4).toLowerCase(); - const isExclusive = typeByte === "e0" || typeByte === "e1"; - if (!isExclusive) return details; + const typeByte = firstContext.slice(2, 4).toLowerCase(); + const isExclusive = typeByte === "e0" || typeByte === "e1"; + if (!isExclusive) return details; - const exclusiveFor = decodeExclusiveFor(firstContext); - if (exclusiveFor) details.exclusiveForAddress = shortHexAddress(exclusiveFor); + const exclusiveFor = decodeExclusiveFor(firstContext); + if (exclusiveFor) details.exclusiveForAddress = shortHexAddress(exclusiveFor); - // bytes1 + bytes32 + uint32 (big-endian) - if (firstContext.length >= 76) { - const untilHex = firstContext.slice(68, 76); - const until = Number.parseInt(untilHex, 16); - if (!Number.isNaN(until)) details.exclusiveUntil = until; - } + // bytes1 + bytes32 + uint32 (big-endian) + if (firstContext.length >= 76) { + const untilHex = firstContext.slice(68, 76); + const until = Number.parseInt(untilHex, 16); + if (!Number.isNaN(until)) details.exclusiveUntil = until; + } - return details; + return details; } export function buildBaseIntentRow(orderContainer: OrderContainer): BaseIntentRow { - const order = orderContainer.order; - const orderId = orderToIntent(orderContainer).orderId(); - const inputChipsRaw = getInputs(order); - const outputChipsRaw = getOutputs(order); - const chainScope = getChainScope(order); - const contextDetails = getContextDetails(orderContainer); - - const validation = validateOrderContainerWithReason({ - orderContainer, - deps: orderValidationDeps - }); - - return { - orderContainer, - orderId, - orderIdShort: shortAddress(orderId, 10, 4), - userShort: shortAddress(order.user, 8, 4), - fillDeadline: order.fillDeadline, - inputCount: inputChipsRaw.length, - outputCount: outputChipsRaw.length, - chainScope, - chainScopeBadge: toChainScopeBadge(chainScope), - inputSchemeBadge: mapInputScheme(orderContainer.inputSettler), - orderTypeBadge: contextDetails.orderTypeBadge, - exclusiveForAddress: contextDetails.exclusiveForAddress, - exclusiveUntil: contextDetails.exclusiveUntil, - inputChips: inputChipsRaw.slice(0, MAX_CHIPS_PER_SIDE), - inputOverflow: Math.max(0, inputChipsRaw.length - MAX_CHIPS_PER_SIDE), - outputChips: outputChipsRaw.slice(0, MAX_CHIPS_PER_SIDE), - outputOverflow: Math.max(0, outputChipsRaw.length - MAX_CHIPS_PER_SIDE), - validationPassed: validation.passed, - validationReason: validation.reason - }; + const order = orderContainer.order; + const orderId = orderToIntent(orderContainer).orderId(); + const inputChipsRaw = getInputs(order); + const outputChipsRaw = getOutputs(order); + const chainScope = getChainScope(order); + const contextDetails = getContextDetails(orderContainer); + + const validation = validateOrderContainerWithReason({ + orderContainer, + deps: orderValidationDeps + }); + + return { + orderContainer, + orderId, + orderIdShort: shortAddress(orderId, 10, 4), + userShort: shortAddress(order.user, 8, 4), + fillDeadline: order.fillDeadline, + inputCount: inputChipsRaw.length, + outputCount: outputChipsRaw.length, + chainScope, + chainScopeBadge: toChainScopeBadge(chainScope), + inputSchemeBadge: mapInputScheme(orderContainer.inputSettler), + orderTypeBadge: contextDetails.orderTypeBadge, + exclusiveForAddress: contextDetails.exclusiveForAddress, + exclusiveUntil: contextDetails.exclusiveUntil, + inputChips: inputChipsRaw.slice(0, MAX_CHIPS_PER_SIDE), + inputOverflow: Math.max(0, inputChipsRaw.length - MAX_CHIPS_PER_SIDE), + outputChips: outputChipsRaw.slice(0, MAX_CHIPS_PER_SIDE), + outputOverflow: Math.max(0, outputChipsRaw.length - MAX_CHIPS_PER_SIDE), + validationPassed: validation.passed, + validationReason: validation.reason + }; } export function withTiming(baseRow: BaseIntentRow, nowSeconds: number): TimedIntentRow { - const secondsToDeadline = baseRow.fillDeadline - nowSeconds; - const status: Status = - secondsToDeadline <= 0 - ? "expired" - : secondsToDeadline <= EXPIRING_THRESHOLD_SECONDS - ? "expiring" - : "active"; - - const protocolBadges: string[] = []; - if (baseRow.orderTypeBadge) protocolBadges.push(baseRow.orderTypeBadge); - if (baseRow.exclusiveForAddress) - protocolBadges.push(`Exclusive for ${baseRow.exclusiveForAddress}`); - if (baseRow.exclusiveUntil !== undefined) { - const secondsRemaining = baseRow.exclusiveUntil - nowSeconds; - if (secondsRemaining > 0) { - protocolBadges.push(`Exclusive until ${formatRemaining(secondsRemaining)}`); - } - } - - return { ...baseRow, status, secondsToDeadline, protocolBadges }; + const secondsToDeadline = baseRow.fillDeadline - nowSeconds; + const status: Status = + secondsToDeadline <= 0 + ? "expired" + : secondsToDeadline <= EXPIRING_THRESHOLD_SECONDS + ? "expiring" + : "active"; + + const protocolBadges: string[] = []; + if (baseRow.orderTypeBadge) protocolBadges.push(baseRow.orderTypeBadge); + if (baseRow.exclusiveForAddress) + protocolBadges.push(`Exclusive for ${baseRow.exclusiveForAddress}`); + if (baseRow.exclusiveUntil !== undefined) { + const secondsRemaining = baseRow.exclusiveUntil - nowSeconds; + if (secondsRemaining > 0) { + protocolBadges.push(`Exclusive until ${formatRemaining(secondsRemaining)}`); + } + } + + return { ...baseRow, status, secondsToDeadline, protocolBadges }; } export function formatRelativeDeadline(secondsToDeadline: number) { - const abs = Math.abs(secondsToDeadline); - if (abs < 60) return secondsToDeadline >= 0 ? `in ${abs}s` : `${abs}s ago`; - const minutes = Math.floor(abs / 60); - if (minutes < 60) return secondsToDeadline >= 0 ? `in ${minutes}m` : `${minutes}m ago`; - const hours = Math.floor(minutes / 60); - return secondsToDeadline >= 0 ? `in ${hours}h` : `${hours}h ago`; + const abs = Math.abs(secondsToDeadline); + if (abs < 60) return secondsToDeadline >= 0 ? `in ${abs}s` : `${abs}s ago`; + const minutes = Math.floor(abs / 60); + if (minutes < 60) return secondsToDeadline >= 0 ? `in ${minutes}m` : `${minutes}m ago`; + const hours = Math.floor(minutes / 60); + return secondsToDeadline >= 0 ? `in ${hours}h` : `${hours}h ago`; } export function formatRemaining(secondsToDeadline: number) { - const clamped = Math.max(0, secondsToDeadline); - if (clamped < 60) return `${clamped}s`; - const minutes = Math.floor(clamped / 60); - if (minutes < 60) return `${minutes}m`; - const hours = Math.floor(minutes / 60); - return `${hours}h`; + const clamped = Math.max(0, secondsToDeadline); + if (clamped < 60) return `${clamped}s`; + const minutes = Math.floor(clamped / 60); + if (minutes < 60) return `${minutes}m`; + const hours = Math.floor(minutes / 60); + return `${hours}h`; } diff --git a/src/lib/libraries/rpcCache.ts b/src/lib/libraries/rpcCache.ts index 2790e8b..1167031 100644 --- a/src/lib/libraries/rpcCache.ts +++ b/src/lib/libraries/rpcCache.ts @@ -1,71 +1,71 @@ type CacheEntry = { - value: T; - expiresAt: number; + value: T; + expiresAt: number; }; const cache = new Map>(); const inflight = new Map>(); const stats = { - hits: 0, - misses: 0, - inflightJoins: 0 + hits: 0, + misses: 0, + inflightJoins: 0 }; export function getRpcCacheStats() { - return { ...stats }; + return { ...stats }; } export function clearRpcCache() { - cache.clear(); - inflight.clear(); + cache.clear(); + inflight.clear(); } export function invalidateRpcKey(key: string) { - cache.delete(key); - inflight.delete(key); + cache.delete(key); + inflight.delete(key); } export function invalidateRpcPrefix(prefix: string) { - for (const key of cache.keys()) { - if (key.startsWith(prefix)) cache.delete(key); - } - for (const key of inflight.keys()) { - if (key.startsWith(prefix)) inflight.delete(key); - } + for (const key of cache.keys()) { + if (key.startsWith(prefix)) cache.delete(key); + } + for (const key of inflight.keys()) { + if (key.startsWith(prefix)) inflight.delete(key); + } } export async function getOrFetchRpc( - key: string, - fetcher: () => Promise, - opts: { ttlMs: number; force?: boolean } + key: string, + fetcher: () => Promise, + opts: { ttlMs: number; force?: boolean } ): Promise { - const { ttlMs, force = false } = opts; - const now = Date.now(); + const { ttlMs, force = false } = opts; + const now = Date.now(); - if (!force) { - const cached = cache.get(key) as CacheEntry | undefined; - if (cached && cached.expiresAt > now) { - stats.hits += 1; - return cached.value; - } - const pending = inflight.get(key) as Promise | undefined; - if (pending) { - stats.inflightJoins += 1; - return pending; - } - } + if (!force) { + const cached = cache.get(key) as CacheEntry | undefined; + if (cached && cached.expiresAt > now) { + stats.hits += 1; + return cached.value; + } + const pending = inflight.get(key) as Promise | undefined; + if (pending) { + stats.inflightJoins += 1; + return pending; + } + } - stats.misses += 1; - const request = fetcher() - .then((value) => { - cache.set(key, { value, expiresAt: Date.now() + ttlMs }); - return value; - }) - .finally(() => { - inflight.delete(key); - }); + stats.misses += 1; + const request = fetcher() + .then((value) => { + cache.set(key, { value, expiresAt: Date.now() + ttlMs }); + return value; + }) + .finally(() => { + inflight.delete(key); + }); - inflight.set(key, request); - return request; + inflight.set(key, request); + return request; } diff --git a/src/lib/libraries/solver.ts b/src/lib/libraries/solver.ts index 674ce29..961b7dd 100644 --- a/src/lib/libraries/solver.ts +++ b/src/lib/libraries/solver.ts @@ -15,375 +15,375 @@ import { finaliseIntent } from "./intentExecution"; * @notice Class for solving intents. Functions called by solvers. */ export class Solver { - private static validationInflight = new Map>(); - private static polymerRequestIndexByLog = new Map(); + private static validationInflight = new Map>(); + private static polymerRequestIndexByLog = new Map(); - private static sleep(ms: number) { - return new Promise((resolve) => setTimeout(resolve, ms)); - } + private static sleep(ms: number) { + return new Promise((resolve) => setTimeout(resolve, ms)); + } - private static async persistReceipt( - chainId: number | bigint, - txHash: `0x${string}`, - receipt: unknown - ) { - try { - await store.saveTransactionReceipt(chainId, txHash, receipt); - } catch (error) { - console.warn("saveTransactionReceipt error", { chainId: Number(chainId), txHash, error }); - } - } + private static async persistReceipt( + chainId: number | bigint, + txHash: `0x${string}`, + receipt: unknown + ) { + try { + await store.saveTransactionReceipt(chainId, txHash, receipt); + } catch (error) { + console.warn("saveTransactionReceipt error", { chainId: Number(chainId), txHash, error }); + } + } - private static async getReceiptCachedOrRpc(chainId: number | bigint, txHash: `0x${string}`) { - const cached = store.getTransactionReceipt(chainId, txHash); - if ( - cached && - typeof cached === "object" && - Array.isArray((cached as { logs?: unknown[] }).logs) && - (cached as { logs?: unknown[] }).logs!.length > 0 - ) - return cached as any; - const receipt = await getClient(chainId).getTransactionReceipt({ hash: txHash }); - await Solver.persistReceipt(chainId, txHash, receipt); - return receipt; - } + private static async getReceiptCachedOrRpc(chainId: number | bigint, txHash: `0x${string}`) { + const cached = store.getTransactionReceipt(chainId, txHash); + if ( + cached && + typeof cached === "object" && + Array.isArray((cached as { logs?: unknown[] }).logs) && + (cached as { logs?: unknown[] }).logs!.length > 0 + ) + return cached as any; + const receipt = await getClient(chainId).getTransactionReceipt({ hash: txHash }); + await Solver.persistReceipt(chainId, txHash, receipt); + return receipt; + } - static fill( - walletClient: WC, - args: { - orderContainer: OrderContainer; - outputs: MandateOutput[]; - }, - opts: { - preHook?: (chainId: number) => Promise; - postHook?: () => Promise; - account: () => `0x${string}`; - } - ) { - return async () => { - const { preHook, postHook, account } = opts; - const { - orderContainer: { order, inputSettler }, - outputs - } = args; - const orderId = orderToIntent({ order, inputSettler }).orderId(); + static fill( + walletClient: WC, + args: { + orderContainer: OrderContainer; + outputs: MandateOutput[]; + }, + opts: { + preHook?: (chainId: number) => Promise; + postHook?: () => Promise; + account: () => `0x${string}`; + } + ) { + return async () => { + const { preHook, postHook, account } = opts; + const { + orderContainer: { order, inputSettler }, + outputs + } = args; + const orderId = orderToIntent({ order, inputSettler }).orderId(); - const outputChainId = Number(outputs[0].chainId); - const outputChain = getChain(outputChainId); - // Always attempt chain switch before fill, including native-token fills. - if (preHook) await preHook(outputChain.id); - const connectedChainId = await walletClient.getChainId(); - const expectedChainId = outputChain.id; - if (connectedChainId !== expectedChainId) { - throw new Error(`Wallet is on chain ${connectedChainId}, expected ${expectedChainId}`); - } + const outputChainId = Number(outputs[0].chainId); + const outputChain = getChain(outputChainId); + // Always attempt chain switch before fill, including native-token fills. + if (preHook) await preHook(outputChain.id); + const connectedChainId = await walletClient.getChainId(); + const expectedChainId = outputChain.id; + if (connectedChainId !== expectedChainId) { + throw new Error(`Wallet is on chain ${connectedChainId}, expected ${expectedChainId}`); + } - let value = 0n; - for (const output of outputs) { - if (output.token === BYTES32_ZERO) { - value += output.amount; - continue; - } - if (output.chainId != outputs[0].chainId) { - throw new Error("Filling outputs on multiple chains with single fill call not supported"); - } - if (output.settler != outputs[0].settler) { - throw new Error("Different settlers on outputs, not supported"); - } + let value = 0n; + for (const output of outputs) { + if (output.token === BYTES32_ZERO) { + value += output.amount; + continue; + } + if (output.chainId != outputs[0].chainId) { + throw new Error("Filling outputs on multiple chains with single fill call not supported"); + } + if (output.settler != outputs[0].settler) { + throw new Error("Different settlers on outputs, not supported"); + } - // Check allowance & set allowance if needed - const assetAddress = bytes32ToAddress(output.token); - const allowance = await getClient(outputChain.id).readContract({ - address: assetAddress, - abi: ERC20_ABI, - functionName: "allowance", - args: [account(), bytes32ToAddress(output.settler)] - }); - if (BigInt(allowance) < output.amount) { - const approveTransaction = await walletClient.writeContract({ - chain: outputChain, - account: account(), - address: assetAddress, - abi: ERC20_ABI, - functionName: "approve", - args: [bytes32ToAddress(output.settler), maxUint256] - }); - const approveReceipt = await getClient(outputChain.id).waitForTransactionReceipt({ - hash: approveTransaction - }); - await Solver.persistReceipt(outputs[0].chainId, approveTransaction, approveReceipt); - } - } + // Check allowance & set allowance if needed + const assetAddress = bytes32ToAddress(output.token); + const allowance = await getClient(outputChain.id).readContract({ + address: assetAddress, + abi: ERC20_ABI, + functionName: "allowance", + args: [account(), bytes32ToAddress(output.settler)] + }); + if (BigInt(allowance) < output.amount) { + const approveTransaction = await walletClient.writeContract({ + chain: outputChain, + account: account(), + address: assetAddress, + abi: ERC20_ABI, + functionName: "approve", + args: [bytes32ToAddress(output.settler), maxUint256] + }); + const approveReceipt = await getClient(outputChain.id).waitForTransactionReceipt({ + hash: approveTransaction + }); + await Solver.persistReceipt(outputs[0].chainId, approveTransaction, approveReceipt); + } + } - const transactionHash = await walletClient.writeContract({ - chain: outputChain, - account: account(), - address: bytes32ToAddress(outputs[0].settler), - value, - abi: COIN_FILLER_ABI, - functionName: "fillOrderOutputs", - args: [orderId, outputs, order.fillDeadline, addressToBytes32(account())] - }); - const fillReceipt = await getClient(outputChain.id).waitForTransactionReceipt({ - hash: transactionHash - }); - await Solver.persistReceipt(outputs[0].chainId, transactionHash, fillReceipt); - // orderInputs.validate[index] = transactionHash; - if (postHook) await postHook(); - return transactionHash; - }; - } + const transactionHash = await walletClient.writeContract({ + chain: outputChain, + account: account(), + address: bytes32ToAddress(outputs[0].settler), + value, + abi: COIN_FILLER_ABI, + functionName: "fillOrderOutputs", + args: [orderId, outputs, order.fillDeadline, addressToBytes32(account())] + }); + const fillReceipt = await getClient(outputChain.id).waitForTransactionReceipt({ + hash: transactionHash + }); + await Solver.persistReceipt(outputs[0].chainId, transactionHash, fillReceipt); + // orderInputs.validate[index] = transactionHash; + if (postHook) await postHook(); + return transactionHash; + }; + } - static validate( - walletClient: WC, - args: { - output: MandateOutput; - orderContainer: OrderContainer; - fillTransactionHash: string; - sourceChainId: number | bigint; - mainnet: boolean; - }, - opts: { - preHook?: (chainId: number) => Promise; - postHook?: () => Promise; - account: () => `0x${string}`; - } - ) { - return async () => { - const { preHook, postHook, account } = opts; - const { - output, - orderContainer: { order }, - fillTransactionHash, - sourceChainId, - mainnet - } = args; - const expectedOutputHash = hashStruct({ - types: compactTypes, - primaryType: "MandateOutput", - data: output - }); - const validationKey = `${Number(sourceChainId)}:${fillTransactionHash}:${expectedOutputHash}`; - const existingValidation = Solver.validationInflight.get(validationKey); - if (existingValidation) return existingValidation; + static validate( + walletClient: WC, + args: { + output: MandateOutput; + orderContainer: OrderContainer; + fillTransactionHash: string; + sourceChainId: number | bigint; + mainnet: boolean; + }, + opts: { + preHook?: (chainId: number) => Promise; + postHook?: () => Promise; + account: () => `0x${string}`; + } + ) { + return async () => { + const { preHook, postHook, account } = opts; + const { + output, + orderContainer: { order }, + fillTransactionHash, + sourceChainId, + mainnet + } = args; + const expectedOutputHash = hashStruct({ + types: compactTypes, + primaryType: "MandateOutput", + data: output + }); + const validationKey = `${Number(sourceChainId)}:${fillTransactionHash}:${expectedOutputHash}`; + const existingValidation = Solver.validationInflight.get(validationKey); + if (existingValidation) return existingValidation; - const validationPromise = (async () => { - if ( - !fillTransactionHash || - !fillTransactionHash.startsWith("0x") || - fillTransactionHash.length !== 66 - ) { - throw new Error(`Invalid fill transaction hash: ${fillTransactionHash}`); - } + const validationPromise = (async () => { + if ( + !fillTransactionHash || + !fillTransactionHash.startsWith("0x") || + fillTransactionHash.length !== 66 + ) { + throw new Error(`Invalid fill transaction hash: ${fillTransactionHash}`); + } - // Get the output filled event. - const transactionReceipt = await Solver.getReceiptCachedOrRpc( - output.chainId, - fillTransactionHash as `0x${string}` - ); + // Get the output filled event. + const transactionReceipt = await Solver.getReceiptCachedOrRpc( + output.chainId, + fillTransactionHash as `0x${string}` + ); - const logs = parseEventLogs({ - abi: COIN_FILLER_ABI, - eventName: "OutputFilled", - logs: transactionReceipt.logs - }); - // We need to search through each log until we find one matching our output. - let logIndex = -1; - for (const log of logs) { - const logOutput = log.args.output; - // TODO: Optimise by comparing the dicts. - const logOutputHash = hashStruct({ - types: compactTypes, - primaryType: "MandateOutput", - data: logOutput - }); - if (logOutputHash === expectedOutputHash) { - logIndex = log.logIndex; - break; - } - } - if (logIndex === -1) throw Error(`Could not find matching log`); + const logs = parseEventLogs({ + abi: COIN_FILLER_ABI, + eventName: "OutputFilled", + logs: transactionReceipt.logs + }); + // We need to search through each log until we find one matching our output. + let logIndex = -1; + for (const log of logs) { + const logOutput = log.args.output; + // TODO: Optimise by comparing the dicts. + const logOutputHash = hashStruct({ + types: compactTypes, + primaryType: "MandateOutput", + data: logOutput + }); + if (logOutputHash === expectedOutputHash) { + logIndex = log.logIndex; + break; + } + } + if (logIndex === -1) throw Error(`Could not find matching log`); - if (order.inputOracle === getOracle("polymer", sourceChainId)) { - let proof: string | undefined; - const polymerKey = `${Number(output.chainId)}:${Number(transactionReceipt.blockNumber)}:${Number(logIndex)}`; - let polymerIndex: number | undefined = Solver.polymerRequestIndexByLog.get(polymerKey); - for (const waitMs of [1000, 2000, 4000, 8000]) { - const response = await axios.post( - `/polymer`, - { - srcChainId: Number(output.chainId), - srcBlockNumber: Number(transactionReceipt.blockNumber), - globalLogIndex: Number(logIndex), - polymerIndex, - mainnet: mainnet - }, - { timeout: 15_000 } - ); - const dat = response.data as { - proof: undefined | string; - polymerIndex: number; - }; - polymerIndex = dat.polymerIndex; - if (polymerIndex !== undefined) { - Solver.polymerRequestIndexByLog.set(polymerKey, polymerIndex); - } - if (dat.proof) { - proof = dat.proof; - break; - } - await Solver.sleep(waitMs); - } - if (proof) { - if (preHook) await preHook(Number(sourceChainId)); + if (order.inputOracle === getOracle("polymer", sourceChainId)) { + let proof: string | undefined; + const polymerKey = `${Number(output.chainId)}:${Number(transactionReceipt.blockNumber)}:${Number(logIndex)}`; + let polymerIndex: number | undefined = Solver.polymerRequestIndexByLog.get(polymerKey); + for (const waitMs of [1000, 2000, 4000, 8000]) { + const response = await axios.post( + `/polymer`, + { + srcChainId: Number(output.chainId), + srcBlockNumber: Number(transactionReceipt.blockNumber), + globalLogIndex: Number(logIndex), + polymerIndex, + mainnet: mainnet + }, + { timeout: 15_000 } + ); + const dat = response.data as { + proof: undefined | string; + polymerIndex: number; + }; + polymerIndex = dat.polymerIndex; + if (polymerIndex !== undefined) { + Solver.polymerRequestIndexByLog.set(polymerKey, polymerIndex); + } + if (dat.proof) { + proof = dat.proof; + break; + } + await Solver.sleep(waitMs); + } + if (proof) { + if (preHook) await preHook(Number(sourceChainId)); - const transactionHash = await walletClient.writeContract({ - chain: getChain(sourceChainId), - account: account(), - address: order.inputOracle, - abi: POLYMER_ORACLE_ABI, - functionName: "receiveMessage", - args: [`0x${proof.replace("0x", "")}`] - }); + const transactionHash = await walletClient.writeContract({ + chain: getChain(sourceChainId), + account: account(), + address: order.inputOracle, + abi: POLYMER_ORACLE_ABI, + functionName: "receiveMessage", + args: [`0x${proof.replace("0x", "")}`] + }); - const result = await getClient(sourceChainId).waitForTransactionReceipt({ - hash: transactionHash, - timeout: 120_000, - pollingInterval: 2_000 - }); - await Solver.persistReceipt(sourceChainId, transactionHash, result); - if (postHook) await postHook(); - return result; - } - throw new Error( - `Polymer proof unavailable for output on ${output.chainId.toString()}. Try again after the fill attestation is indexed.` - ); - } else if (order.inputOracle === COIN_FILLER) { - const log = logs.find((log) => log.logIndex === logIndex)!; - if (preHook) await preHook(Number(sourceChainId)); - const transactionHash = await walletClient.writeContract({ - chain: getChain(sourceChainId), - account: account(), - address: order.inputOracle, - abi: COIN_FILLER_ABI, - functionName: "setAttestation", - args: [log.args.orderId, log.args.solver, log.args.timestamp, log.args.output] - }); + const result = await getClient(sourceChainId).waitForTransactionReceipt({ + hash: transactionHash, + timeout: 120_000, + pollingInterval: 2_000 + }); + await Solver.persistReceipt(sourceChainId, transactionHash, result); + if (postHook) await postHook(); + return result; + } + throw new Error( + `Polymer proof unavailable for output on ${output.chainId.toString()}. Try again after the fill attestation is indexed.` + ); + } else if (order.inputOracle === COIN_FILLER) { + const log = logs.find((log) => log.logIndex === logIndex)!; + if (preHook) await preHook(Number(sourceChainId)); + const transactionHash = await walletClient.writeContract({ + chain: getChain(sourceChainId), + account: account(), + address: order.inputOracle, + abi: COIN_FILLER_ABI, + functionName: "setAttestation", + args: [log.args.orderId, log.args.solver, log.args.timestamp, log.args.output] + }); - const result = await getClient(sourceChainId).waitForTransactionReceipt({ - hash: transactionHash, - timeout: 120_000, - pollingInterval: 2_000 - }); - await Solver.persistReceipt(sourceChainId, transactionHash, result); - if (postHook) await postHook(); - return result; - } - throw new Error( - `Unsupported input oracle ${order.inputOracle} for source chain ${Number(sourceChainId)}.` - ); - })(); + const result = await getClient(sourceChainId).waitForTransactionReceipt({ + hash: transactionHash, + timeout: 120_000, + pollingInterval: 2_000 + }); + await Solver.persistReceipt(sourceChainId, transactionHash, result); + if (postHook) await postHook(); + return result; + } + throw new Error( + `Unsupported input oracle ${order.inputOracle} for source chain ${Number(sourceChainId)}.` + ); + })(); - Solver.validationInflight.set(validationKey, validationPromise); - try { - return await validationPromise; - } finally { - Solver.validationInflight.delete(validationKey); - } - }; - } + Solver.validationInflight.set(validationKey, validationPromise); + try { + return await validationPromise; + } finally { + Solver.validationInflight.delete(validationKey); + } + }; + } - static claim( - walletClient: WC, - args: { - orderContainer: OrderContainer; - fillTransactionHashes: string[]; - sourceChainId: number | bigint; - }, - opts: { - preHook?: (chainId: number) => Promise; - postHook?: () => Promise; - account: () => `0x${string}`; - } - ) { - return async () => { - const { preHook, postHook, account } = opts; - const { orderContainer, fillTransactionHashes, sourceChainId } = args; - const { order, inputSettler } = orderContainer; - const intent = orderToIntent({ - inputSettler, - order - }); - if (fillTransactionHashes.length !== order.outputs.length) { - throw new Error( - `Fill transaction hash count (${fillTransactionHashes.length}) does not match output count (${order.outputs.length}).` - ); - } - for (let i = 0; i < fillTransactionHashes.length; i++) { - const hash = fillTransactionHashes[i]; - if (!hash || !hash.startsWith("0x") || hash.length !== 66) { - throw new Error(`Invalid fill tx hash at index ${i}: ${hash}`); - } - } - const transactionReceipts = await Promise.all( - fillTransactionHashes.map((fth, i) => - Solver.getReceiptCachedOrRpc(order.outputs[i].chainId, fth as `0x${string}`) - ) - ); - const blocks = await Promise.all( - transactionReceipts.map((r, i) => { - return getClient(order.outputs[i].chainId).getBlock({ - blockHash: r.blockHash - }); - }) - ); - const fillTimestamps = blocks.map((b) => b.timestamp); + static claim( + walletClient: WC, + args: { + orderContainer: OrderContainer; + fillTransactionHashes: string[]; + sourceChainId: number | bigint; + }, + opts: { + preHook?: (chainId: number) => Promise; + postHook?: () => Promise; + account: () => `0x${string}`; + } + ) { + return async () => { + const { preHook, postHook, account } = opts; + const { orderContainer, fillTransactionHashes, sourceChainId } = args; + const { order, inputSettler } = orderContainer; + const intent = orderToIntent({ + inputSettler, + order + }); + if (fillTransactionHashes.length !== order.outputs.length) { + throw new Error( + `Fill transaction hash count (${fillTransactionHashes.length}) does not match output count (${order.outputs.length}).` + ); + } + for (let i = 0; i < fillTransactionHashes.length; i++) { + const hash = fillTransactionHashes[i]; + if (!hash || !hash.startsWith("0x") || hash.length !== 66) { + throw new Error(`Invalid fill tx hash at index ${i}: ${hash}`); + } + } + const transactionReceipts = await Promise.all( + fillTransactionHashes.map((fth, i) => + Solver.getReceiptCachedOrRpc(order.outputs[i].chainId, fth as `0x${string}`) + ) + ); + const blocks = await Promise.all( + transactionReceipts.map((r, i) => { + return getClient(order.outputs[i].chainId).getBlock({ + blockHash: r.blockHash + }); + }) + ); + const fillTimestamps = blocks.map((b) => b.timestamp); - if (preHook) await preHook(Number(sourceChainId)); - const expectedChainId = Number(sourceChainId); - const connectedChainId = await walletClient.getChainId(); - if (connectedChainId !== expectedChainId) { - throw new Error( - `Wallet is on chain ${connectedChainId}, expected ${expectedChainId} before finalise` - ); - } + if (preHook) await preHook(Number(sourceChainId)); + const expectedChainId = Number(sourceChainId); + const connectedChainId = await walletClient.getChainId(); + if (connectedChainId !== expectedChainId) { + throw new Error( + `Wallet is on chain ${connectedChainId}, expected ${expectedChainId} before finalise` + ); + } - const solveParams = fillTimestamps.map((fillTimestamp) => { - return { - timestamp: Number(fillTimestamp), - solver: addressToBytes32(account()) - }; - }); + const solveParams = fillTimestamps.map((fillTimestamp) => { + return { + timestamp: Number(fillTimestamp), + solver: addressToBytes32(account()) + }; + }); - const transactionHash = await finaliseIntent({ - intent, - sourceChainId, - account: account(), - walletClient, - solveParams, - signatures: orderContainer - }); - if (!transactionHash) { - throw new Error( - `Finalise did not return a transaction hash for source chain ${Number(sourceChainId)}.` - ); - } - let result; - try { - result = await getClient(sourceChainId).waitForTransactionReceipt({ - hash: transactionHash, - timeout: 120_000, - pollingInterval: 2_000 - }); - } catch (error) { - throw new Error( - `Timed out waiting for finalise tx receipt on ${Number(sourceChainId)} for hash ${transactionHash}.`, - { cause: error as Error } - ); - } - await Solver.persistReceipt(sourceChainId, transactionHash, result); - if (postHook) await postHook(); - return result; - }; - } + const transactionHash = await finaliseIntent({ + intent, + sourceChainId, + account: account(), + walletClient, + solveParams, + signatures: orderContainer + }); + if (!transactionHash) { + throw new Error( + `Finalise did not return a transaction hash for source chain ${Number(sourceChainId)}.` + ); + } + let result; + try { + result = await getClient(sourceChainId).waitForTransactionReceipt({ + hash: transactionHash, + timeout: 120_000, + pollingInterval: 2_000 + }); + } catch (error) { + throw new Error( + `Timed out waiting for finalise tx receipt on ${Number(sourceChainId)} for hash ${transactionHash}.`, + { cause: error as Error } + ); + } + await Solver.persistReceipt(sourceChainId, transactionHash, result); + if (postHook) await postHook(); + return result; + }; + } } diff --git a/src/lib/libraries/token.ts b/src/lib/libraries/token.ts index b4ae255..d000190 100644 --- a/src/lib/libraries/token.ts +++ b/src/lib/libraries/token.ts @@ -5,59 +5,59 @@ import { ADDRESS_ZERO, clients, COMPACT } from "../config"; import { ResetPeriod, toId } from "@lifi/intent"; export async function getBalance( - user: `0x${string}` | undefined, - asset: `0x${string}`, - client: (typeof clients)[keyof typeof clients] + user: `0x${string}` | undefined, + asset: `0x${string}`, + client: (typeof clients)[keyof typeof clients] ) { - if (!user) return 0n; - if (asset === ADDRESS_ZERO) { - return client.getBalance({ - address: user, - blockTag: "latest" - }); - } else { - return client.readContract({ - address: asset, - abi: ERC20_ABI, - functionName: "balanceOf", - args: [user] - }); - } + if (!user) return 0n; + if (asset === ADDRESS_ZERO) { + return client.getBalance({ + address: user, + blockTag: "latest" + }); + } else { + return client.readContract({ + address: asset, + abi: ERC20_ABI, + functionName: "balanceOf", + args: [user] + }); + } } export function getAllowance(contract: `0x${string}`) { - return async ( - user: `0x${string}` | undefined, - asset: `0x${string}`, - client: (typeof clients)[keyof typeof clients] - ) => { - if (!user) return 0n; - if (asset == ADDRESS_ZERO) return maxUint256; - return client.readContract({ - address: asset, - abi: ERC20_ABI, - functionName: "allowance", - args: [user, contract] - }); - }; + return async ( + user: `0x${string}` | undefined, + asset: `0x${string}`, + client: (typeof clients)[keyof typeof clients] + ) => { + if (!user) return 0n; + if (asset == ADDRESS_ZERO) return maxUint256; + return client.readContract({ + address: asset, + abi: ERC20_ABI, + functionName: "allowance", + args: [user, contract] + }); + }; } export async function getCompactBalance( - user: `0x${string}` | undefined, - asset: `0x${string}`, - client: (typeof clients)[keyof typeof clients], - allocatorId: string + user: `0x${string}` | undefined, + asset: `0x${string}`, + client: (typeof clients)[keyof typeof clients], + allocatorId: string ) { - if (!user) return 0n; - const assetId = toId(true, ResetPeriod.OneDay, allocatorId, asset); - try { - return await client.readContract({ - address: COMPACT, - abi: COMPACT_ABI, - functionName: "balanceOf", - args: [user, assetId] - }); - } catch { - return 0n; - } + if (!user) return 0n; + const assetId = toId(true, ResetPeriod.OneDay, allocatorId, asset); + try { + return await client.readContract({ + address: COMPACT, + abi: COMPACT_ABI, + functionName: "balanceOf", + args: [user, assetId] + }); + } catch { + return 0n; + } } diff --git a/src/lib/migrations.json b/src/lib/migrations.json index bbd71d7..3699d71 100644 --- a/src/lib/migrations.json +++ b/src/lib/migrations.json @@ -1,40 +1,18 @@ [ - { - "sql": [ - "CREATE TABLE \"intents\" (\n\t\"id\" text PRIMARY KEY NOT NULL,\n\t\"order_id\" text NOT NULL,\n\t\"intent_type\" text NOT NULL,\n\t\"data\" text NOT NULL,\n\t\"created_at\" integer NOT NULL\n);\n" - ], - "bps": true, - "folderMillis": 1770712231202, - "hash": "3ec46f3cc562c5204f9e841d2ea2086d8994c80253445074b646b07900b30a9f" - }, - { - "sql": [ - "CREATE TABLE \"fill_transactions\" (\n\t\"id\" text PRIMARY KEY NOT NULL,\n\t\"output_hash\" text NOT NULL,\n\t\"tx_hash\" text NOT NULL,\n\tCONSTRAINT \"fill_transactions_output_hash_unique\" UNIQUE(\"output_hash\")\n);\n" - ], - "bps": true, - "folderMillis": 1770803119280, - "hash": "f963c9a03076fc9754b51c2850ad42f5edfdf19fb018a0616db37d935907b165" - }, - { - "sql": ["ALTER TABLE \"intents\" ALTER COLUMN \"created_at\" TYPE bigint;\n"], - "bps": true, - "folderMillis": 1770809000000, - "hash": "45484cce461ab6b6ac735465757bebec7d5bf488ed58c4288ebf1fd75d1881f5" - }, - { - "sql": [ - "CREATE UNIQUE INDEX IF NOT EXISTS \"intents_order_id_unique\" ON \"intents\" (\"order_id\");\n" - ], - "bps": true, - "folderMillis": 1770810000000, - "hash": "387946018137748e3a5dd66fca8a1da71ddabc4191a835a3254fad26c6b6d412" - }, - { - "sql": [ - "CREATE TABLE \"transaction_receipts\" (\n\t\"id\" text PRIMARY KEY NOT NULL,\n\t\"chain_id\" bigint NOT NULL,\n\t\"tx_hash\" text NOT NULL,\n\t\"receipt\" text NOT NULL,\n\t\"created_at\" bigint NOT NULL\n);\n" - ], - "bps": true, - "folderMillis": 1771060000000, - "hash": "8f048c5d64c44d6c89c970f44a52e1fdbaf3de8f4052145cfd90f50822ab95f1" - } + { + "sql": [ + "DROP TABLE IF EXISTS \"transaction_receipts\";\n", + "\nDROP TABLE IF EXISTS \"tokens\";\n", + "\nDROP TABLE IF EXISTS \"intents\";\n", + "\nDROP TABLE IF EXISTS \"fill_transactions\";\n", + "\nCREATE TABLE \"fill_transactions\" (\n\t\"id\" text PRIMARY KEY NOT NULL,\n\t\"output_hash\" text NOT NULL,\n\t\"tx_hash\" text NOT NULL,\n\tCONSTRAINT \"fill_transactions_output_hash_unique\" UNIQUE(\"output_hash\")\n);\n", + "\nCREATE TABLE \"intents\" (\n\t\"id\" text PRIMARY KEY NOT NULL,\n\t\"order_id\" text NOT NULL,\n\t\"intent_type\" text NOT NULL,\n\t\"data\" text NOT NULL,\n\t\"created_at\" bigint NOT NULL,\n\tCONSTRAINT \"intents_order_id_unique\" UNIQUE(\"order_id\")\n);\n", + "\nCREATE TABLE \"tokens\" (\n\t\"id\" text PRIMARY KEY NOT NULL,\n\t\"address\" text NOT NULL,\n\t\"name\" text NOT NULL,\n\t\"chain_id\" bigint NOT NULL,\n\t\"decimals\" bigint NOT NULL,\n\t\"is_manual\" boolean DEFAULT false NOT NULL,\n\t\"is_testnet\" boolean DEFAULT false NOT NULL\n);\n", + "\nCREATE TABLE \"transaction_receipts\" (\n\t\"id\" text PRIMARY KEY NOT NULL,\n\t\"chain_id\" bigint NOT NULL,\n\t\"tx_hash\" text NOT NULL,\n\t\"receipt\" text NOT NULL,\n\t\"created_at\" bigint NOT NULL\n);\n", + "\nCREATE UNIQUE INDEX \"tokens_address_chain_idx\" ON \"tokens\" USING btree (\"address\",\"chain_id\");\n" + ], + "bps": true, + "folderMillis": 1773159031946, + "hash": "b9ecf75ed8487a7746169ad49ce1564428a73e69f49e85cd702aaabbb03d72f6" + } ] diff --git a/src/lib/schema.ts b/src/lib/schema.ts index 9423261..a6fa802 100644 --- a/src/lib/schema.ts +++ b/src/lib/schema.ts @@ -1,25 +1,39 @@ -import { pgTable, text, bigint } from "drizzle-orm/pg-core"; +import { pgTable, text, bigint, boolean, uniqueIndex } from "drizzle-orm/pg-core"; export const intents = pgTable("intents", { - id: text("id").primaryKey(), - orderId: text("order_id").notNull().unique(), - intentType: text("intent_type").notNull(), - data: text("data").notNull(), - createdAt: bigint("created_at", { mode: "number" }).notNull() + id: text("id").primaryKey(), + orderId: text("order_id").notNull().unique(), + intentType: text("intent_type").notNull(), + data: text("data").notNull(), + createdAt: bigint("created_at", { mode: "number" }).notNull() }); export const fillTransactions = pgTable("fill_transactions", { - id: text("id").primaryKey(), - outputHash: text("output_hash").notNull().unique(), - txHash: text("tx_hash").notNull() + id: text("id").primaryKey(), + outputHash: text("output_hash").notNull().unique(), + txHash: text("tx_hash").notNull() }); export const transactionReceipts = pgTable("transaction_receipts", { - id: text("id").primaryKey(), - chainId: bigint("chain_id", { mode: "number" }).notNull(), - txHash: text("tx_hash").notNull(), - receipt: text("receipt").notNull(), - createdAt: bigint("created_at", { mode: "number" }).notNull() + id: text("id").primaryKey(), + chainId: bigint("chain_id", { mode: "number" }).notNull(), + txHash: text("tx_hash").notNull(), + receipt: text("receipt").notNull(), + createdAt: bigint("created_at", { mode: "number" }).notNull() }); -export const schema = { intents, fillTransactions, transactionReceipts }; +export const tokens = pgTable( + "tokens", + { + id: text("id").primaryKey(), + address: text("address").notNull(), + name: text("name").notNull(), + chainId: bigint("chain_id", { mode: "number" }).notNull(), + decimals: bigint("decimals", { mode: "number" }).notNull(), + isManual: boolean("is_manual").notNull().default(false), + isTestnet: boolean("is_testnet").notNull().default(false) + }, + (table) => [uniqueIndex("tokens_address_chain_idx").on(table.address, table.chainId)] +); + +export const schema = { intents, fillTransactions, transactionReceipts, tokens }; diff --git a/src/lib/screens/ConnectWallet.svelte b/src/lib/screens/ConnectWallet.svelte index e08b7e5..7461fea 100644 --- a/src/lib/screens/ConnectWallet.svelte +++ b/src/lib/screens/ConnectWallet.svelte @@ -1,49 +1,49 @@ -
- {#each connectors as connector (connector.id)} - - {/each} +
+ {#each connectors as connector (connector.id)} + + {/each} - {#if !walletConnectProjectId} -

- WalletConnect is disabled (missing `PUBLIC_WALLET_CONNECT_PROJECT_ID`). -

- {/if} - {#if errorMessage} -

{errorMessage}

- {/if} -
+ {#if !walletConnectProjectId} +

+ WalletConnect is disabled (missing `PUBLIC_WALLET_CONNECT_PROJECT_ID`). +

+ {/if} + {#if errorMessage} +

{errorMessage}

+ {/if} +
diff --git a/src/lib/screens/FillIntent.svelte b/src/lib/screens/FillIntent.svelte index 2147aa1..018d95a 100644 --- a/src/lib/screens/FillIntent.svelte +++ b/src/lib/screens/FillIntent.svelte @@ -1,211 +1,271 @@ -
- {#each sortOutputsByChain(orderContainer) as chainIdAndOutputs} - - - {#snippet action()} - {@const chainStatuses = chainIdAndOutputs[1].map( - (output) => fillStatuses[outputKey(output)] - )} - {#if chainStatuses.some((status) => status === undefined)} - - {:else} - v == BYTES32_ZERO) ? "default" : "muted"} - buttonFunction={chainStatuses.every((v) => v == BYTES32_ZERO) - ? fillWrapper( - chainIdAndOutputs[1], - Solver.fill( - store.walletClient, - { - orderContainer, - outputs: chainIdAndOutputs[1] - }, - { - preHook, - postHook: postHookScroll, - account - } - ) - ) - : async () => {}} - > - {#snippet name()} - Fill - {/snippet} - {#snippet awaiting()} - Waiting for transaction... - {/snippet} - - {/if} - {/snippet} - {#snippet chips()} - {#each chainIdAndOutputs[1] as output} - {@const filled = fillStatuses[outputKey(output)]} - - {/each} - {/snippet} - - - - {/each} -
+
+ +
+ {#each orderContainer.order.outputs as output} + {@const key = outputKey(output)} + {@const currentHash = store.fillTransactions[key]} +
+ + { + const value = (event.currentTarget as HTMLInputElement).value; + manualFillTxInputs[key] = value; + manualFillTxSaved[key] = false; + manualFillTxErrors[key] = ""; + }} + /> + + {#if manualFillTxErrors[key]} +
{manualFillTxErrors[key]}
+ {:else if manualFillTxSaved[key]} +
Saved
+ {/if} +
+ {/each} +
+
+ {#each sortOutputsByChain(orderContainer) as chainIdAndOutputs} + + + {#snippet action()} + {@const chainStatuses = chainIdAndOutputs[1].map( + (output) => fillStatuses[outputKey(output)] + )} + {#if chainStatuses.some((status) => status === undefined)} + + {:else} + v == BYTES32_ZERO) ? "default" : "muted"} + buttonFunction={chainStatuses.every((v) => v == BYTES32_ZERO) + ? fillWrapper( + chainIdAndOutputs[1], + Solver.fill( + store.walletClient, + { + orderContainer, + outputs: chainIdAndOutputs[1] + }, + { + preHook, + postHook: postHookScroll, + account + } + ) + ) + : async () => {}} + > + {#snippet name()} + Fill + {/snippet} + {#snippet awaiting()} + Waiting for transaction... + {/snippet} + + {/if} + {/snippet} + {#snippet chips()} + {#each chainIdAndOutputs[1] as output} + {@const filled = fillStatuses[outputKey(output)]} + + {/each} + {/snippet} + + + {/each} +
diff --git a/src/lib/screens/Finalise.svelte b/src/lib/screens/Finalise.svelte index 5dcf169..e3ec236 100644 --- a/src/lib/screens/Finalise.svelte +++ b/src/lib/screens/Finalise.svelte @@ -1,284 +1,284 @@ -
- {#if allFinalised} - - {/if} - {#if allFinalised} -
-
All inputs finalised
-
Intent fully solved.
-
- {/if} - {#each inputChains as inputChain} - - - {#snippet action()} - {@const isClaimedStatus = claimedByChain[inputChain.toString()]} - {#if isClaimedStatus === undefined} - - {:else if isClaimedStatus} - - {:else} - {@const fillTransactionHashes = fillTransactionHashesFor(orderContainer)} - {@const canClaim = fillTransactionHashes.every((hash) => isValidFillTxHash(hash))} - {#if !canClaim} - - {:else} - - {#snippet name()} - Claim - {/snippet} - {#snippet awaiting()} - Waiting for transaction... - {/snippet} - - {/if} - {/if} - {/snippet} - {#snippet chips()} - {#each getInputsForChain(orderContainer, inputChain) as input} - - {/each} - {/snippet} - - - {/each} -
+
+ {#if allFinalised} + + {/if} + {#if allFinalised} +
+
All inputs finalised
+
Intent fully solved.
+
+ {/if} + {#each inputChains as inputChain} + + + {#snippet action()} + {@const isClaimedStatus = claimedByChain[inputChain.toString()]} + {#if isClaimedStatus === undefined} + + {:else if isClaimedStatus} + + {:else} + {@const fillTransactionHashes = fillTransactionHashesFor(orderContainer)} + {@const canClaim = fillTransactionHashes.every((hash) => isValidFillTxHash(hash))} + {#if !canClaim} + + {:else} + + {#snippet name()} + Claim + {/snippet} + {#snippet awaiting()} + Waiting for transaction... + {/snippet} + + {/if} + {/if} + {/snippet} + {#snippet chips()} + {#each getInputsForChain(orderContainer, inputChain) as input} + + {/each} + {/snippet} + + + {/each} +
diff --git a/src/lib/screens/IntentDescription.svelte b/src/lib/screens/IntentDescription.svelte index 0c463f5..106fb04 100644 --- a/src/lib/screens/IntentDescription.svelte +++ b/src/lib/screens/IntentDescription.svelte @@ -1,33 +1,33 @@
-

Intent Description

-

- To fill an intent, you may need to execute up to 4 transactions. This intent requires 3. -

-
-
    -
  1. - -
  2. -
  3. - -
  4. -
  5. - -
  6. -
  7. - -
  8. -
+

Intent Description

+

+ To fill an intent, you may need to execute up to 4 transactions. This intent requires 3. +

+
+
    +
  1. + +
  2. +
  3. + +
  4. +
  5. + +
  6. +
  7. + +
  8. +
diff --git a/src/lib/screens/IntentList.svelte b/src/lib/screens/IntentList.svelte index f3cd53b..4f2c3a1 100644 --- a/src/lib/screens/IntentList.svelte +++ b/src/lib/screens/IntentList.svelte @@ -1,225 +1,225 @@ -
- { - if (event.key === "Enter") handleImport(); - }} - /> - -
- {#if importMessage} -
- {importMessage} -
- {/if} - -
- {#each activeRows as row (row.orderId)} -
- - -
- {/each} -
-
- -
- {#each expiredRows as row (row.orderId)} -
- - {#if expandedExpiredOrderId === row.orderId} - - {/if} -
- {/each} -
-
+
+ { + if (event.key === "Enter") handleImport(); + }} + /> + +
+ {#if importMessage} +
+ {importMessage} +
+ {/if} + +
+ {#each activeRows as row (row.orderId)} +
+ + +
+ {/each} +
+
+ +
+ {#each expiredRows as row (row.orderId)} +
+ + {#if expandedExpiredOrderId === row.orderId} + + {/if} +
+ {/each} +
+
diff --git a/src/lib/screens/IssueIntent.svelte b/src/lib/screens/IssueIntent.svelte index 167d326..96f0914 100644 --- a/src/lib/screens/IssueIntent.svelte +++ b/src/lib/screens/IssueIntent.svelte @@ -1,383 +1,400 @@ - {#if inputTokenSelectorActive} - - {/if} - {#if outputTokenSelectorActive} - - {/if} + {#if inputTokenSelectorActive} + + {/if} + {#if outputTokenSelectorActive} + + {/if} -
- - {#snippet headerRight()} -
- -
- {/snippet} -
-
-

You Pay

- {#each abstractInputs as input, i (input.name)} - - {/each} - {#if numInputChains > 1} -
Multichain
- {/if} - {#if sameChain} -
Same chain
- {/if} -
-
-
-
In
-
exchange
-
for
-
-
-
-

You Receive

- {#each store.outputTokens as outputToken, i (`${outputToken.token.chainId}-${outputToken.token.address}-${i}`)} - - {/each} -
-
-
+
+ + {#snippet headerRight()} +
+ +
+ {/snippet} +
+
+

You Pay

+ {#each abstractInputs as input, i (input.name)} + + {/each} + {#if numInputChains > 1} +
Multichain
+ {/if} + {#if sameChain} +
Same chain
+ {/if} +
+
+
+
In
+
exchange
+
for
+
+
+
+

You Receive

+ {#each store.outputTokens as outputToken, i (`${outputToken.token.chainId}-${outputToken.token.address}-${i}`)} + + {/each} +
+
+
- -
-
- Verifier - {#if sameChain} - - - - {:else} - - - - - {/if} -
-
- Exclusive - - -
-
-
+ +
+
+ Verifier + {#if sameChain} + + + + {:else} + + + + + {/if} +
+
+ Exclusive + + +
+
+
-
- {#if !true} - - {:else if !allowanceCheck} - - {#snippet name()} - Set allowance - {/snippet} - {#snippet awaiting()} - Waiting for transaction... - {/snippet} - - {:else} -
- {#if !balanceCheckWallet} - - {:else if store.intentType === "escrow"} - - {#snippet name()} - Execute Open - {/snippet} - {#snippet awaiting()} - Waiting for transaction... - {/snippet} - - {/if} - {#if store.intentType === "compact" && store.allocatorId !== POLYMER_ALLOCATOR} - {#if !balanceCheckCompact} - - {:else} - - {#snippet name()} - Sign Order - {/snippet} - {#snippet awaiting()} - Waiting for transaction... - {/snippet} - - {/if} - {/if} -
- {/if} -
- {#if numInputChains > 1 && store.intentType !== "compact"} -

- You'll need to open the order on {numInputChains} chains. Be prepared and do not interrupt the - process. -

- {/if} -
+
+ {#if !true} + + {:else if !allowanceCheck} + + {#snippet name()} + Set allowance + {/snippet} + {#snippet awaiting()} + Waiting for transaction... + {/snippet} + + {:else} +
+ {#if !balanceCheckWallet} + + {:else if store.intentType === "escrow"} + + {#snippet name()} + Execute Open + {/snippet} + {#snippet awaiting()} + Waiting for transaction... + {/snippet} + + {/if} + {#if store.intentType === "compact" && store.allocatorId !== POLYMER_ALLOCATOR} + {#if !balanceCheckCompact} + + {:else} + + {#snippet name()} + Sign Order + {/snippet} + {#snippet awaiting()} + Waiting for transaction... + {/snippet} + + {/if} + {/if} +
+ {/if} +
+ {#if numInputChains > 1 && store.intentType !== "compact"} +

+ You'll need to open the order on {numInputChains} chains. Be prepared and do not interrupt the + process. +

+ {/if} +
diff --git a/src/lib/screens/ManageDeposit.svelte b/src/lib/screens/ManageDeposit.svelte index ea1a1c2..d639ab4 100644 --- a/src/lib/screens/ManageDeposit.svelte +++ b/src/lib/screens/ManageDeposit.svelte @@ -1,189 +1,292 @@ -
- -
-

Network

- (store.mainnet = v === "mainnet")} - /> -
-
- -
-

Input Type

- (store.intentType = v as "compact" | "escrow")} - /> -
-
- {#if store.intentType === "compact"} - -
-
-

Allocator

- (store.allocatorId = v as typeof store.allocatorId)} - /> -
-
- - - - - - of - {#if (manageAssetAction === "withdraw" ? store.compactBalances : store.balances)[token.chainId]} - - {/if} - - {#each coinList(store.mainnet) as tkn, i} - - {/each} - -
-
- {#if manageAssetAction === "withdraw"} - - {#snippet name()} - Withdraw - {/snippet} - {#snippet awaiting()} - Waiting for transaction... - {/snippet} - - {:else if allowance < inputAmount} - - {#snippet name()} - Set allowance - {/snippet} - {#snippet awaiting()} - Waiting for transaction... - {/snippet} - - {:else} - - {#snippet name()} - Execute deposit - {/snippet} - {#snippet awaiting()} - Waiting for transaction... - {/snippet} - - {/if} -
-
-
- {:else} - -

- The Escrow Input Settler does not have any asset management. Skip to the next step to - select which assets to use. In the future, this place will be updated to show your pending - intents. -

-
- {/if} -
+
+ +
+
+

Network

+ (store.mainnet = v === "mainnet")} + /> +
+
+

Intent API

+ (store.useProductionApi = v === "auto" ? null : v === "production")} + /> +
+
+
+ +
+

Input Type

+ (store.intentType = v as "compact" | "escrow")} + /> +
+
+ {#if store.intentType === "compact"} + +
+
+

Allocator

+ (store.allocatorId = v as typeof store.allocatorId)} + /> +
+
+ + + + + + of + {#if (manageAssetAction === "withdraw" ? store.compactBalances : store.balances)[token.chainId]} + + {/if} + + {#each store.availableTokens as tkn, i} + + {/each} + +
+
+ {#if manageAssetAction === "withdraw"} + + {#snippet name()} + Withdraw + {/snippet} + {#snippet awaiting()} + Waiting for transaction... + {/snippet} + + {:else if allowance < inputAmount} + + {#snippet name()} + Set allowance + {/snippet} + {#snippet awaiting()} + Waiting for transaction... + {/snippet} + + {:else} + + {#snippet name()} + Execute deposit + {/snippet} + {#snippet awaiting()} + Waiting for transaction... + {/snippet} + + {/if} +
+
+
+ {/if} + +
+
+

Add Token

+ + + {#each chainList(store.mainnet) as chainName} + + {/each} + + {#if addTokenError} +

{addTokenError}

+ {/if} + { + addTokenError = ""; + if (!/^0x[0-9a-fA-F]{40}$/.test(newTokenAddress)) { + addTokenError = "Invalid address"; + return; + } + try { + const client = getClient(newTokenChainId); + const addr = newTokenAddress as `0x${string}`; + const decimals = await client.readContract({ + address: addr, + abi: erc20Abi, + functionName: "decimals" + }); + const symbol = await client.readContract({ + address: addr, + abi: erc20Abi, + functionName: "symbol" + }); + await store.addCustomToken({ + address: addr, + name: symbol.toLowerCase(), + chainId: newTokenChainId, + decimals: Number(decimals) + }); + newTokenAddress = ""; + } catch (e) { + addTokenError = e instanceof Error ? e.message : "Failed to fetch token"; + } + }} + > + {#snippet name()} + Add + {/snippet} + {#snippet awaiting()} + Fetching... + {/snippet} + +
+
+ {#each store.availableTokens as tkn} + {@const tokenKey = `${tkn.chainId}:${tkn.address.toLowerCase()}`} + {@const isManual = store.manualTokenKeys.has(tokenKey)} +
+ {tkn.name.toUpperCase()} + {printToken(tkn)} + {tkn.address.slice(0, 8)}… + {#if isManual} + + {/if} +
+ {/each} +
+
+
+
diff --git a/src/lib/screens/ReceiveMessage.svelte b/src/lib/screens/ReceiveMessage.svelte index a721f0f..c867b68 100644 --- a/src/lib/screens/ReceiveMessage.svelte +++ b/src/lib/screens/ReceiveMessage.svelte @@ -1,240 +1,227 @@ -
- {#each orderToIntent(orderContainer).inputChains() as inputChain} - - - {#snippet action()} -
Validate outputs
- {/snippet} - {#snippet chips()} - {#each orderContainer.order.outputs as output} - {@const status = validationStatuses[validationKey(inputChain, output)]} - {#if status === undefined} - - {:else} - {} - : Solver.validate( - store.walletClient, - { - output, - orderContainer, - fillTransactionHash: - store.fillTransactions[ - hashStruct({ - data: output, - types: compactTypes, - primaryType: "MandateOutput" - }) - ], - sourceChainId: Number(inputChain), - mainnet: store.mainnet - }, - { - preHook, - postHook: postHookRefreshValidate, - account - } - )} - > - {#snippet name()} - {formatTokenAmount( - output.amount, - getCoin({ address: output.token, chainId: output.chainId }).decimals - )} -   - {getCoin({ - address: output.token, - chainId: output.chainId - }).name.toUpperCase()} - {/snippet} - {#snippet awaiting()} - Validating... - {/snippet} - - {/if} - {/each} - {/snippet} -
-
- {/each} -
+
+ {#each orderToIntent(orderContainer).inputChains() as inputChain} + + + {#snippet action()} +
Validate outputs
+ {/snippet} + {#snippet chips()} + {#each orderContainer.order.outputs as output} + {@const status = validationStatuses[validationKey(inputChain, output)]} + {#if status === undefined} + + {:else} + {} + : Solver.validate( + store.walletClient, + { + output, + orderContainer, + fillTransactionHash: store.fillTransactions[outputKey(output)], + sourceChainId: Number(inputChain), + mainnet: store.mainnet + }, + { + preHook, + postHook: postHookRefreshValidate, + account + } + )} + > + {#snippet name()} + {formatTokenAmount( + output.amount, + getCoin({ address: output.token, chainId: output.chainId }).decimals + )} +   + {getCoin({ + address: output.token, + chainId: output.chainId + }).name.toUpperCase()} + {/snippet} + {#snippet awaiting()} + Validating... + {/snippet} + + {/if} + {/each} + {/snippet} +
+
+ {/each} +
diff --git a/src/lib/state.svelte.ts b/src/lib/state.svelte.ts index 145bc99..e6ce9ba 100644 --- a/src/lib/state.svelte.ts +++ b/src/lib/state.svelte.ts @@ -1,442 +1,573 @@ import type { OrderContainer } from "@lifi/intent"; import type { AppTokenContext } from "./appTypes"; import { - ALWAYS_OK_ALLOCATOR, - clientsById, - coinList, - COMPACT, - INPUT_SETTLER_COMPACT_LIFI, - INPUT_SETTLER_ESCROW_LIFI, - MULTICHAIN_INPUT_SETTLER_COMPACT, - MULTICHAIN_INPUT_SETTLER_ESCROW, - type availableAllocators, - type Token, - type Verifier, - type WC + ALWAYS_OK_ALLOCATOR, + clientsById, + coinList, + COMPACT, + INPUT_SETTLER_COMPACT_LIFI, + INPUT_SETTLER_ESCROW_LIFI, + MULTICHAIN_INPUT_SETTLER_COMPACT, + MULTICHAIN_INPUT_SETTLER_ESCROW, + isChainIdTestnet, + type availableAllocators, + type Token, + type Verifier, + type WC } from "./config"; import { getAllowance, getBalance, getCompactBalance } from "./libraries/token"; import { browser } from "$app/environment"; import { initDb, db } from "./db"; import { - intents, - fillTransactions as fillTransactionsTable, - transactionReceipts as transactionReceiptsTable + intents, + fillTransactions as fillTransactionsTable, + transactionReceipts as transactionReceiptsTable, + tokens as tokensTable } from "./schema"; -import { and, eq } from "drizzle-orm"; +import { and, eq, ne, notInArray } from "drizzle-orm"; import { orderToIntent } from "@lifi/intent"; import { getOrFetchRpc, invalidateRpcPrefix } from "./libraries/rpcCache"; import { - getCurrentConnection, - getCurrentWalletClient, - reconnectWallet, - type WalletConnection, - watchWalletConnection + getCurrentConnection, + getCurrentWalletClient, + reconnectWallet, + type WalletConnection, + watchWalletConnection } from "./utils/wagmi"; import { switchWalletChain } from "./utils/walletClientRuntime"; +function generateUUID(): string { + return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, (c) => { + const r = (Math.random() * 16) | 0; + const v = c === "x" ? r : (r & 0x3) | 0x8; + return v.toString(16); + }); +} + class Store { - mainnet = $state(true); - orders = $state([]); - - async loadOrdersFromDb() { - if (!browser) return; - if (!db) await initDb(); - if (!db) return; - const rows = await db!.select().from(intents); - this.orders = rows.map((r: any) => JSON.parse(r.data) as OrderContainer); - } - - async saveOrderToDb(order: OrderContainer) { - if (!browser) return; - if (!db) await initDb(); - const orderId = orderToIntent(order).orderId(); - const now = Math.floor(Date.now() / 1000); - const id = - (order as any).id ?? (typeof crypto !== "undefined" ? crypto.randomUUID() : String(now)); - const intentType = (order as any).intentType ?? "escrow"; - const data = JSON.stringify(order); - if (db) { - try { - try { - await db - .insert(intents) - .values({ - id, - orderId, - intentType, - data, - createdAt: now - }) - .onConflictDoUpdate({ - target: intents.orderId, - set: { intentType, data } - }); - } catch (_error) { - const existing = await db.select().from(intents).where(eq(intents.orderId, orderId)); - if (existing.length > 0) { - await db.update(intents).set({ intentType, data }).where(eq(intents.orderId, orderId)); - } else { - await db.insert(intents).values({ - id, - orderId, - intentType, - data, - createdAt: now - }); - } - } - } catch (error) { - console.warn("saveOrderToDb db write failed", { orderId, error }); - } - } - const idx = this.orders.findIndex((o) => orderToIntent(o).orderId() === orderId); - if (idx >= 0) this.orders[idx] = order; - else this.orders.push(order); - } - - async deleteOrderFromDb(orderId: string) { - if (!browser) return; - if (!db) await initDb(); - if (!db) return; - await db!.delete(intents).where(eq(intents.orderId, orderId)); - await this.loadOrdersFromDb(); - } - - async loadFillTransactionsFromDb() { - if (!browser) return; - if (!db) await initDb(); - if (!db) return; - const rows = await db!.select().from(fillTransactionsTable); - const loaded: { [outputId: string]: `0x${string}` } = {}; - for (const row of rows) loaded[row.outputHash] = row.txHash as `0x${string}`; - this.fillTransactions = loaded; - } - - async saveFillTransaction(outputHash: string, txHash: `0x${string}`) { - if (!browser) return; - if (!db) await initDb(); - if (!db) return; - const existing = await db! - .select() - .from(fillTransactionsTable) - .where(eq(fillTransactionsTable.outputHash, outputHash)); - if (existing.length > 0) { - await db! - .update(fillTransactionsTable) - .set({ txHash }) - .where(eq(fillTransactionsTable.outputHash, outputHash)); - } else { - await db!.insert(fillTransactionsTable).values({ - id: typeof crypto !== "undefined" ? crypto.randomUUID() : String(Date.now()), - outputHash, - txHash - }); - } - } - - async loadTransactionReceiptsFromDb() { - if (!browser) return; - if (!db) await initDb(); - if (!db) return; - const rows = await db!.select().from(transactionReceiptsTable); - const loaded: Record = {}; - for (const row of rows) { - loaded[`${row.chainId}:${row.txHash}`] = row.receipt; - } - this.transactionReceipts = loaded; - } - - async saveTransactionReceipt(chainId: number | bigint, txHash: `0x${string}`, receipt: unknown) { - if (!browser) return; - if (!db) await initDb(); - if (!db) return; - const chainIdNumber = Number(chainId); - const serializedReceipt = JSON.stringify(receipt, (_key, value) => - typeof value === "bigint" ? value.toString() : value - ); - const existing = await db! - .select() - .from(transactionReceiptsTable) - .where( - and( - eq(transactionReceiptsTable.chainId, chainIdNumber), - eq(transactionReceiptsTable.txHash, txHash) - ) - ); - if (existing.length > 0) { - await db! - .update(transactionReceiptsTable) - .set({ receipt: serializedReceipt }) - .where( - and( - eq(transactionReceiptsTable.chainId, chainIdNumber), - eq(transactionReceiptsTable.txHash, txHash) - ) - ); - } else { - await db!.insert(transactionReceiptsTable).values({ - id: typeof crypto !== "undefined" ? crypto.randomUUID() : String(Date.now()), - chainId: chainIdNumber, - txHash, - receipt: serializedReceipt, - createdAt: Math.floor(Date.now() / 1000) - }); - } - this.transactionReceipts[`${chainIdNumber}:${txHash}`] = serializedReceipt; - } - - getTransactionReceipt(chainId: number | bigint, txHash: `0x${string}`) { - const serialized = this.transactionReceipts[`${Number(chainId)}:${txHash}`]; - if (!serialized) return undefined; - try { - return JSON.parse(serialized) as unknown; - } catch (error) { - console.warn("parse cached transaction receipt failed", { - chainId: Number(chainId), - txHash, - error - }); - return undefined; - } - } - - walletConnection = $state(getCurrentConnection()); - connectedAccount = $derived( - this.walletConnection.status === "connected" - ? { address: this.walletConnection.address } - : undefined - ); - walletClient = $state(undefined as unknown as WC); - _unwatchWalletConnection?: () => void; - - inputTokens = $state([]); - outputTokens = $state([]); - fillTransactions = $state<{ [outputId: string]: `0x${string}` }>({}); - transactionReceipts = $state>({}); - - refreshEpoch = $state(0); - rpcRefreshMs = 45_000; - _rpcRefreshHandle?: ReturnType; - - balances = $derived.by(() => { - this.refreshEpoch; - const account = this.connectedAccount?.address; - return this.mapOverCoinsCached({ - bucket: "balance", - ttlMs: 30_000, - isMainnet: this.mainnet, - scopeKey: account ?? "none", - fetcher: (asset, client) => getBalance(account, asset, client) - }); - }); - - allowances = $derived.by(() => { - this.refreshEpoch; - const account = this.connectedAccount?.address; - const spender = - this.inputSettler === INPUT_SETTLER_COMPACT_LIFI || - this.inputSettler === MULTICHAIN_INPUT_SETTLER_COMPACT - ? COMPACT - : this.inputSettler; - return this.mapOverCoinsCached({ - bucket: "allowance", - ttlMs: 60_000, - isMainnet: this.mainnet, - scopeKey: `${account ?? "none"}:${spender}`, - fetcher: (asset, client) => getAllowance(spender)(account, asset, client) - }); - }); - - compactBalances = $derived.by(() => { - this.refreshEpoch; - const account = this.connectedAccount?.address; - const allocatorId = this.allocatorId; - return this.mapOverCoinsCached({ - bucket: "compact", - ttlMs: 60_000, - isMainnet: this.mainnet, - scopeKey: `${account ?? "none"}:${allocatorId}`, - fetcher: (asset, client) => getCompactBalance(account, asset, client, allocatorId) - }); - }); - - multichain = $derived([...new Set(this.inputTokens.map((i) => i.token.chainId))].length > 1); - - inputSettler = $derived.by(() => { - if (this.intentType === "escrow" && !this.multichain) return INPUT_SETTLER_ESCROW_LIFI; - if (this.intentType === "escrow" && this.multichain) return MULTICHAIN_INPUT_SETTLER_ESCROW; - if (this.intentType === "compact" && !this.multichain) return INPUT_SETTLER_COMPACT_LIFI; - if (this.intentType === "compact" && this.multichain) return MULTICHAIN_INPUT_SETTLER_COMPACT; - return INPUT_SETTLER_ESCROW_LIFI; - }); - intentType = $state<"escrow" | "compact">("escrow"); - allocatorId = $state(ALWAYS_OK_ALLOCATOR); - verifier = $state("polymer"); - exclusiveFor: string = $state(""); - useExclusiveForQuoteRequest = $state(false); - - invalidateWalletReadCache(scope: "all" | "balance" | "allowance" | "compact" = "all") { - if (scope === "all" || scope === "balance") invalidateRpcPrefix("balance:"); - if (scope === "all" || scope === "allowance") invalidateRpcPrefix("allowance:"); - if (scope === "all" || scope === "compact") invalidateRpcPrefix("compact:"); - } - - refreshWalletReads(opts?: { - force?: boolean; - scope?: "all" | "balance" | "allowance" | "compact"; - }) { - const force = opts?.force ?? false; - const scope = opts?.scope ?? "all"; - if (force) this.invalidateWalletReadCache(scope); - this.refreshEpoch += 1; - } - - refreshTokenBalance(token: Token, force = true) { - if (force) { - invalidateRpcPrefix( - `balance:${this.mainnet ? "mainnet" : "testnet"}:${token.chainId}:${token.address}:` - ); - } - this.refreshEpoch += 1; - } - - refreshTokenAllowance(token: Token, force = true) { - if (force) { - invalidateRpcPrefix( - `allowance:${this.mainnet ? "mainnet" : "testnet"}:${token.chainId}:${token.address}:` - ); - } - this.refreshEpoch += 1; - } - - refreshCompactBalance(token: Token, force = true) { - if (force) { - invalidateRpcPrefix( - `compact:${this.mainnet ? "mainnet" : "testnet"}:${token.chainId}:${token.address}:` - ); - } - this.refreshEpoch += 1; - } - - forceUpdate = () => { - this.refreshWalletReads({ force: true, scope: "all" }); - }; - - syncIntervalMs = 5000; - _syncHandle?: ReturnType; - - startSync(intervalMs?: number) { - this.stopSync(); - this._syncHandle = setInterval(() => { - this.loadOrdersFromDb().catch((e) => console.warn("sync error", e)); - }, intervalMs ?? this.syncIntervalMs); - } - - stopSync() { - if (this._syncHandle) { - clearInterval(this._syncHandle); - this._syncHandle = undefined; - } - } - - startRpcRefreshLoop(intervalMs?: number) { - if (!browser) return; - this.stopRpcRefreshLoop(); - this._rpcRefreshHandle = setInterval(() => { - this.refreshWalletReads(); - }, intervalMs ?? this.rpcRefreshMs); - } - - stopRpcRefreshLoop() { - if (this._rpcRefreshHandle) { - clearInterval(this._rpcRefreshHandle); - this._rpcRefreshHandle = undefined; - } - } - - async syncWalletClient() { - if (this.walletConnection.status !== "connected") { - this.walletClient = undefined as unknown as WC; - return; - } - try { - this.walletClient = (await getCurrentWalletClient()) as unknown as WC; - } catch (error) { - console.warn("getCurrentWalletClient failed", error); - this.walletClient = undefined as unknown as WC; - } - } - - async setWalletToCorrectChain(chainId: number | bigint) { - try { - return await switchWalletChain(this.walletClient, Number(chainId)); - } catch (error) { - console.warn( - `Wallet does not support switchChain or failed to switch chain: ${Number(chainId)}`, - error - ); - return undefined; - } - } - - mapOverCoinsCached(opts: { - bucket: "balance" | "allowance" | "compact"; - ttlMs: number; - isMainnet: boolean; - scopeKey: string; - fetcher: ( - asset: `0x${string}`, - client: (typeof clientsById)[keyof typeof clientsById] - ) => Promise; - }) { - const { bucket, ttlMs, isMainnet, scopeKey, fetcher } = opts; - const resolved: Record>> = {}; - for (const token of coinList(isMainnet)) { - if (!resolved[token.chainId]) resolved[token.chainId] = {}; - const key = `${bucket}:${isMainnet ? "mainnet" : "testnet"}:${token.chainId}:${token.address}:${scopeKey}`; - resolved[token.chainId][token.address] = getOrFetchRpc( - key, - () => fetcher(token.address, clientsById[token.chainId]), - { ttlMs } - ); - } - return resolved; - } - - dbReady: Promise | undefined; - - constructor() { - this.inputTokens = [{ token: coinList(this.mainnet)[0], amount: 1000000n }]; - this.outputTokens = [{ token: coinList(this.mainnet)[1], amount: 1000000n }]; - - if (browser) { - reconnectWallet() - .catch((error) => console.warn("reconnectWallet failed", error)) - .finally(() => { - this.walletConnection = getCurrentConnection(); - this.syncWalletClient().catch((error) => console.warn("syncWalletClient failed", error)); - }); - - this._unwatchWalletConnection = watchWalletConnection((connection) => { - this.walletConnection = connection; - this.syncWalletClient().catch((error) => console.warn("syncWalletClient failed", error)); - }); - } - - this.startRpcRefreshLoop(); - - this.dbReady = browser - ? Promise.all([ - this.loadOrdersFromDb().catch((e) => console.warn("loadOrdersFromDb error", e)), - this.loadFillTransactionsFromDb().catch((e) => - console.warn("loadFillTransactionsFromDb error", e) - ), - this.loadTransactionReceiptsFromDb().catch((e) => - console.warn("loadTransactionReceiptsFromDb error", e) - ) - ]).then(() => {}) - : Promise.resolve(); - } + mainnet = $state(true); + useProductionApi = $state(null); + orders = $state([]); + + async loadOrdersFromDb() { + if (!browser) return; + if (!db) await initDb(); + if (!db) return; + const rows = await db!.select().from(intents); + this.orders = rows.map((r: any) => JSON.parse(r.data) as OrderContainer); + } + + async saveOrderToDb(order: OrderContainer) { + if (!browser) return; + if (!db) await initDb(); + const orderId = orderToIntent(order).orderId(); + const now = Math.floor(Date.now() / 1000); + const id = (order as any).id ?? generateUUID(); + const intentType = (order as any).intentType ?? "escrow"; + const data = JSON.stringify(order); + if (db) { + try { + try { + await db + .insert(intents) + .values({ + id, + orderId, + intentType, + data, + createdAt: now + }) + .onConflictDoUpdate({ + target: intents.orderId, + set: { intentType, data } + }); + } catch (_error) { + const existing = await db.select().from(intents).where(eq(intents.orderId, orderId)); + if (existing.length > 0) { + await db.update(intents).set({ intentType, data }).where(eq(intents.orderId, orderId)); + } else { + await db.insert(intents).values({ + id, + orderId, + intentType, + data, + createdAt: now + }); + } + } + } catch (error) { + console.warn("saveOrderToDb db write failed", { orderId, error }); + } + } + const idx = this.orders.findIndex((o) => orderToIntent(o).orderId() === orderId); + if (idx >= 0) this.orders[idx] = order; + else this.orders.push(order); + } + + async deleteOrderFromDb(orderId: string) { + if (!browser) return; + if (!db) await initDb(); + if (!db) return; + await db!.delete(intents).where(eq(intents.orderId, orderId)); + await this.loadOrdersFromDb(); + } + + async loadFillTransactionsFromDb() { + if (!browser) return; + if (!db) await initDb(); + if (!db) return; + const rows = await db!.select().from(fillTransactionsTable); + const loaded: { [outputId: string]: `0x${string}` } = {}; + for (const row of rows) loaded[row.outputHash] = row.txHash as `0x${string}`; + this.fillTransactions = loaded; + } + + async saveFillTransaction(outputHash: string, txHash: `0x${string}`) { + if (!browser) return; + if (!db) await initDb(); + if (!db) return; + const existing = await db! + .select() + .from(fillTransactionsTable) + .where(eq(fillTransactionsTable.outputHash, outputHash)); + if (existing.length > 0) { + await db! + .update(fillTransactionsTable) + .set({ txHash }) + .where(eq(fillTransactionsTable.outputHash, outputHash)); + } else { + await db!.insert(fillTransactionsTable).values({ + id: generateUUID(), + outputHash, + txHash + }); + } + } + + async loadTransactionReceiptsFromDb() { + if (!browser) return; + if (!db) await initDb(); + if (!db) return; + const rows = await db!.select().from(transactionReceiptsTable); + const loaded: Record = {}; + for (const row of rows) { + loaded[`${row.chainId}:${row.txHash}`] = row.receipt; + } + this.transactionReceipts = loaded; + } + + async saveTransactionReceipt(chainId: number | bigint, txHash: `0x${string}`, receipt: unknown) { + if (!browser) return; + if (!db) await initDb(); + if (!db) return; + const chainIdNumber = Number(chainId); + const serializedReceipt = JSON.stringify(receipt, (_key, value) => + typeof value === "bigint" ? value.toString() : value + ); + const existing = await db! + .select() + .from(transactionReceiptsTable) + .where( + and( + eq(transactionReceiptsTable.chainId, chainIdNumber), + eq(transactionReceiptsTable.txHash, txHash) + ) + ); + if (existing.length > 0) { + await db! + .update(transactionReceiptsTable) + .set({ receipt: serializedReceipt }) + .where( + and( + eq(transactionReceiptsTable.chainId, chainIdNumber), + eq(transactionReceiptsTable.txHash, txHash) + ) + ); + } else { + await db!.insert(transactionReceiptsTable).values({ + id: typeof crypto !== "undefined" ? crypto.randomUUID() : String(Date.now()), + chainId: chainIdNumber, + txHash, + receipt: serializedReceipt, + createdAt: Math.floor(Date.now() / 1000) + }); + } + this.transactionReceipts[`${chainIdNumber}:${txHash}`] = serializedReceipt; + } + + getTransactionReceipt(chainId: number | bigint, txHash: `0x${string}`) { + const serialized = this.transactionReceipts[`${Number(chainId)}:${txHash}`]; + if (!serialized) return undefined; + try { + return JSON.parse(serialized) as unknown; + } catch (error) { + console.warn("parse cached transaction receipt failed", { + chainId: Number(chainId), + txHash, + error + }); + return undefined; + } + } + + walletConnection = $state(getCurrentConnection()); + connectedAccount = $derived( + this.walletConnection.status === "connected" + ? { address: this.walletConnection.address } + : undefined + ); + walletClient = $state(undefined as unknown as WC); + _unwatchWalletConnection?: () => void; + + availableTokens = $state([...(coinList(true) as readonly Token[])]); + manualTokenKeys = $state>(new Set()); + inputTokens = $state([]); + outputTokens = $state([]); + fillTransactions = $state<{ [outputId: string]: `0x${string}` }>({}); + transactionReceipts = $state>({}); + + refreshEpoch = $state(0); + rpcRefreshMs = 45_000; + _rpcRefreshHandle?: ReturnType; + + balances = $derived.by(() => { + this.refreshEpoch; + const account = this.connectedAccount?.address; + return this.mapOverCoinsCached({ + bucket: "balance", + ttlMs: 30_000, + isMainnet: this.mainnet, + scopeKey: account ?? "none", + fetcher: (asset, client) => getBalance(account, asset, client) + }); + }); + + allowances = $derived.by(() => { + this.refreshEpoch; + const account = this.connectedAccount?.address; + const spender = + this.inputSettler === INPUT_SETTLER_COMPACT_LIFI || + this.inputSettler === MULTICHAIN_INPUT_SETTLER_COMPACT + ? COMPACT + : this.inputSettler; + return this.mapOverCoinsCached({ + bucket: "allowance", + ttlMs: 60_000, + isMainnet: this.mainnet, + scopeKey: `${account ?? "none"}:${spender}`, + fetcher: (asset, client) => getAllowance(spender)(account, asset, client) + }); + }); + + compactBalances = $derived.by(() => { + this.refreshEpoch; + const account = this.connectedAccount?.address; + const allocatorId = this.allocatorId; + return this.mapOverCoinsCached({ + bucket: "compact", + ttlMs: 60_000, + isMainnet: this.mainnet, + scopeKey: `${account ?? "none"}:${allocatorId}`, + fetcher: (asset, client) => getCompactBalance(account, asset, client, allocatorId) + }); + }); + + multichain = $derived([...new Set(this.inputTokens.map((i) => i.token.chainId))].length > 1); + + inputSettler = $derived.by(() => { + if (this.intentType === "escrow" && !this.multichain) return INPUT_SETTLER_ESCROW_LIFI; + if (this.intentType === "escrow" && this.multichain) return MULTICHAIN_INPUT_SETTLER_ESCROW; + if (this.intentType === "compact" && !this.multichain) return INPUT_SETTLER_COMPACT_LIFI; + if (this.intentType === "compact" && this.multichain) return MULTICHAIN_INPUT_SETTLER_COMPACT; + return INPUT_SETTLER_ESCROW_LIFI; + }); + intentType = $state<"escrow" | "compact">("escrow"); + allocatorId = $state(ALWAYS_OK_ALLOCATOR); + verifier = $state("polymer"); + exclusiveFor: string = $state(""); + useExclusiveForQuoteRequest = $state(false); + + invalidateWalletReadCache(scope: "all" | "balance" | "allowance" | "compact" = "all") { + if (scope === "all" || scope === "balance") invalidateRpcPrefix("balance:"); + if (scope === "all" || scope === "allowance") invalidateRpcPrefix("allowance:"); + if (scope === "all" || scope === "compact") invalidateRpcPrefix("compact:"); + } + + refreshWalletReads(opts?: { + force?: boolean; + scope?: "all" | "balance" | "allowance" | "compact"; + }) { + const force = opts?.force ?? false; + const scope = opts?.scope ?? "all"; + if (force) this.invalidateWalletReadCache(scope); + this.refreshEpoch += 1; + } + + refreshTokenBalance(token: Token, force = true) { + if (force) { + invalidateRpcPrefix( + `balance:${this.mainnet ? "mainnet" : "testnet"}:${token.chainId}:${token.address}:` + ); + } + this.refreshEpoch += 1; + } + + refreshTokenAllowance(token: Token, force = true) { + if (force) { + invalidateRpcPrefix( + `allowance:${this.mainnet ? "mainnet" : "testnet"}:${token.chainId}:${token.address}:` + ); + } + this.refreshEpoch += 1; + } + + refreshCompactBalance(token: Token, force = true) { + if (force) { + invalidateRpcPrefix( + `compact:${this.mainnet ? "mainnet" : "testnet"}:${token.chainId}:${token.address}:` + ); + } + this.refreshEpoch += 1; + } + + forceUpdate = () => { + this.refreshWalletReads({ force: true, scope: "all" }); + }; + + syncIntervalMs = 5000; + _syncHandle?: ReturnType; + + startSync(intervalMs?: number) { + this.stopSync(); + this._syncHandle = setInterval(() => { + this.loadOrdersFromDb().catch((e) => console.warn("sync error", e)); + }, intervalMs ?? this.syncIntervalMs); + } + + stopSync() { + if (this._syncHandle) { + clearInterval(this._syncHandle); + this._syncHandle = undefined; + } + } + + startRpcRefreshLoop(intervalMs?: number) { + if (!browser) return; + this.stopRpcRefreshLoop(); + this._rpcRefreshHandle = setInterval(() => { + this.refreshWalletReads(); + }, intervalMs ?? this.rpcRefreshMs); + } + + stopRpcRefreshLoop() { + if (this._rpcRefreshHandle) { + clearInterval(this._rpcRefreshHandle); + this._rpcRefreshHandle = undefined; + } + } + + private async loadTokensFromDb(mainnet: boolean) { + if (!browser) return; + if (!db) await initDb(); + if (!db) return; + const rows = await db!.select().from(tokensTable).where(eq(tokensTable.isTestnet, !mainnet)); + this.availableTokens = rows.map((r) => ({ + address: r.address as `0x${string}`, + name: r.name, + chainId: r.chainId, + decimals: r.decimals + })); + this.manualTokenKeys = new Set( + rows.filter((r) => r.isManual).map((r) => `${r.chainId}:${r.address.toLowerCase()}`) + ); + } + + async syncConfiguredTokens() { + if (!browser) return; + if (!db) await initDb(); + if (!db) return; + + const mainnetTokens = [...(coinList(true) as readonly Token[])]; + const testnetTokens = [...(coinList(false) as readonly Token[])]; + const allConfigured = [ + ...mainnetTokens.map((t) => ({ ...t, isTestnet: false })), + ...testnetTokens.map((t) => ({ ...t, isTestnet: true })) + ]; + + // Upsert all configured tokens + for (const t of allConfigured) { + const id = `${t.chainId}:${t.address.toLowerCase()}`; + try { + await db! + .insert(tokensTable) + .values({ + id, + address: t.address, + name: t.name, + chainId: t.chainId, + decimals: t.decimals, + isManual: false, + isTestnet: t.isTestnet + }) + .onConflictDoUpdate({ + target: tokensTable.id, + set: { name: t.name, decimals: t.decimals, isTestnet: t.isTestnet, isManual: false } + }); + } catch (_e) { + // ignore individual upsert errors + } + } + + // Delete stale non-manual tokens not in current configured lists + const configuredIds = allConfigured.map((t) => `${t.chainId}:${t.address.toLowerCase()}`); + try { + await db! + .delete(tokensTable) + .where(and(eq(tokensTable.isManual, false), notInArray(tokensTable.id, configuredIds))); + } catch (_e) { + // ignore + } + + await this.loadTokensFromDb(this.mainnet); + } + + async addCustomToken(token: Token) { + if (!browser) return; + if (!db) await initDb(); + if (!db) return; + const isTestnet = isChainIdTestnet(token.chainId); + const id = `${token.chainId}:${token.address.toLowerCase()}`; + try { + await db! + .insert(tokensTable) + .values({ + id, + address: token.address, + name: token.name, + chainId: token.chainId, + decimals: token.decimals, + isManual: true, + isTestnet + }) + .onConflictDoUpdate({ + target: tokensTable.id, + set: { name: token.name, decimals: token.decimals, isManual: true } + }); + } catch (_e) { + // fallback update + await db! + .update(tokensTable) + .set({ name: token.name, decimals: token.decimals, isManual: true }) + .where(eq(tokensTable.id, id)); + } + await this.loadTokensFromDb(this.mainnet); + } + + async removeCustomToken(address: string, chainId: number) { + if (!browser) return; + if (!db) await initDb(); + if (!db) return; + await db! + .delete(tokensTable) + .where( + and( + eq(tokensTable.address, address), + eq(tokensTable.chainId, chainId), + eq(tokensTable.isManual, true) + ) + ); + await this.loadTokensFromDb(this.mainnet); + } + + async syncTokensForNetwork(mainnet: boolean) { + await this.loadTokensFromDb(mainnet); + } + + async syncWalletClient() { + if (this.walletConnection.status !== "connected") { + this.walletClient = undefined as unknown as WC; + return; + } + try { + this.walletClient = (await getCurrentWalletClient()) as unknown as WC; + } catch (error) { + console.warn("getCurrentWalletClient failed", error); + this.walletClient = undefined as unknown as WC; + } + } + + async setWalletToCorrectChain(chainId: number | bigint) { + try { + return await switchWalletChain(this.walletClient, Number(chainId)); + } catch (error) { + console.warn( + `Wallet does not support switchChain or failed to switch chain: ${Number(chainId)}`, + error + ); + return undefined; + } + } + + mapOverCoinsCached(opts: { + bucket: "balance" | "allowance" | "compact"; + ttlMs: number; + isMainnet: boolean; + scopeKey: string; + fetcher: ( + asset: `0x${string}`, + client: (typeof clientsById)[keyof typeof clientsById] + ) => Promise; + }) { + const { bucket, ttlMs, isMainnet, scopeKey, fetcher } = opts; + const resolved: Record>> = {}; + for (const token of this.availableTokens) { + if (!resolved[token.chainId]) resolved[token.chainId] = {}; + const key = `${bucket}:${isMainnet ? "mainnet" : "testnet"}:${token.chainId}:${token.address}:${scopeKey}`; + resolved[token.chainId][token.address] = getOrFetchRpc( + key, + () => fetcher(token.address, clientsById[token.chainId]), + { ttlMs } + ); + } + return resolved; + } + + dbReady: Promise | undefined; + + constructor() { + this.availableTokens = [...(coinList(this.mainnet) as readonly Token[])]; + this.inputTokens = [{ token: this.availableTokens[0], amount: 1000000n }]; + this.outputTokens = [{ token: this.availableTokens[1], amount: 1000000n }]; + + if (browser) { + reconnectWallet() + .catch((error) => console.warn("reconnectWallet failed", error)) + .finally(() => { + this.walletConnection = getCurrentConnection(); + this.syncWalletClient().catch((error) => console.warn("syncWalletClient failed", error)); + }); + + this._unwatchWalletConnection = watchWalletConnection((connection) => { + this.walletConnection = connection; + this.syncWalletClient().catch((error) => console.warn("syncWalletClient failed", error)); + }); + } + + this.startRpcRefreshLoop(); + + this.dbReady = browser + ? Promise.all([ + this.loadOrdersFromDb().catch((e) => console.warn("loadOrdersFromDb error", e)), + this.loadFillTransactionsFromDb().catch((e) => + console.warn("loadFillTransactionsFromDb error", e) + ), + this.loadTransactionReceiptsFromDb().catch((e) => + console.warn("loadTransactionReceiptsFromDb error", e) + ), + this.syncConfiguredTokens().catch((e) => console.warn("syncConfiguredTokens error", e)) + ]).then(() => {}) + : Promise.resolve(); + } } export const store = new Store(); diff --git a/src/lib/utils/wagmi.ts b/src/lib/utils/wagmi.ts index a02bb41..0b665cc 100644 --- a/src/lib/utils/wagmi.ts +++ b/src/lib/utils/wagmi.ts @@ -1,103 +1,103 @@ import { browser } from "$app/environment"; import { env } from "$env/dynamic/public"; import { - connect, - createConfig, - disconnect, - getConnection, - getConnectors, - http, - reconnect, - watchConnection + connect, + createConfig, + disconnect, + getConnection, + getConnectors, + http, + reconnect, + watchConnection } from "@wagmi/core"; import { injected, metaMask, walletConnect } from "@wagmi/connectors"; import { createWalletClient, custom, type Chain, type EIP1193Provider } from "viem"; import { chainMap } from "../config"; const APP_METADATA = { - name: "Open Intents Framework Demo", - description: "A demo website showcasing using the Open Intents Framework. Built by LIFI.", - url: "https://lintent.org", - icons: ["https://lintent.org/favicon.ico"] + name: "Open Intents Framework Demo", + description: "A demo website showcasing using the Open Intents Framework. Built by LIFI.", + url: "https://lintent.org", + icons: ["https://lintent.org/favicon.ico"] }; export const walletConnectProjectId = env.PUBLIC_WALLET_CONNECT_PROJECT_ID?.trim(); export function resolveConnectorIds(projectId?: string) { - return ["injected", ...(projectId ? ["walletConnect"] : []), "metaMask"]; + return ["injected", ...(projectId ? ["walletConnect"] : []), "metaMask"]; } const wagmiChains = Object.values(chainMap) as Chain[]; const connectors = [ - injected(), - ...(walletConnectProjectId - ? [ - walletConnect({ - projectId: walletConnectProjectId, - showQrModal: true, - metadata: APP_METADATA - }) - ] - : []), - metaMask({ dappMetadata: APP_METADATA }) + injected(), + ...(walletConnectProjectId + ? [ + walletConnect({ + projectId: walletConnectProjectId, + showQrModal: true, + metadata: APP_METADATA + }) + ] + : []), + metaMask({ dappMetadata: APP_METADATA }) ]; const transports = Object.fromEntries(wagmiChains.map((chain) => [chain.id, http()])); export const wagmiConfig = createConfig({ - ssr: true, - chains: wagmiChains as [Chain, ...Chain[]], - connectors, - transports: transports as Record> + ssr: true, + chains: wagmiChains as [Chain, ...Chain[]], + connectors, + transports: transports as Record> }); export type WalletConnection = ReturnType; export function listWalletConnectors() { - return getConnectors(wagmiConfig).map((connector) => ({ - id: connector.id, - name: connector.name - })); + return getConnectors(wagmiConfig).map((connector) => ({ + id: connector.id, + name: connector.name + })); } export async function connectWith(connectorId: string) { - const connector = getConnectors(wagmiConfig).find((candidate) => candidate.id === connectorId); - if (!connector) throw new Error(`Connector not found: ${connectorId}`); - return connect(wagmiConfig, { connector }); + const connector = getConnectors(wagmiConfig).find((candidate) => candidate.id === connectorId); + if (!connector) throw new Error(`Connector not found: ${connectorId}`); + return connect(wagmiConfig, { connector }); } export async function reconnectWallet() { - return reconnect(wagmiConfig); + return reconnect(wagmiConfig); } export async function disconnectWallet() { - const connection = getConnection(wagmiConfig); - if (connection.status !== "connected") return; - return disconnect(wagmiConfig, { connector: connection.connector }); + const connection = getConnection(wagmiConfig); + if (connection.status !== "connected") return; + return disconnect(wagmiConfig, { connector: connection.connector }); } export function getCurrentConnection() { - return getConnection(wagmiConfig); + return getConnection(wagmiConfig); } export async function getCurrentProvider() { - const connection = getConnection(wagmiConfig); - if (connection.status !== "connected") return undefined; - return (await connection.connector.getProvider()) as EIP1193Provider; + const connection = getConnection(wagmiConfig); + if (connection.status !== "connected") return undefined; + return (await connection.connector.getProvider()) as EIP1193Provider; } export async function getCurrentWalletClient() { - const provider = await getCurrentProvider(); - if (!provider) return undefined; - return createWalletClient({ transport: custom(provider) }); + const provider = await getCurrentProvider(); + if (!provider) return undefined; + return createWalletClient({ transport: custom(provider) }); } export function watchWalletConnection(onChange: (connection: WalletConnection) => void) { - if (!browser) return () => {}; - return watchConnection(wagmiConfig, { - onChange(connection) { - onChange(connection); - } - }); + if (!browser) return () => {}; + return watchConnection(wagmiConfig, { + onChange(connection) { + onChange(connection); + } + }); } diff --git a/src/lib/utils/walletClient.ts b/src/lib/utils/walletClient.ts index b040963..34ed3ea 100644 --- a/src/lib/utils/walletClient.ts +++ b/src/lib/utils/walletClient.ts @@ -3,67 +3,67 @@ import { toHex } from "viem"; import type { WC } from "$lib/config"; export type SwitchableWalletClient = WC & { - switchChain?: (args: { id: number }) => Promise; + switchChain?: (args: { id: number }) => Promise; }; export type SwitchWalletChainOptions = { - provider?: EIP1193Provider; + provider?: EIP1193Provider; }; export type SwitchWalletChain = ( - walletClient: WC | undefined, - chainId: number, - options?: SwitchWalletChainOptions + walletClient: WC | undefined, + chainId: number, + options?: SwitchWalletChainOptions ) => Promise; export type SwitchWalletChainDeps = { - getCurrentProvider: () => Promise; + getCurrentProvider: () => Promise; }; async function resolveWalletProvider( - walletClient: WC | undefined, - deps: SwitchWalletChainDeps, - provider?: EIP1193Provider + walletClient: WC | undefined, + deps: SwitchWalletChainDeps, + provider?: EIP1193Provider ): Promise { - if (provider?.request) return provider; + if (provider?.request) return provider; - const walletClientWithTransport = walletClient as - | (WC & { transport?: { value?: EIP1193Provider } }) - | undefined; - const transportProvider = walletClientWithTransport?.transport?.value; - if (transportProvider?.request) return transportProvider; + const walletClientWithTransport = walletClient as + | (WC & { transport?: { value?: EIP1193Provider } }) + | undefined; + const transportProvider = walletClientWithTransport?.transport?.value; + if (transportProvider?.request) return transportProvider; - try { - return await deps.getCurrentProvider(); - } catch { - return undefined; - } + try { + return await deps.getCurrentProvider(); + } catch { + return undefined; + } } export function createSwitchWalletChain(deps: SwitchWalletChainDeps): SwitchWalletChain { - return async ( - walletClient: WC | undefined, - chainId: number, - options?: SwitchWalletChainOptions - ) => { - if (!walletClient) return; + return async ( + walletClient: WC | undefined, + chainId: number, + options?: SwitchWalletChainOptions + ) => { + if (!walletClient) return; - const switchableClient = walletClient as SwitchableWalletClient; - if (typeof switchableClient.switchChain === "function") { - await switchableClient.switchChain({ id: chainId }); - return; - } + const switchableClient = walletClient as SwitchableWalletClient; + if (typeof switchableClient.switchChain === "function") { + await switchableClient.switchChain({ id: chainId }); + return; + } - const provider = await resolveWalletProvider(walletClient, deps, options?.provider); - if (!provider?.request) { - throw new Error( - `Wallet client does not support switchChain and no provider is available for chain ${chainId}.` - ); - } + const provider = await resolveWalletProvider(walletClient, deps, options?.provider); + if (!provider?.request) { + throw new Error( + `Wallet client does not support switchChain and no provider is available for chain ${chainId}.` + ); + } - await provider.request({ - method: "wallet_switchEthereumChain", - params: [{ chainId: toHex(chainId) }] - }); - }; + await provider.request({ + method: "wallet_switchEthereumChain", + params: [{ chainId: toHex(chainId) }] + }); + }; } diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index 2458f08..801be90 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -1,7 +1,7 @@ {@render children()} diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index 2b98745..ac2492e 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -1,253 +1,258 @@
-

- Resource lock intents using OIF -

-
- -
-
- - -
- - - Preview by LI.FI - - - {#if !(!store.connectedAccount || !store.walletClient)} - - - - - {/if} -
- {#if !store.connectedAccount || !store.walletClient} - - {:else} - - - - {#if selectedOrder !== undefined} - - - - - {/if} - {/if} -
-
-
- { - if (step.targetIndex === undefined) return; - goToScreen(step.targetIndex); - }} - /> -
-
- - +

+ Resource lock intents using OIF +

+
+ +
+
+ + +
+ + + Preview by LI.FI + + + {#if !(!store.connectedAccount || !store.walletClient)} + + + + + {/if} +
+ {#if !store.connectedAccount || !store.walletClient} + + {:else} + + + + {#if selectedOrder !== undefined} + + + + + {/if} + {/if} +
+
+
+ { + if (step.targetIndex === undefined) return; + goToScreen(step.targetIndex); + }} + /> +
+
+ +
diff --git a/src/routes/allocator/+server.ts b/src/routes/allocator/+server.ts index 4f03cea..5a747a6 100644 --- a/src/routes/allocator/+server.ts +++ b/src/routes/allocator/+server.ts @@ -3,81 +3,81 @@ import axios from "axios"; import type { RequestHandler } from "./$types"; import { type StandardOrder } from "@lifi/intent"; import { - PRIVATE_POLYMER_MAINNET_ZONE_API_KEY, - PRIVATE_POLYMER_TESTNET_ZONE_API_KEY + PRIVATE_POLYMER_MAINNET_ZONE_API_KEY, + PRIVATE_POLYMER_TESTNET_ZONE_API_KEY } from "$env/static/private"; function getPolymerKey(mainnet: boolean) { - return mainnet ? PRIVATE_POLYMER_MAINNET_ZONE_API_KEY : PRIVATE_POLYMER_TESTNET_ZONE_API_KEY; + return mainnet ? PRIVATE_POLYMER_MAINNET_ZONE_API_KEY : PRIVATE_POLYMER_TESTNET_ZONE_API_KEY; } export const POST: RequestHandler = async ({ request }) => { - const { - order, - claimHash, - blockNumber, - chainId, - mainnet - }: { - order: StandardOrder; - claimHash: `0x${string}`; - blockNumber: number; - chainId: number; - mainnet?: boolean; - } = await request.json(); - console.log({ order, claimHash, blockNumber, chainId }); + const { + order, + claimHash, + blockNumber, + chainId, + mainnet + }: { + order: StandardOrder; + claimHash: `0x${string}`; + blockNumber: number; + chainId: number; + mainnet?: boolean; + } = await request.json(); + console.log({ order, claimHash, blockNumber, chainId }); - const PRIVATE_POLYMER_ZONE_API_KEY = getPolymerKey(mainnet ?? true); + const PRIVATE_POLYMER_ZONE_API_KEY = getPolymerKey(mainnet ?? true); - const requestAllocation = await axios.post( - "https://allocator.devnet.polymer.zone/", - { - jsonrpc: "2.0", - id: 1, - method: "allocator_attestCommit", - params: [ - { - chainId, - blockNumber, - claimHash, - order - } - ] - }, - { - headers: { - Authorization: `Bearer ${PRIVATE_POLYMER_ZONE_API_KEY}`, - "Content-Type": "application/json", - Accept: "application/json" - } - } - ); + const requestAllocation = await axios.post( + "https://allocator.devnet.polymer.zone/", + { + jsonrpc: "2.0", + id: 1, + method: "allocator_attestCommit", + params: [ + { + chainId, + blockNumber, + claimHash, + order + } + ] + }, + { + headers: { + Authorization: `Bearer ${PRIVATE_POLYMER_ZONE_API_KEY}`, + "Content-Type": "application/json", + Accept: "application/json" + } + } + ); - const dat: { - jsonrpc: "2.0"; - id: 1; - result: { - chainId: number; - blockNumber: number; - logIndex: number; - order: StandardOrder; - commitSignature: `0x${string}`; - allocatorSignature: `0x${string}`; - allocatorAddress: `0x${string}`; - claimHash: `0x${string}`; - sponsor: `0x${string}`; - tokenBalances: { - tokenId: `0x${string}`; - balance: `0x${string}`; - }[]; - }; - } = requestAllocation.data; + const dat: { + jsonrpc: "2.0"; + id: 1; + result: { + chainId: number; + blockNumber: number; + logIndex: number; + order: StandardOrder; + commitSignature: `0x${string}`; + allocatorSignature: `0x${string}`; + allocatorAddress: `0x${string}`; + claimHash: `0x${string}`; + sponsor: `0x${string}`; + tokenBalances: { + tokenId: `0x${string}`; + balance: `0x${string}`; + }[]; + }; + } = requestAllocation.data; - console.log(dat); + console.log(dat); - // create a JSON Response using a header we received - return json({ - allocatorSignature: dat.result.allocatorSignature, - allocatorAddress: dat.result.allocatorAddress - }); + // create a JSON Response using a header we received + return json({ + allocatorSignature: dat.result.allocatorSignature, + allocatorAddress: dat.result.allocatorAddress + }); }; diff --git a/src/routes/health/+server.ts b/src/routes/health/+server.ts index 94f864c..cfd89c7 100644 --- a/src/routes/health/+server.ts +++ b/src/routes/health/+server.ts @@ -1,5 +1,5 @@ import type { RequestHandler } from "./$types"; export const GET: RequestHandler = async ({}) => { - return new Response(JSON.stringify({ status: "ok", timestamp: Date.now() })); + return new Response(JSON.stringify({ status: "ok", timestamp: Date.now() })); }; diff --git a/src/routes/polymer/+server.ts b/src/routes/polymer/+server.ts index c19da15..98d8df4 100644 --- a/src/routes/polymer/+server.ts +++ b/src/routes/polymer/+server.ts @@ -2,109 +2,109 @@ import { json } from "@sveltejs/kit"; import axios from "axios"; import type { RequestHandler } from "./$types"; import { - PRIVATE_POLYMER_MAINNET_ZONE_API_KEY, - PRIVATE_POLYMER_TESTNET_ZONE_API_KEY + PRIVATE_POLYMER_MAINNET_ZONE_API_KEY, + PRIVATE_POLYMER_TESTNET_ZONE_API_KEY } from "$env/static/private"; import { toByteArray } from "base64-js"; function getPolymerUrl(mainnet: boolean) { - return mainnet - ? ("https://api.polymer.zone/v1/" as const) - : ("https://api.testnet.polymer.zone/v1/" as const); + return mainnet + ? ("https://api.polymer.zone/v1/" as const) + : ("https://api.testnet.polymer.zone/v1/" as const); } function getPolymerKey(mainnet: boolean) { - return mainnet ? PRIVATE_POLYMER_MAINNET_ZONE_API_KEY : PRIVATE_POLYMER_TESTNET_ZONE_API_KEY; + return mainnet ? PRIVATE_POLYMER_MAINNET_ZONE_API_KEY : PRIVATE_POLYMER_TESTNET_ZONE_API_KEY; } export const POST: RequestHandler = async ({ request }) => { - const { srcChainId, srcBlockNumber, globalLogIndex, polymerIndex, mainnet } = - await request.json(); - console.log({ srcChainId, srcBlockNumber, globalLogIndex, polymerIndex, mainnet }); + const { srcChainId, srcBlockNumber, globalLogIndex, polymerIndex, mainnet } = + await request.json(); + console.log({ srcChainId, srcBlockNumber, globalLogIndex, polymerIndex, mainnet }); - const POLYMER_URL = getPolymerUrl(mainnet ?? true); - const PRIVATE_POLYMER_ZONE_API_KEY = getPolymerKey(mainnet ?? true); + const POLYMER_URL = getPolymerUrl(mainnet ?? true); + const PRIVATE_POLYMER_ZONE_API_KEY = getPolymerKey(mainnet ?? true); - let polymerRequestIndex = polymerIndex; - if (!polymerRequestIndex) { - const requestProof = await axios.post( - POLYMER_URL, - { - jsonrpc: "2.0", - id: 1, - method: "polymer_requestProof", - params: [ - { - srcChainId, - srcBlockNumber, - globalLogIndex - } - ] - }, - { - headers: { - Authorization: `Bearer ${PRIVATE_POLYMER_ZONE_API_KEY}`, - "Content-Type": "application/json", - Accept: "application/json" - } - } - ); - polymerRequestIndex = requestProof.data.result; - console.log({ requestProof: requestProof.data }); - } - const requestProofData = await axios.post( - POLYMER_URL, - { - jsonrpc: "2.0", - id: 1, - method: "polymer_queryProof", - params: [polymerRequestIndex] - }, - { - headers: { - Authorization: `Bearer ${PRIVATE_POLYMER_ZONE_API_KEY}`, - "Content-Type": "application/json", - Accept: "application/json" - } - } - ); - const dat: { - jsonrpc: "2.0"; - id: 1; - result: { - jobID: number; - createdAt: number; - updatedAt: number; - } & ( - | { - status: "error"; - failureReason: string; - } - | { - status: "complete"; - proof: "string"; - } - | { - status: "initialized"; - } - ); - } = requestProofData.data; + let polymerRequestIndex = polymerIndex; + if (!polymerRequestIndex) { + const requestProof = await axios.post( + POLYMER_URL, + { + jsonrpc: "2.0", + id: 1, + method: "polymer_requestProof", + params: [ + { + srcChainId, + srcBlockNumber, + globalLogIndex + } + ] + }, + { + headers: { + Authorization: `Bearer ${PRIVATE_POLYMER_ZONE_API_KEY}`, + "Content-Type": "application/json", + Accept: "application/json" + } + } + ); + polymerRequestIndex = requestProof.data.result; + console.log({ requestProof: requestProof.data }); + } + const requestProofData = await axios.post( + POLYMER_URL, + { + jsonrpc: "2.0", + id: 1, + method: "polymer_queryProof", + params: [polymerRequestIndex] + }, + { + headers: { + Authorization: `Bearer ${PRIVATE_POLYMER_ZONE_API_KEY}`, + "Content-Type": "application/json", + Accept: "application/json" + } + } + ); + const dat: { + jsonrpc: "2.0"; + id: 1; + result: { + jobID: number; + createdAt: number; + updatedAt: number; + } & ( + | { + status: "error"; + failureReason: string; + } + | { + status: "complete"; + proof: "string"; + } + | { + status: "initialized"; + } + ); + } = requestProofData.data; - let proof: string | undefined; - // decode proof from base64 to hex - if (dat.result.status === "complete") { - proof = dat.result.proof; - const proofBytes = toByteArray(proof); - proof = Array.from(proofBytes) - .map((byte) => byte.toString(16).padStart(2, "0")) - .join(""); - } else { - console.log(dat); - } - // create a JSON Response - return json({ - proof, - polymerIndex: polymerRequestIndex, - status: dat.result.status - }); + let proof: string | undefined; + // decode proof from base64 to hex + if (dat.result.status === "complete") { + proof = dat.result.proof; + const proofBytes = toByteArray(proof); + proof = Array.from(proofBytes) + .map((byte) => byte.toString(16).padStart(2, "0")) + .join(""); + } else { + console.log(dat); + } + // create a JSON Response + return json({ + proof, + polymerIndex: polymerRequestIndex, + status: dat.result.status + }); }; diff --git a/src/routes/polymer/health/+server.ts b/src/routes/polymer/health/+server.ts index d62f822..e6071ca 100644 --- a/src/routes/polymer/health/+server.ts +++ b/src/routes/polymer/health/+server.ts @@ -2,64 +2,64 @@ import { json } from "@sveltejs/kit"; import axios from "axios"; import type { RequestHandler } from "./$types"; import { - PRIVATE_POLYMER_MAINNET_ZONE_API_KEY, - PRIVATE_POLYMER_TESTNET_ZONE_API_KEY + PRIVATE_POLYMER_MAINNET_ZONE_API_KEY, + PRIVATE_POLYMER_TESTNET_ZONE_API_KEY } from "$env/static/private"; function getPolymerUrl(mainnet: boolean) { - return mainnet - ? ("https://api.polymer.zone/v1/" as const) - : ("https://api.testnet.polymer.zone/v1/" as const); + return mainnet + ? ("https://api.polymer.zone/v1/" as const) + : ("https://api.testnet.polymer.zone/v1/" as const); } function getPolymerKey(mainnet: boolean) { - return mainnet ? PRIVATE_POLYMER_MAINNET_ZONE_API_KEY : PRIVATE_POLYMER_TESTNET_ZONE_API_KEY; + return mainnet ? PRIVATE_POLYMER_MAINNET_ZONE_API_KEY : PRIVATE_POLYMER_TESTNET_ZONE_API_KEY; } export const POST: RequestHandler = async ({ request }) => { - const { chainIds, mainnet }: { chainIds?: number[]; mainnet?: boolean } = await request.json(); + const { chainIds, mainnet }: { chainIds?: number[]; mainnet?: boolean } = await request.json(); - const POLYMER_URL = getPolymerUrl(mainnet ?? true); - const PRIVATE_POLYMER_ZONE_API_KEY = getPolymerKey(mainnet ?? true); + const POLYMER_URL = getPolymerUrl(mainnet ?? true); + const PRIVATE_POLYMER_ZONE_API_KEY = getPolymerKey(mainnet ?? true); - const requestProofData = await axios.post( - POLYMER_URL, - { - jsonrpc: "2.0", - id: 1, - method: "info_health", - params: [{ chain_ids: chainIds ?? [] }] - }, - { - headers: { - Authorization: `Bearer ${PRIVATE_POLYMER_ZONE_API_KEY}`, - "Content-Type": "application/json", - Accept: "application/json" - } - } - ); + const requestProofData = await axios.post( + POLYMER_URL, + { + jsonrpc: "2.0", + id: 1, + method: "info_health", + params: [{ chain_ids: chainIds ?? [] }] + }, + { + headers: { + Authorization: `Bearer ${PRIVATE_POLYMER_ZONE_API_KEY}`, + "Content-Type": "application/json", + Accept: "application/json" + } + } + ); - const dat: - | ({ - jsonrpc: "2.0"; - id: 1; - } & { - result: { - status: { - [chainId: string]: "healthy" | "unhealthy"; - }; - }; - }) - | { error: { code: -32000; message: `unsupported chain ID(s): [${string}]` } } = - requestProofData.data; + const dat: + | ({ + jsonrpc: "2.0"; + id: 1; + } & { + result: { + status: { + [chainId: string]: "healthy" | "unhealthy"; + }; + }; + }) + | { error: { code: -32000; message: `unsupported chain ID(s): [${string}]` } } = + requestProofData.data; - const failed = "error" in dat; - const status = !failed ? dat.result.status : []; - const error = failed ? dat.error : {}; + const failed = "error" in dat; + const status = !failed ? dat.result.status : []; + const error = failed ? dat.error : {}; - return json({ - failed, - status, - error - }); + return json({ + failed, + status, + error + }); }; diff --git a/svelte.config.js b/svelte.config.js index 9343c0b..a2cfc22 100644 --- a/svelte.config.js +++ b/svelte.config.js @@ -3,16 +3,16 @@ import { vitePreprocess } from "@sveltejs/vite-plugin-svelte"; /** @type {import('@sveltejs/kit').Config} */ const config = { - // Consult https://svelte.dev/docs/kit/integrations - // for more information about preprocessors - preprocess: vitePreprocess(), + // Consult https://svelte.dev/docs/kit/integrations + // for more information about preprocessors + preprocess: vitePreprocess(), - kit: { - // adapter-auto only supports some environments, see https://svelte.dev/docs/kit/adapter-auto for a list. - // If your environment is not supported, or you settled on a specific environment, switch out the adapter. - // See https://svelte.dev/docs/kit/adapters for more information about adapters. - adapter: adapter() - } + kit: { + // adapter-auto only supports some environments, see https://svelte.dev/docs/kit/adapter-auto for a list. + // If your environment is not supported, or you settled on a specific environment, switch out the adapter. + // See https://svelte.dev/docs/kit/adapters for more information about adapters. + adapter: adapter() + } }; export default config; diff --git a/tests/db.test.ts b/tests/db.test.ts index 4e452e0..7801b80 100644 --- a/tests/db.test.ts +++ b/tests/db.test.ts @@ -5,50 +5,50 @@ import migrations from "../src/lib/migrations.json"; import { intents } from "../src/lib/schema"; async function createTestDb() { - const pglite = new PGlite({ fs: new MemoryFS("testdb") }); - const db = drizzle(pglite); + const pglite = new PGlite({ fs: new MemoryFS("testdb") }); + const db = drizzle(pglite); - // dialect and session will appear to not exist...but they do on the pglite drizzle instance - // @ts-ignore - await db.dialect.migrate(migrations, db.session, { - migrationsTable: "drizzle_migrations" - }); + // dialect and session will appear to not exist...but they do on the pglite drizzle instance + // @ts-ignore + await db.dialect.migrate(migrations, db.session, { + migrationsTable: "drizzle_migrations" + }); - return { db, pglite }; + return { db, pglite }; } describe("pglite migrations", () => { - it("applies migrations and supports upserts", async () => { - const { db, pglite } = await createTestDb(); - try { - const now = Date.now(); - await db.insert(intents).values({ - id: "1", - orderId: "order-1", - intentType: "escrow", - data: "{}", - createdAt: now - }); + it("applies migrations and supports upserts", async () => { + const { db, pglite } = await createTestDb(); + try { + const now = Date.now(); + await db.insert(intents).values({ + id: "1", + orderId: "order-1", + intentType: "escrow", + data: "{}", + createdAt: now + }); - await db - .insert(intents) - .values({ - id: "2", - orderId: "order-1", - intentType: "escrow", - data: '{"v":2}', - createdAt: now - }) - .onConflictDoUpdate({ - target: intents.orderId, - set: { data: '{"v":2}' } - }); + await db + .insert(intents) + .values({ + id: "2", + orderId: "order-1", + intentType: "escrow", + data: '{"v":2}', + createdAt: now + }) + .onConflictDoUpdate({ + target: intents.orderId, + set: { data: '{"v":2}' } + }); - const rows = await db.select().from(intents); - expect(rows).toHaveLength(1); - expect(rows[0].data).toBe('{"v":2}'); - } finally { - await pglite.close(); - } - }); + const rows = await db.select().from(intents); + expect(rows).toHaveLength(1); + expect(rows[0].data).toBe('{"v":2}'); + } finally { + await pglite.close(); + } + }); }); diff --git a/tests/e2e/escrow-standard-blackbox.spec.ts b/tests/e2e/escrow-standard-blackbox.spec.ts index a8247fd..80cbc04 100644 --- a/tests/e2e/escrow-standard-blackbox.spec.ts +++ b/tests/e2e/escrow-standard-blackbox.spec.ts @@ -1,9 +1,9 @@ import { expect, test, type Page } from "@playwright/test"; import { - connectInjectedWallet, - e2eWalletAddress, - hasE2EPrivateKey, - installInjectedWalletProvider + connectInjectedWallet, + e2eWalletAddress, + hasE2EPrivateKey, + installInjectedWalletProvider } from "./helpers/bootstrap"; const REQUIRED_INPUT_USDC_HUMAN = "0.0001"; @@ -22,275 +22,275 @@ test.skip(!hasE2EPrivateKey, "Skipping private-key E2E tests: E2E_PRIVATE_KEY is test.setTimeout(TEST_TIMEOUT_MS); async function expectRightRailState(page: Page, state: FlowState) { - const entries = Object.entries(state) as Array<[FlowStepName, FlowStepStatus]>; - for (const [step, status] of entries) { - await expect(page.getByRole("button", { name: `${step} (${status})` })).toBeVisible({ - timeout: UI_TIMEOUT_MS - }); - } + const entries = Object.entries(state) as Array<[FlowStepName, FlowStepStatus]>; + for (const [step, status] of entries) { + await expect(page.getByRole("button", { name: `${step} (${status})` })).toBeVisible({ + timeout: UI_TIMEOUT_MS + }); + } } async function lockVerticalScrollAtTop(page: Page) { - await page.addInitScript(() => { - const enforceTop = () => { - if (window.scrollY > 0) window.scrollTo(0, 0); - }; - window.addEventListener("scroll", enforceTop, { passive: true }); - window.addEventListener("load", enforceTop); - }); + await page.addInitScript(() => { + const enforceTop = () => { + if (window.scrollY > 0) window.scrollTo(0, 0); + }; + window.addEventListener("scroll", enforceTop, { passive: true }); + window.addEventListener("load", enforceTop); + }); } test("black-box escrow flow shows expected UI state transitions", async ({ page }) => { - const issuerAddress = e2eWalletAddress(); - let sawRequiredInputAmount = false; - const getReceiptCount = async () => - await page.evaluate(async () => { - const { default: store } = await import("/src/lib/state.svelte.ts"); - return Object.keys(store.transactionReceipts).length; - }); - - await lockVerticalScrollAtTop(page); - - await page.route("**/quote/request", async (route) => { - const body = route.request().postDataJSON() as - | { - intent?: { - inputs?: Array<{ amount?: string }>; - }; - } - | undefined; - const totalInputRaw = (body?.intent?.inputs ?? []).reduce((sum, input) => { - try { - return sum + BigInt(input.amount ?? "0"); - } catch { - return sum; - } - }, 0n); - if (totalInputRaw.toString() === REQUIRED_INPUT_USDC_RAW) { - sawRequiredInputAmount = true; - } - - await route.fulfill({ - status: 200, - contentType: "application/json", - body: JSON.stringify({ - quotes: [ - { - order: null, - eta: null, - validUntil: Date.now() + 60_000, - quoteId: null, - metadata: { exclusiveFor: issuerAddress }, - preview: { - inputs: [], - outputs: [ - { - receiver: "0x0000000000000000000000000000000000000000", - asset: "0x0000000000000000000000000000000000000000", - amount: REQUIRED_INPUT_USDC_RAW - } - ] - }, - provider: null, - partialFill: false, - failureHandling: "refund-automatic" - } - ] - }) - }); - }); - - await installInjectedWalletProvider(page); - await page.goto("/"); - await connectInjectedWallet(page); - - await expect(page.getByRole("heading", { name: "Assets Management" })).toBeVisible(); - await expectRightRailState(page, { - Asset: "Now", - Issue: "Next", - Fetch: "Next", - Fill: "Locked", - Prove: "Locked", - Claim: "Locked" - }); - - await page.getByTestId("network-mainnet").click(); - await page.getByTestId("intent-type-escrow").click(); - - await page.getByRole("button", { name: "→" }).first().click(); - await expect(page.getByRole("heading", { name: "Intent Issuance" })).toBeVisible(); - await expectRightRailState(page, { - Asset: "Done", - Issue: "Now", - Fetch: "Next", - Fill: "Locked", - Prove: "Locked", - Claim: "Locked" - }); - - await page.getByTestId("open-input-modal-0").click(); - const inputModal = page.getByTestId("input-token-modal"); - await expect(inputModal).toBeVisible({ timeout: UI_TIMEOUT_MS }); - await inputModal.locator("select#tokenSelector").selectOption("usdc"); - - const baseRow = inputModal.getByTestId("input-token-row-base"); - await baseRow.locator('input[type="checkbox"]').check(); - await baseRow.locator('input[type="number"]').fill(REQUIRED_INPUT_USDC_HUMAN); - await page.getByTestId("input-token-modal-save").click(); - await expect(inputModal).toBeHidden({ timeout: UI_TIMEOUT_MS }); - - const exclusiveInput = page.getByPlaceholder("0x... (optional)"); - await exclusiveInput.fill(issuerAddress); - await page.getByLabel("Lock Exclusive").check(); - await expect(exclusiveInput).toHaveValue(issuerAddress); - - await page.getByTestId("quote-button").click(); - await expect(page.getByTestId("quote-button")).toBeVisible(); - await expect.poll(() => sawRequiredInputAmount).toBe(true); - - if ( - await page - .getByRole("button", { name: "Set allowance" }) - .isVisible() - .catch(() => false) - ) { - await page.getByRole("button", { name: "Set allowance" }).click(); - } - - const executeOpenButton = page.getByRole("button", { name: "Execute Open" }); - await expect(executeOpenButton).toBeVisible({ timeout: TX_TIMEOUT_MS }); - await executeOpenButton.click(); - - await expect(page.getByRole("heading", { name: "Select Intent To Solve" })).toBeVisible({ - timeout: TX_TIMEOUT_MS - }); - await expectRightRailState(page, { - Asset: "Done", - Issue: "Done", - Fetch: "Now", - Fill: "Locked", - Prove: "Locked", - Claim: "Locked" - }); - - const activeIntentRow = page.getByRole("button", { name: /SingleChain/i }).first(); - await expect(activeIntentRow).toBeVisible({ timeout: UI_TIMEOUT_MS }); - await expect(page.getByRole("button", { name: /IN 0\.0001 USDC on base/i }).first()).toBeVisible({ - timeout: UI_TIMEOUT_MS - }); - await activeIntentRow.click(); - const currentOrder = await page.evaluate(async () => { - const { default: store } = await import("/src/lib/state.svelte.ts"); - const { buildBaseIntentRow } = await import("/src/lib/libraries/intentList.ts"); - const latest = store.orders.at(-1); - if (!latest) return null; - const baseRow = buildBaseIntentRow(latest); - - const order = latest.order as - | { originChainId?: bigint } - | { inputs?: Array<{ chainId: bigint }> }; - const inputChainId = - "originChainId" in order && typeof order.originChainId === "bigint" - ? order.originChainId.toString() - : (order.inputs?.[0]?.chainId?.toString() ?? ""); - - return { - orderId: baseRow.orderId, - inputSettler: latest.inputSettler, - inputChainId - }; - }); - expect(currentOrder).not.toBeNull(); - - await expect(page.getByRole("heading", { name: "Fill Intent" })).toBeVisible({ - timeout: UI_TIMEOUT_MS - }); - await expectRightRailState(page, { - Asset: "Done", - Issue: "Done", - Fetch: "Done", - Fill: "Now", - Prove: "Locked", - Claim: "Locked" - }); - - const fillButton = page.getByRole("button", { name: /^Fill$/ }).first(); - await expect(fillButton).toBeEnabled({ timeout: UI_TIMEOUT_MS }); - await fillButton.click(); - - await expect(page.getByRole("heading", { name: "Submit Proof of Fill" })).toBeVisible({ - timeout: TX_TIMEOUT_MS - }); - await expectRightRailState(page, { - Asset: "Done", - Issue: "Done", - Fetch: "Done", - Fill: "Done", - Prove: "Now", - Claim: "Locked" - }); - - const proveButton = page.getByRole("button", { name: /^\d+(\.\d+)?\s+USDC$/ }).first(); - let reachedFinalise = false; - for (let attempt = 0; attempt < 4; attempt++) { - await expect(proveButton).toBeVisible({ timeout: UI_TIMEOUT_MS }); - await expect(proveButton).toBeEnabled({ timeout: UI_TIMEOUT_MS }); - await proveButton.click(); - try { - await expect(page.getByRole("heading", { name: "Finalise Intent" })).toBeVisible({ - timeout: PROVE_ATTEMPT_TIMEOUT_MS - }); - reachedFinalise = true; - break; - } catch { - await page.waitForTimeout(3_000); - } - } - expect(reachedFinalise).toBe(true); - - await expectRightRailState(page, { - Asset: "Done", - Issue: "Done", - Fetch: "Done", - Fill: "Done", - Prove: "Done", - Claim: "Now" - }); - - const claimButton = page.getByRole("button", { name: "Claim" }).first(); - await expect(claimButton).toBeEnabled({ timeout: UI_TIMEOUT_MS }); - const receiptsBeforeClaim = await getReceiptCount(); - await claimButton.click(); - - await expect - .poll(async () => await getReceiptCount(), { timeout: TX_TIMEOUT_MS }) - .toBeGreaterThan(receiptsBeforeClaim); - - await expect - .poll( - async () => - await page.evaluate(async (orderMeta) => { - const { getClient } = await import("/src/lib/config.ts"); - const { SETTLER_ESCROW_ABI } = await import("/src/lib/abi/escrow.ts"); - if (!orderMeta) return -1; - const status = await getClient(orderMeta.inputChainId).readContract({ - address: orderMeta.inputSettler as `0x${string}`, - abi: SETTLER_ESCROW_ABI, - functionName: "orderStatus", - args: [orderMeta.orderId as `0x${string}`] - }); - return Number(status); - }, currentOrder), - { timeout: TX_TIMEOUT_MS } - ) - .toBe(ORDER_STATUS_CLAIMED); - - await expectRightRailState(page, { - Asset: "Done", - Issue: "Done", - Fetch: "Done", - Fill: "Done", - Prove: "Done", - Claim: "Now" - }); + const issuerAddress = e2eWalletAddress(); + let sawRequiredInputAmount = false; + const getReceiptCount = async () => + await page.evaluate(async () => { + const { default: store } = await import("/src/lib/state.svelte.ts"); + return Object.keys(store.transactionReceipts).length; + }); + + await lockVerticalScrollAtTop(page); + + await page.route("**/quote/request", async (route) => { + const body = route.request().postDataJSON() as + | { + intent?: { + inputs?: Array<{ amount?: string }>; + }; + } + | undefined; + const totalInputRaw = (body?.intent?.inputs ?? []).reduce((sum, input) => { + try { + return sum + BigInt(input.amount ?? "0"); + } catch { + return sum; + } + }, 0n); + if (totalInputRaw.toString() === REQUIRED_INPUT_USDC_RAW) { + sawRequiredInputAmount = true; + } + + await route.fulfill({ + status: 200, + contentType: "application/json", + body: JSON.stringify({ + quotes: [ + { + order: null, + eta: null, + validUntil: Date.now() + 60_000, + quoteId: null, + metadata: { exclusiveFor: issuerAddress }, + preview: { + inputs: [], + outputs: [ + { + receiver: "0x0000000000000000000000000000000000000000", + asset: "0x0000000000000000000000000000000000000000", + amount: REQUIRED_INPUT_USDC_RAW + } + ] + }, + provider: null, + partialFill: false, + failureHandling: "refund-automatic" + } + ] + }) + }); + }); + + await installInjectedWalletProvider(page); + await page.goto("/"); + await connectInjectedWallet(page); + + await expect(page.getByRole("heading", { name: "Assets Management" })).toBeVisible(); + await expectRightRailState(page, { + Asset: "Now", + Issue: "Next", + Fetch: "Next", + Fill: "Locked", + Prove: "Locked", + Claim: "Locked" + }); + + await page.getByTestId("network-mainnet").click(); + await page.getByTestId("intent-type-escrow").click(); + + await page.getByRole("button", { name: "→" }).first().click(); + await expect(page.getByRole("heading", { name: "Intent Issuance" })).toBeVisible(); + await expectRightRailState(page, { + Asset: "Done", + Issue: "Now", + Fetch: "Next", + Fill: "Locked", + Prove: "Locked", + Claim: "Locked" + }); + + await page.getByTestId("open-input-modal-0").click(); + const inputModal = page.getByTestId("input-token-modal"); + await expect(inputModal).toBeVisible({ timeout: UI_TIMEOUT_MS }); + await inputModal.locator("select#tokenSelector").selectOption("usdc"); + + const baseRow = inputModal.getByTestId("input-token-row-base"); + await baseRow.locator('input[type="checkbox"]').check(); + await baseRow.locator('input[type="number"]').fill(REQUIRED_INPUT_USDC_HUMAN); + await page.getByTestId("input-token-modal-save").click(); + await expect(inputModal).toBeHidden({ timeout: UI_TIMEOUT_MS }); + + const exclusiveInput = page.getByPlaceholder("0x... (optional)"); + await exclusiveInput.fill(issuerAddress); + await page.getByLabel("Lock Exclusive").check(); + await expect(exclusiveInput).toHaveValue(issuerAddress); + + await page.getByTestId("quote-button").click(); + await expect(page.getByTestId("quote-button")).toBeVisible(); + await expect.poll(() => sawRequiredInputAmount).toBe(true); + + if ( + await page + .getByRole("button", { name: "Set allowance" }) + .isVisible() + .catch(() => false) + ) { + await page.getByRole("button", { name: "Set allowance" }).click(); + } + + const executeOpenButton = page.getByRole("button", { name: "Execute Open" }); + await expect(executeOpenButton).toBeVisible({ timeout: TX_TIMEOUT_MS }); + await executeOpenButton.click(); + + await expect(page.getByRole("heading", { name: "Select Intent To Solve" })).toBeVisible({ + timeout: TX_TIMEOUT_MS + }); + await expectRightRailState(page, { + Asset: "Done", + Issue: "Done", + Fetch: "Now", + Fill: "Locked", + Prove: "Locked", + Claim: "Locked" + }); + + const activeIntentRow = page.getByRole("button", { name: /SingleChain/i }).first(); + await expect(activeIntentRow).toBeVisible({ timeout: UI_TIMEOUT_MS }); + await expect(page.getByRole("button", { name: /IN 0\.0001 USDC on base/i }).first()).toBeVisible({ + timeout: UI_TIMEOUT_MS + }); + await activeIntentRow.click(); + const currentOrder = await page.evaluate(async () => { + const { default: store } = await import("/src/lib/state.svelte.ts"); + const { buildBaseIntentRow } = await import("/src/lib/libraries/intentList.ts"); + const latest = store.orders.at(-1); + if (!latest) return null; + const baseRow = buildBaseIntentRow(latest); + + const order = latest.order as + | { originChainId?: bigint } + | { inputs?: Array<{ chainId: bigint }> }; + const inputChainId = + "originChainId" in order && typeof order.originChainId === "bigint" + ? order.originChainId.toString() + : (order.inputs?.[0]?.chainId?.toString() ?? ""); + + return { + orderId: baseRow.orderId, + inputSettler: latest.inputSettler, + inputChainId + }; + }); + expect(currentOrder).not.toBeNull(); + + await expect(page.getByRole("heading", { name: "Fill Intent" })).toBeVisible({ + timeout: UI_TIMEOUT_MS + }); + await expectRightRailState(page, { + Asset: "Done", + Issue: "Done", + Fetch: "Done", + Fill: "Now", + Prove: "Locked", + Claim: "Locked" + }); + + const fillButton = page.getByRole("button", { name: /^Fill$/ }).first(); + await expect(fillButton).toBeEnabled({ timeout: UI_TIMEOUT_MS }); + await fillButton.click(); + + await expect(page.getByRole("heading", { name: "Submit Proof of Fill" })).toBeVisible({ + timeout: TX_TIMEOUT_MS + }); + await expectRightRailState(page, { + Asset: "Done", + Issue: "Done", + Fetch: "Done", + Fill: "Done", + Prove: "Now", + Claim: "Locked" + }); + + const proveButton = page.getByRole("button", { name: /^\d+(\.\d+)?\s+USDC$/ }).first(); + let reachedFinalise = false; + for (let attempt = 0; attempt < 4; attempt++) { + await expect(proveButton).toBeVisible({ timeout: UI_TIMEOUT_MS }); + await expect(proveButton).toBeEnabled({ timeout: UI_TIMEOUT_MS }); + await proveButton.click(); + try { + await expect(page.getByRole("heading", { name: "Finalise Intent" })).toBeVisible({ + timeout: PROVE_ATTEMPT_TIMEOUT_MS + }); + reachedFinalise = true; + break; + } catch { + await page.waitForTimeout(3_000); + } + } + expect(reachedFinalise).toBe(true); + + await expectRightRailState(page, { + Asset: "Done", + Issue: "Done", + Fetch: "Done", + Fill: "Done", + Prove: "Done", + Claim: "Now" + }); + + const claimButton = page.getByRole("button", { name: "Claim" }).first(); + await expect(claimButton).toBeEnabled({ timeout: UI_TIMEOUT_MS }); + const receiptsBeforeClaim = await getReceiptCount(); + await claimButton.click(); + + await expect + .poll(async () => await getReceiptCount(), { timeout: TX_TIMEOUT_MS }) + .toBeGreaterThan(receiptsBeforeClaim); + + await expect + .poll( + async () => + await page.evaluate(async (orderMeta) => { + const { getClient } = await import("/src/lib/config.ts"); + const { SETTLER_ESCROW_ABI } = await import("/src/lib/abi/escrow.ts"); + if (!orderMeta) return -1; + const status = await getClient(orderMeta.inputChainId).readContract({ + address: orderMeta.inputSettler as `0x${string}`, + abi: SETTLER_ESCROW_ABI, + functionName: "orderStatus", + args: [orderMeta.orderId as `0x${string}`] + }); + return Number(status); + }, currentOrder), + { timeout: TX_TIMEOUT_MS } + ) + .toBe(ORDER_STATUS_CLAIMED); + + await expectRightRailState(page, { + Asset: "Done", + Issue: "Done", + Fetch: "Done", + Fill: "Done", + Prove: "Done", + Claim: "Now" + }); }); diff --git a/tests/e2e/escrow-standard-live.spec.ts b/tests/e2e/escrow-standard-live.spec.ts index 6e24696..cf444a2 100644 --- a/tests/e2e/escrow-standard-live.spec.ts +++ b/tests/e2e/escrow-standard-live.spec.ts @@ -1,9 +1,9 @@ import { expect, test, type Page } from "@playwright/test"; import { - connectInjectedWallet, - e2eWalletAddress, - hasE2EPrivateKey, - installInjectedWalletProvider + connectInjectedWallet, + e2eWalletAddress, + hasE2EPrivateKey, + installInjectedWalletProvider } from "./helpers/bootstrap"; const REQUIRED_INPUT_USDC_RAW = "100"; @@ -18,263 +18,263 @@ test.skip(!hasE2EPrivateKey, "Skipping private-key E2E tests: E2E_PRIVATE_KEY is test.setTimeout(TEST_TIMEOUT_MS); async function resolveIssuanceActionState(page: Page): Promise<"execute-open" | "low-balance"> { - const executeOpenButton = page.getByRole("button", { name: "Execute Open" }); - const lowBalanceButton = page.getByRole("button", { name: "Low Balance" }); - const started = Date.now(); + const executeOpenButton = page.getByRole("button", { name: "Execute Open" }); + const lowBalanceButton = page.getByRole("button", { name: "Low Balance" }); + const started = Date.now(); - while (Date.now() - started < TX_TIMEOUT_MS) { - if (await lowBalanceButton.isVisible().catch(() => false)) return "low-balance"; - if (await executeOpenButton.isVisible().catch(() => false)) return "execute-open"; - await page.waitForTimeout(200); - } + while (Date.now() - started < TX_TIMEOUT_MS) { + if (await lowBalanceButton.isVisible().catch(() => false)) return "low-balance"; + if (await executeOpenButton.isVisible().catch(() => false)) return "execute-open"; + await page.waitForTimeout(200); + } - throw new Error("Timed out waiting for issuance action state (Execute Open or Low Balance)."); + throw new Error("Timed out waiting for issuance action state (Execute Open or Low Balance)."); } test("executes full standard escrow flow from base to arbitrum with raw input 100", async ({ - page + page }) => { - const issuerAddress = e2eWalletAddress(); - let sawExpectedQuotePayload = false; - let sawExclusiveForIssuer = false; - const getReceiptCount = async () => - await page.evaluate(async () => { - const { default: store } = await import("/src/lib/state.svelte.ts"); - return Object.keys(store.transactionReceipts).length; - }); - - await page.route("**/quote/request", async (route) => { - const body = route.request().postDataJSON() as - | { - intent?: { - metadata?: { exclusiveFor?: string[] | string }; - inputs?: Array<{ amount?: string }>; - outputs?: Array<{ amount?: string }>; - }; - } - | undefined; - - const firstInputAmount = body?.intent?.inputs?.[0]?.amount; - const firstOutputAmount = body?.intent?.outputs?.[0]?.amount; - if (firstInputAmount === REQUIRED_INPUT_USDC_RAW && firstOutputAmount === "0") { - sawExpectedQuotePayload = true; - } - const exclusiveForRaw = body?.intent?.metadata?.exclusiveFor; - const exclusiveFor = - Array.isArray(exclusiveForRaw) && exclusiveForRaw.length > 0 - ? exclusiveForRaw[0] - : (exclusiveForRaw ?? ""); - if (exclusiveFor.toLowerCase() === issuerAddress.toLowerCase()) { - sawExclusiveForIssuer = true; - } - - await route.fulfill({ - status: 200, - contentType: "application/json", - body: JSON.stringify({ - quotes: [ - { - order: null, - eta: null, - validUntil: Date.now() + 60_000, - quoteId: null, - metadata: { exclusiveFor: issuerAddress }, - preview: { - inputs: [], - outputs: [ - { - receiver: "0x0000000000000000000000000000000000000000", - asset: "0x0000000000000000000000000000000000000000", - amount: REQUIRED_INPUT_USDC_RAW - } - ] - }, - provider: null, - partialFill: false, - failureHandling: "refund-automatic" - } - ] - }) - }); - }); - - await installInjectedWalletProvider(page); - await page.goto("/"); - await connectInjectedWallet(page); - - await expect(page.getByRole("heading", { name: "Assets Management" })).toBeVisible(); - await page.getByTestId("network-mainnet").click(); - await page.getByTestId("intent-type-escrow").click(); - - // Keep the flow deterministic by fixing tiny standard-order assets directly in state. - await page.evaluate( - async ({ amount, issuer }) => { - const { default: store } = await import("/src/lib/state.svelte.ts"); - const { coinList, chainMap } = await import("/src/lib/config"); - const coins = coinList(true); - const baseUsdc = coins.find( - (token) => token.chainId === chainMap.base.id && token.name === "usdc" - ); - const arbitrumUsdc = coins.find( - (token) => token.chainId === chainMap.arbitrum.id && token.name === "usdc" - ); - if (!baseUsdc || !arbitrumUsdc) { - throw new Error("Could not resolve base/arbitrum USDC from coin list."); - } - - store.mainnet = true; - store.intentType = "escrow"; - store.orders = []; - store.inputTokens = [{ token: baseUsdc, amount: BigInt(amount) }]; - store.outputTokens = [{ token: arbitrumUsdc, amount: BigInt(amount) }]; - store.exclusiveFor = issuer; - store.useExclusiveForQuoteRequest = true; - }, - { amount: REQUIRED_INPUT_USDC_RAW, issuer: issuerAddress } - ); - - await page.getByRole("button", { name: "→" }).first().click(); - await expect(page.getByRole("heading", { name: "Intent Issuance" })).toBeVisible(); - - await page.getByTestId("quote-button").click(); - await expect.poll(() => sawExpectedQuotePayload).toBe(true); - await expect.poll(() => sawExclusiveForIssuer).toBe(true); - - if ( - await page - .getByRole("button", { name: "Set allowance" }) - .isVisible() - .catch(() => false) - ) { - await page.getByRole("button", { name: "Set allowance" }).click(); - } - - const actionState = await resolveIssuanceActionState(page); - if (actionState === "low-balance") { - test.skip(true, "Skipping live flow: wallet has insufficient Base USDC for Execute Open."); - } - - await page.getByRole("button", { name: "Execute Open" }).click(); - await expect(page.getByRole("heading", { name: "Select Intent To Solve" })).toBeVisible({ - timeout: TX_TIMEOUT_MS - }); - - const activeIntentRow = page.getByRole("button", { name: /SingleChain/i }).first(); - await expect(activeIntentRow).toBeVisible({ timeout: TX_TIMEOUT_MS }); - await activeIntentRow.click(); - - const currentOrder = await page.evaluate(async () => { - const { default: store } = await import("/src/lib/state.svelte.ts"); - const { buildBaseIntentRow } = await import("/src/lib/libraries/intentList.ts"); - const latest = store.orders.at(-1); - if (!latest) return null; - const baseRow = buildBaseIntentRow(latest); - - const order = latest.order as - | { originChainId?: bigint } - | { inputs?: Array<{ chainId: bigint }> }; - const inputChainId = - "originChainId" in order && typeof order.originChainId === "bigint" - ? order.originChainId.toString() - : (order.inputs?.[0]?.chainId?.toString() ?? ""); - - return { - orderId: baseRow.orderId, - inputSettler: latest.inputSettler, - inputChainId - }; - }); - expect(currentOrder).not.toBeNull(); - const observedInputRaw = await page.evaluate(async () => { - const { default: store } = await import("/src/lib/state.svelte.ts"); - const latest = store.orders.at(-1) as - | { order?: { inputs?: Array<[bigint, bigint]> } } - | undefined; - const inputs = latest?.order?.inputs; - if (!inputs || inputs.length === 0) return null; - const sum = inputs.reduce((acc, input) => acc + input[1], 0n); - return sum.toString(); - }); - // Exact raw input is asserted at quote request time; here we assert the selected order still has input. - expect(observedInputRaw).not.toBeNull(); - expect(BigInt(observedInputRaw as string)).toBeGreaterThan(0n); - - await expect(page.getByRole("heading", { name: "Fill Intent" })).toBeVisible({ - timeout: UI_TIMEOUT_MS - }); - await expect(page.getByText(/^arbitrum$/i).last()).toBeVisible(); - - const fillButton = page.getByRole("button", { name: /^Fill$/ }).first(); - await expect(fillButton).toBeEnabled({ timeout: UI_TIMEOUT_MS }); - const receiptsBeforeFill = await getReceiptCount(); - await fillButton.click(); - - await expect - .poll(async () => await getReceiptCount(), { timeout: TX_TIMEOUT_MS }) - .toBeGreaterThan(receiptsBeforeFill); - - await expect(page.getByRole("heading", { name: "Submit Proof of Fill" })).toBeVisible({ - timeout: TX_TIMEOUT_MS - }); - - const proveButton = page.getByRole("button", { name: /^\d+(\.\d+)?\s+USDC$/ }).first(); - let validated = false; - for (let attempt = 0; attempt < 4; attempt++) { - await expect(proveButton).toBeVisible({ timeout: UI_TIMEOUT_MS }); - await expect(proveButton).toBeEnabled({ timeout: UI_TIMEOUT_MS }); - await proveButton.click(); - try { - await expect - .poll( - async () => - await page.evaluate(async () => { - const { default: store } = await import("/src/lib/state.svelte.ts"); - const { getOrderProgressChecks } = await import("/src/lib/libraries/flowProgress.ts"); - const latest = store.orders.at(-1); - if (!latest) return false; - const checks = await getOrderProgressChecks(latest, store.fillTransactions); - return checks.allValidated; - }), - { timeout: PROVE_ATTEMPT_TIMEOUT_MS, intervals: [1_000, 2_000, 4_000] } - ) - .toBe(true); - validated = true; - break; - } catch { - await page.waitForTimeout(3_000); - } - } - expect(validated).toBe(true); - - await expect(page.getByRole("heading", { name: "Finalise Intent" })).toBeVisible({ - timeout: TX_TIMEOUT_MS - }); - - const claimButton = page.getByRole("button", { name: "Claim" }).first(); - await expect(claimButton).toBeEnabled({ timeout: UI_TIMEOUT_MS }); - const receiptsBeforeClaim = await getReceiptCount(); - await claimButton.click(); - - await expect - .poll(async () => await getReceiptCount(), { timeout: TX_TIMEOUT_MS }) - .toBeGreaterThan(receiptsBeforeClaim); - - await expect - .poll( - async () => - await page.evaluate(async (orderMeta) => { - const { getClient } = await import("/src/lib/config.ts"); - const { SETTLER_ESCROW_ABI } = await import("/src/lib/abi/escrow.ts"); - if (!orderMeta) return -1; - const status = await getClient(orderMeta.inputChainId).readContract({ - address: orderMeta.inputSettler as `0x${string}`, - abi: SETTLER_ESCROW_ABI, - functionName: "orderStatus", - args: [orderMeta.orderId as `0x${string}`] - }); - return Number(status); - }, currentOrder), - { timeout: TX_TIMEOUT_MS } - ) - .toBe(ORDER_STATUS_CLAIMED); + const issuerAddress = e2eWalletAddress(); + let sawExpectedQuotePayload = false; + let sawExclusiveForIssuer = false; + const getReceiptCount = async () => + await page.evaluate(async () => { + const { default: store } = await import("/src/lib/state.svelte.ts"); + return Object.keys(store.transactionReceipts).length; + }); + + await page.route("**/quote/request", async (route) => { + const body = route.request().postDataJSON() as + | { + intent?: { + metadata?: { exclusiveFor?: string[] | string }; + inputs?: Array<{ amount?: string }>; + outputs?: Array<{ amount?: string }>; + }; + } + | undefined; + + const firstInputAmount = body?.intent?.inputs?.[0]?.amount; + const firstOutputAmount = body?.intent?.outputs?.[0]?.amount; + if (firstInputAmount === REQUIRED_INPUT_USDC_RAW && firstOutputAmount === "0") { + sawExpectedQuotePayload = true; + } + const exclusiveForRaw = body?.intent?.metadata?.exclusiveFor; + const exclusiveFor = + Array.isArray(exclusiveForRaw) && exclusiveForRaw.length > 0 + ? exclusiveForRaw[0] + : (exclusiveForRaw ?? ""); + if (exclusiveFor.toLowerCase() === issuerAddress.toLowerCase()) { + sawExclusiveForIssuer = true; + } + + await route.fulfill({ + status: 200, + contentType: "application/json", + body: JSON.stringify({ + quotes: [ + { + order: null, + eta: null, + validUntil: Date.now() + 60_000, + quoteId: null, + metadata: { exclusiveFor: issuerAddress }, + preview: { + inputs: [], + outputs: [ + { + receiver: "0x0000000000000000000000000000000000000000", + asset: "0x0000000000000000000000000000000000000000", + amount: REQUIRED_INPUT_USDC_RAW + } + ] + }, + provider: null, + partialFill: false, + failureHandling: "refund-automatic" + } + ] + }) + }); + }); + + await installInjectedWalletProvider(page); + await page.goto("/"); + await connectInjectedWallet(page); + + await expect(page.getByRole("heading", { name: "Assets Management" })).toBeVisible(); + await page.getByTestId("network-mainnet").click(); + await page.getByTestId("intent-type-escrow").click(); + + // Keep the flow deterministic by fixing tiny standard-order assets directly in state. + await page.evaluate( + async ({ amount, issuer }) => { + const { default: store } = await import("/src/lib/state.svelte.ts"); + const { coinList, chainMap } = await import("/src/lib/config"); + const coins = coinList(true); + const baseUsdc = coins.find( + (token) => token.chainId === chainMap.base.id && token.name === "usdc" + ); + const arbitrumUsdc = coins.find( + (token) => token.chainId === chainMap.arbitrum.id && token.name === "usdc" + ); + if (!baseUsdc || !arbitrumUsdc) { + throw new Error("Could not resolve base/arbitrum USDC from coin list."); + } + + store.mainnet = true; + store.intentType = "escrow"; + store.orders = []; + store.inputTokens = [{ token: baseUsdc, amount: BigInt(amount) }]; + store.outputTokens = [{ token: arbitrumUsdc, amount: BigInt(amount) }]; + store.exclusiveFor = issuer; + store.useExclusiveForQuoteRequest = true; + }, + { amount: REQUIRED_INPUT_USDC_RAW, issuer: issuerAddress } + ); + + await page.getByRole("button", { name: "→" }).first().click(); + await expect(page.getByRole("heading", { name: "Intent Issuance" })).toBeVisible(); + + await page.getByTestId("quote-button").click(); + await expect.poll(() => sawExpectedQuotePayload).toBe(true); + await expect.poll(() => sawExclusiveForIssuer).toBe(true); + + if ( + await page + .getByRole("button", { name: "Set allowance" }) + .isVisible() + .catch(() => false) + ) { + await page.getByRole("button", { name: "Set allowance" }).click(); + } + + const actionState = await resolveIssuanceActionState(page); + if (actionState === "low-balance") { + test.skip(true, "Skipping live flow: wallet has insufficient Base USDC for Execute Open."); + } + + await page.getByRole("button", { name: "Execute Open" }).click(); + await expect(page.getByRole("heading", { name: "Select Intent To Solve" })).toBeVisible({ + timeout: TX_TIMEOUT_MS + }); + + const activeIntentRow = page.getByRole("button", { name: /SingleChain/i }).first(); + await expect(activeIntentRow).toBeVisible({ timeout: TX_TIMEOUT_MS }); + await activeIntentRow.click(); + + const currentOrder = await page.evaluate(async () => { + const { default: store } = await import("/src/lib/state.svelte.ts"); + const { buildBaseIntentRow } = await import("/src/lib/libraries/intentList.ts"); + const latest = store.orders.at(-1); + if (!latest) return null; + const baseRow = buildBaseIntentRow(latest); + + const order = latest.order as + | { originChainId?: bigint } + | { inputs?: Array<{ chainId: bigint }> }; + const inputChainId = + "originChainId" in order && typeof order.originChainId === "bigint" + ? order.originChainId.toString() + : (order.inputs?.[0]?.chainId?.toString() ?? ""); + + return { + orderId: baseRow.orderId, + inputSettler: latest.inputSettler, + inputChainId + }; + }); + expect(currentOrder).not.toBeNull(); + const observedInputRaw = await page.evaluate(async () => { + const { default: store } = await import("/src/lib/state.svelte.ts"); + const latest = store.orders.at(-1) as + | { order?: { inputs?: Array<[bigint, bigint]> } } + | undefined; + const inputs = latest?.order?.inputs; + if (!inputs || inputs.length === 0) return null; + const sum = inputs.reduce((acc, input) => acc + input[1], 0n); + return sum.toString(); + }); + // Exact raw input is asserted at quote request time; here we assert the selected order still has input. + expect(observedInputRaw).not.toBeNull(); + expect(BigInt(observedInputRaw as string)).toBeGreaterThan(0n); + + await expect(page.getByRole("heading", { name: "Fill Intent" })).toBeVisible({ + timeout: UI_TIMEOUT_MS + }); + await expect(page.getByText(/^arbitrum$/i).last()).toBeVisible(); + + const fillButton = page.getByRole("button", { name: /^Fill$/ }).first(); + await expect(fillButton).toBeEnabled({ timeout: UI_TIMEOUT_MS }); + const receiptsBeforeFill = await getReceiptCount(); + await fillButton.click(); + + await expect + .poll(async () => await getReceiptCount(), { timeout: TX_TIMEOUT_MS }) + .toBeGreaterThan(receiptsBeforeFill); + + await expect(page.getByRole("heading", { name: "Submit Proof of Fill" })).toBeVisible({ + timeout: TX_TIMEOUT_MS + }); + + const proveButton = page.getByRole("button", { name: /^\d+(\.\d+)?\s+USDC$/ }).first(); + let validated = false; + for (let attempt = 0; attempt < 4; attempt++) { + await expect(proveButton).toBeVisible({ timeout: UI_TIMEOUT_MS }); + await expect(proveButton).toBeEnabled({ timeout: UI_TIMEOUT_MS }); + await proveButton.click(); + try { + await expect + .poll( + async () => + await page.evaluate(async () => { + const { default: store } = await import("/src/lib/state.svelte.ts"); + const { getOrderProgressChecks } = await import("/src/lib/libraries/flowProgress.ts"); + const latest = store.orders.at(-1); + if (!latest) return false; + const checks = await getOrderProgressChecks(latest, store.fillTransactions); + return checks.allValidated; + }), + { timeout: PROVE_ATTEMPT_TIMEOUT_MS, intervals: [1_000, 2_000, 4_000] } + ) + .toBe(true); + validated = true; + break; + } catch { + await page.waitForTimeout(3_000); + } + } + expect(validated).toBe(true); + + await expect(page.getByRole("heading", { name: "Finalise Intent" })).toBeVisible({ + timeout: TX_TIMEOUT_MS + }); + + const claimButton = page.getByRole("button", { name: "Claim" }).first(); + await expect(claimButton).toBeEnabled({ timeout: UI_TIMEOUT_MS }); + const receiptsBeforeClaim = await getReceiptCount(); + await claimButton.click(); + + await expect + .poll(async () => await getReceiptCount(), { timeout: TX_TIMEOUT_MS }) + .toBeGreaterThan(receiptsBeforeClaim); + + await expect + .poll( + async () => + await page.evaluate(async (orderMeta) => { + const { getClient } = await import("/src/lib/config.ts"); + const { SETTLER_ESCROW_ABI } = await import("/src/lib/abi/escrow.ts"); + if (!orderMeta) return -1; + const status = await getClient(orderMeta.inputChainId).readContract({ + address: orderMeta.inputSettler as `0x${string}`, + abi: SETTLER_ESCROW_ABI, + functionName: "orderStatus", + args: [orderMeta.orderId as `0x${string}`] + }); + return Number(status); + }, currentOrder), + { timeout: TX_TIMEOUT_MS } + ) + .toBe(ORDER_STATUS_CLAIMED); }); diff --git a/tests/e2e/helpers/bootstrap.ts b/tests/e2e/helpers/bootstrap.ts index 367b7a4..21456d2 100644 --- a/tests/e2e/helpers/bootstrap.ts +++ b/tests/e2e/helpers/bootstrap.ts @@ -7,19 +7,19 @@ import { privateKeyToAccount } from "viem/accounts"; import { arbitrum, base } from "viem/chains"; type ProviderPayload = { - method: string; - params?: unknown[]; + method: string; + params?: unknown[]; }; function ensureEnvLoaded() { - const envFilePath = process.env.E2E_ENV_FILE?.trim() || ".env"; - loadDotenv({ path: envFilePath, quiet: true }); + const envFilePath = process.env.E2E_ENV_FILE?.trim() || ".env"; + loadDotenv({ path: envFilePath, quiet: true }); } ensureEnvLoaded(); function getE2EEnv(name: string) { - return process.env[name]?.trim(); + return process.env[name]?.trim(); } export const hasE2EPrivateKey = Boolean(getE2EEnv("E2E_PRIVATE_KEY")); @@ -28,13 +28,13 @@ const BASE_CHAIN_ID = base.id; const ARBITRUM_CHAIN_ID = arbitrum.id; const BASE_USDC = "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913" as const; const ERC20_BALANCE_OF_ABI = [ - { - type: "function", - name: "balanceOf", - stateMutability: "view", - inputs: [{ name: "owner", type: "address" }], - outputs: [{ name: "", type: "uint256" }] - } + { + type: "function", + name: "balanceOf", + stateMutability: "view", + inputs: [{ name: "owner", type: "address" }], + outputs: [{ name: "", type: "uint256" }] + } ] as const; const baseRpcUrl = getE2EEnv("E2E_BASE_RPC_URL") || "https://base-rpc.publicnode.com"; const arbitrumRpcUrl = getE2EEnv("E2E_ARBITRUM_RPC_URL") || "https://arbitrum-rpc.publicnode.com"; @@ -44,218 +44,218 @@ let walletClientByChainCache: Record | undefined; function rpcUrlForChain(chainId: number): string { - if (chainId === BASE_CHAIN_ID) return baseRpcUrl; - if (chainId === ARBITRUM_CHAIN_ID) return arbitrumRpcUrl; - throw new Error(`Unsupported chain for E2E wallet provider: ${chainId}`); + if (chainId === BASE_CHAIN_ID) return baseRpcUrl; + if (chainId === ARBITRUM_CHAIN_ID) return arbitrumRpcUrl; + throw new Error(`Unsupported chain for E2E wallet provider: ${chainId}`); } function getWalletContext() { - const configuredPrivateKey = getE2EEnv("E2E_PRIVATE_KEY") as Hex | undefined; - if (!configuredPrivateKey) { - throw new Error("E2E_PRIVATE_KEY is required for E2E wallet injection."); - } - - const account = (accountCache ??= privateKeyToAccount(configuredPrivateKey)); - const walletClientByChain = - walletClientByChainCache ?? - (walletClientByChainCache = { - [BASE_CHAIN_ID]: createWalletClient({ - account, - chain: base, - transport: http(baseRpcUrl) - }), - [ARBITRUM_CHAIN_ID]: createWalletClient({ - account, - chain: arbitrum, - transport: http(arbitrumRpcUrl) - }) - }); - return { account, walletClientByChain }; + const configuredPrivateKey = getE2EEnv("E2E_PRIVATE_KEY") as Hex | undefined; + if (!configuredPrivateKey) { + throw new Error("E2E_PRIVATE_KEY is required for E2E wallet injection."); + } + + const account = (accountCache ??= privateKeyToAccount(configuredPrivateKey)); + const walletClientByChain = + walletClientByChainCache ?? + (walletClientByChainCache = { + [BASE_CHAIN_ID]: createWalletClient({ + account, + chain: base, + transport: http(baseRpcUrl) + }), + [ARBITRUM_CHAIN_ID]: createWalletClient({ + account, + chain: arbitrum, + transport: http(arbitrumRpcUrl) + }) + }); + return { account, walletClientByChain }; } function activeWalletClient() { - const { walletClientByChain } = getWalletContext(); - const walletClient = walletClientByChain[currentChainId]; - if (!walletClient) { - throw new Error(`No wallet client configured for active chain ${currentChainId}.`); - } - return walletClient; + const { walletClientByChain } = getWalletContext(); + const walletClient = walletClientByChain[currentChainId]; + if (!walletClient) { + throw new Error(`No wallet client configured for active chain ${currentChainId}.`); + } + return walletClient; } let currentChainId = Number(process.env.E2E_CHAIN_ID ?? BASE_CHAIN_ID); if (!Number.isFinite(currentChainId)) { - currentChainId = BASE_CHAIN_ID; + currentChainId = BASE_CHAIN_ID; } async function rpcRequest(method: string, params: unknown[] = []) { - const response = await fetch(rpcUrlForChain(currentChainId), { - method: "POST", - headers: { "content-type": "application/json" }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: Date.now(), - method, - params - }) - }); - const payload = (await response.json()) as { result?: unknown; error?: { message?: string } }; - if (payload.error) { - throw new Error(payload.error.message ?? `RPC error for method ${method}`); - } - return payload.result; + const response = await fetch(rpcUrlForChain(currentChainId), { + method: "POST", + headers: { "content-type": "application/json" }, + body: JSON.stringify({ + jsonrpc: "2.0", + id: Date.now(), + method, + params + }) + }); + const payload = (await response.json()) as { result?: unknown; error?: { message?: string } }; + if (payload.error) { + throw new Error(payload.error.message ?? `RPC error for method ${method}`); + } + return payload.result; } function asBigInt(value: unknown): bigint | undefined { - if (typeof value !== "string" || value.length === 0) return undefined; - return BigInt(value); + if (typeof value !== "string" || value.length === 0) return undefined; + return BigInt(value); } async function handleProviderRequest(payload: ProviderPayload) { - const { account } = getWalletContext(); - const { method, params = [] } = payload; - - if (method === "eth_chainId") return toHex(currentChainId); - if (method === "eth_accounts" || method === "eth_requestAccounts") return [account.address]; - if (method === "wallet_switchEthereumChain") { - const nextChainHex = (params[0] as { chainId?: string } | undefined)?.chainId; - if (!nextChainHex) throw new Error("wallet_switchEthereumChain missing chainId"); - currentChainId = Number(BigInt(nextChainHex)); - return null; - } - - if (method === "eth_sendTransaction") { - const walletClient = activeWalletClient(); - const tx = (params[0] as Record | undefined) ?? {}; - return await walletClient.sendTransaction({ - account, - to: tx.to as Hex | undefined, - data: tx.data as Hex | undefined, - value: asBigInt(tx.value), - gas: asBigInt(tx.gas), - maxFeePerGas: asBigInt(tx.maxFeePerGas), - maxPriorityFeePerGas: asBigInt(tx.maxPriorityFeePerGas) - }); - } - - if (method === "eth_signTypedData_v4" || method === "eth_signTypedData") { - const rawTypedData = params[1]; - const typedData = - typeof rawTypedData === "string" - ? (JSON.parse(rawTypedData) as Record) - : ((rawTypedData ?? {}) as Record); - const types = { ...(typedData.types as Record) }; - delete (types as Record).EIP712Domain; - return account.signTypedData({ - domain: (typedData.domain as Record) ?? {}, - types: types as Record, - primaryType: typedData.primaryType as string, - message: (typedData.message as Record) ?? {} - } as never); - } - - if (method === "personal_sign") { - const message = params[0]; - if (typeof message === "string" && message.startsWith("0x")) { - return account.signMessage({ message: { raw: message as Hex } }); - } - return account.signMessage({ message: String(message ?? "") }); - } - - return rpcRequest(method, params); + const { account } = getWalletContext(); + const { method, params = [] } = payload; + + if (method === "eth_chainId") return toHex(currentChainId); + if (method === "eth_accounts" || method === "eth_requestAccounts") return [account.address]; + if (method === "wallet_switchEthereumChain") { + const nextChainHex = (params[0] as { chainId?: string } | undefined)?.chainId; + if (!nextChainHex) throw new Error("wallet_switchEthereumChain missing chainId"); + currentChainId = Number(BigInt(nextChainHex)); + return null; + } + + if (method === "eth_sendTransaction") { + const walletClient = activeWalletClient(); + const tx = (params[0] as Record | undefined) ?? {}; + return await walletClient.sendTransaction({ + account, + to: tx.to as Hex | undefined, + data: tx.data as Hex | undefined, + value: asBigInt(tx.value), + gas: asBigInt(tx.gas), + maxFeePerGas: asBigInt(tx.maxFeePerGas), + maxPriorityFeePerGas: asBigInt(tx.maxPriorityFeePerGas) + }); + } + + if (method === "eth_signTypedData_v4" || method === "eth_signTypedData") { + const rawTypedData = params[1]; + const typedData = + typeof rawTypedData === "string" + ? (JSON.parse(rawTypedData) as Record) + : ((rawTypedData ?? {}) as Record); + const types = { ...(typedData.types as Record) }; + delete (types as Record).EIP712Domain; + return account.signTypedData({ + domain: (typedData.domain as Record) ?? {}, + types: types as Record, + primaryType: typedData.primaryType as string, + message: (typedData.message as Record) ?? {} + } as never); + } + + if (method === "personal_sign") { + const message = params[0]; + if (typeof message === "string" && message.startsWith("0x")) { + return account.signMessage({ message: { raw: message as Hex } }); + } + return account.signMessage({ message: String(message ?? "") }); + } + + return rpcRequest(method, params); } export async function installInjectedWalletProvider(page: Page) { - getWalletContext(); - - await page.exposeFunction("__lintentE2EProviderRequest", (payload: ProviderPayload) => { - return handleProviderRequest(payload); - }); - - await page.addInitScript(() => { - type E2EWindow = Window & - typeof globalThis & { - __lintentE2EProviderRequest: (payload: { - method: string; - params?: unknown[]; - }) => Promise; - __LINTENT_E2E_PROVIDER__?: unknown; - ethereum?: unknown; - }; - const e2eWindow = window as E2EWindow; - - const listeners = new Map void>>(); - const emit = (event: string, value: unknown) => { - const set = listeners.get(event); - if (!set) return; - for (const listener of set) listener(value); - }; - - const provider = { - isMetaMask: false, - request: async ({ method, params }: { method: string; params?: unknown[] }) => { - const result = await e2eWindow.__lintentE2EProviderRequest({ - method, - params: params ?? [] - }); - - if (method === "eth_requestAccounts") emit("accountsChanged", result); - if (method === "wallet_switchEthereumChain") { - const nextChain = (params?.[0] as { chainId?: string } | undefined)?.chainId; - if (nextChain) emit("chainChanged", nextChain); - } - - return result; - }, - enable: async () => { - return await provider.request({ method: "eth_requestAccounts", params: [] }); - }, - on: (event: string, callback: (value: unknown) => void) => { - const set = listeners.get(event) ?? new Set<(value: unknown) => void>(); - set.add(callback); - listeners.set(event, set); - }, - removeListener: (event: string, callback: (value: unknown) => void) => { - listeners.get(event)?.delete(callback); - }, - off: (event: string, callback: (value: unknown) => void) => { - listeners.get(event)?.delete(callback); - } - }; - - e2eWindow.__LINTENT_E2E_PROVIDER__ = provider; - e2eWindow.ethereum = provider; - }); + getWalletContext(); + + await page.exposeFunction("__lintentE2EProviderRequest", (payload: ProviderPayload) => { + return handleProviderRequest(payload); + }); + + await page.addInitScript(() => { + type E2EWindow = Window & + typeof globalThis & { + __lintentE2EProviderRequest: (payload: { + method: string; + params?: unknown[]; + }) => Promise; + __LINTENT_E2E_PROVIDER__?: unknown; + ethereum?: unknown; + }; + const e2eWindow = window as E2EWindow; + + const listeners = new Map void>>(); + const emit = (event: string, value: unknown) => { + const set = listeners.get(event); + if (!set) return; + for (const listener of set) listener(value); + }; + + const provider = { + isMetaMask: false, + request: async ({ method, params }: { method: string; params?: unknown[] }) => { + const result = await e2eWindow.__lintentE2EProviderRequest({ + method, + params: params ?? [] + }); + + if (method === "eth_requestAccounts") emit("accountsChanged", result); + if (method === "wallet_switchEthereumChain") { + const nextChain = (params?.[0] as { chainId?: string } | undefined)?.chainId; + if (nextChain) emit("chainChanged", nextChain); + } + + return result; + }, + enable: async () => { + return await provider.request({ method: "eth_requestAccounts", params: [] }); + }, + on: (event: string, callback: (value: unknown) => void) => { + const set = listeners.get(event) ?? new Set<(value: unknown) => void>(); + set.add(callback); + listeners.set(event, set); + }, + removeListener: (event: string, callback: (value: unknown) => void) => { + listeners.get(event)?.delete(callback); + }, + off: (event: string, callback: (value: unknown) => void) => { + listeners.get(event)?.delete(callback); + } + }; + + e2eWindow.__LINTENT_E2E_PROVIDER__ = provider; + e2eWindow.ethereum = provider; + }); } export async function connectInjectedWallet(page: Page) { - await page.getByRole("button", { name: "Connect Injected" }).click(); + await page.getByRole("button", { name: "Connect Injected" }).click(); } export function e2eWalletAddress() { - const { account } = getWalletContext(); - return account.address; + const { account } = getWalletContext(); + return account.address; } export async function hasBaseUsdcBalance(minimumRawAmount: bigint) { - const { account } = getWalletContext(); - const basePublicClient = - basePublicClientCache ?? - (basePublicClientCache = createPublicClient({ - chain: base, - transport: http(baseRpcUrl) - })); - - const balance = await basePublicClient.readContract({ - address: BASE_USDC, - abi: ERC20_BALANCE_OF_ABI, - functionName: "balanceOf", - args: [account.address] - }); - return balance >= minimumRawAmount; + const { account } = getWalletContext(); + const basePublicClient = + basePublicClientCache ?? + (basePublicClientCache = createPublicClient({ + chain: base, + transport: http(baseRpcUrl) + })); + + const balance = await basePublicClient.readContract({ + address: BASE_USDC, + abi: ERC20_BALANCE_OF_ABI, + functionName: "balanceOf", + args: [account.address] + }); + return balance >= minimumRawAmount; } export async function bootstrapConnectedWallet(page: Page) { - await installInjectedWalletProvider(page); - await page.goto("/"); - await connectInjectedWallet(page); + await installInjectedWalletProvider(page); + await page.goto("/"); + await connectInjectedWallet(page); } diff --git a/tests/fixtures/mockQuote.ts b/tests/fixtures/mockQuote.ts index 458da7a..9852a66 100644 --- a/tests/fixtures/mockQuote.ts +++ b/tests/fixtures/mockQuote.ts @@ -1,24 +1,24 @@ export const mockQuoteResponse = { - quotes: [ - { - order: null, - eta: null, - validUntil: Date.now() + 30_000, - quoteId: null, - metadata: { exclusiveFor: "0x0000000000000000000000000000000000000000" }, - preview: { - inputs: [], - outputs: [ - { - receiver: "0x0000000000000000000000000000000000000000", - asset: "0x0000000000000000000000000000000000000000", - amount: "1000000" - } - ] - }, - provider: null, - partialFill: false, - failureHandling: "refund-automatic" - } - ] + quotes: [ + { + order: null, + eta: null, + validUntil: Date.now() + 30_000, + quoteId: null, + metadata: { exclusiveFor: "0x0000000000000000000000000000000000000000" }, + preview: { + inputs: [], + outputs: [ + { + receiver: "0x0000000000000000000000000000000000000000", + asset: "0x0000000000000000000000000000000000000000", + amount: "1000000" + } + ] + }, + provider: null, + partialFill: false, + failureHandling: "refund-automatic" + } + ] }; diff --git a/tests/fixtures/orderFixtures.ts b/tests/fixtures/orderFixtures.ts index 7128865..ab3a7b5 100644 --- a/tests/fixtures/orderFixtures.ts +++ b/tests/fixtures/orderFixtures.ts @@ -13,49 +13,49 @@ export const TEST_NOW_SECONDS = 1_700_000_000; export const b32 = (nibble: string): `0x${string}` => `0x${nibble.repeat(64)}`; export function makeMandateOutput( - chainId = CHAIN_ID_ARBITRUM, - amount = 1n, - overrides: Partial = {} + chainId = CHAIN_ID_ARBITRUM, + amount = 1n, + overrides: Partial = {} ): MandateOutput { - return { - oracle: addressToBytes32(COIN_FILLER), - settler: addressToBytes32(COIN_FILLER), - chainId, - token: b32("3"), - amount, - recipient: b32("4"), - callbackData: "0x", - context: "0x", - ...overrides - }; + return { + oracle: addressToBytes32(COIN_FILLER), + settler: addressToBytes32(COIN_FILLER), + chainId, + token: b32("3"), + amount, + recipient: b32("4"), + callbackData: "0x", + context: "0x", + ...overrides + }; } export function makeStandardOrder(overrides: Partial = {}): StandardOrder { - return { - user: TEST_USER, - nonce: 1n, - originChainId: CHAIN_ID_ETHEREUM, - expires: TEST_NOW_SECONDS + 1000, - fillDeadline: TEST_NOW_SECONDS + 900, - inputOracle: TEST_POLYMER_ORACLE, - inputs: [[1n, 1n]], - outputs: [makeMandateOutput(CHAIN_ID_ARBITRUM)], - ...overrides - }; + return { + user: TEST_USER, + nonce: 1n, + originChainId: CHAIN_ID_ETHEREUM, + expires: TEST_NOW_SECONDS + 1000, + fillDeadline: TEST_NOW_SECONDS + 900, + inputOracle: TEST_POLYMER_ORACLE, + inputs: [[1n, 1n]], + outputs: [makeMandateOutput(CHAIN_ID_ARBITRUM)], + ...overrides + }; } export function makeMultichainOrder(overrides: Partial = {}): MultichainOrder { - return { - user: TEST_USER, - nonce: 2n, - expires: TEST_NOW_SECONDS + 1000, - fillDeadline: TEST_NOW_SECONDS + 900, - inputOracle: TEST_POLYMER_ORACLE, - outputs: [makeMandateOutput(CHAIN_ID_BASE, 2n)], - inputs: [ - { chainId: CHAIN_ID_ETHEREUM, inputs: [[1n, 1n]] }, - { chainId: CHAIN_ID_ARBITRUM, inputs: [[2n, 2n]] } - ], - ...overrides - }; + return { + user: TEST_USER, + nonce: 2n, + expires: TEST_NOW_SECONDS + 1000, + fillDeadline: TEST_NOW_SECONDS + 900, + inputOracle: TEST_POLYMER_ORACLE, + outputs: [makeMandateOutput(CHAIN_ID_BASE, 2n)], + inputs: [ + { chainId: CHAIN_ID_ETHEREUM, inputs: [[1n, 1n]] }, + { chainId: CHAIN_ID_ARBITRUM, inputs: [[2n, 2n]] } + ], + ...overrides + }; } diff --git a/tests/unit/assetSelection.test.ts b/tests/unit/assetSelection.test.ts index 0fee6c5..0371b8e 100644 --- a/tests/unit/assetSelection.test.ts +++ b/tests/unit/assetSelection.test.ts @@ -2,25 +2,25 @@ import { describe, expect, it } from "bun:test"; import { AssetSelection } from "../../src/lib/libraries/assetSelection"; describe("AssetSelection", () => { - it("picks largest-first values to satisfy goal", () => { - const selector = new AssetSelection({ - goal: 7n, - values: [4n, 4n, 3n] - }).largest(); + it("picks largest-first values to satisfy goal", () => { + const selector = new AssetSelection({ + goal: 7n, + values: [4n, 4n, 3n] + }).largest(); - expect(selector.asValues()).toEqual([4n, 3n, 0n]); - }); + expect(selector.asValues()).toEqual([4n, 3n, 0n]); + }); - it("picks smallest-first values to satisfy goal", () => { - const selector = new AssetSelection({ - goal: 7n, - values: [4n, 4n, 3n] - }).smallest(); + it("picks smallest-first values to satisfy goal", () => { + const selector = new AssetSelection({ + goal: 7n, + values: [4n, 4n, 3n] + }).smallest(); - expect(selector.asValues()).toEqual([4n, 0n, 3n]); - }); + expect(selector.asValues()).toEqual([4n, 0n, 3n]); + }); - it("throws when goal is infeasible", () => { - expect(() => new AssetSelection({ goal: 10n, values: [2n, 3n] })).toThrow(); - }); + it("throws when goal is infeasible", () => { + expect(() => new AssetSelection({ goal: 10n, values: [2n, 3n] })).toThrow(); + }); }); diff --git a/tests/unit/intentList.test.ts b/tests/unit/intentList.test.ts index af30ae3..9c42300 100644 --- a/tests/unit/intentList.test.ts +++ b/tests/unit/intentList.test.ts @@ -1,107 +1,107 @@ import { describe, expect, it } from "bun:test"; import { - buildBaseIntentRow, - EXPIRING_THRESHOLD_SECONDS, - formatRelativeDeadline, - formatRemaining, - withTiming, - type BaseIntentRow + buildBaseIntentRow, + EXPIRING_THRESHOLD_SECONDS, + formatRelativeDeadline, + formatRemaining, + withTiming, + type BaseIntentRow } from "../../src/lib/libraries/intentList"; const baseRow: BaseIntentRow = { - orderContainer: { - inputSettler: "0x000025c3226C00B2Cdc200005a1600509f4e00C0", - order: { - user: "0x1111111111111111111111111111111111111111", - nonce: 1n, - originChainId: 8453n, - expires: Math.floor(Date.now() / 1000) + 3600, - fillDeadline: Math.floor(Date.now() / 1000) + 3600, - inputOracle: "0x0000003E06000007A224AeE90052fA6bb46d43C9", - inputs: [[1n, 1n]], - outputs: [ - { - oracle: "0x0000000000000000000000000000000000000000000000000000000000000001", - settler: "0x0000000000000000000000000000000000000000000000000000000000000002", - chainId: 42161n, - token: "0x0000000000000000000000000000000000000000000000000000000000000003", - amount: 1n, - recipient: "0x0000000000000000000000000000000000000004", - callbackData: "0x", - context: "0x00" - } - ] - }, - sponsorSignature: { type: "None", payload: "0x" }, - allocatorSignature: { type: "None", payload: "0x" } - }, - orderId: "0xabc", - orderIdShort: "0xabc", - userShort: "0x1111...1111", - fillDeadline: Math.floor(Date.now() / 1000) + 3600, - inputCount: 1, - outputCount: 1, - chainScope: "singlechain", - chainScopeBadge: "SingleChain", - inputChips: [], - inputOverflow: 0, - outputChips: [], - outputOverflow: 0, - validationPassed: true, - validationReason: "Validation pass" + orderContainer: { + inputSettler: "0x000025c3226C00B2Cdc200005a1600509f4e00C0", + order: { + user: "0x1111111111111111111111111111111111111111", + nonce: 1n, + originChainId: 8453n, + expires: Math.floor(Date.now() / 1000) + 3600, + fillDeadline: Math.floor(Date.now() / 1000) + 3600, + inputOracle: "0x0000003E06000007A224AeE90052fA6bb46d43C9", + inputs: [[1n, 1n]], + outputs: [ + { + oracle: "0x0000000000000000000000000000000000000000000000000000000000000001", + settler: "0x0000000000000000000000000000000000000000000000000000000000000002", + chainId: 42161n, + token: "0x0000000000000000000000000000000000000000000000000000000000000003", + amount: 1n, + recipient: "0x0000000000000000000000000000000000000004", + callbackData: "0x", + context: "0x00" + } + ] + }, + sponsorSignature: { type: "None", payload: "0x" }, + allocatorSignature: { type: "None", payload: "0x" } + }, + orderId: "0xabc", + orderIdShort: "0xabc", + userShort: "0x1111...1111", + fillDeadline: Math.floor(Date.now() / 1000) + 3600, + inputCount: 1, + outputCount: 1, + chainScope: "singlechain", + chainScopeBadge: "SingleChain", + inputChips: [], + inputOverflow: 0, + outputChips: [], + outputOverflow: 0, + validationPassed: true, + validationReason: "Validation pass" }; describe("intentList timing and formatting", () => { - it("marks expired rows", () => { - const row = withTiming(baseRow, baseRow.fillDeadline + 1); - expect(row.status).toBe("expired"); - }); + it("marks expired rows", () => { + const row = withTiming(baseRow, baseRow.fillDeadline + 1); + expect(row.status).toBe("expired"); + }); - it("marks expiring rows", () => { - const now = baseRow.fillDeadline - EXPIRING_THRESHOLD_SECONDS + 1; - const row = withTiming(baseRow, now); - expect(row.status).toBe("expiring"); - }); + it("marks expiring rows", () => { + const now = baseRow.fillDeadline - EXPIRING_THRESHOLD_SECONDS + 1; + const row = withTiming(baseRow, now); + expect(row.status).toBe("expiring"); + }); - it("formats remaining/relative deadline values", () => { - expect(formatRemaining(59)).toBe("59s"); - expect(formatRemaining(180)).toBe("3m"); - expect(formatRelativeDeadline(30)).toBe("in 30s"); - expect(formatRelativeDeadline(-30)).toBe("30s ago"); - }); + it("formats remaining/relative deadline values", () => { + expect(formatRemaining(59)).toBe("59s"); + expect(formatRemaining(180)).toBe("3m"); + expect(formatRelativeDeadline(30)).toBe("in 30s"); + expect(formatRelativeDeadline(-30)).toBe("30s ago"); + }); - it("builds rows for unknown chains without throwing", () => { - const unknownChainId = 999999999n; - const row = buildBaseIntentRow({ - inputSettler: "0x000025c3226C00B2Cdc200005a1600509f4e00C0", - order: { - user: "0x1111111111111111111111111111111111111111", - nonce: 1n, - originChainId: unknownChainId, - expires: Math.floor(Date.now() / 1000) + 3600, - fillDeadline: Math.floor(Date.now() / 1000) + 3600, - inputOracle: "0x0000000000eC36B683C2E6AC89e9A75989C22a2e", - inputs: [[1n, 1n]], - outputs: [ - { - oracle: "0x0000000000000000000000000000000000000000000000000000000000000001", - settler: "0x0000000000000000000000000000000000000000000000000000000000000002", - chainId: unknownChainId, - token: "0x0000000000000000000000000000000000000000000000000000000000000003", - amount: 1n, - recipient: "0x0000000000000000000000000000000000000000000000000000000000000004", - callbackData: "0x", - context: "0x00" - } - ] - }, - sponsorSignature: { type: "None", payload: "0x" }, - allocatorSignature: { type: "None", payload: "0x" } - }); + it("builds rows for unknown chains without throwing", () => { + const unknownChainId = 999999999n; + const row = buildBaseIntentRow({ + inputSettler: "0x000025c3226C00B2Cdc200005a1600509f4e00C0", + order: { + user: "0x1111111111111111111111111111111111111111", + nonce: 1n, + originChainId: unknownChainId, + expires: Math.floor(Date.now() / 1000) + 3600, + fillDeadline: Math.floor(Date.now() / 1000) + 3600, + inputOracle: "0x0000000000eC36B683C2E6AC89e9A75989C22a2e", + inputs: [[1n, 1n]], + outputs: [ + { + oracle: "0x0000000000000000000000000000000000000000000000000000000000000001", + settler: "0x0000000000000000000000000000000000000000000000000000000000000002", + chainId: unknownChainId, + token: "0x0000000000000000000000000000000000000000000000000000000000000003", + amount: 1n, + recipient: "0x0000000000000000000000000000000000000000000000000000000000000004", + callbackData: "0x", + context: "0x00" + } + ] + }, + sponsorSignature: { type: "None", payload: "0x" }, + allocatorSignature: { type: "None", payload: "0x" } + }); - expect(row.inputChips[0].text).toContain("chain-999999999"); - expect(row.outputChips[0].text).toContain("chain-999999999"); - expect(row.inputChips[0].text).toContain("..."); - expect(row.outputChips[0].text).toContain("..."); - }); + expect(row.inputChips[0].text).toContain("chain-999999999"); + expect(row.outputChips[0].text).toContain("chain-999999999"); + expect(row.inputChips[0].text).toContain("..."); + expect(row.outputChips[0].text).toContain("..."); + }); }); diff --git a/tests/unit/orderValidationDeps.test.ts b/tests/unit/orderValidationDeps.test.ts index 8514908..6eaf3cc 100644 --- a/tests/unit/orderValidationDeps.test.ts +++ b/tests/unit/orderValidationDeps.test.ts @@ -1,51 +1,51 @@ import { describe, expect, it } from "bun:test"; import { - COIN_FILLER, - VALIDATION_ERRORS, - addressToBytes32, - validateOrderWithReason + COIN_FILLER, + VALIDATION_ERRORS, + addressToBytes32, + validateOrderWithReason } from "@lifi/intent"; import { makeMandateOutput, makeStandardOrder } from "../fixtures/orderFixtures"; import { orderValidationDeps } from "../../src/lib/libraries/coreDeps"; describe("orderValidationDeps unknown-chain handling", () => { - it("rejects unsupported origin chains even when same-chain fill uses COIN_FILLER", () => { - const unknownChainId = 999999999n; - const result = validateOrderWithReason({ - order: makeStandardOrder({ - originChainId: unknownChainId, - inputOracle: COIN_FILLER, - outputs: [ - makeMandateOutput(unknownChainId, 1n, { - oracle: addressToBytes32(COIN_FILLER), - settler: addressToBytes32(COIN_FILLER), - context: "0x00" - }) - ] - }), - deps: orderValidationDeps - }); + it("rejects unsupported origin chains even when same-chain fill uses COIN_FILLER", () => { + const unknownChainId = 999999999n; + const result = validateOrderWithReason({ + order: makeStandardOrder({ + originChainId: unknownChainId, + inputOracle: COIN_FILLER, + outputs: [ + makeMandateOutput(unknownChainId, 1n, { + oracle: addressToBytes32(COIN_FILLER), + settler: addressToBytes32(COIN_FILLER), + context: "0x00" + }) + ] + }), + deps: orderValidationDeps + }); - expect(result.passed).toBe(false); - expect(result.reason).toBe(VALIDATION_ERRORS.UNKNOWN_ORIGIN_CHAIN); - }); + expect(result.passed).toBe(false); + expect(result.reason).toBe(VALIDATION_ERRORS.UNKNOWN_ORIGIN_CHAIN); + }); - it("rejects unsupported output chains instead of treating them as COIN_FILLER-only", () => { - const unknownChainId = 999999999n; - const result = validateOrderWithReason({ - order: makeStandardOrder({ - outputs: [ - makeMandateOutput(unknownChainId, 1n, { - oracle: addressToBytes32(COIN_FILLER), - settler: addressToBytes32(COIN_FILLER), - context: "0x00" - }) - ] - }), - deps: orderValidationDeps - }); + it("rejects unsupported output chains instead of treating them as COIN_FILLER-only", () => { + const unknownChainId = 999999999n; + const result = validateOrderWithReason({ + order: makeStandardOrder({ + outputs: [ + makeMandateOutput(unknownChainId, 1n, { + oracle: addressToBytes32(COIN_FILLER), + settler: addressToBytes32(COIN_FILLER), + context: "0x00" + }) + ] + }), + deps: orderValidationDeps + }); - expect(result.passed).toBe(false); - expect(result.reason).toBe(VALIDATION_ERRORS.UNKNOWN_OUTPUT_CHAIN); - }); + expect(result.passed).toBe(false); + expect(result.reason).toBe(VALIDATION_ERRORS.UNKNOWN_OUTPUT_CHAIN); + }); }); diff --git a/tests/unit/walletClientSwitch.test.ts b/tests/unit/walletClientSwitch.test.ts index c86b686..c853a04 100644 --- a/tests/unit/walletClientSwitch.test.ts +++ b/tests/unit/walletClientSwitch.test.ts @@ -3,55 +3,55 @@ import type { EIP1193Provider } from "viem"; import { createSwitchWalletChain } from "../../src/lib/utils/walletClient"; describe("switchWalletChain", () => { - it("uses walletClient.switchChain when available", async () => { - const getCurrentProvider = mock(async () => undefined); - const switchWalletChain = createSwitchWalletChain({ getCurrentProvider }); - const switchChain = mock(async () => undefined); - const walletClient = { switchChain } as unknown as Parameters[0]; - await switchWalletChain(walletClient, 8453); - expect(switchChain).toHaveBeenCalledWith({ id: 8453 }); - expect(getCurrentProvider).not.toHaveBeenCalled(); - }); + it("uses walletClient.switchChain when available", async () => { + const getCurrentProvider = mock(async () => undefined); + const switchWalletChain = createSwitchWalletChain({ getCurrentProvider }); + const switchChain = mock(async () => undefined); + const walletClient = { switchChain } as unknown as Parameters[0]; + await switchWalletChain(walletClient, 8453); + expect(switchChain).toHaveBeenCalledWith({ id: 8453 }); + expect(getCurrentProvider).not.toHaveBeenCalled(); + }); - it("falls back to provider wallet_switchEthereumChain", async () => { - const getCurrentProvider = mock(async () => undefined); - const switchWalletChain = createSwitchWalletChain({ getCurrentProvider }); - const request = mock(async () => null); - const walletClient = {} as unknown as Parameters[0]; - const provider = { request } as unknown as NonNullable< - Parameters[2] - >["provider"]; - await switchWalletChain(walletClient, 8453, { provider }); - expect(request).toHaveBeenCalledWith({ - method: "wallet_switchEthereumChain", - params: [{ chainId: "0x2105" }] - }); - expect(getCurrentProvider).not.toHaveBeenCalled(); - }); + it("falls back to provider wallet_switchEthereumChain", async () => { + const getCurrentProvider = mock(async () => undefined); + const switchWalletChain = createSwitchWalletChain({ getCurrentProvider }); + const request = mock(async () => null); + const walletClient = {} as unknown as Parameters[0]; + const provider = { request } as unknown as NonNullable< + Parameters[2] + >["provider"]; + await switchWalletChain(walletClient, 8453, { provider }); + expect(request).toHaveBeenCalledWith({ + method: "wallet_switchEthereumChain", + params: [{ chainId: "0x2105" }] + }); + expect(getCurrentProvider).not.toHaveBeenCalled(); + }); - it("falls back to injected getCurrentProvider when no provider is passed", async () => { - const request = mock(async () => null); - const provider = { request } as unknown as EIP1193Provider; - const getCurrentProvider = mock(async () => provider); - const switchWalletChain = createSwitchWalletChain({ getCurrentProvider }); - const walletClient = {} as unknown as Parameters[0]; + it("falls back to injected getCurrentProvider when no provider is passed", async () => { + const request = mock(async () => null); + const provider = { request } as unknown as EIP1193Provider; + const getCurrentProvider = mock(async () => provider); + const switchWalletChain = createSwitchWalletChain({ getCurrentProvider }); + const walletClient = {} as unknown as Parameters[0]; - await switchWalletChain(walletClient, 8453); + await switchWalletChain(walletClient, 8453); - expect(getCurrentProvider).toHaveBeenCalledTimes(1); - expect(request).toHaveBeenCalledWith({ - method: "wallet_switchEthereumChain", - params: [{ chainId: "0x2105" }] - }); - }); + expect(getCurrentProvider).toHaveBeenCalledTimes(1); + expect(request).toHaveBeenCalledWith({ + method: "wallet_switchEthereumChain", + params: [{ chainId: "0x2105" }] + }); + }); - it("throws when no provider can be resolved", async () => { - const getCurrentProvider = mock(async () => undefined); - const switchWalletChain = createSwitchWalletChain({ getCurrentProvider }); - const walletClient = {} as unknown as Parameters[0]; + it("throws when no provider can be resolved", async () => { + const getCurrentProvider = mock(async () => undefined); + const switchWalletChain = createSwitchWalletChain({ getCurrentProvider }); + const walletClient = {} as unknown as Parameters[0]; - await expect(switchWalletChain(walletClient, 8453)).rejects.toThrow( - "Wallet client does not support switchChain and no provider is available for chain 8453." - ); - }); + await expect(switchWalletChain(walletClient, 8453)).rejects.toThrow( + "Wallet client does not support switchChain and no provider is available for chain 8453." + ); + }); }); diff --git a/tsconfig.json b/tsconfig.json index f7ccfe4..8e0bd6d 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,22 +1,22 @@ { - "extends": "./.svelte-kit/tsconfig.json", - "compilerOptions": { - "allowJs": true, - "checkJs": true, - "esModuleInterop": true, - "forceConsistentCasingInFileNames": true, - "resolveJsonModule": true, - "skipLibCheck": true, - "sourceMap": true, - "strict": true, - "module": "ESNext", - "moduleResolution": "bundler", - "target": "ESNext" - }, - "exclude": ["tests/e2e", "playwright.config.ts"] - // Path aliases are handled by https://svelte.dev/docs/kit/configuration#alias - // except $lib which is handled by https://svelte.dev/docs/kit/configuration#files - // - // If you want to overwrite includes/excludes, make sure to copy over the relevant includes/excludes - // from the referenced tsconfig.json - TypeScript does not merge them in + "extends": "./.svelte-kit/tsconfig.json", + "compilerOptions": { + "allowJs": true, + "checkJs": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "sourceMap": true, + "strict": true, + "module": "ESNext", + "moduleResolution": "bundler", + "target": "ESNext" + }, + "exclude": ["tests/e2e", "playwright.config.ts"] + // Path aliases are handled by https://svelte.dev/docs/kit/configuration#alias + // except $lib which is handled by https://svelte.dev/docs/kit/configuration#files + // + // If you want to overwrite includes/excludes, make sure to copy over the relevant includes/excludes + // from the referenced tsconfig.json - TypeScript does not merge them in } diff --git a/vite.config.ts b/vite.config.ts index 83ecf56..f12ffff 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -3,8 +3,8 @@ import { sveltekit } from "@sveltejs/kit/vite"; import { defineConfig } from "vite"; export default defineConfig({ - plugins: [tailwindcss(), sveltekit()], - optimizeDeps: { - exclude: ["@electric-sql/pglite"] - } + plugins: [tailwindcss(), sveltekit()], + optimizeDeps: { + exclude: ["@electric-sql/pglite"] + } }); diff --git a/wrangler.jsonc b/wrangler.jsonc deleted file mode 100644 index e787b50..0000000 --- a/wrangler.jsonc +++ /dev/null @@ -1,9 +0,0 @@ -{ - "name": "intent", - "main": ".svelte-kit/cloudflare/_worker.js", - "compatibility_date": "2025-01-01", - "assets": { - "binding": "ASSETS", - "directory": ".svelte-kit/cloudflare" - } -} diff --git a/wrangler.toml b/wrangler.toml new file mode 100644 index 0000000..d00003a --- /dev/null +++ b/wrangler.toml @@ -0,0 +1,32 @@ +name = "lintent-worker" +main = ".svelte-kit/cloudflare/_worker.js" +compatibility_date = "2026-03-06" +compatibility_flags = ["nodejs_compat"] + +# account_id is NOT set here — passed via CLOUDFLARE_ACCOUNT_ID in CI + +[assets] +binding = "ASSETS" +directory = ".svelte-kit/cloudflare" + +[build] +command = "bun run build" + +[env.production] +name = "lintent-worker" +vars = { ENVIRONMENT = "production" } + +[observability] +enabled = true +head_sampling_rate = 1 + +[observability.logs] +enabled = true +invocation_logs = true + +[tags] +lifi = "true" +lintent = "true" + +[placement] +mode = "smart" From c6960077c2af07d8271b7b5778526ef8e29e1aba Mon Sep 17 00:00:00 2001 From: Asem Abdelhady Date: Wed, 6 May 2026 15:17:06 +0200 Subject: [PATCH 17/22] Accommodate intent.ts standardise-order-classes API changes (#39) * accommodate intent.ts standardise-order-classes API changes - add containerToIntent() helper in utils/intent.ts that wraps orderToIntent with automatic namespace detection (solana vs eip155) from OrderContainer - replace all orderToIntent(container) call sites with containerToIntent() - alias StandardOrderIntent as StandardEVMIntent in intentExecution.ts - add local idToToken() in intentList.ts (removed from @lifi/intent exports) * Update @lifi/intent to 0.0.4 and fix breaking API changes - Bump @lifi/intent from 0.0.3-alpha.1 to 0.0.4 - Add chainNamespace field to CoreToken in toCoreTokenContext - Fix containerToIntent: use 'in' narrowing for proper TypeScript overload resolution - Add StandardSolanaIntent guards in IntentFactory compact/escrow methods - Add StandardSolanaIntent guard in Solver.claim before finaliseIntent * fix: CI/CD tests to use secret variables * Merge pull request #41 from lifinance/feature/v2-116-add-recipient-field-on-lintentorg Add optional recipient field for intent outputs --------- Co-authored-by: Alexander Co-authored-by: Claude Opus 4.6 --- .claude/settings.local.json | 12 ++++++ .github/workflows/test.yml | 4 ++ bun.lock | 14 +++---- package.json | 2 +- src/lib/libraries/flowProgress.ts | 6 +-- src/lib/libraries/intentExecution.ts | 2 +- src/lib/libraries/intentFactory.ts | 30 +++++++++++++-- src/lib/libraries/intentList.ts | 4 +- src/lib/libraries/solver.ts | 13 +++---- src/lib/screens/FillIntent.svelte | 4 +- src/lib/screens/Finalise.svelte | 6 +-- src/lib/screens/IntentList.svelte | 4 +- src/lib/screens/IssueIntent.svelte | 27 +++++++++----- src/lib/screens/ReceiveMessage.svelte | 10 ++--- src/lib/state.svelte.ts | 7 ++-- src/lib/utils/intent.ts | 29 ++++++++++++++ src/routes/+page.svelte | 14 +++---- tests/unit/recipientField.test.ts | 54 +++++++++++++++++++++++++++ 18 files changed, 184 insertions(+), 58 deletions(-) create mode 100644 .claude/settings.local.json create mode 100644 src/lib/utils/intent.ts create mode 100644 tests/unit/recipientField.test.ts diff --git a/.claude/settings.local.json b/.claude/settings.local.json new file mode 100644 index 0000000..43f3a6d --- /dev/null +++ b/.claude/settings.local.json @@ -0,0 +1,12 @@ +{ + "permissions": { + "allow": [ + "Bash(bun run format:*)", + "Bash(bun run lint:*)", + "Bash(bunx eslint:*)", + "Bash(bun run check:*)", + "Bash(bun run:*)", + "Bash(bun install:*)" + ] + } +} diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 9e4956f..95a45ed 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -19,6 +19,10 @@ jobs: run: bun install --frozen-lockfile - name: Run checks run: bun run check + env: + PRIVATE_POLYMER_MAINNET_ZONE_API_KEY: ${{ secrets.PRIVATE_POLYMER_MAINNET_ZONE_API_KEY }} + PRIVATE_POLYMER_TESTNET_ZONE_API_KEY: ${{ secrets.PRIVATE_POLYMER_TESTNET_ZONE_API_KEY }} + PUBLIC_WALLET_CONNECT_PROJECT_ID: ${{ secrets.PUBLIC_WALLET_CONNECT_PROJECT_ID }} - name: Run unit tests run: bun run test:unit - name: Upload coverage artifact diff --git a/bun.lock b/bun.lock index 7c7ab35..abf1db4 100644 --- a/bun.lock +++ b/bun.lock @@ -8,7 +8,7 @@ "@base-org/account": "^2.5.1", "@coinbase/wallet-sdk": "^4.3.6", "@electric-sql/pglite": "^0.3.15", - "@lifi/intent": "0.0.3-alpha.1", + "@lifi/intent": "0.0.4", "@metamask/sdk": "^0.34.0", "@safe-global/safe-apps-provider": "~0.18.6", "@safe-global/safe-apps-sdk": "^9.1.0", @@ -231,7 +231,7 @@ "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.29", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ=="], - "@lifi/intent": ["@lifi/intent@0.0.3-alpha.1", "", { "dependencies": { "ky": "^1.12.0", "viem": "~2.45.1" } }, "sha512-dzEcS8U5buW7nLpkMmC0kj5R7EQC7l8l1mBd9IWr6R5/vSnSF3kO9zVaNQOmrbezSOS9TROrOpGDUWc847d/Uw=="], + "@lifi/intent": ["@lifi/intent@0.0.4", "", { "dependencies": { "borsh": "^2.0.0", "ky": "^1.12.0", "viem": "~2.45.1" } }, "sha512-T9wJGAY6sW6JcunEusXIvehxZcg2pRkaK0b+PUpSje2234yfZSmmcUPS1QTRxB6Iq6XROYopl6aUBIqzTHznew=="], "@lit-labs/ssr-dom-shim": ["@lit-labs/ssr-dom-shim@1.5.1", "", {}, "sha512-Aou5UdlSpr5whQe8AA/bZG0jMj96CoJIWbGfZ91qieWu5AWUMKw8VR/pAkQkJYvBNhmCcWnZlyyk5oze8JIqYA=="], @@ -649,7 +649,7 @@ "bn.js": ["bn.js@5.2.3", "", {}, "sha512-EAcmnPkxpntVL+DS7bO1zhcZNvCkxqtkd0ZY53h06GNQ3DEkkGZ/gKgmDv6DdZQGj9BgfSPKtJJ7Dp1GPP8f7w=="], - "borsh": ["borsh@0.7.0", "", { "dependencies": { "bn.js": "^5.2.0", "bs58": "^4.0.0", "text-encoding-utf-8": "^1.0.2" } }, "sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA=="], + "borsh": ["borsh@2.0.0", "", {}, "sha512-kc9+BgR3zz9+cjbwM8ODoUB4fs3X3I5A/HtX7LZKxCLaMrEeDFoBpnhZY//DTS1VZBSs6S5v46RZRbZjRFspEg=="], "bowser": ["bowser@2.14.1", "", {}, "sha512-tzPjzCxygAKWFOJP011oxFHs57HzIhOEracIgAePE4pqB3LikALKnSzUyU4MGs9/iCEUuHlAJTjTc5M+u7YEGg=="], @@ -1497,6 +1497,8 @@ "@solana/web3.js/@noble/curves": ["@noble/curves@1.9.7", "", { "dependencies": { "@noble/hashes": "1.8.0" } }, "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw=="], + "@solana/web3.js/borsh": ["borsh@0.7.0", "", { "dependencies": { "bn.js": "^5.2.0", "bs58": "^4.0.0", "text-encoding-utf-8": "^1.0.2" } }, "sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA=="], + "@solana/web3.js/bs58": ["bs58@4.0.1", "", { "dependencies": { "base-x": "^3.0.2" } }, "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw=="], "@typescript-eslint/eslint-plugin/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], @@ -1537,8 +1539,6 @@ "anymatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], - "borsh/bs58": ["bs58@4.0.1", "", { "dependencies": { "base-x": "^3.0.2" } }, "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw=="], - "cliui/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], "cliui/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], @@ -1709,8 +1709,6 @@ "@walletconnect/utils/ox/@noble/curves": ["@noble/curves@1.9.1", "", { "dependencies": { "@noble/hashes": "1.8.0" } }, "sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA=="], - "borsh/bs58/base-x": ["base-x@3.0.11", "", { "dependencies": { "safe-buffer": "^5.0.1" } }, "sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA=="], - "cliui/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], "cliui/string-width/is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], @@ -1813,8 +1811,6 @@ "@solana/web3.js/bs58/base-x/safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], - "borsh/bs58/base-x/safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], - "yargs/find-up/locate-path/p-locate": ["p-locate@4.1.0", "", { "dependencies": { "p-limit": "^2.2.0" } }, "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A=="], "yargs/string-width/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], diff --git a/package.json b/package.json index 8c9dd76..e3b0aaa 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,7 @@ "@base-org/account": "^2.5.1", "@coinbase/wallet-sdk": "^4.3.6", "@electric-sql/pglite": "^0.3.15", - "@lifi/intent": "0.0.3-alpha.1", + "@lifi/intent": "0.0.4", "@metamask/sdk": "^0.34.0", "@safe-global/safe-apps-provider": "~0.18.6", "@safe-global/safe-apps-sdk": "^9.1.0", diff --git a/src/lib/libraries/flowProgress.ts b/src/lib/libraries/flowProgress.ts index c4e59a3..ccdfb29 100644 --- a/src/lib/libraries/flowProgress.ts +++ b/src/lib/libraries/flowProgress.ts @@ -15,7 +15,7 @@ import { hashStruct, keccak256 } from "viem"; import { compactTypes } from "@lifi/intent"; import { getOutputHash, encodeMandateOutput } from "@lifi/intent"; import { addressToBytes32, bytes32ToAddress } from "@lifi/intent"; -import { orderToIntent } from "@lifi/intent"; +import { containerToIntent } from "$lib/utils/intent"; import { getOrFetchRpc } from "$lib/libraries/rpcCache"; import type { MandateOutput, OrderContainer } from "@lifi/intent"; import store from "$lib/state.svelte"; @@ -128,7 +128,7 @@ async function isOutputValidatedOnChain( async function isInputChainFinalised(chainId: bigint, container: OrderContainer) { const { order, inputSettler } = container; const inputChainClient = getClient(chainId); - const intent = orderToIntent(container); + const intent = containerToIntent(container); const orderId = intent.orderId(); if ( @@ -185,7 +185,7 @@ export async function getOrderProgressChecks( fillTransactions: Record ): Promise { try { - const intent = orderToIntent(orderContainer); + const intent = containerToIntent(orderContainer); const orderId = intent.orderId(); const inputChains = intent.inputChains(); const outputs = orderContainer.order.outputs; diff --git a/src/lib/libraries/intentExecution.ts b/src/lib/libraries/intentExecution.ts index c09e07f..373ab7d 100644 --- a/src/lib/libraries/intentExecution.ts +++ b/src/lib/libraries/intentExecution.ts @@ -16,7 +16,7 @@ import { import { compact_type_hash } from "@lifi/intent"; import { addressToBytes32 } from "@lifi/intent"; import { signMultichainCompact, signStandardCompact } from "@lifi/intent"; -import { MultichainOrderIntent, StandardOrderIntent } from "@lifi/intent"; +import { MultichainOrderIntent, StandardEVMIntent as StandardOrderIntent } from "@lifi/intent"; import type { NoSignature, Signature } from "@lifi/intent"; import type { TypedDataSigner } from "@lifi/intent"; import { switchWalletChain } from "$lib/utils/walletClientRuntime"; diff --git a/src/lib/libraries/intentFactory.ts b/src/lib/libraries/intentFactory.ts index 2e7f194..d9ab410 100644 --- a/src/lib/libraries/intentFactory.ts +++ b/src/lib/libraries/intentFactory.ts @@ -16,14 +16,26 @@ import type { Signature, StandardOrder } from "@lifi/intent"; +import { + Intent, + IntentApi, + StandardSolanaIntent, + SOLANA_MAINNET_CHAIN_ID, + SOLANA_TESTNET_CHAIN_ID, + SOLANA_DEVNET_CHAIN_ID +} from "@lifi/intent"; import type { AppCreateIntentOptions, AppTokenContext } from "$lib/appTypes"; import { ERC20_ABI } from "$lib/abi/erc20"; -import { Intent } from "@lifi/intent"; -import { IntentApi } from "@lifi/intent"; import { store } from "$lib/state.svelte"; import { depositAndRegisterCompact, openEscrowIntent, signIntentCompact } from "./intentExecution"; import { intentDeps } from "./coreDeps"; +const SOLANA_CHAIN_IDS = new Set([ + SOLANA_MAINNET_CHAIN_ID, + SOLANA_TESTNET_CHAIN_ID, + SOLANA_DEVNET_CHAIN_ID +]); + const SAME_CHAIN_DURATION_SECONDS = 10 * 60; // 10 minutes const SAME_CHAIN_EXCLUSIVITY_SECONDS = 12 * 3; // 36 seconds @@ -55,12 +67,14 @@ function applyExclusivityOverride( } function toCoreTokenContext(input: AppTokenContext): TokenContext { + const chainId = BigInt(input.token.chainId); return { token: { address: input.token.address, name: input.token.name, - chainId: BigInt(input.token.chainId), - decimals: input.token.decimals + chainId, + decimals: input.token.decimals, + chainNamespace: SOLANA_CHAIN_IDS.has(chainId) ? "solana" : "eip155" }, amount: input.amount }; @@ -75,6 +89,7 @@ function toCoreCreateIntentOptions(opts: AppCreateIntentOptions): CreateIntentOp outputTokens: opts.outputTokens.map(toCoreTokenContext), verifier: opts.verifier, account, + outputRecipient: opts.outputRecipient, lock: { type: "compact", resetPeriod: opts.lock.resetPeriod, @@ -89,6 +104,7 @@ function toCoreCreateIntentOptions(opts: AppCreateIntentOptions): CreateIntentOp outputTokens: opts.outputTokens.map(toCoreTokenContext), verifier: opts.verifier, account, + outputRecipient: opts.outputRecipient, lock: { type: "escrow" } @@ -161,6 +177,8 @@ export class IntentFactory { applySameChainTimings(intentInstance); const sameChain = intentInstance.isSameChain(); const intent = intentInstance.order(); + if (intent instanceof StandardSolanaIntent) + throw new Error("Compact signing is not supported for Solana intents."); applyExclusivityOverride(intent, opts.exclusiveFor, sameChain); const sponsorSignature = await signIntentCompact(intent, account(), this.walletClient); @@ -203,6 +221,8 @@ export class IntentFactory { applySameChainTimings(intentInstance2); const sameChain2 = intentInstance2.isSameChain(); const intent = intentInstance2.singlechain(); + if (intent instanceof StandardSolanaIntent) + throw new Error("Compact deposit and register is not supported for Solana intents."); applyExclusivityOverride(intent, opts.exclusiveFor, sameChain2); if (this.preHook) await this.preHook(inputTokens[0].token.chainId); @@ -242,6 +262,8 @@ export class IntentFactory { applySameChainTimings(intentInstance3); const sameChain3 = intentInstance3.isSameChain(); const intent = intentInstance3.order(); + if (intent instanceof StandardSolanaIntent) + throw new Error("openEscrowIntent is not supported for Solana intents."); applyExclusivityOverride(intent, opts.exclusiveFor, sameChain3); const inputChain = inputTokens[0].token.chainId; diff --git a/src/lib/libraries/intentList.ts b/src/lib/libraries/intentList.ts index d0c3d54..3630fc7 100644 --- a/src/lib/libraries/intentList.ts +++ b/src/lib/libraries/intentList.ts @@ -7,8 +7,8 @@ import { MULTICHAIN_INPUT_SETTLER_ESCROW, MULTICHAIN_INPUT_SETTLER_COMPACT } from "../config"; -import { orderToIntent } from "@lifi/intent"; import { bytes32ToAddress, idToToken } from "@lifi/intent"; +import { containerToIntent } from "$lib/utils/intent"; import type { OrderContainer, StandardOrder, MultichainOrder } from "@lifi/intent"; import { validateOrderContainerWithReason } from "@lifi/intent"; import { orderValidationDeps } from "./coreDeps"; @@ -201,7 +201,7 @@ function getContextDetails(orderContainer: OrderContainer): ContextDetails { export function buildBaseIntentRow(orderContainer: OrderContainer): BaseIntentRow { const order = orderContainer.order; - const orderId = orderToIntent(orderContainer).orderId(); + const orderId = containerToIntent(orderContainer).orderId(); const inputChipsRaw = getInputs(order); const outputChipsRaw = getOutputs(order); const chainScope = getChainScope(order); diff --git a/src/lib/libraries/solver.ts b/src/lib/libraries/solver.ts index 961b7dd..3035562 100644 --- a/src/lib/libraries/solver.ts +++ b/src/lib/libraries/solver.ts @@ -1,12 +1,12 @@ import { BYTES32_ZERO, COIN_FILLER, getChain, getClient, getOracle, type WC } from "$lib/config"; import { hashStruct, maxUint256, parseEventLogs } from "viem"; import type { MandateOutput, OrderContainer } from "@lifi/intent"; -import { addressToBytes32, bytes32ToAddress } from "@lifi/intent"; +import { addressToBytes32, bytes32ToAddress, StandardSolanaIntent } from "@lifi/intent"; import axios from "axios"; import { POLYMER_ORACLE_ABI } from "$lib/abi/polymeroracle"; import { COIN_FILLER_ABI } from "$lib/abi/outputsettler"; import { ERC20_ABI } from "$lib/abi/erc20"; -import { orderToIntent } from "@lifi/intent"; +import { containerToIntent } from "$lib/utils/intent"; import { compactTypes } from "@lifi/intent"; import store from "$lib/state.svelte"; import { finaliseIntent } from "./intentExecution"; @@ -66,7 +66,7 @@ export class Solver { orderContainer: { order, inputSettler }, outputs } = args; - const orderId = orderToIntent({ order, inputSettler }).orderId(); + const orderId = containerToIntent(args.orderContainer).orderId(); const outputChainId = Number(outputs[0].chainId); const outputChain = getChain(outputChainId); @@ -310,10 +310,9 @@ export class Solver { const { preHook, postHook, account } = opts; const { orderContainer, fillTransactionHashes, sourceChainId } = args; const { order, inputSettler } = orderContainer; - const intent = orderToIntent({ - inputSettler, - order - }); + const intent = containerToIntent(orderContainer); + if (intent instanceof StandardSolanaIntent) + throw new Error("Finalise is not supported for Solana input intents."); if (fillTransactionHashes.length !== order.outputs.length) { throw new Error( `Fill transaction hash count (${fillTransactionHashes.length}) does not match output count (${order.outputs.length}).` diff --git a/src/lib/screens/FillIntent.svelte b/src/lib/screens/FillIntent.svelte index 018d95a..11907e9 100644 --- a/src/lib/screens/FillIntent.svelte +++ b/src/lib/screens/FillIntent.svelte @@ -11,7 +11,7 @@ import ChainActionRow from "$lib/components/ui/ChainActionRow.svelte"; import TokenAmountChip from "$lib/components/ui/TokenAmountChip.svelte"; import store from "$lib/state.svelte"; - import { orderToIntent } from "@lifi/intent"; + import { containerToIntent } from "$lib/utils/intent"; import { compactTypes } from "@lifi/intent"; import { hashStruct } from "viem"; @@ -110,7 +110,7 @@ $effect(() => { refreshValidation; - const orderId = orderToIntent(orderContainer).orderId(); + const orderId = containerToIntent(orderContainer).orderId(); if (autoScrolledOrderId === orderId) return; const outputs = sortOutputsByChain(orderContainer).flatMap(([, chainOutputs]) => chainOutputs); diff --git a/src/lib/screens/Finalise.svelte b/src/lib/screens/Finalise.svelte index e3ec236..87a5f5d 100644 --- a/src/lib/screens/Finalise.svelte +++ b/src/lib/screens/Finalise.svelte @@ -22,7 +22,7 @@ import { SETTLER_ESCROW_ABI } from "$lib/abi/escrow"; import { idToToken } from "@lifi/intent"; import store from "$lib/state.svelte"; - import { orderToIntent } from "@lifi/intent"; + import { containerToIntent } from "$lib/utils/intent"; import { hashStruct } from "viem"; import { compactTypes } from "@lifi/intent"; @@ -41,7 +41,7 @@ let refreshClaimed = $state(0); let claimedByChain = $state>({}); let claimStatusRun = 0; - const inputChains = $derived(orderToIntent(orderContainer).inputChains()); + const inputChains = $derived(containerToIntent(orderContainer).inputChains()); const getInputsForChain = (container: OrderContainer, inputChain: bigint): [bigint, bigint][] => { const { order } = container; if ("originChainId" in order) { @@ -89,7 +89,7 @@ const { order, inputSettler } = container; const inputChainClient = getClient(chainId); - const intent = orderToIntent(container); + const intent = containerToIntent(container); const orderId = intent.orderId(); // Determine the order type. if ( diff --git a/src/lib/screens/IntentList.svelte b/src/lib/screens/IntentList.svelte index 4f2c3a1..f216c90 100644 --- a/src/lib/screens/IntentList.svelte +++ b/src/lib/screens/IntentList.svelte @@ -1,7 +1,7 @@ diff --git a/src/lib/screens/IssueIntent.svelte b/src/lib/screens/IssueIntent.svelte index 96f0914..d038bb1 100644 --- a/src/lib/screens/IssueIntent.svelte +++ b/src/lib/screens/IssueIntent.svelte @@ -34,12 +34,16 @@ const resolveExclusiveFor = (value: string): `0x${string}` | undefined => isAddress(value, { strict: false }) ? value : undefined; + const resolveRecipient = (value: string): `0x${string}` | undefined => + isAddress(value, { strict: false }) ? value : undefined; + const intentOptions = $derived.by( (): AppCreateIntentOptions => ({ exclusiveFor: resolveExclusiveFor(store.exclusiveFor), inputTokens: store.inputTokens, outputTokens: store.outputTokens, verifier: store.verifier, + outputRecipient: resolveRecipient(store.recipient), lock: store.intentType === "compact" ? { @@ -293,6 +297,19 @@
+
+ Recipient + 0 && !resolveRecipient(store.recipient) + ? "error" + : "default"} + bind:value={store.recipient} + /> +
Verifier {#if sameChain} @@ -330,15 +347,7 @@
- {#if !true} - - {:else if !allowanceCheck} + {#if !allowanceCheck} {#snippet name()} Set allowance diff --git a/src/lib/screens/ReceiveMessage.svelte b/src/lib/screens/ReceiveMessage.svelte index c867b68..3d2d430 100644 --- a/src/lib/screens/ReceiveMessage.svelte +++ b/src/lib/screens/ReceiveMessage.svelte @@ -12,7 +12,7 @@ import ChainActionRow from "$lib/components/ui/ChainActionRow.svelte"; import TokenAmountChip from "$lib/components/ui/TokenAmountChip.svelte"; import store from "$lib/state.svelte"; - import { orderToIntent } from "@lifi/intent"; + import { containerToIntent } from "$lib/utils/intent"; import { compactTypes } from "@lifi/intent"; // This script needs to be updated to be able to fetch the associated events of fills. Currently, this presents an issue since it can only fill single outputs. @@ -90,11 +90,11 @@ // const validations = $derived( // orderContainer.order.outputs.map((output) => { - // return orderToIntent(orderContainer) + // return containerToIntent(orderContainer) // .inputChains() // .map((inputChain) => { // return isValidated( - // orderToIntent(orderContainer).orderId(), + // containerToIntent(orderContainer).orderId(), // inputChain, // orderContainer, // output, @@ -110,7 +110,7 @@ $effect(() => { refreshValidation; - const intent = orderToIntent(orderContainer); + const intent = containerToIntent(orderContainer); const orderId = intent.orderId(); if (autoScrolledOrderId === orderId) return; @@ -161,7 +161,7 @@ description="Click on each output and wait until they turn green. Polymer does not support batch validation. Continue to the right." >
- {#each orderToIntent(orderContainer).inputChains() as inputChain} + {#each containerToIntent(orderContainer).inputChains() as inputChain} {#snippet action()} diff --git a/src/lib/state.svelte.ts b/src/lib/state.svelte.ts index e6ce9ba..c24fabb 100644 --- a/src/lib/state.svelte.ts +++ b/src/lib/state.svelte.ts @@ -25,7 +25,7 @@ import { tokens as tokensTable } from "./schema"; import { and, eq, ne, notInArray } from "drizzle-orm"; -import { orderToIntent } from "@lifi/intent"; +import { containerToIntent } from "./utils/intent"; import { getOrFetchRpc, invalidateRpcPrefix } from "./libraries/rpcCache"; import { getCurrentConnection, @@ -60,7 +60,7 @@ class Store { async saveOrderToDb(order: OrderContainer) { if (!browser) return; if (!db) await initDb(); - const orderId = orderToIntent(order).orderId(); + const orderId = containerToIntent(order).orderId(); const now = Math.floor(Date.now() / 1000); const id = (order as any).id ?? generateUUID(); const intentType = (order as any).intentType ?? "escrow"; @@ -99,7 +99,7 @@ class Store { console.warn("saveOrderToDb db write failed", { orderId, error }); } } - const idx = this.orders.findIndex((o) => orderToIntent(o).orderId() === orderId); + const idx = this.orders.findIndex((o) => containerToIntent(o).orderId() === orderId); if (idx >= 0) this.orders[idx] = order; else this.orders.push(order); } @@ -285,6 +285,7 @@ class Store { allocatorId = $state(ALWAYS_OK_ALLOCATOR); verifier = $state("polymer"); exclusiveFor: string = $state(""); + recipient: string = $state(""); useExclusiveForQuoteRequest = $state(false); invalidateWalletReadCache(scope: "all" | "balance" | "allowance" | "compact" = "all") { diff --git a/src/lib/utils/intent.ts b/src/lib/utils/intent.ts new file mode 100644 index 0000000..8d2f266 --- /dev/null +++ b/src/lib/utils/intent.ts @@ -0,0 +1,29 @@ +import { + orderToIntent, + SOLANA_MAINNET_CHAIN_ID, + SOLANA_TESTNET_CHAIN_ID, + SOLANA_DEVNET_CHAIN_ID, + StandardEVMIntent, + StandardSolanaIntent, + MultichainOrderIntent +} from "@lifi/intent"; +import type { OrderContainer } from "@lifi/intent"; + +const SOLANA_CHAIN_IDS = new Set([ + SOLANA_MAINNET_CHAIN_ID, + SOLANA_TESTNET_CHAIN_ID, + SOLANA_DEVNET_CHAIN_ID +]); + +export function containerToIntent( + container: OrderContainer +): StandardEVMIntent | StandardSolanaIntent | MultichainOrderIntent { + const { inputSettler, order } = container; + if (!("originChainId" in order)) { + return orderToIntent({ namespace: "eip155", inputSettler, order }); + } + if (SOLANA_CHAIN_IDS.has(order.originChainId)) { + return orderToIntent({ namespace: "solana", inputSettler, order }); + } + return orderToIntent({ namespace: "eip155", inputSettler, order }); +} diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index ac2492e..2f0a900 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -12,7 +12,7 @@ import ConnectWallet from "$lib/screens/ConnectWallet.svelte"; import FlowStepTracker from "$lib/components/ui/FlowStepTracker.svelte"; import store from "$lib/state.svelte"; - import { orderToIntent } from "@lifi/intent"; + import { containerToIntent } from "$lib/utils/intent"; // Fix bigint so we can json serialize it: (BigInt.prototype as any).toJSON = function () { @@ -70,8 +70,8 @@ const orderContainer = { ...order, allocatorSignature, sponsorSignature }; // Deduplicate: only add if not already present - const orderId = orderToIntent(orderContainer).orderId(); - const alreadyExists = store.orders.some((o) => orderToIntent(o).orderId() === orderId); + const orderId = containerToIntent(orderContainer).orderId(); + const alreadyExists = store.orders.some((o) => containerToIntent(o).orderId() === orderId); if (alreadyExists) return; store.orders.push(orderContainer); @@ -103,18 +103,18 @@ let scrollStepProgress = $state(0); async function importOrderById(orderId: `0x${string}`): Promise<"inserted" | "updated"> { const importedOrder = await intentApi.getOrderByOnChainOrderId(orderId); - const importedOrderId = orderToIntent(importedOrder).orderId(); + const importedOrderId = containerToIntent(importedOrder).orderId(); const existingIndex = store.orders.findIndex( - (o) => orderToIntent(o).orderId() === importedOrderId + (o) => containerToIntent(o).orderId() === importedOrderId ); await store.saveOrderToDb(importedOrder); selectedOrder = - store.orders.find((o) => orderToIntent(o).orderId() === importedOrderId) ?? importedOrder; + store.orders.find((o) => containerToIntent(o).orderId() === importedOrderId) ?? importedOrder; return existingIndex >= 0 ? "updated" : "inserted"; } async function deleteOrderById(orderId: `0x${string}`): Promise { await store.deleteOrderFromDb(orderId); - if (selectedOrder && orderToIntent(selectedOrder).orderId() === orderId) { + if (selectedOrder && containerToIntent(selectedOrder).orderId() === orderId) { selectedOrder = undefined; } } diff --git a/tests/unit/recipientField.test.ts b/tests/unit/recipientField.test.ts new file mode 100644 index 0000000..73d3edd --- /dev/null +++ b/tests/unit/recipientField.test.ts @@ -0,0 +1,54 @@ +import { describe, expect, it } from "bun:test"; +import { isAddress } from "viem"; + +// Mirrors the resolveRecipient helper in IssueIntent.svelte +const resolveRecipient = (value: string): `0x${string}` | undefined => + isAddress(value, { strict: false }) ? (value as `0x${string}`) : undefined; + +describe("resolveRecipient", () => { + it("returns the address for a valid checksummed EVM address", () => { + const addr = "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045"; + expect(resolveRecipient(addr)).toBe(addr); + }); + + it("returns the address for a valid lowercase EVM address (strict: false)", () => { + const addr = "0xd8da6bf26964af9d7eed9e03e53415d37aa96045"; + expect(resolveRecipient(addr)).toBe(addr); + }); + + it("returns undefined for an empty string", () => { + expect(resolveRecipient("")).toBeUndefined(); + }); + + it("returns undefined for a partial address", () => { + expect(resolveRecipient("0x1234")).toBeUndefined(); + }); + + it("returns undefined for arbitrary non-address text", () => { + expect(resolveRecipient("alice.eth")).toBeUndefined(); + }); + + it("returns undefined for a hex string that is too long", () => { + expect(resolveRecipient("0x" + "a".repeat(42))).toBeUndefined(); + }); +}); + +describe("outputRecipient in AppCreateIntentOptions", () => { + it("is undefined when recipient field is empty", () => { + const recipient = ""; + const outputRecipient = resolveRecipient(recipient); + expect(outputRecipient).toBeUndefined(); + }); + + it("is set when a valid address is provided", () => { + const recipient = "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045"; + const outputRecipient = resolveRecipient(recipient); + expect(outputRecipient).toBe(recipient); + }); + + it("is undefined for an invalid address, so wallet default is used", () => { + const recipient = "not-an-address"; + const outputRecipient = resolveRecipient(recipient); + expect(outputRecipient).toBeUndefined(); + }); +}); From 4bab8f132e360239d76288939a246b46b13cfd3a Mon Sep 17 00:00:00 2001 From: Alexander Date: Wed, 6 May 2026 15:15:53 +0200 Subject: [PATCH 18/22] fix: replace StandardOrderIntent alias with canonical StandardEVMIntent name Co-Authored-By: Claude Opus 4.6 --- src/lib/libraries/intentExecution.ts | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/lib/libraries/intentExecution.ts b/src/lib/libraries/intentExecution.ts index 373ab7d..780ecb7 100644 --- a/src/lib/libraries/intentExecution.ts +++ b/src/lib/libraries/intentExecution.ts @@ -16,7 +16,7 @@ import { import { compact_type_hash } from "@lifi/intent"; import { addressToBytes32 } from "@lifi/intent"; import { signMultichainCompact, signStandardCompact } from "@lifi/intent"; -import { MultichainOrderIntent, StandardEVMIntent as StandardOrderIntent } from "@lifi/intent"; +import { MultichainOrderIntent, StandardEVMIntent } from "@lifi/intent"; import type { NoSignature, Signature } from "@lifi/intent"; import type { TypedDataSigner } from "@lifi/intent"; import { switchWalletChain } from "$lib/utils/walletClientRuntime"; @@ -33,12 +33,12 @@ function combineSignatures(signatures: { } export function signIntentCompact( - intent: StandardOrderIntent | MultichainOrderIntent, + intent: StandardEVMIntent | MultichainOrderIntent, account: `0x${string}`, walletClient: WC ): Promise<`0x${string}`> { const signer = walletClient as unknown as TypedDataSigner; - if (intent instanceof StandardOrderIntent) { + if (intent instanceof StandardEVMIntent) { const order = intent.asOrder(); return signStandardCompact(account, signer, order.originChainId, intent.asBatchCompact()); } @@ -52,7 +52,7 @@ export function signIntentCompact( } export async function depositAndRegisterCompact( - intent: StandardOrderIntent, + intent: StandardEVMIntent, account: `0x${string}`, walletClient: WC ): Promise<`0x${string}`> { @@ -69,11 +69,11 @@ export async function depositAndRegisterCompact( } export async function openEscrowIntent( - intent: StandardOrderIntent | MultichainOrderIntent, + intent: StandardEVMIntent | MultichainOrderIntent, account: `0x${string}`, walletClient: WC ): Promise<`0x${string}`[]> { - if (intent instanceof StandardOrderIntent) { + if (intent instanceof StandardEVMIntent) { const order = intent.asOrder(); await switchWalletChain(walletClient, Number(order.originChainId)); const chain = getChain(order.originChainId); @@ -109,7 +109,7 @@ export async function openEscrowIntent( } export async function finaliseIntent(options: { - intent: StandardOrderIntent | MultichainOrderIntent; + intent: StandardEVMIntent | MultichainOrderIntent; sourceChainId: number | bigint; account: `0x${string}`; walletClient: WC; @@ -122,7 +122,7 @@ export async function finaliseIntent(options: { const { intent, sourceChainId, account, walletClient, solveParams, signatures } = options; const actionChain = getChain(sourceChainId); - if (intent instanceof StandardOrderIntent) { + if (intent instanceof StandardEVMIntent) { const order = intent.asOrder(); if (actionChain.id !== Number(order.originChainId)) { throw new Error( From 78b799e96e050c20e79a6c7580784dd3f0f9b3a1 Mon Sep 17 00:00:00 2001 From: Alexander Date: Wed, 6 May 2026 15:22:58 +0200 Subject: [PATCH 19/22] chore: bump version to 0.1.0 for first minor release Co-Authored-By: Claude Opus 4.6 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e3b0aaa..42ac1a3 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "cat-swapper", "private": true, - "version": "0.0.1", + "version": "0.1.0", "type": "module", "scripts": { "dev": "vite dev", From ff2b664588b24e693f4a22f27adbdfc8e0b47be8 Mon Sep 17 00:00:00 2001 From: Alexander Date: Wed, 6 May 2026 16:30:56 +0200 Subject: [PATCH 20/22] fix: resolve security findings and harden server routes Pin third-party GitHub Actions to SHA hashes, add fork-PR guards to deploy workflow, bump axios to fix follow-redirects vulnerability, add input validation and error handling to all server routes, await DB writes in intentFactory, and remove unsafe type casts. Co-Authored-By: Claude Opus 4.6 --- .env.e2e.example | 2 +- .github/workflows/deploy.yml | 20 ++- .github/workflows/test.yml | 4 +- bun.lock | 14 +- package.json | 4 +- src/lib/components/ui/ScreenFrame.svelte | 4 +- src/lib/libraries/intentFactory.ts | 17 +-- src/lib/libraries/solver.ts | 3 +- src/routes/allocator/+server.ts | 137 ++++++++++-------- src/routes/polymer/+server.ts | 172 +++++++++++++---------- src/routes/polymer/health/+server.ts | 102 +++++++++----- 11 files changed, 281 insertions(+), 198 deletions(-) diff --git a/.env.e2e.example b/.env.e2e.example index c5ff30b..9741418 100644 --- a/.env.e2e.example +++ b/.env.e2e.example @@ -1,4 +1,4 @@ -E2E_PRIVATE_KEY= +E2E_PRIVATE_KEY=your-test-private-key-here E2E_CHAIN_ID=8453 E2E_BASE_RPC_URL=https://base-rpc.publicnode.com E2E_ARBITRUM_RPC_URL=https://arbitrum-rpc.publicnode.com diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 5c9a897..ed15e02 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -23,7 +23,7 @@ jobs: node-version: "20" - name: Setup Bun - uses: oven-sh/setup-bun@v2 + uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2.2.0 with: bun-version: latest @@ -38,7 +38,7 @@ jobs: run: bun run build - name: Deploy to Cloudflare Workers - uses: cloudflare/wrangler-action@v3 + uses: cloudflare/wrangler-action@9acf94ace14e7dc412b076f2c5c20b8ce93c79cd # v3.15.0 env: PRIVATE_POLYMER_MAINNET_ZONE_API_KEY: ${{ secrets.PRIVATE_POLYMER_MAINNET_ZONE_API_KEY }} PRIVATE_POLYMER_TESTNET_ZONE_API_KEY: ${{ secrets.PRIVATE_POLYMER_TESTNET_ZONE_API_KEY }} @@ -50,7 +50,10 @@ jobs: command: deploy --env production deploy-preview: - if: github.event_name == 'pull_request' && github.event.action != 'closed' + if: > + github.event_name == 'pull_request' && + github.event.action != 'closed' && + github.event.pull_request.head.repo.full_name == github.repository runs-on: ubuntu-latest name: Deploy Preview permissions: @@ -66,7 +69,7 @@ jobs: node-version: "20" - name: Setup Bun - uses: oven-sh/setup-bun@v2 + uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2.2.0 with: bun-version: latest @@ -82,7 +85,7 @@ jobs: - name: Deploy to Cloudflare Workers id: deploy - uses: cloudflare/wrangler-action@v3 + uses: cloudflare/wrangler-action@9acf94ace14e7dc412b076f2c5c20b8ce93c79cd # v3.15.0 env: PRIVATE_POLYMER_MAINNET_ZONE_API_KEY: ${{ secrets.PRIVATE_POLYMER_MAINNET_ZONE_API_KEY }} PRIVATE_POLYMER_TESTNET_ZONE_API_KEY: ${{ secrets.PRIVATE_POLYMER_TESTNET_ZONE_API_KEY }} @@ -116,12 +119,15 @@ jobs: } cleanup-preview: - if: github.event_name == 'pull_request' && github.event.action == 'closed' + if: > + github.event_name == 'pull_request' && + github.event.action == 'closed' && + github.event.pull_request.head.repo.full_name == github.repository runs-on: ubuntu-latest name: Cleanup Preview Worker steps: - name: Delete preview worker - uses: cloudflare/wrangler-action@v3 + uses: cloudflare/wrangler-action@9acf94ace14e7dc412b076f2c5c20b8ce93c79cd # v3.15.0 with: apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }} accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 95a45ed..64a06fc 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -12,7 +12,7 @@ jobs: - name: Checkout uses: actions/checkout@v4 - name: Setup Bun - uses: oven-sh/setup-bun@v2 + uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2.2.0 with: bun-version: latest - name: Install dependencies @@ -39,7 +39,7 @@ jobs: - name: Checkout uses: actions/checkout@v4 - name: Setup Bun - uses: oven-sh/setup-bun@v2 + uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2.2.0 with: bun-version: latest - name: Install dependencies diff --git a/bun.lock b/bun.lock index abf1db4..74c3e51 100644 --- a/bun.lock +++ b/bun.lock @@ -8,7 +8,7 @@ "@base-org/account": "^2.5.1", "@coinbase/wallet-sdk": "^4.3.6", "@electric-sql/pglite": "^0.3.15", - "@lifi/intent": "0.0.4", + "@lifi/intent": "0.1.0", "@metamask/sdk": "^0.34.0", "@safe-global/safe-apps-provider": "~0.18.6", "@safe-global/safe-apps-sdk": "^9.1.0", @@ -16,7 +16,7 @@ "@wagmi/connectors": "^7.2.1", "@wagmi/core": "^3.4.0", "@walletconnect/ethereum-provider": "^2.21.1", - "axios": "^1.9.0", + "axios": "^1.13.6", "base64-js": "^1.5.1", "drizzle-orm": "^0.45.1", "porto": "~0.2.35", @@ -231,7 +231,7 @@ "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.29", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ=="], - "@lifi/intent": ["@lifi/intent@0.0.4", "", { "dependencies": { "borsh": "^2.0.0", "ky": "^1.12.0", "viem": "~2.45.1" } }, "sha512-T9wJGAY6sW6JcunEusXIvehxZcg2pRkaK0b+PUpSje2234yfZSmmcUPS1QTRxB6Iq6XROYopl6aUBIqzTHznew=="], + "@lifi/intent": ["@lifi/intent@0.1.0", "", { "dependencies": { "borsh": "^2.0.0", "ky": "^1.12.0", "viem": "~2.45.1" } }, "sha512-oAMQqrzpM3mNG3CKb+6Gq7BG2SqbsLfwoPK1KcLKv+5WZOTmYfcH3pKQvdsz6pxWrzjWyjwL5nk4TJD1G5XElA=="], "@lit-labs/ssr-dom-shim": ["@lit-labs/ssr-dom-shim@1.5.1", "", {}, "sha512-Aou5UdlSpr5whQe8AA/bZG0jMj96CoJIWbGfZ91qieWu5AWUMKw8VR/pAkQkJYvBNhmCcWnZlyyk5oze8JIqYA=="], @@ -629,7 +629,7 @@ "available-typed-arrays": ["available-typed-arrays@1.0.7", "", { "dependencies": { "possible-typed-array-names": "^1.0.0" } }, "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ=="], - "axios": ["axios@1.11.0", "", { "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.4", "proxy-from-env": "^1.1.0" } }, "sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA=="], + "axios": ["axios@1.13.6", "", { "dependencies": { "follow-redirects": "^1.15.11", "form-data": "^4.0.5", "proxy-from-env": "^1.1.0" } }, "sha512-ChTCHMouEe2kn713WHbQGcuYrr6fXTBiu460OTwWrWob16g1bXn4vtz07Ope7ewMozJAnEquLk5lWQWtBig9DQ=="], "axios-retry": ["axios-retry@4.5.0", "", { "dependencies": { "is-retry-allowed": "^2.2.0" }, "peerDependencies": { "axios": "0.x || 1.x" } }, "sha512-aR99oXhpEDGo0UuAlYcn2iGRds30k366Zfa05XWScR9QaQD4JYiP3/1Qt1u7YlefUOK+cn0CcwoL1oefavQUlQ=="], @@ -879,7 +879,7 @@ "for-each": ["for-each@0.3.5", "", { "dependencies": { "is-callable": "^1.2.7" } }, "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg=="], - "form-data": ["form-data@4.0.4", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "hasown": "^2.0.2", "mime-types": "^2.1.12" } }, "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow=="], + "form-data": ["form-data@4.0.5", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "hasown": "^2.0.2", "mime-types": "^2.1.12" } }, "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w=="], "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], @@ -1427,8 +1427,6 @@ "@coinbase/cdp-sdk/abitype": ["abitype@1.0.6", "", { "peerDependencies": { "typescript": ">=5.0.4", "zod": "^3 >=3.22.0" }, "optionalPeers": ["typescript", "zod"] }, "sha512-MMSqYh4+C/aVqI2RQaWqbvI4Kxo5cQV40WQ4QFtDnNzCkqChm8MuENhElmynZlO0qUy/ObkEUaXtKqYnx1Kp3A=="], - "@coinbase/cdp-sdk/axios": ["axios@1.13.6", "", { "dependencies": { "follow-redirects": "^1.15.11", "form-data": "^4.0.5", "proxy-from-env": "^1.1.0" } }, "sha512-ChTCHMouEe2kn713WHbQGcuYrr6fXTBiu460OTwWrWob16g1bXn4vtz07Ope7ewMozJAnEquLk5lWQWtBig9DQ=="], - "@coinbase/cdp-sdk/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], "@coinbase/wallet-sdk/clsx": ["clsx@1.2.1", "", {}, "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg=="], @@ -1621,8 +1619,6 @@ "youch/cookie": ["cookie@1.0.2", "", {}, "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA=="], - "@coinbase/cdp-sdk/axios/form-data": ["form-data@4.0.5", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "hasown": "^2.0.2", "mime-types": "^2.1.12" } }, "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w=="], - "@esbuild-kit/core-utils/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.18.20", "", { "os": "android", "cpu": "arm" }, "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw=="], "@esbuild-kit/core-utils/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.18.20", "", { "os": "android", "cpu": "arm64" }, "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ=="], diff --git a/package.json b/package.json index 42ac1a3..34383bd 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,7 @@ "@base-org/account": "^2.5.1", "@coinbase/wallet-sdk": "^4.3.6", "@electric-sql/pglite": "^0.3.15", - "@lifi/intent": "0.0.4", + "@lifi/intent": "0.1.0", "@metamask/sdk": "^0.34.0", "@safe-global/safe-apps-provider": "~0.18.6", "@safe-global/safe-apps-sdk": "^9.1.0", @@ -57,7 +57,7 @@ "@wagmi/connectors": "^7.2.1", "@wagmi/core": "^3.4.0", "@walletconnect/ethereum-provider": "^2.21.1", - "axios": "^1.9.0", + "axios": "^1.13.6", "base64-js": "^1.5.1", "drizzle-orm": "^0.45.1", "porto": "~0.2.35", diff --git a/src/lib/components/ui/ScreenFrame.svelte b/src/lib/components/ui/ScreenFrame.svelte index af421a3..b3ad6fb 100644 --- a/src/lib/components/ui/ScreenFrame.svelte +++ b/src/lib/components/ui/ScreenFrame.svelte @@ -8,8 +8,8 @@ bodyClass = "mt-2 h-[22rem] overflow-y-auto pr-1", children }: { - title: string; - description: string; + title?: string; + description?: string; contentClass?: string; bodyClass?: string; children?: Snippet; diff --git a/src/lib/libraries/intentFactory.ts b/src/lib/libraries/intentFactory.ts index d9ab410..557381e 100644 --- a/src/lib/libraries/intentFactory.ts +++ b/src/lib/libraries/intentFactory.ts @@ -41,8 +41,9 @@ const SAME_CHAIN_EXCLUSIVITY_SECONDS = 12 * 3; // 36 seconds function applySameChainTimings(intent: Intent): void { if (!intent.isSameChain()) return; - (intent as any).expiry = SAME_CHAIN_DURATION_SECONDS; - (intent as any).fillDeadline = SAME_CHAIN_DURATION_SECONDS; + const mutable = intent as unknown as { expiry: number; fillDeadline: number }; + mutable.expiry = SAME_CHAIN_DURATION_SECONDS; + mutable.fillDeadline = SAME_CHAIN_DURATION_SECONDS; } function applyExclusivityOverride( @@ -61,7 +62,7 @@ function applyExclusivityOverride( ); for (const output of order.outputs) { if (output.context !== "0x") { - (output as any).context = newContext; + output.context = newContext; } } } @@ -144,7 +145,7 @@ export class IntentFactory { if (ordersPointer) this.orders = ordersPointer; } - private saveOrder(options: { + private async saveOrder(options: { order: StandardOrder | MultichainOrder; inputSettler: `0x${string}`; sponsorSignature?: Signature | NoSignature; @@ -165,7 +166,7 @@ export class IntentFactory { } }; this.orders.push(orderContainer); - store.saveOrderToDb(orderContainer).catch((e) => console.warn("saveOrderToDb error", e)); + await store.saveOrderToDb(orderContainer); } compact(opts: AppCreateIntentOptions) { @@ -188,7 +189,7 @@ export class IntentFactory { sponsorSignature }); - this.saveOrder({ + await this.saveOrder({ order: intent.asOrder(), inputSettler: intent.inputSettler, sponsorSignature: { @@ -237,7 +238,7 @@ export class IntentFactory { // You may consider getting the allocator signature before you call depositAndRegisterCompact // Add the order to our local order list. - this.saveOrder({ + await this.saveOrder({ order: intent.asOrder(), inputSettler: INPUT_SETTLER_COMPACT_LIFI }); @@ -281,7 +282,7 @@ export class IntentFactory { if (this.postHook) await this.postHook(); - this.saveOrder({ + await this.saveOrder({ order: intent.asOrder(), inputSettler: store.inputSettler }); diff --git a/src/lib/libraries/solver.ts b/src/lib/libraries/solver.ts index 3035562..b11109e 100644 --- a/src/lib/libraries/solver.ts +++ b/src/lib/libraries/solver.ts @@ -259,7 +259,8 @@ export class Solver { `Polymer proof unavailable for output on ${output.chainId.toString()}. Try again after the fill attestation is indexed.` ); } else if (order.inputOracle === COIN_FILLER) { - const log = logs.find((log) => log.logIndex === logIndex)!; + const log = logs.find((log) => log.logIndex === logIndex); + if (!log) throw new Error(`Log with index ${logIndex} not found`); if (preHook) await preHook(Number(sourceChainId)); const transactionHash = await walletClient.writeContract({ chain: getChain(sourceChainId), diff --git a/src/routes/allocator/+server.ts b/src/routes/allocator/+server.ts index 5a747a6..f3d7e3c 100644 --- a/src/routes/allocator/+server.ts +++ b/src/routes/allocator/+server.ts @@ -11,73 +11,96 @@ function getPolymerKey(mainnet: boolean) { return mainnet ? PRIVATE_POLYMER_MAINNET_ZONE_API_KEY : PRIVATE_POLYMER_TESTNET_ZONE_API_KEY; } +function isHexString(value: unknown): value is `0x${string}` { + return typeof value === "string" && /^0x[0-9a-fA-F]+$/.test(value); +} + +function isPositiveInteger(value: unknown): value is number { + return typeof value === "number" && Number.isInteger(value) && value > 0; +} + export const POST: RequestHandler = async ({ request }) => { - const { - order, - claimHash, - blockNumber, - chainId, - mainnet - }: { + let body: unknown; + try { + body = await request.json(); + } catch { + return json({ error: "Invalid JSON body" }, { status: 400 }); + } + + const { order, claimHash, blockNumber, chainId, mainnet } = body as { order: StandardOrder; claimHash: `0x${string}`; blockNumber: number; chainId: number; mainnet?: boolean; - } = await request.json(); - console.log({ order, claimHash, blockNumber, chainId }); + }; + + if (!order || typeof order !== "object") { + return json({ error: "Missing or invalid 'order'" }, { status: 400 }); + } + if (!isHexString(claimHash)) { + return json({ error: "Missing or invalid 'claimHash'" }, { status: 400 }); + } + if (!isPositiveInteger(blockNumber)) { + return json({ error: "Missing or invalid 'blockNumber'" }, { status: 400 }); + } + if (!isPositiveInteger(chainId)) { + return json({ error: "Missing or invalid 'chainId'" }, { status: 400 }); + } - const PRIVATE_POLYMER_ZONE_API_KEY = getPolymerKey(mainnet ?? true); + try { + const PRIVATE_POLYMER_ZONE_API_KEY = getPolymerKey(mainnet ?? true); - const requestAllocation = await axios.post( - "https://allocator.devnet.polymer.zone/", - { - jsonrpc: "2.0", - id: 1, - method: "allocator_attestCommit", - params: [ - { - chainId, - blockNumber, - claimHash, - order + const requestAllocation = await axios.post( + "https://allocator.devnet.polymer.zone/", + { + jsonrpc: "2.0", + id: 1, + method: "allocator_attestCommit", + params: [ + { + chainId, + blockNumber, + claimHash, + order + } + ] + }, + { + headers: { + Authorization: `Bearer ${PRIVATE_POLYMER_ZONE_API_KEY}`, + "Content-Type": "application/json", + Accept: "application/json" } - ] - }, - { - headers: { - Authorization: `Bearer ${PRIVATE_POLYMER_ZONE_API_KEY}`, - "Content-Type": "application/json", - Accept: "application/json" } - } - ); - - const dat: { - jsonrpc: "2.0"; - id: 1; - result: { - chainId: number; - blockNumber: number; - logIndex: number; - order: StandardOrder; - commitSignature: `0x${string}`; - allocatorSignature: `0x${string}`; - allocatorAddress: `0x${string}`; - claimHash: `0x${string}`; - sponsor: `0x${string}`; - tokenBalances: { - tokenId: `0x${string}`; - balance: `0x${string}`; - }[]; - }; - } = requestAllocation.data; + ); - console.log(dat); + const dat: { + jsonrpc: "2.0"; + id: 1; + result: { + chainId: number; + blockNumber: number; + logIndex: number; + order: StandardOrder; + commitSignature: `0x${string}`; + allocatorSignature: `0x${string}`; + allocatorAddress: `0x${string}`; + claimHash: `0x${string}`; + sponsor: `0x${string}`; + tokenBalances: { + tokenId: `0x${string}`; + balance: `0x${string}`; + }[]; + }; + } = requestAllocation.data; - // create a JSON Response using a header we received - return json({ - allocatorSignature: dat.result.allocatorSignature, - allocatorAddress: dat.result.allocatorAddress - }); + return json({ + allocatorSignature: dat.result.allocatorSignature, + allocatorAddress: dat.result.allocatorAddress + }); + } catch (error) { + console.error("allocator_attestCommit failed", { chainId }); + return json({ error: "Allocator request failed" }, { status: 502 }); + } }; diff --git a/src/routes/polymer/+server.ts b/src/routes/polymer/+server.ts index 98d8df4..b525184 100644 --- a/src/routes/polymer/+server.ts +++ b/src/routes/polymer/+server.ts @@ -17,29 +17,77 @@ function getPolymerKey(mainnet: boolean) { return mainnet ? PRIVATE_POLYMER_MAINNET_ZONE_API_KEY : PRIVATE_POLYMER_TESTNET_ZONE_API_KEY; } +function isPositiveInteger(value: unknown): value is number { + return typeof value === "number" && Number.isInteger(value) && value > 0; +} + export const POST: RequestHandler = async ({ request }) => { - const { srcChainId, srcBlockNumber, globalLogIndex, polymerIndex, mainnet } = - await request.json(); - console.log({ srcChainId, srcBlockNumber, globalLogIndex, polymerIndex, mainnet }); + let body: unknown; + try { + body = await request.json(); + } catch { + return json({ error: "Invalid JSON body" }, { status: 400 }); + } - const POLYMER_URL = getPolymerUrl(mainnet ?? true); - const PRIVATE_POLYMER_ZONE_API_KEY = getPolymerKey(mainnet ?? true); + const { srcChainId, srcBlockNumber, globalLogIndex, polymerIndex, mainnet } = body as { + srcChainId: number; + srcBlockNumber: number; + globalLogIndex: number; + polymerIndex?: number; + mainnet?: boolean; + }; - let polymerRequestIndex = polymerIndex; - if (!polymerRequestIndex) { - const requestProof = await axios.post( + if (!isPositiveInteger(srcChainId)) { + return json({ error: "Missing or invalid 'srcChainId'" }, { status: 400 }); + } + if (!isPositiveInteger(srcBlockNumber)) { + return json({ error: "Missing or invalid 'srcBlockNumber'" }, { status: 400 }); + } + if ( + typeof globalLogIndex !== "number" || + !Number.isInteger(globalLogIndex) || + globalLogIndex < 0 + ) { + return json({ error: "Missing or invalid 'globalLogIndex'" }, { status: 400 }); + } + + try { + const POLYMER_URL = getPolymerUrl(mainnet ?? true); + const PRIVATE_POLYMER_ZONE_API_KEY = getPolymerKey(mainnet ?? true); + + let polymerRequestIndex = polymerIndex; + if (!polymerRequestIndex) { + const requestProof = await axios.post( + POLYMER_URL, + { + jsonrpc: "2.0", + id: 1, + method: "polymer_requestProof", + params: [ + { + srcChainId, + srcBlockNumber, + globalLogIndex + } + ] + }, + { + headers: { + Authorization: `Bearer ${PRIVATE_POLYMER_ZONE_API_KEY}`, + "Content-Type": "application/json", + Accept: "application/json" + } + } + ); + polymerRequestIndex = requestProof.data.result; + } + const requestProofData = await axios.post( POLYMER_URL, { jsonrpc: "2.0", id: 1, - method: "polymer_requestProof", - params: [ - { - srcChainId, - srcBlockNumber, - globalLogIndex - } - ] + method: "polymer_queryProof", + params: [polymerRequestIndex] }, { headers: { @@ -49,62 +97,44 @@ export const POST: RequestHandler = async ({ request }) => { } } ); - polymerRequestIndex = requestProof.data.result; - console.log({ requestProof: requestProof.data }); - } - const requestProofData = await axios.post( - POLYMER_URL, - { - jsonrpc: "2.0", - id: 1, - method: "polymer_queryProof", - params: [polymerRequestIndex] - }, - { - headers: { - Authorization: `Bearer ${PRIVATE_POLYMER_ZONE_API_KEY}`, - "Content-Type": "application/json", - Accept: "application/json" - } + const dat: { + jsonrpc: "2.0"; + id: 1; + result: { + jobID: number; + createdAt: number; + updatedAt: number; + } & ( + | { + status: "error"; + failureReason: string; + } + | { + status: "complete"; + proof: "string"; + } + | { + status: "initialized"; + } + ); + } = requestProofData.data; + + let proof: string | undefined; + if (dat.result.status === "complete") { + proof = dat.result.proof; + const proofBytes = toByteArray(proof); + proof = Array.from(proofBytes) + .map((byte) => byte.toString(16).padStart(2, "0")) + .join(""); } - ); - const dat: { - jsonrpc: "2.0"; - id: 1; - result: { - jobID: number; - createdAt: number; - updatedAt: number; - } & ( - | { - status: "error"; - failureReason: string; - } - | { - status: "complete"; - proof: "string"; - } - | { - status: "initialized"; - } - ); - } = requestProofData.data; - let proof: string | undefined; - // decode proof from base64 to hex - if (dat.result.status === "complete") { - proof = dat.result.proof; - const proofBytes = toByteArray(proof); - proof = Array.from(proofBytes) - .map((byte) => byte.toString(16).padStart(2, "0")) - .join(""); - } else { - console.log(dat); + return json({ + proof, + polymerIndex: polymerRequestIndex, + status: dat.result.status + }); + } catch (error) { + console.error("polymer proof request failed", { srcChainId }); + return json({ error: "Polymer proof request failed" }, { status: 502 }); } - // create a JSON Response - return json({ - proof, - polymerIndex: polymerRequestIndex, - status: dat.result.status - }); }; diff --git a/src/routes/polymer/health/+server.ts b/src/routes/polymer/health/+server.ts index e6071ca..4318d13 100644 --- a/src/routes/polymer/health/+server.ts +++ b/src/routes/polymer/health/+server.ts @@ -16,50 +16,76 @@ function getPolymerKey(mainnet: boolean) { return mainnet ? PRIVATE_POLYMER_MAINNET_ZONE_API_KEY : PRIVATE_POLYMER_TESTNET_ZONE_API_KEY; } +const MAX_CHAIN_IDS = 20; + export const POST: RequestHandler = async ({ request }) => { - const { chainIds, mainnet }: { chainIds?: number[]; mainnet?: boolean } = await request.json(); + let body: unknown; + try { + body = await request.json(); + } catch { + return json({ error: "Invalid JSON body" }, { status: 400 }); + } - const POLYMER_URL = getPolymerUrl(mainnet ?? true); - const PRIVATE_POLYMER_ZONE_API_KEY = getPolymerKey(mainnet ?? true); + const { chainIds, mainnet } = body as { chainIds?: number[]; mainnet?: boolean }; - const requestProofData = await axios.post( - POLYMER_URL, - { - jsonrpc: "2.0", - id: 1, - method: "info_health", - params: [{ chain_ids: chainIds ?? [] }] - }, - { - headers: { - Authorization: `Bearer ${PRIVATE_POLYMER_ZONE_API_KEY}`, - "Content-Type": "application/json", - Accept: "application/json" - } + if (chainIds !== undefined) { + if (!Array.isArray(chainIds) || chainIds.length > MAX_CHAIN_IDS) { + return json( + { error: `'chainIds' must be an array with at most ${MAX_CHAIN_IDS} elements` }, + { status: 400 } + ); + } + if (!chainIds.every((id) => typeof id === "number" && Number.isInteger(id) && id > 0)) { + return json({ error: "'chainIds' must contain only positive integers" }, { status: 400 }); } - ); + } + + try { + const POLYMER_URL = getPolymerUrl(mainnet ?? true); + const PRIVATE_POLYMER_ZONE_API_KEY = getPolymerKey(mainnet ?? true); + + const requestProofData = await axios.post( + POLYMER_URL, + { + jsonrpc: "2.0", + id: 1, + method: "info_health", + params: [{ chain_ids: chainIds ?? [] }] + }, + { + headers: { + Authorization: `Bearer ${PRIVATE_POLYMER_ZONE_API_KEY}`, + "Content-Type": "application/json", + Accept: "application/json" + } + } + ); - const dat: - | ({ - jsonrpc: "2.0"; - id: 1; - } & { - result: { - status: { - [chainId: string]: "healthy" | "unhealthy"; + const dat: + | ({ + jsonrpc: "2.0"; + id: 1; + } & { + result: { + status: { + [chainId: string]: "healthy" | "unhealthy"; + }; }; - }; - }) - | { error: { code: -32000; message: `unsupported chain ID(s): [${string}]` } } = - requestProofData.data; + }) + | { error: { code: -32000; message: `unsupported chain ID(s): [${string}]` } } = + requestProofData.data; - const failed = "error" in dat; - const status = !failed ? dat.result.status : []; - const error = failed ? dat.error : {}; + const failed = "error" in dat; + const status = !failed ? dat.result.status : []; + const error = failed ? dat.error : {}; - return json({ - failed, - status, - error - }); + return json({ + failed, + status, + error + }); + } catch (error) { + console.error("polymer health check failed"); + return json({ error: "Polymer health check failed" }, { status: 502 }); + } }; From d5ab26a57264b54adf106e0de7b04a13dba93c61 Mon Sep 17 00:00:00 2001 From: Alexander Date: Wed, 6 May 2026 20:27:21 +0200 Subject: [PATCH 21/22] fix: remove all `as any` casts with proper typing Co-Authored-By: Claude Opus 4.6 --- src/app.d.ts | 3 +++ src/lib/libraries/solver.ts | 2 +- src/lib/state.svelte.ts | 13 ++++++++----- src/routes/+page.svelte | 3 +-- 4 files changed, 13 insertions(+), 8 deletions(-) diff --git a/src/app.d.ts b/src/app.d.ts index 520c421..3a0a4bf 100644 --- a/src/app.d.ts +++ b/src/app.d.ts @@ -8,6 +8,9 @@ declare global { // interface PageState {} // interface Platform {} } + interface BigInt { + toJSON(): string; + } } export {}; diff --git a/src/lib/libraries/solver.ts b/src/lib/libraries/solver.ts index b11109e..42817dc 100644 --- a/src/lib/libraries/solver.ts +++ b/src/lib/libraries/solver.ts @@ -42,7 +42,7 @@ export class Solver { Array.isArray((cached as { logs?: unknown[] }).logs) && (cached as { logs?: unknown[] }).logs!.length > 0 ) - return cached as any; + return cached; const receipt = await getClient(chainId).getTransactionReceipt({ hash: txHash }); await Solver.persistReceipt(chainId, txHash, receipt); return receipt; diff --git a/src/lib/state.svelte.ts b/src/lib/state.svelte.ts index c24fabb..ff64a49 100644 --- a/src/lib/state.svelte.ts +++ b/src/lib/state.svelte.ts @@ -1,5 +1,8 @@ import type { OrderContainer } from "@lifi/intent"; +import type { GetTransactionReceiptReturnType } from "viem"; import type { AppTokenContext } from "./appTypes"; + +type OrderContainerWithMeta = OrderContainer & { id?: string; intentType?: string }; import { ALWAYS_OK_ALLOCATOR, clientsById, @@ -54,16 +57,16 @@ class Store { if (!db) await initDb(); if (!db) return; const rows = await db!.select().from(intents); - this.orders = rows.map((r: any) => JSON.parse(r.data) as OrderContainer); + this.orders = rows.map((r) => JSON.parse(r.data) as OrderContainer); } - async saveOrderToDb(order: OrderContainer) { + async saveOrderToDb(order: OrderContainerWithMeta) { if (!browser) return; if (!db) await initDb(); const orderId = containerToIntent(order).orderId(); const now = Math.floor(Date.now() / 1000); - const id = (order as any).id ?? generateUUID(); - const intentType = (order as any).intentType ?? "escrow"; + const id = order.id ?? generateUUID(); + const intentType = order.intentType ?? "escrow"; const data = JSON.stringify(order); if (db) { try { @@ -199,7 +202,7 @@ class Store { const serialized = this.transactionReceipts[`${Number(chainId)}:${txHash}`]; if (!serialized) return undefined; try { - return JSON.parse(serialized) as unknown; + return JSON.parse(serialized) as GetTransactionReceiptReturnType; } catch (error) { console.warn("parse cached transaction receipt failed", { chainId: Number(chainId), diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index 2f0a900..455ead1 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -14,8 +14,7 @@ import store from "$lib/state.svelte"; import { containerToIntent } from "$lib/utils/intent"; - // Fix bigint so we can json serialize it: - (BigInt.prototype as any).toJSON = function () { + BigInt.prototype.toJSON = function () { return this.toString(); }; From 0f4518830f714bdbde785d6122e8de2d239a65b5 Mon Sep 17 00:00:00 2001 From: Alexander Date: Wed, 6 May 2026 20:48:42 +0200 Subject: [PATCH 22/22] chore: update @lifi/intent to 0.1.1 - Bump dependency to local 0.1.1 (adds Tron support, rewires quote API to v1) - Replace removed getInteropableAddress/InteropableAddress with composite key strings in InputTokenModal - Remove quote.validUntil reference in GetQuote (field removed; was always null anyway) Co-Authored-By: Claude Sonnet 4.6 (1M context) --- bun.lock | 30 +++++++++++++++++++++-- package.json | 2 +- src/lib/components/GetQuote.svelte | 3 +-- src/lib/components/InputTokenModal.svelte | 20 ++++++--------- 4 files changed, 38 insertions(+), 17 deletions(-) diff --git a/bun.lock b/bun.lock index 74c3e51..b2a90a1 100644 --- a/bun.lock +++ b/bun.lock @@ -8,7 +8,7 @@ "@base-org/account": "^2.5.1", "@coinbase/wallet-sdk": "^4.3.6", "@electric-sql/pglite": "^0.3.15", - "@lifi/intent": "0.1.0", + "@lifi/intent": "file:../intent.ts", "@metamask/sdk": "^0.34.0", "@safe-global/safe-apps-provider": "~0.18.6", "@safe-global/safe-apps-sdk": "^9.1.0", @@ -231,7 +231,7 @@ "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.29", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ=="], - "@lifi/intent": ["@lifi/intent@0.1.0", "", { "dependencies": { "borsh": "^2.0.0", "ky": "^1.12.0", "viem": "~2.45.1" } }, "sha512-oAMQqrzpM3mNG3CKb+6Gq7BG2SqbsLfwoPK1KcLKv+5WZOTmYfcH3pKQvdsz6pxWrzjWyjwL5nk4TJD1G5XElA=="], + "@lifi/intent": ["@lifi/intent@file:../intent.ts", { "dependencies": { "borsh": "^2.0.0", "ky": "^1.12.0", "viem": "~2.45.1" }, "devDependencies": { "@types/bun": "^1.3.8", "bun": "^1.3.5", "husky": "9.1.7", "lint-staged": "16.1.0", "prettier": "3.4.2", "typescript": "^5.6.3" } }], "@lit-labs/ssr-dom-shim": ["@lit-labs/ssr-dom-shim@1.5.1", "", {}, "sha512-Aou5UdlSpr5whQe8AA/bZG0jMj96CoJIWbGfZ91qieWu5AWUMKw8VR/pAkQkJYvBNhmCcWnZlyyk5oze8JIqYA=="], @@ -279,6 +279,30 @@ "@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="], + "@oven/bun-darwin-aarch64": ["@oven/bun-darwin-aarch64@1.3.13", "", { "os": "darwin", "cpu": "arm64" }, "sha512-qAS6Hg8Q14ckfBuqJ2Zh7gBQSVSUHeibSq4OFqBTv6DzyJuxYlr0sdYQzmYmnbPxbqobekqUDTa/4XEaqRi7vg=="], + + "@oven/bun-darwin-x64": ["@oven/bun-darwin-x64@1.3.13", "", { "os": "darwin", "cpu": "x64" }, "sha512-kGePeDD4IN4imo+H4uLjQGZLmvyYQg+nKr2P0nt4ksXXrWA4HE+mb0/TUPHfRI127DocXQpew+fvrHuHR5mpJQ=="], + + "@oven/bun-darwin-x64-baseline": ["@oven/bun-darwin-x64-baseline@1.3.13", "", { "os": "darwin", "cpu": "x64" }, "sha512-gMEQayUpmCPYaE9zkNBj9TiQqHupnhjOYcuSzxFjzIjHJBUO4VjNnrpbKVeXNs+rKHFothORDd2QKquu5paSPQ=="], + + "@oven/bun-linux-aarch64": ["@oven/bun-linux-aarch64@1.3.13", "", { "os": "linux", "cpu": "arm64" }, "sha512-NbLOJdr+RBFO1vFZ2YUFg4oVJ+2ua6zrwo4ZWRs0jKKcGJWtbY2wY5uz+i0PkwH6b9HYaYDgVTzE4ev06ncYZw=="], + + "@oven/bun-linux-aarch64-musl": ["@oven/bun-linux-aarch64-musl@1.3.13", "", { "os": "linux", "cpu": "arm64" }, "sha512-UV9EE18VE5aRhWtV2L6MTAGGn3slhJJ2OW/m+FJM15maHm0qf1V7TaZY0FovxhdQRvnklSiQ7Ntv0H5TUX4w0g=="], + + "@oven/bun-linux-x64": ["@oven/bun-linux-x64@1.3.13", "", { "os": "linux", "cpu": "x64" }, "sha512-UwttIUXoe9fS+40OcjoaRHgZw+HCPFqBVWEXkXqAJ3W7wA0XPZrWsoMAD9sGh3TaLqrwdiMo5xPogwpXhOtVXA=="], + + "@oven/bun-linux-x64-baseline": ["@oven/bun-linux-x64-baseline@1.3.13", "", { "os": "linux", "cpu": "x64" }, "sha512-fOi4ziKzgJG4UrrNd4AicBs6Fu9GY5xOqg+9tC76nuZNDAdSh6++kzab6TNi1Ck0Yzq6zIBIdGit6/0uSbBn8A=="], + + "@oven/bun-linux-x64-musl": ["@oven/bun-linux-x64-musl@1.3.13", "", { "os": "linux", "cpu": "x64" }, "sha512-+VHhE44kEjCXcTFHyc81zfTxL9+vzh9RqIh7gM1iWNhxpctD9kzntbUkP3UTFTwwNjoou1o8VRyxQafvc4OepA=="], + + "@oven/bun-linux-x64-musl-baseline": ["@oven/bun-linux-x64-musl-baseline@1.3.13", "", { "os": "linux", "cpu": "x64" }, "sha512-fqBKuiiWLEu2dVkowZaXgKS98xfrvBqivdoxRtRP3eINcpI1dcelGbsOz+Xphn7tbGAuBiE1/0AelvvvdqS9rg=="], + + "@oven/bun-windows-aarch64": ["@oven/bun-windows-aarch64@1.3.13", "", { "os": "win32", "cpu": "arm64" }, "sha512-+EvdRWRCRg95Xea4M2lqSJFTjzQBTJDQTMlbG8bmwFkVTN16MdmSH7xhfxVQWUOyZBLEpIwuNFIlBBxVCwSUyQ=="], + + "@oven/bun-windows-x64": ["@oven/bun-windows-x64@1.3.13", "", { "os": "win32", "cpu": "x64" }, "sha512-vqDEFX63ZZQF3YstPSpPD+RxNm5AILPdUuuKpNwsj7ld4NjhdHUYkAmLXDtKNWt9JMRL10bop//W8faY/LV+RQ=="], + + "@oven/bun-windows-x64-baseline": ["@oven/bun-windows-x64-baseline@1.3.13", "", { "os": "win32", "cpu": "x64" }, "sha512-6gy4hhQSjq/T/S9hC9m3NxY0RY+9Ww+XNlB+8koIMTsMSYEjk7Ho+hFHQz1Bn4W61Ub7Vykufg+jgDgPfa2GFA=="], + "@paulmillr/qr": ["@paulmillr/qr@0.2.1", "", {}, "sha512-IHnV6A+zxU7XwmKFinmYjUcwlyK9+xkG3/s9KcQhI9BjQKycrJ1JRO+FbNYPwZiPKW3je/DR0k7w8/gLa5eaxQ=="], "@phosphor-icons/webcomponents": ["@phosphor-icons/webcomponents@2.1.5", "", { "dependencies": { "lit": "^3" } }, "sha512-JcvQkZxvcX2jK+QCclm8+e8HXqtdFW9xV4/kk2aL9Y3dJA2oQVt+pzbv1orkumz3rfx4K9mn9fDoMr1He1yr7Q=="], @@ -667,6 +691,8 @@ "bufferutil": ["bufferutil@4.1.0", "", { "dependencies": { "node-gyp-build": "^4.3.0" } }, "sha512-ZMANVnAixE6AWWnPzlW2KpUrxhm9woycYvPOo67jWHyFowASTEd9s+QN1EIMsSDtwhIxN4sWE1jotpuDUIgyIw=="], + "bun": ["bun@1.3.13", "", { "optionalDependencies": { "@oven/bun-darwin-aarch64": "1.3.13", "@oven/bun-darwin-x64": "1.3.13", "@oven/bun-darwin-x64-baseline": "1.3.13", "@oven/bun-linux-aarch64": "1.3.13", "@oven/bun-linux-aarch64-musl": "1.3.13", "@oven/bun-linux-x64": "1.3.13", "@oven/bun-linux-x64-baseline": "1.3.13", "@oven/bun-linux-x64-musl": "1.3.13", "@oven/bun-linux-x64-musl-baseline": "1.3.13", "@oven/bun-windows-aarch64": "1.3.13", "@oven/bun-windows-x64": "1.3.13", "@oven/bun-windows-x64-baseline": "1.3.13" }, "os": [ "linux", "win32", "darwin", ], "cpu": [ "x64", "arm64", ], "bin": { "bun": "bin/bun.exe", "bunx": "bin/bunx.exe" } }, "sha512-b9T4xZ8KqCHs4+TkHJv540LG1B8OD7noKu0Qaizusx3jFtMDHY6osNqgbaOlwW2B8RB2AKzz+sjzlGKIGxIjZw=="], + "bun-types": ["bun-types@1.3.8", "", { "dependencies": { "@types/node": "*" } }, "sha512-fL99nxdOWvV4LqjmC+8Q9kW3M4QTtTR1eePs94v5ctGqU8OeceWrSUaRw3JYb7tU3FkMIAjkueehrHPPPGKi5Q=="], "call-bind": ["call-bind@1.0.8", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.0", "es-define-property": "^1.0.0", "get-intrinsic": "^1.2.4", "set-function-length": "^1.2.2" } }, "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww=="], diff --git a/package.json b/package.json index 34383bd..91ca7d3 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,7 @@ "@base-org/account": "^2.5.1", "@coinbase/wallet-sdk": "^4.3.6", "@electric-sql/pglite": "^0.3.15", - "@lifi/intent": "0.1.0", + "@lifi/intent": "file:../intent.ts", "@metamask/sdk": "^0.34.0", "@safe-global/safe-apps-provider": "~0.18.6", "@safe-global/safe-apps-sdk": "^9.1.0", diff --git a/src/lib/components/GetQuote.svelte b/src/lib/components/GetQuote.svelte index 3bb606c..fdcd9c9 100644 --- a/src/lib/components/GetQuote.svelte +++ b/src/lib/components/GetQuote.svelte @@ -58,8 +58,7 @@ }); if (response?.quotes?.length ?? 0) { const quote = response.quotes[0]; - quoteExpires = quote.validUntil ?? new Date().getTime() + 30 * 1000; - if (quoteExpires < new Date().getTime()) quoteExpires = new Date().getTime() + 30 * 1000; + quoteExpires = new Date().getTime() + 30 * 1000; quoteDuration = quoteExpires - new Date().getTime(); outputTokens[0].amount = BigInt(quote.preview.outputs[0].amount); exclusiveFor = Array.isArray(quote.metadata.exclusiveFor) diff --git a/src/lib/components/InputTokenModal.svelte b/src/lib/components/InputTokenModal.svelte index 6014a13..aa607cc 100644 --- a/src/lib/components/InputTokenModal.svelte +++ b/src/lib/components/InputTokenModal.svelte @@ -7,7 +7,6 @@ import type { AppTokenContext } from "$lib/appTypes"; import store from "$lib/state.svelte"; import { toBigIntWithDecimals } from "@lifi/intent"; - import { type InteropableAddress, getInteropableAddress } from "@lifi/intent"; const v = (num: number | null) => (num ? num : 0); const formatBalance = (value: bigint, decimals: number) => @@ -21,20 +20,17 @@ currentInputTokens: AppTokenContext[]; } = $props(); - let inputs = $state<{ [index: InteropableAddress]: number | null }>( + let inputs = $state<{ [index: string]: number | null }>( Object.fromEntries( (currentInputTokens ?? []).map(({ token, amount }) => [ - getInteropableAddress(token.address, token.chainId), + `${token.chainId}:${token.address}`, Number(amount) / 10 ** token.decimals ]) ) ); - let enabledByToken = $state<{ [index: InteropableAddress]: boolean }>( + let enabledByToken = $state<{ [index: string]: boolean }>( Object.fromEntries( - (currentInputTokens ?? []).map(({ token }) => [ - getInteropableAddress(token.address, token.chainId), - true - ]) + (currentInputTokens ?? []).map(({ token }) => [`${token.chainId}:${token.address}`, true]) ) ); // svelte-ignore state_referenced_locally @@ -43,11 +39,11 @@ type SortOrder = "largest" | "smallest"; let sortOrder = $state("largest"); const rowColumns = "4.5rem minmax(0,1fr) 2rem"; - const iaddrFor = (token: Token) => getInteropableAddress(token.address, token.chainId); + const iaddrFor = (token: Token) => `${token.chainId}:${token.address}`; - const isEnabled = (address: InteropableAddress) => enabledByToken[address] ?? true; + const isEnabled = (address: string) => enabledByToken[address] ?? true; - function getTokenFor(address: InteropableAddress): Token | undefined { + function getTokenFor(address: string): Token | undefined { for (const token of tokenSet) { const iaddr = iaddrFor(token); if (iaddr === address) return token; @@ -56,7 +52,7 @@ function save() { // Go over every single non-0 instance in the array: - const inputKeys = Object.keys(inputs) as InteropableAddress[]; + const inputKeys = Object.keys(inputs); const inputTokens: AppTokenContext[] = []; for (const key of inputKeys) { // Check that key is a number