diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 48800f0a..f5563185 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -40,6 +40,7 @@ jobs:
scan-ref: "."
format: "sarif"
output: "trivy-results.sarif"
+ trivyignores: .trivyignore
- name: Upload Trivy results to GitHub Security tab
uses: github/codeql-action/upload-sarif@v4
@@ -52,6 +53,9 @@ jobs:
uses: actions/dependency-review-action@v4
with:
fail-on-severity: high
+ # Temporary: axios high vuln in @ledgerhq optional deps (via @aastar/airaccount).
+ # No non-breaking fix available until ledgerhq updates their axios dependency.
+ allow-ghsas: GHSA-43fc-jf86-j433
# Job 2: Code quality checks
quality:
@@ -59,7 +63,7 @@ jobs:
runs-on: ubuntu-latest
strategy:
matrix:
- project: [aastar, aastar-frontend, sdk]
+ project: [aastar, aastar-frontend]
steps:
- uses: actions/checkout@v5
@@ -100,8 +104,6 @@ jobs:
build-command: npm run build
- project: aastar-frontend
build-command: npm run build
- - project: sdk
- build-command: npm run build
steps:
- uses: actions/checkout@v5
@@ -113,11 +115,6 @@ jobs:
- name: Install dependencies
run: npm ci
- # Build SDK first if this is not the SDK build itself
- - name: Build SDK (dependency)
- if: matrix.project != 'sdk'
- run: npm run build --workspace=sdk
-
- name: Build project
run: npm run build --workspace=${{ matrix.project }}
env:
@@ -154,7 +151,7 @@ jobs:
runs-on: ubuntu-latest
strategy:
matrix:
- project: [aastar, aastar-frontend, sdk]
+ project: [aastar, aastar-frontend]
steps:
- uses: actions/checkout@v5
@@ -166,11 +163,6 @@ jobs:
- name: Install dependencies
run: npm ci
- # Build SDK first if this is not the SDK type check itself
- - name: Build SDK (dependency)
- if: matrix.project != 'sdk'
- run: npm run build --workspace=sdk
-
- name: Run TypeScript compiler
run: |
if [ -f ${{ matrix.project }}/package.json ] && jq -e '.scripts["type-check"]' ${{ matrix.project }}/package.json > /dev/null; then
diff --git a/.trivyignore b/.trivyignore
new file mode 100644
index 00000000..a45d73d0
--- /dev/null
+++ b/.trivyignore
@@ -0,0 +1,4 @@
+# Axios DoS via __proto__ in mergeConfig (CVE-2026-25639)
+# Pinned to axios@1.13.2 by @ledgerhq/domain-service (exact version, not a range).
+# No non-breaking fix available until ledgerhq updates their internal dependency.
+CVE-2026-25639
diff --git a/aastar-frontend/app/auth/login/page.tsx b/aastar-frontend/app/auth/login/page.tsx
index 204b5999..b845f9e5 100644
--- a/aastar-frontend/app/auth/login/page.tsx
+++ b/aastar-frontend/app/auth/login/page.tsx
@@ -49,7 +49,7 @@ export default function LoginPage() {
});
// Step 3: Browser WebAuthn authentication ceremony
- const credential = await startAuthentication(authResponse.Options as any);
+ const credential = await startAuthentication({ optionsJSON: authResponse.Options as any });
// Step 4: Complete login via backend (backend calls KMS SignHash to verify)
toast.dismiss(loadingToast);
diff --git a/aastar-frontend/app/guardian-sign/page.tsx b/aastar-frontend/app/guardian-sign/page.tsx
new file mode 100644
index 00000000..35d3b1a9
--- /dev/null
+++ b/aastar-frontend/app/guardian-sign/page.tsx
@@ -0,0 +1,466 @@
+"use client";
+
+/**
+ * Guardian Sign Page
+ *
+ * Mobile-optimized page for guardian devices to sign an acceptance hash.
+ * Accessed via QR code scan. URL params:
+ * - acceptanceHash: the raw keccak256 hash to sign
+ * - factory: factory contract address
+ * - chainId: numeric chain ID
+ * - owner: future account owner address
+ * - salt: numeric salt
+ *
+ * Signing flow (Passkey):
+ * 1. Guardian enters their wallet address (KMS key address)
+ * 2. KMS BeginAuthentication → browser WebAuthn ceremony
+ * 3. KMS SignHash (EIP-191 prefixed hash) → returns Signature
+ * 4. Page displays guardian address + signature for user to copy/paste
+ *
+ * Signing flow (MetaMask):
+ * 1. Guardian clicks "Connect MetaMask" → wallet address auto-filled
+ * 2. Guardian clicks "Sign" → MetaMask personal_sign (EIP-191 applied automatically)
+ * 3. Page displays guardian address + signature for user to copy/paste
+ */
+
+import { Suspense, useState } from "react";
+import { useSearchParams } from "next/navigation";
+import { startAuthentication } from "@simplewebauthn/browser";
+import { kmsClient } from "@/lib/yaaa";
+import { ethers } from "ethers";
+
+type SignMethod = "passkey" | "metamask";
+
+// ── Helper: apply EIP-191 prefix ──────────────────────────────────────────
+// Replicates: ethers.hashMessage(ethers.getBytes(hash))
+// Signs the EIP-191 prefixed version of the 32-byte acceptance hash.
+function applyEip191(rawHash: string): string {
+ return ethers.hashMessage(ethers.getBytes(rawHash));
+}
+
+// ── Copy to clipboard helper ──
+async function copyToClipboard(text: string): Promise {
+ try {
+ await navigator.clipboard.writeText(text);
+ return true;
+ } catch {
+ return false;
+ }
+}
+
+// ── Inner component (uses useSearchParams, must be inside Suspense) ──
+function GuardianSignInner() {
+ const searchParams = useSearchParams();
+
+ const acceptanceHash = searchParams.get("acceptanceHash") || "";
+ const factory = searchParams.get("factory") || "";
+ const chainId = searchParams.get("chainId") || "";
+ const owner = searchParams.get("owner") || "";
+ const salt = searchParams.get("salt") || "";
+
+ const [signMethod, setSignMethod] = useState("passkey");
+ const [guardianAddress, setGuardianAddress] = useState("");
+ const [loading, setLoading] = useState(false);
+ const [error, setError] = useState("");
+ const [result, setResult] = useState<{ address: string; signature: string } | null>(null);
+ const [copied, setCopied] = useState<"address" | "sig" | "both" | null>(null);
+
+ const isValidParams = acceptanceHash && factory && chainId && owner && salt;
+
+ const handleSignWithPasskey = async () => {
+ setError("");
+
+ if (!guardianAddress) {
+ setError("Please enter your guardian wallet address");
+ return;
+ }
+ if (!/^0x[0-9a-fA-F]{40}$/.test(guardianAddress)) {
+ setError("Not a valid Ethereum address");
+ return;
+ }
+
+ setLoading(true);
+ try {
+ const authResponse = await kmsClient.beginAuthentication({
+ Address: guardianAddress,
+ });
+ const credential = await startAuthentication({ optionsJSON: authResponse.Options as any });
+ const hashToSign = applyEip191(acceptanceHash);
+ const signResponse = await kmsClient.signHashWithWebAuthn(
+ hashToSign,
+ authResponse.ChallengeId,
+ credential,
+ { Address: guardianAddress }
+ );
+
+ setResult({
+ address: guardianAddress,
+ signature: signResponse.Signature?.startsWith("0x")
+ ? signResponse.Signature
+ : "0x" + signResponse.Signature,
+ });
+ } catch (err: unknown) {
+ if (err instanceof Error) {
+ if (err.name === "NotAllowedError") {
+ setError("Authentication was cancelled or not allowed. Please try again.");
+ } else if (err.name === "NotSupportedError") {
+ setError("Passkeys are not supported on this device.");
+ } else {
+ setError(err.message || "Signing failed. Please try again.");
+ }
+ } else {
+ setError("Signing failed. Please try again.");
+ }
+ } finally {
+ setLoading(false);
+ }
+ };
+
+ const handleSignWithMetaMask = async () => {
+ setError("");
+
+ if (!("ethereum" in window) || !window.ethereum) {
+ setError("MetaMask not detected. Please install MetaMask and try again.");
+ return;
+ }
+
+ setLoading(true);
+ try {
+ const provider = new ethers.BrowserProvider(window.ethereum as ethers.Eip1193Provider);
+ await provider.send("eth_requestAccounts", []);
+ const signer = await provider.getSigner();
+ const address = await signer.getAddress();
+
+ // personal_sign automatically applies EIP-191 prefix to the raw bytes
+ const signature = await signer.signMessage(ethers.getBytes(acceptanceHash));
+
+ setResult({ address, signature });
+ } catch (err: unknown) {
+ if (err instanceof Error) {
+ if (err.message.includes("user rejected") || err.message.includes("User denied")) {
+ setError("Signature request was rejected.");
+ } else {
+ setError(err.message || "Signing failed. Please try again.");
+ }
+ } else {
+ setError("Signing failed. Please try again.");
+ }
+ } finally {
+ setLoading(false);
+ }
+ };
+
+ const handleSign = signMethod === "metamask" ? handleSignWithMetaMask : handleSignWithPasskey;
+
+ const handleCopy = async (field: "address" | "sig" | "both") => {
+ if (!result) return;
+ let text = "";
+ if (field === "address") text = result.address;
+ else if (field === "sig") text = result.signature;
+ else text = `Address: ${result.address}\nSignature: ${result.signature}`;
+
+ const ok = await copyToClipboard(text);
+ if (ok) {
+ setCopied(field);
+ setTimeout(() => setCopied(null), 2000);
+ }
+ };
+
+ if (!isValidParams) {
+ return (
+
+
+
+
+
+ Invalid QR Code
+
+
+ This page must be opened by scanning a valid Guardian QR code. Please ask the account
+ owner to regenerate the QR code.
+
+
+
+
+ );
+ }
+
+ return (
+
+
+ {/* Header */}
+
+
+
Guardian Sign
+
+ Sign as a guardian for an AirAccount
+
+
+
+ {/* Account details */}
+
+
+ Chain ID
+ {chainId}
+
+
+ Owner
+
+ {owner}
+
+
+
+ Factory
+
+ {factory}
+
+
+
+ Salt
+ {salt}
+
+
+
Acceptance Hash
+
+ {acceptanceHash}
+
+
+
+
+ {!result ? (
+ <>
+ {/* Signing method selector */}
+
+
+ How would you like to sign?
+
+
+ Choose either method — both guardians can use the same method or different ones.
+
+
+ { setSignMethod("passkey"); setError(""); }}
+ className={`py-2.5 px-3 rounded-lg border text-sm font-medium transition-colors ${
+ signMethod === "passkey"
+ ? "border-emerald-500 bg-emerald-50 dark:bg-emerald-900/20 text-emerald-700 dark:text-emerald-400"
+ : "border-gray-300 dark:border-gray-600 text-gray-600 dark:text-gray-400 hover:bg-gray-50 dark:hover:bg-gray-700"
+ }`}
+ >
+ Passkey (KMS)
+
+ { setSignMethod("metamask"); setGuardianAddress(""); setError(""); }}
+ className={`py-2.5 px-3 rounded-lg border text-sm font-medium transition-colors ${
+ signMethod === "metamask"
+ ? "border-orange-500 bg-orange-50 dark:bg-orange-900/20 text-orange-700 dark:text-orange-400"
+ : "border-gray-300 dark:border-gray-600 text-gray-600 dark:text-gray-400 hover:bg-gray-50 dark:hover:bg-gray-700"
+ }`}
+ >
+ MetaMask
+
+
+
+
+ {/* Address input — only for passkey mode */}
+ {signMethod === "passkey" && (
+
+
+ Your Guardian Wallet Address
+
+
setGuardianAddress(e.target.value.trim())}
+ placeholder="0x..."
+ disabled={loading}
+ className="block w-full rounded-lg border border-gray-300 dark:border-gray-600 bg-white dark:bg-gray-700 px-4 py-3 text-sm text-gray-900 dark:text-white placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-emerald-500 focus:border-transparent disabled:opacity-50"
+ />
+
+ Enter the Ethereum address associated with your passkey on this device.
+
+
+ )}
+
+ {/* MetaMask info */}
+ {signMethod === "metamask" && (
+
+
+ Your wallet address will be detected automatically when you click Sign.
+
+
+ )}
+
+ {/* Error */}
+ {error && (
+
+ )}
+
+ {/* Sign button */}
+
+ {loading ? (
+ <>
+
+ {signMethod === "metamask" ? "Waiting for MetaMask..." : "Authenticating..."}
+ >
+ ) : signMethod === "metamask" ? (
+ <>
+
+
+
+
+
+ Sign with MetaMask
+ >
+ ) : (
+ <>
+
+
+
+ Sign with Passkey
+ >
+ )}
+
+ >
+ ) : (
+ /* Signature result */
+
+
+
+ Signature complete! Copy the values below and paste them into the desktop app.
+
+
+ {/* Address */}
+
+
+
+ Your Address
+
+ handleCopy("address")}
+ className="text-xs text-blue-600 dark:text-blue-400 hover:underline"
+ >
+ {copied === "address" ? "Copied!" : "Copy"}
+
+
+
+ {result.address}
+
+
+
+ {/* Signature */}
+
+
+
+ Signature
+
+ handleCopy("sig")}
+ className="text-xs text-blue-600 dark:text-blue-400 hover:underline"
+ >
+ {copied === "sig" ? "Copied!" : "Copy"}
+
+
+
+ {result.signature}
+
+
+
+ {/* Copy all button */}
+
handleCopy("both")}
+ className="w-full py-2.5 px-4 rounded-xl border border-gray-300 dark:border-gray-600 text-sm font-semibold text-gray-700 dark:text-gray-300 hover:bg-gray-50 dark:hover:bg-gray-700 transition-colors"
+ >
+ {copied === "both" ? "Copied!" : "Copy Address + Signature"}
+
+
+ )}
+
+ {/* Info footer */}
+
+
+ {signMethod === "metamask"
+ ? "Signing with EIP-191 via MetaMask."
+ : "Signing with EIP-191. Your passkey never leaves this device."}
+
+
+
+
+ );
+}
+
+// ── Page export wrapped in Suspense (required for useSearchParams) ──
+export default function GuardianSignPage() {
+ return (
+
+
+
+ }
+ >
+
+
+ );
+}
diff --git a/aastar-frontend/app/layout.tsx b/aastar-frontend/app/layout.tsx
index 1f5b1d7b..b75bb083 100644
--- a/aastar-frontend/app/layout.tsx
+++ b/aastar-frontend/app/layout.tsx
@@ -4,6 +4,7 @@ import "./globals.css";
import { Toaster } from "react-hot-toast";
import { ThemeProvider } from "@/lib/theme";
import { DashboardProvider } from "@/contexts/DashboardContext";
+import { TaskProvider } from "@/contexts/TaskContext";
const inter = Inter({ subsets: ["latin"] });
@@ -47,8 +48,10 @@ export default function RootLayout({
- {children}
-
+
+ {children}
+
+
diff --git a/aastar-frontend/app/paymaster/page.tsx b/aastar-frontend/app/paymaster/page.tsx
index 3c193415..a39f8346 100644
--- a/aastar-frontend/app/paymaster/page.tsx
+++ b/aastar-frontend/app/paymaster/page.tsx
@@ -6,7 +6,6 @@ import { paymasterAPI } from "@/lib/api";
import SwipeableListItem from "@/components/SwipeableListItem";
import toast from "react-hot-toast";
import { PlusIcon, CheckCircleIcon, ExclamationCircleIcon } from "@heroicons/react/24/outline";
-
interface Paymaster {
name: string;
address: string;
@@ -338,7 +337,7 @@ export default function PaymasterPage() {
-
+
{paymaster.configured ? (
API Configured
diff --git a/aastar-frontend/app/recovery/page.tsx b/aastar-frontend/app/recovery/page.tsx
new file mode 100644
index 00000000..b802704a
--- /dev/null
+++ b/aastar-frontend/app/recovery/page.tsx
@@ -0,0 +1,376 @@
+"use client";
+
+import { useState } from "react";
+import Layout from "@/components/Layout";
+import { guardianAPI } from "@/lib/api";
+import toast from "react-hot-toast";
+
+type Step = "setup" | "initiate" | "support" | "execute" | "done";
+
+interface RecoveryState {
+ accountAddress: string;
+ newSignerAddress: string;
+ guardian1Address: string;
+ guardian2Address: string;
+}
+
+const ZERO: RecoveryState = {
+ accountAddress: "",
+ newSignerAddress: "",
+ guardian1Address: "",
+ guardian2Address: "",
+};
+
+function isAddress(v: string) {
+ return /^0x[0-9a-fA-F]{40}$/.test(v);
+}
+
+export default function RecoveryPage() {
+ const [step, setStep] = useState("setup");
+ const [form, setForm] = useState(ZERO);
+ const [loading, setLoading] = useState(false);
+ const [pendingRecovery, setPendingRecovery] = useState(null);
+
+ const set = (field: keyof RecoveryState) => (e: React.ChangeEvent) =>
+ setForm(prev => ({ ...prev, [field]: e.target.value.trim() }));
+
+ // ── Step 1: register guardians + move to initiate ──────────────────────
+ const handleSetup = async () => {
+ if (!isAddress(form.accountAddress)) return toast.error("Invalid account address");
+ if (!isAddress(form.newSignerAddress)) return toast.error("Invalid new signer address");
+ if (!isAddress(form.guardian1Address)) return toast.error("Invalid guardian 1 address");
+ if (!isAddress(form.guardian2Address)) return toast.error("Invalid guardian 2 address");
+ if (form.guardian1Address.toLowerCase() === form.guardian2Address.toLowerCase())
+ return toast.error("Guardian 1 and Guardian 2 must be different addresses");
+
+ setLoading(true);
+ try {
+ // Register both guardians in the database (idempotent — duplicate calls are safe)
+ await guardianAPI.addGuardian({ guardianAddress: form.guardian1Address });
+ await guardianAPI.addGuardian({ guardianAddress: form.guardian2Address });
+ toast.success("Guardians registered");
+ setStep("initiate");
+ } catch (err: unknown) {
+ const msg =
+ (err as any)?.response?.data?.message || (err as Error).message || "Failed to register guardians";
+ toast.error(msg);
+ } finally {
+ setLoading(false);
+ }
+ };
+
+ // ── Step 2: guardian 1 initiates recovery ─────────────────────────────
+ const handleInitiate = async () => {
+ setLoading(true);
+ try {
+ const res = await guardianAPI.initiateRecovery({
+ accountAddress: form.accountAddress,
+ newSignerAddress: form.newSignerAddress,
+ });
+ setPendingRecovery(res.data);
+ toast.success("Recovery initiated");
+ setStep("support");
+ } catch (err: unknown) {
+ const msg =
+ (err as any)?.response?.data?.message || (err as Error).message || "Failed to initiate recovery";
+ toast.error(msg);
+ } finally {
+ setLoading(false);
+ }
+ };
+
+ // ── Step 3: guardian 2 supports recovery ──────────────────────────────
+ const handleSupport = async () => {
+ setLoading(true);
+ try {
+ const res = await guardianAPI.supportRecovery({ accountAddress: form.accountAddress });
+ setPendingRecovery(res.data);
+ toast.success("Recovery supported");
+ setStep("execute");
+ } catch (err: unknown) {
+ const msg =
+ (err as any)?.response?.data?.message || (err as Error).message || "Failed to support recovery";
+ toast.error(msg);
+ } finally {
+ setLoading(false);
+ }
+ };
+
+ // ── Step 4: execute recovery (after timelock) ──────────────────────────
+ const handleExecute = async () => {
+ setLoading(true);
+ try {
+ await guardianAPI.executeRecovery({ accountAddress: form.accountAddress });
+ toast.success("Account recovered successfully!");
+ setStep("done");
+ } catch (err: unknown) {
+ const msg =
+ (err as any)?.response?.data?.message || (err as Error).message || "Failed to execute recovery";
+ toast.error(msg);
+ } finally {
+ setLoading(false);
+ }
+ };
+
+ const handleCancel = async () => {
+ if (!confirm("Cancel this recovery request?")) return;
+ setLoading(true);
+ try {
+ await guardianAPI.cancelRecovery({ accountAddress: form.accountAddress });
+ toast.success("Recovery cancelled");
+ setStep("setup");
+ setPendingRecovery(null);
+ } catch (err: unknown) {
+ const msg =
+ (err as any)?.response?.data?.message || (err as Error).message || "Failed to cancel recovery";
+ toast.error(msg);
+ } finally {
+ setLoading(false);
+ }
+ };
+
+ const stepLabels: Record = {
+ setup: "1. Setup",
+ initiate: "2. Initiate",
+ support: "3. Support",
+ execute: "4. Execute",
+ done: "Done",
+ };
+
+ const stepKeys: Step[] = ["setup", "initiate", "support", "execute"];
+ const currentIdx = stepKeys.indexOf(step);
+
+ return (
+
+
+
Social Recovery
+
+ Recover an AirAccount by collecting 2-of-3 guardian approvals.
+
+
+ {/* Step progress */}
+ {step !== "done" && (
+
+ {stepKeys.map((s, idx) => (
+
+
+ {idx < currentIdx ? "✓" : idx + 1}
+
+ {idx < stepKeys.length - 1 && (
+
+ )}
+
+ ))}
+
+ {stepLabels[step]}
+
+
+ )}
+
+ {/* ── Step 1: Setup ── */}
+ {step === "setup" && (
+
+
+ Enter the account to recover, the new owner address, and the two guardian addresses.
+ The guardians will each need to approve the recovery.
+
+
+ {[
+ { label: "Account Address (to recover)", field: "accountAddress" as const, placeholder: "0x... (the AirAccount)" },
+ { label: "New Signer Address", field: "newSignerAddress" as const, placeholder: "0x... (new owner)" },
+ { label: "Guardian 1 Address", field: "guardian1Address" as const, placeholder: "0x..." },
+ { label: "Guardian 2 Address", field: "guardian2Address" as const, placeholder: "0x..." },
+ ].map(({ label, field, placeholder }) => (
+
+
+ {label}
+
+
+
+ ))}
+
+
+ {loading ? "Registering..." : "Register Guardians & Continue"}
+
+
+ )}
+
+ {/* ── Step 2: Initiate (Guardian 1) ── */}
+ {step === "initiate" && (
+
+
+
Guardian 1 — Initiate Recovery
+
+ Log in as {form.guardian1Address} and click
+ Initiate. This records the recovery request with a 48-hour time lock.
+
+
+
+
+
+ Account
+ {form.accountAddress}
+
+
+ New Signer
+ {form.newSignerAddress}
+
+
+
+
+ {loading ? "Initiating..." : "Initiate Recovery (as Guardian 1)"}
+
+
+
setStep("setup")}
+ disabled={loading}
+ className="w-full py-2.5 rounded-lg border border-gray-300 dark:border-gray-600 text-sm text-gray-600 dark:text-gray-400 hover:bg-gray-50 dark:hover:bg-gray-700"
+ >
+ Back
+
+
+ )}
+
+ {/* ── Step 3: Support (Guardian 2) ── */}
+ {step === "support" && (
+
+
+
Guardian 2 — Support Recovery
+
+ Log in as {form.guardian2Address} and click
+ Support. Once both guardians have approved and the 48-hour lock expires, recovery
+ can be executed.
+
+
+
+ {pendingRecovery && (
+
+
+ Execute After
+ {new Date(Number(pendingRecovery.executeAfter)).toLocaleString()}
+
+
+ Supporters
+ {pendingRecovery.supportCount} / {pendingRecovery.quorumRequired}
+
+
+ )}
+
+
+ {loading ? "Supporting..." : "Support Recovery (as Guardian 2)"}
+
+
+
+ Cancel Recovery
+
+
+ )}
+
+ {/* ── Step 4: Execute ── */}
+ {step === "execute" && (
+
+
+
Quorum Reached
+
+ Both guardians have approved. After the 48-hour time lock expires, click Execute
+ to complete the recovery on-chain.
+
+
+
+ {pendingRecovery && (
+
+
+ Execute After
+ {new Date(Number(pendingRecovery.executeAfter)).toLocaleString()}
+
+
+ Time Lock
+
+ {Date.now() >= Number(pendingRecovery.executeAfter) ? (
+ Expired — ready
+ ) : (
+ Not yet expired
+ )}
+
+
+
+ )}
+
+
+ {loading ? "Executing..." : "Execute Recovery"}
+
+
+
+ Cancel Recovery
+
+
+ )}
+
+ {/* ── Done ── */}
+ {step === "done" && (
+
+
+
+ Account Recovered
+
+
+ The account signer has been updated to{" "}
+ {form.newSignerAddress} .
+
+
{ setStep("setup"); setForm(ZERO); setPendingRecovery(null); }}
+ className="mt-4 px-6 py-2.5 rounded-lg bg-blue-600 hover:bg-blue-500 text-white text-sm font-semibold"
+ >
+ Start Over
+
+
+ )}
+
+
+ );
+}
diff --git a/aastar-frontend/app/tasks/[taskId]/page.tsx b/aastar-frontend/app/tasks/[taskId]/page.tsx
new file mode 100644
index 00000000..07aeb8fd
--- /dev/null
+++ b/aastar-frontend/app/tasks/[taskId]/page.tsx
@@ -0,0 +1,401 @@
+"use client";
+
+import { useEffect, useState } from "react";
+import { useRouter, useParams } from "next/navigation";
+import Layout from "@/components/Layout";
+import { useTask } from "@/contexts/TaskContext";
+import { useDashboard } from "@/contexts/DashboardContext";
+import { getStoredAuth } from "@/lib/auth";
+import {
+ type ParsedTask,
+ TaskStatus,
+ TASK_STATUS_COLORS,
+} from "@/lib/task-types";
+import { DEFAULT_REWARD_TOKEN_SYMBOL } from "@/lib/contracts/task-config";
+import {
+ ArrowLeftIcon,
+ UserIcon,
+ CurrencyDollarIcon,
+ ClockIcon,
+ CheckCircleIcon,
+ ExclamationTriangleIcon,
+} from "@heroicons/react/24/outline";
+import { formatDate, formatDateTime } from "@/lib/date-utils";
+import toast from "react-hot-toast";
+import type { WalletClient } from "viem";
+
+function AddressRow({ label, addr }: { label: string; addr: string }) {
+ if (!addr || addr === "0x0000000000000000000000000000000000000000") return null;
+ return (
+
+ {label}
+
+ {addr.slice(0, 8)}…{addr.slice(-6)}
+
+
+ );
+}
+
+function Section({ title, children }: { title: string; children: React.ReactNode }) {
+ return (
+
+
+ {title}
+
+ {children}
+
+ );
+}
+
+export default function TaskDetailPage() {
+ const router = useRouter();
+ const { taskId } = useParams<{ taskId: string }>();
+ const { getTask, acceptTask, submitWork, approveWork, finalizeTask, cancelTask } = useTask();
+ const { data } = useDashboard();
+
+ const [task, setTask] = useState(null);
+ const [loading, setLoading] = useState(true);
+ const [walletClient, setWalletClient] = useState(null);
+ const [actionLoading, setActionLoading] = useState(false);
+ const [evidenceUri, setEvidenceUri] = useState("");
+ const [showEvidenceForm, setShowEvidenceForm] = useState(false);
+
+ const myAddress = data.account?.address?.toLowerCase() ?? "";
+ const isCommunity = task?.community.toLowerCase() === myAddress;
+ const isTaskor = task?.taskor.toLowerCase() === myAddress;
+ const isZeroAddress = (addr: string) =>
+ addr === "0x0000000000000000000000000000000000000000";
+
+ useEffect(() => {
+ const { token } = getStoredAuth();
+ if (!token) router.push("/auth/login");
+ }, [router]);
+
+ useEffect(() => {
+ async function loadWallet() {
+ if (typeof window === "undefined") return;
+ const { createWalletClient, custom } = await import("viem");
+ const { SUPPORTED_CHAIN } = await import("@/lib/contracts/task-config");
+ const provider = (window as Window & { ethereum?: unknown }).ethereum;
+ if (!provider) return;
+ setWalletClient(
+ createWalletClient({
+ chain: SUPPORTED_CHAIN,
+ transport: custom(provider as Parameters[0]),
+ })
+ );
+ }
+ loadWallet();
+ }, []);
+
+ useEffect(() => {
+ if (!taskId) return;
+ setLoading(true);
+ getTask(taskId)
+ .then((t) => setTask(t))
+ .finally(() => setLoading(false));
+ }, [taskId, getTask]);
+
+ const refresh = async () => {
+ if (!taskId) return;
+ const t = await getTask(taskId);
+ setTask(t);
+ };
+
+ async function runAction(fn: () => Promise, successMsg: string) {
+ if (!walletClient) {
+ toast.error("No wallet connected");
+ return;
+ }
+ setActionLoading(true);
+ const toastId = toast.loading("Sending transaction...");
+ try {
+ const ok = await fn();
+ toast.dismiss(toastId);
+ if (ok) {
+ toast.success(successMsg);
+ await refresh();
+ } else {
+ toast.error("Transaction failed");
+ }
+ } catch (err) {
+ toast.dismiss(toastId);
+ toast.error(err instanceof Error ? err.message : "Error");
+ } finally {
+ setActionLoading(false);
+ }
+ }
+
+ function getTitle(uri: string): string {
+ try {
+ return JSON.parse(uri).title ?? "Untitled Task";
+ } catch {
+ return uri.slice(0, 60) || "Untitled Task";
+ }
+ }
+
+ function getDescription(uri: string): string {
+ try {
+ return JSON.parse(uri).description ?? "";
+ } catch {
+ return uri;
+ }
+ }
+
+ if (loading) {
+ return (
+
+
+
+ );
+ }
+
+ if (!task) {
+ return (
+
+
+
Task not found
+
router.push("/tasks")}
+ className="mt-4 text-emerald-600 dark:text-emerald-400 hover:underline text-sm"
+ >
+ ← Back to market
+
+
+
+ );
+ }
+
+ const isOpen = task.status === TaskStatus.Open;
+ const isAccepted = task.status === TaskStatus.Accepted || task.status === TaskStatus.InProgress;
+ const isSubmitted = task.status === TaskStatus.Submitted;
+ const isFinalized = task.status === TaskStatus.Finalized;
+ const isRefunded = task.status === TaskStatus.Refunded;
+
+ return (
+
+
+ {/* Header */}
+
+
router.push("/tasks")}
+ className="mt-1 p-2 rounded-lg text-gray-500 hover:bg-gray-100 dark:hover:bg-gray-800 transition-colors shrink-0"
+ >
+
+
+
+
+
+ {getTitle(task.metadataUri)}
+
+
+ {task.statusLabel}
+
+
+
+ {task.taskTypeLabel} · Posted {formatDate(task.createdAt)}
+
+
+
+
+ {/* Description */}
+
+
+ {getDescription(task.metadataUri) || "No description provided."}
+
+
+
+ {/* Reward & Deadline */}
+
+
+
+
+
+ Reward
+
+
+ {task.rewardFormatted} {DEFAULT_REWARD_TOKEN_SYMBOL}
+
+
+
+
+
+ Deadline
+
+
+ {formatDateTime(task.deadline)}
+ {task.isExpired && " (expired)"}
+
+
+ {task.challengeDeadline && (
+
+
+
+ Challenge period ends
+
+
+ {formatDateTime(task.challengeDeadline)}
+
+
+ )}
+
+
+
+ {/* Participants */}
+
+
+ {!isZeroAddress(task.taskor) && (
+
+ )}
+ {!isZeroAddress(task.supplier) && (
+
+ )}
+
+
+ {/* Evidence (if submitted) */}
+ {task.evidenceUri && (
+
+
+ {task.evidenceUri}
+
+
+ )}
+
+ {/* Actions */}
+
+ {/* Claim task (Open → Accepted) */}
+ {isOpen && !isCommunity && !task.isExpired && (
+
+ runAction(() => acceptTask(task.taskId, walletClient!), "Task claimed!")
+ }
+ disabled={actionLoading}
+ className="w-full py-3 rounded-xl bg-emerald-600 hover:bg-emerald-700 disabled:opacity-60 text-white font-semibold text-sm transition-colors"
+ >
+ {actionLoading ? "Processing..." : "Claim This Task"}
+
+ )}
+
+ {/* Submit evidence (Accepted → Submitted) */}
+ {isAccepted && isTaskor && (
+ <>
+ {!showEvidenceForm ? (
+
setShowEvidenceForm(true)}
+ className="w-full py-3 rounded-xl bg-blue-600 hover:bg-blue-700 text-white font-semibold text-sm transition-colors"
+ >
+ Submit Work
+
+ ) : (
+
+
+ Submit your evidence
+
+
+ )}
+ >
+ )}
+
+ {/* Community: approve work (Submitted → Finalized) */}
+ {isSubmitted && isCommunity && (
+
+
+ runAction(() => approveWork(task.taskId, walletClient!), "Work approved! Reward distributed.")
+ }
+ disabled={actionLoading}
+ className="w-full py-3 rounded-xl bg-emerald-600 hover:bg-emerald-700 disabled:opacity-60 text-white font-semibold text-sm transition-colors flex items-center justify-center gap-2"
+ >
+
+ {actionLoading ? "Processing..." : "Approve & Pay Out"}
+
+
+ Or wait for the 3-day challenge period to expire for auto-settlement
+
+
+ )}
+
+ {/* Anyone: finalize after challenge period */}
+ {task.canFinalize && (
+
+ runAction(() => finalizeTask(task.taskId, walletClient!), "Task finalized!")
+ }
+ disabled={actionLoading}
+ className="w-full py-3 rounded-xl bg-gray-700 hover:bg-gray-600 disabled:opacity-60 text-white font-semibold text-sm transition-colors"
+ >
+ {actionLoading ? "Processing..." : "Finalize (Challenge Period Expired)"}
+
+ )}
+
+ {/* Community: cancel open task */}
+ {isOpen && isCommunity && (
+
+ runAction(() => cancelTask(task.taskId, walletClient!), "Task cancelled. Reward refunded.")
+ }
+ disabled={actionLoading}
+ className="w-full py-3 rounded-xl border border-red-300 dark:border-red-700 text-red-600 dark:text-red-400 hover:bg-red-50 dark:hover:bg-red-900/20 font-medium text-sm transition-colors"
+ >
+ Cancel Task
+
+ )}
+
+ {/* Finalized */}
+ {isFinalized && (
+
+
+ Task completed and reward distributed
+
+ )}
+
+ {/* Refunded */}
+ {isRefunded && (
+
+ Task cancelled — reward returned to publisher
+
+ )}
+
+
+
+ );
+}
diff --git a/aastar-frontend/app/tasks/create/page.tsx b/aastar-frontend/app/tasks/create/page.tsx
new file mode 100644
index 00000000..02567fe5
--- /dev/null
+++ b/aastar-frontend/app/tasks/create/page.tsx
@@ -0,0 +1,297 @@
+"use client";
+
+import { useState, useEffect } from "react";
+import { useRouter } from "next/navigation";
+import Layout from "@/components/Layout";
+import { useTask } from "@/contexts/TaskContext";
+import { useDashboard } from "@/contexts/DashboardContext";
+import { getStoredAuth } from "@/lib/auth";
+import { ALL_TASK_TYPES, DEFAULT_REWARD_TOKEN_SYMBOL, TASK_TYPE_GENERAL } from "@/lib/contracts/task-config";
+import { type CreateTaskForm } from "@/lib/task-types";
+import { ArrowLeftIcon, InformationCircleIcon } from "@heroicons/react/24/outline";
+import toast from "react-hot-toast";
+
+const DEADLINE_OPTIONS = [
+ { label: "3 days", value: 3 },
+ { label: "7 days", value: 7 },
+ { label: "14 days", value: 14 },
+ { label: "30 days", value: 30 },
+];
+
+export default function CreateTaskPage() {
+ const router = useRouter();
+ const { createTask, approveToken, checkAllowance, contractConfigured } = useTask();
+ const { data } = useDashboard();
+
+ const [form, setForm] = useState({
+ title: "",
+ description: "",
+ rewardAmount: "",
+ deadlineDays: 7,
+ taskType: TASK_TYPE_GENERAL,
+ });
+ const [step, setStep] = useState<"form" | "approve" | "submit">("form");
+ const [submitting, setSubmitting] = useState(false);
+ const [walletClient, setWalletClient] = useState(null);
+
+ useEffect(() => {
+ const { token } = getStoredAuth();
+ if (!token) {
+ router.push("/auth/login");
+ }
+ }, [router]);
+
+ // Get wallet client from browser provider (MetaMask / injected)
+ useEffect(() => {
+ async function loadWallet() {
+ if (typeof window === "undefined") return;
+ const { createWalletClient, custom } = await import("viem");
+ const { SUPPORTED_CHAIN } = await import("@/lib/contracts/task-config");
+ const provider = (window as Window & { ethereum?: unknown }).ethereum;
+ if (!provider) return;
+ const client = createWalletClient({
+ chain: SUPPORTED_CHAIN,
+ transport: custom(provider as Parameters[0]),
+ });
+ setWalletClient(client);
+ }
+ loadWallet();
+ }, []);
+
+ const handleUpdate = (
+ key: K,
+ value: CreateTaskForm[K]
+ ) => {
+ setForm((prev) => ({ ...prev, [key]: value }));
+ };
+
+ const isValid =
+ form.title.trim().length > 0 &&
+ form.description.trim().length > 0 &&
+ parseFloat(form.rewardAmount) > 0;
+
+ async function handleSubmit() {
+ if (!isValid || !walletClient) return;
+ if (!contractConfigured) {
+ toast.error("Contract not configured. Check NEXT_PUBLIC_TASK_ESCROW_ADDRESS.");
+ return;
+ }
+
+ setSubmitting(true);
+ try {
+ // Step 1: Check and approve token allowance
+ const { parseUnits } = await import("viem");
+ const { DEFAULT_REWARD_TOKEN_DECIMALS } = await import("@/lib/contracts/task-config");
+ const rewardWei = parseUnits(form.rewardAmount, DEFAULT_REWARD_TOKEN_DECIMALS);
+
+ const addresses = await walletClient.getAddresses();
+ const ownerAddress = addresses[0];
+ const currentAllowance = await checkAllowance(ownerAddress);
+
+ if (currentAllowance < rewardWei) {
+ setStep("approve");
+ toast.loading("Approving token spend...", { id: "approve" });
+ const approved = await approveToken(rewardWei, walletClient);
+ toast.dismiss("approve");
+ if (!approved) {
+ toast.error("Token approval failed");
+ setStep("form");
+ return;
+ }
+ toast.success("Token approved");
+ }
+
+ // Step 2: Create task
+ setStep("submit");
+ toast.loading("Creating task on-chain...", { id: "create" });
+ const taskId = await createTask(form, walletClient);
+ toast.dismiss("create");
+
+ if (taskId) {
+ toast.success("Task created successfully!");
+ router.push(`/tasks/${taskId}`);
+ } else {
+ toast.error("Failed to create task");
+ setStep("form");
+ }
+ } catch (err) {
+ toast.error(err instanceof Error ? err.message : "Unexpected error");
+ setStep("form");
+ } finally {
+ setSubmitting(false);
+ }
+ }
+
+ const hasEthereum = typeof window !== "undefined" && !!(window as Window & { ethereum?: unknown }).ethereum;
+
+ return (
+
+
+ {/* Header */}
+
+
router.back()}
+ className="p-2 rounded-lg text-gray-500 hover:bg-gray-100 dark:hover:bg-gray-800 transition-colors"
+ >
+
+
+
+
+ Post a Task
+
+
+ Describe what you need done and set a reward
+
+
+
+
+ {/* No wallet warning */}
+ {!hasEthereum && (
+
+
+
+ No wallet detected. Install MetaMask or another Web3 wallet to create tasks on-chain.
+
+
+ )}
+
+
+ {/* Title */}
+
+
+ Task Title *
+
+ handleUpdate("title", e.target.value)}
+ placeholder="e.g. Design a landing page for our community"
+ maxLength={100}
+ className="w-full px-3 py-2.5 rounded-lg border border-gray-200 dark:border-gray-700 bg-transparent text-gray-900 dark:text-white text-sm placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-emerald-500"
+ />
+
+
+ {/* Description */}
+
+
+ Description *
+
+
+
+ {/* Task Type */}
+
+
+ Category
+
+
+ {ALL_TASK_TYPES.map((t) => (
+ handleUpdate("taskType", t.value)}
+ className={`px-3 py-1.5 rounded-full text-sm transition-colors ${
+ form.taskType === t.value
+ ? "bg-emerald-600 text-white"
+ : "bg-gray-100 dark:bg-gray-700 text-gray-600 dark:text-gray-400 hover:bg-gray-200 dark:hover:bg-gray-600"
+ }`}
+ >
+ {t.label}
+
+ ))}
+
+
+
+ {/* Reward */}
+
+
+ Reward ({DEFAULT_REWARD_TOKEN_SYMBOL}) *
+
+
+ handleUpdate("rewardAmount", e.target.value)}
+ placeholder="0.00"
+ min="0"
+ step="0.01"
+ className="w-full px-3 py-2.5 pr-16 rounded-lg border border-gray-200 dark:border-gray-700 bg-transparent text-gray-900 dark:text-white text-sm placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-emerald-500"
+ />
+
+ {DEFAULT_REWARD_TOKEN_SYMBOL}
+
+
+
+ Distribution: 70% to taskor, 20% to supplier (if any), 10% to jury
+
+
+
+ {/* Deadline */}
+
+
+ Deadline
+
+
+ {DEADLINE_OPTIONS.map((opt) => (
+ handleUpdate("deadlineDays", opt.value)}
+ className={`flex-1 py-2 rounded-lg text-sm transition-colors ${
+ form.deadlineDays === opt.value
+ ? "bg-emerald-600 text-white"
+ : "bg-gray-100 dark:bg-gray-700 text-gray-600 dark:text-gray-400 hover:bg-gray-200 dark:hover:bg-gray-600"
+ }`}
+ >
+ {opt.label}
+
+ ))}
+
+
+
+ {/* Summary */}
+ {isValid && (
+
+
Summary
+
+ Reward locked in escrow
+
+ {form.rewardAmount} {DEFAULT_REWARD_TOKEN_SYMBOL}
+
+
+
+ Deadline
+
+ {form.deadlineDays} days from now
+
+
+
+ Challenge period after submission
+ 3 days
+
+
+ )}
+
+ {/* Submit */}
+
+ {submitting
+ ? step === "approve"
+ ? "Approving token..."
+ : "Creating task..."
+ : !walletClient
+ ? "Connect wallet to post"
+ : "Post Task"}
+
+
+
+
+ );
+}
diff --git a/aastar-frontend/app/tasks/page.tsx b/aastar-frontend/app/tasks/page.tsx
new file mode 100644
index 00000000..59389948
--- /dev/null
+++ b/aastar-frontend/app/tasks/page.tsx
@@ -0,0 +1,267 @@
+"use client";
+
+import { useEffect, useState } from "react";
+import { useRouter } from "next/navigation";
+import Layout from "@/components/Layout";
+import { useTask } from "@/contexts/TaskContext";
+import { useDashboard } from "@/contexts/DashboardContext";
+import { getStoredAuth } from "@/lib/auth";
+import { type ParsedTask, TaskStatus, TASK_STATUS_COLORS } from "@/lib/task-types";
+import { DEFAULT_REWARD_TOKEN_SYMBOL } from "@/lib/contracts/task-config";
+import {
+ PlusIcon,
+ MagnifyingGlassIcon,
+ ClockIcon,
+ CurrencyDollarIcon,
+ ArrowPathIcon,
+} from "@heroicons/react/24/outline";
+import { formatDistanceToNow } from "@/lib/date-utils";
+
+type FilterStatus = "all" | "open" | "mine" | "claimed";
+
+function TaskCard({ task }: { task: ParsedTask }) {
+ const router = useRouter();
+ const { data } = useDashboard();
+ const myAddress = data.account?.address?.toLowerCase();
+ const isMine = task.community.toLowerCase() === myAddress;
+ const isClaimed = task.taskor.toLowerCase() === myAddress;
+
+ return (
+ router.push(`/tasks/${task.taskId}`)}
+ className="bg-white dark:bg-gray-800 rounded-xl border border-gray-200 dark:border-gray-700 p-5 cursor-pointer hover:shadow-md hover:border-emerald-300 dark:hover:border-emerald-600 transition-all"
+ >
+
+
+
+ {getTitle(task.metadataUri)}
+
+
+ by {shortenAddress(task.community)}
+ {isMine && (
+
+ (you)
+
+ )}
+
+
+
+ {task.statusLabel}
+
+
+
+
+ {getDescription(task.metadataUri)}
+
+
+
+
+
+ {task.rewardFormatted} {DEFAULT_REWARD_TOKEN_SYMBOL}
+
+
+
+ {task.isExpired
+ ? "Expired"
+ : `Ends ${formatDistanceToNow(task.deadline)}`}
+
+
+
+ {isClaimed && task.status !== TaskStatus.Finalized && (
+
+
+ You claimed this task
+
+
+ )}
+
+ );
+}
+
+function getTitle(metadataUri: string): string {
+ try {
+ const parsed = JSON.parse(metadataUri);
+ return parsed.title ?? "Untitled Task";
+ } catch {
+ return metadataUri.slice(0, 60) || "Untitled Task";
+ }
+}
+
+function getDescription(metadataUri: string): string {
+ try {
+ const parsed = JSON.parse(metadataUri);
+ return parsed.description ?? "";
+ } catch {
+ return "";
+ }
+}
+
+function shortenAddress(addr: string): string {
+ if (!addr || addr === "0x0000000000000000000000000000000000000000") return "—";
+ return `${addr.slice(0, 6)}…${addr.slice(-4)}`;
+}
+
+export default function TasksPage() {
+ const router = useRouter();
+ const { tasks, myTasks, claimedTasks, loading, error, loadAllTasks, loadMyTasks, contractConfigured } =
+ useTask();
+ const { data } = useDashboard();
+ const [filter, setFilter] = useState("all");
+ const [search, setSearch] = useState("");
+
+ useEffect(() => {
+ const { token } = getStoredAuth();
+ if (!token) {
+ router.push("/auth/login");
+ return;
+ }
+ if (data.account?.address) {
+ loadMyTasks(data.account.address);
+ }
+ }, [data.account?.address, loadMyTasks, router]);
+
+ const displayTasks = (() => {
+ let list: ParsedTask[];
+ switch (filter) {
+ case "open":
+ list = tasks.filter((t) => t.status === TaskStatus.Open);
+ break;
+ case "mine":
+ list = myTasks;
+ break;
+ case "claimed":
+ list = claimedTasks;
+ break;
+ default:
+ list = tasks;
+ }
+ if (!search.trim()) return list;
+ const q = search.toLowerCase();
+ return list.filter((t) => {
+ const title = getTitle(t.metadataUri).toLowerCase();
+ const desc = getDescription(t.metadataUri).toLowerCase();
+ return title.includes(q) || desc.includes(q);
+ });
+ })();
+
+ const openCount = tasks.filter((t) => t.status === TaskStatus.Open).length;
+
+ return (
+
+
+ {/* Header */}
+
+
+
+ Task Market
+
+
+ {openCount} open {openCount === 1 ? "task" : "tasks"} available
+
+
+
router.push("/tasks/create")}
+ className="flex items-center gap-2 bg-emerald-600 hover:bg-emerald-700 text-white px-4 py-2 rounded-lg text-sm font-medium transition-colors shadow-sm"
+ >
+
+ Post Task
+
+
+
+ {/* Contract not configured warning */}
+ {!contractConfigured && (
+
+ Contract address not configured. Set{" "}
+
+ NEXT_PUBLIC_TASK_ESCROW_ADDRESS
+ {" "}
+ in your .env.local to connect to the blockchain.
+
+ )}
+
+ {/* Search */}
+
+
+ setSearch(e.target.value)}
+ className="w-full pl-9 pr-4 py-2.5 rounded-lg border border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-800 text-sm text-gray-900 dark:text-white placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-emerald-500"
+ />
+
+
+ {/* Filter Tabs */}
+
+ {(
+ [
+ { key: "all", label: `All (${tasks.length})` },
+ { key: "open", label: `Open (${openCount})` },
+ { key: "mine", label: `Posted (${myTasks.length})` },
+ { key: "claimed", label: `Claimed (${claimedTasks.length})` },
+ ] as { key: FilterStatus; label: string }[]
+ ).map(({ key, label }) => (
+
setFilter(key)}
+ className={`shrink-0 px-3 py-1.5 rounded-full text-sm font-medium transition-colors ${
+ filter === key
+ ? "bg-emerald-600 text-white"
+ : "bg-gray-100 dark:bg-gray-700 text-gray-600 dark:text-gray-400 hover:bg-gray-200 dark:hover:bg-gray-600"
+ }`}
+ >
+ {label}
+
+ ))}
+
loadAllTasks()}
+ disabled={loading}
+ className="shrink-0 ml-auto p-1.5 rounded-full text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 transition-colors"
+ title="Refresh"
+ >
+
+
+
+
+ {/* Error */}
+ {error && (
+
+ {error}
+
+ )}
+
+ {/* Task Grid */}
+ {loading && displayTasks.length === 0 ? (
+
+ ) : displayTasks.length === 0 ? (
+
+
No tasks found
+
+ {filter === "all"
+ ? "Be the first to post a task"
+ : "Try switching to a different filter"}
+
+ {filter === "all" && (
+
router.push("/tasks/create")}
+ className="mt-4 text-emerald-600 dark:text-emerald-400 hover:underline text-sm font-medium"
+ >
+ Post a task →
+
+ )}
+
+ ) : (
+
+ {displayTasks.map((task) => (
+
+ ))}
+
+ )}
+
+
+ );
+}
diff --git a/aastar-frontend/app/transfer/page.tsx b/aastar-frontend/app/transfer/page.tsx
index 6bc2706b..009ba0cd 100644
--- a/aastar-frontend/app/transfer/page.tsx
+++ b/aastar-frontend/app/transfer/page.tsx
@@ -7,7 +7,7 @@ import TokenSelector from "@/components/TokenSelector";
import TransferSkeleton from "@/components/TransferSkeleton";
import { useDashboard } from "@/contexts/DashboardContext";
import { transferAPI, tokenAPI, paymasterAPI, addressBookAPI } from "@/lib/api";
-import { kmsClient } from "@/lib/yaaa";
+import { kmsClient, extractLegacyAssertion } from "@/lib/yaaa";
import { GasEstimate, Token, TokenBalance } from "@/lib/types";
import toast from "react-hot-toast";
import { startAuthentication } from "@simplewebauthn/browser";
@@ -244,10 +244,10 @@ export default function TransferPage() {
// Step 2: Browser WebAuthn authentication ceremony
toast.dismiss(loadingToast);
loadingToast = toast.loading("Please verify with your passkey...");
- const credential = await startAuthentication(authResponse.Options as any);
+ const credential = await startAuthentication({ optionsJSON: authResponse.Options as any });
// Step 3: Extract Legacy assertion (reusable for BLS dual-signing)
- const passkeyAssertion = await kmsClient.extractLegacyAssertion(credential);
+ const passkeyAssertion = await extractLegacyAssertion(credential);
// Step 4: Execute transfer with Legacy assertion
toast.dismiss(loadingToast);
@@ -954,6 +954,61 @@ export default function TransferPage() {
}
return null;
})()}
+
+ {/* AirAccount guard indicator — only for ETH transfers when a daily limit is set */}
+ {formData.amount &&
+ (!selectedToken || selectedToken.address === "ETH") &&
+ account?.dailyLimit &&
+ (() => {
+ const inputAmount = parseFloat(formData.amount);
+ if (isNaN(inputAmount) || inputAmount <= 0) return null;
+
+ // dailyLimit is stored in wei (decimal string) — convert to ETH for comparison.
+ const dailyLimitEth = parseFloat(account.dailyLimit) / 1e18;
+ // Tier 3 is triggered when a single transfer exceeds the on-chain daily limit guard.
+ // Tier 1 vs Tier 2 thresholds (tier1Limit / tier2Limit) are separate contract-level
+ // storage variables not available client-side — do not approximate them from dailyLimit.
+ const exceedsDailyLimit = inputAmount > dailyLimitEth;
+
+ return (
+
+
+ {exceedsDailyLimit ? (
+ <>
+
+ 3
+
+ Tier 3 — Guardian approval required
+ >
+ ) : (
+ <>
+
+ ✓
+
+ Tiered signing active
+ >
+ )}
+
+
+ {exceedsDailyLimit
+ ? `Transfer exceeds daily limit (${dailyLimitEth} ETH). Passkey + BLS + guardian ECDSA triple signature required.`
+ : `Passkey + BLS signing active. Daily limit: ${dailyLimitEth} ETH. Exact tier (1 or 2) is determined by contract-level thresholds.`}
+
+ {exceedsDailyLimit && (
+
+ Guardian at 0x51eD...2E114 must
+ co-sign this transaction.
+
+ )}
+
+ );
+ })()}
{/* Paymaster Option */}
diff --git a/aastar-frontend/components/CreateAccountDialog.tsx b/aastar-frontend/components/CreateAccountDialog.tsx
index 96ae4ee7..b5d6cf56 100644
--- a/aastar-frontend/components/CreateAccountDialog.tsx
+++ b/aastar-frontend/components/CreateAccountDialog.tsx
@@ -3,6 +3,7 @@
import { Fragment, useState } from "react";
import { Dialog, Transition } from "@headlessui/react";
import { XMarkIcon } from "@heroicons/react/24/outline";
+import QRCode from "react-qr-code";
import EntryPointVersionSelector from "./EntryPointVersionSelector";
import { EntryPointVersion } from "@/lib/types";
import { accountAPI } from "@/lib/api";
@@ -14,6 +15,22 @@ interface CreateAccountDialogProps {
onSuccess: (account: any) => void;
}
+type Step = "config" | "guardian1" | "guardian2" | "creating";
+
+interface PrepareResult {
+ owner: string;
+ salt: number;
+ chainId: number;
+ factoryAddress: string;
+ acceptanceHash: string;
+ qrPayload: string;
+}
+
+interface GuardianSig {
+ address: string;
+ sig: string;
+}
+
export default function CreateAccountDialog({
isOpen,
onClose,
@@ -21,32 +38,391 @@ export default function CreateAccountDialog({
}: CreateAccountDialogProps) {
const [version, setVersion] = useState
(EntryPointVersion.V0_7);
const [salt, setSalt] = useState("");
+ const [dailyLimit, setDailyLimit] = useState("");
const [loading, setLoading] = useState(false);
const [showAdvanced, setShowAdvanced] = useState(false);
+ const [step, setStep] = useState("config");
+ const [prepareResult, setPrepareResult] = useState(null);
+ const [guardian1, setGuardian1] = useState({ address: "", sig: "" });
+ const [guardian2, setGuardian2] = useState({ address: "", sig: "" });
- const handleCreate = async () => {
+ const handleReset = () => {
+ setStep("config");
+ setPrepareResult(null);
+ setGuardian1({ address: "", sig: "" });
+ setGuardian2({ address: "", sig: "" });
+ setSalt("");
+ setDailyLimit("");
+ setShowAdvanced(false);
+ };
+
+ const handleClose = () => {
+ handleReset();
+ onClose();
+ };
+
+ // Step 1: Call prepare endpoint to get QR payload
+ const handlePrepare = async () => {
setLoading(true);
try {
- const response = await accountAPI.create({
+ const response = await accountAPI.prepareGuardianSetup({
entryPointVersion: version,
salt: salt ? parseInt(salt) : undefined,
- deploy: false, // Will be deployed on first transaction
+ });
+ setPrepareResult(response.data);
+ setStep("guardian1");
+ } catch (error: any) {
+ const message = error.response?.data?.message || "Failed to prepare guardian setup";
+ toast.error(message);
+ } finally {
+ setLoading(false);
+ }
+ };
+
+ // Validate guardian1 input and advance to guardian2 step
+ const handleGuardian1Next = () => {
+ if (!guardian1.address || !guardian1.sig) {
+ toast.error("Please fill in Guardian 1 address and signature");
+ return;
+ }
+ if (!/^0x[0-9a-fA-F]{40}$/.test(guardian1.address)) {
+ toast.error("Guardian 1 address is not a valid Ethereum address");
+ return;
+ }
+ if (!/^0x[0-9a-fA-F]+$/.test(guardian1.sig)) {
+ toast.error("Guardian 1 signature must be a hex string starting with 0x");
+ return;
+ }
+ setStep("guardian2");
+ };
+
+ // Final step: create account with both guardian sigs
+ const handleCreate = async () => {
+ if (!guardian2.address || !guardian2.sig) {
+ toast.error("Please fill in Guardian 2 address and signature");
+ return;
+ }
+ if (!/^0x[0-9a-fA-F]{40}$/.test(guardian2.address)) {
+ toast.error("Guardian 2 address is not a valid Ethereum address");
+ return;
+ }
+ if (!/^0x[0-9a-fA-F]+$/.test(guardian2.sig)) {
+ toast.error("Guardian 2 signature must be a hex string starting with 0x");
+ return;
+ }
+ if (guardian1.address.toLowerCase() === guardian2.address.toLowerCase()) {
+ toast.error("Guardian 1 and Guardian 2 must be different addresses");
+ return;
+ }
+
+ setStep("creating");
+ setLoading(true);
+ try {
+ const response = await accountAPI.createWithGuardians({
+ guardian1: guardian1.address,
+ guardian1Sig: guardian1.sig,
+ guardian2: guardian2.address,
+ guardian2Sig: guardian2.sig,
+ dailyLimit: dailyLimit && parseFloat(dailyLimit) > 0 ? dailyLimit : "0",
+ salt: prepareResult?.salt,
+ entryPointVersion: version,
});
- toast.success(`Smart Account created with EntryPoint ${version}!`);
+ toast.success("Smart Account created with Guardians!");
+ handleReset();
onSuccess(response.data);
onClose();
} catch (error: any) {
const message = error.response?.data?.message || "Failed to create account";
toast.error(message);
+ // Go back to guardian2 step so user can retry
+ setStep("guardian2");
} finally {
setLoading(false);
}
};
+ // Build the guardian sign URL for QR code
+ const buildGuardianSignUrl = () => {
+ if (!prepareResult || typeof window === "undefined") return "";
+ const params = new URLSearchParams({
+ acceptanceHash: prepareResult.acceptanceHash,
+ factory: prepareResult.factoryAddress,
+ chainId: String(prepareResult.chainId),
+ owner: prepareResult.owner,
+ salt: String(prepareResult.salt),
+ });
+ return `${window.location.origin}/guardian-sign?${params.toString()}`;
+ };
+
+ // Render QR code + input section for a guardian
+ const renderQRSection = (guardianNumber: 1 | 2) => {
+ const guardianSignUrl = buildGuardianSignUrl();
+ const currentGuardian = guardianNumber === 1 ? guardian1 : guardian2;
+ const setCurrentGuardian = guardianNumber === 1 ? setGuardian1 : setGuardian2;
+
+ return (
+
+
+
+ Step {guardianNumber} of 2 — Guardian {guardianNumber} Scan
+
+
+ Have Guardian {guardianNumber} scan the QR code below with their phone, sign the
+ acceptance hash with their passkey, then paste the returned address and signature here.
+
+
+
+
+
+ {guardianSignUrl && }
+
+
+
+
+
Or share this URL manually:
+
+ {guardianSignUrl}
+
+
+
+
+
+
+ Guardian {guardianNumber} Address
+
+ setCurrentGuardian(g => ({ ...g, address: e.target.value.trim() }))}
+ placeholder="0x..."
+ disabled={loading}
+ className="block w-full rounded-md border-gray-300 dark:border-gray-600 bg-white dark:bg-gray-700 shadow-sm focus:border-blue-500 focus:ring-blue-500 sm:text-sm px-3 py-2"
+ />
+
+
+
+ Guardian {guardianNumber} Signature
+
+
+
+
+ );
+ };
+
+ const renderStepContent = () => {
+ switch (step) {
+ case "config":
+ return (
+
+
+
+ Creating an AirAccount requires 2 guardian devices. Each guardian scans a QR code
+ and signs with their passkey. The team Safe is added as the 3rd guardian
+ automatically.
+
+
+
+
+
+
+ setShowAdvanced(!showAdvanced)}
+ className="text-sm text-blue-600 hover:text-blue-500 dark:text-blue-400"
+ >
+ {showAdvanced ? "Hide" : "Show"} Advanced Options
+
+
+
+ {showAdvanced && (
+
+
+
+ Salt (Optional)
+
+
setSalt(e.target.value)}
+ placeholder="Leave empty for random salt"
+ disabled={loading}
+ className="mt-1 block w-full rounded-md border-gray-300 dark:border-gray-600 bg-white dark:bg-gray-700 shadow-sm focus:border-blue-500 focus:ring-blue-500 sm:text-sm px-3 py-2"
+ />
+
+ Salt is used for deterministic address generation
+
+
+
+
+
+ Daily Transfer Limit (ETH, Optional)
+
+
setDailyLimit(e.target.value)}
+ placeholder="e.g. 1.0 (leave empty for no limit)"
+ min="0"
+ step="0.01"
+ disabled={loading}
+ className="mt-1 block w-full rounded-md border-gray-300 dark:border-gray-600 bg-white dark:bg-gray-700 shadow-sm focus:border-blue-500 focus:ring-blue-500 sm:text-sm px-3 py-2"
+ />
+
+ Enables on-chain guard enforcement. Tier 3 transfers (above limit) require
+ guardian approval. Leave empty to disable.
+
+ {dailyLimit && parseFloat(dailyLimit) > 0 && (
+
+ Tiered security enabled. Transfers above {dailyLimit} ETH will require
+ guardian approval (Tier 3).
+
+ )}
+
+
+ )}
+
+ );
+
+ case "guardian1":
+ return renderQRSection(1);
+
+ case "guardian2":
+ return renderQRSection(2);
+
+ case "creating":
+ return (
+
+
+
+ Creating your account on-chain...
+
+
+ );
+ }
+ };
+
+ const renderFooterButtons = () => {
+ switch (step) {
+ case "config":
+ return (
+ <>
+
+ {loading ? (
+ <>
+
+ Preparing...
+ >
+ ) : (
+ "Create Account"
+ )}
+
+
+ Cancel
+
+ >
+ );
+
+ case "guardian1":
+ return (
+ <>
+
+ Next: Guardian 2
+
+
+ Back
+
+ >
+ );
+
+ case "guardian2":
+ return (
+ <>
+
+ {loading ? (
+ <>
+
+ Creating...
+ >
+ ) : (
+ "Create Account"
+ )}
+
+ setStep("guardian1")}
+ disabled={loading}
+ className="mt-3 inline-flex w-full justify-center rounded-md bg-white dark:bg-gray-700 px-3 py-2 text-sm font-semibold text-gray-900 dark:text-gray-300 shadow-sm ring-1 ring-inset ring-gray-300 dark:ring-gray-600 hover:bg-gray-50 dark:hover:bg-gray-600 sm:mt-0 sm:w-auto"
+ >
+ Back
+
+ >
+ );
+
+ case "creating":
+ return null;
+ }
+ };
+
+ const stepTitles: Record = {
+ config: "Create Smart Account",
+ guardian1: "Scan with Guardian 1",
+ guardian2: "Scan with Guardian 2",
+ creating: "Creating Account...",
+ };
+
+ const stepKeys: Array<"config" | "guardian1" | "guardian2"> = [
+ "config",
+ "guardian1",
+ "guardian2",
+ ];
+
return (
-
+ {} : handleClose}
+ >
-
-
- Close
-
-
-
+ {step !== "creating" && (
+
+
+ Close
+
+
+
+ )}
+
+ {/* Step progress indicator */}
+ {step !== "creating" && (
+
+ {stepKeys.map((s, idx) => (
+
+
+ {idx + 1}
+
+ {idx < stepKeys.length - 1 && (
+
+ )}
+
+ ))}
+
+ )}
- Create Smart Account
+ {stepTitles[step]}
-
-
-
-
- setShowAdvanced(!showAdvanced)}
- className="text-sm text-blue-600 hover:text-blue-500 dark:text-blue-400"
- >
- {showAdvanced ? "Hide" : "Show"} Advanced Options
-
-
-
- {showAdvanced && (
-
-
-
- Salt (Optional)
-
-
setSalt(e.target.value)}
- placeholder="Leave empty for random salt"
- disabled={loading}
- className="mt-1 block w-full rounded-md border-gray-300 dark:border-gray-600 bg-white dark:bg-gray-700 shadow-sm focus:border-blue-500 focus:ring-blue-500 sm:text-sm px-3 py-2"
- />
-
- Salt is used for deterministic address generation
-
-
-
- )}
-
+ {renderStepContent()}
-
-
- {loading ? (
- <>
-
- Creating...
- >
- ) : (
- "Create Account"
- )}
-
-
- Cancel
-
-
+ {renderFooterButtons() !== null && (
+
+ {renderFooterButtons()}
+
+ )}
diff --git a/aastar-frontend/components/Layout.tsx b/aastar-frontend/components/Layout.tsx
index 15177eef..6f615a0d 100644
--- a/aastar-frontend/components/Layout.tsx
+++ b/aastar-frontend/components/Layout.tsx
@@ -17,6 +17,7 @@ import {
ChevronRightIcon,
ChevronDownIcon,
BookOpenIcon,
+ ClipboardDocumentListIcon,
} from "@heroicons/react/24/outline";
interface LayoutProps {
@@ -113,6 +114,18 @@ export default function Layout({ children, requireAuth = false }: LayoutProps) {
>
Paymasters
+ router.push("/tasks")}
+ className={getNavButtonClass("/tasks", pathname.startsWith("/tasks"))}
+ >
+ Tasks
+
+ router.push("/recovery")}
+ className={getNavButtonClass("/recovery", pathname === "/recovery")}
+ >
+ Recovery
+
{/* Settings Dropdown */}
Home
+ {/* Tasks */}
+
router.push("/tasks")}
+ className={getBottomNavButtonClass("/tasks", pathname.startsWith("/tasks"))}
+ >
+
+ Tasks
+
+
{/* Transfer */}
router.push("/transfer")}
diff --git a/aastar-frontend/contexts/TaskContext.tsx b/aastar-frontend/contexts/TaskContext.tsx
new file mode 100644
index 00000000..48d3e3f6
--- /dev/null
+++ b/aastar-frontend/contexts/TaskContext.tsx
@@ -0,0 +1,443 @@
+"use client";
+
+import {
+ createContext,
+ useContext,
+ useState,
+ useCallback,
+ useEffect,
+ type ReactNode,
+} from "react";
+import {
+ createPublicClient,
+ http,
+ parseUnits,
+ formatUnits,
+ type PublicClient,
+ type WalletClient,
+} from "viem";
+import { TASK_ESCROW_ABI, ERC20_ABI } from "@/lib/contracts/task-escrow-abi";
+import {
+ TASK_ESCROW_ADDRESS,
+ DEFAULT_REWARD_TOKEN,
+ DEFAULT_REWARD_TOKEN_DECIMALS,
+ DEFAULT_REWARD_TOKEN_SYMBOL,
+ TASK_TYPE_LABELS,
+ SUPPORTED_CHAIN,
+ RPC_URL,
+ isContractsConfigured,
+} from "@/lib/contracts/task-config";
+import {
+ type Task,
+ type ParsedTask,
+ type CreateTaskForm,
+ TaskStatus,
+ TASK_STATUS_LABELS,
+} from "@/lib/task-types";
+import { getStoredAuth } from "@/lib/auth";
+
+interface TaskContextType {
+ // Data
+ tasks: ParsedTask[];
+ myTasks: ParsedTask[]; // tasks I created (community role)
+ claimedTasks: ParsedTask[]; // tasks I accepted (taskor role)
+ loading: boolean;
+ error: string | null;
+ contractConfigured: boolean;
+ // Actions
+ loadAllTasks: () => Promise;
+ loadMyTasks: (address: string) => Promise;
+ createTask: (form: CreateTaskForm, walletClient: WalletClient) => Promise<`0x${string}` | null>;
+ acceptTask: (taskId: string, walletClient: WalletClient) => Promise;
+ submitWork: (taskId: string, evidenceUri: string, walletClient: WalletClient) => Promise;
+ approveWork: (taskId: string, walletClient: WalletClient) => Promise;
+ finalizeTask: (taskId: string, walletClient: WalletClient) => Promise;
+ cancelTask: (taskId: string, walletClient: WalletClient) => Promise;
+ // Helpers
+ getTask: (taskId: string) => Promise;
+ approveToken: (amount: bigint, walletClient: WalletClient) => Promise;
+ checkAllowance: (ownerAddress: string) => Promise;
+}
+
+const TaskContext = createContext(null);
+
+export function useTask(): TaskContextType {
+ const ctx = useContext(TaskContext);
+ if (!ctx) throw new Error("useTask must be used within TaskProvider");
+ return ctx;
+}
+
+function parseTask(raw: Task): ParsedTask {
+ const now = new Date();
+ const deadline = new Date(Number(raw.deadline) * 1000);
+ const challengeDeadline =
+ raw.challengeDeadline > 0n
+ ? new Date(Number(raw.challengeDeadline) * 1000)
+ : null;
+
+ const rewardFormatted = formatUnits(raw.reward, DEFAULT_REWARD_TOKEN_DECIMALS);
+ const taskTypeLabel =
+ TASK_TYPE_LABELS[raw.taskType] ?? raw.taskType.slice(0, 10);
+
+ const canFinalize =
+ raw.status === TaskStatus.Submitted &&
+ challengeDeadline !== null &&
+ now > challengeDeadline;
+
+ return {
+ taskId: raw.taskId,
+ community: raw.community,
+ taskor: raw.taskor,
+ supplier: raw.supplier,
+ token: raw.token,
+ reward: raw.reward,
+ rewardFormatted,
+ supplierFee: raw.supplierFee,
+ deadline,
+ createdAt: new Date(Number(raw.createdAt) * 1000),
+ challengeDeadline,
+ status: raw.status,
+ statusLabel: TASK_STATUS_LABELS[raw.status] ?? "Unknown",
+ metadataUri: raw.metadataUri,
+ evidenceUri: raw.evidenceUri,
+ taskType: raw.taskType,
+ taskTypeLabel,
+ isExpired: now > deadline,
+ canFinalize,
+ };
+}
+
+function getPublicClient(): PublicClient {
+ return createPublicClient({
+ chain: SUPPORTED_CHAIN,
+ transport: http(RPC_URL),
+ }) as PublicClient;
+}
+
+export function TaskProvider({ children }: { children: ReactNode }) {
+ const [tasks, setTasks] = useState([]);
+ const [myTasks, setMyTasks] = useState([]);
+ const [claimedTasks, setClaimedTasks] = useState([]);
+ const [loading, setLoading] = useState(false);
+ const [error, setError] = useState(null);
+ const contractConfigured = isContractsConfigured();
+
+ const fetchTask = useCallback(
+ async (client: PublicClient, taskId: `0x${string}`): Promise => {
+ try {
+ const raw = await client.readContract({
+ address: TASK_ESCROW_ADDRESS,
+ abi: TASK_ESCROW_ABI,
+ functionName: "getTask",
+ args: [taskId],
+ });
+ return parseTask(raw as Task);
+ } catch {
+ return null;
+ }
+ },
+ []
+ );
+
+ const loadAllTasks = useCallback(async () => {
+ if (!contractConfigured) return;
+ setLoading(true);
+ setError(null);
+ try {
+ const client = getPublicClient();
+ // Fetch TaskCreated events from recent blocks
+ const latestBlock = await client.getBlockNumber();
+ const fromBlock = latestBlock > 50000n ? latestBlock - 50000n : 0n;
+ const logs = await client.getLogs({
+ address: TASK_ESCROW_ADDRESS,
+ fromBlock,
+ toBlock: "latest",
+ // Filter by TaskCreated event topic
+ // keccak256("TaskCreated(bytes32,address,address,uint256)")
+ topics: [
+ "0x9c8fd9df1dc7c1a1ce1c0fe3e8e8843b247e4cfbc4f6e06e2ab0e8b3c3cf7f92",
+ ],
+ } as Parameters[0]);
+
+ // taskId is the first indexed param (topics[1])
+ const taskIds = logs
+ .map((l) => l.topics[1] as `0x${string}` | undefined)
+ .filter((id): id is `0x${string}` => !!id);
+ const fetched = await Promise.all(taskIds.map((id) => fetchTask(client, id)));
+ const valid = fetched.filter((t): t is ParsedTask => t !== null);
+ setTasks(valid);
+ } catch (err) {
+ setError(err instanceof Error ? err.message : "Failed to load tasks");
+ } finally {
+ setLoading(false);
+ }
+ }, [contractConfigured, fetchTask]);
+
+ const loadMyTasks = useCallback(
+ async (address: string) => {
+ if (!contractConfigured) return;
+ setLoading(true);
+ setError(null);
+ try {
+ const client = getPublicClient();
+ const addr = address as `0x${string}`;
+
+ const [communityIds, taskorIds] = await Promise.all([
+ client.readContract({
+ address: TASK_ESCROW_ADDRESS,
+ abi: TASK_ESCROW_ABI,
+ functionName: "getTasksByCommunity",
+ args: [addr],
+ }),
+ client.readContract({
+ address: TASK_ESCROW_ADDRESS,
+ abi: TASK_ESCROW_ABI,
+ functionName: "getTasksByTaskor",
+ args: [addr],
+ }),
+ ]);
+
+ const [mine, claimed] = await Promise.all([
+ Promise.all((communityIds as `0x${string}`[]).map((id) => fetchTask(client, id))),
+ Promise.all((taskorIds as `0x${string}`[]).map((id) => fetchTask(client, id))),
+ ]);
+
+ setMyTasks(mine.filter((t): t is ParsedTask => t !== null));
+ setClaimedTasks(claimed.filter((t): t is ParsedTask => t !== null));
+ } catch (err) {
+ setError(err instanceof Error ? err.message : "Failed to load my tasks");
+ } finally {
+ setLoading(false);
+ }
+ },
+ [contractConfigured, fetchTask]
+ );
+
+ const getTask = useCallback(
+ async (taskId: string): Promise => {
+ if (!contractConfigured) return null;
+ const client = getPublicClient();
+ return fetchTask(client, taskId as `0x${string}`);
+ },
+ [contractConfigured, fetchTask]
+ );
+
+ const checkAllowance = useCallback(async (ownerAddress: string): Promise => {
+ const client = getPublicClient();
+ const allowance = await client.readContract({
+ address: DEFAULT_REWARD_TOKEN,
+ abi: ERC20_ABI,
+ functionName: "allowance",
+ args: [ownerAddress as `0x${string}`, TASK_ESCROW_ADDRESS],
+ });
+ return allowance as bigint;
+ }, []);
+
+ const approveToken = useCallback(
+ async (amount: bigint, walletClient: WalletClient): Promise => {
+ const [address] = await walletClient.getAddresses();
+ try {
+ const hash = await walletClient.writeContract({
+ address: DEFAULT_REWARD_TOKEN,
+ abi: ERC20_ABI,
+ functionName: "approve",
+ args: [TASK_ESCROW_ADDRESS, amount],
+ account: address,
+ chain: SUPPORTED_CHAIN,
+ });
+ const client = getPublicClient();
+ await client.waitForTransactionReceipt({ hash });
+ return true;
+ } catch {
+ return false;
+ }
+ },
+ []
+ );
+
+ const createTask = useCallback(
+ async (form: CreateTaskForm, walletClient: WalletClient): Promise<`0x${string}` | null> => {
+ const [address] = await walletClient.getAddresses();
+ const reward = parseUnits(form.rewardAmount, DEFAULT_REWARD_TOKEN_DECIMALS);
+ const deadline = BigInt(
+ Math.floor(Date.now() / 1000) + form.deadlineDays * 86400
+ );
+
+ // Build metadataUri as inline JSON (MVP: no IPFS)
+ const metadata = JSON.stringify({
+ title: form.title,
+ description: form.description,
+ createdAt: Math.floor(Date.now() / 1000),
+ });
+
+ try {
+ const hash = await walletClient.writeContract({
+ address: TASK_ESCROW_ADDRESS,
+ abi: TASK_ESCROW_ABI,
+ functionName: "createTask",
+ args: [DEFAULT_REWARD_TOKEN, reward, deadline, metadata, form.taskType],
+ account: address,
+ chain: SUPPORTED_CHAIN,
+ });
+
+ const client = getPublicClient();
+ const receipt = await client.waitForTransactionReceipt({ hash });
+
+ // Extract taskId from TaskCreated event
+ const log = receipt.logs.find(
+ (l) => l.address.toLowerCase() === TASK_ESCROW_ADDRESS.toLowerCase()
+ );
+ if (log?.topics[1]) {
+ return log.topics[1] as `0x${string}`;
+ }
+ return null;
+ } catch {
+ return null;
+ }
+ },
+ []
+ );
+
+ const acceptTask = useCallback(
+ async (taskId: string, walletClient: WalletClient): Promise => {
+ const [address] = await walletClient.getAddresses();
+ try {
+ const hash = await walletClient.writeContract({
+ address: TASK_ESCROW_ADDRESS,
+ abi: TASK_ESCROW_ABI,
+ functionName: "acceptTask",
+ args: [taskId as `0x${string}`],
+ account: address,
+ chain: SUPPORTED_CHAIN,
+ });
+ const client = getPublicClient();
+ await client.waitForTransactionReceipt({ hash });
+ return true;
+ } catch {
+ return false;
+ }
+ },
+ []
+ );
+
+ const submitWork = useCallback(
+ async (taskId: string, evidenceUri: string, walletClient: WalletClient): Promise => {
+ const [address] = await walletClient.getAddresses();
+ try {
+ const hash = await walletClient.writeContract({
+ address: TASK_ESCROW_ADDRESS,
+ abi: TASK_ESCROW_ABI,
+ functionName: "submitWork",
+ args: [taskId as `0x${string}`, evidenceUri],
+ account: address,
+ chain: SUPPORTED_CHAIN,
+ });
+ const client = getPublicClient();
+ await client.waitForTransactionReceipt({ hash });
+ return true;
+ } catch {
+ return false;
+ }
+ },
+ []
+ );
+
+ const approveWork = useCallback(
+ async (taskId: string, walletClient: WalletClient): Promise => {
+ const [address] = await walletClient.getAddresses();
+ try {
+ const hash = await walletClient.writeContract({
+ address: TASK_ESCROW_ADDRESS,
+ abi: TASK_ESCROW_ABI,
+ functionName: "approveWork",
+ args: [taskId as `0x${string}`],
+ account: address,
+ chain: SUPPORTED_CHAIN,
+ });
+ const client = getPublicClient();
+ await client.waitForTransactionReceipt({ hash });
+ return true;
+ } catch {
+ return false;
+ }
+ },
+ []
+ );
+
+ const finalizeTask = useCallback(
+ async (taskId: string, walletClient: WalletClient): Promise => {
+ const [address] = await walletClient.getAddresses();
+ try {
+ const hash = await walletClient.writeContract({
+ address: TASK_ESCROW_ADDRESS,
+ abi: TASK_ESCROW_ABI,
+ functionName: "finalizeTask",
+ args: [taskId as `0x${string}`],
+ account: address,
+ chain: SUPPORTED_CHAIN,
+ });
+ const client = getPublicClient();
+ await client.waitForTransactionReceipt({ hash });
+ return true;
+ } catch {
+ return false;
+ }
+ },
+ []
+ );
+
+ const cancelTask = useCallback(
+ async (taskId: string, walletClient: WalletClient): Promise => {
+ const [address] = await walletClient.getAddresses();
+ try {
+ const hash = await walletClient.writeContract({
+ address: TASK_ESCROW_ADDRESS,
+ abi: TASK_ESCROW_ABI,
+ functionName: "cancelTask",
+ args: [taskId as `0x${string}`],
+ account: address,
+ chain: SUPPORTED_CHAIN,
+ });
+ const client = getPublicClient();
+ await client.waitForTransactionReceipt({ hash });
+ return true;
+ } catch {
+ return false;
+ }
+ },
+ []
+ );
+
+ // Auto-load tasks when context mounts
+ useEffect(() => {
+ if (contractConfigured) {
+ loadAllTasks();
+ }
+ }, [contractConfigured, loadAllTasks]);
+
+ return (
+
+ {children}
+
+ );
+}
diff --git a/aastar-frontend/lib/api.ts b/aastar-frontend/lib/api.ts
index 7f867432..3f6a0d77 100644
--- a/aastar-frontend/lib/api.ts
+++ b/aastar-frontend/lib/api.ts
@@ -68,6 +68,20 @@ export const accountAPI = {
// fundAccount and sponsorAccount removed - not needed with Paymaster
// All transactions are sponsored automatically
+
+ // Guardian setup flow (M7)
+ prepareGuardianSetup: (data: { entryPointVersion?: string; salt?: number }) =>
+ api.post("/account/guardian-setup/prepare", data),
+
+ createWithGuardians: (data: {
+ guardian1: string;
+ guardian1Sig: string;
+ guardian2: string;
+ guardian2Sig: string;
+ dailyLimit: string;
+ salt?: number;
+ entryPointVersion?: string;
+ }) => api.post("/account/create-with-guardians", data),
};
// Transfer API
@@ -191,6 +205,30 @@ export const userTokenAPI = {
api.put("/user-tokens/reorder", { tokenOrders }),
};
+// Guardian & Recovery API
+export const guardianAPI = {
+ getGuardians: (accountAddress: string) => api.get(`/guardian/${accountAddress}`),
+
+ addGuardian: (data: { guardianAddress: string }) => api.post("/guardian/add", data),
+
+ removeGuardian: (data: { guardianAddress: string }) => api.delete("/guardian/remove", { data }),
+
+ initiateRecovery: (data: { accountAddress: string; newSignerAddress: string }) =>
+ api.post("/guardian/recovery/initiate", data),
+
+ supportRecovery: (data: { accountAddress: string }) =>
+ api.post("/guardian/recovery/support", data),
+
+ executeRecovery: (data: { accountAddress: string }) =>
+ api.post("/guardian/recovery/execute", data),
+
+ cancelRecovery: (data: { accountAddress: string }) =>
+ api.post("/guardian/recovery/cancel", data),
+
+ getPendingRecovery: (accountAddress: string) =>
+ api.get(`/guardian/recovery/${accountAddress}`),
+};
+
export const addressBookAPI = {
getAddressBook: () => api.get("/address-book"),
setAddressName: (address: string, name: string) =>
diff --git a/aastar-frontend/lib/contracts/task-config.ts b/aastar-frontend/lib/contracts/task-config.ts
new file mode 100644
index 00000000..43cdc62b
--- /dev/null
+++ b/aastar-frontend/lib/contracts/task-config.ts
@@ -0,0 +1,91 @@
+import { createPublicClient, createWalletClient, custom, http } from "viem";
+import { sepolia, anvil } from "viem/chains";
+
+// ====== Chain Configuration ======
+
+const CHAIN_ID = parseInt(process.env.NEXT_PUBLIC_CHAIN_ID ?? "11155111");
+
+export const SUPPORTED_CHAIN = CHAIN_ID === 31337 ? anvil : sepolia;
+
+export const RPC_URL =
+ process.env.NEXT_PUBLIC_RPC_URL ??
+ (CHAIN_ID === 31337 ? "http://127.0.0.1:8545" : "https://rpc.sepolia.org");
+
+// ====== Contract Addresses ======
+
+export const TASK_ESCROW_ADDRESS = (
+ process.env.NEXT_PUBLIC_TASK_ESCROW_ADDRESS ?? ""
+) as `0x${string}`;
+
+export const JURY_CONTRACT_ADDRESS = (
+ process.env.NEXT_PUBLIC_JURY_CONTRACT_ADDRESS ?? ""
+) as `0x${string}`;
+
+export const MYSBT_ADDRESS = (
+ process.env.NEXT_PUBLIC_MYSBT_ADDRESS ?? ""
+) as `0x${string}`;
+
+// Default reward token (OpenPNTs-compatible ERC-20)
+export const DEFAULT_REWARD_TOKEN = (
+ process.env.NEXT_PUBLIC_REWARD_TOKEN_ADDRESS ?? ""
+) as `0x${string}`;
+
+export const DEFAULT_REWARD_TOKEN_SYMBOL =
+ process.env.NEXT_PUBLIC_REWARD_TOKEN_SYMBOL ?? "USDC";
+
+export const DEFAULT_REWARD_TOKEN_DECIMALS = parseInt(
+ process.env.NEXT_PUBLIC_REWARD_TOKEN_DECIMALS ?? "6"
+);
+
+// ====== Viem Clients ======
+
+export function getPublicClient() {
+ return createPublicClient({
+ chain: SUPPORTED_CHAIN,
+ transport: http(RPC_URL),
+ });
+}
+
+export function getWalletClient(provider: unknown) {
+ return createWalletClient({
+ chain: SUPPORTED_CHAIN,
+ transport: custom(provider as Parameters[0]),
+ });
+}
+
+// ====== Task Type Constants ======
+// bytes32 task type identifiers
+export const TASK_TYPE_GENERAL =
+ "0x0000000000000000000000000000000000000000000000000000000000000001" as `0x${string}`;
+export const TASK_TYPE_DESIGN =
+ "0x0000000000000000000000000000000000000000000000000000000000000002" as `0x${string}`;
+export const TASK_TYPE_DEVELOPMENT =
+ "0x0000000000000000000000000000000000000000000000000000000000000003" as `0x${string}`;
+export const TASK_TYPE_MARKETING =
+ "0x0000000000000000000000000000000000000000000000000000000000000004" as `0x${string}`;
+export const TASK_TYPE_RESEARCH =
+ "0x0000000000000000000000000000000000000000000000000000000000000005" as `0x${string}`;
+
+export const TASK_TYPE_LABELS: Record = {
+ [TASK_TYPE_GENERAL]: "General",
+ [TASK_TYPE_DESIGN]: "Design",
+ [TASK_TYPE_DEVELOPMENT]: "Development",
+ [TASK_TYPE_MARKETING]: "Marketing",
+ [TASK_TYPE_RESEARCH]: "Research",
+};
+
+export const ALL_TASK_TYPES = [
+ { value: TASK_TYPE_GENERAL, label: "General" },
+ { value: TASK_TYPE_DESIGN, label: "Design" },
+ { value: TASK_TYPE_DEVELOPMENT, label: "Development" },
+ { value: TASK_TYPE_MARKETING, label: "Marketing" },
+ { value: TASK_TYPE_RESEARCH, label: "Research" },
+];
+
+export function isContractsConfigured(): boolean {
+ return (
+ !!TASK_ESCROW_ADDRESS &&
+ TASK_ESCROW_ADDRESS !== "0x" &&
+ TASK_ESCROW_ADDRESS.length === 42
+ );
+}
diff --git a/aastar-frontend/lib/contracts/task-escrow-abi.ts b/aastar-frontend/lib/contracts/task-escrow-abi.ts
new file mode 100644
index 00000000..7a33d2dc
--- /dev/null
+++ b/aastar-frontend/lib/contracts/task-escrow-abi.ts
@@ -0,0 +1,243 @@
+export const TASK_ESCROW_ABI = [
+ // ====== Write Functions ======
+ {
+ name: "createTask",
+ type: "function",
+ stateMutability: "nonpayable",
+ inputs: [
+ { name: "token", type: "address" },
+ { name: "reward", type: "uint256" },
+ { name: "deadline", type: "uint256" },
+ { name: "metadataUri", type: "string" },
+ { name: "taskType", type: "bytes32" },
+ ],
+ outputs: [{ name: "taskId", type: "bytes32" }],
+ },
+ {
+ name: "acceptTask",
+ type: "function",
+ stateMutability: "nonpayable",
+ inputs: [{ name: "taskId", type: "bytes32" }],
+ outputs: [],
+ },
+ {
+ name: "submitWork",
+ type: "function",
+ stateMutability: "nonpayable",
+ inputs: [
+ { name: "taskId", type: "bytes32" },
+ { name: "evidenceUri", type: "string" },
+ ],
+ outputs: [],
+ },
+ {
+ name: "approveWork",
+ type: "function",
+ stateMutability: "nonpayable",
+ inputs: [{ name: "taskId", type: "bytes32" }],
+ outputs: [],
+ },
+ {
+ name: "challengeWork",
+ type: "function",
+ stateMutability: "payable",
+ inputs: [{ name: "taskId", type: "bytes32" }],
+ outputs: [],
+ },
+ {
+ name: "finalizeTask",
+ type: "function",
+ stateMutability: "nonpayable",
+ inputs: [{ name: "taskId", type: "bytes32" }],
+ outputs: [],
+ },
+ {
+ name: "cancelTask",
+ type: "function",
+ stateMutability: "nonpayable",
+ inputs: [{ name: "taskId", type: "bytes32" }],
+ outputs: [],
+ },
+ {
+ name: "assignSupplier",
+ type: "function",
+ stateMutability: "nonpayable",
+ inputs: [
+ { name: "taskId", type: "bytes32" },
+ { name: "supplier", type: "address" },
+ { name: "fee", type: "uint256" },
+ ],
+ outputs: [],
+ },
+ {
+ name: "linkJuryValidation",
+ type: "function",
+ stateMutability: "nonpayable",
+ inputs: [
+ { name: "taskId", type: "bytes32" },
+ { name: "juryTaskHash", type: "bytes32" },
+ ],
+ outputs: [],
+ },
+ // ====== View Functions ======
+ {
+ name: "getTask",
+ type: "function",
+ stateMutability: "view",
+ inputs: [{ name: "taskId", type: "bytes32" }],
+ outputs: [
+ {
+ name: "",
+ type: "tuple",
+ components: [
+ { name: "taskId", type: "bytes32" },
+ { name: "community", type: "address" },
+ { name: "taskor", type: "address" },
+ { name: "supplier", type: "address" },
+ { name: "token", type: "address" },
+ { name: "reward", type: "uint256" },
+ { name: "supplierFee", type: "uint256" },
+ { name: "deadline", type: "uint256" },
+ { name: "createdAt", type: "uint256" },
+ { name: "challengeDeadline", type: "uint256" },
+ { name: "challengeStake", type: "uint256" },
+ { name: "status", type: "uint8" },
+ { name: "metadataUri", type: "string" },
+ { name: "evidenceUri", type: "string" },
+ { name: "taskType", type: "bytes32" },
+ { name: "juryTaskHash", type: "bytes32" },
+ ],
+ },
+ ],
+ },
+ {
+ name: "getTasksByCommunity",
+ type: "function",
+ stateMutability: "view",
+ inputs: [{ name: "community", type: "address" }],
+ outputs: [{ name: "", type: "bytes32[]" }],
+ },
+ {
+ name: "getTasksByTaskor",
+ type: "function",
+ stateMutability: "view",
+ inputs: [{ name: "taskor", type: "address" }],
+ outputs: [{ name: "", type: "bytes32[]" }],
+ },
+ {
+ name: "canFinalize",
+ type: "function",
+ stateMutability: "view",
+ inputs: [{ name: "taskId", type: "bytes32" }],
+ outputs: [{ name: "", type: "bool" }],
+ },
+ {
+ name: "isInChallengePeriod",
+ type: "function",
+ stateMutability: "view",
+ inputs: [{ name: "taskId", type: "bytes32" }],
+ outputs: [{ name: "", type: "bool" }],
+ },
+ {
+ name: "challengePeriod",
+ type: "function",
+ stateMutability: "view",
+ inputs: [],
+ outputs: [{ name: "", type: "uint256" }],
+ },
+ // ====== Events ======
+ {
+ name: "TaskCreated",
+ type: "event",
+ inputs: [
+ { name: "taskId", type: "bytes32", indexed: true },
+ { name: "community", type: "address", indexed: true },
+ { name: "token", type: "address", indexed: false },
+ { name: "reward", type: "uint256", indexed: false },
+ ],
+ },
+ {
+ name: "TaskAccepted",
+ type: "event",
+ inputs: [
+ { name: "taskId", type: "bytes32", indexed: true },
+ { name: "taskor", type: "address", indexed: true },
+ ],
+ },
+ {
+ name: "WorkSubmitted",
+ type: "event",
+ inputs: [
+ { name: "taskId", type: "bytes32", indexed: true },
+ { name: "evidenceUri", type: "string", indexed: false },
+ { name: "challengeDeadline", type: "uint256", indexed: false },
+ ],
+ },
+ {
+ name: "TaskFinalized",
+ type: "event",
+ inputs: [
+ { name: "taskId", type: "bytes32", indexed: true },
+ { name: "taskorPayout", type: "uint256", indexed: false },
+ { name: "supplierPayout", type: "uint256", indexed: false },
+ { name: "juryPayout", type: "uint256", indexed: false },
+ ],
+ },
+ {
+ name: "TaskAutoFinalized",
+ type: "event",
+ inputs: [{ name: "taskId", type: "bytes32", indexed: true }],
+ },
+ {
+ name: "TaskCancelled",
+ type: "event",
+ inputs: [
+ { name: "taskId", type: "bytes32", indexed: true },
+ { name: "refundAmount", type: "uint256", indexed: false },
+ ],
+ },
+] as const;
+
+export const ERC20_ABI = [
+ {
+ name: "approve",
+ type: "function",
+ stateMutability: "nonpayable",
+ inputs: [
+ { name: "spender", type: "address" },
+ { name: "amount", type: "uint256" },
+ ],
+ outputs: [{ name: "", type: "bool" }],
+ },
+ {
+ name: "allowance",
+ type: "function",
+ stateMutability: "view",
+ inputs: [
+ { name: "owner", type: "address" },
+ { name: "spender", type: "address" },
+ ],
+ outputs: [{ name: "", type: "uint256" }],
+ },
+ {
+ name: "balanceOf",
+ type: "function",
+ stateMutability: "view",
+ inputs: [{ name: "account", type: "address" }],
+ outputs: [{ name: "", type: "uint256" }],
+ },
+ {
+ name: "decimals",
+ type: "function",
+ stateMutability: "view",
+ inputs: [],
+ outputs: [{ name: "", type: "uint8" }],
+ },
+ {
+ name: "symbol",
+ type: "function",
+ stateMutability: "view",
+ inputs: [],
+ outputs: [{ name: "", type: "string" }],
+ },
+] as const;
diff --git a/aastar-frontend/lib/date-utils.ts b/aastar-frontend/lib/date-utils.ts
new file mode 100644
index 00000000..99dc5a62
--- /dev/null
+++ b/aastar-frontend/lib/date-utils.ts
@@ -0,0 +1,39 @@
+export function formatDistanceToNow(date: Date): string {
+ const now = new Date();
+ const diff = date.getTime() - now.getTime();
+ const absDiff = Math.abs(diff);
+ const isPast = diff < 0;
+
+ const minutes = Math.floor(absDiff / 60000);
+ const hours = Math.floor(absDiff / 3600000);
+ const days = Math.floor(absDiff / 86400000);
+
+ let label: string;
+ if (days > 0) {
+ label = `${days}d`;
+ } else if (hours > 0) {
+ label = `${hours}h`;
+ } else {
+ label = `${minutes}m`;
+ }
+
+ return isPast ? `${label} ago` : `in ${label}`;
+}
+
+export function formatDate(date: Date): string {
+ return date.toLocaleDateString(undefined, {
+ year: "numeric",
+ month: "short",
+ day: "numeric",
+ });
+}
+
+export function formatDateTime(date: Date): string {
+ return date.toLocaleString(undefined, {
+ year: "numeric",
+ month: "short",
+ day: "numeric",
+ hour: "2-digit",
+ minute: "2-digit",
+ });
+}
diff --git a/aastar-frontend/lib/task-types.ts b/aastar-frontend/lib/task-types.ts
new file mode 100644
index 00000000..5407ec31
--- /dev/null
+++ b/aastar-frontend/lib/task-types.ts
@@ -0,0 +1,106 @@
+// Mirrors TaskEscrowV2.sol TaskStatus enum
+export enum TaskStatus {
+ Open = 0,
+ Accepted = 1,
+ InProgress = 2,
+ Submitted = 3,
+ Challenged = 4,
+ Finalized = 5,
+ Refunded = 6,
+ Disputed = 7,
+}
+
+export const TASK_STATUS_LABELS: Record = {
+ [TaskStatus.Open]: "Open",
+ [TaskStatus.Accepted]: "Accepted",
+ [TaskStatus.InProgress]: "In Progress",
+ [TaskStatus.Submitted]: "Submitted",
+ [TaskStatus.Challenged]: "Challenged",
+ [TaskStatus.Finalized]: "Completed",
+ [TaskStatus.Refunded]: "Refunded",
+ [TaskStatus.Disputed]: "Disputed",
+};
+
+export const TASK_STATUS_COLORS: Record = {
+ [TaskStatus.Open]:
+ "bg-emerald-100 text-emerald-800 dark:bg-emerald-900/30 dark:text-emerald-400",
+ [TaskStatus.Accepted]:
+ "bg-blue-100 text-blue-800 dark:bg-blue-900/30 dark:text-blue-400",
+ [TaskStatus.InProgress]:
+ "bg-yellow-100 text-yellow-800 dark:bg-yellow-900/30 dark:text-yellow-400",
+ [TaskStatus.Submitted]:
+ "bg-purple-100 text-purple-800 dark:bg-purple-900/30 dark:text-purple-400",
+ [TaskStatus.Challenged]:
+ "bg-orange-100 text-orange-800 dark:bg-orange-900/30 dark:text-orange-400",
+ [TaskStatus.Finalized]:
+ "bg-gray-100 text-gray-600 dark:bg-gray-800 dark:text-gray-400",
+ [TaskStatus.Refunded]:
+ "bg-red-100 text-red-800 dark:bg-red-900/30 dark:text-red-400",
+ [TaskStatus.Disputed]:
+ "bg-red-100 text-red-800 dark:bg-red-900/30 dark:text-red-400",
+};
+
+// Mirrors TaskEscrowV2.sol Task struct
+export interface Task {
+ taskId: `0x${string}`;
+ community: `0x${string}`;
+ taskor: `0x${string}`;
+ supplier: `0x${string}`;
+ token: `0x${string}`;
+ reward: bigint;
+ supplierFee: bigint;
+ deadline: bigint;
+ createdAt: bigint;
+ challengeDeadline: bigint;
+ challengeStake: bigint;
+ status: TaskStatus;
+ metadataUri: string;
+ evidenceUri: string;
+ taskType: `0x${string}`;
+ juryTaskHash: `0x${string}`;
+}
+
+// Parsed task for UI display (human-readable fields)
+export interface ParsedTask {
+ taskId: string;
+ community: string;
+ taskor: string;
+ supplier: string;
+ token: string;
+ reward: bigint;
+ rewardFormatted: string;
+ supplierFee: bigint;
+ deadline: Date;
+ createdAt: Date;
+ challengeDeadline: Date | null;
+ status: TaskStatus;
+ statusLabel: string;
+ metadataUri: string;
+ evidenceUri: string;
+ taskType: string;
+ taskTypeLabel: string;
+ isExpired: boolean;
+ canFinalize: boolean;
+}
+
+export interface CreateTaskForm {
+ title: string;
+ description: string;
+ rewardAmount: string;
+ deadlineDays: number;
+ taskType: `0x${string}`;
+}
+
+export interface SubmitEvidenceForm {
+ evidenceUri: string;
+ description: string;
+}
+
+// Metadata stored in IPFS / onchain URI (JSON)
+export interface TaskMetadata {
+ title: string;
+ description: string;
+ requirements?: string;
+ tags?: string[];
+ createdAt: number;
+}
diff --git a/aastar-frontend/lib/types.ts b/aastar-frontend/lib/types.ts
index 878020a1..2751843b 100644
--- a/aastar-frontend/lib/types.ts
+++ b/aastar-frontend/lib/types.ts
@@ -28,6 +28,11 @@ export interface Account {
balance?: string;
nonce?: string;
createdAt: string;
+ /**
+ * Daily transfer limit in wei (decimal string). Present only when the account
+ * was created with on-chain guard enforcement via dailyLimit option.
+ */
+ dailyLimit?: string;
}
export interface Transfer {
diff --git a/aastar-frontend/lib/yaaa.ts b/aastar-frontend/lib/yaaa.ts
index e74d6c02..1a022553 100644
--- a/aastar-frontend/lib/yaaa.ts
+++ b/aastar-frontend/lib/yaaa.ts
@@ -1,14 +1,14 @@
-import { YAAAClient } from "@yaaa/sdk";
-import { KmsClient } from "./kms-client";
+import { YAAAClient } from "@aastar/airaccount";
+import { KmsManager, LegacyPasskeyAssertion } from "@aastar/airaccount/server";
const API_BASE_URL = process.env.NEXT_PUBLIC_API_URL || "http://localhost:3000/api/v1";
+
// In the browser, KMS calls are proxied through Next.js to avoid CORS issues.
// The proxy is configured in next.config.ts: /kms-api/* → KMS_PROXY_URL/*
-const KMS_URL =
+const KMS_ENDPOINT =
typeof window !== "undefined"
- ? "/kms-api" // browser: use Next.js proxy
+ ? "/kms-api"
: process.env.NEXT_PUBLIC_KMS_URL || "https://kms1.aastar.io";
-const KMS_API_KEY = process.env.NEXT_PUBLIC_KMS_API_KEY || undefined;
export const yaaa = new YAAAClient({
apiURL: API_BASE_URL,
@@ -17,11 +17,59 @@ export const yaaa = new YAAAClient({
return localStorage.getItem("token");
},
bls: {
- // These should ideally come from backend config or env
seedNodes: [
process.env.NEXT_PUBLIC_BLS_SEED_NODE || "https://yetanotheraa-validator.onrender.com",
],
},
});
-export const kmsClient = new KmsClient(KMS_URL, KMS_API_KEY);
+export const kmsClient = new KmsManager({
+ kmsEndpoint: KMS_ENDPOINT,
+ kmsEnabled: true,
+ kmsApiKey: process.env.NEXT_PUBLIC_KMS_API_KEY,
+});
+
+// ── extractLegacyAssertion ────────────────────────────────────────
+// Browser-side utility: extracts raw assertion bytes from a WebAuthn
+// authentication response into the Legacy hex format used by KMS SignHash.
+// This is browser glue code (requires crypto.subtle) and is not part of the SDK.
+
+function base64urlToBytes(base64url: string): Uint8Array {
+ const base64 = base64url.replace(/-/g, "+").replace(/_/g, "/");
+ const padded = base64 + "=".repeat((4 - (base64.length % 4)) % 4);
+ const binary = atob(padded);
+ const bytes = new Uint8Array(binary.length);
+ for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);
+ return bytes;
+}
+
+function bytesToHex(bytes: Uint8Array): string {
+ return (
+ "0x" +
+ Array.from(bytes)
+ .map(b => b.toString(16).padStart(2, "0"))
+ .join("")
+ );
+}
+
+export async function extractLegacyAssertion(credential: {
+ response: {
+ authenticatorData: string;
+ clientDataJSON: string;
+ signature: string;
+ };
+}): Promise {
+ const authenticatorDataBytes = base64urlToBytes(credential.response.authenticatorData);
+ const clientDataJSONBytes = base64urlToBytes(credential.response.clientDataJSON);
+ const signatureBytes = base64urlToBytes(credential.response.signature);
+
+ const jsonArrayBuffer = new ArrayBuffer(clientDataJSONBytes.byteLength);
+ new Uint8Array(jsonArrayBuffer).set(clientDataJSONBytes);
+ const clientDataHash = new Uint8Array(await crypto.subtle.digest("SHA-256", jsonArrayBuffer));
+
+ return {
+ AuthenticatorData: bytesToHex(authenticatorDataBytes),
+ ClientDataHash: bytesToHex(clientDataHash),
+ Signature: bytesToHex(signatureBytes),
+ };
+}
diff --git a/aastar-frontend/next.config.ts b/aastar-frontend/next.config.ts
index 27446716..93f0da59 100644
--- a/aastar-frontend/next.config.ts
+++ b/aastar-frontend/next.config.ts
@@ -13,11 +13,6 @@ const nextConfig: NextConfig = {
output: "standalone",
outputFileTracingRoot: path.join(__dirname, ".."),
}),
- // Fix for monorepo setup with Next.js 16+
- // Point to monorepo root where node_modules/next is located
- turbopack: {
- root: path.join(__dirname, ".."),
- },
async rewrites() {
const backendUrl = process.env.BACKEND_API_URL || "http://127.0.0.1:3000";
const kmsUrl = process.env.KMS_PROXY_URL || "https://kms1.aastar.io";
diff --git a/aastar-frontend/package.json b/aastar-frontend/package.json
index 87223ce7..e7f688b8 100644
--- a/aastar-frontend/package.json
+++ b/aastar-frontend/package.json
@@ -16,20 +16,21 @@
"test:ci": "echo \"⚠️ No tests yet - skipping\""
},
"dependencies": {
+ "@aastar/airaccount": "^0.19.0",
"@headlessui/react": "^2.2.9",
"@heroicons/react": "^2.2.0",
"@simplewebauthn/browser": "^13.2.2",
"@types/node": "^24",
"@types/react": "^19",
"@types/react-dom": "^19",
- "@yaaa/sdk": "^0.1.0",
"axios": "^1.13.1",
"next": "^16.1.1",
"react": "19.2.0",
"react-dom": "19.2.0",
"react-hot-toast": "^2.6.0",
"react-qr-code": "^2.0.18",
- "typescript": "^5"
+ "typescript": "^5",
+ "viem": "^2.47.6"
},
"devDependencies": {
"@eslint/eslintrc": "^3",
diff --git a/aastar-frontend/tsconfig.json b/aastar-frontend/tsconfig.json
index 705f5ce5..dcab4d14 100644
--- a/aastar-frontend/tsconfig.json
+++ b/aastar-frontend/tsconfig.json
@@ -1,6 +1,6 @@
{
"compilerOptions": {
- "target": "ES2017",
+ "target": "ES2020",
"lib": ["dom", "dom.iterable", "esnext"],
"allowJs": true,
"skipLibCheck": true,
diff --git a/aastar/package.json b/aastar/package.json
index 436eaddd..0fc564bb 100644
--- a/aastar/package.json
+++ b/aastar/package.json
@@ -48,6 +48,7 @@
"typescript": "^5.9.3"
},
"dependencies": {
+ "@aastar/airaccount": "^0.19.0",
"@nestjs/common": "^11.1.6",
"@nestjs/config": "^4.0.2",
"@nestjs/core": "^11.1.6",
@@ -58,7 +59,6 @@
"@nestjs/typeorm": "^11.0.0",
"@noble/curves": "^2.0.1",
"@types/tar": "^6.1.13",
- "@yaaa/sdk": "^0.1.0",
"axios": "^1.13.1",
"base64url": "^3.0.1",
"bcrypt": "^6.0.0",
diff --git a/aastar/src/account/account.controller.ts b/aastar/src/account/account.controller.ts
index 3a2489e7..0b0808ee 100644
--- a/aastar/src/account/account.controller.ts
+++ b/aastar/src/account/account.controller.ts
@@ -3,6 +3,7 @@ import { ApiTags, ApiOperation, ApiBearerAuth, ApiResponse } from "@nestjs/swagg
import { AccountService } from "./account.service";
import { CreateAccountDto } from "./dto/create-account.dto";
import { RotateSignerDto } from "./dto/rotate-signer.dto";
+import { GuardianSetupPrepareDto, CreateWithGuardiansDto } from "./dto/guardian-setup.dto";
import { JwtAuthGuard } from "../auth/guards/jwt-auth.guard";
@ApiTags("account")
@@ -56,6 +57,29 @@ export class AccountController {
return this.accountService.getAccountNonce(req.user.sub);
}
+ @Post("guardian-setup/prepare")
+ @ApiOperation({
+ summary: "Prepare guardian acceptance hash and QR payload for account creation",
+ description:
+ "Generates an acceptance hash and QR payload that guardian devices must scan and sign. " +
+ "Returns acceptanceHash and qrPayload. Encode qrPayload as a QR code for guardian scanning.",
+ })
+ async prepareGuardianSetup(@Request() req, @Body() dto: GuardianSetupPrepareDto) {
+ return this.accountService.prepareGuardianSetup(req.user.sub, dto);
+ }
+
+ @Post("create-with-guardians")
+ @ApiOperation({
+ summary: "Create account with guardian signatures collected via QR scan",
+ description:
+ "Creates an AirAccount with 3 on-chain guardians: guardian1 + guardian2 (user devices) " +
+ "and the team Safe as defaultCommunityGuardian. Both guardian sigs must be obtained first " +
+ "via guardian-setup/prepare + QR scan.",
+ })
+ async createWithGuardians(@Request() req, @Body() dto: CreateWithGuardiansDto) {
+ return this.accountService.createWithGuardians(req.user.sub, dto);
+ }
+
@Post("rotate-signer")
@ApiOperation({
summary: "Update the off-chain signer address (Phase 1: Owner Rotation)",
diff --git a/aastar/src/account/account.service.ts b/aastar/src/account/account.service.ts
index c7de41d1..19d5833f 100644
--- a/aastar/src/account/account.service.ts
+++ b/aastar/src/account/account.service.ts
@@ -1,30 +1,50 @@
import { Injectable, Inject, NotFoundException, BadRequestException } from "@nestjs/common";
-import { YAAAServerClient } from "@yaaa/sdk/server";
+import { YAAAServerClient } from "@aastar/airaccount/server";
import { YAAA_SERVER_CLIENT } from "../sdk/sdk.providers";
import { CreateAccountDto, EntryPointVersionDto } from "./dto/create-account.dto";
+import { GuardianSetupPrepareDto, CreateWithGuardiansDto } from "./dto/guardian-setup.dto";
import { DatabaseService } from "../database/database.service";
+import { ConfigService } from "@nestjs/config";
import { ethers } from "ethers";
@Injectable()
export class AccountService {
constructor(
@Inject(YAAA_SERVER_CLIENT) private client: YAAAServerClient,
- private databaseService: DatabaseService
+ private databaseService: DatabaseService,
+ private configService: ConfigService
) {}
+ /**
+ * Converts an ETH amount string (e.g. "1.0") to wei as bigint.
+ * Returns undefined when value is empty/zero (no guard enforcement).
+ */
+ private parseDailyLimitToWei(value: string | undefined): bigint | undefined {
+ if (!value || parseFloat(value) <= 0) return undefined;
+ try {
+ return ethers.parseEther(value);
+ } catch {
+ throw new BadRequestException(
+ `Invalid dailyLimit value: "${value}". Expected a valid ETH amount (e.g. "1.0").`
+ );
+ }
+ }
+
async createAccount(userId: string, createAccountDto: CreateAccountDto) {
const versionDto = createAccountDto.entryPointVersion || EntryPointVersionDto.V0_6;
- // Map DTO version to SDK EntryPointVersion
const versionMap: Record = {
"0.6": "0.6",
"0.7": "0.7",
"0.8": "0.8",
};
+ const dailyLimitWei = this.parseDailyLimitToWei(createAccountDto.dailyLimit);
+
return this.client.accounts.createAccount(userId, {
entryPointVersion: versionMap[versionDto] as any,
salt: createAccountDto.salt,
+ ...(dailyLimitWei !== undefined ? { dailyLimit: dailyLimitWei } : {}),
});
}
@@ -53,6 +73,88 @@ export class AccountService {
return this.client.accounts.getAccountByUserId(userId);
}
+ /**
+ * Step 1 of guardian setup: generate acceptance hash + QR payload.
+ * The returned qrPayload should be encoded as a QR code and scanned by guardian devices.
+ */
+ async prepareGuardianSetup(
+ userId: string,
+ dto: GuardianSetupPrepareDto
+ ): Promise<{
+ owner: string;
+ salt: number;
+ chainId: number;
+ factoryAddress: string;
+ acceptanceHash: string;
+ qrPayload: string;
+ }> {
+ const versionDto = dto.entryPointVersion || EntryPointVersionDto.V0_7;
+ const versionMap: Record = {
+ "0.6": "0.6",
+ "0.7": "0.7",
+ "0.8": "0.8",
+ };
+ const version = versionMap[versionDto] as any;
+
+ // Resolve signer address (owner of the future account)
+ const { address: owner } = await this.client.wallets.ensureSigner(userId);
+
+ // Pick factory + chainId from ethereum provider
+ const factoryAddress = this.client.ethereum.getFactoryAddress(version);
+ const chainId = this.configService.get("chainId") || 11155111;
+
+ // Determine salt (use provided or generate random)
+ const salt = dto.salt ?? Math.floor(Math.random() * 1_000_000);
+
+ // Build acceptance hash
+ const acceptanceHash = this.client.accounts.buildGuardianAcceptanceHash(
+ owner,
+ salt,
+ factoryAddress,
+ chainId
+ );
+
+ // Build QR payload — everything guardian phone needs to reconstruct and sign
+ const qrPayload = JSON.stringify({
+ acceptanceHash,
+ factory: factoryAddress,
+ chainId,
+ owner,
+ salt,
+ });
+
+ return { owner, salt, chainId, factoryAddress, acceptanceHash, qrPayload };
+ }
+
+ /**
+ * Step 2 of guardian setup: create account with two guardian signatures collected from QR scan.
+ */
+ async createWithGuardians(userId: string, dto: CreateWithGuardiansDto) {
+ if (dto.guardian1.toLowerCase() === dto.guardian2.toLowerCase()) {
+ throw new BadRequestException("Guardian 1 and Guardian 2 must be different addresses");
+ }
+
+ const versionDto = dto.entryPointVersion || EntryPointVersionDto.V0_7;
+ const versionMap: Record = {
+ "0.6": "0.6",
+ "0.7": "0.7",
+ "0.8": "0.8",
+ };
+ const version = versionMap[versionDto] as any;
+
+ const dailyLimitWei = this.parseDailyLimitToWei(dto.dailyLimit) ?? 0n;
+
+ return this.client.accounts.createAccountWithGuardians(userId, {
+ guardian1: dto.guardian1,
+ guardian1Sig: dto.guardian1Sig,
+ guardian2: dto.guardian2,
+ guardian2Sig: dto.guardian2Sig,
+ dailyLimit: dailyLimitWei,
+ salt: dto.salt,
+ entryPointVersion: version,
+ });
+ }
+
/**
* Phase 1: Owner rotation — update the off-chain signerAddress record.
* The on-chain signer update requires a separate UserOp calling updateSigner().
diff --git a/aastar/src/account/dto/create-account.dto.ts b/aastar/src/account/dto/create-account.dto.ts
index 30c7f7de..a30ba4b4 100644
--- a/aastar/src/account/dto/create-account.dto.ts
+++ b/aastar/src/account/dto/create-account.dto.ts
@@ -1,5 +1,5 @@
import { ApiProperty } from "@nestjs/swagger";
-import { IsOptional, IsNumber, IsBoolean, IsString, IsEnum } from "class-validator";
+import { IsOptional, IsNumber, IsBoolean, IsString, IsEnum, IsPositive } from "class-validator";
export enum EntryPointVersionDto {
V0_6 = "0.6",
@@ -32,4 +32,17 @@ export class CreateAccountDto {
@IsOptional()
@IsEnum(EntryPointVersionDto)
entryPointVersion?: EntryPointVersionDto;
+
+ @ApiProperty({
+ description:
+ "Daily transfer limit in ETH. " +
+ "When set (> 0), the account is created with on-chain guard enforcement. " +
+ "Tier 3 transfers above this limit require guardian ECDSA approval. " +
+ "Default: 0 (no limit / no guard).",
+ example: "1.0",
+ required: false,
+ })
+ @IsOptional()
+ @IsString()
+ dailyLimit?: string;
}
diff --git a/aastar/src/account/dto/guardian-setup.dto.ts b/aastar/src/account/dto/guardian-setup.dto.ts
new file mode 100644
index 00000000..fdb4d782
--- /dev/null
+++ b/aastar/src/account/dto/guardian-setup.dto.ts
@@ -0,0 +1,66 @@
+import { ApiProperty } from "@nestjs/swagger";
+import {
+ IsOptional,
+ IsNumber,
+ IsString,
+ IsEnum,
+ IsEthereumAddress,
+ IsNumberString,
+} from "class-validator";
+import { EntryPointVersionDto } from "./create-account.dto";
+
+export class GuardianSetupPrepareDto {
+ @ApiProperty({
+ description: "EntryPoint version to use",
+ enum: EntryPointVersionDto,
+ default: EntryPointVersionDto.V0_7,
+ required: false,
+ })
+ @IsOptional()
+ @IsEnum(EntryPointVersionDto)
+ entryPointVersion?: EntryPointVersionDto;
+
+ @ApiProperty({ description: "Salt for deterministic address generation", required: false })
+ @IsOptional()
+ @IsNumber()
+ salt?: number;
+}
+
+export class CreateWithGuardiansDto {
+ @ApiProperty({ description: "Guardian 1 Ethereum address" })
+ @IsEthereumAddress()
+ guardian1: string;
+
+ @ApiProperty({ description: "Guardian 1 acceptance signature (hex)" })
+ @IsString()
+ guardian1Sig: string;
+
+ @ApiProperty({ description: "Guardian 2 Ethereum address" })
+ @IsEthereumAddress()
+ guardian2: string;
+
+ @ApiProperty({ description: "Guardian 2 acceptance signature (hex)" })
+ @IsString()
+ guardian2Sig: string;
+
+ @ApiProperty({
+ description: "Daily spending limit in wei (string to avoid bigint precision loss)",
+ })
+ @IsString()
+ dailyLimit: string;
+
+ @ApiProperty({ description: "Salt used during prepare step", required: false })
+ @IsOptional()
+ @IsNumber()
+ salt?: number;
+
+ @ApiProperty({
+ description: "EntryPoint version to use",
+ enum: EntryPointVersionDto,
+ default: EntryPointVersionDto.V0_7,
+ required: false,
+ })
+ @IsOptional()
+ @IsEnum(EntryPointVersionDto)
+ entryPointVersion?: EntryPointVersionDto;
+}
diff --git a/aastar/src/bls/bls.service.ts b/aastar/src/bls/bls.service.ts
index da7899c0..15f3dd43 100644
--- a/aastar/src/bls/bls.service.ts
+++ b/aastar/src/bls/bls.service.ts
@@ -1,7 +1,7 @@
import { Injectable, Inject } from "@nestjs/common";
-import { YAAAServerClient } from "@yaaa/sdk/server";
+import { YAAAServerClient } from "@aastar/airaccount/server";
import { YAAA_SERVER_CLIENT } from "../sdk/sdk.providers";
-import { BLSSignatureData as BlsSignatureData } from "@yaaa/sdk/server";
+import { BLSSignatureData as BlsSignatureData } from "@aastar/airaccount/server";
@Injectable()
export class BlsService {
diff --git a/aastar/src/common/constants/entrypoint.constants.ts b/aastar/src/common/constants/entrypoint.constants.ts
index 769666ea..169898ab 100644
--- a/aastar/src/common/constants/entrypoint.constants.ts
+++ b/aastar/src/common/constants/entrypoint.constants.ts
@@ -9,5 +9,5 @@ export {
ACCOUNT_ABI,
VALIDATOR_ABI,
ERC20_ABI,
-} from "@yaaa/sdk/server";
-export type { EntryPointConfig } from "@yaaa/sdk/server";
+} from "@aastar/airaccount/server";
+export type { EntryPointConfig } from "@aastar/airaccount/server";
diff --git a/aastar/src/common/interfaces/erc4337-v7.interface.ts b/aastar/src/common/interfaces/erc4337-v7.interface.ts
index a39b0885..3379cafb 100644
--- a/aastar/src/common/interfaces/erc4337-v7.interface.ts
+++ b/aastar/src/common/interfaces/erc4337-v7.interface.ts
@@ -1,4 +1,4 @@
-import { ERC4337Utils, PackedUserOperation } from "@yaaa/sdk";
+import { ERC4337Utils, PackedUserOperation } from "@aastar/airaccount";
// Export type from SDK
export { PackedUserOperation };
diff --git a/aastar/src/common/interfaces/erc4337.interface.ts b/aastar/src/common/interfaces/erc4337.interface.ts
index 5caf2832..3b861ba6 100644
--- a/aastar/src/common/interfaces/erc4337.interface.ts
+++ b/aastar/src/common/interfaces/erc4337.interface.ts
@@ -1,3 +1,3 @@
// Re-export types from SDK
-export type { UserOperation, GasEstimate } from "@yaaa/sdk/server";
-export type { BLSSignatureData as BlsSignatureData } from "@yaaa/sdk/server";
+export type { UserOperation, GasEstimate } from "@aastar/airaccount/server";
+export type { BLSSignatureData as BlsSignatureData } from "@aastar/airaccount/server";
diff --git a/aastar/src/ethereum/ethereum.service.ts b/aastar/src/ethereum/ethereum.service.ts
index 9ffc3c22..cf19f367 100644
--- a/aastar/src/ethereum/ethereum.service.ts
+++ b/aastar/src/ethereum/ethereum.service.ts
@@ -1,7 +1,7 @@
import { Injectable, Inject } from "@nestjs/common";
import { ConfigService } from "@nestjs/config";
import { ethers } from "ethers";
-import { YAAAServerClient } from "@yaaa/sdk/server";
+import { YAAAServerClient } from "@aastar/airaccount/server";
import { YAAA_SERVER_CLIENT } from "../sdk/sdk.providers";
import { EntryPointVersion } from "../common/constants/entrypoint.constants";
diff --git a/aastar/src/guardian/guardian.service.ts b/aastar/src/guardian/guardian.service.ts
index e48b7a8b..ad967fee 100644
--- a/aastar/src/guardian/guardian.service.ts
+++ b/aastar/src/guardian/guardian.service.ts
@@ -3,8 +3,12 @@ import {
NotFoundException,
BadRequestException,
ForbiddenException,
+ Logger,
+ InternalServerErrorException,
} from "@nestjs/common";
+import { ConfigService } from "@nestjs/config";
import { v4 as uuidv4 } from "uuid";
+import { ethers } from "ethers";
import { DatabaseService } from "../database/database.service";
import {
AddGuardianDto,
@@ -19,9 +23,109 @@ const RECOVERY_DELAY_MS = 48 * 60 * 60 * 1000;
// Minimum guardians required to support a recovery (M-of-N: 2 out of N)
const RECOVERY_QUORUM = 2;
+// ABI fragments for AirAccount social recovery methods.
+// Source: AAStarAirAccountBase.sol — proposeRecovery, approveRecovery, executeRecovery, cancelRecovery
+// and the activeRecovery() state reader.
+const AIRACCOUNT_RECOVERY_ABI = [
+ // propose a recovery (caller must be a guardian on-chain)
+ "function proposeRecovery(address _newOwner) external",
+ // approve the current active proposal (caller must be a guardian on-chain)
+ "function approveRecovery() external",
+ // execute the proposal after timelock and threshold are met (anyone can call)
+ "function executeRecovery() external",
+ // vote to cancel active recovery (caller must be a guardian on-chain)
+ "function cancelRecovery() external",
+ // read the active recovery proposal stored on-chain
+ "function activeRecovery() external view returns (address newOwner, uint256 proposedAt, uint256 approvalBitmap, uint256 cancellationBitmap)",
+];
+
@Injectable()
export class GuardianService {
- constructor(private databaseService: DatabaseService) {}
+ private readonly logger = new Logger(GuardianService.name);
+
+ constructor(
+ private databaseService: DatabaseService,
+ private configService: ConfigService
+ ) {}
+
+ // ─── Internal helpers ────────────────────────────────────────────────────
+
+ /**
+ * Returns a read-only provider connected to the configured RPC endpoint.
+ */
+ private getProvider(): ethers.JsonRpcProvider {
+ const rpcUrl = this.configService.get("ethRpcUrl");
+ if (!rpcUrl) {
+ throw new InternalServerErrorException("ETH_RPC_URL is not configured");
+ }
+ return new ethers.JsonRpcProvider(rpcUrl);
+ }
+
+ /**
+ * Returns a Wallet signer backed by ETH_PRIVATE_KEY, used as the relayer
+ * for on-chain executeRecovery() calls (no guardian restriction on that
+ * function — anyone may call it once conditions are met).
+ */
+ private getRelaySigner(): ethers.Wallet {
+ const privateKey = this.configService.get("ethPrivateKey");
+ if (
+ !privateKey ||
+ privateKey === "0x0000000000000000000000000000000000000000000000000000000000000001"
+ ) {
+ throw new InternalServerErrorException(
+ "ETH_PRIVATE_KEY is not configured or still set to the placeholder value. " +
+ "Please set a funded Sepolia EOA private key in .env to send on-chain recovery transactions."
+ );
+ }
+ const provider = this.getProvider();
+ return new ethers.Wallet(privateKey, provider);
+ }
+
+ /**
+ * Returns an AirAccount contract instance bound to the relayer signer,
+ * exposing only the recovery-related ABI fragments.
+ */
+ private getAirAccountContract(accountAddress: string, signer: ethers.Signer): ethers.Contract {
+ return new ethers.Contract(accountAddress, AIRACCOUNT_RECOVERY_ABI, signer);
+ }
+
+ /**
+ * Returns a read-only AirAccount contract instance for on-chain state queries.
+ */
+ private getAirAccountContractReadOnly(accountAddress: string): ethers.Contract {
+ const provider = this.getProvider();
+ return new ethers.Contract(accountAddress, AIRACCOUNT_RECOVERY_ABI, provider);
+ }
+
+ /**
+ * Reads the on-chain activeRecovery proposal for a given account.
+ * Returns null when no proposal is active (newOwner === address(0)).
+ */
+ private async fetchOnChainRecovery(accountAddress: string): Promise<{
+ newOwner: string;
+ proposedAt: bigint;
+ approvalBitmap: bigint;
+ cancellationBitmap: bigint;
+ } | null> {
+ try {
+ const contract = this.getAirAccountContractReadOnly(accountAddress);
+ const [newOwner, proposedAt, approvalBitmap, cancellationBitmap] =
+ await contract.activeRecovery();
+ if (newOwner === ethers.ZeroAddress) {
+ return null;
+ }
+ return { newOwner, proposedAt, cancellationBitmap, approvalBitmap };
+ } catch (err) {
+ // If the contract does not exist on-chain (e.g. account not yet deployed)
+ // treat it as no active recovery rather than crashing.
+ this.logger.warn(
+ `Could not fetch on-chain activeRecovery for ${accountAddress}: ${(err as Error).message}`
+ );
+ return null;
+ }
+ }
+
+ // ─── Public API ──────────────────────────────────────────────────────────
async getGuardians(accountAddress: string) {
const guardians = await this.databaseService.getGuardiansByAccount(accountAddress);
@@ -67,6 +171,25 @@ export class GuardianService {
return { message: "Guardian removed successfully" };
}
+ /**
+ * Initiates a recovery request.
+ *
+ * Off-chain flow (always):
+ * - Validates caller is an active guardian in the database.
+ * - Creates a pending recovery record in the database.
+ *
+ * On-chain note:
+ * - proposeRecovery() on-chain requires msg.sender to be a registered
+ * guardian of the AirAccount contract, so the backend relayer cannot call
+ * it on behalf of the guardian. The client (guardian's wallet) must
+ * separately call proposeRecovery() on the AirAccount contract directly.
+ * - This endpoint records intent and tracks quorum off-chain, while
+ * executeRecovery() below enforces the actual on-chain state change.
+ *
+ * If the account is already deployed on-chain and has an active recovery
+ * proposal, we sync that information into the response so the caller knows
+ * the current on-chain state.
+ */
async initiateRecovery(callerAddress: string, dto: InitiateRecoveryDto) {
const { accountAddress, newSignerAddress } = dto;
@@ -76,7 +199,7 @@ export class GuardianService {
throw new ForbiddenException("Caller is not an active guardian of this account");
}
- // Check no pending recovery already exists
+ // Check no pending recovery already exists in the database
const existing = await this.databaseService.findPendingRecovery(accountAddress);
if (existing) {
throw new BadRequestException("A recovery request is already pending for this account");
@@ -98,14 +221,34 @@ export class GuardianService {
await this.databaseService.saveRecoveryRequest(request);
+ // Read on-chain state (best-effort, non-blocking for the db write above)
+ const onChainRecovery = await this.fetchOnChainRecovery(accountAddress);
+
return {
...request,
executeAfterDate: new Date(executeAfter).toISOString(),
quorumRequired: RECOVERY_QUORUM,
supportCount: 1,
+ // proposeRecovery() requires msg.sender == guardian, so the backend relayer cannot call it.
+ // The guardian's wallet must call it directly on the AirAccount contract.
+ requiresOnChainAction: true,
+ onChainAction: "proposeRecovery(newSignerAddress)",
+ onChainRecoveryActive: onChainRecovery !== null,
+ onChainNewOwner: onChainRecovery?.newOwner ?? null,
+ note:
+ "ACTION REQUIRED: The guardian must call proposeRecovery(newSignerAddress) on the AirAccount " +
+ "contract directly (msg.sender must be the guardian — the backend relayer cannot do this). " +
+ "The backend will call executeRecovery() on-chain once quorum and timelock are met.",
};
}
+ /**
+ * Records a guardian's support for an existing recovery request.
+ *
+ * On-chain note: approveRecovery() also requires msg.sender == guardian,
+ * so the backend relayer cannot call it. The guardian's wallet must call
+ * approveRecovery() on the contract directly.
+ */
async supportRecovery(callerAddress: string, dto: SupportRecoveryDto) {
const { accountAddress } = dto;
@@ -134,16 +277,46 @@ export class GuardianService {
await this.databaseService.updateRecoveryRequest(request.id, { supporters });
+ // Read on-chain approval bitmap (best-effort)
+ const onChainRecovery = await this.fetchOnChainRecovery(accountAddress);
+ const onChainApprovals = onChainRecovery
+ ? // Count set bits in approvalBitmap
+ [...onChainRecovery.approvalBitmap.toString(2)].filter(b => b === "1").length
+ : null;
+
return {
...request,
supporters,
supportCount: supporters.length,
quorumRequired: RECOVERY_QUORUM,
quorumReached: supporters.length >= RECOVERY_QUORUM,
+ onChainApprovals,
+ // approveRecovery() also requires msg.sender == guardian; backend cannot call it.
+ requiresOnChainAction: true,
+ onChainAction: "approveRecovery()",
+ note:
+ supporters.length >= RECOVERY_QUORUM
+ ? "Quorum reached. ACTION REQUIRED: Guardian must also call approveRecovery() on the contract directly. Once timelock expires, call executeRecovery to finalise on-chain."
+ : "Quorum not yet reached. Additional guardian support required. ACTION REQUIRED: Guardian must also call approveRecovery() on the contract directly.",
};
}
+ /**
+ * Executes the recovery.
+ *
+ * Steps:
+ * 1. Validate off-chain quorum and timelock (database checks).
+ * 2. Send an on-chain executeRecovery() transaction using the backend relayer.
+ * This function has no msg.sender restriction in the contract — anyone may
+ * call it once conditions (threshold + timelock) are met on-chain.
+ * 3. Wait for the transaction to be mined and confirm success.
+ * 4. Update the database only after on-chain success.
+ *
+ * On-chain failure causes an exception; the database is NOT updated, so
+ * the recovery request stays in "pending" status and can be retried.
+ */
async executeRecovery(accountAddress: string) {
+ // ── 1. Off-chain checks ───────────────────────────────────────────────
const request = await this.databaseService.findPendingRecovery(accountAddress);
if (!request) {
throw new NotFoundException("No pending recovery request for this account");
@@ -169,22 +342,57 @@ export class GuardianService {
);
}
- // Update recovery request status
+ // ── 2. On-chain executeRecovery() ─────────────────────────────────────
+ this.logger.log(
+ `Executing on-chain recovery for account=${accountAddress} newOwner=${request.newSignerAddress}`
+ );
+
+ let txHash: string;
+ try {
+ const signer = this.getRelaySigner();
+ const contract = this.getAirAccountContract(accountAddress, signer);
+
+ const tx: ethers.TransactionResponse = await contract.executeRecovery();
+ txHash = tx.hash;
+ this.logger.log(`On-chain executeRecovery tx sent: ${txHash}`);
+
+ // ── 3. Wait for confirmation ────────────────────────────────────────
+ const receipt = await tx.wait(1);
+ if (!receipt || receipt.status !== 1) {
+ throw new Error(
+ `Transaction ${txHash} was mined but reverted (status=${receipt?.status ?? "unknown"})`
+ );
+ }
+ this.logger.log(
+ `On-chain executeRecovery confirmed in block ${receipt.blockNumber} (tx=${txHash})`
+ );
+ } catch (err) {
+ // On-chain failure: do NOT update the database — the request stays
+ // "pending" so the caller can diagnose and retry.
+ const message = (err as Error).message ?? String(err);
+ this.logger.error(`On-chain executeRecovery failed for ${accountAddress}: ${message}`);
+ throw new InternalServerErrorException(
+ `On-chain executeRecovery transaction failed: ${message}`
+ );
+ }
+
+ // ── 4. Update database only after on-chain success ─────────────────
await this.databaseService.updateRecoveryRequest(request.id, {
status: "executed",
executedAt: new Date().toISOString(),
});
- // Update account signerAddress
+ // Update the account's signerAddress in the database to reflect the new owner
await this.databaseService.updateAccountByAddress(accountAddress, {
signerAddress: request.newSignerAddress,
});
return {
- message: "Account recovery executed successfully",
+ message: "Account recovery executed successfully (on-chain + database updated)",
accountAddress,
newSignerAddress: request.newSignerAddress,
executedAt: new Date().toISOString(),
+ txHash,
};
}
@@ -225,6 +433,9 @@ export class GuardianService {
? request.supporters.split(",").filter(Boolean)
: [];
+ // Enrich with on-chain state (best-effort)
+ const onChainRecovery = await this.fetchOnChainRecovery(accountAddress);
+
return {
...request,
supporters,
@@ -233,6 +444,15 @@ export class GuardianService {
quorumReached: supporters.length >= RECOVERY_QUORUM,
executeAfterDate: new Date(Number(request.executeAfter)).toISOString(),
timeLockExpired: Date.now() >= Number(request.executeAfter),
+ onChain: onChainRecovery
+ ? {
+ active: true,
+ newOwner: onChainRecovery.newOwner,
+ proposedAt: new Date(Number(onChainRecovery.proposedAt) * 1000).toISOString(),
+ approvalCount: [...onChainRecovery.approvalBitmap.toString(2)].filter(b => b === "1")
+ .length,
+ }
+ : { active: false },
};
}
}
diff --git a/aastar/src/kms/kms.service.ts b/aastar/src/kms/kms.service.ts
index f1a4b693..a49d4863 100644
--- a/aastar/src/kms/kms.service.ts
+++ b/aastar/src/kms/kms.service.ts
@@ -1,298 +1,129 @@
-import { Injectable, Logger } from "@nestjs/common";
+import { createHash } from "crypto";
+import { Injectable } from "@nestjs/common";
import { ConfigService } from "@nestjs/config";
+import { KmsManager, KmsSigner, LegacyPasskeyAssertion } from "@aastar/airaccount/server";
import { ethers } from "ethers";
-import axios, { AxiosInstance } from "axios";
-// ── Types ────────────────────────────────────────────────────────
-
-export interface LegacyPasskeyAssertion {
- AuthenticatorData: string;
- ClientDataHash: string;
- Signature: string;
-}
-
-export interface KmsCreateKeyResponse {
- KeyMetadata: {
- KeyId: string;
- Arn: string;
- CreationDate: string;
- Enabled: boolean;
- Description: string;
- KeyUsage: string;
- KeySpec: string;
- Origin: string;
- Address?: string;
- };
- Mnemonic: string;
- Address?: string;
- Status?: string;
-}
-
-export interface KmsSignHashResponse {
- Signature: string;
-}
-
-export interface KmsKeyStatusResponse {
- KeyId: string;
- Status: "creating" | "deriving" | "ready" | "error";
- Address?: string;
- PublicKey?: string;
- Error?: string;
-}
-
-// ── Service ──────────────────────────────────────────────────────
+export type { LegacyPasskeyAssertion };
@Injectable()
export class KmsService {
- private readonly logger = new Logger(KmsService.name);
- private readonly kmsEndpoint: string;
- private readonly isEnabled: boolean;
- private readonly http: AxiosInstance;
+ private readonly kmsManager: KmsManager;
constructor(private configService: ConfigService) {
- this.kmsEndpoint = this.configService.get("kmsEndpoint") || "https://kms1.aastar.io";
- this.isEnabled = this.configService.get("kmsEnabled") === true;
-
- const headers: Record = {
- "Content-Type": "application/json",
- };
-
- const apiKey = this.configService.get("kmsApiKey");
- if (apiKey) {
- headers["x-api-key"] = apiKey;
- }
-
- this.http = axios.create({
- baseURL: this.kmsEndpoint,
- headers,
+ this.kmsManager = new KmsManager({
+ kmsEndpoint: configService.get("kmsEndpoint") ?? "https://kms1.aastar.io",
+ kmsEnabled: configService.get("kmsEnabled") === true,
+ kmsApiKey: configService.get("kmsApiKey"),
});
- if (this.isEnabled) {
- this.logger.log(`KMS service enabled with endpoint: ${this.kmsEndpoint}`);
+ if (this.kmsManager.isKmsEnabled()) {
+ const endpoint = configService.get("kmsEndpoint") ?? "https://kms1.aastar.io";
+ console.log(`[KmsService] KMS service enabled with endpoint: ${endpoint}`);
+ this.installDiagnosticInterceptors();
} else {
- this.logger.log("KMS service disabled");
- }
- }
-
- isKmsEnabled(): boolean {
- return this.isEnabled;
- }
-
- private ensureEnabled(): void {
- if (!this.isEnabled) {
- throw new Error("KMS service is not enabled");
+ console.log("[KmsService] KMS service disabled");
}
}
- /** POST with x-amz-target header (required for wallet/signing operations). */
- private async amzPost(path: string, target: string, body: unknown): Promise {
- // Log full curl command for debugging
- const url = `${this.kmsEndpoint}${path}`;
- const apiKey = this.configService.get("kmsApiKey");
- const bodyJson = JSON.stringify(body);
- const curlParts = [
- `curl -v -X POST '${url}'`,
- `-H 'Content-Type: application/x-amz-json-1.1'`,
- `-H 'x-amz-target: ${target}'`,
- ];
- if (apiKey) {
- curlParts.push(`-H 'x-api-key: ${apiKey}'`);
- }
- curlParts.push(`-d '${bodyJson}'`);
- this.logger.warn(`[KMS CURL] ${curlParts.join(" \\\n ")}`);
+ /** Attach axios request/response interceptors to log full KMS traffic for debugging. */
+ private installDiagnosticInterceptors() {
+ const http = (this.kmsManager as any).http;
+ if (!http) return;
+
+ http.interceptors.request.use((config: any) => {
+ const body = typeof config.data === "string" ? JSON.parse(config.data) : config.data;
+ // Decode rpIdHash from authenticatorData if present (first 32 bytes = SHA-256 of rpId)
+ const authData = body?.WebAuthn?.Credential?.response?.authenticatorData;
+ let rpIdHashHex = "";
+ if (authData) {
+ try {
+ const buf = Buffer.from(authData.replace(/-/g, "+").replace(/_/g, "/"), "base64");
+ rpIdHashHex = buf.subarray(0, 32).toString("hex");
+ } catch {
+ // ignore parse errors; rpIdHashHex stays empty
+ }
+ }
+ console.log(
+ `[KMS DIAG] ▶ ${config.method?.toUpperCase()} ${config.baseURL}${config.url}\n` +
+ ` Body: ${JSON.stringify(body, null, 2)}\n` +
+ (rpIdHashHex
+ ? ` rpIdHash (from authenticatorData): ${rpIdHashHex}\n` +
+ ` (SHA256("localhost") = ${createHash("sha256").update("localhost").digest("hex")})\n` +
+ ` (SHA256("aastar.io") = ${createHash("sha256").update("aastar.io").digest("hex")})`
+ : "")
+ );
+ return config;
+ });
- const response = await this.http.post(path, body, {
- headers: {
- "Content-Type": "application/x-amz-json-1.1",
- "x-amz-target": target,
+ http.interceptors.response.use(
+ (response: any) => {
+ console.log(
+ `[KMS DIAG] ◀ HTTP ${response.status} ${response.config?.url}\n` +
+ ` Response: ${JSON.stringify(response.data)}`
+ );
+ return response;
},
- });
- return response.data as T;
+ (error: any) => {
+ const status = error.response?.status ?? "network error";
+ const body = error.response?.data ?? error.message;
+ console.error(
+ `[KMS DIAG] ✗ HTTP ${status} ${error.config?.url}\n` +
+ ` Error response: ${JSON.stringify(body)}`
+ );
+ return Promise.reject(error);
+ }
+ );
}
- // ── Key Management ──────────────────────────────────────────────
-
- async createKey(description: string, passkeyPublicKey?: string): Promise {
- this.ensureEnabled();
-
- const payload: Record = {
- Description: description,
- KeyUsage: "SIGN_VERIFY",
- KeySpec: "ECC_SECG_P256K1",
- Origin: "EXTERNAL_KMS",
- };
-
- if (passkeyPublicKey) {
- payload.PasskeyPublicKey = passkeyPublicKey;
- }
-
- this.logger.log(`KMS CreateKey: ${description}`);
-
- return this.amzPost("/CreateKey", "TrentService.CreateKey", payload);
+ isKmsEnabled(): boolean {
+ return this.kmsManager.isKmsEnabled();
}
- async getKeyStatus(keyId: string): Promise {
- this.ensureEnabled();
- const response = await this.http.get("/KeyStatus", {
- params: { KeyId: keyId },
- });
- return response.data as KmsKeyStatusResponse;
+ async createKey(description: string, passkeyPublicKey?: string) {
+ return this.kmsManager.createKey(description, passkeyPublicKey ?? "");
}
- async describeKey(keyId: string): Promise {
- this.ensureEnabled();
- return this.amzPost("/DescribeKey", "TrentService.DescribeKey", { KeyId: keyId });
+ async getKeyStatus(keyId: string) {
+ return this.kmsManager.getKeyStatus(keyId);
}
- // ── Signing with Legacy Passkey Assertion ───────────────────────
-
- async signHashWithAssertion(
- address: string,
- hash: string,
- assertion: LegacyPasskeyAssertion
- ): Promise {
- this.ensureEnabled();
-
- const formattedHash = hash.startsWith("0x") ? hash : `0x${hash}`;
-
- this.logger.log(`KMS SignHash (Legacy assertion): address=${address}`);
-
- return this.amzPost("/SignHash", "TrentService.SignHash", {
- Address: address,
- Hash: formattedHash,
- Passkey: assertion,
- });
+ async describeKey(keyId: string) {
+ return this.kmsManager.describeKey(keyId);
}
- // ── Signing with WebAuthn Ceremony ──────────────────────────────
+ /** Sign a hash using a Legacy Passkey assertion. */
+ async signHashWithAssertion(address: string, hash: string, assertion: LegacyPasskeyAssertion) {
+ return this.kmsManager.signHash(hash, assertion, { Address: address });
+ }
+ /** Sign a hash using a WebAuthn ceremony (one-time ChallengeId). */
async signHashWithWebAuthn(
address: string,
hash: string,
challengeId: string,
credential: unknown
- ): Promise {
- this.ensureEnabled();
-
- const formattedHash = hash.startsWith("0x") ? hash : `0x${hash}`;
-
- this.logger.log(`KMS SignHash (WebAuthn ceremony): address=${address}`);
-
- return this.amzPost("/SignHash", "TrentService.SignHash", {
+ ) {
+ return this.kmsManager.signHashWithWebAuthn(hash, challengeId, credential, {
Address: address,
- Hash: formattedHash,
- WebAuthn: { ChallengeId: challengeId, Credential: credential },
});
}
- // ── WebAuthn Ceremonies ─────────────────────────────────────────
-
- async beginAuthentication(params: { Address?: string; KeyId?: string }): Promise {
- this.ensureEnabled();
- const response = await this.http.post("/BeginAuthentication", params);
- return response.data;
+ async beginAuthentication(params: { Address?: string; KeyId?: string }) {
+ return this.kmsManager.beginAuthentication(params);
}
- // ── KMS Signer Factory ─────────────────────────────────────────
-
- /**
- * Create a KmsSigner backed by this service.
- * If assertionProvider is given, signing operations will use it to get assertions.
- * If not given, signing will use a no-op provider (will fail at KMS if assertion is required).
- */
createKmsSigner(
keyId: string,
address: string,
assertionProvider?: () => Promise,
provider?: ethers.Provider
): KmsSigner {
- this.ensureEnabled();
- return new KmsSigner(keyId, address, this, assertionProvider, provider);
- }
-}
-
-// ── KmsSigner (ethers.AbstractSigner backed by KmsService) ───────
-
-export class KmsSigner extends ethers.AbstractSigner {
- constructor(
- private readonly keyId: string,
- private readonly _address: string,
- private readonly kmsService: KmsService,
- private readonly assertionProvider?: () => Promise,
- provider?: ethers.Provider
- ) {
- super(provider);
- }
-
- async getAddress(): Promise {
- return this._address;
- }
-
- private async getAssertion(): Promise {
- if (!this.assertionProvider) {
- throw new Error("Passkey assertion is required for signing. Provide an assertionProvider.");
- }
- return this.assertionProvider();
- }
-
- async signMessage(message: string | Uint8Array): Promise {
- const messageBytes = typeof message === "string" ? ethers.toUtf8Bytes(message) : message;
- const messageHash = ethers.hashMessage(messageBytes);
- const assertion = await this.getAssertion();
- const signResponse = await this.kmsService.signHashWithAssertion(
- this._address,
- messageHash,
- assertion
- );
- return "0x" + signResponse.Signature;
- }
-
- async signTransaction(tx: ethers.TransactionRequest): Promise {
- if (!this.provider) {
- throw new Error("Provider is required for signing transactions");
- }
-
- const populated = await this.populateTransaction(tx);
- const unsignedTx = ethers.Transaction.from(populated);
- const txHash = unsignedTx.hash;
- if (!txHash) {
- throw new Error("Failed to compute transaction hash");
- }
-
- const assertion = await this.getAssertion();
- const signResponse = await this.kmsService.signHashWithAssertion(
- this._address,
- txHash,
- assertion
- );
-
- const sig = ethers.Signature.from("0x" + signResponse.Signature);
- unsignedTx.signature = sig;
- return unsignedTx.serialized;
- }
-
- async signTypedData(
- domain: ethers.TypedDataDomain,
- types: Record,
- value: Record
- ): Promise {
- const hash = ethers.TypedDataEncoder.hash(domain, types, value);
- const assertion = await this.getAssertion();
- const signResponse = await this.kmsService.signHashWithAssertion(
- this._address,
- hash,
- assertion
- );
- return "0x" + signResponse.Signature;
- }
-
- connect(provider: ethers.Provider): KmsSigner {
- return new KmsSigner(
- this.keyId,
- this._address,
- this.kmsService,
- this.assertionProvider,
- provider
- );
+ const ap =
+ assertionProvider ??
+ (() => {
+ throw new Error("Passkey assertion is required for signing. Provide an assertionProvider.");
+ });
+ return this.kmsManager.createKmsSigner(keyId, address, ap, provider as any);
}
}
diff --git a/aastar/src/paymaster/paymaster.service.ts b/aastar/src/paymaster/paymaster.service.ts
index 6f9a6a17..c9982be3 100644
--- a/aastar/src/paymaster/paymaster.service.ts
+++ b/aastar/src/paymaster/paymaster.service.ts
@@ -1,7 +1,7 @@
import { Injectable, Inject } from "@nestjs/common";
import { ConfigService } from "@nestjs/config";
import { ethers } from "ethers";
-import { YAAAServerClient } from "@yaaa/sdk/server";
+import { YAAAServerClient } from "@aastar/airaccount/server";
import { YAAA_SERVER_CLIENT } from "../sdk/sdk.providers";
@Injectable()
diff --git a/aastar/src/sdk/backend-signer.adapter.ts b/aastar/src/sdk/backend-signer.adapter.ts
index 6fd2cf16..fdb52a6a 100644
--- a/aastar/src/sdk/backend-signer.adapter.ts
+++ b/aastar/src/sdk/backend-signer.adapter.ts
@@ -1,5 +1,5 @@
import { Injectable } from "@nestjs/common";
-import { ISignerAdapter, PasskeyAssertionContext } from "@yaaa/sdk/server";
+import { ISignerAdapter, PasskeyAssertionContext } from "@aastar/airaccount/server";
import { AuthService } from "../auth/auth.service";
import { ethers } from "ethers";
diff --git a/aastar/src/sdk/backend-storage.adapter.ts b/aastar/src/sdk/backend-storage.adapter.ts
index 3ad01b9b..6ad5d9ba 100644
--- a/aastar/src/sdk/backend-storage.adapter.ts
+++ b/aastar/src/sdk/backend-storage.adapter.ts
@@ -5,7 +5,7 @@ import {
TransferRecord,
PaymasterRecord,
BlsConfigRecord,
-} from "@yaaa/sdk/server";
+} from "@aastar/airaccount/server";
import { DatabaseService } from "../database/database.service";
import * as fs from "fs";
import * as path from "path";
diff --git a/aastar/src/sdk/sdk.providers.ts b/aastar/src/sdk/sdk.providers.ts
index cd23ed49..81edf94d 100644
--- a/aastar/src/sdk/sdk.providers.ts
+++ b/aastar/src/sdk/sdk.providers.ts
@@ -1,6 +1,6 @@
import { Provider } from "@nestjs/common";
import { ConfigService } from "@nestjs/config";
-import { YAAAServerClient, ServerConfig } from "@yaaa/sdk/server";
+import { YAAAServerClient, ServerConfig } from "@aastar/airaccount/server";
import { BackendStorageAdapter } from "./backend-storage.adapter";
import { BackendSignerAdapter } from "./backend-signer.adapter";
diff --git a/aastar/src/token/token.service.ts b/aastar/src/token/token.service.ts
index 0352180a..2ae45d88 100644
--- a/aastar/src/token/token.service.ts
+++ b/aastar/src/token/token.service.ts
@@ -1,7 +1,7 @@
import { Injectable, Inject } from "@nestjs/common";
import { ConfigService } from "@nestjs/config";
import { ethers } from "ethers";
-import { YAAAServerClient } from "@yaaa/sdk/server";
+import { YAAAServerClient } from "@aastar/airaccount/server";
import { YAAA_SERVER_CLIENT } from "../sdk/sdk.providers";
export enum TokenCategory {
diff --git a/aastar/src/transfer/dto/execute-transfer.dto.ts b/aastar/src/transfer/dto/execute-transfer.dto.ts
index 70cd0326..52d893e4 100644
--- a/aastar/src/transfer/dto/execute-transfer.dto.ts
+++ b/aastar/src/transfer/dto/execute-transfer.dto.ts
@@ -77,4 +77,15 @@ export class ExecuteTransferDto {
@ValidateNested()
@Type(() => PasskeyAssertionDto)
passkeyAssertion: PasskeyAssertionDto;
+
+ @ApiProperty({
+ description:
+ "P-256 passkey signature (64 bytes hex, r||s). " +
+ "Required for AirAccount Tier 2/3 tiered signing. " +
+ "Extracted from WebAuthn assertion response.signature.",
+ required: false,
+ })
+ @IsOptional()
+ @IsString()
+ p256Signature?: string;
}
diff --git a/aastar/src/transfer/transfer.service.ts b/aastar/src/transfer/transfer.service.ts
index f6e8b02c..1aa2a4e5 100644
--- a/aastar/src/transfer/transfer.service.ts
+++ b/aastar/src/transfer/transfer.service.ts
@@ -1,5 +1,5 @@
import { Injectable, Inject, BadRequestException } from "@nestjs/common";
-import { YAAAServerClient } from "@yaaa/sdk/server";
+import { YAAAServerClient } from "@aastar/airaccount/server";
import { YAAA_SERVER_CLIENT } from "../sdk/sdk.providers";
import { AddressBookService } from "./address-book.service";
import { ExecuteTransferDto } from "./dto/execute-transfer.dto";
@@ -17,19 +17,78 @@ export class TransferService {
throw new BadRequestException("Passkey assertion is required for transactions");
}
+ // PMv4 requires the ERC-20 gas token address appended to paymasterData.
+ // Its contract has no token() getter so we supply it explicitly.
+ const PMV4_ADDRESS = "0xd0c82dc12b7d65b03df7972f67d13f1d33469a98";
+ const APNTS_TOKEN = "0xDf669834F04988BcEE0E3B6013B6b867Bd38778d";
+ const paymasterTokenAddress =
+ transferDto.paymasterAddress?.toLowerCase() === PMV4_ADDRESS ? APNTS_TOKEN : undefined;
+
// Pass the Legacy assertion through to the SDK, which forwards it
// to BLSSignatureService → ISignerAdapter → KmsSigner → KMS SignHash.
// The Legacy format is reusable, enabling the two ECDSA signs needed for BLS.
- const result = await this.client.transfers.executeTransfer(userId, {
- to: transferDto.to,
- amount: transferDto.amount,
- data: transferDto.data,
- tokenAddress: transferDto.tokenAddress,
- usePaymaster: transferDto.usePaymaster,
- paymasterAddress: transferDto.paymasterAddress,
- paymasterData: transferDto.paymasterData,
- passkeyAssertion: transferDto.passkeyAssertion,
- });
+ //
+ // useAirAccountTiering: true enables Tier 1/2/3 routing based on transfer amount.
+ // Tier 1 (<= tier1Limit): single passkey (P-256) signature
+ // Tier 2 (<= tier2Limit): P-256 + BLS dual signature
+ // Tier 3 (> tier2Limit): P-256 + BLS + guardian ECDSA triple signature
+ //
+ // If the BLS seed node (https://v1.aastar.io) is unreachable the SDK will throw;
+ // we catch that here and degrade gracefully to a legacy BLS-only path so the
+ // transfer can still proceed.
+ let result: Awaited>;
+ try {
+ result = await this.client.transfers.executeTransfer(userId, {
+ to: transferDto.to,
+ amount: transferDto.amount,
+ data: transferDto.data,
+ tokenAddress: transferDto.tokenAddress,
+ usePaymaster: transferDto.usePaymaster,
+ paymasterAddress: transferDto.paymasterAddress,
+ paymasterData: transferDto.paymasterData,
+ paymasterTokenAddress,
+ passkeyAssertion: transferDto.passkeyAssertion,
+ p256Signature: transferDto.p256Signature,
+ useAirAccountTiering: true,
+ });
+ } catch (tieringError: unknown) {
+ const msg = tieringError instanceof Error ? tieringError.message : String(tieringError);
+ // Detect BLS seed-node connectivity issues and fall back to legacy BLS path.
+ // Known error patterns: ECONNREFUSED, ENOTFOUND, fetch failed, timeout, ETIMEDOUT.
+ const isBLSNodeError =
+ /ECONNREFUSED|ENOTFOUND|ETIMEDOUT|fetch failed|network error|timeout/i.test(msg);
+ if (isBLSNodeError) {
+ console.warn(
+ `[TransferService] BLS seed node unreachable (${msg}). ` +
+ `Falling back to legacy BLS-only signing. ` +
+ `To resolve, ensure the BLS node at https://v1.aastar.io is reachable.`
+ );
+ try {
+ result = await this.client.transfers.executeTransfer(userId, {
+ to: transferDto.to,
+ amount: transferDto.amount,
+ data: transferDto.data,
+ tokenAddress: transferDto.tokenAddress,
+ usePaymaster: transferDto.usePaymaster,
+ paymasterAddress: transferDto.paymasterAddress,
+ paymasterData: transferDto.paymasterData,
+ paymasterTokenAddress,
+ passkeyAssertion: transferDto.passkeyAssertion,
+ // useAirAccountTiering omitted → legacy BLS path
+ });
+ } catch (fallbackError: unknown) {
+ const fallbackMsg =
+ fallbackError instanceof Error ? fallbackError.message : String(fallbackError);
+ throw new Error(
+ `Transfer failed on both tiered and legacy BLS paths. ` +
+ `Tiering error: ${msg}. Legacy BLS error: ${fallbackMsg}`
+ );
+ }
+ } else {
+ // Re-throw non-connectivity errors (guard pre-check failures, etc.)
+ throw tieringError;
+ }
+ }
// Record in address book after successful submission (fire-and-forget)
if (result.success && result.transferId) {
diff --git a/docs/approve-recovery.html b/docs/approve-recovery.html
new file mode 100644
index 00000000..ed12ce3b
--- /dev/null
+++ b/docs/approve-recovery.html
@@ -0,0 +1,123 @@
+
+
+
+
+Approve Recovery
+
+
+
+Step 3.4: Approve Recovery (Guardian 2)
+
+
+
Contract (SMART_ACCOUNT_B)
+
0x342B8048887815942fD06c95dBe5D27A5b5B6495
+
+
+
Must be called from (ADDR_G2)
+
0xe24b6f321B0140716a2b671ed0D983bb64E7DaFA
+
+
+Switch MetaMask to ADDR_G2 on Sepolia , then click:
+
+Connect MetaMask & Approve Recovery
+
+
+
+
+
diff --git a/docs/propose-recovery.html b/docs/propose-recovery.html
new file mode 100644
index 00000000..0d8029fe
--- /dev/null
+++ b/docs/propose-recovery.html
@@ -0,0 +1,136 @@
+
+
+
+
+Propose Recovery
+
+
+
+Step 3.2: Propose Recovery
+
+
+
Contract (SMART_ACCOUNT_B)
+
0x342B8048887815942fD06c95dBe5D27A5b5B6495
+
+
+
New Owner (ADDR_A)
+
0x6c4ac776bb9714eedb7d9a354e89e6b83538d4ee
+
+
+
Must be called from (ADDR_G1)
+
0x075F227E25a63417Bf66F6e751b376B09Fd43928
+
+
+Switch MetaMask to ADDR_G1 on Sepolia , then click:
+
+Connect MetaMask & Propose Recovery
+
+
+
+
+
diff --git a/docs/social-recovery-e2e-test.md b/docs/social-recovery-e2e-test.md
new file mode 100644
index 00000000..4daae3fe
--- /dev/null
+++ b/docs/social-recovery-e2e-test.md
@@ -0,0 +1,274 @@
+# Social Recovery 端到端验证方案
+
+> 目标:验证 AirAccount 社交恢复完整流程
+> 网络:Sepolia
+> 日期:2026-03-31
+
+---
+
+## 前置准备
+
+### 1. 环境配置
+
+确认 `YetAnotherAA/aastar/.env` 中以下配置正确:
+
+```
+ETH_PRIVATE_KEY=0x1b9c251d318c3c8576b96beddfdc4ec2ffbff762d70325787bde31559db83a21
+CHAIN_ID=11155111
+ETH_RPC_URL=https://ethereum-sepolia-rpc.publicnode.com
+```
+
+> `ETH_PRIVATE_KEY` 对应 `aastar-sdk/.env.sepolia` 中的 `TEST_PRIVATE_KEY`,用于后端 relayer 发送链上 `executeRecovery()` 交易。
+
+### 2. 启动服务
+
+```bash
+# 后端(端口 3001)
+cd YetAnotherAA/aastar
+npm run start:dev
+
+# 前端
+cd YetAnotherAA/aastar-frontend
+npm run dev
+```
+
+### 3. 准备 MetaMask 账户
+
+准备 3 个不同的 MetaMask 账户,记录地址:
+
+| 角色 | 变量名 | 说明 |
+|------|--------|------|
+| 主账户 | `ADDR_A` | 账户 A 的 owner,也是恢复后账户 B 的新 owner |
+| Guardian 1 | `ADDR_G1` | MetaMask 账户 2 |
+| Guardian 2 | `ADDR_G2` | MetaMask 账户 3 |
+
+---
+
+## 第一阶段:账户 A 充值与转账
+
+### 步骤 1.1:注册用户 A
+
+页面:`http://localhost:3000/auth/register`
+
+- 邮箱:`usera@test.com`
+- 注册成功后重定向到 Dashboard
+
+### 步骤 1.2:创建账户 A(无 guardian)
+
+Dashboard → 点击 **Create Account** → 选择 EntryPoint v0.7 → 点击 Create Account
+
+**预期结果**:页面显示 `SMART_ACCOUNT_A` 地址
+
+### 步骤 1.3:充值
+
+向 `SMART_ACCOUNT_A` 发送至少 **0.01 Sepolia ETH**
+
+获取测试 ETH:
+- https://sepoliafaucet.com
+- https://www.alchemy.com/faucets/ethereum-sepolia
+
+**验证**:Dashboard 余额显示 > 0
+
+### 步骤 1.4:执行转账
+
+页面:`http://localhost:3000/transfer`
+
+- 收款地址:任意 Sepolia 地址(或 `ADDR_A`)
+- 金额:`0.001`
+- 勾选 Use Paymaster
+- 点击 Send → 完成 passkey 认证
+
+**预期结果**:转账成功,Dashboard 显示转账记录,余额减少
+
+---
+
+## 第二阶段:创建账户 B(带 2 个 Guardian)
+
+### 步骤 2.1:注册 Guardian 用户
+
+Guardian 必须是系统注册用户,且用户的 `walletAddress` 必须与 guardian 地址一致。
+
+**注册 Guardian 1**:
+1. 浏览器新标签页访问 `/auth/register`,邮箱 `guardian1@test.com`
+2. 注册成功后,通过 Swagger(`http://localhost:3001/api/v1/docs`)或直接调用:
+
+```
+POST /auth/wallet/link
+Authorization: Bearer
+Body: { "kmsKeyId": "", "address": "ADDR_G1" }
+```
+
+**注册 Guardian 2**:同上,邮箱 `guardian2@test.com`,地址 `ADDR_G2`
+
+**验证**:
+```
+GET /auth/profile
+Authorization: Bearer
+```
+预期:`{ walletAddress: "ADDR_G1" }`
+
+### 步骤 2.2:创建账户 B(带 guardian)
+
+以 `userb@test.com` 注册并登录,Dashboard → **Create Account**
+
+**Step 1 - Config**:
+- EntryPoint:v0.7
+- 展开 Advanced Options → Daily Limit 填 `0.5`
+- 点击 Create Account → 进入 guardian 签名步骤
+
+**Step 2 - Guardian 1 签名**:
+- 复制页面下方的 guardian-sign URL,在新标签页打开
+- 选择 **MetaMask** 签名方式
+- MetaMask 切换到 `ADDR_G1` 账户
+- 点击 Sign with MetaMask → 确认弹窗
+- 复制返回的 Address 和 Signature,粘贴回 CreateAccount 对话框
+- 点击 **Next: Guardian 2**
+
+**Step 3 - Guardian 2 签名**:
+- 同上,MetaMask 切换到 `ADDR_G2` 账户
+- 复制签名粘贴回对话框
+- 点击 **Create Account**
+
+**预期结果**:账户 `SMART_ACCOUNT_B` 创建成功,链上配置:
+- `guardian0 = ADDR_G1`
+- `guardian1 = ADDR_G2`
+- `guardian2 = 默认社区 Safe 地址`
+
+---
+
+## 第三阶段:对账户 B 执行社交恢复
+
+目标:将 `SMART_ACCOUNT_B` 的 owner 从 `ADDR_B` 恢复为 `ADDR_A`
+
+### 步骤 3.1:注册 Guardian 关系(以账户 B 的 JWT 登录)
+
+页面:`http://localhost:3000/recovery`
+
+填写表单:
+- Account Address:`SMART_ACCOUNT_B`
+- New Signer Address:`ADDR_A`
+- Guardian 1 Address:`ADDR_G1`
+- Guardian 2 Address:`ADDR_G2`
+
+点击 **Register Guardians & Continue**
+
+**预期结果**:两个 guardian 地址写入数据库,进入 Initiate 步骤
+
+### 步骤 3.2:链上 proposeRecovery(Guardian 1 操作)
+
+**必须在链上调用**,后端 relayer 无法代替 guardian 调用此函数(合约要求 `msg.sender == guardian`)。
+
+使用 Remix IDE(https://remix.ethereum.org):
+1. 新建文件,粘贴 ABI:
+```json
+[{"inputs":[{"type":"address","name":"_newOwner"}],"name":"proposeRecovery","outputs":[],"stateMutability":"nonpayable","type":"function"}]
+```
+2. Deploy & Run → Environment 选 Injected Provider(MetaMask)
+3. MetaMask 切换到 `ADDR_G1`,网络切换到 Sepolia
+4. At Address 填入 `SMART_ACCOUNT_B` → Load
+5. 调用 `proposeRecovery`,参数填 `ADDR_A`
+6. 确认 MetaMask 交易,等待上链
+
+### 步骤 3.3:Guardian 1 发起恢复(后端记录)
+
+**切换登录为 guardian1@test.com**(Guardian 1 的 JWT)
+
+Recovery 页面 → Step 2 → 点击 **Initiate Recovery (as Guardian 1)**
+
+**预期结果**:
+```json
+{
+ "status": "pending",
+ "supporters": ["ADDR_G1"],
+ "supportCount": 1,
+ "executeAfter": "",
+ "quorumRequired": 2
+}
+```
+
+### 步骤 3.4:链上 approveRecovery(Guardian 2 操作)
+
+使用 Remix,切换 MetaMask 到 `ADDR_G2`,调用:
+```json
+[{"inputs":[],"name":"approveRecovery","outputs":[],"stateMutability":"nonpayable","type":"function"}]
+```
+`SMART_ACCOUNT_B.approveRecovery()`,确认交易
+
+### 步骤 3.5:Guardian 2 支持恢复(后端记录)
+
+**切换登录为 guardian2@test.com**(Guardian 2 的 JWT)
+
+Recovery 页面 → Step 3 → 点击 **Support Recovery (as Guardian 2)**
+
+**预期结果**:
+```json
+{
+ "supportCount": 2,
+ "quorumReached": true
+}
+```
+
+### 步骤 3.6:等待 48 小时
+
+`executeAfter` 时间戳过后,Recovery 页面 Step 4 的时间锁状态会显示 **"Expired — ready"**。
+
+> 注意:链上也有 2 天 timelock(`proposedAt + 2 days`),需同步等待。
+
+### 步骤 3.7:执行恢复
+
+Recovery 页面 → Step 4 → 点击 **Execute Recovery**
+
+后端 relayer(`ETH_PRIVATE_KEY`)发送链上 `executeRecovery()` 交易。
+
+**预期结果**:
+```json
+{
+ "message": "Account recovery executed successfully (on-chain + database updated)",
+ "newSignerAddress": "ADDR_A",
+ "txHash": "0x..."
+}
+```
+
+---
+
+## 第四阶段:验证恢复结果
+
+| 验证项 | 方法 | 预期结果 |
+|--------|------|----------|
+| 链上 owner 已更新 | Remix `SMART_ACCOUNT_B.owner()` 或 Etherscan | `ADDR_A` |
+| 数据库 signerAddress | `GET /account`(JWT_B) | `ADDR_A` |
+| activeRecovery 已清除 | `GET /guardian/recovery/SMART_ACCOUNT_B` | `null` 或 `onChain.active: false` |
+| 账户 B 余额未变 | `GET /account/balance`(JWT_B) | 与恢复前相同 |
+| 账户 A 转账记录 | Dashboard(JWT_A) | 第一阶段的记录仍存在 |
+
+---
+
+## 流程总览
+
+```
+[用户A注册] → [创建账户A] → [充值] → [转账] → [验证记录]
+ ↓
+[注册G1/G2用户] → [创建账户B with guardian] → [SMART_ACCOUNT_B]
+ ↓
+[Recovery页面填写地址] → [注册guardian关系]
+ ↓
+[Remix] ADDR_G1 调 proposeRecovery(ADDR_A)
+[后端] Guardian1 initiateRecovery
+[Remix] ADDR_G2 调 approveRecovery()
+[后端] Guardian2 supportRecovery
+ ↓
+ [等待 48小时 + 链上 2天 timelock]
+ ↓
+[Recovery页面] executeRecovery → relayer 发链上交易
+ ↓
+[验证] owner == ADDR_A ✓ 余额不变 ✓ 记录存在 ✓
+```
+
+---
+
+## 关键约束
+
+- `proposeRecovery` / `approveRecovery` 必须 guardian 自己调(`msg.sender == guardian`),后端无法代替
+- `initiateRecovery` / `supportRecovery` 需要 guardian 用自己的账户登录系统
+- `executeRecovery` 无调用者限制,后端 relayer 代发
+- 链上 + 后端双重 48h/2day timelock,两者都需满足
diff --git a/package-lock.json b/package-lock.json
index e0899dfd..622aa8d7 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -10,8 +10,7 @@
"license": "MIT",
"workspaces": [
"aastar",
- "aastar-frontend",
- "sdk"
+ "aastar-frontend"
],
"devDependencies": {
"prettier": "^3.6.2",
@@ -26,6 +25,7 @@
"version": "1.0.0",
"license": "ISC",
"dependencies": {
+ "@aastar/airaccount": "^0.19.0",
"@nestjs/common": "^11.1.6",
"@nestjs/config": "^4.0.2",
"@nestjs/core": "^11.1.6",
@@ -36,7 +36,6 @@
"@nestjs/typeorm": "^11.0.0",
"@noble/curves": "^2.0.1",
"@types/tar": "^6.1.13",
- "@yaaa/sdk": "^0.1.0",
"axios": "^1.13.1",
"base64url": "^3.0.1",
"bcrypt": "^6.0.0",
@@ -79,20 +78,21 @@
"aastar-frontend": {
"version": "0.1.0",
"dependencies": {
+ "@aastar/airaccount": "^0.19.0",
"@headlessui/react": "^2.2.9",
"@heroicons/react": "^2.2.0",
"@simplewebauthn/browser": "^13.2.2",
"@types/node": "^24",
"@types/react": "^19",
"@types/react-dom": "^19",
- "@yaaa/sdk": "^0.1.0",
"axios": "^1.13.1",
"next": "^16.1.1",
"react": "19.2.0",
"react-dom": "19.2.0",
"react-hot-toast": "^2.6.0",
"react-qr-code": "^2.0.18",
- "typescript": "^5"
+ "typescript": "^5",
+ "viem": "^2.47.6"
},
"devDependencies": {
"@eslint/eslintrc": "^3",
@@ -323,6 +323,24 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/@aastar/airaccount": {
+ "version": "0.19.0",
+ "resolved": "https://registry.npmjs.org/@aastar/airaccount/-/airaccount-0.19.0.tgz",
+ "integrity": "sha512-5OoWnIrUiNxzIPO5vOkGfEKT3B0VQCoY4zqN2g7kLo6gEf5O3Mw5UXXhGc19xXWpjBmVH7JoqQg73PPbhbMJEw==",
+ "license": "MIT",
+ "dependencies": {
+ "@noble/curves": "^2.0.1",
+ "@simplewebauthn/browser": "^13.2.2",
+ "axios": "^1.12.2"
+ },
+ "optionalDependencies": {
+ "@ledgerhq/hw-app-eth": "^7.6.0",
+ "@ledgerhq/hw-transport-webhid": "^6.33.0"
+ },
+ "peerDependencies": {
+ "ethers": "^6.0.0"
+ }
+ },
"node_modules/@adraffy/ens-normalize": {
"version": "1.10.1",
"resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.1.tgz",
@@ -1003,9 +1021,9 @@
"license": "MIT"
},
"node_modules/@borewit/text-codec": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/@borewit/text-codec/-/text-codec-0.1.1.tgz",
- "integrity": "sha512-5L/uBxmjaCIX5h8Z+uu+kA9BQLkc/Wl06UGR5ajNRxu+/XjonB5i8JpgFMrPj3LXTCPA0pv8yxUvbUi+QthGGA==",
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/@borewit/text-codec/-/text-codec-0.2.2.tgz",
+ "integrity": "sha512-DDaRehssg1aNrH4+2hnj1B7vnUGEjU6OIlyRdkMd0aUdIUvKXrJfXsy8LVtXAy7DRvYVluWbMspsRhz2lcW0mQ==",
"license": "MIT",
"funding": {
"type": "github",
@@ -1067,9 +1085,9 @@
}
},
"node_modules/@emnapi/runtime": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.5.0.tgz",
- "integrity": "sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==",
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.9.1.tgz",
+ "integrity": "sha512-VYi5+ZVLhpgK4hQ0TAjiQiZ6ol0oe4mBx7mVv7IflsiEp0OWoVsp/+f9Vc1hOhE0TtkORVrI1GvzyreqpgWtkA==",
"license": "MIT",
"optional": true,
"dependencies": {
@@ -1087,592 +1105,560 @@
"tslib": "^2.4.0"
}
},
- "node_modules/@esbuild/aix-ppc64": {
- "version": "0.27.2",
- "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz",
- "integrity": "sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==",
- "cpu": [
- "ppc64"
- ],
+ "node_modules/@eslint-community/eslint-utils": {
+ "version": "4.9.0",
+ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz",
+ "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==",
"dev": true,
"license": "MIT",
- "optional": true,
- "os": [
- "aix"
- ],
+ "dependencies": {
+ "eslint-visitor-keys": "^3.4.3"
+ },
"engines": {
- "node": ">=18"
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
}
},
- "node_modules/@esbuild/android-arm": {
- "version": "0.27.2",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.2.tgz",
- "integrity": "sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==",
- "cpu": [
- "arm"
- ],
+ "node_modules/@eslint-community/regexpp": {
+ "version": "4.12.1",
+ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz",
+ "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==",
"dev": true,
"license": "MIT",
- "optional": true,
- "os": [
- "android"
- ],
"engines": {
- "node": ">=18"
+ "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
}
},
- "node_modules/@esbuild/android-arm64": {
- "version": "0.27.2",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.2.tgz",
- "integrity": "sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==",
- "cpu": [
- "arm64"
- ],
+ "node_modules/@eslint/config-array": {
+ "version": "0.21.1",
+ "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz",
+ "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==",
"dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "android"
- ],
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@eslint/object-schema": "^2.1.7",
+ "debug": "^4.3.1",
+ "minimatch": "^3.1.2"
+ },
"engines": {
- "node": ">=18"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
}
},
- "node_modules/@esbuild/android-x64": {
- "version": "0.27.2",
- "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.2.tgz",
- "integrity": "sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==",
- "cpu": [
- "x64"
- ],
+ "node_modules/@eslint/config-helpers": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.1.tgz",
+ "integrity": "sha512-csZAzkNhsgwb0I/UAV6/RGFTbiakPCf0ZrGmrIxQpYvGZ00PhTkSnyKNolphgIvmnJeGw6rcGVEXfTzUnFuEvw==",
"dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "android"
- ],
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@eslint/core": "^0.16.0"
+ },
"engines": {
- "node": ">=18"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
}
},
- "node_modules/@esbuild/darwin-arm64": {
- "version": "0.27.2",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.2.tgz",
- "integrity": "sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==",
- "cpu": [
- "arm64"
- ],
+ "node_modules/@eslint/core": {
+ "version": "0.16.0",
+ "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.16.0.tgz",
+ "integrity": "sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q==",
"dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@types/json-schema": "^7.0.15"
+ },
"engines": {
- "node": ">=18"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
}
},
- "node_modules/@esbuild/darwin-x64": {
- "version": "0.27.2",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.2.tgz",
- "integrity": "sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==",
- "cpu": [
- "x64"
- ],
+ "node_modules/@eslint/eslintrc": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz",
+ "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==",
"dev": true,
"license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
+ "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"
+ },
"engines": {
- "node": ">=18"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
}
},
- "node_modules/@esbuild/freebsd-arm64": {
- "version": "0.27.2",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.2.tgz",
- "integrity": "sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==",
- "cpu": [
- "arm64"
- ],
+ "node_modules/@eslint/js": {
+ "version": "9.38.0",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.38.0.tgz",
+ "integrity": "sha512-UZ1VpFvXf9J06YG9xQBdnzU+kthors6KjhMAl6f4gH4usHyh31rUf2DLGInT8RFYIReYXNSydgPY0V2LuWgl7A==",
"dev": true,
"license": "MIT",
- "optional": true,
- "os": [
- "freebsd"
- ],
"engines": {
- "node": ">=18"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://eslint.org/donate"
}
},
- "node_modules/@esbuild/freebsd-x64": {
- "version": "0.27.2",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.2.tgz",
- "integrity": "sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==",
- "cpu": [
- "x64"
- ],
+ "node_modules/@eslint/object-schema": {
+ "version": "2.1.7",
+ "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz",
+ "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==",
"dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "freebsd"
- ],
+ "license": "Apache-2.0",
"engines": {
- "node": ">=18"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
}
},
- "node_modules/@esbuild/linux-arm": {
- "version": "0.27.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.2.tgz",
- "integrity": "sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==",
- "cpu": [
- "arm"
- ],
+ "node_modules/@eslint/plugin-kit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.0.tgz",
+ "integrity": "sha512-sB5uyeq+dwCWyPi31B2gQlVlo+j5brPlWx4yZBrEaRo/nhdDE8Xke1gsGgtiBdaBTxuTkceLVuVt/pclrasb0A==",
"dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@eslint/core": "^0.16.0",
+ "levn": "^0.4.1"
+ },
"engines": {
- "node": ">=18"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
}
},
- "node_modules/@esbuild/linux-arm64": {
- "version": "0.27.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.2.tgz",
- "integrity": "sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==",
- "cpu": [
- "arm64"
+ "node_modules/@ethersproject/abi": {
+ "version": "5.8.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.8.0.tgz",
+ "integrity": "sha512-b9YS/43ObplgyV6SlyQsG53/vkSal0MNA1fskSC4mbnCMi8R+NkcH8K9FPYNESf6jUefBUniE4SOKms0E/KK1Q==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
],
- "dev": true,
"license": "MIT",
"optional": true,
- "os": [
- "linux"
+ "dependencies": {
+ "@ethersproject/address": "^5.8.0",
+ "@ethersproject/bignumber": "^5.8.0",
+ "@ethersproject/bytes": "^5.8.0",
+ "@ethersproject/constants": "^5.8.0",
+ "@ethersproject/hash": "^5.8.0",
+ "@ethersproject/keccak256": "^5.8.0",
+ "@ethersproject/logger": "^5.8.0",
+ "@ethersproject/properties": "^5.8.0",
+ "@ethersproject/strings": "^5.8.0"
+ }
+ },
+ "node_modules/@ethersproject/abstract-provider": {
+ "version": "5.8.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.8.0.tgz",
+ "integrity": "sha512-wC9SFcmh4UK0oKuLJQItoQdzS/qZ51EJegK6EmAWlh+OptpQ/npECOR3QqECd8iGHC0RJb4WKbVdSfif4ammrg==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
],
- "engines": {
- "node": ">=18"
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@ethersproject/bignumber": "^5.8.0",
+ "@ethersproject/bytes": "^5.8.0",
+ "@ethersproject/logger": "^5.8.0",
+ "@ethersproject/networks": "^5.8.0",
+ "@ethersproject/properties": "^5.8.0",
+ "@ethersproject/transactions": "^5.8.0",
+ "@ethersproject/web": "^5.8.0"
}
},
- "node_modules/@esbuild/linux-ia32": {
- "version": "0.27.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.2.tgz",
- "integrity": "sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==",
- "cpu": [
- "ia32"
+ "node_modules/@ethersproject/abstract-signer": {
+ "version": "5.8.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.8.0.tgz",
+ "integrity": "sha512-N0XhZTswXcmIZQdYtUnd79VJzvEwXQw6PK0dTl9VoYrEBxxCPXqS0Eod7q5TNKRxe1/5WUMuR0u0nqTF/avdCA==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
],
- "dev": true,
"license": "MIT",
"optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
+ "dependencies": {
+ "@ethersproject/abstract-provider": "^5.8.0",
+ "@ethersproject/bignumber": "^5.8.0",
+ "@ethersproject/bytes": "^5.8.0",
+ "@ethersproject/logger": "^5.8.0",
+ "@ethersproject/properties": "^5.8.0"
}
},
- "node_modules/@esbuild/linux-loong64": {
- "version": "0.27.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.2.tgz",
- "integrity": "sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==",
- "cpu": [
- "loong64"
+ "node_modules/@ethersproject/address": {
+ "version": "5.8.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.8.0.tgz",
+ "integrity": "sha512-GhH/abcC46LJwshoN+uBNoKVFPxUuZm6dA257z0vZkKmU1+t8xTn8oK7B9qrj8W2rFRMch4gbJl6PmVxjxBEBA==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
],
- "dev": true,
"license": "MIT",
"optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
+ "dependencies": {
+ "@ethersproject/bignumber": "^5.8.0",
+ "@ethersproject/bytes": "^5.8.0",
+ "@ethersproject/keccak256": "^5.8.0",
+ "@ethersproject/logger": "^5.8.0",
+ "@ethersproject/rlp": "^5.8.0"
}
},
- "node_modules/@esbuild/linux-mips64el": {
- "version": "0.27.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.2.tgz",
- "integrity": "sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==",
- "cpu": [
- "mips64el"
+ "node_modules/@ethersproject/base64": {
+ "version": "5.8.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.8.0.tgz",
+ "integrity": "sha512-lN0oIwfkYj9LbPx4xEkie6rAMJtySbpOAFXSDVQaBnAzYfB4X2Qr+FXJGxMoc3Bxp2Sm8OwvzMrywxyw0gLjIQ==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
],
- "dev": true,
"license": "MIT",
"optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
+ "dependencies": {
+ "@ethersproject/bytes": "^5.8.0"
}
},
- "node_modules/@esbuild/linux-ppc64": {
- "version": "0.27.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.2.tgz",
- "integrity": "sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==",
- "cpu": [
- "ppc64"
+ "node_modules/@ethersproject/bignumber": {
+ "version": "5.8.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.8.0.tgz",
+ "integrity": "sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
],
- "dev": true,
"license": "MIT",
"optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
+ "dependencies": {
+ "@ethersproject/bytes": "^5.8.0",
+ "@ethersproject/logger": "^5.8.0",
+ "bn.js": "^5.2.1"
}
},
- "node_modules/@esbuild/linux-riscv64": {
- "version": "0.27.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.2.tgz",
- "integrity": "sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==",
- "cpu": [
- "riscv64"
+ "node_modules/@ethersproject/bytes": {
+ "version": "5.8.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.8.0.tgz",
+ "integrity": "sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
],
- "dev": true,
"license": "MIT",
"optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
+ "dependencies": {
+ "@ethersproject/logger": "^5.8.0"
}
},
- "node_modules/@esbuild/linux-s390x": {
- "version": "0.27.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.2.tgz",
- "integrity": "sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==",
- "cpu": [
- "s390x"
+ "node_modules/@ethersproject/constants": {
+ "version": "5.8.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.8.0.tgz",
+ "integrity": "sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
],
- "dev": true,
"license": "MIT",
"optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
+ "dependencies": {
+ "@ethersproject/bignumber": "^5.8.0"
}
},
- "node_modules/@esbuild/linux-x64": {
- "version": "0.27.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.2.tgz",
- "integrity": "sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==",
- "cpu": [
- "x64"
+ "node_modules/@ethersproject/hash": {
+ "version": "5.8.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.8.0.tgz",
+ "integrity": "sha512-ac/lBcTbEWW/VGJij0CNSw/wPcw9bSRgCB0AIBz8CvED/jfvDoV9hsIIiWfvWmFEi8RcXtlNwp2jv6ozWOsooA==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
],
- "dev": true,
"license": "MIT",
"optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/netbsd-arm64": {
- "version": "0.27.2",
- "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.2.tgz",
- "integrity": "sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==",
- "cpu": [
- "arm64"
+ "dependencies": {
+ "@ethersproject/abstract-signer": "^5.8.0",
+ "@ethersproject/address": "^5.8.0",
+ "@ethersproject/base64": "^5.8.0",
+ "@ethersproject/bignumber": "^5.8.0",
+ "@ethersproject/bytes": "^5.8.0",
+ "@ethersproject/keccak256": "^5.8.0",
+ "@ethersproject/logger": "^5.8.0",
+ "@ethersproject/properties": "^5.8.0",
+ "@ethersproject/strings": "^5.8.0"
+ }
+ },
+ "node_modules/@ethersproject/keccak256": {
+ "version": "5.8.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.8.0.tgz",
+ "integrity": "sha512-A1pkKLZSz8pDaQ1ftutZoaN46I6+jvuqugx5KYNeQOPqq+JZ0Txm7dlWesCHB5cndJSu5vP2VKptKf7cksERng==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
],
- "dev": true,
"license": "MIT",
"optional": true,
- "os": [
- "netbsd"
- ],
- "engines": {
- "node": ">=18"
+ "dependencies": {
+ "@ethersproject/bytes": "^5.8.0",
+ "js-sha3": "0.8.0"
}
},
- "node_modules/@esbuild/netbsd-x64": {
- "version": "0.27.2",
- "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.2.tgz",
- "integrity": "sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==",
- "cpu": [
- "x64"
+ "node_modules/@ethersproject/logger": {
+ "version": "5.8.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.8.0.tgz",
+ "integrity": "sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
],
- "dev": true,
"license": "MIT",
- "optional": true,
- "os": [
- "netbsd"
- ],
- "engines": {
- "node": ">=18"
- }
+ "optional": true
},
- "node_modules/@esbuild/openbsd-arm64": {
- "version": "0.27.2",
- "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.2.tgz",
- "integrity": "sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==",
- "cpu": [
- "arm64"
+ "node_modules/@ethersproject/networks": {
+ "version": "5.8.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.8.0.tgz",
+ "integrity": "sha512-egPJh3aPVAzbHwq8DD7Po53J4OUSsA1MjQp8Vf/OZPav5rlmWUaFLiq8cvQiGK0Z5K6LYzm29+VA/p4RL1FzNg==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
],
- "dev": true,
"license": "MIT",
"optional": true,
- "os": [
- "openbsd"
- ],
- "engines": {
- "node": ">=18"
+ "dependencies": {
+ "@ethersproject/logger": "^5.8.0"
}
},
- "node_modules/@esbuild/openbsd-x64": {
- "version": "0.27.2",
- "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.2.tgz",
- "integrity": "sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==",
- "cpu": [
- "x64"
+ "node_modules/@ethersproject/properties": {
+ "version": "5.8.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.8.0.tgz",
+ "integrity": "sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
],
- "dev": true,
"license": "MIT",
"optional": true,
- "os": [
- "openbsd"
- ],
- "engines": {
- "node": ">=18"
+ "dependencies": {
+ "@ethersproject/logger": "^5.8.0"
}
},
- "node_modules/@esbuild/openharmony-arm64": {
- "version": "0.27.2",
- "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.2.tgz",
- "integrity": "sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==",
- "cpu": [
- "arm64"
+ "node_modules/@ethersproject/rlp": {
+ "version": "5.8.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.8.0.tgz",
+ "integrity": "sha512-LqZgAznqDbiEunaUvykH2JAoXTT9NV0Atqk8rQN9nx9SEgThA/WMx5DnW8a9FOufo//6FZOCHZ+XiClzgbqV9Q==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
],
- "dev": true,
"license": "MIT",
"optional": true,
- "os": [
- "openharmony"
- ],
- "engines": {
- "node": ">=18"
+ "dependencies": {
+ "@ethersproject/bytes": "^5.8.0",
+ "@ethersproject/logger": "^5.8.0"
}
},
- "node_modules/@esbuild/sunos-x64": {
- "version": "0.27.2",
- "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.2.tgz",
- "integrity": "sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==",
- "cpu": [
- "x64"
+ "node_modules/@ethersproject/signing-key": {
+ "version": "5.8.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.8.0.tgz",
+ "integrity": "sha512-LrPW2ZxoigFi6U6aVkFN/fa9Yx/+4AtIUe4/HACTvKJdhm0eeb107EVCIQcrLZkxaSIgc/eCrX8Q1GtbH+9n3w==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
],
- "dev": true,
"license": "MIT",
"optional": true,
- "os": [
- "sunos"
- ],
- "engines": {
- "node": ">=18"
+ "dependencies": {
+ "@ethersproject/bytes": "^5.8.0",
+ "@ethersproject/logger": "^5.8.0",
+ "@ethersproject/properties": "^5.8.0",
+ "bn.js": "^5.2.1",
+ "elliptic": "6.6.1",
+ "hash.js": "1.1.7"
}
},
- "node_modules/@esbuild/win32-arm64": {
- "version": "0.27.2",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.2.tgz",
- "integrity": "sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==",
- "cpu": [
- "arm64"
+ "node_modules/@ethersproject/strings": {
+ "version": "5.8.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.8.0.tgz",
+ "integrity": "sha512-qWEAk0MAvl0LszjdfnZ2uC8xbR2wdv4cDabyHiBh3Cldq/T8dPH3V4BbBsAYJUeonwD+8afVXld274Ls+Y1xXg==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
],
- "dev": true,
"license": "MIT",
"optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">=18"
+ "dependencies": {
+ "@ethersproject/bytes": "^5.8.0",
+ "@ethersproject/constants": "^5.8.0",
+ "@ethersproject/logger": "^5.8.0"
}
},
- "node_modules/@esbuild/win32-ia32": {
- "version": "0.27.2",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.2.tgz",
- "integrity": "sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==",
- "cpu": [
- "ia32"
+ "node_modules/@ethersproject/transactions": {
+ "version": "5.8.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.8.0.tgz",
+ "integrity": "sha512-UglxSDjByHG0TuU17bDfCemZ3AnKO2vYrL5/2n2oXvKzvb7Cz+W9gOWXKARjp2URVwcWlQlPOEQyAviKwT4AHg==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
],
- "dev": true,
"license": "MIT",
"optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/win32-x64": {
- "version": "0.27.2",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.2.tgz",
- "integrity": "sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==",
- "cpu": [
- "x64"
+ "dependencies": {
+ "@ethersproject/address": "^5.8.0",
+ "@ethersproject/bignumber": "^5.8.0",
+ "@ethersproject/bytes": "^5.8.0",
+ "@ethersproject/constants": "^5.8.0",
+ "@ethersproject/keccak256": "^5.8.0",
+ "@ethersproject/logger": "^5.8.0",
+ "@ethersproject/properties": "^5.8.0",
+ "@ethersproject/rlp": "^5.8.0",
+ "@ethersproject/signing-key": "^5.8.0"
+ }
+ },
+ "node_modules/@ethersproject/web": {
+ "version": "5.8.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.8.0.tgz",
+ "integrity": "sha512-j7+Ksi/9KfGviws6Qtf9Q7KCqRhpwrYKQPs+JBA/rKVFF/yaWLHJEH3zfVP2plVu+eys0d2DlFmhoQJayFewcw==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
],
- "dev": true,
"license": "MIT",
"optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">=18"
+ "dependencies": {
+ "@ethersproject/base64": "^5.8.0",
+ "@ethersproject/bytes": "^5.8.0",
+ "@ethersproject/logger": "^5.8.0",
+ "@ethersproject/properties": "^5.8.0",
+ "@ethersproject/strings": "^5.8.0"
}
},
- "node_modules/@eslint-community/eslint-utils": {
- "version": "4.9.0",
- "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz",
- "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==",
- "dev": true,
+ "node_modules/@floating-ui/core": {
+ "version": "1.7.3",
+ "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.3.tgz",
+ "integrity": "sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==",
"license": "MIT",
"dependencies": {
- "eslint-visitor-keys": "^3.4.3"
- },
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- },
- "peerDependencies": {
- "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
+ "@floating-ui/utils": "^0.2.10"
}
},
- "node_modules/@eslint-community/regexpp": {
- "version": "4.12.1",
- "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz",
- "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
- }
- },
- "node_modules/@eslint/config-array": {
- "version": "0.21.1",
- "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz",
- "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "@eslint/object-schema": "^2.1.7",
- "debug": "^4.3.1",
- "minimatch": "^3.1.2"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- }
- },
- "node_modules/@eslint/config-helpers": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.1.tgz",
- "integrity": "sha512-csZAzkNhsgwb0I/UAV6/RGFTbiakPCf0ZrGmrIxQpYvGZ00PhTkSnyKNolphgIvmnJeGw6rcGVEXfTzUnFuEvw==",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "@eslint/core": "^0.16.0"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- }
- },
- "node_modules/@eslint/core": {
- "version": "0.16.0",
- "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.16.0.tgz",
- "integrity": "sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q==",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "@types/json-schema": "^7.0.15"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- }
- },
- "node_modules/@eslint/eslintrc": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz",
- "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==",
- "dev": true,
- "license": "MIT",
- "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"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- }
- },
- "node_modules/@eslint/js": {
- "version": "9.38.0",
- "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.38.0.tgz",
- "integrity": "sha512-UZ1VpFvXf9J06YG9xQBdnzU+kthors6KjhMAl6f4gH4usHyh31rUf2DLGInT8RFYIReYXNSydgPY0V2LuWgl7A==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "url": "https://eslint.org/donate"
- }
- },
- "node_modules/@eslint/object-schema": {
- "version": "2.1.7",
- "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz",
- "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- }
- },
- "node_modules/@eslint/plugin-kit": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.0.tgz",
- "integrity": "sha512-sB5uyeq+dwCWyPi31B2gQlVlo+j5brPlWx4yZBrEaRo/nhdDE8Xke1gsGgtiBdaBTxuTkceLVuVt/pclrasb0A==",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "@eslint/core": "^0.16.0",
- "levn": "^0.4.1"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- }
- },
- "node_modules/@floating-ui/core": {
- "version": "1.7.3",
- "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.3.tgz",
- "integrity": "sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==",
- "license": "MIT",
- "dependencies": {
- "@floating-ui/utils": "^0.2.10"
- }
- },
- "node_modules/@floating-ui/dom": {
- "version": "1.7.4",
- "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.4.tgz",
- "integrity": "sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==",
+ "node_modules/@floating-ui/dom": {
+ "version": "1.7.4",
+ "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.4.tgz",
+ "integrity": "sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==",
"license": "MIT",
"dependencies": {
"@floating-ui/core": "^1.7.3",
@@ -1819,9 +1805,9 @@
}
},
"node_modules/@img/colour": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.0.0.tgz",
- "integrity": "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz",
+ "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==",
"license": "MIT",
"optional": true,
"engines": {
@@ -1829,9 +1815,9 @@
}
},
"node_modules/@img/sharp-darwin-arm64": {
- "version": "0.34.4",
- "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.4.tgz",
- "integrity": "sha512-sitdlPzDVyvmINUdJle3TNHl+AG9QcwiAMsXmccqsCOMZNIdW2/7S26w0LyU8euiLVzFBL3dXPwVCq/ODnf2vA==",
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz",
+ "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==",
"cpu": [
"arm64"
],
@@ -1847,13 +1833,13 @@
"url": "https://opencollective.com/libvips"
},
"optionalDependencies": {
- "@img/sharp-libvips-darwin-arm64": "1.2.3"
+ "@img/sharp-libvips-darwin-arm64": "1.2.4"
}
},
"node_modules/@img/sharp-darwin-x64": {
- "version": "0.34.4",
- "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.4.tgz",
- "integrity": "sha512-rZheupWIoa3+SOdF/IcUe1ah4ZDpKBGWcsPX6MT0lYniH9micvIU7HQkYTfrx5Xi8u+YqwLtxC/3vl8TQN6rMg==",
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz",
+ "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==",
"cpu": [
"x64"
],
@@ -1869,13 +1855,13 @@
"url": "https://opencollective.com/libvips"
},
"optionalDependencies": {
- "@img/sharp-libvips-darwin-x64": "1.2.3"
+ "@img/sharp-libvips-darwin-x64": "1.2.4"
}
},
"node_modules/@img/sharp-libvips-darwin-arm64": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.3.tgz",
- "integrity": "sha512-QzWAKo7kpHxbuHqUC28DZ9pIKpSi2ts2OJnoIGI26+HMgq92ZZ4vk8iJd4XsxN+tYfNJxzH6W62X5eTcsBymHw==",
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz",
+ "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==",
"cpu": [
"arm64"
],
@@ -1889,9 +1875,9 @@
}
},
"node_modules/@img/sharp-libvips-darwin-x64": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.3.tgz",
- "integrity": "sha512-Ju+g2xn1E2AKO6YBhxjj+ACcsPQRHT0bhpglxcEf+3uyPY+/gL8veniKoo96335ZaPo03bdDXMv0t+BBFAbmRA==",
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz",
+ "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==",
"cpu": [
"x64"
],
@@ -1905,12 +1891,15 @@
}
},
"node_modules/@img/sharp-libvips-linux-arm": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.3.tgz",
- "integrity": "sha512-x1uE93lyP6wEwGvgAIV0gP6zmaL/a0tGzJs/BIDDG0zeBhMnuUPm7ptxGhUbcGs4okDJrk4nxgrmxpib9g6HpA==",
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz",
+ "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==",
"cpu": [
"arm"
],
+ "libc": [
+ "glibc"
+ ],
"license": "LGPL-3.0-or-later",
"optional": true,
"os": [
@@ -1921,12 +1910,15 @@
}
},
"node_modules/@img/sharp-libvips-linux-arm64": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.3.tgz",
- "integrity": "sha512-I4RxkXU90cpufazhGPyVujYwfIm9Nk1QDEmiIsaPwdnm013F7RIceaCc87kAH+oUB1ezqEvC6ga4m7MSlqsJvQ==",
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz",
+ "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==",
"cpu": [
"arm64"
],
+ "libc": [
+ "glibc"
+ ],
"license": "LGPL-3.0-or-later",
"optional": true,
"os": [
@@ -1937,12 +1929,34 @@
}
},
"node_modules/@img/sharp-libvips-linux-ppc64": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.3.tgz",
- "integrity": "sha512-Y2T7IsQvJLMCBM+pmPbM3bKT/yYJvVtLJGfCs4Sp95SjvnFIjynbjzsa7dY1fRJX45FTSfDksbTp6AGWudiyCg==",
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz",
+ "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==",
"cpu": [
"ppc64"
],
+ "libc": [
+ "glibc"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linux-riscv64": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz",
+ "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==",
+ "cpu": [
+ "riscv64"
+ ],
+ "libc": [
+ "glibc"
+ ],
"license": "LGPL-3.0-or-later",
"optional": true,
"os": [
@@ -1953,12 +1967,15 @@
}
},
"node_modules/@img/sharp-libvips-linux-s390x": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.3.tgz",
- "integrity": "sha512-RgWrs/gVU7f+K7P+KeHFaBAJlNkD1nIZuVXdQv6S+fNA6syCcoboNjsV2Pou7zNlVdNQoQUpQTk8SWDHUA3y/w==",
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz",
+ "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==",
"cpu": [
"s390x"
],
+ "libc": [
+ "glibc"
+ ],
"license": "LGPL-3.0-or-later",
"optional": true,
"os": [
@@ -1969,12 +1986,15 @@
}
},
"node_modules/@img/sharp-libvips-linux-x64": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.3.tgz",
- "integrity": "sha512-3JU7LmR85K6bBiRzSUc/Ff9JBVIFVvq6bomKE0e63UXGeRw2HPVEjoJke1Yx+iU4rL7/7kUjES4dZ/81Qjhyxg==",
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz",
+ "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==",
"cpu": [
"x64"
],
+ "libc": [
+ "glibc"
+ ],
"license": "LGPL-3.0-or-later",
"optional": true,
"os": [
@@ -1985,12 +2005,15 @@
}
},
"node_modules/@img/sharp-libvips-linuxmusl-arm64": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.3.tgz",
- "integrity": "sha512-F9q83RZ8yaCwENw1GieztSfj5msz7GGykG/BA+MOUefvER69K/ubgFHNeSyUu64amHIYKGDs4sRCMzXVj8sEyw==",
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz",
+ "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==",
"cpu": [
"arm64"
],
+ "libc": [
+ "musl"
+ ],
"license": "LGPL-3.0-or-later",
"optional": true,
"os": [
@@ -2001,12 +2024,15 @@
}
},
"node_modules/@img/sharp-libvips-linuxmusl-x64": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.3.tgz",
- "integrity": "sha512-U5PUY5jbc45ANM6tSJpsgqmBF/VsL6LnxJmIf11kB7J5DctHgqm0SkuXzVWtIY90GnJxKnC/JT251TDnk1fu/g==",
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz",
+ "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==",
"cpu": [
"x64"
],
+ "libc": [
+ "musl"
+ ],
"license": "LGPL-3.0-or-later",
"optional": true,
"os": [
@@ -2017,12 +2043,15 @@
}
},
"node_modules/@img/sharp-linux-arm": {
- "version": "0.34.4",
- "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.4.tgz",
- "integrity": "sha512-Xyam4mlqM0KkTHYVSuc6wXRmM7LGN0P12li03jAnZ3EJWZqj83+hi8Y9UxZUbxsgsK1qOEwg7O0Bc0LjqQVtxA==",
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz",
+ "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==",
"cpu": [
"arm"
],
+ "libc": [
+ "glibc"
+ ],
"license": "Apache-2.0",
"optional": true,
"os": [
@@ -2035,16 +2064,19 @@
"url": "https://opencollective.com/libvips"
},
"optionalDependencies": {
- "@img/sharp-libvips-linux-arm": "1.2.3"
+ "@img/sharp-libvips-linux-arm": "1.2.4"
}
},
"node_modules/@img/sharp-linux-arm64": {
- "version": "0.34.4",
- "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.4.tgz",
- "integrity": "sha512-YXU1F/mN/Wu786tl72CyJjP/Ngl8mGHN1hST4BGl+hiW5jhCnV2uRVTNOcaYPs73NeT/H8Upm3y9582JVuZHrQ==",
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz",
+ "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==",
"cpu": [
"arm64"
],
+ "libc": [
+ "glibc"
+ ],
"license": "Apache-2.0",
"optional": true,
"os": [
@@ -2057,16 +2089,19 @@
"url": "https://opencollective.com/libvips"
},
"optionalDependencies": {
- "@img/sharp-libvips-linux-arm64": "1.2.3"
+ "@img/sharp-libvips-linux-arm64": "1.2.4"
}
},
"node_modules/@img/sharp-linux-ppc64": {
- "version": "0.34.4",
- "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.4.tgz",
- "integrity": "sha512-F4PDtF4Cy8L8hXA2p3TO6s4aDt93v+LKmpcYFLAVdkkD3hSxZzee0rh6/+94FpAynsuMpLX5h+LRsSG3rIciUQ==",
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz",
+ "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==",
"cpu": [
"ppc64"
],
+ "libc": [
+ "glibc"
+ ],
"license": "Apache-2.0",
"optional": true,
"os": [
@@ -2079,16 +2114,44 @@
"url": "https://opencollective.com/libvips"
},
"optionalDependencies": {
- "@img/sharp-libvips-linux-ppc64": "1.2.3"
+ "@img/sharp-libvips-linux-ppc64": "1.2.4"
+ }
+ },
+ "node_modules/@img/sharp-linux-riscv64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz",
+ "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==",
+ "cpu": [
+ "riscv64"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-riscv64": "1.2.4"
}
},
"node_modules/@img/sharp-linux-s390x": {
- "version": "0.34.4",
- "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.4.tgz",
- "integrity": "sha512-qVrZKE9Bsnzy+myf7lFKvng6bQzhNUAYcVORq2P7bDlvmF6u2sCmK2KyEQEBdYk+u3T01pVsPrkj943T1aJAsw==",
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz",
+ "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==",
"cpu": [
"s390x"
],
+ "libc": [
+ "glibc"
+ ],
"license": "Apache-2.0",
"optional": true,
"os": [
@@ -2101,16 +2164,19 @@
"url": "https://opencollective.com/libvips"
},
"optionalDependencies": {
- "@img/sharp-libvips-linux-s390x": "1.2.3"
+ "@img/sharp-libvips-linux-s390x": "1.2.4"
}
},
"node_modules/@img/sharp-linux-x64": {
- "version": "0.34.4",
- "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.4.tgz",
- "integrity": "sha512-ZfGtcp2xS51iG79c6Vhw9CWqQC8l2Ot8dygxoDoIQPTat/Ov3qAa8qpxSrtAEAJW+UjTXc4yxCjNfxm4h6Xm2A==",
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz",
+ "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==",
"cpu": [
"x64"
],
+ "libc": [
+ "glibc"
+ ],
"license": "Apache-2.0",
"optional": true,
"os": [
@@ -2123,16 +2189,19 @@
"url": "https://opencollective.com/libvips"
},
"optionalDependencies": {
- "@img/sharp-libvips-linux-x64": "1.2.3"
+ "@img/sharp-libvips-linux-x64": "1.2.4"
}
},
"node_modules/@img/sharp-linuxmusl-arm64": {
- "version": "0.34.4",
- "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.4.tgz",
- "integrity": "sha512-8hDVvW9eu4yHWnjaOOR8kHVrew1iIX+MUgwxSuH2XyYeNRtLUe4VNioSqbNkB7ZYQJj9rUTT4PyRscyk2PXFKA==",
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz",
+ "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==",
"cpu": [
"arm64"
],
+ "libc": [
+ "musl"
+ ],
"license": "Apache-2.0",
"optional": true,
"os": [
@@ -2145,16 +2214,19 @@
"url": "https://opencollective.com/libvips"
},
"optionalDependencies": {
- "@img/sharp-libvips-linuxmusl-arm64": "1.2.3"
+ "@img/sharp-libvips-linuxmusl-arm64": "1.2.4"
}
},
"node_modules/@img/sharp-linuxmusl-x64": {
- "version": "0.34.4",
- "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.4.tgz",
- "integrity": "sha512-lU0aA5L8QTlfKjpDCEFOZsTYGn3AEiO6db8W5aQDxj0nQkVrZWmN3ZP9sYKWJdtq3PWPhUNlqehWyXpYDcI9Sg==",
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz",
+ "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==",
"cpu": [
"x64"
],
+ "libc": [
+ "musl"
+ ],
"license": "Apache-2.0",
"optional": true,
"os": [
@@ -2167,20 +2239,20 @@
"url": "https://opencollective.com/libvips"
},
"optionalDependencies": {
- "@img/sharp-libvips-linuxmusl-x64": "1.2.3"
+ "@img/sharp-libvips-linuxmusl-x64": "1.2.4"
}
},
"node_modules/@img/sharp-wasm32": {
- "version": "0.34.4",
- "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.4.tgz",
- "integrity": "sha512-33QL6ZO/qpRyG7woB/HUALz28WnTMI2W1jgX3Nu2bypqLIKx/QKMILLJzJjI+SIbvXdG9fUnmrxR7vbi1sTBeA==",
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz",
+ "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==",
"cpu": [
"wasm32"
],
"license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT",
"optional": true,
"dependencies": {
- "@emnapi/runtime": "^1.5.0"
+ "@emnapi/runtime": "^1.7.0"
},
"engines": {
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
@@ -2190,9 +2262,9 @@
}
},
"node_modules/@img/sharp-win32-arm64": {
- "version": "0.34.4",
- "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.4.tgz",
- "integrity": "sha512-2Q250do/5WXTwxW3zjsEuMSv5sUU4Tq9VThWKlU2EYLm4MB7ZeMwF+SFJutldYODXF6jzc6YEOC+VfX0SZQPqA==",
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz",
+ "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==",
"cpu": [
"arm64"
],
@@ -2209,9 +2281,9 @@
}
},
"node_modules/@img/sharp-win32-ia32": {
- "version": "0.34.4",
- "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.4.tgz",
- "integrity": "sha512-3ZeLue5V82dT92CNL6rsal6I2weKw1cYu+rGKm8fOCCtJTR2gYeUfY3FqUnIJsMUPIH68oS5jmZ0NiJ508YpEw==",
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz",
+ "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==",
"cpu": [
"ia32"
],
@@ -2228,9 +2300,9 @@
}
},
"node_modules/@img/sharp-win32-x64": {
- "version": "0.34.4",
- "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.4.tgz",
- "integrity": "sha512-xIyj4wpYs8J18sVN3mSQjwrw7fKUqRw+Z5rnHNCy5fYTxigBz81u5mOMPmFumwjcn8+ld1ppptMBCLic1nz6ig==",
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz",
+ "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==",
"cpu": [
"x64"
],
@@ -3219,62 +3291,294 @@
"@jridgewell/sourcemap-codec": "^1.4.14"
}
},
- "node_modules/@lukeed/csprng": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@lukeed/csprng/-/csprng-1.1.0.tgz",
- "integrity": "sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA==",
+ "node_modules/@ledgerhq/client-ids": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/@ledgerhq/client-ids/-/client-ids-0.8.0.tgz",
+ "integrity": "sha512-COxmSvDAtyRlgitKcCfbq7+dqOnwzbyaasUgBj7AdVtswUwPOLLBbq1y/E/dg5TNjfXTV3zMCOu7WpNq0PdVTg==",
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "@ledgerhq/live-env": "^2.30.0",
+ "@reduxjs/toolkit": "2.11.2",
+ "uuid": "^9.0.0"
+ }
+ },
+ "node_modules/@ledgerhq/client-ids/node_modules/uuid": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz",
+ "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==",
+ "funding": [
+ "https://github.com/sponsors/broofa",
+ "https://github.com/sponsors/ctavan"
+ ],
"license": "MIT",
- "engines": {
- "node": ">=8"
+ "optional": true,
+ "bin": {
+ "uuid": "dist/bin/uuid"
}
},
- "node_modules/@microsoft/tsdoc": {
- "version": "0.16.0",
- "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.16.0.tgz",
- "integrity": "sha512-xgAyonlVVS+q7Vc7qLW0UrJU7rSFcETRWsqdXZtjzRU8dF+6CkozTK4V4y1LwOX7j8r/vHphjDeMeGI4tNGeGA==",
- "license": "MIT"
+ "node_modules/@ledgerhq/devices": {
+ "version": "8.13.0",
+ "resolved": "https://registry.npmjs.org/@ledgerhq/devices/-/devices-8.13.0.tgz",
+ "integrity": "sha512-hgGn1kpe/rT0EJ0Qs7rG+1TXA4g6HN2t3dB4DndRTqVqC9aSSbME+ajA0QWLZisxOD3zkwvO4Q0mJ2zARAKyag==",
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "@ledgerhq/errors": "^6.32.0",
+ "@ledgerhq/logs": "^6.16.0",
+ "rxjs": "7.8.2",
+ "semver": "7.7.3"
+ }
},
- "node_modules/@napi-rs/wasm-runtime": {
- "version": "0.2.12",
- "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz",
- "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==",
- "dev": true,
+ "node_modules/@ledgerhq/domain-service": {
+ "version": "1.7.2",
+ "resolved": "https://registry.npmjs.org/@ledgerhq/domain-service/-/domain-service-1.7.2.tgz",
+ "integrity": "sha512-u2BkKSQyDqw+txs97xa/t8zZmGb5XpsktPjaBNwJ8xxQkYGwi2Hz/IrveOgR/7lUTY0+iYmajuwJqVncH198KQ==",
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "@ledgerhq/errors": "^6.32.0",
+ "@ledgerhq/logs": "^6.16.0",
+ "@ledgerhq/types-live": "^6.102.0",
+ "axios": "1.13.2",
+ "eip55": "^2.1.1",
+ "react": "19.0.0",
+ "react-dom": "19.0.0"
+ }
+ },
+ "node_modules/@ledgerhq/domain-service/node_modules/axios": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.2.tgz",
+ "integrity": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==",
"license": "MIT",
"optional": true,
"dependencies": {
- "@emnapi/core": "^1.4.3",
- "@emnapi/runtime": "^1.4.3",
- "@tybys/wasm-util": "^0.10.0"
+ "follow-redirects": "^1.15.6",
+ "form-data": "^4.0.4",
+ "proxy-from-env": "^1.1.0"
}
},
- "node_modules/@nestjs/cli": {
- "version": "11.0.16",
- "resolved": "https://registry.npmjs.org/@nestjs/cli/-/cli-11.0.16.tgz",
- "integrity": "sha512-P0H+Vcjki6P5160E5QnMt3Q0X5FTg4PZkP99Ig4lm/4JWqfw32j3EXv3YBTJ2DmxLwOQ/IS9F7dzKpMAgzKTGg==",
- "dev": true,
+ "node_modules/@ledgerhq/domain-service/node_modules/react": {
+ "version": "19.0.0",
+ "resolved": "https://registry.npmjs.org/react/-/react-19.0.0.tgz",
+ "integrity": "sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==",
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/@ledgerhq/domain-service/node_modules/react-dom": {
+ "version": "19.0.0",
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.0.0.tgz",
+ "integrity": "sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==",
"license": "MIT",
+ "optional": true,
"dependencies": {
- "@angular-devkit/core": "19.2.19",
- "@angular-devkit/schematics": "19.2.19",
- "@angular-devkit/schematics-cli": "19.2.19",
- "@inquirer/prompts": "7.10.1",
- "@nestjs/schematics": "^11.0.1",
- "ansis": "4.2.0",
- "chokidar": "4.0.3",
- "cli-table3": "0.6.5",
- "commander": "4.1.1",
- "fork-ts-checker-webpack-plugin": "9.1.0",
- "glob": "13.0.0",
- "node-emoji": "1.11.0",
- "ora": "5.4.1",
- "tsconfig-paths": "4.2.0",
- "tsconfig-paths-webpack-plugin": "4.2.0",
- "typescript": "5.9.3",
- "webpack": "5.104.1",
- "webpack-node-externals": "3.0.0"
- },
- "bin": {
- "nest": "bin/nest.js"
+ "scheduler": "^0.25.0"
+ },
+ "peerDependencies": {
+ "react": "^19.0.0"
+ }
+ },
+ "node_modules/@ledgerhq/domain-service/node_modules/scheduler": {
+ "version": "0.25.0",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.25.0.tgz",
+ "integrity": "sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==",
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/@ledgerhq/errors": {
+ "version": "6.32.0",
+ "resolved": "https://registry.npmjs.org/@ledgerhq/errors/-/errors-6.32.0.tgz",
+ "integrity": "sha512-BjjvhLM6UXYUbhllqAduo9PSneLt9FXZ3TBEUFQ3MMSZOCHt0gAgDySLwul99R8fdYWkXBza4DYQjUNckpN2lg==",
+ "license": "Apache-2.0",
+ "optional": true
+ },
+ "node_modules/@ledgerhq/evm-tools": {
+ "version": "1.12.1",
+ "resolved": "https://registry.npmjs.org/@ledgerhq/evm-tools/-/evm-tools-1.12.1.tgz",
+ "integrity": "sha512-TP6011l1qINtByuK930K4ETCSBwoTEwX+PSqFhaDelj2QSLmPllDj7uAL4LLAMyVCsKkfLK6SP+Qw2m9XVRnEA==",
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "@ethersproject/constants": "^5.7.0",
+ "@ethersproject/hash": "^5.7.0",
+ "@ledgerhq/live-env": "^2.30.0",
+ "axios": "1.13.2",
+ "crypto-js": "4.2.0"
+ }
+ },
+ "node_modules/@ledgerhq/evm-tools/node_modules/axios": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.2.tgz",
+ "integrity": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "follow-redirects": "^1.15.6",
+ "form-data": "^4.0.4",
+ "proxy-from-env": "^1.1.0"
+ }
+ },
+ "node_modules/@ledgerhq/hw-app-eth": {
+ "version": "7.6.1",
+ "resolved": "https://registry.npmjs.org/@ledgerhq/hw-app-eth/-/hw-app-eth-7.6.1.tgz",
+ "integrity": "sha512-rQPsjECXlRxQCmz43V7Xu53X/4+OFrWaLu4NWWB+JyWAl4vRbYkoR/4axlFM/wsDFmKGotFNce9QdqYx8GP56w==",
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "@ethersproject/abi": "^5.7.0",
+ "@ethersproject/rlp": "^5.7.0",
+ "@ethersproject/transactions": "^5.7.0",
+ "@ledgerhq/domain-service": "^1.7.2",
+ "@ledgerhq/errors": "^6.32.0",
+ "@ledgerhq/evm-tools": "^1.12.1",
+ "@ledgerhq/hw-transport": "6.34.1",
+ "@ledgerhq/hw-transport-mocker": "^6.33.1",
+ "@ledgerhq/logs": "^6.16.0",
+ "@ledgerhq/types-live": "^6.102.0",
+ "axios": "1.13.2",
+ "bignumber.js": "^9.1.2",
+ "semver": "7.7.3"
+ }
+ },
+ "node_modules/@ledgerhq/hw-app-eth/node_modules/axios": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.2.tgz",
+ "integrity": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "follow-redirects": "^1.15.6",
+ "form-data": "^4.0.4",
+ "proxy-from-env": "^1.1.0"
+ }
+ },
+ "node_modules/@ledgerhq/hw-transport": {
+ "version": "6.34.1",
+ "resolved": "https://registry.npmjs.org/@ledgerhq/hw-transport/-/hw-transport-6.34.1.tgz",
+ "integrity": "sha512-Bg9Qk2vtm0m0cZn9prZV2Hbvh3b42KBh4uomO00derh+eiwsdg5AXBBptAJiREkew1RVtETRdWxrKchUJfeWvA==",
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "@ledgerhq/devices": "8.13.0",
+ "@ledgerhq/errors": "^6.32.0",
+ "@ledgerhq/logs": "^6.16.0",
+ "events": "^3.3.0"
+ }
+ },
+ "node_modules/@ledgerhq/hw-transport-mocker": {
+ "version": "6.33.1",
+ "resolved": "https://registry.npmjs.org/@ledgerhq/hw-transport-mocker/-/hw-transport-mocker-6.33.1.tgz",
+ "integrity": "sha512-lrz1JlOV+Q9QE228kUSiXeRc2TbpwDpY2kqPsDF+CuhlLxa+AqcK4O941cJJuFOuIx8hCEeZKiz1U2bcozKN7g==",
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "@ledgerhq/hw-transport": "6.34.1",
+ "@ledgerhq/logs": "^6.16.0",
+ "rxjs": "7.8.2"
+ }
+ },
+ "node_modules/@ledgerhq/hw-transport-webhid": {
+ "version": "6.34.0",
+ "resolved": "https://registry.npmjs.org/@ledgerhq/hw-transport-webhid/-/hw-transport-webhid-6.34.0.tgz",
+ "integrity": "sha512-SG+UnZXyUzrJBSkZnRYGaaZV+C8yiu+pF69Mzw4AKOX6TG8RZ1tOvly8hhnRQ2/gXSiTgbc07N4T8ne2eFei3A==",
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "@ledgerhq/devices": "8.13.0",
+ "@ledgerhq/errors": "^6.32.0",
+ "@ledgerhq/hw-transport": "6.34.1",
+ "@ledgerhq/logs": "^6.16.0"
+ }
+ },
+ "node_modules/@ledgerhq/live-env": {
+ "version": "2.30.0",
+ "resolved": "https://registry.npmjs.org/@ledgerhq/live-env/-/live-env-2.30.0.tgz",
+ "integrity": "sha512-cs+MOC1oWv6b6Iuu0NiIjH78ecX4UAAFHgEHipdcojdsuOCRbPUxGmj/l3vpATkyEwTZEjIAVGFFtJ830KQDAw==",
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "rxjs": "7.8.2",
+ "utility-types": "^3.10.0"
+ }
+ },
+ "node_modules/@ledgerhq/logs": {
+ "version": "6.16.0",
+ "resolved": "https://registry.npmjs.org/@ledgerhq/logs/-/logs-6.16.0.tgz",
+ "integrity": "sha512-v/PLfb1dq1En35kkpbfRWp8jLYgbPUXxGhmd4pmvPSIe0nRGkNTomsZASmWQAv6pRonVGqHIBVlte7j1MBbOww==",
+ "license": "Apache-2.0",
+ "optional": true
+ },
+ "node_modules/@ledgerhq/types-live": {
+ "version": "6.102.0",
+ "resolved": "https://registry.npmjs.org/@ledgerhq/types-live/-/types-live-6.102.0.tgz",
+ "integrity": "sha512-/kAnEvW1g87BAtVJMXPQkZMNstjmYY+N620rOKvd+cbcZkVSa5N3MAjQHPdccLrJr/Xp5x+G21KDmp4u2j8Lfg==",
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "@ledgerhq/client-ids": "0.8.0",
+ "bignumber.js": "^9.1.2",
+ "rxjs": "7.8.2"
+ }
+ },
+ "node_modules/@lukeed/csprng": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@lukeed/csprng/-/csprng-1.1.0.tgz",
+ "integrity": "sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@microsoft/tsdoc": {
+ "version": "0.16.0",
+ "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.16.0.tgz",
+ "integrity": "sha512-xgAyonlVVS+q7Vc7qLW0UrJU7rSFcETRWsqdXZtjzRU8dF+6CkozTK4V4y1LwOX7j8r/vHphjDeMeGI4tNGeGA==",
+ "license": "MIT"
+ },
+ "node_modules/@napi-rs/wasm-runtime": {
+ "version": "0.2.12",
+ "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz",
+ "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@emnapi/core": "^1.4.3",
+ "@emnapi/runtime": "^1.4.3",
+ "@tybys/wasm-util": "^0.10.0"
+ }
+ },
+ "node_modules/@nestjs/cli": {
+ "version": "11.0.16",
+ "resolved": "https://registry.npmjs.org/@nestjs/cli/-/cli-11.0.16.tgz",
+ "integrity": "sha512-P0H+Vcjki6P5160E5QnMt3Q0X5FTg4PZkP99Ig4lm/4JWqfw32j3EXv3YBTJ2DmxLwOQ/IS9F7dzKpMAgzKTGg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@angular-devkit/core": "19.2.19",
+ "@angular-devkit/schematics": "19.2.19",
+ "@angular-devkit/schematics-cli": "19.2.19",
+ "@inquirer/prompts": "7.10.1",
+ "@nestjs/schematics": "^11.0.1",
+ "ansis": "4.2.0",
+ "chokidar": "4.0.3",
+ "cli-table3": "0.6.5",
+ "commander": "4.1.1",
+ "fork-ts-checker-webpack-plugin": "9.1.0",
+ "glob": "13.0.0",
+ "node-emoji": "1.11.0",
+ "ora": "5.4.1",
+ "tsconfig-paths": "4.2.0",
+ "tsconfig-paths-webpack-plugin": "4.2.0",
+ "typescript": "5.9.3",
+ "webpack": "5.104.1",
+ "webpack-node-externals": "3.0.0"
+ },
+ "bin": {
+ "nest": "bin/nest.js"
},
"engines": {
"node": ">= 20.11"
@@ -3303,9 +3607,9 @@
}
},
"node_modules/@nestjs/cli/node_modules/brace-expansion": {
- "version": "5.0.4",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz",
- "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==",
+ "version": "5.0.5",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz",
+ "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -3377,12 +3681,12 @@
}
},
"node_modules/@nestjs/common": {
- "version": "11.1.8",
- "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-11.1.8.tgz",
- "integrity": "sha512-bbsOqwld/GdBfiRNc4nnjyWWENDEicq4SH+R5AuYatvf++vf1x5JIsHB1i1KtfZMD3eRte0D4K9WXuAYil6XAg==",
+ "version": "11.1.17",
+ "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-11.1.17.tgz",
+ "integrity": "sha512-hLODw5Abp8OQgA+mUO4tHou4krKgDtUcM9j5Ihxncst9XeyxYBTt2bwZm4e4EQr5E352S4Fyy6V3iFx9ggxKAg==",
"license": "MIT",
"dependencies": {
- "file-type": "21.0.0",
+ "file-type": "21.3.2",
"iterare": "1.2.1",
"load-esm": "1.0.3",
"tslib": "2.8.1",
@@ -3423,9 +3727,9 @@
}
},
"node_modules/@nestjs/core": {
- "version": "11.1.14",
- "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-11.1.14.tgz",
- "integrity": "sha512-7OXPPMoDr6z+5NkoQKu4hOhfjz/YYqM3bNilPqv1WVFWrzSmuNXxvhbX69YMmNmRYascPXiwESqf5jJdjKXEww==",
+ "version": "11.1.17",
+ "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-11.1.17.tgz",
+ "integrity": "sha512-lD5mAYekTTurF3vDaa8C2OKPnjiz4tsfxIc5XlcSUzOhkwWf6Ay3HKvt6FmvuWQam6uIIHX52Clg+e6tAvf/cg==",
"hasInstallScript": true,
"license": "MIT",
"dependencies": {
@@ -3463,16 +3767,6 @@
}
}
},
- "node_modules/@nestjs/core/node_modules/path-to-regexp": {
- "version": "8.3.0",
- "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz",
- "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==",
- "license": "MIT",
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/express"
- }
- },
"node_modules/@nestjs/jwt": {
"version": "11.0.1",
"resolved": "https://registry.npmjs.org/@nestjs/jwt/-/jwt-11.0.1.tgz",
@@ -3517,14 +3811,14 @@
}
},
"node_modules/@nestjs/platform-express": {
- "version": "11.1.14",
- "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-11.1.14.tgz",
- "integrity": "sha512-Fs+/j+mBSBSXErOQJ/YdUn/HqJGSJ4pGfiJyYOyz04l42uNVnqEakvu1kXLbxMabR6vd6/h9d6Bi4tso9p7o4Q==",
+ "version": "11.1.17",
+ "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-11.1.17.tgz",
+ "integrity": "sha512-mAf4eOsSBsTOn/VbrUO1gsjW6dVh91qqXPMXun4dN8SnNjf7PTQagM9o8d6ab8ZBpNe6UdZftdrZoDetU+n4Qg==",
"license": "MIT",
"dependencies": {
"cors": "2.8.6",
"express": "5.2.1",
- "multer": "2.0.2",
+ "multer": "2.1.1",
"path-to-regexp": "8.3.0",
"tslib": "2.8.1"
},
@@ -3537,16 +3831,6 @@
"@nestjs/core": "^11.0.0"
}
},
- "node_modules/@nestjs/platform-express/node_modules/path-to-regexp": {
- "version": "8.3.0",
- "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz",
- "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==",
- "license": "MIT",
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/express"
- }
- },
"node_modules/@nestjs/schematics": {
"version": "11.0.9",
"resolved": "https://registry.npmjs.org/@nestjs/schematics/-/schematics-11.0.9.tgz",
@@ -3678,20 +3962,10 @@
}
}
},
- "node_modules/@nestjs/swagger/node_modules/path-to-regexp": {
- "version": "8.3.0",
- "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz",
- "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==",
- "license": "MIT",
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/express"
- }
- },
"node_modules/@nestjs/testing": {
- "version": "11.1.14",
- "resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-11.1.14.tgz",
- "integrity": "sha512-cQxX0ronsTbpfHz8/LYOVWXxoTxv6VoxrnuZoQaVX7QV2PSMqxWE7/9jSQR0GcqAFUEmFP34c6EJqfkjfX/k4Q==",
+ "version": "11.1.17",
+ "resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-11.1.17.tgz",
+ "integrity": "sha512-lNffw+z+2USewmw4W0tsK+Rq94A2N4PiHbcqoRUu5y8fnqxQeIWGHhjo5BFCqj7eivqJBhT7WdRydxVq4rAHzg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -3730,9 +4004,9 @@
}
},
"node_modules/@next/env": {
- "version": "16.1.6",
- "resolved": "https://registry.npmjs.org/@next/env/-/env-16.1.6.tgz",
- "integrity": "sha512-N1ySLuZjnAtN3kFnwhAwPvZah8RJxKasD7x1f8shFqhncnWZn4JMfg37diLNuoHsLAlrDfM3g4mawVdtAG8XLQ==",
+ "version": "16.2.1",
+ "resolved": "https://registry.npmjs.org/@next/env/-/env-16.2.1.tgz",
+ "integrity": "sha512-n8P/HCkIWW+gVal2Z8XqXJ6aB3J0tuM29OcHpCsobWlChH/SITBs1DFBk/HajgrwDkqqBXPbuUuzgDvUekREPg==",
"license": "MIT"
},
"node_modules/@next/eslint-plugin-next": {
@@ -3776,9 +4050,9 @@
}
},
"node_modules/@next/swc-darwin-arm64": {
- "version": "16.1.6",
- "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.1.6.tgz",
- "integrity": "sha512-wTzYulosJr/6nFnqGW7FrG3jfUUlEf8UjGA0/pyypJl42ExdVgC6xJgcXQ+V8QFn6niSG2Pb8+MIG1mZr2vczw==",
+ "version": "16.2.1",
+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.2.1.tgz",
+ "integrity": "sha512-BwZ8w8YTaSEr2HIuXLMLxIdElNMPvY9fLqb20LX9A9OMGtJilhHLbCL3ggyd0TwjmMcTxi0XXt+ur1vWUoxj2Q==",
"cpu": [
"arm64"
],
@@ -3792,9 +4066,9 @@
}
},
"node_modules/@next/swc-darwin-x64": {
- "version": "16.1.6",
- "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.1.6.tgz",
- "integrity": "sha512-BLFPYPDO+MNJsiDWbeVzqvYd4NyuRrEYVB5k2N3JfWncuHAy2IVwMAOlVQDFjj+krkWzhY2apvmekMkfQR0CUQ==",
+ "version": "16.2.1",
+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.2.1.tgz",
+ "integrity": "sha512-/vrcE6iQSJq3uL3VGVHiXeaKbn8Es10DGTGRJnRZlkNQQk3kaNtAJg8Y6xuAlrx/6INKVjkfi5rY0iEXorZ6uA==",
"cpu": [
"x64"
],
@@ -3808,12 +4082,15 @@
}
},
"node_modules/@next/swc-linux-arm64-gnu": {
- "version": "16.1.6",
- "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.1.6.tgz",
- "integrity": "sha512-OJYkCd5pj/QloBvoEcJ2XiMnlJkRv9idWA/j0ugSuA34gMT6f5b7vOiCQHVRpvStoZUknhl6/UxOXL4OwtdaBw==",
+ "version": "16.2.1",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.2.1.tgz",
+ "integrity": "sha512-uLn+0BK+C31LTVbQ/QU+UaVrV0rRSJQ8RfniQAHPghDdgE+SlroYqcmFnO5iNjNfVWCyKZHYrs3Nl0mUzWxbBw==",
"cpu": [
"arm64"
],
+ "libc": [
+ "glibc"
+ ],
"license": "MIT",
"optional": true,
"os": [
@@ -3824,12 +4101,15 @@
}
},
"node_modules/@next/swc-linux-arm64-musl": {
- "version": "16.1.6",
- "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.1.6.tgz",
- "integrity": "sha512-S4J2v+8tT3NIO9u2q+S0G5KdvNDjXfAv06OhfOzNDaBn5rw84DGXWndOEB7d5/x852A20sW1M56vhC/tRVbccQ==",
+ "version": "16.2.1",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.2.1.tgz",
+ "integrity": "sha512-ssKq6iMRnHdnycGp9hCuGnXJZ0YPr4/wNwrfE5DbmvEcgl9+yv97/Kq3TPVDfYome1SW5geciLB9aiEqKXQjlQ==",
"cpu": [
"arm64"
],
+ "libc": [
+ "musl"
+ ],
"license": "MIT",
"optional": true,
"os": [
@@ -3840,12 +4120,15 @@
}
},
"node_modules/@next/swc-linux-x64-gnu": {
- "version": "16.1.6",
- "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.1.6.tgz",
- "integrity": "sha512-2eEBDkFlMMNQnkTyPBhQOAyn2qMxyG2eE7GPH2WIDGEpEILcBPI/jdSv4t6xupSP+ot/jkfrCShLAa7+ZUPcJQ==",
+ "version": "16.2.1",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.2.1.tgz",
+ "integrity": "sha512-HQm7SrHRELJ30T1TSmT706IWovFFSRGxfgUkyWJZF/RKBMdbdRWJuFrcpDdE5vy9UXjFOx6L3mRdqH04Mmx0hg==",
"cpu": [
"x64"
],
+ "libc": [
+ "glibc"
+ ],
"license": "MIT",
"optional": true,
"os": [
@@ -3856,12 +4139,15 @@
}
},
"node_modules/@next/swc-linux-x64-musl": {
- "version": "16.1.6",
- "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.1.6.tgz",
- "integrity": "sha512-oicJwRlyOoZXVlxmIMaTq7f8pN9QNbdes0q2FXfRsPhfCi8n8JmOZJm5oo1pwDaFbnnD421rVU409M3evFbIqg==",
+ "version": "16.2.1",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.2.1.tgz",
+ "integrity": "sha512-aV2iUaC/5HGEpbBkE+4B8aHIudoOy5DYekAKOMSHoIYQ66y/wIVeaRx8MS2ZMdxe/HIXlMho4ubdZs/J8441Tg==",
"cpu": [
"x64"
],
+ "libc": [
+ "musl"
+ ],
"license": "MIT",
"optional": true,
"os": [
@@ -3872,9 +4158,9 @@
}
},
"node_modules/@next/swc-win32-arm64-msvc": {
- "version": "16.1.6",
- "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.1.6.tgz",
- "integrity": "sha512-gQmm8izDTPgs+DCWH22kcDmuUp7NyiJgEl18bcr8irXA5N2m2O+JQIr6f3ct42GOs9c0h8QF3L5SzIxcYAAXXw==",
+ "version": "16.2.1",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.2.1.tgz",
+ "integrity": "sha512-IXdNgiDHaSk0ZUJ+xp0OQTdTgnpx1RCfRTalhn3cjOP+IddTMINwA7DXZrwTmGDO8SUr5q2hdP/du4DcrB1GxA==",
"cpu": [
"arm64"
],
@@ -3888,9 +4174,9 @@
}
},
"node_modules/@next/swc-win32-x64-msvc": {
- "version": "16.1.6",
- "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.1.6.tgz",
- "integrity": "sha512-NRfO39AIrzBnixKbjuo2YiYhB6o9d8v/ymU9m/Xk8cyVk+k7XylniXkHwjs4s70wedVffc6bQNbufk5v0xEm0A==",
+ "version": "16.2.1",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.2.1.tgz",
+ "integrity": "sha512-qvU+3a39Hay+ieIztkGSbF7+mccbbg1Tk25hc4JDylf8IHjYmY/Zm64Qq1602yPyQqvie+vf5T/uPwNxDNIoeg==",
"cpu": [
"x64"
],
@@ -3903,6 +4189,18 @@
"node": ">= 10"
}
},
+ "node_modules/@noble/ciphers": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.3.0.tgz",
+ "integrity": "sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==",
+ "license": "MIT",
+ "engines": {
+ "node": "^14.21.3 || >=16"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
"node_modules/@noble/curves": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/@noble/curves/-/curves-2.0.1.tgz",
@@ -4124,369 +4422,121 @@
"react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
}
},
- "node_modules/@rollup/rollup-android-arm-eabi": {
- "version": "4.59.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.59.0.tgz",
- "integrity": "sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==",
- "cpu": [
- "arm"
- ],
- "dev": true,
+ "node_modules/@reduxjs/toolkit": {
+ "version": "2.11.2",
+ "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.11.2.tgz",
+ "integrity": "sha512-Kd6kAHTA6/nUpp8mySPqj3en3dm0tdMIgbttnQ1xFMVpufoj+ADi8pXLBsd4xzTRHQa7t/Jv8W5UnCuW4kuWMQ==",
"license": "MIT",
"optional": true,
- "os": [
- "android"
- ]
+ "dependencies": {
+ "@standard-schema/spec": "^1.0.0",
+ "@standard-schema/utils": "^0.3.0",
+ "immer": "^11.0.0",
+ "redux": "^5.0.1",
+ "redux-thunk": "^3.1.0",
+ "reselect": "^5.1.0"
+ },
+ "peerDependencies": {
+ "react": "^16.9.0 || ^17.0.0 || ^18 || ^19",
+ "react-redux": "^7.2.1 || ^8.1.3 || ^9.0.0"
+ },
+ "peerDependenciesMeta": {
+ "react": {
+ "optional": true
+ },
+ "react-redux": {
+ "optional": true
+ }
+ }
},
- "node_modules/@rollup/rollup-android-arm64": {
- "version": "4.59.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.59.0.tgz",
- "integrity": "sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==",
- "cpu": [
- "arm64"
- ],
+ "node_modules/@rtsao/scc": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz",
+ "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==",
"dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "android"
- ]
+ "license": "MIT"
},
- "node_modules/@rollup/rollup-darwin-arm64": {
- "version": "4.59.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.59.0.tgz",
- "integrity": "sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ]
+ "node_modules/@scarf/scarf": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/@scarf/scarf/-/scarf-1.4.0.tgz",
+ "integrity": "sha512-xxeapPiUXdZAE3che6f3xogoJPeZgig6omHEy1rIY5WVsB3H2BHNnZH+gHG6x91SCWyQCzWGsuL2Hh3ClO5/qQ==",
+ "hasInstallScript": true,
+ "license": "Apache-2.0"
},
- "node_modules/@rollup/rollup-darwin-x64": {
- "version": "4.59.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.59.0.tgz",
- "integrity": "sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==",
- "cpu": [
- "x64"
- ],
- "dev": true,
+ "node_modules/@scure/base": {
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.2.6.tgz",
+ "integrity": "sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg==",
"license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ]
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
},
- "node_modules/@rollup/rollup-freebsd-arm64": {
- "version": "4.59.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.59.0.tgz",
- "integrity": "sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
+ "node_modules/@scure/bip32": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.7.0.tgz",
+ "integrity": "sha512-E4FFX/N3f4B80AKWp5dP6ow+flD1LQZo/w8UnLGYZO674jS6YnYeepycOOksv+vLPSpgN35wgKgy+ybfTb2SMw==",
"license": "MIT",
- "optional": true,
- "os": [
- "freebsd"
- ]
+ "dependencies": {
+ "@noble/curves": "~1.9.0",
+ "@noble/hashes": "~1.8.0",
+ "@scure/base": "~1.2.5"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
},
- "node_modules/@rollup/rollup-freebsd-x64": {
- "version": "4.59.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.59.0.tgz",
- "integrity": "sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==",
- "cpu": [
- "x64"
- ],
- "dev": true,
+ "node_modules/@scure/bip32/node_modules/@noble/curves": {
+ "version": "1.9.7",
+ "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.7.tgz",
+ "integrity": "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==",
"license": "MIT",
- "optional": true,
- "os": [
- "freebsd"
- ]
+ "dependencies": {
+ "@noble/hashes": "1.8.0"
+ },
+ "engines": {
+ "node": "^14.21.3 || >=16"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
},
- "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
- "version": "4.59.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.59.0.tgz",
- "integrity": "sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==",
- "cpu": [
- "arm"
- ],
- "dev": true,
+ "node_modules/@scure/bip32/node_modules/@noble/hashes": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz",
+ "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==",
"license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
+ "engines": {
+ "node": "^14.21.3 || >=16"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
},
- "node_modules/@rollup/rollup-linux-arm-musleabihf": {
- "version": "4.59.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.59.0.tgz",
- "integrity": "sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-arm64-gnu": {
- "version": "4.59.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.59.0.tgz",
- "integrity": "sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-arm64-musl": {
- "version": "4.59.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.59.0.tgz",
- "integrity": "sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-loong64-gnu": {
- "version": "4.59.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.59.0.tgz",
- "integrity": "sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==",
- "cpu": [
- "loong64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-loong64-musl": {
- "version": "4.59.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.59.0.tgz",
- "integrity": "sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==",
- "cpu": [
- "loong64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-ppc64-gnu": {
- "version": "4.59.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.59.0.tgz",
- "integrity": "sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==",
- "cpu": [
- "ppc64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-ppc64-musl": {
- "version": "4.59.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.59.0.tgz",
- "integrity": "sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==",
- "cpu": [
- "ppc64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-riscv64-gnu": {
- "version": "4.59.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.59.0.tgz",
- "integrity": "sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==",
- "cpu": [
- "riscv64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-riscv64-musl": {
- "version": "4.59.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.59.0.tgz",
- "integrity": "sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==",
- "cpu": [
- "riscv64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-s390x-gnu": {
- "version": "4.59.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.59.0.tgz",
- "integrity": "sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==",
- "cpu": [
- "s390x"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-x64-gnu": {
- "version": "4.59.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.59.0.tgz",
- "integrity": "sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-x64-musl": {
- "version": "4.59.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.59.0.tgz",
- "integrity": "sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-openbsd-x64": {
- "version": "4.59.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.59.0.tgz",
- "integrity": "sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "openbsd"
- ]
- },
- "node_modules/@rollup/rollup-openharmony-arm64": {
- "version": "4.59.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.59.0.tgz",
- "integrity": "sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "openharmony"
- ]
- },
- "node_modules/@rollup/rollup-win32-arm64-msvc": {
- "version": "4.59.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.59.0.tgz",
- "integrity": "sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ]
- },
- "node_modules/@rollup/rollup-win32-ia32-msvc": {
- "version": "4.59.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.59.0.tgz",
- "integrity": "sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==",
- "cpu": [
- "ia32"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ]
- },
- "node_modules/@rollup/rollup-win32-x64-gnu": {
- "version": "4.59.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.59.0.tgz",
- "integrity": "sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==",
- "cpu": [
- "x64"
- ],
- "dev": true,
+ "node_modules/@scure/bip39": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.6.0.tgz",
+ "integrity": "sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A==",
"license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ]
+ "dependencies": {
+ "@noble/hashes": "~1.8.0",
+ "@scure/base": "~1.2.5"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
},
- "node_modules/@rollup/rollup-win32-x64-msvc": {
- "version": "4.59.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.59.0.tgz",
- "integrity": "sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==",
- "cpu": [
- "x64"
- ],
- "dev": true,
+ "node_modules/@scure/bip39/node_modules/@noble/hashes": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz",
+ "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==",
"license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ]
- },
- "node_modules/@rtsao/scc": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz",
- "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@scarf/scarf": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/@scarf/scarf/-/scarf-1.4.0.tgz",
- "integrity": "sha512-xxeapPiUXdZAE3che6f3xogoJPeZgig6omHEy1rIY5WVsB3H2BHNnZH+gHG6x91SCWyQCzWGsuL2Hh3ClO5/qQ==",
- "hasInstallScript": true,
- "license": "Apache-2.0"
+ "engines": {
+ "node": "^14.21.3 || >=16"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
},
"node_modules/@simplewebauthn/browser": {
"version": "13.2.2",
@@ -4534,6 +4584,20 @@
"integrity": "sha512-Uy0+khmZqUrUGm5dmMqVlnvufZRSK0FbYzVgp0UMstm+F5+W2/jnEEQyc9vo1ZR/E5ZI/B1WjjoTqBqwJL6Krw==",
"license": "MIT"
},
+ "node_modules/@standard-schema/spec": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz",
+ "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==",
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/@standard-schema/utils": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/@standard-schema/utils/-/utils-0.3.0.tgz",
+ "integrity": "sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==",
+ "license": "MIT",
+ "optional": true
+ },
"node_modules/@swc/helpers": {
"version": "0.5.17",
"resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.17.tgz",
@@ -4852,14 +4916,13 @@
}
},
"node_modules/@tokenizer/inflate": {
- "version": "0.2.7",
- "resolved": "https://registry.npmjs.org/@tokenizer/inflate/-/inflate-0.2.7.tgz",
- "integrity": "sha512-MADQgmZT1eKjp06jpI2yozxaU9uVs4GzzgSL+uEq7bVcJ9V1ZXQkeGNql1fsSI0gMy1vhvNTNbUqrx+pZfJVmg==",
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/@tokenizer/inflate/-/inflate-0.4.1.tgz",
+ "integrity": "sha512-2mAv+8pkG6GIZiF1kNg1jAjh27IDxEPKwdGul3snfztFerfPGI1LjDezZp3i7BElXompqEtPmoPx6c2wgtWsOA==",
"license": "MIT",
"dependencies": {
- "debug": "^4.4.0",
- "fflate": "^0.8.2",
- "token-types": "^6.0.0"
+ "debug": "^4.4.3",
+ "token-types": "^6.1.1"
},
"engines": {
"node": ">=18"
@@ -5044,16 +5107,6 @@
"@types/send": "*"
}
},
- "node_modules/@types/graceful-fs": {
- "version": "4.1.9",
- "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz",
- "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/node": "*"
- }
- },
"node_modules/@types/http-errors": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz",
@@ -5533,9 +5586,9 @@
}
},
"node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
- "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz",
+ "integrity": "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -6064,10 +6117,6 @@
"dev": true,
"license": "Apache-2.0"
},
- "node_modules/@yaaa/sdk": {
- "resolved": "sdk",
- "link": true
- },
"node_modules/aastar": {
"resolved": "aastar",
"link": true
@@ -6076,6 +6125,27 @@
"resolved": "aastar-frontend",
"link": true
},
+ "node_modules/abitype": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/abitype/-/abitype-1.2.3.tgz",
+ "integrity": "sha512-Ofer5QUnuUdTFsBRwARMoWKOH1ND5ehwYhJ3OJ/BQO+StkwQjHw0XyVh4vDttzHB7QOFhPHa/o413PJ82gU/Tg==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/wevm"
+ },
+ "peerDependencies": {
+ "typescript": ">=5.0.4",
+ "zod": "^3.22.0 || ^4.0.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ },
+ "zod": {
+ "optional": true
+ }
+ }
+ },
"node_modules/accepts": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz",
@@ -6090,9 +6160,9 @@
}
},
"node_modules/acorn": {
- "version": "8.15.0",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz",
- "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
+ "version": "8.16.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz",
+ "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==",
"devOptional": true,
"license": "MIT",
"bin": {
@@ -6273,13 +6343,6 @@
"node": ">=14"
}
},
- "node_modules/any-promise": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
- "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/anymatch": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
@@ -6295,9 +6358,9 @@
}
},
"node_modules/anymatch/node_modules/picomatch": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
- "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz",
+ "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==",
"dev": true,
"license": "MIT",
"engines": {
@@ -6582,14 +6645,23 @@
}
},
"node_modules/axios": {
- "version": "1.13.6",
- "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.6.tgz",
- "integrity": "sha512-ChTCHMouEe2kn713WHbQGcuYrr6fXTBiu460OTwWrWob16g1bXn4vtz07Ope7ewMozJAnEquLk5lWQWtBig9DQ==",
+ "version": "1.14.0",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.14.0.tgz",
+ "integrity": "sha512-3Y8yrqLSwjuzpXuZ0oIYZ/XGgLwUIBU3uLvbcpb0pidD9ctpShJd43KSlEEkVQg6DS0G9NKyzOvBfUtDKEyHvQ==",
"license": "MIT",
"dependencies": {
"follow-redirects": "^1.15.11",
"form-data": "^4.0.5",
- "proxy-from-env": "^1.1.0"
+ "proxy-from-env": "^2.1.0"
+ }
+ },
+ "node_modules/axios/node_modules/proxy-from-env": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz",
+ "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
}
},
"node_modules/axobject-query": {
@@ -6737,12 +6809,15 @@
}
},
"node_modules/baseline-browser-mapping": {
- "version": "2.9.11",
- "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.11.tgz",
- "integrity": "sha512-Sg0xJUNDU1sJNGdfGWhVHX0kkZ+HWcvmVymJbj6NSgZZmW/8S9Y2HQ5euytnIgakgxN6papOAWiwDo1ctFDcoQ==",
+ "version": "2.10.12",
+ "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.12.tgz",
+ "integrity": "sha512-qyq26DxfY4awP2gIRXhhLWfwzwI+N5Nxk6iQi8EFizIaWIjqicQTE4sLnZZVdeKPRcVNoJOkkpfzoIYuvCKaIQ==",
"license": "Apache-2.0",
"bin": {
- "baseline-browser-mapping": "dist/cli.js"
+ "baseline-browser-mapping": "dist/cli.cjs"
+ },
+ "engines": {
+ "node": ">=6.0.0"
}
},
"node_modules/bcrypt": {
@@ -6759,6 +6834,16 @@
"node": ">= 18"
}
},
+ "node_modules/bignumber.js": {
+ "version": "9.3.1",
+ "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz",
+ "integrity": "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==",
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": "*"
+ }
+ },
"node_modules/binary-extensions": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
@@ -6784,6 +6869,13 @@
"readable-stream": "^3.4.0"
}
},
+ "node_modules/bn.js": {
+ "version": "5.2.3",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.3.tgz",
+ "integrity": "sha512-EAcmnPkxpntVL+DS7bO1zhcZNvCkxqtkd0ZY53h06GNQ3DEkkGZ/gKgmDv6DdZQGj9BgfSPKtJJ7Dp1GPP8f7w==",
+ "license": "MIT",
+ "optional": true
+ },
"node_modules/body-parser": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.1.tgz",
@@ -6809,9 +6901,9 @@
}
},
"node_modules/brace-expansion": {
- "version": "1.1.12",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
- "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
+ "version": "1.1.13",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz",
+ "integrity": "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -6832,6 +6924,13 @@
"node": ">=8"
}
},
+ "node_modules/brorand": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
+ "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==",
+ "license": "MIT",
+ "optional": true
+ },
"node_modules/browserslist": {
"version": "4.28.1",
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz",
@@ -6926,22 +7025,6 @@
"integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
"license": "MIT"
},
- "node_modules/bundle-require": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/bundle-require/-/bundle-require-5.1.0.tgz",
- "integrity": "sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "load-tsconfig": "^0.2.3"
- },
- "engines": {
- "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
- },
- "peerDependencies": {
- "esbuild": ">=0.18"
- }
- },
"node_modules/busboy": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz",
@@ -6962,16 +7045,6 @@
"node": ">= 0.8"
}
},
- "node_modules/cac": {
- "version": "6.7.14",
- "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz",
- "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/call-bind": {
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz",
@@ -7383,13 +7456,6 @@
"typedarray": "^0.0.6"
}
},
- "node_modules/confbox": {
- "version": "0.1.8",
- "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz",
- "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/consola": {
"version": "3.4.2",
"resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz",
@@ -7496,1015 +7562,602 @@
}
}
},
- "node_modules/create-jest": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz",
- "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==",
- "dev": true,
+ "node_modules/create-require": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz",
+ "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==",
+ "devOptional": true,
+ "license": "MIT"
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
"license": "MIT",
"dependencies": {
- "@jest/types": "^29.6.3",
- "chalk": "^4.0.0",
- "exit": "^0.1.2",
- "graceful-fs": "^4.2.9",
- "jest-config": "^29.7.0",
- "jest-util": "^29.7.0",
- "prompts": "^2.0.1"
- },
- "bin": {
- "create-jest": "bin/create-jest.js"
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
},
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": ">= 8"
}
},
- "node_modules/create-jest/node_modules/@jest/console": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz",
- "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==",
- "dev": true,
+ "node_modules/crypto-js": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz",
+ "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==",
"license": "MIT",
- "dependencies": {
- "@jest/types": "^29.6.3",
- "@types/node": "*",
- "chalk": "^4.0.0",
- "jest-message-util": "^29.7.0",
- "jest-util": "^29.7.0",
- "slash": "^3.0.0"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
+ "optional": true
+ },
+ "node_modules/csstype": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
+ "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
+ "license": "MIT"
+ },
+ "node_modules/damerau-levenshtein": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz",
+ "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==",
+ "dev": true,
+ "license": "BSD-2-Clause"
},
- "node_modules/create-jest/node_modules/@jest/environment": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz",
- "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==",
+ "node_modules/data-view-buffer": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz",
+ "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@jest/fake-timers": "^29.7.0",
- "@jest/types": "^29.6.3",
- "@types/node": "*",
- "jest-mock": "^29.7.0"
+ "call-bound": "^1.0.3",
+ "es-errors": "^1.3.0",
+ "is-data-view": "^1.0.2"
},
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/create-jest/node_modules/@jest/expect": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz",
- "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==",
+ "node_modules/data-view-byte-length": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz",
+ "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "expect": "^29.7.0",
- "jest-snapshot": "^29.7.0"
+ "call-bound": "^1.0.3",
+ "es-errors": "^1.3.0",
+ "is-data-view": "^1.0.2"
},
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/inspect-js"
}
},
- "node_modules/create-jest/node_modules/@jest/expect-utils": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz",
- "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==",
+ "node_modules/data-view-byte-offset": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz",
+ "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "jest-get-type": "^29.6.3"
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "is-data-view": "^1.0.1"
},
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/create-jest/node_modules/@jest/fake-timers": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz",
- "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==",
- "dev": true,
+ "node_modules/dayjs": {
+ "version": "1.11.18",
+ "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.18.tgz",
+ "integrity": "sha512-zFBQ7WFRvVRhKcWoUh+ZA1g2HVgUbsZm9sbddh8EC5iv93sui8DVVz1Npvz+r6meo9VKfa8NyLWBsQK1VvIKPA==",
+ "license": "MIT"
+ },
+ "node_modules/debug": {
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
"license": "MIT",
"dependencies": {
- "@jest/types": "^29.6.3",
- "@sinonjs/fake-timers": "^10.0.2",
- "@types/node": "*",
- "jest-message-util": "^29.7.0",
- "jest-mock": "^29.7.0",
- "jest-util": "^29.7.0"
+ "ms": "^2.1.3"
},
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
}
},
- "node_modules/create-jest/node_modules/@jest/globals": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz",
- "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==",
- "dev": true,
+ "node_modules/dedent": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.0.tgz",
+ "integrity": "sha512-HGFtf8yhuhGhqO07SV79tRp+br4MnbdjeVxotpn1QBl30pcLLCQjX5b2295ll0fv8RKDKsmWYrl05usHM9CewQ==",
"license": "MIT",
- "dependencies": {
- "@jest/environment": "^29.7.0",
- "@jest/expect": "^29.7.0",
- "@jest/types": "^29.6.3",
- "jest-mock": "^29.7.0"
+ "peerDependencies": {
+ "babel-plugin-macros": "^3.1.0"
},
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "peerDependenciesMeta": {
+ "babel-plugin-macros": {
+ "optional": true
+ }
}
},
- "node_modules/create-jest/node_modules/@jest/schemas": {
- "version": "29.6.3",
- "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz",
- "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==",
+ "node_modules/deep-is": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/deepmerge": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
+ "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "@sinclair/typebox": "^0.27.8"
- },
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": ">=0.10.0"
}
},
- "node_modules/create-jest/node_modules/@jest/source-map": {
- "version": "29.6.3",
- "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz",
- "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==",
+ "node_modules/defaults": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz",
+ "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@jridgewell/trace-mapping": "^0.3.18",
- "callsites": "^3.0.0",
- "graceful-fs": "^4.2.9"
+ "clone": "^1.0.2"
},
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/create-jest/node_modules/@jest/test-result": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz",
- "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==",
- "dev": true,
+ "node_modules/define-data-property": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
+ "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
"license": "MIT",
"dependencies": {
- "@jest/console": "^29.7.0",
- "@jest/types": "^29.6.3",
- "@types/istanbul-lib-coverage": "^2.0.0",
- "collect-v8-coverage": "^1.0.0"
+ "es-define-property": "^1.0.0",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.0.1"
},
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/create-jest/node_modules/@jest/test-sequencer": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz",
- "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==",
+ "node_modules/define-properties": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz",
+ "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@jest/test-result": "^29.7.0",
- "graceful-fs": "^4.2.9",
- "jest-haste-map": "^29.7.0",
- "slash": "^3.0.0"
+ "define-data-property": "^1.0.1",
+ "has-property-descriptors": "^1.0.0",
+ "object-keys": "^1.1.1"
},
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/create-jest/node_modules/@jest/transform": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz",
- "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==",
- "dev": true,
+ "node_modules/delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
"license": "MIT",
- "dependencies": {
- "@babel/core": "^7.11.6",
- "@jest/types": "^29.6.3",
- "@jridgewell/trace-mapping": "^0.3.18",
- "babel-plugin-istanbul": "^6.1.1",
- "chalk": "^4.0.0",
- "convert-source-map": "^2.0.0",
- "fast-json-stable-stringify": "^2.1.0",
- "graceful-fs": "^4.2.9",
- "jest-haste-map": "^29.7.0",
- "jest-regex-util": "^29.6.3",
- "jest-util": "^29.7.0",
- "micromatch": "^4.0.4",
- "pirates": "^4.0.4",
- "slash": "^3.0.0",
- "write-file-atomic": "^4.0.2"
- },
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": ">=0.4.0"
}
},
- "node_modules/create-jest/node_modules/@jest/types": {
- "version": "29.6.3",
- "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz",
- "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==",
- "dev": true,
+ "node_modules/depd": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
+ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
"license": "MIT",
- "dependencies": {
- "@jest/schemas": "^29.6.3",
- "@types/istanbul-lib-coverage": "^2.0.0",
- "@types/istanbul-reports": "^3.0.0",
- "@types/node": "*",
- "@types/yargs": "^17.0.8",
- "chalk": "^4.0.0"
- },
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": ">= 0.8"
}
},
- "node_modules/create-jest/node_modules/@sinclair/typebox": {
- "version": "0.27.8",
- "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz",
- "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/create-jest/node_modules/@sinonjs/fake-timers": {
- "version": "10.3.0",
- "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz",
- "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==",
- "dev": true,
- "license": "BSD-3-Clause",
- "dependencies": {
- "@sinonjs/commons": "^3.0.0"
+ "node_modules/detect-libc": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
+ "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
+ "devOptional": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=8"
}
},
- "node_modules/create-jest/node_modules/babel-jest": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz",
- "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==",
+ "node_modules/detect-newline": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz",
+ "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "@jest/transform": "^29.7.0",
- "@types/babel__core": "^7.1.14",
- "babel-plugin-istanbul": "^6.1.1",
- "babel-preset-jest": "^29.6.3",
- "chalk": "^4.0.0",
- "graceful-fs": "^4.2.9",
- "slash": "^3.0.0"
- },
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.8.0"
+ "node": ">=8"
}
},
- "node_modules/create-jest/node_modules/babel-plugin-istanbul": {
- "version": "6.1.1",
- "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz",
- "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==",
- "dev": true,
+ "node_modules/diff": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.4.tgz",
+ "integrity": "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==",
+ "devOptional": true,
"license": "BSD-3-Clause",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.0.0",
- "@istanbuljs/load-nyc-config": "^1.0.0",
- "@istanbuljs/schema": "^0.1.2",
- "istanbul-lib-instrument": "^5.0.4",
- "test-exclude": "^6.0.0"
- },
"engines": {
- "node": ">=8"
+ "node": ">=0.3.1"
}
},
- "node_modules/create-jest/node_modules/babel-plugin-jest-hoist": {
- "version": "29.6.3",
- "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz",
- "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==",
+ "node_modules/doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
"dev": true,
- "license": "MIT",
+ "license": "Apache-2.0",
"dependencies": {
- "@babel/template": "^7.3.3",
- "@babel/types": "^7.3.3",
- "@types/babel__core": "^7.1.14",
- "@types/babel__traverse": "^7.0.6"
+ "esutils": "^2.0.2"
},
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": ">=0.10.0"
}
},
- "node_modules/create-jest/node_modules/babel-preset-jest": {
- "version": "29.6.3",
- "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz",
- "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "babel-plugin-jest-hoist": "^29.6.3",
- "babel-preset-current-node-syntax": "^1.0.0"
- },
+ "node_modules/dotenv": {
+ "version": "17.2.3",
+ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.2.3.tgz",
+ "integrity": "sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==",
+ "license": "BSD-2-Clause",
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0"
- }
- },
- "node_modules/create-jest/node_modules/camelcase": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
- "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=10"
+ "node": ">=12"
},
"funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/create-jest/node_modules/ci-info": {
- "version": "3.9.0",
- "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
- "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/sibiraj-s"
- }
- ],
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/create-jest/node_modules/cjs-module-lexer": {
- "version": "1.4.3",
- "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz",
- "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/create-jest/node_modules/expect": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz",
- "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jest/expect-utils": "^29.7.0",
- "jest-get-type": "^29.6.3",
- "jest-matcher-utils": "^29.7.0",
- "jest-message-util": "^29.7.0",
- "jest-util": "^29.7.0"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "url": "https://dotenvx.com"
}
},
- "node_modules/create-jest/node_modules/glob": {
- "version": "7.2.3",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
- "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
- "deprecated": "Glob versions prior to v9 are no longer supported",
- "dev": true,
- "license": "ISC",
+ "node_modules/dotenv-expand": {
+ "version": "12.0.3",
+ "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-12.0.3.tgz",
+ "integrity": "sha512-uc47g4b+4k/M/SeaW1y4OApx+mtLWl92l5LMPP0GNXctZqELk+YGgOPIIC5elYmUH4OuoK3JLhuRUYegeySiFA==",
+ "license": "BSD-2-Clause",
"dependencies": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.1.1",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
+ "dotenv": "^16.4.5"
},
"engines": {
- "node": "*"
+ "node": ">=12"
},
"funding": {
- "url": "https://github.com/sponsors/isaacs"
+ "url": "https://dotenvx.com"
}
},
- "node_modules/create-jest/node_modules/istanbul-lib-instrument": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz",
- "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==",
- "dev": true,
- "license": "BSD-3-Clause",
- "dependencies": {
- "@babel/core": "^7.12.3",
- "@babel/parser": "^7.14.7",
- "@istanbuljs/schema": "^0.1.2",
- "istanbul-lib-coverage": "^3.2.0",
- "semver": "^6.3.0"
- },
+ "node_modules/dotenv-expand/node_modules/dotenv": {
+ "version": "16.6.1",
+ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz",
+ "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==",
+ "license": "BSD-2-Clause",
"engines": {
- "node": ">=8"
- }
- },
- "node_modules/create-jest/node_modules/jest-circus": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz",
- "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jest/environment": "^29.7.0",
- "@jest/expect": "^29.7.0",
- "@jest/test-result": "^29.7.0",
- "@jest/types": "^29.6.3",
- "@types/node": "*",
- "chalk": "^4.0.0",
- "co": "^4.6.0",
- "dedent": "^1.0.0",
- "is-generator-fn": "^2.0.0",
- "jest-each": "^29.7.0",
- "jest-matcher-utils": "^29.7.0",
- "jest-message-util": "^29.7.0",
- "jest-runtime": "^29.7.0",
- "jest-snapshot": "^29.7.0",
- "jest-util": "^29.7.0",
- "p-limit": "^3.1.0",
- "pretty-format": "^29.7.0",
- "pure-rand": "^6.0.0",
- "slash": "^3.0.0",
- "stack-utils": "^2.0.3"
+ "node": ">=12"
},
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "funding": {
+ "url": "https://dotenvx.com"
}
},
- "node_modules/create-jest/node_modules/jest-config": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz",
- "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==",
- "dev": true,
+ "node_modules/dunder-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
+ "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
"license": "MIT",
"dependencies": {
- "@babel/core": "^7.11.6",
- "@jest/test-sequencer": "^29.7.0",
- "@jest/types": "^29.6.3",
- "babel-jest": "^29.7.0",
- "chalk": "^4.0.0",
- "ci-info": "^3.2.0",
- "deepmerge": "^4.2.2",
- "glob": "^7.1.3",
- "graceful-fs": "^4.2.9",
- "jest-circus": "^29.7.0",
- "jest-environment-node": "^29.7.0",
- "jest-get-type": "^29.6.3",
- "jest-regex-util": "^29.6.3",
- "jest-resolve": "^29.7.0",
- "jest-runner": "^29.7.0",
- "jest-util": "^29.7.0",
- "jest-validate": "^29.7.0",
- "micromatch": "^4.0.4",
- "parse-json": "^5.2.0",
- "pretty-format": "^29.7.0",
- "slash": "^3.0.0",
- "strip-json-comments": "^3.1.1"
+ "call-bind-apply-helpers": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.2.0"
},
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- },
- "peerDependencies": {
- "@types/node": "*",
- "ts-node": ">=9.0.0"
- },
- "peerDependenciesMeta": {
- "@types/node": {
- "optional": true
- },
- "ts-node": {
- "optional": true
- }
+ "node": ">= 0.4"
}
},
- "node_modules/create-jest/node_modules/jest-diff": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz",
- "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "chalk": "^4.0.0",
- "diff-sequences": "^29.6.3",
- "jest-get-type": "^29.6.3",
- "pretty-format": "^29.7.0"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
+ "node_modules/eastasianwidth": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
+ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
+ "license": "MIT"
},
- "node_modules/create-jest/node_modules/jest-docblock": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz",
- "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==",
- "dev": true,
- "license": "MIT",
+ "node_modules/ecdsa-sig-formatter": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
+ "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==",
+ "license": "Apache-2.0",
"dependencies": {
- "detect-newline": "^3.0.0"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "safe-buffer": "^5.0.1"
}
},
- "node_modules/create-jest/node_modules/jest-each": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz",
- "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jest/types": "^29.6.3",
- "chalk": "^4.0.0",
- "jest-get-type": "^29.6.3",
- "jest-util": "^29.7.0",
- "pretty-format": "^29.7.0"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
+ "node_modules/ee-first": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
+ "license": "MIT"
},
- "node_modules/create-jest/node_modules/jest-environment-node": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz",
- "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==",
- "dev": true,
+ "node_modules/eip55": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/eip55/-/eip55-2.1.1.tgz",
+ "integrity": "sha512-WcagVAmNu2Ww2cDUfzuWVntYwFxbvZ5MvIyLZpMjTTkjD6sCvkGOiS86jTppzu9/gWsc8isLHAeMBWK02OnZmA==",
"license": "MIT",
+ "optional": true,
"dependencies": {
- "@jest/environment": "^29.7.0",
- "@jest/fake-timers": "^29.7.0",
- "@jest/types": "^29.6.3",
- "@types/node": "*",
- "jest-mock": "^29.7.0",
- "jest-util": "^29.7.0"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "keccak": "^3.0.3"
}
},
- "node_modules/create-jest/node_modules/jest-haste-map": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz",
- "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==",
+ "node_modules/electron-to-chromium": {
+ "version": "1.5.302",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.302.tgz",
+ "integrity": "sha512-sM6HAN2LyK82IyPBpznDRqlTQAtuSaO+ShzFiWTvoMJLHyZ+Y39r8VMfHzwbU8MVBzQ4Wdn85+wlZl2TLGIlwg==",
"dev": true,
- "license": "MIT",
- "dependencies": {
- "@jest/types": "^29.6.3",
- "@types/graceful-fs": "^4.1.3",
- "@types/node": "*",
- "anymatch": "^3.0.3",
- "fb-watchman": "^2.0.0",
- "graceful-fs": "^4.2.9",
- "jest-regex-util": "^29.6.3",
- "jest-util": "^29.7.0",
- "jest-worker": "^29.7.0",
- "micromatch": "^4.0.4",
- "walker": "^1.0.8"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- },
- "optionalDependencies": {
- "fsevents": "^2.3.2"
- }
+ "license": "ISC"
},
- "node_modules/create-jest/node_modules/jest-leak-detector": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz",
- "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==",
- "dev": true,
+ "node_modules/elliptic": {
+ "version": "6.6.1",
+ "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.1.tgz",
+ "integrity": "sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==",
"license": "MIT",
+ "optional": true,
"dependencies": {
- "jest-get-type": "^29.6.3",
- "pretty-format": "^29.7.0"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "bn.js": "^4.11.9",
+ "brorand": "^1.1.0",
+ "hash.js": "^1.0.0",
+ "hmac-drbg": "^1.0.1",
+ "inherits": "^2.0.4",
+ "minimalistic-assert": "^1.0.1",
+ "minimalistic-crypto-utils": "^1.0.1"
}
},
- "node_modules/create-jest/node_modules/jest-matcher-utils": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz",
- "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==",
- "dev": true,
+ "node_modules/elliptic/node_modules/bn.js": {
+ "version": "4.12.3",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.3.tgz",
+ "integrity": "sha512-fGTi3gxV/23FTYdAoUtLYp6qySe2KE3teyZitipKNRuVYcBkoP/bB3guXN/XVKUe9mxCHXnc9C4ocyz8OmgN0g==",
"license": "MIT",
- "dependencies": {
- "chalk": "^4.0.0",
- "jest-diff": "^29.7.0",
- "jest-get-type": "^29.6.3",
- "pretty-format": "^29.7.0"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
+ "optional": true
},
- "node_modules/create-jest/node_modules/jest-message-util": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz",
- "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==",
+ "node_modules/emittery": {
+ "version": "0.13.1",
+ "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz",
+ "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "@babel/code-frame": "^7.12.13",
- "@jest/types": "^29.6.3",
- "@types/stack-utils": "^2.0.0",
- "chalk": "^4.0.0",
- "graceful-fs": "^4.2.9",
- "micromatch": "^4.0.4",
- "pretty-format": "^29.7.0",
- "slash": "^3.0.0",
- "stack-utils": "^2.0.3"
- },
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/create-jest/node_modules/jest-mock": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz",
- "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jest/types": "^29.6.3",
- "@types/node": "*",
- "jest-util": "^29.7.0"
+ "node": ">=12"
},
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "funding": {
+ "url": "https://github.com/sindresorhus/emittery?sponsor=1"
}
},
- "node_modules/create-jest/node_modules/jest-regex-util": {
- "version": "29.6.3",
- "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz",
- "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
+ "node_modules/emoji-regex": {
+ "version": "9.2.2",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+ "license": "MIT"
},
- "node_modules/create-jest/node_modules/jest-resolve": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz",
- "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==",
- "dev": true,
+ "node_modules/encodeurl": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
+ "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
"license": "MIT",
- "dependencies": {
- "chalk": "^4.0.0",
- "graceful-fs": "^4.2.9",
- "jest-haste-map": "^29.7.0",
- "jest-pnp-resolver": "^1.2.2",
- "jest-util": "^29.7.0",
- "jest-validate": "^29.7.0",
- "resolve": "^1.20.0",
- "resolve.exports": "^2.0.0",
- "slash": "^3.0.0"
- },
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": ">= 0.8"
}
},
- "node_modules/create-jest/node_modules/jest-runner": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz",
- "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==",
+ "node_modules/enhanced-resolve": {
+ "version": "5.18.3",
+ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz",
+ "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@jest/console": "^29.7.0",
- "@jest/environment": "^29.7.0",
- "@jest/test-result": "^29.7.0",
- "@jest/transform": "^29.7.0",
- "@jest/types": "^29.6.3",
- "@types/node": "*",
- "chalk": "^4.0.0",
- "emittery": "^0.13.1",
- "graceful-fs": "^4.2.9",
- "jest-docblock": "^29.7.0",
- "jest-environment-node": "^29.7.0",
- "jest-haste-map": "^29.7.0",
- "jest-leak-detector": "^29.7.0",
- "jest-message-util": "^29.7.0",
- "jest-resolve": "^29.7.0",
- "jest-runtime": "^29.7.0",
- "jest-util": "^29.7.0",
- "jest-watcher": "^29.7.0",
- "jest-worker": "^29.7.0",
- "p-limit": "^3.1.0",
- "source-map-support": "0.5.13"
+ "graceful-fs": "^4.2.4",
+ "tapable": "^2.2.0"
},
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": ">=10.13.0"
}
},
- "node_modules/create-jest/node_modules/jest-runtime": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz",
- "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==",
+ "node_modules/error-ex": {
+ "version": "1.3.4",
+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz",
+ "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@jest/environment": "^29.7.0",
- "@jest/fake-timers": "^29.7.0",
- "@jest/globals": "^29.7.0",
- "@jest/source-map": "^29.6.3",
- "@jest/test-result": "^29.7.0",
- "@jest/transform": "^29.7.0",
- "@jest/types": "^29.6.3",
- "@types/node": "*",
- "chalk": "^4.0.0",
- "cjs-module-lexer": "^1.0.0",
- "collect-v8-coverage": "^1.0.0",
- "glob": "^7.1.3",
- "graceful-fs": "^4.2.9",
- "jest-haste-map": "^29.7.0",
- "jest-message-util": "^29.7.0",
- "jest-mock": "^29.7.0",
- "jest-regex-util": "^29.6.3",
- "jest-resolve": "^29.7.0",
- "jest-snapshot": "^29.7.0",
- "jest-util": "^29.7.0",
- "slash": "^3.0.0",
- "strip-bom": "^4.0.0"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "is-arrayish": "^0.2.1"
}
},
- "node_modules/create-jest/node_modules/jest-snapshot": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz",
- "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==",
+ "node_modules/es-abstract": {
+ "version": "1.24.0",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz",
+ "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/core": "^7.11.6",
- "@babel/generator": "^7.7.2",
- "@babel/plugin-syntax-jsx": "^7.7.2",
- "@babel/plugin-syntax-typescript": "^7.7.2",
- "@babel/types": "^7.3.3",
- "@jest/expect-utils": "^29.7.0",
- "@jest/transform": "^29.7.0",
- "@jest/types": "^29.6.3",
- "babel-preset-current-node-syntax": "^1.0.0",
- "chalk": "^4.0.0",
- "expect": "^29.7.0",
- "graceful-fs": "^4.2.9",
- "jest-diff": "^29.7.0",
- "jest-get-type": "^29.6.3",
- "jest-matcher-utils": "^29.7.0",
- "jest-message-util": "^29.7.0",
- "jest-util": "^29.7.0",
- "natural-compare": "^1.4.0",
- "pretty-format": "^29.7.0",
- "semver": "^7.5.3"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/create-jest/node_modules/jest-snapshot/node_modules/semver": {
- "version": "7.7.3",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
- "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
- "dev": true,
- "license": "ISC",
- "bin": {
- "semver": "bin/semver.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/create-jest/node_modules/jest-util": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz",
- "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jest/types": "^29.6.3",
- "@types/node": "*",
- "chalk": "^4.0.0",
- "ci-info": "^3.2.0",
- "graceful-fs": "^4.2.9",
- "picomatch": "^2.2.3"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/create-jest/node_modules/jest-validate": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz",
- "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jest/types": "^29.6.3",
- "camelcase": "^6.2.0",
- "chalk": "^4.0.0",
- "jest-get-type": "^29.6.3",
- "leven": "^3.1.0",
- "pretty-format": "^29.7.0"
+ "array-buffer-byte-length": "^1.0.2",
+ "arraybuffer.prototype.slice": "^1.0.4",
+ "available-typed-arrays": "^1.0.7",
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.4",
+ "data-view-buffer": "^1.0.2",
+ "data-view-byte-length": "^1.0.2",
+ "data-view-byte-offset": "^1.0.1",
+ "es-define-property": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.1.1",
+ "es-set-tostringtag": "^2.1.0",
+ "es-to-primitive": "^1.3.0",
+ "function.prototype.name": "^1.1.8",
+ "get-intrinsic": "^1.3.0",
+ "get-proto": "^1.0.1",
+ "get-symbol-description": "^1.1.0",
+ "globalthis": "^1.0.4",
+ "gopd": "^1.2.0",
+ "has-property-descriptors": "^1.0.2",
+ "has-proto": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "hasown": "^2.0.2",
+ "internal-slot": "^1.1.0",
+ "is-array-buffer": "^3.0.5",
+ "is-callable": "^1.2.7",
+ "is-data-view": "^1.0.2",
+ "is-negative-zero": "^2.0.3",
+ "is-regex": "^1.2.1",
+ "is-set": "^2.0.3",
+ "is-shared-array-buffer": "^1.0.4",
+ "is-string": "^1.1.1",
+ "is-typed-array": "^1.1.15",
+ "is-weakref": "^1.1.1",
+ "math-intrinsics": "^1.1.0",
+ "object-inspect": "^1.13.4",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.7",
+ "own-keys": "^1.0.1",
+ "regexp.prototype.flags": "^1.5.4",
+ "safe-array-concat": "^1.1.3",
+ "safe-push-apply": "^1.0.0",
+ "safe-regex-test": "^1.1.0",
+ "set-proto": "^1.0.0",
+ "stop-iteration-iterator": "^1.1.0",
+ "string.prototype.trim": "^1.2.10",
+ "string.prototype.trimend": "^1.0.9",
+ "string.prototype.trimstart": "^1.0.8",
+ "typed-array-buffer": "^1.0.3",
+ "typed-array-byte-length": "^1.0.3",
+ "typed-array-byte-offset": "^1.0.4",
+ "typed-array-length": "^1.0.7",
+ "unbox-primitive": "^1.1.0",
+ "which-typed-array": "^1.1.19"
},
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/create-jest/node_modules/jest-watcher": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz",
- "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jest/test-result": "^29.7.0",
- "@jest/types": "^29.6.3",
- "@types/node": "*",
- "ansi-escapes": "^4.2.1",
- "chalk": "^4.0.0",
- "emittery": "^0.13.1",
- "jest-util": "^29.7.0",
- "string-length": "^4.0.1"
+ "node": ">= 0.4"
},
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/create-jest/node_modules/jest-worker": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz",
- "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==",
- "dev": true,
+ "node_modules/es-define-property": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
+ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
"license": "MIT",
- "dependencies": {
- "@types/node": "*",
- "jest-util": "^29.7.0",
- "merge-stream": "^2.0.0",
- "supports-color": "^8.0.0"
- },
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": ">= 0.4"
}
},
- "node_modules/create-jest/node_modules/picomatch": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
- "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
- "dev": true,
+ "node_modules/es-errors": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
"license": "MIT",
"engines": {
- "node": ">=8.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
- }
- },
- "node_modules/create-jest/node_modules/pure-rand": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz",
- "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://github.com/sponsors/dubzzz"
- },
- {
- "type": "opencollective",
- "url": "https://opencollective.com/fast-check"
- }
- ],
- "license": "MIT"
- },
- "node_modules/create-jest/node_modules/semver": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
- "dev": true,
- "license": "ISC",
- "bin": {
- "semver": "bin/semver.js"
+ "node": ">= 0.4"
}
},
- "node_modules/create-jest/node_modules/signal-exit": {
- "version": "3.0.7",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
- "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/create-jest/node_modules/supports-color": {
- "version": "8.1.1",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
- "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+ "node_modules/es-iterator-helpers": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz",
+ "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==",
"dev": true,
"license": "MIT",
"dependencies": {
- "has-flag": "^4.0.0"
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.6",
+ "es-errors": "^1.3.0",
+ "es-set-tostringtag": "^2.0.3",
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.2.6",
+ "globalthis": "^1.0.4",
+ "gopd": "^1.2.0",
+ "has-property-descriptors": "^1.0.2",
+ "has-proto": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "internal-slot": "^1.1.0",
+ "iterator.prototype": "^1.1.4",
+ "safe-array-concat": "^1.1.3"
},
"engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/supports-color?sponsor=1"
+ "node": ">= 0.4"
}
},
- "node_modules/create-jest/node_modules/write-file-atomic": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz",
- "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==",
+ "node_modules/es-module-lexer": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.0.0.tgz",
+ "integrity": "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==",
"dev": true,
- "license": "ISC",
- "dependencies": {
- "imurmurhash": "^0.1.4",
- "signal-exit": "^3.0.7"
- },
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
- }
- },
- "node_modules/create-require": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz",
- "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==",
- "devOptional": true,
"license": "MIT"
},
- "node_modules/cross-spawn": {
- "version": "7.0.6",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
- "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
+ "node_modules/es-object-atoms": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
+ "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
"license": "MIT",
"dependencies": {
- "path-key": "^3.1.0",
- "shebang-command": "^2.0.0",
- "which": "^2.0.1"
+ "es-errors": "^1.3.0"
},
"engines": {
- "node": ">= 8"
+ "node": ">= 0.4"
}
},
- "node_modules/csstype": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
- "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
- "license": "MIT"
- },
- "node_modules/damerau-levenshtein": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz",
- "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==",
- "dev": true,
- "license": "BSD-2-Clause"
- },
- "node_modules/data-view-buffer": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz",
- "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==",
- "dev": true,
+ "node_modules/es-set-tostringtag": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
+ "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
"license": "MIT",
"dependencies": {
- "call-bound": "^1.0.3",
"es-errors": "^1.3.0",
- "is-data-view": "^1.0.2"
+ "get-intrinsic": "^1.2.6",
+ "has-tostringtag": "^1.0.2",
+ "hasown": "^2.0.2"
},
"engines": {
"node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/data-view-byte-length": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz",
- "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==",
+ "node_modules/es-shim-unscopables": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz",
+ "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "call-bound": "^1.0.3",
- "es-errors": "^1.3.0",
- "is-data-view": "^1.0.2"
+ "hasown": "^2.0.2"
},
"engines": {
"node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/inspect-js"
}
},
- "node_modules/data-view-byte-offset": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz",
- "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==",
+ "node_modules/es-to-primitive": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz",
+ "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==",
"dev": true,
"license": "MIT",
"dependencies": {
- "call-bound": "^1.0.2",
- "es-errors": "^1.3.0",
- "is-data-view": "^1.0.1"
+ "is-callable": "^1.2.7",
+ "is-date-object": "^1.0.5",
+ "is-symbol": "^1.0.4"
},
"engines": {
"node": ">= 0.4"
@@ -8513,1962 +8166,1850 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/dayjs": {
- "version": "1.11.18",
- "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.18.tgz",
- "integrity": "sha512-zFBQ7WFRvVRhKcWoUh+ZA1g2HVgUbsZm9sbddh8EC5iv93sui8DVVz1Npvz+r6meo9VKfa8NyLWBsQK1VvIKPA==",
- "license": "MIT"
+ "node_modules/escalade": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
},
- "node_modules/debug": {
- "version": "4.4.3",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
- "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
+ "node_modules/escape-html": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
+ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
+ "license": "MIT"
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint": {
+ "version": "9.38.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.38.0.tgz",
+ "integrity": "sha512-t5aPOpmtJcZcz5UJyY2GbvpDlsK5E8JqRqoKtfiKE3cNh437KIqfJr3A3AKf5k64NPx6d0G3dno6XDY05PqPtw==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "ms": "^2.1.3"
+ "@eslint-community/eslint-utils": "^4.8.0",
+ "@eslint-community/regexpp": "^4.12.1",
+ "@eslint/config-array": "^0.21.1",
+ "@eslint/config-helpers": "^0.4.1",
+ "@eslint/core": "^0.16.0",
+ "@eslint/eslintrc": "^3.3.1",
+ "@eslint/js": "9.38.0",
+ "@eslint/plugin-kit": "^0.4.0",
+ "@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"
+ },
+ "bin": {
+ "eslint": "bin/eslint.js"
},
"engines": {
- "node": ">=6.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://eslint.org/donate"
+ },
+ "peerDependencies": {
+ "jiti": "*"
},
"peerDependenciesMeta": {
- "supports-color": {
+ "jiti": {
"optional": true
}
}
},
- "node_modules/dedent": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.0.tgz",
- "integrity": "sha512-HGFtf8yhuhGhqO07SV79tRp+br4MnbdjeVxotpn1QBl30pcLLCQjX5b2295ll0fv8RKDKsmWYrl05usHM9CewQ==",
+ "node_modules/eslint-config-next": {
+ "version": "16.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-16.0.0.tgz",
+ "integrity": "sha512-DWKT1YAO9ex2rK0/EeiPpKU++ghTiG59z6m08/ReLRECOYIaEv17maSCYT8zmFQLwIrY5lhJ+iaJPQdT4sJd4g==",
+ "dev": true,
"license": "MIT",
+ "dependencies": {
+ "@next/eslint-plugin-next": "16.0.0",
+ "eslint-import-resolver-node": "^0.3.6",
+ "eslint-import-resolver-typescript": "^3.5.2",
+ "eslint-plugin-import": "^2.32.0",
+ "eslint-plugin-jsx-a11y": "^6.10.0",
+ "eslint-plugin-react": "^7.37.0",
+ "eslint-plugin-react-hooks": "^7.0.0",
+ "globals": "16.4.0",
+ "typescript-eslint": "^8.46.0"
+ },
"peerDependencies": {
- "babel-plugin-macros": "^3.1.0"
+ "eslint": ">=9.0.0",
+ "typescript": ">=3.3.1"
},
"peerDependenciesMeta": {
- "babel-plugin-macros": {
+ "typescript": {
"optional": true
}
}
},
- "node_modules/deep-is": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
- "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/deepmerge": {
- "version": "4.3.1",
- "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
- "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
+ "node_modules/eslint-config-next/node_modules/globals": {
+ "version": "16.4.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-16.4.0.tgz",
+ "integrity": "sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==",
"dev": true,
"license": "MIT",
"engines": {
- "node": ">=0.10.0"
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/defaults": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz",
- "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==",
+ "node_modules/eslint-import-resolver-node": {
+ "version": "0.3.9",
+ "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz",
+ "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==",
"dev": true,
"license": "MIT",
"dependencies": {
- "clone": "^1.0.2"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "debug": "^3.2.7",
+ "is-core-module": "^2.13.0",
+ "resolve": "^1.22.4"
}
},
- "node_modules/define-data-property": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
- "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
+ "node_modules/eslint-import-resolver-node/node_modules/debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "es-define-property": "^1.0.0",
- "es-errors": "^1.3.0",
- "gopd": "^1.0.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "ms": "^2.1.1"
}
},
- "node_modules/define-properties": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz",
- "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==",
+ "node_modules/eslint-import-resolver-typescript": {
+ "version": "3.10.1",
+ "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.10.1.tgz",
+ "integrity": "sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ==",
"dev": true,
- "license": "MIT",
+ "license": "ISC",
"dependencies": {
- "define-data-property": "^1.0.1",
- "has-property-descriptors": "^1.0.0",
- "object-keys": "^1.1.1"
+ "@nolyfill/is-core-module": "1.0.39",
+ "debug": "^4.4.0",
+ "get-tsconfig": "^4.10.0",
+ "is-bun-module": "^2.0.0",
+ "stable-hash": "^0.0.5",
+ "tinyglobby": "^0.2.13",
+ "unrs-resolver": "^1.6.2"
},
"engines": {
- "node": ">= 0.4"
+ "node": "^14.18.0 || >=16.0.0"
},
"funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "url": "https://opencollective.com/eslint-import-resolver-typescript"
+ },
+ "peerDependencies": {
+ "eslint": "*",
+ "eslint-plugin-import": "*",
+ "eslint-plugin-import-x": "*"
+ },
+ "peerDependenciesMeta": {
+ "eslint-plugin-import": {
+ "optional": true
+ },
+ "eslint-plugin-import-x": {
+ "optional": true
+ }
}
},
- "node_modules/delayed-stream": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
- "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+ "node_modules/eslint-module-utils": {
+ "version": "2.12.1",
+ "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz",
+ "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==",
+ "dev": true,
"license": "MIT",
+ "dependencies": {
+ "debug": "^3.2.7"
+ },
"engines": {
- "node": ">=0.4.0"
+ "node": ">=4"
+ },
+ "peerDependenciesMeta": {
+ "eslint": {
+ "optional": true
+ }
}
},
- "node_modules/depd": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
- "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
+ "node_modules/eslint-module-utils/node_modules/debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dev": true,
"license": "MIT",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/detect-libc": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.1.tgz",
- "integrity": "sha512-ecqj/sy1jcK1uWrwpR67UhYrIFQ+5WlGxth34WquCbamhFA6hkkwiu37o6J5xCHdo1oixJRfVRw+ywV+Hq/0Aw==",
- "devOptional": true,
- "license": "Apache-2.0",
- "engines": {
- "node": ">=8"
+ "dependencies": {
+ "ms": "^2.1.1"
}
},
- "node_modules/detect-newline": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz",
- "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==",
+ "node_modules/eslint-plugin-import": {
+ "version": "2.32.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz",
+ "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==",
"dev": true,
"license": "MIT",
+ "dependencies": {
+ "@rtsao/scc": "^1.1.0",
+ "array-includes": "^3.1.9",
+ "array.prototype.findlastindex": "^1.2.6",
+ "array.prototype.flat": "^1.3.3",
+ "array.prototype.flatmap": "^1.3.3",
+ "debug": "^3.2.7",
+ "doctrine": "^2.1.0",
+ "eslint-import-resolver-node": "^0.3.9",
+ "eslint-module-utils": "^2.12.1",
+ "hasown": "^2.0.2",
+ "is-core-module": "^2.16.1",
+ "is-glob": "^4.0.3",
+ "minimatch": "^3.1.2",
+ "object.fromentries": "^2.0.8",
+ "object.groupby": "^1.0.3",
+ "object.values": "^1.2.1",
+ "semver": "^6.3.1",
+ "string.prototype.trimend": "^1.0.9",
+ "tsconfig-paths": "^3.15.0"
+ },
"engines": {
- "node": ">=8"
- }
- },
- "node_modules/diff": {
- "version": "4.0.4",
- "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.4.tgz",
- "integrity": "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==",
- "devOptional": true,
- "license": "BSD-3-Clause",
- "engines": {
- "node": ">=0.3.1"
+ "node": ">=4"
+ },
+ "peerDependencies": {
+ "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9"
}
},
- "node_modules/diff-sequences": {
- "version": "29.6.3",
- "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz",
- "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==",
+ "node_modules/eslint-plugin-import/node_modules/debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
"dev": true,
"license": "MIT",
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "dependencies": {
+ "ms": "^2.1.1"
}
},
- "node_modules/doctrine": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
- "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "node_modules/eslint-plugin-import/node_modules/json5": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
+ "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
"dev": true,
- "license": "Apache-2.0",
+ "license": "MIT",
"dependencies": {
- "esutils": "^2.0.2"
+ "minimist": "^1.2.0"
},
- "engines": {
- "node": ">=0.10.0"
+ "bin": {
+ "json5": "lib/cli.js"
}
},
- "node_modules/dotenv": {
- "version": "17.2.3",
- "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.2.3.tgz",
- "integrity": "sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==",
- "license": "BSD-2-Clause",
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://dotenvx.com"
+ "node_modules/eslint-plugin-import/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
}
},
- "node_modules/dotenv-expand": {
- "version": "12.0.3",
- "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-12.0.3.tgz",
- "integrity": "sha512-uc47g4b+4k/M/SeaW1y4OApx+mtLWl92l5LMPP0GNXctZqELk+YGgOPIIC5elYmUH4OuoK3JLhuRUYegeySiFA==",
- "license": "BSD-2-Clause",
- "dependencies": {
- "dotenv": "^16.4.5"
- },
+ "node_modules/eslint-plugin-import/node_modules/strip-bom": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+ "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==",
+ "dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://dotenvx.com"
+ "node": ">=4"
}
},
- "node_modules/dotenv-expand/node_modules/dotenv": {
- "version": "16.6.1",
- "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz",
- "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==",
- "license": "BSD-2-Clause",
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://dotenvx.com"
+ "node_modules/eslint-plugin-import/node_modules/tsconfig-paths": {
+ "version": "3.15.0",
+ "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz",
+ "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/json5": "^0.0.29",
+ "json5": "^1.0.2",
+ "minimist": "^1.2.6",
+ "strip-bom": "^3.0.0"
}
},
- "node_modules/dunder-proto": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
- "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
+ "node_modules/eslint-plugin-jsx-a11y": {
+ "version": "6.10.2",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz",
+ "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "call-bind-apply-helpers": "^1.0.1",
- "es-errors": "^1.3.0",
- "gopd": "^1.2.0"
+ "aria-query": "^5.3.2",
+ "array-includes": "^3.1.8",
+ "array.prototype.flatmap": "^1.3.2",
+ "ast-types-flow": "^0.0.8",
+ "axe-core": "^4.10.0",
+ "axobject-query": "^4.1.0",
+ "damerau-levenshtein": "^1.0.8",
+ "emoji-regex": "^9.2.2",
+ "hasown": "^2.0.2",
+ "jsx-ast-utils": "^3.3.5",
+ "language-tags": "^1.0.9",
+ "minimatch": "^3.1.2",
+ "object.fromentries": "^2.0.8",
+ "safe-regex-test": "^1.0.3",
+ "string.prototype.includes": "^2.0.1"
},
"engines": {
- "node": ">= 0.4"
+ "node": ">=4.0"
+ },
+ "peerDependencies": {
+ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9"
}
},
- "node_modules/eastasianwidth": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
- "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
- "license": "MIT"
- },
- "node_modules/ecdsa-sig-formatter": {
- "version": "1.0.11",
- "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
- "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==",
+ "node_modules/eslint-plugin-jsx-a11y/node_modules/aria-query": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz",
+ "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==",
+ "dev": true,
"license": "Apache-2.0",
- "dependencies": {
- "safe-buffer": "^5.0.1"
+ "engines": {
+ "node": ">= 0.4"
}
},
- "node_modules/ee-first": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
- "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
- "license": "MIT"
- },
- "node_modules/electron-to-chromium": {
- "version": "1.5.302",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.302.tgz",
- "integrity": "sha512-sM6HAN2LyK82IyPBpznDRqlTQAtuSaO+ShzFiWTvoMJLHyZ+Y39r8VMfHzwbU8MVBzQ4Wdn85+wlZl2TLGIlwg==",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/emittery": {
- "version": "0.13.1",
- "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz",
- "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==",
+ "node_modules/eslint-plugin-react": {
+ "version": "7.37.5",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz",
+ "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==",
"dev": true,
"license": "MIT",
- "engines": {
- "node": ">=12"
+ "dependencies": {
+ "array-includes": "^3.1.8",
+ "array.prototype.findlast": "^1.2.5",
+ "array.prototype.flatmap": "^1.3.3",
+ "array.prototype.tosorted": "^1.1.4",
+ "doctrine": "^2.1.0",
+ "es-iterator-helpers": "^1.2.1",
+ "estraverse": "^5.3.0",
+ "hasown": "^2.0.2",
+ "jsx-ast-utils": "^2.4.1 || ^3.0.0",
+ "minimatch": "^3.1.2",
+ "object.entries": "^1.1.9",
+ "object.fromentries": "^2.0.8",
+ "object.values": "^1.2.1",
+ "prop-types": "^15.8.1",
+ "resolve": "^2.0.0-next.5",
+ "semver": "^6.3.1",
+ "string.prototype.matchall": "^4.0.12",
+ "string.prototype.repeat": "^1.0.0"
},
- "funding": {
- "url": "https://github.com/sindresorhus/emittery?sponsor=1"
- }
- },
- "node_modules/emoji-regex": {
- "version": "9.2.2",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
- "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
- "license": "MIT"
- },
- "node_modules/encodeurl": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
- "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
- "license": "MIT",
"engines": {
- "node": ">= 0.8"
+ "node": ">=4"
+ },
+ "peerDependencies": {
+ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7"
}
},
- "node_modules/enhanced-resolve": {
- "version": "5.18.3",
- "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz",
- "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==",
+ "node_modules/eslint-plugin-react-hooks": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.0.1.tgz",
+ "integrity": "sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "graceful-fs": "^4.2.4",
- "tapable": "^2.2.0"
+ "@babel/core": "^7.24.4",
+ "@babel/parser": "^7.24.4",
+ "hermes-parser": "^0.25.1",
+ "zod": "^3.25.0 || ^4.0.0",
+ "zod-validation-error": "^3.5.0 || ^4.0.0"
},
"engines": {
- "node": ">=10.13.0"
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0"
}
},
- "node_modules/error-ex": {
- "version": "1.3.4",
- "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz",
- "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==",
+ "node_modules/eslint-plugin-react/node_modules/resolve": {
+ "version": "2.0.0-next.5",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz",
+ "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "is-arrayish": "^0.2.1"
- }
- },
- "node_modules/es-abstract": {
- "version": "1.24.0",
- "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz",
- "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==",
+ "is-core-module": "^2.13.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/eslint-plugin-react/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
"dev": true,
- "license": "MIT",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/eslint-scope": {
+ "version": "8.4.0",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz",
+ "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==",
+ "dev": true,
+ "license": "BSD-2-Clause",
"dependencies": {
- "array-buffer-byte-length": "^1.0.2",
- "arraybuffer.prototype.slice": "^1.0.4",
- "available-typed-arrays": "^1.0.7",
- "call-bind": "^1.0.8",
- "call-bound": "^1.0.4",
- "data-view-buffer": "^1.0.2",
- "data-view-byte-length": "^1.0.2",
- "data-view-byte-offset": "^1.0.1",
- "es-define-property": "^1.0.1",
- "es-errors": "^1.3.0",
- "es-object-atoms": "^1.1.1",
- "es-set-tostringtag": "^2.1.0",
- "es-to-primitive": "^1.3.0",
- "function.prototype.name": "^1.1.8",
- "get-intrinsic": "^1.3.0",
- "get-proto": "^1.0.1",
- "get-symbol-description": "^1.1.0",
- "globalthis": "^1.0.4",
- "gopd": "^1.2.0",
- "has-property-descriptors": "^1.0.2",
- "has-proto": "^1.2.0",
- "has-symbols": "^1.1.0",
- "hasown": "^2.0.2",
- "internal-slot": "^1.1.0",
- "is-array-buffer": "^3.0.5",
- "is-callable": "^1.2.7",
- "is-data-view": "^1.0.2",
- "is-negative-zero": "^2.0.3",
- "is-regex": "^1.2.1",
- "is-set": "^2.0.3",
- "is-shared-array-buffer": "^1.0.4",
- "is-string": "^1.1.1",
- "is-typed-array": "^1.1.15",
- "is-weakref": "^1.1.1",
- "math-intrinsics": "^1.1.0",
- "object-inspect": "^1.13.4",
- "object-keys": "^1.1.1",
- "object.assign": "^4.1.7",
- "own-keys": "^1.0.1",
- "regexp.prototype.flags": "^1.5.4",
- "safe-array-concat": "^1.1.3",
- "safe-push-apply": "^1.0.0",
- "safe-regex-test": "^1.1.0",
- "set-proto": "^1.0.0",
- "stop-iteration-iterator": "^1.1.0",
- "string.prototype.trim": "^1.2.10",
- "string.prototype.trimend": "^1.0.9",
- "string.prototype.trimstart": "^1.0.8",
- "typed-array-buffer": "^1.0.3",
- "typed-array-byte-length": "^1.0.3",
- "typed-array-byte-offset": "^1.0.4",
- "typed-array-length": "^1.0.7",
- "unbox-primitive": "^1.1.0",
- "which-typed-array": "^1.1.19"
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
},
"engines": {
- "node": ">= 0.4"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "url": "https://opencollective.com/eslint"
}
},
- "node_modules/es-define-property": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
- "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
- "license": "MIT",
+ "node_modules/eslint-visitor-keys": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+ "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
+ "dev": true,
+ "license": "Apache-2.0",
"engines": {
- "node": ">= 0.4"
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
}
},
- "node_modules/es-errors": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
- "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
- "license": "MIT",
+ "node_modules/eslint/node_modules/eslint-visitor-keys": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
+ "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
+ "dev": true,
+ "license": "Apache-2.0",
"engines": {
- "node": ">= 0.4"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
}
},
- "node_modules/es-iterator-helpers": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz",
- "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==",
+ "node_modules/espree": {
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz",
+ "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==",
"dev": true,
- "license": "MIT",
+ "license": "BSD-2-Clause",
"dependencies": {
- "call-bind": "^1.0.8",
- "call-bound": "^1.0.3",
- "define-properties": "^1.2.1",
- "es-abstract": "^1.23.6",
- "es-errors": "^1.3.0",
- "es-set-tostringtag": "^2.0.3",
- "function-bind": "^1.1.2",
- "get-intrinsic": "^1.2.6",
- "globalthis": "^1.0.4",
- "gopd": "^1.2.0",
- "has-property-descriptors": "^1.0.2",
- "has-proto": "^1.2.0",
- "has-symbols": "^1.1.0",
- "internal-slot": "^1.1.0",
- "iterator.prototype": "^1.1.4",
- "safe-array-concat": "^1.1.3"
+ "acorn": "^8.15.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^4.2.1"
},
"engines": {
- "node": ">= 0.4"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
}
},
- "node_modules/es-module-lexer": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.0.0.tgz",
- "integrity": "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==",
+ "node_modules/espree/node_modules/eslint-visitor-keys": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
+ "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
"dev": true,
- "license": "MIT"
- },
- "node_modules/es-object-atoms": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
- "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
- "license": "MIT",
- "dependencies": {
- "es-errors": "^1.3.0"
- },
+ "license": "Apache-2.0",
"engines": {
- "node": ">= 0.4"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
}
},
- "node_modules/es-set-tostringtag": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
- "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
- "license": "MIT",
- "dependencies": {
- "es-errors": "^1.3.0",
- "get-intrinsic": "^1.2.6",
- "has-tostringtag": "^1.0.2",
- "hasown": "^2.0.2"
+ "node_modules/esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "bin": {
+ "esparse": "bin/esparse.js",
+ "esvalidate": "bin/esvalidate.js"
},
"engines": {
- "node": ">= 0.4"
+ "node": ">=4"
}
},
- "node_modules/es-shim-unscopables": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz",
- "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==",
+ "node_modules/esquery": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz",
+ "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==",
"dev": true,
- "license": "MIT",
+ "license": "BSD-3-Clause",
"dependencies": {
- "hasown": "^2.0.2"
+ "estraverse": "^5.1.0"
},
"engines": {
- "node": ">= 0.4"
+ "node": ">=0.10"
}
},
- "node_modules/es-to-primitive": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz",
- "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==",
+ "node_modules/esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
"dev": true,
- "license": "MIT",
+ "license": "BSD-2-Clause",
"dependencies": {
- "is-callable": "^1.2.7",
- "is-date-object": "^1.0.5",
- "is-symbol": "^1.0.4"
+ "estraverse": "^5.2.0"
},
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": ">=4.0"
}
},
- "node_modules/esbuild": {
- "version": "0.27.2",
- "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.2.tgz",
- "integrity": "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==",
+ "node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
"dev": true,
- "hasInstallScript": true,
- "license": "MIT",
- "bin": {
- "esbuild": "bin/esbuild"
- },
+ "license": "BSD-2-Clause",
"engines": {
- "node": ">=18"
- },
- "optionalDependencies": {
- "@esbuild/aix-ppc64": "0.27.2",
- "@esbuild/android-arm": "0.27.2",
- "@esbuild/android-arm64": "0.27.2",
- "@esbuild/android-x64": "0.27.2",
- "@esbuild/darwin-arm64": "0.27.2",
- "@esbuild/darwin-x64": "0.27.2",
- "@esbuild/freebsd-arm64": "0.27.2",
- "@esbuild/freebsd-x64": "0.27.2",
- "@esbuild/linux-arm": "0.27.2",
- "@esbuild/linux-arm64": "0.27.2",
- "@esbuild/linux-ia32": "0.27.2",
- "@esbuild/linux-loong64": "0.27.2",
- "@esbuild/linux-mips64el": "0.27.2",
- "@esbuild/linux-ppc64": "0.27.2",
- "@esbuild/linux-riscv64": "0.27.2",
- "@esbuild/linux-s390x": "0.27.2",
- "@esbuild/linux-x64": "0.27.2",
- "@esbuild/netbsd-arm64": "0.27.2",
- "@esbuild/netbsd-x64": "0.27.2",
- "@esbuild/openbsd-arm64": "0.27.2",
- "@esbuild/openbsd-x64": "0.27.2",
- "@esbuild/openharmony-arm64": "0.27.2",
- "@esbuild/sunos-x64": "0.27.2",
- "@esbuild/win32-arm64": "0.27.2",
- "@esbuild/win32-ia32": "0.27.2",
- "@esbuild/win32-x64": "0.27.2"
+ "node": ">=4.0"
}
},
- "node_modules/escalade": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
- "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
- "license": "MIT",
+ "node_modules/esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "dev": true,
+ "license": "BSD-2-Clause",
"engines": {
- "node": ">=6"
+ "node": ">=0.10.0"
}
},
- "node_modules/escape-html": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
- "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
- "license": "MIT"
- },
- "node_modules/escape-string-regexp": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
- "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
- "dev": true,
+ "node_modules/etag": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
+ "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
"license": "MIT",
"engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "node": ">= 0.6"
}
},
- "node_modules/eslint": {
- "version": "9.38.0",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.38.0.tgz",
- "integrity": "sha512-t5aPOpmtJcZcz5UJyY2GbvpDlsK5E8JqRqoKtfiKE3cNh437KIqfJr3A3AKf5k64NPx6d0G3dno6XDY05PqPtw==",
- "dev": true,
+ "node_modules/ethers": {
+ "version": "6.15.0",
+ "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.15.0.tgz",
+ "integrity": "sha512-Kf/3ZW54L4UT0pZtsY/rf+EkBU7Qi5nnhonjUb8yTXcxH3cdcWrV2cRyk0Xk/4jK6OoHhxxZHriyhje20If2hQ==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/ethers-io/"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
"license": "MIT",
"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.1",
- "@eslint/core": "^0.16.0",
- "@eslint/eslintrc": "^3.3.1",
- "@eslint/js": "9.38.0",
- "@eslint/plugin-kit": "^0.4.0",
- "@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"
- },
- "bin": {
- "eslint": "bin/eslint.js"
+ "@adraffy/ens-normalize": "1.10.1",
+ "@noble/curves": "1.2.0",
+ "@noble/hashes": "1.3.2",
+ "@types/node": "22.7.5",
+ "aes-js": "4.0.0-beta.5",
+ "tslib": "2.7.0",
+ "ws": "8.17.1"
},
"engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "url": "https://eslint.org/donate"
- },
- "peerDependencies": {
- "jiti": "*"
- },
- "peerDependenciesMeta": {
- "jiti": {
- "optional": true
- }
+ "node": ">=14.0.0"
}
},
- "node_modules/eslint-config-next": {
- "version": "16.0.0",
- "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-16.0.0.tgz",
- "integrity": "sha512-DWKT1YAO9ex2rK0/EeiPpKU++ghTiG59z6m08/ReLRECOYIaEv17maSCYT8zmFQLwIrY5lhJ+iaJPQdT4sJd4g==",
- "dev": true,
+ "node_modules/ethers/node_modules/@noble/curves": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz",
+ "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==",
"license": "MIT",
"dependencies": {
- "@next/eslint-plugin-next": "16.0.0",
- "eslint-import-resolver-node": "^0.3.6",
- "eslint-import-resolver-typescript": "^3.5.2",
- "eslint-plugin-import": "^2.32.0",
- "eslint-plugin-jsx-a11y": "^6.10.0",
- "eslint-plugin-react": "^7.37.0",
- "eslint-plugin-react-hooks": "^7.0.0",
- "globals": "16.4.0",
- "typescript-eslint": "^8.46.0"
- },
- "peerDependencies": {
- "eslint": ">=9.0.0",
- "typescript": ">=3.3.1"
+ "@noble/hashes": "1.3.2"
},
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
}
},
- "node_modules/eslint-config-next/node_modules/globals": {
- "version": "16.4.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-16.4.0.tgz",
- "integrity": "sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==",
- "dev": true,
+ "node_modules/ethers/node_modules/@noble/hashes": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz",
+ "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==",
"license": "MIT",
"engines": {
- "node": ">=18"
+ "node": ">= 16"
},
"funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "url": "https://paulmillr.com/funding/"
}
},
- "node_modules/eslint-import-resolver-node": {
- "version": "0.3.9",
- "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz",
- "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==",
- "dev": true,
+ "node_modules/ethers/node_modules/@types/node": {
+ "version": "22.7.5",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.5.tgz",
+ "integrity": "sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==",
"license": "MIT",
"dependencies": {
- "debug": "^3.2.7",
- "is-core-module": "^2.13.0",
- "resolve": "^1.22.4"
+ "undici-types": "~6.19.2"
}
},
- "node_modules/eslint-import-resolver-node/node_modules/debug": {
- "version": "3.2.7",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
- "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
- "dev": true,
+ "node_modules/ethers/node_modules/tslib": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz",
+ "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==",
+ "license": "0BSD"
+ },
+ "node_modules/ethers/node_modules/undici-types": {
+ "version": "6.19.8",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz",
+ "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==",
+ "license": "MIT"
+ },
+ "node_modules/eventemitter3": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz",
+ "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==",
+ "license": "MIT"
+ },
+ "node_modules/events": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
+ "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
+ "devOptional": true,
"license": "MIT",
- "dependencies": {
- "ms": "^2.1.1"
+ "engines": {
+ "node": ">=0.8.x"
}
},
- "node_modules/eslint-import-resolver-typescript": {
- "version": "3.10.1",
- "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.10.1.tgz",
- "integrity": "sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ==",
+ "node_modules/execa": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
+ "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
"dev": true,
- "license": "ISC",
+ "license": "MIT",
"dependencies": {
- "@nolyfill/is-core-module": "1.0.39",
- "debug": "^4.4.0",
- "get-tsconfig": "^4.10.0",
- "is-bun-module": "^2.0.0",
- "stable-hash": "^0.0.5",
- "tinyglobby": "^0.2.13",
- "unrs-resolver": "^1.6.2"
+ "cross-spawn": "^7.0.3",
+ "get-stream": "^6.0.0",
+ "human-signals": "^2.1.0",
+ "is-stream": "^2.0.0",
+ "merge-stream": "^2.0.0",
+ "npm-run-path": "^4.0.1",
+ "onetime": "^5.1.2",
+ "signal-exit": "^3.0.3",
+ "strip-final-newline": "^2.0.0"
},
"engines": {
- "node": "^14.18.0 || >=16.0.0"
+ "node": ">=10"
},
"funding": {
- "url": "https://opencollective.com/eslint-import-resolver-typescript"
- },
- "peerDependencies": {
- "eslint": "*",
- "eslint-plugin-import": "*",
- "eslint-plugin-import-x": "*"
- },
- "peerDependenciesMeta": {
- "eslint-plugin-import": {
- "optional": true
- },
- "eslint-plugin-import-x": {
- "optional": true
- }
+ "url": "https://github.com/sindresorhus/execa?sponsor=1"
}
},
- "node_modules/eslint-module-utils": {
- "version": "2.12.1",
- "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz",
- "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==",
+ "node_modules/execa/node_modules/signal-exit": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/exit-x": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/exit-x/-/exit-x-0.2.2.tgz",
+ "integrity": "sha512-+I6B/IkJc1o/2tiURyz/ivu/O0nKNEArIUB5O7zBrlDVJr22SCLH3xTeEry428LvFhRzIA1g8izguxJ/gbNcVQ==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "debug": "^3.2.7"
- },
"engines": {
- "node": ">=4"
- },
- "peerDependenciesMeta": {
- "eslint": {
- "optional": true
- }
+ "node": ">= 0.8.0"
}
},
- "node_modules/eslint-module-utils/node_modules/debug": {
- "version": "3.2.7",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
- "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
- "dev": true,
- "license": "MIT",
+ "node_modules/expect": {
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/expect/-/expect-30.2.0.tgz",
+ "integrity": "sha512-u/feCi0GPsI+988gU2FLcsHyAHTU0MX1Wg68NhAnN7z/+C5wqG+CY8J53N9ioe8RXgaoz0nBR/TYMf3AycUuPw==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "ms": "^2.1.1"
+ "@jest/expect-utils": "30.2.0",
+ "@jest/get-type": "30.1.0",
+ "jest-matcher-utils": "30.2.0",
+ "jest-message-util": "30.2.0",
+ "jest-mock": "30.2.0",
+ "jest-util": "30.2.0"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
}
},
- "node_modules/eslint-plugin-import": {
- "version": "2.32.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz",
- "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==",
- "dev": true,
+ "node_modules/express": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz",
+ "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==",
"license": "MIT",
"dependencies": {
- "@rtsao/scc": "^1.1.0",
- "array-includes": "^3.1.9",
- "array.prototype.findlastindex": "^1.2.6",
- "array.prototype.flat": "^1.3.3",
- "array.prototype.flatmap": "^1.3.3",
- "debug": "^3.2.7",
- "doctrine": "^2.1.0",
- "eslint-import-resolver-node": "^0.3.9",
- "eslint-module-utils": "^2.12.1",
- "hasown": "^2.0.2",
- "is-core-module": "^2.16.1",
- "is-glob": "^4.0.3",
- "minimatch": "^3.1.2",
- "object.fromentries": "^2.0.8",
- "object.groupby": "^1.0.3",
- "object.values": "^1.2.1",
- "semver": "^6.3.1",
- "string.prototype.trimend": "^1.0.9",
- "tsconfig-paths": "^3.15.0"
+ "accepts": "^2.0.0",
+ "body-parser": "^2.2.1",
+ "content-disposition": "^1.0.0",
+ "content-type": "^1.0.5",
+ "cookie": "^0.7.1",
+ "cookie-signature": "^1.2.1",
+ "debug": "^4.4.0",
+ "depd": "^2.0.0",
+ "encodeurl": "^2.0.0",
+ "escape-html": "^1.0.3",
+ "etag": "^1.8.1",
+ "finalhandler": "^2.1.0",
+ "fresh": "^2.0.0",
+ "http-errors": "^2.0.0",
+ "merge-descriptors": "^2.0.0",
+ "mime-types": "^3.0.0",
+ "on-finished": "^2.4.1",
+ "once": "^1.4.0",
+ "parseurl": "^1.3.3",
+ "proxy-addr": "^2.0.7",
+ "qs": "^6.14.0",
+ "range-parser": "^1.2.1",
+ "router": "^2.2.0",
+ "send": "^1.1.0",
+ "serve-static": "^2.2.0",
+ "statuses": "^2.0.1",
+ "type-is": "^2.0.1",
+ "vary": "^1.1.2"
},
"engines": {
- "node": ">=4"
+ "node": ">= 18"
},
- "peerDependencies": {
- "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9"
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
}
},
- "node_modules/eslint-plugin-import/node_modules/debug": {
- "version": "3.2.7",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
- "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fast-glob": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
+ "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "ms": "^2.1.1"
+ "@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"
+ },
+ "engines": {
+ "node": ">=8.6.0"
}
},
- "node_modules/eslint-plugin-import/node_modules/json5": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
- "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
+ "node_modules/fast-glob/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
"dev": true,
- "license": "MIT",
+ "license": "ISC",
"dependencies": {
- "minimist": "^1.2.0"
+ "is-glob": "^4.0.1"
},
- "bin": {
- "json5": "lib/cli.js"
+ "engines": {
+ "node": ">= 6"
}
},
- "node_modules/eslint-plugin-import/node_modules/semver": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "node_modules/fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fast-safe-stringify": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz",
+ "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==",
+ "license": "MIT"
+ },
+ "node_modules/fast-uri": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz",
+ "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fastify"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/fastify"
+ }
+ ],
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/fastq": {
+ "version": "1.19.1",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz",
+ "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==",
"dev": true,
"license": "ISC",
- "bin": {
- "semver": "bin/semver.js"
+ "dependencies": {
+ "reusify": "^1.0.4"
}
},
- "node_modules/eslint-plugin-import/node_modules/strip-bom": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
- "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==",
+ "node_modules/fb-watchman": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz",
+ "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "bser": "2.1.1"
+ }
+ },
+ "node_modules/fdir": {
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
+ "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
"dev": true,
"license": "MIT",
"engines": {
- "node": ">=4"
+ "node": ">=12.0.0"
+ },
+ "peerDependencies": {
+ "picomatch": "^3 || ^4"
+ },
+ "peerDependenciesMeta": {
+ "picomatch": {
+ "optional": true
+ }
}
},
- "node_modules/eslint-plugin-import/node_modules/tsconfig-paths": {
- "version": "3.15.0",
- "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz",
- "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==",
+ "node_modules/file-entry-cache": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz",
+ "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@types/json5": "^0.0.29",
- "json5": "^1.0.2",
- "minimist": "^1.2.6",
- "strip-bom": "^3.0.0"
+ "flat-cache": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=16.0.0"
}
},
- "node_modules/eslint-plugin-jsx-a11y": {
- "version": "6.10.2",
- "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz",
- "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==",
- "dev": true,
+ "node_modules/file-type": {
+ "version": "21.3.2",
+ "resolved": "https://registry.npmjs.org/file-type/-/file-type-21.3.2.tgz",
+ "integrity": "sha512-DLkUvGwep3poOV2wpzbHCOnSKGk1LzyXTv+aHFgN2VFl96wnp8YA9YjO2qPzg5PuL8q/SW9Pdi6WTkYOIh995w==",
"license": "MIT",
"dependencies": {
- "aria-query": "^5.3.2",
- "array-includes": "^3.1.8",
- "array.prototype.flatmap": "^1.3.2",
- "ast-types-flow": "^0.0.8",
- "axe-core": "^4.10.0",
- "axobject-query": "^4.1.0",
- "damerau-levenshtein": "^1.0.8",
- "emoji-regex": "^9.2.2",
- "hasown": "^2.0.2",
- "jsx-ast-utils": "^3.3.5",
- "language-tags": "^1.0.9",
- "minimatch": "^3.1.2",
- "object.fromentries": "^2.0.8",
- "safe-regex-test": "^1.0.3",
- "string.prototype.includes": "^2.0.1"
+ "@tokenizer/inflate": "^0.4.1",
+ "strtok3": "^10.3.4",
+ "token-types": "^6.1.1",
+ "uint8array-extras": "^1.4.0"
},
"engines": {
- "node": ">=4.0"
+ "node": ">=20"
},
- "peerDependencies": {
- "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9"
+ "funding": {
+ "url": "https://github.com/sindresorhus/file-type?sponsor=1"
}
},
- "node_modules/eslint-plugin-jsx-a11y/node_modules/aria-query": {
- "version": "5.3.2",
- "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz",
- "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==",
+ "node_modules/fill-range": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
"dev": true,
- "license": "Apache-2.0",
+ "license": "MIT",
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
"engines": {
- "node": ">= 0.4"
+ "node": ">=8"
}
},
- "node_modules/eslint-plugin-react": {
- "version": "7.37.5",
- "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz",
- "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==",
- "dev": true,
+ "node_modules/finalhandler": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz",
+ "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==",
"license": "MIT",
"dependencies": {
- "array-includes": "^3.1.8",
- "array.prototype.findlast": "^1.2.5",
- "array.prototype.flatmap": "^1.3.3",
- "array.prototype.tosorted": "^1.1.4",
- "doctrine": "^2.1.0",
- "es-iterator-helpers": "^1.2.1",
- "estraverse": "^5.3.0",
- "hasown": "^2.0.2",
- "jsx-ast-utils": "^2.4.1 || ^3.0.0",
- "minimatch": "^3.1.2",
- "object.entries": "^1.1.9",
- "object.fromentries": "^2.0.8",
- "object.values": "^1.2.1",
- "prop-types": "^15.8.1",
- "resolve": "^2.0.0-next.5",
- "semver": "^6.3.1",
- "string.prototype.matchall": "^4.0.12",
- "string.prototype.repeat": "^1.0.0"
+ "debug": "^4.4.0",
+ "encodeurl": "^2.0.0",
+ "escape-html": "^1.0.3",
+ "on-finished": "^2.4.1",
+ "parseurl": "^1.3.3",
+ "statuses": "^2.0.1"
},
"engines": {
- "node": ">=4"
- },
- "peerDependencies": {
- "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7"
+ "node": ">= 0.8"
}
},
- "node_modules/eslint-plugin-react-hooks": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.0.1.tgz",
- "integrity": "sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA==",
+ "node_modules/find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/core": "^7.24.4",
- "@babel/parser": "^7.24.4",
- "hermes-parser": "^0.25.1",
- "zod": "^3.25.0 || ^4.0.0",
- "zod-validation-error": "^3.5.0 || ^4.0.0"
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
},
"engines": {
- "node": ">=18"
+ "node": ">=10"
},
- "peerDependencies": {
- "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0"
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/eslint-plugin-react/node_modules/resolve": {
- "version": "2.0.0-next.5",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz",
- "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==",
+ "node_modules/flat-cache": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz",
+ "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "is-core-module": "^2.13.0",
- "path-parse": "^1.0.7",
- "supports-preserve-symlinks-flag": "^1.0.0"
- },
- "bin": {
- "resolve": "bin/resolve"
+ "flatted": "^3.2.9",
+ "keyv": "^4.5.4"
},
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "engines": {
+ "node": ">=16"
}
},
- "node_modules/eslint-plugin-react/node_modules/semver": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "node_modules/flatted": {
+ "version": "3.4.2",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz",
+ "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==",
"dev": true,
- "license": "ISC",
- "bin": {
- "semver": "bin/semver.js"
- }
+ "license": "ISC"
},
- "node_modules/eslint-scope": {
- "version": "8.4.0",
- "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz",
- "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==",
- "dev": true,
- "license": "BSD-2-Clause",
- "dependencies": {
- "esrecurse": "^4.3.0",
- "estraverse": "^5.2.0"
- },
+ "node_modules/follow-redirects": {
+ "version": "1.15.11",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz",
+ "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/RubenVerborgh"
+ }
+ ],
+ "license": "MIT",
"engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ "node": ">=4.0"
},
- "funding": {
- "url": "https://opencollective.com/eslint"
+ "peerDependenciesMeta": {
+ "debug": {
+ "optional": true
+ }
}
},
- "node_modules/eslint-visitor-keys": {
- "version": "3.4.3",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
- "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ "node_modules/for-each": {
+ "version": "0.3.5",
+ "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz",
+ "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==",
+ "license": "MIT",
+ "dependencies": {
+ "is-callable": "^1.2.7"
},
- "funding": {
- "url": "https://opencollective.com/eslint"
- }
- },
- "node_modules/eslint/node_modules/eslint-visitor-keys": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
- "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
- "dev": true,
- "license": "Apache-2.0",
"engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ "node": ">= 0.4"
},
"funding": {
- "url": "https://opencollective.com/eslint"
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/espree": {
- "version": "10.4.0",
- "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz",
- "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==",
- "dev": true,
- "license": "BSD-2-Clause",
+ "node_modules/foreground-child": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz",
+ "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==",
+ "license": "ISC",
"dependencies": {
- "acorn": "^8.15.0",
- "acorn-jsx": "^5.3.2",
- "eslint-visitor-keys": "^4.2.1"
+ "cross-spawn": "^7.0.6",
+ "signal-exit": "^4.0.1"
},
"engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ "node": ">=14"
},
"funding": {
- "url": "https://opencollective.com/eslint"
+ "url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/espree/node_modules/eslint-visitor-keys": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
- "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
+ "node_modules/fork-ts-checker-webpack-plugin": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-9.1.0.tgz",
+ "integrity": "sha512-mpafl89VFPJmhnJ1ssH+8wmM2b50n+Rew5x42NeI2U78aRWgtkEtGmctp7iT16UjquJTjorEmIfESj3DxdW84Q==",
"dev": true,
- "license": "Apache-2.0",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.16.7",
+ "chalk": "^4.1.2",
+ "chokidar": "^4.0.1",
+ "cosmiconfig": "^8.2.0",
+ "deepmerge": "^4.2.2",
+ "fs-extra": "^10.0.0",
+ "memfs": "^3.4.1",
+ "minimatch": "^3.0.4",
+ "node-abort-controller": "^3.0.1",
+ "schema-utils": "^3.1.1",
+ "semver": "^7.3.5",
+ "tapable": "^2.2.1"
+ },
"engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ "node": ">=14.21.3"
},
- "funding": {
- "url": "https://opencollective.com/eslint"
+ "peerDependencies": {
+ "typescript": ">3.6.0",
+ "webpack": "^5.11.0"
}
},
- "node_modules/esprima": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
- "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
- "dev": true,
- "license": "BSD-2-Clause",
- "bin": {
- "esparse": "bin/esparse.js",
- "esvalidate": "bin/esvalidate.js"
+ "node_modules/form-data": {
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz",
+ "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==",
+ "license": "MIT",
+ "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"
},
"engines": {
- "node": ">=4"
+ "node": ">= 6"
}
},
- "node_modules/esquery": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz",
- "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==",
- "dev": true,
- "license": "BSD-3-Clause",
- "dependencies": {
- "estraverse": "^5.1.0"
- },
+ "node_modules/form-data/node_modules/mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+ "license": "MIT",
"engines": {
- "node": ">=0.10"
+ "node": ">= 0.6"
}
},
- "node_modules/esrecurse": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
- "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
- "dev": true,
- "license": "BSD-2-Clause",
+ "node_modules/form-data/node_modules/mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "license": "MIT",
"dependencies": {
- "estraverse": "^5.2.0"
+ "mime-db": "1.52.0"
},
"engines": {
- "node": ">=4.0"
+ "node": ">= 0.6"
}
},
- "node_modules/estraverse": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
- "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
- "dev": true,
- "license": "BSD-2-Clause",
+ "node_modules/forwarded": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
+ "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
+ "license": "MIT",
"engines": {
- "node": ">=4.0"
+ "node": ">= 0.6"
}
},
- "node_modules/esutils": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
- "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "node_modules/fraction.js": {
+ "version": "4.3.7",
+ "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz",
+ "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==",
"dev": true,
- "license": "BSD-2-Clause",
+ "license": "MIT",
"engines": {
- "node": ">=0.10.0"
+ "node": "*"
+ },
+ "funding": {
+ "type": "patreon",
+ "url": "https://github.com/sponsors/rawify"
}
},
- "node_modules/etag": {
- "version": "1.8.1",
- "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
- "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
+ "node_modules/fresh": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz",
+ "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==",
"license": "MIT",
"engines": {
- "node": ">= 0.6"
+ "node": ">= 0.8"
}
},
- "node_modules/ethers": {
- "version": "6.15.0",
- "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.15.0.tgz",
- "integrity": "sha512-Kf/3ZW54L4UT0pZtsY/rf+EkBU7Qi5nnhonjUb8yTXcxH3cdcWrV2cRyk0Xk/4jK6OoHhxxZHriyhje20If2hQ==",
- "funding": [
- {
- "type": "individual",
- "url": "https://github.com/sponsors/ethers-io/"
- },
- {
- "type": "individual",
- "url": "https://www.buymeacoffee.com/ricmoo"
- }
- ],
+ "node_modules/fs-extra": {
+ "version": "10.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
+ "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "@adraffy/ens-normalize": "1.10.1",
- "@noble/curves": "1.2.0",
- "@noble/hashes": "1.3.2",
- "@types/node": "22.7.5",
- "aes-js": "4.0.0-beta.5",
- "tslib": "2.7.0",
- "ws": "8.17.1"
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
},
"engines": {
- "node": ">=14.0.0"
+ "node": ">=12"
}
},
- "node_modules/ethers/node_modules/@noble/curves": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz",
- "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==",
+ "node_modules/fs-monkey": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.1.0.tgz",
+ "integrity": "sha512-QMUezzXWII9EV5aTFXW1UBVUO77wYPpjqIF8/AviUCThNeSYZykpoTixUeaNNBwmCev0AMDWMAni+f8Hxb1IFw==",
+ "dev": true,
+ "license": "Unlicense"
+ },
+ "node_modules/fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/function-bind": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
"license": "MIT",
- "dependencies": {
- "@noble/hashes": "1.3.2"
- },
"funding": {
- "url": "https://paulmillr.com/funding/"
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/ethers/node_modules/@noble/hashes": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz",
- "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==",
+ "node_modules/function.prototype.name": {
+ "version": "1.1.8",
+ "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz",
+ "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==",
+ "dev": true,
"license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "define-properties": "^1.2.1",
+ "functions-have-names": "^1.2.3",
+ "hasown": "^2.0.2",
+ "is-callable": "^1.2.7"
+ },
"engines": {
- "node": ">= 16"
+ "node": ">= 0.4"
},
"funding": {
- "url": "https://paulmillr.com/funding/"
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/ethers/node_modules/@types/node": {
- "version": "22.7.5",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.5.tgz",
- "integrity": "sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==",
+ "node_modules/functions-have-names": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
+ "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==",
+ "dev": true,
"license": "MIT",
- "dependencies": {
- "undici-types": "~6.19.2"
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/ethers/node_modules/tslib": {
- "version": "2.7.0",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz",
- "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==",
- "license": "0BSD"
- },
- "node_modules/ethers/node_modules/undici-types": {
- "version": "6.19.8",
- "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz",
- "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==",
- "license": "MIT"
- },
- "node_modules/events": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
- "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
+ "node_modules/generator-function": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz",
+ "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==",
"dev": true,
"license": "MIT",
"engines": {
- "node": ">=0.8.x"
+ "node": ">= 0.4"
}
},
- "node_modules/execa": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
- "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
+ "node_modules/gensync": {
+ "version": "1.0.0-beta.2",
+ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "cross-spawn": "^7.0.3",
- "get-stream": "^6.0.0",
- "human-signals": "^2.1.0",
- "is-stream": "^2.0.0",
- "merge-stream": "^2.0.0",
- "npm-run-path": "^4.0.1",
- "onetime": "^5.1.2",
- "signal-exit": "^3.0.3",
- "strip-final-newline": "^2.0.0"
- },
"engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sindresorhus/execa?sponsor=1"
+ "node": ">=6.9.0"
}
},
- "node_modules/execa/node_modules/signal-exit": {
- "version": "3.0.7",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
- "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
- "dev": true,
- "license": "ISC"
+ "node_modules/get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "license": "ISC",
+ "engines": {
+ "node": "6.* || 8.* || >= 10.*"
+ }
},
- "node_modules/exit": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
- "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==",
- "dev": true,
+ "node_modules/get-intrinsic": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
+ "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
+ "license": "MIT",
+ "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"
+ },
"engines": {
- "node": ">= 0.8.0"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/exit-x": {
- "version": "0.2.2",
- "resolved": "https://registry.npmjs.org/exit-x/-/exit-x-0.2.2.tgz",
- "integrity": "sha512-+I6B/IkJc1o/2tiURyz/ivu/O0nKNEArIUB5O7zBrlDVJr22SCLH3xTeEry428LvFhRzIA1g8izguxJ/gbNcVQ==",
+ "node_modules/get-package-type": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz",
+ "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==",
"dev": true,
"license": "MIT",
"engines": {
- "node": ">= 0.8.0"
+ "node": ">=8.0.0"
}
},
- "node_modules/expect": {
- "version": "30.2.0",
- "resolved": "https://registry.npmjs.org/expect/-/expect-30.2.0.tgz",
- "integrity": "sha512-u/feCi0GPsI+988gU2FLcsHyAHTU0MX1Wg68NhAnN7z/+C5wqG+CY8J53N9ioe8RXgaoz0nBR/TYMf3AycUuPw==",
- "dev": true,
+ "node_modules/get-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
+ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
"license": "MIT",
"dependencies": {
- "@jest/expect-utils": "30.2.0",
- "@jest/get-type": "30.1.0",
- "jest-matcher-utils": "30.2.0",
- "jest-message-util": "30.2.0",
- "jest-mock": "30.2.0",
- "jest-util": "30.2.0"
+ "dunder-proto": "^1.0.1",
+ "es-object-atoms": "^1.0.0"
},
"engines": {
- "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ "node": ">= 0.4"
}
},
- "node_modules/express": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz",
- "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==",
+ "node_modules/get-stream": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
+ "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
+ "dev": true,
"license": "MIT",
- "dependencies": {
- "accepts": "^2.0.0",
- "body-parser": "^2.2.1",
- "content-disposition": "^1.0.0",
- "content-type": "^1.0.5",
- "cookie": "^0.7.1",
- "cookie-signature": "^1.2.1",
- "debug": "^4.4.0",
- "depd": "^2.0.0",
- "encodeurl": "^2.0.0",
- "escape-html": "^1.0.3",
- "etag": "^1.8.1",
- "finalhandler": "^2.1.0",
- "fresh": "^2.0.0",
- "http-errors": "^2.0.0",
- "merge-descriptors": "^2.0.0",
- "mime-types": "^3.0.0",
- "on-finished": "^2.4.1",
- "once": "^1.4.0",
- "parseurl": "^1.3.3",
- "proxy-addr": "^2.0.7",
- "qs": "^6.14.0",
- "range-parser": "^1.2.1",
- "router": "^2.2.0",
- "send": "^1.1.0",
- "serve-static": "^2.2.0",
- "statuses": "^2.0.1",
- "type-is": "^2.0.1",
- "vary": "^1.1.2"
- },
"engines": {
- "node": ">= 18"
+ "node": ">=10"
},
"funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/express"
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/fast-deep-equal": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
- "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/fast-glob": {
- "version": "3.3.3",
- "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
- "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
+ "node_modules/get-symbol-description": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz",
+ "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==",
"dev": true,
"license": "MIT",
"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"
+ "call-bound": "^1.0.3",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.6"
},
"engines": {
- "node": ">=8.6.0"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/fast-glob/node_modules/glob-parent": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
- "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "node_modules/get-tsconfig": {
+ "version": "4.10.1",
+ "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.1.tgz",
+ "integrity": "sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==",
"dev": true,
- "license": "ISC",
+ "license": "MIT",
"dependencies": {
- "is-glob": "^4.0.1"
+ "resolve-pkg-maps": "^1.0.0"
},
- "engines": {
- "node": ">= 6"
+ "funding": {
+ "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1"
}
},
- "node_modules/fast-json-stable-stringify": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
- "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/fast-levenshtein": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
- "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/fast-safe-stringify": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz",
- "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==",
- "license": "MIT"
- },
- "node_modules/fast-uri": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz",
- "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/fastify"
- },
- {
- "type": "opencollective",
- "url": "https://opencollective.com/fastify"
- }
- ],
- "license": "BSD-3-Clause"
- },
- "node_modules/fastq": {
- "version": "1.19.1",
- "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz",
- "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==",
- "dev": true,
+ "node_modules/glob": {
+ "version": "10.5.0",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz",
+ "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==",
"license": "ISC",
"dependencies": {
- "reusify": "^1.0.4"
+ "foreground-child": "^3.1.0",
+ "jackspeak": "^3.1.2",
+ "minimatch": "^9.0.4",
+ "minipass": "^7.1.2",
+ "package-json-from-dist": "^1.0.0",
+ "path-scurry": "^1.11.1"
+ },
+ "bin": {
+ "glob": "dist/esm/bin.mjs"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/fb-watchman": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz",
- "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==",
+ "node_modules/glob-parent": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
"dev": true,
- "license": "Apache-2.0",
+ "license": "ISC",
"dependencies": {
- "bser": "2.1.1"
- }
- },
- "node_modules/fdir": {
- "version": "6.5.0",
- "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
- "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=12.0.0"
- },
- "peerDependencies": {
- "picomatch": "^3 || ^4"
+ "is-glob": "^4.0.3"
},
- "peerDependenciesMeta": {
- "picomatch": {
- "optional": true
- }
+ "engines": {
+ "node": ">=10.13.0"
}
},
- "node_modules/fflate": {
- "version": "0.8.2",
- "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz",
- "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==",
- "license": "MIT"
- },
- "node_modules/file-entry-cache": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz",
- "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==",
+ "node_modules/glob-to-regexp": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
+ "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==",
"dev": true,
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/glob/node_modules/brace-expansion": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz",
+ "integrity": "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==",
"license": "MIT",
"dependencies": {
- "flat-cache": "^4.0.0"
- },
- "engines": {
- "node": ">=16.0.0"
+ "balanced-match": "^1.0.0"
}
},
- "node_modules/file-type": {
- "version": "21.0.0",
- "resolved": "https://registry.npmjs.org/file-type/-/file-type-21.0.0.tgz",
- "integrity": "sha512-ek5xNX2YBYlXhiUXui3D/BXa3LdqPmoLJ7rqEx2bKJ7EAUEfmXgW0Das7Dc6Nr9MvqaOnIqiPV0mZk/r/UpNAg==",
- "license": "MIT",
+ "node_modules/glob/node_modules/minimatch": {
+ "version": "9.0.9",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz",
+ "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==",
+ "license": "ISC",
"dependencies": {
- "@tokenizer/inflate": "^0.2.7",
- "strtok3": "^10.2.2",
- "token-types": "^6.0.0",
- "uint8array-extras": "^1.4.0"
+ "brace-expansion": "^2.0.2"
},
"engines": {
- "node": ">=20"
+ "node": ">=16 || 14 >=14.17"
},
"funding": {
- "url": "https://github.com/sindresorhus/file-type?sponsor=1"
+ "url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/fill-range": {
- "version": "7.1.1",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
- "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
+ "node_modules/globals": {
+ "version": "14.0.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz",
+ "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "to-regex-range": "^5.0.1"
- },
"engines": {
- "node": ">=8"
- }
- },
- "node_modules/finalhandler": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz",
- "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==",
- "license": "MIT",
- "dependencies": {
- "debug": "^4.4.0",
- "encodeurl": "^2.0.0",
- "escape-html": "^1.0.3",
- "on-finished": "^2.4.1",
- "parseurl": "^1.3.3",
- "statuses": "^2.0.1"
+ "node": ">=18"
},
- "engines": {
- "node": ">= 0.8"
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/find-up": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
- "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "node_modules/globalthis": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz",
+ "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "locate-path": "^6.0.0",
- "path-exists": "^4.0.0"
+ "define-properties": "^1.2.1",
+ "gopd": "^1.0.1"
},
"engines": {
- "node": ">=10"
+ "node": ">= 0.4"
},
"funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/fix-dts-default-cjs-exports": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/fix-dts-default-cjs-exports/-/fix-dts-default-cjs-exports-1.0.1.tgz",
- "integrity": "sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==",
- "dev": true,
+ "node_modules/goober": {
+ "version": "2.1.18",
+ "resolved": "https://registry.npmjs.org/goober/-/goober-2.1.18.tgz",
+ "integrity": "sha512-2vFqsaDVIT9Gz7N6kAL++pLpp41l3PfDuusHcjnGLfR6+huZkl6ziX+zgVC3ZxpqWhzH6pyDdGrCeDhMIvwaxw==",
"license": "MIT",
- "dependencies": {
- "magic-string": "^0.30.17",
- "mlly": "^1.7.4",
- "rollup": "^4.34.8"
+ "peerDependencies": {
+ "csstype": "^3.0.10"
}
},
- "node_modules/flat-cache": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz",
- "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==",
- "dev": true,
+ "node_modules/gopd": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
+ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
"license": "MIT",
- "dependencies": {
- "flatted": "^3.2.9",
- "keyv": "^4.5.4"
- },
"engines": {
- "node": ">=16"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/flatted": {
- "version": "3.3.3",
- "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz",
- "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==",
+ "node_modules/graceful-fs": {
+ "version": "4.2.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
"dev": true,
"license": "ISC"
},
- "node_modules/follow-redirects": {
- "version": "1.15.11",
- "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz",
- "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==",
- "funding": [
- {
- "type": "individual",
- "url": "https://github.com/sponsors/RubenVerborgh"
- }
- ],
- "license": "MIT",
- "engines": {
- "node": ">=4.0"
- },
- "peerDependenciesMeta": {
- "debug": {
- "optional": true
- }
- }
+ "node_modules/graphemer": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
+ "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
+ "dev": true,
+ "license": "MIT"
},
- "node_modules/for-each": {
- "version": "0.3.5",
- "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz",
- "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==",
+ "node_modules/handlebars": {
+ "version": "4.7.9",
+ "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.9.tgz",
+ "integrity": "sha512-4E71E0rpOaQuJR2A3xDZ+GM1HyWYv1clR58tC8emQNeQe3RH7MAzSbat+V0wG78LQBo6m6bzSG/L4pBuCsgnUQ==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "is-callable": "^1.2.7"
+ "minimist": "^1.2.5",
+ "neo-async": "^2.6.2",
+ "source-map": "^0.6.1",
+ "wordwrap": "^1.0.0"
+ },
+ "bin": {
+ "handlebars": "bin/handlebars"
},
"engines": {
- "node": ">= 0.4"
+ "node": ">=0.4.7"
},
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "optionalDependencies": {
+ "uglify-js": "^3.1.4"
}
},
- "node_modules/foreground-child": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz",
- "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==",
- "license": "ISC",
- "dependencies": {
- "cross-spawn": "^7.0.6",
- "signal-exit": "^4.0.1"
- },
+ "node_modules/handlebars/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "license": "BSD-3-Clause",
"engines": {
- "node": ">=14"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
+ "node": ">=0.10.0"
}
},
- "node_modules/fork-ts-checker-webpack-plugin": {
- "version": "9.1.0",
- "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-9.1.0.tgz",
- "integrity": "sha512-mpafl89VFPJmhnJ1ssH+8wmM2b50n+Rew5x42NeI2U78aRWgtkEtGmctp7iT16UjquJTjorEmIfESj3DxdW84Q==",
+ "node_modules/has-bigints": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz",
+ "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "@babel/code-frame": "^7.16.7",
- "chalk": "^4.1.2",
- "chokidar": "^4.0.1",
- "cosmiconfig": "^8.2.0",
- "deepmerge": "^4.2.2",
- "fs-extra": "^10.0.0",
- "memfs": "^3.4.1",
- "minimatch": "^3.0.4",
- "node-abort-controller": "^3.0.1",
- "schema-utils": "^3.1.1",
- "semver": "^7.3.5",
- "tapable": "^2.2.1"
- },
"engines": {
- "node": ">=14.21.3"
+ "node": ">= 0.4"
},
- "peerDependencies": {
- "typescript": ">3.6.0",
- "webpack": "^5.11.0"
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/form-data": {
- "version": "4.0.5",
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz",
- "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==",
+ "node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
"license": "MIT",
- "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"
- },
"engines": {
- "node": ">= 6"
+ "node": ">=8"
}
},
- "node_modules/form-data/node_modules/mime-db": {
- "version": "1.52.0",
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
- "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+ "node_modules/has-property-descriptors": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
+ "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
"license": "MIT",
- "engines": {
- "node": ">= 0.6"
+ "dependencies": {
+ "es-define-property": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/form-data/node_modules/mime-types": {
- "version": "2.1.35",
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
- "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "node_modules/has-proto": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz",
+ "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "mime-db": "1.52.0"
+ "dunder-proto": "^1.0.0"
},
"engines": {
- "node": ">= 0.6"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/forwarded": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
- "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
+ "node_modules/has-symbols": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
+ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
"license": "MIT",
"engines": {
- "node": ">= 0.6"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/fraction.js": {
- "version": "4.3.7",
- "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz",
- "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==",
- "dev": true,
+ "node_modules/has-tostringtag": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
+ "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
"license": "MIT",
+ "dependencies": {
+ "has-symbols": "^1.0.3"
+ },
"engines": {
- "node": "*"
+ "node": ">= 0.4"
},
"funding": {
- "type": "patreon",
- "url": "https://github.com/sponsors/rawify"
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/fresh": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz",
- "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==",
+ "node_modules/hash.js": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz",
+ "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==",
"license": "MIT",
- "engines": {
- "node": ">= 0.8"
+ "optional": true,
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "minimalistic-assert": "^1.0.1"
}
},
- "node_modules/fs-extra": {
- "version": "10.1.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
- "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
- "dev": true,
+ "node_modules/hasown": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
"license": "MIT",
"dependencies": {
- "graceful-fs": "^4.2.0",
- "jsonfile": "^6.0.1",
- "universalify": "^2.0.0"
+ "function-bind": "^1.1.2"
},
"engines": {
- "node": ">=12"
+ "node": ">= 0.4"
}
},
- "node_modules/fs-monkey": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.1.0.tgz",
- "integrity": "sha512-QMUezzXWII9EV5aTFXW1UBVUO77wYPpjqIF8/AviUCThNeSYZykpoTixUeaNNBwmCev0AMDWMAni+f8Hxb1IFw==",
- "dev": true,
- "license": "Unlicense"
- },
- "node_modules/fs.realpath": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
- "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
+ "node_modules/hermes-estree": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz",
+ "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==",
"dev": true,
- "license": "ISC"
+ "license": "MIT"
},
- "node_modules/fsevents": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
- "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "node_modules/hermes-parser": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz",
+ "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==",
"dev": true,
- "hasInstallScript": true,
"license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ "dependencies": {
+ "hermes-estree": "0.25.1"
}
},
- "node_modules/function-bind": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
- "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+ "node_modules/hmac-drbg": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
+ "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==",
"license": "MIT",
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "optional": true,
+ "dependencies": {
+ "hash.js": "^1.0.3",
+ "minimalistic-assert": "^1.0.0",
+ "minimalistic-crypto-utils": "^1.0.1"
}
},
- "node_modules/function.prototype.name": {
- "version": "1.1.8",
- "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz",
- "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==",
+ "node_modules/html-escaper": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
+ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==",
"dev": true,
+ "license": "MIT"
+ },
+ "node_modules/http-errors": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
+ "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
"license": "MIT",
"dependencies": {
- "call-bind": "^1.0.8",
- "call-bound": "^1.0.3",
- "define-properties": "^1.2.1",
- "functions-have-names": "^1.2.3",
- "hasown": "^2.0.2",
- "is-callable": "^1.2.7"
+ "depd": "2.0.0",
+ "inherits": "2.0.4",
+ "setprototypeof": "1.2.0",
+ "statuses": "2.0.1",
+ "toidentifier": "1.0.1"
},
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/functions-have-names": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
- "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==",
- "dev": true,
- "license": "MIT",
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": ">= 0.8"
}
},
- "node_modules/generator-function": {
+ "node_modules/http-errors/node_modules/statuses": {
"version": "2.0.1",
- "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz",
- "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==",
- "dev": true,
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
+ "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
"license": "MIT",
"engines": {
- "node": ">= 0.4"
+ "node": ">= 0.8"
}
},
- "node_modules/gensync": {
- "version": "1.0.0-beta.2",
- "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
- "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+ "node_modules/human-signals": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
+ "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
"dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/get-caller-file": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
- "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
- "license": "ISC",
+ "license": "Apache-2.0",
"engines": {
- "node": "6.* || 8.* || >= 10.*"
+ "node": ">=10.17.0"
}
},
- "node_modules/get-intrinsic": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
- "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
+ "node_modules/iconv-lite": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz",
+ "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==",
"license": "MIT",
"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"
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
},
"engines": {
- "node": ">= 0.4"
+ "node": ">=0.10.0"
},
"funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
}
},
- "node_modules/get-package-type": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz",
- "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==",
+ "node_modules/ieee754": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
+ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/ignore": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
+ "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
"dev": true,
"license": "MIT",
"engines": {
- "node": ">=8.0.0"
+ "node": ">= 4"
}
},
- "node_modules/get-proto": {
+ "node_modules/ignore-by-default": {
"version": "1.0.1",
- "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
- "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
+ "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz",
+ "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/immer": {
+ "version": "11.1.4",
+ "resolved": "https://registry.npmjs.org/immer/-/immer-11.1.4.tgz",
+ "integrity": "sha512-XREFCPo6ksxVzP4E0ekD5aMdf8WMwmdNaz6vuvxgI40UaEiu6q3p8X52aU6GdyvLY3XXX/8R7JOTXStz/nBbRw==",
"license": "MIT",
- "dependencies": {
- "dunder-proto": "^1.0.1",
- "es-object-atoms": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
+ "optional": true,
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/immer"
}
},
- "node_modules/get-stream": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
- "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
+ "node_modules/import-fresh": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz",
+ "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==",
"dev": true,
"license": "MIT",
+ "dependencies": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ },
"engines": {
- "node": ">=10"
+ "node": ">=6"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/get-symbol-description": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz",
- "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==",
+ "node_modules/import-local": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz",
+ "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "call-bound": "^1.0.3",
- "es-errors": "^1.3.0",
- "get-intrinsic": "^1.2.6"
+ "pkg-dir": "^4.2.0",
+ "resolve-cwd": "^3.0.0"
+ },
+ "bin": {
+ "import-local-fixture": "fixtures/cli.js"
},
"engines": {
- "node": ">= 0.4"
+ "node": ">=8"
},
"funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/get-tsconfig": {
- "version": "4.10.1",
- "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.1.tgz",
- "integrity": "sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==",
+ "node_modules/imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "resolve-pkg-maps": "^1.0.0"
- },
- "funding": {
- "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1"
+ "engines": {
+ "node": ">=0.8.19"
}
},
- "node_modules/glob": {
- "version": "10.5.0",
- "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz",
- "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==",
+ "node_modules/inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+ "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.",
+ "dev": true,
"license": "ISC",
"dependencies": {
- "foreground-child": "^3.1.0",
- "jackspeak": "^3.1.2",
- "minimatch": "^9.0.4",
- "minipass": "^7.1.2",
- "package-json-from-dist": "^1.0.0",
- "path-scurry": "^1.11.1"
- },
- "bin": {
- "glob": "dist/esm/bin.mjs"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
+ "once": "^1.3.0",
+ "wrappy": "1"
}
},
- "node_modules/glob-parent": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
- "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "license": "ISC"
+ },
+ "node_modules/internal-slot": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz",
+ "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==",
"dev": true,
- "license": "ISC",
+ "license": "MIT",
"dependencies": {
- "is-glob": "^4.0.3"
+ "es-errors": "^1.3.0",
+ "hasown": "^2.0.2",
+ "side-channel": "^1.1.0"
},
"engines": {
- "node": ">=10.13.0"
+ "node": ">= 0.4"
}
},
- "node_modules/glob-to-regexp": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
- "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==",
- "dev": true,
- "license": "BSD-2-Clause"
- },
- "node_modules/glob/node_modules/brace-expansion": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
- "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
+ "node_modules/ipaddr.js": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
+ "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
"license": "MIT",
- "dependencies": {
- "balanced-match": "^1.0.0"
+ "engines": {
+ "node": ">= 0.10"
}
},
- "node_modules/glob/node_modules/minimatch": {
- "version": "9.0.9",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz",
- "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==",
- "license": "ISC",
+ "node_modules/is-array-buffer": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz",
+ "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "brace-expansion": "^2.0.2"
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "get-intrinsic": "^1.2.6"
},
"engines": {
- "node": ">=16 || 14 >=14.17"
+ "node": ">= 0.4"
},
"funding": {
- "url": "https://github.com/sponsors/isaacs"
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/globals": {
- "version": "14.0.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz",
- "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==",
+ "node_modules/is-arrayish": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+ "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
"dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=18"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
+ "license": "MIT"
},
- "node_modules/globalthis": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz",
- "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==",
+ "node_modules/is-async-function": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz",
+ "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "define-properties": "^1.2.1",
- "gopd": "^1.0.1"
+ "async-function": "^1.0.0",
+ "call-bound": "^1.0.3",
+ "get-proto": "^1.0.1",
+ "has-tostringtag": "^1.0.2",
+ "safe-regex-test": "^1.1.0"
},
"engines": {
"node": ">= 0.4"
@@ -10477,20 +10018,15 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/goober": {
- "version": "2.1.18",
- "resolved": "https://registry.npmjs.org/goober/-/goober-2.1.18.tgz",
- "integrity": "sha512-2vFqsaDVIT9Gz7N6kAL++pLpp41l3PfDuusHcjnGLfR6+huZkl6ziX+zgVC3ZxpqWhzH6pyDdGrCeDhMIvwaxw==",
- "license": "MIT",
- "peerDependencies": {
- "csstype": "^3.0.10"
- }
- },
- "node_modules/gopd": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
- "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
+ "node_modules/is-bigint": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz",
+ "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==",
+ "dev": true,
"license": "MIT",
+ "dependencies": {
+ "has-bigints": "^1.0.2"
+ },
"engines": {
"node": ">= 0.4"
},
@@ -10498,57 +10034,50 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/graceful-fs": {
- "version": "4.2.11",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
- "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/graphemer": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
- "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
+ "node_modules/is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
"dev": true,
- "license": "MIT"
+ "license": "MIT",
+ "dependencies": {
+ "binary-extensions": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
},
- "node_modules/handlebars": {
- "version": "4.7.8",
- "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz",
- "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==",
+ "node_modules/is-boolean-object": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz",
+ "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==",
"dev": true,
"license": "MIT",
"dependencies": {
- "minimist": "^1.2.5",
- "neo-async": "^2.6.2",
- "source-map": "^0.6.1",
- "wordwrap": "^1.0.0"
- },
- "bin": {
- "handlebars": "bin/handlebars"
+ "call-bound": "^1.0.3",
+ "has-tostringtag": "^1.0.2"
},
"engines": {
- "node": ">=0.4.7"
+ "node": ">= 0.4"
},
- "optionalDependencies": {
- "uglify-js": "^3.1.4"
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/handlebars/node_modules/source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "node_modules/is-bun-module": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-2.0.0.tgz",
+ "integrity": "sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==",
"dev": true,
- "license": "BSD-3-Clause",
- "engines": {
- "node": ">=0.10.0"
+ "license": "MIT",
+ "dependencies": {
+ "semver": "^7.7.1"
}
},
- "node_modules/has-bigints": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz",
- "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==",
- "dev": true,
+ "node_modules/is-callable": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz",
+ "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==",
"license": "MIT",
"engines": {
"node": ">= 0.4"
@@ -10557,36 +10086,32 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "node_modules/is-core-module": {
+ "version": "2.16.1",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz",
+ "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==",
"dev": true,
"license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/has-property-descriptors": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
- "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
- "license": "MIT",
"dependencies": {
- "es-define-property": "^1.0.0"
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/has-proto": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz",
- "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==",
+ "node_modules/is-data-view": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz",
+ "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "dunder-proto": "^1.0.0"
+ "call-bound": "^1.0.2",
+ "get-intrinsic": "^1.2.6",
+ "is-typed-array": "^1.1.13"
},
"engines": {
"node": ">= 0.4"
@@ -10595,11 +10120,16 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/has-symbols": {
+ "node_modules/is-date-object": {
"version": "1.1.0",
- "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
- "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
+ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz",
+ "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==",
+ "dev": true,
"license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "has-tostringtag": "^1.0.2"
+ },
"engines": {
"node": ">= 0.4"
},
@@ -10607,13 +10137,24 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/has-tostringtag": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
- "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-finalizationregistry": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz",
+ "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "has-symbols": "^1.0.3"
+ "call-bound": "^1.0.3"
},
"engines": {
"node": ">= 0.4"
@@ -10622,229 +10163,148 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/hasown": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
- "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+ "node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
"license": "MIT",
- "dependencies": {
- "function-bind": "^1.1.2"
- },
"engines": {
- "node": ">= 0.4"
+ "node": ">=8"
}
},
- "node_modules/hermes-estree": {
- "version": "0.25.1",
- "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz",
- "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==",
+ "node_modules/is-generator-fn": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz",
+ "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==",
"dev": true,
- "license": "MIT"
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
},
- "node_modules/hermes-parser": {
- "version": "0.25.1",
- "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz",
- "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==",
+ "node_modules/is-generator-function": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz",
+ "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "hermes-estree": "0.25.1"
- }
- },
- "node_modules/html-escaper": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
- "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/http-errors": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
- "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
- "license": "MIT",
- "dependencies": {
- "depd": "2.0.0",
- "inherits": "2.0.4",
- "setprototypeof": "1.2.0",
- "statuses": "2.0.1",
- "toidentifier": "1.0.1"
+ "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"
},
"engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/http-errors/node_modules/statuses": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
- "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.8"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/human-signals": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
- "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
"dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": ">=10.17.0"
- }
- },
- "node_modules/iconv-lite": {
- "version": "0.7.0",
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz",
- "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==",
"license": "MIT",
"dependencies": {
- "safer-buffer": ">= 2.1.2 < 3.0.0"
+ "is-extglob": "^2.1.1"
},
"engines": {
"node": ">=0.10.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/express"
}
},
- "node_modules/ieee754": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
- "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
- "license": "BSD-3-Clause"
- },
- "node_modules/ignore": {
- "version": "5.3.2",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
- "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
+ "node_modules/is-interactive": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz",
+ "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==",
"dev": true,
"license": "MIT",
"engines": {
- "node": ">= 4"
+ "node": ">=8"
}
},
- "node_modules/ignore-by-default": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz",
- "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/import-fresh": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz",
- "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==",
+ "node_modules/is-map": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz",
+ "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "parent-module": "^1.0.0",
- "resolve-from": "^4.0.0"
- },
"engines": {
- "node": ">=6"
+ "node": ">= 0.4"
},
"funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/import-local": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz",
- "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==",
+ "node_modules/is-negative-zero": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz",
+ "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "pkg-dir": "^4.2.0",
- "resolve-cwd": "^3.0.0"
- },
- "bin": {
- "import-local-fixture": "fixtures/cli.js"
- },
"engines": {
- "node": ">=8"
+ "node": ">= 0.4"
},
"funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/imurmurhash": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
- "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
"dev": true,
"license": "MIT",
"engines": {
- "node": ">=0.8.19"
- }
- },
- "node_modules/inflight": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
- "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
- "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "once": "^1.3.0",
- "wrappy": "1"
+ "node": ">=0.12.0"
}
},
- "node_modules/inherits": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
- "license": "ISC"
- },
- "node_modules/internal-slot": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz",
- "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==",
+ "node_modules/is-number-object": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz",
+ "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "es-errors": "^1.3.0",
- "hasown": "^2.0.2",
- "side-channel": "^1.1.0"
+ "call-bound": "^1.0.3",
+ "has-tostringtag": "^1.0.2"
},
"engines": {
"node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/ipaddr.js": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
- "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
+ "node_modules/is-path-inside": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
+ "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
+ "dev": true,
"license": "MIT",
"engines": {
- "node": ">= 0.10"
+ "node": ">=8"
}
},
- "node_modules/is-array-buffer": {
- "version": "3.0.5",
- "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz",
- "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==",
+ "node_modules/is-promise": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz",
+ "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==",
+ "license": "MIT"
+ },
+ "node_modules/is-regex": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz",
+ "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==",
"dev": true,
"license": "MIT",
"dependencies": {
- "call-bind": "^1.0.8",
- "call-bound": "^1.0.3",
- "get-intrinsic": "^1.2.6"
+ "call-bound": "^1.0.2",
+ "gopd": "^1.2.0",
+ "has-tostringtag": "^1.0.2",
+ "hasown": "^2.0.2"
},
"engines": {
"node": ">= 0.4"
@@ -10853,26 +10313,12 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/is-arrayish": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
- "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/is-async-function": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz",
- "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==",
+ "node_modules/is-set": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz",
+ "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "async-function": "^1.0.0",
- "call-bound": "^1.0.3",
- "get-proto": "^1.0.1",
- "has-tostringtag": "^1.0.2",
- "safe-regex-test": "^1.1.0"
- },
"engines": {
"node": ">= 0.4"
},
@@ -10880,14 +10326,14 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/is-bigint": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz",
- "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==",
+ "node_modules/is-shared-array-buffer": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz",
+ "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==",
"dev": true,
"license": "MIT",
"dependencies": {
- "has-bigints": "^1.0.2"
+ "call-bound": "^1.0.3"
},
"engines": {
"node": ">= 0.4"
@@ -10896,23 +10342,23 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/is-binary-path": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
- "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "node_modules/is-stream": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
+ "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "binary-extensions": "^2.0.0"
- },
"engines": {
"node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/is-boolean-object": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz",
- "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==",
+ "node_modules/is-string": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz",
+ "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -10926,21 +10372,17 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/is-bun-module": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-2.0.0.tgz",
- "integrity": "sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==",
+ "node_modules/is-symbol": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz",
+ "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==",
"dev": true,
"license": "MIT",
"dependencies": {
- "semver": "^7.7.1"
- }
- },
- "node_modules/is-callable": {
- "version": "1.2.7",
- "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz",
- "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==",
- "license": "MIT",
+ "call-bound": "^1.0.2",
+ "has-symbols": "^1.1.0",
+ "safe-regex-test": "^1.1.0"
+ },
"engines": {
"node": ">= 0.4"
},
@@ -10948,14 +10390,13 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/is-core-module": {
- "version": "2.16.1",
- "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz",
- "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==",
- "dev": true,
+ "node_modules/is-typed-array": {
+ "version": "1.1.15",
+ "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz",
+ "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==",
"license": "MIT",
"dependencies": {
- "hasown": "^2.0.2"
+ "which-typed-array": "^1.1.16"
},
"engines": {
"node": ">= 0.4"
@@ -10964,34 +10405,25 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/is-data-view": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz",
- "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==",
+ "node_modules/is-unicode-supported": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
+ "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "call-bound": "^1.0.2",
- "get-intrinsic": "^1.2.6",
- "is-typed-array": "^1.1.13"
- },
"engines": {
- "node": ">= 0.4"
+ "node": ">=10"
},
"funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/is-date-object": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz",
- "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==",
+ "node_modules/is-weakmap": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz",
+ "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "call-bound": "^1.0.2",
- "has-tostringtag": "^1.0.2"
- },
"engines": {
"node": ">= 0.4"
},
@@ -10999,24 +10431,31 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/is-extglob": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
- "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "node_modules/is-weakref": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz",
+ "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==",
"dev": true,
"license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3"
+ },
"engines": {
- "node": ">=0.10.0"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/is-finalizationregistry": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz",
- "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==",
+ "node_modules/is-weakset": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz",
+ "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "call-bound": "^1.0.3"
+ "call-bound": "^1.0.3",
+ "get-intrinsic": "^1.2.6"
},
"engines": {
"node": ">= 0.4"
@@ -11025,507 +10464,522 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/is-fullwidth-code-point": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
- "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "node_modules/isarray": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
+ "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
+ "license": "MIT"
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "license": "ISC"
+ },
+ "node_modules/isows": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/isows/-/isows-1.0.7.tgz",
+ "integrity": "sha512-I1fSfDCZL5P0v33sVqeTDSpcstAg/N+wF5HS033mogOVIp4B+oHC7oOCsA3axAbBSGTJ8QubbNmnIRN/h8U7hg==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/wevm"
+ }
+ ],
"license": "MIT",
- "engines": {
- "node": ">=8"
+ "peerDependencies": {
+ "ws": "*"
}
},
- "node_modules/is-generator-fn": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz",
- "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==",
+ "node_modules/istanbul-lib-coverage": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz",
+ "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==",
"dev": true,
- "license": "MIT",
+ "license": "BSD-3-Clause",
"engines": {
- "node": ">=6"
+ "node": ">=8"
}
},
- "node_modules/is-generator-function": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz",
- "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==",
+ "node_modules/istanbul-lib-instrument": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz",
+ "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==",
"dev": true,
- "license": "MIT",
+ "license": "BSD-3-Clause",
"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"
+ "@babel/core": "^7.23.9",
+ "@babel/parser": "^7.23.9",
+ "@istanbuljs/schema": "^0.1.3",
+ "istanbul-lib-coverage": "^3.2.0",
+ "semver": "^7.5.4"
},
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": ">=10"
}
},
- "node_modules/is-glob": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
- "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "node_modules/istanbul-lib-report": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz",
+ "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==",
"dev": true,
- "license": "MIT",
+ "license": "BSD-3-Clause",
"dependencies": {
- "is-extglob": "^2.1.1"
+ "istanbul-lib-coverage": "^3.0.0",
+ "make-dir": "^4.0.0",
+ "supports-color": "^7.1.0"
},
"engines": {
- "node": ">=0.10.0"
+ "node": ">=10"
}
},
- "node_modules/is-interactive": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz",
- "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==",
+ "node_modules/istanbul-lib-source-maps": {
+ "version": "5.0.6",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz",
+ "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==",
"dev": true,
- "license": "MIT",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@jridgewell/trace-mapping": "^0.3.23",
+ "debug": "^4.1.1",
+ "istanbul-lib-coverage": "^3.0.0"
+ },
"engines": {
- "node": ">=8"
+ "node": ">=10"
}
},
- "node_modules/is-map": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz",
- "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==",
+ "node_modules/istanbul-reports": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz",
+ "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==",
"dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "html-escaper": "^2.0.0",
+ "istanbul-lib-report": "^3.0.0"
},
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-negative-zero": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz",
- "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==",
- "dev": true,
- "license": "MIT",
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": ">=8"
}
},
- "node_modules/is-number": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
- "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
- "dev": true,
- "license": "MIT",
+ "node_modules/iterare": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/iterare/-/iterare-1.2.1.tgz",
+ "integrity": "sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q==",
+ "license": "ISC",
"engines": {
- "node": ">=0.12.0"
+ "node": ">=6"
}
},
- "node_modules/is-number-object": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz",
- "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==",
+ "node_modules/iterator.prototype": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz",
+ "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==",
"dev": true,
"license": "MIT",
"dependencies": {
- "call-bound": "^1.0.3",
- "has-tostringtag": "^1.0.2"
+ "define-data-property": "^1.1.4",
+ "es-object-atoms": "^1.0.0",
+ "get-intrinsic": "^1.2.6",
+ "get-proto": "^1.0.0",
+ "has-symbols": "^1.1.0",
+ "set-function-name": "^2.0.2"
},
"engines": {
"node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/is-path-inside": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
- "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
+ "node_modules/jackspeak": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz",
+ "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==",
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "@isaacs/cliui": "^8.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ },
+ "optionalDependencies": {
+ "@pkgjs/parseargs": "^0.11.0"
}
},
- "node_modules/is-promise": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz",
- "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==",
- "license": "MIT"
- },
- "node_modules/is-regex": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz",
- "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==",
+ "node_modules/jest": {
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/jest/-/jest-30.2.0.tgz",
+ "integrity": "sha512-F26gjC0yWN8uAA5m5Ss8ZQf5nDHWGlN/xWZIh8S5SRbsEKBovwZhxGd6LJlbZYxBgCYOtreSUyb8hpXyGC5O4A==",
"dev": true,
"license": "MIT",
"dependencies": {
- "call-bound": "^1.0.2",
- "gopd": "^1.2.0",
- "has-tostringtag": "^1.0.2",
- "hasown": "^2.0.2"
+ "@jest/core": "30.2.0",
+ "@jest/types": "30.2.0",
+ "import-local": "^3.2.0",
+ "jest-cli": "30.2.0"
+ },
+ "bin": {
+ "jest": "bin/jest.js"
},
"engines": {
- "node": ">= 0.4"
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
},
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "peerDependencies": {
+ "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
+ },
+ "peerDependenciesMeta": {
+ "node-notifier": {
+ "optional": true
+ }
}
},
- "node_modules/is-set": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz",
- "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==",
+ "node_modules/jest-changed-files": {
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-30.2.0.tgz",
+ "integrity": "sha512-L8lR1ChrRnSdfeOvTrwZMlnWV8G/LLjQ0nG9MBclwWZidA2N5FviRki0Bvh20WRMOX31/JYvzdqTJrk5oBdydQ==",
"dev": true,
"license": "MIT",
- "engines": {
- "node": ">= 0.4"
+ "dependencies": {
+ "execa": "^5.1.1",
+ "jest-util": "30.2.0",
+ "p-limit": "^3.1.0"
},
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
}
},
- "node_modules/is-shared-array-buffer": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz",
- "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==",
+ "node_modules/jest-circus": {
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-30.2.0.tgz",
+ "integrity": "sha512-Fh0096NC3ZkFx05EP2OXCxJAREVxj1BcW/i6EWqqymcgYKWjyyDpral3fMxVcHXg6oZM7iULer9wGRFvfpl+Tg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "call-bound": "^1.0.3"
+ "@jest/environment": "30.2.0",
+ "@jest/expect": "30.2.0",
+ "@jest/test-result": "30.2.0",
+ "@jest/types": "30.2.0",
+ "@types/node": "*",
+ "chalk": "^4.1.2",
+ "co": "^4.6.0",
+ "dedent": "^1.6.0",
+ "is-generator-fn": "^2.1.0",
+ "jest-each": "30.2.0",
+ "jest-matcher-utils": "30.2.0",
+ "jest-message-util": "30.2.0",
+ "jest-runtime": "30.2.0",
+ "jest-snapshot": "30.2.0",
+ "jest-util": "30.2.0",
+ "p-limit": "^3.1.0",
+ "pretty-format": "30.2.0",
+ "pure-rand": "^7.0.0",
+ "slash": "^3.0.0",
+ "stack-utils": "^2.0.6"
},
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
}
},
- "node_modules/is-stream": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
- "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
+ "node_modules/jest-circus/node_modules/ansi-styles": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
"dev": true,
"license": "MIT",
"engines": {
- "node": ">=8"
+ "node": ">=10"
},
"funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
- "node_modules/is-string": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz",
- "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==",
+ "node_modules/jest-circus/node_modules/pretty-format": {
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz",
+ "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "call-bound": "^1.0.3",
- "has-tostringtag": "^1.0.2"
+ "@jest/schemas": "30.0.5",
+ "ansi-styles": "^5.2.0",
+ "react-is": "^18.3.1"
},
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
}
},
- "node_modules/is-symbol": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz",
- "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==",
+ "node_modules/jest-cli": {
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-30.2.0.tgz",
+ "integrity": "sha512-Os9ukIvADX/A9sLt6Zse3+nmHtHaE6hqOsjQtNiugFTbKRHYIYtZXNGNK9NChseXy7djFPjndX1tL0sCTlfpAA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "call-bound": "^1.0.2",
- "has-symbols": "^1.1.0",
- "safe-regex-test": "^1.1.0"
+ "@jest/core": "30.2.0",
+ "@jest/test-result": "30.2.0",
+ "@jest/types": "30.2.0",
+ "chalk": "^4.1.2",
+ "exit-x": "^0.2.2",
+ "import-local": "^3.2.0",
+ "jest-config": "30.2.0",
+ "jest-util": "30.2.0",
+ "jest-validate": "30.2.0",
+ "yargs": "^17.7.2"
+ },
+ "bin": {
+ "jest": "bin/jest.js"
},
"engines": {
- "node": ">= 0.4"
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
},
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "peerDependencies": {
+ "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
+ },
+ "peerDependenciesMeta": {
+ "node-notifier": {
+ "optional": true
+ }
}
},
- "node_modules/is-typed-array": {
- "version": "1.1.15",
- "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz",
- "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==",
+ "node_modules/jest-config": {
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-30.2.0.tgz",
+ "integrity": "sha512-g4WkyzFQVWHtu6uqGmQR4CQxz/CH3yDSlhzXMWzNjDx843gYjReZnMRanjRCq5XZFuQrGDxgUaiYWE8BRfVckA==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "which-typed-array": "^1.1.16"
+ "@babel/core": "^7.27.4",
+ "@jest/get-type": "30.1.0",
+ "@jest/pattern": "30.0.1",
+ "@jest/test-sequencer": "30.2.0",
+ "@jest/types": "30.2.0",
+ "babel-jest": "30.2.0",
+ "chalk": "^4.1.2",
+ "ci-info": "^4.2.0",
+ "deepmerge": "^4.3.1",
+ "glob": "^10.3.10",
+ "graceful-fs": "^4.2.11",
+ "jest-circus": "30.2.0",
+ "jest-docblock": "30.2.0",
+ "jest-environment-node": "30.2.0",
+ "jest-regex-util": "30.0.1",
+ "jest-resolve": "30.2.0",
+ "jest-runner": "30.2.0",
+ "jest-util": "30.2.0",
+ "jest-validate": "30.2.0",
+ "micromatch": "^4.0.8",
+ "parse-json": "^5.2.0",
+ "pretty-format": "30.2.0",
+ "slash": "^3.0.0",
+ "strip-json-comments": "^3.1.1"
},
"engines": {
- "node": ">= 0.4"
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
},
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "peerDependencies": {
+ "@types/node": "*",
+ "esbuild-register": ">=3.4.0",
+ "ts-node": ">=9.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ },
+ "esbuild-register": {
+ "optional": true
+ },
+ "ts-node": {
+ "optional": true
+ }
}
},
- "node_modules/is-unicode-supported": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
- "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
+ "node_modules/jest-config/node_modules/ansi-styles": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=10"
},
"funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
- "node_modules/is-weakmap": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz",
- "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==",
+ "node_modules/jest-config/node_modules/pretty-format": {
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz",
+ "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==",
"dev": true,
"license": "MIT",
- "engines": {
- "node": ">= 0.4"
+ "dependencies": {
+ "@jest/schemas": "30.0.5",
+ "ansi-styles": "^5.2.0",
+ "react-is": "^18.3.1"
},
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
}
},
- "node_modules/is-weakref": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz",
- "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==",
+ "node_modules/jest-diff": {
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.2.0.tgz",
+ "integrity": "sha512-dQHFo3Pt4/NLlG5z4PxZ/3yZTZ1C7s9hveiOj+GCN+uT109NC2QgsoVZsVOAvbJ3RgKkvyLGXZV9+piDpWbm6A==",
"dev": true,
"license": "MIT",
"dependencies": {
- "call-bound": "^1.0.3"
+ "@jest/diff-sequences": "30.0.1",
+ "@jest/get-type": "30.1.0",
+ "chalk": "^4.1.2",
+ "pretty-format": "30.2.0"
},
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
}
},
- "node_modules/is-weakset": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz",
- "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==",
+ "node_modules/jest-diff/node_modules/ansi-styles": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "call-bound": "^1.0.3",
- "get-intrinsic": "^1.2.6"
- },
"engines": {
- "node": ">= 0.4"
+ "node": ">=10"
},
"funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/isarray": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
- "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
- "license": "MIT"
- },
- "node_modules/isexe": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
- "license": "ISC"
- },
- "node_modules/istanbul-lib-coverage": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz",
- "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==",
- "dev": true,
- "license": "BSD-3-Clause",
- "engines": {
- "node": ">=8"
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
- "node_modules/istanbul-lib-instrument": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz",
- "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==",
+ "node_modules/jest-diff/node_modules/pretty-format": {
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz",
+ "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==",
"dev": true,
- "license": "BSD-3-Clause",
+ "license": "MIT",
"dependencies": {
- "@babel/core": "^7.23.9",
- "@babel/parser": "^7.23.9",
- "@istanbuljs/schema": "^0.1.3",
- "istanbul-lib-coverage": "^3.2.0",
- "semver": "^7.5.4"
+ "@jest/schemas": "30.0.5",
+ "ansi-styles": "^5.2.0",
+ "react-is": "^18.3.1"
},
"engines": {
- "node": ">=10"
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
}
},
- "node_modules/istanbul-lib-report": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz",
- "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==",
+ "node_modules/jest-docblock": {
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-30.2.0.tgz",
+ "integrity": "sha512-tR/FFgZKS1CXluOQzZvNH3+0z9jXr3ldGSD8bhyuxvlVUwbeLOGynkunvlTMxchC5urrKndYiwCFC0DLVjpOCA==",
"dev": true,
- "license": "BSD-3-Clause",
+ "license": "MIT",
"dependencies": {
- "istanbul-lib-coverage": "^3.0.0",
- "make-dir": "^4.0.0",
- "supports-color": "^7.1.0"
+ "detect-newline": "^3.1.0"
},
"engines": {
- "node": ">=10"
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
}
},
- "node_modules/istanbul-lib-source-maps": {
- "version": "5.0.6",
- "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz",
- "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==",
+ "node_modules/jest-each": {
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-30.2.0.tgz",
+ "integrity": "sha512-lpWlJlM7bCUf1mfmuqTA8+j2lNURW9eNafOy99knBM01i5CQeY5UH1vZjgT9071nDJac1M4XsbyI44oNOdhlDQ==",
"dev": true,
- "license": "BSD-3-Clause",
+ "license": "MIT",
"dependencies": {
- "@jridgewell/trace-mapping": "^0.3.23",
- "debug": "^4.1.1",
- "istanbul-lib-coverage": "^3.0.0"
+ "@jest/get-type": "30.1.0",
+ "@jest/types": "30.2.0",
+ "chalk": "^4.1.2",
+ "jest-util": "30.2.0",
+ "pretty-format": "30.2.0"
},
"engines": {
- "node": ">=10"
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
}
},
- "node_modules/istanbul-reports": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz",
- "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==",
+ "node_modules/jest-each/node_modules/ansi-styles": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
"dev": true,
- "license": "BSD-3-Clause",
- "dependencies": {
- "html-escaper": "^2.0.0",
- "istanbul-lib-report": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/iterare": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/iterare/-/iterare-1.2.1.tgz",
- "integrity": "sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q==",
- "license": "ISC",
+ "license": "MIT",
"engines": {
- "node": ">=6"
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
- "node_modules/iterator.prototype": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz",
- "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==",
+ "node_modules/jest-each/node_modules/pretty-format": {
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz",
+ "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "define-data-property": "^1.1.4",
- "es-object-atoms": "^1.0.0",
- "get-intrinsic": "^1.2.6",
- "get-proto": "^1.0.0",
- "has-symbols": "^1.1.0",
- "set-function-name": "^2.0.2"
+ "@jest/schemas": "30.0.5",
+ "ansi-styles": "^5.2.0",
+ "react-is": "^18.3.1"
},
"engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/jackspeak": {
- "version": "3.4.3",
- "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz",
- "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==",
- "license": "BlueOak-1.0.0",
- "dependencies": {
- "@isaacs/cliui": "^8.0.2"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- },
- "optionalDependencies": {
- "@pkgjs/parseargs": "^0.11.0"
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
}
},
- "node_modules/jest": {
+ "node_modules/jest-environment-node": {
"version": "30.2.0",
- "resolved": "https://registry.npmjs.org/jest/-/jest-30.2.0.tgz",
- "integrity": "sha512-F26gjC0yWN8uAA5m5Ss8ZQf5nDHWGlN/xWZIh8S5SRbsEKBovwZhxGd6LJlbZYxBgCYOtreSUyb8hpXyGC5O4A==",
+ "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-30.2.0.tgz",
+ "integrity": "sha512-ElU8v92QJ9UrYsKrxDIKCxu6PfNj4Hdcktcn0JX12zqNdqWHB0N+hwOnnBBXvjLd2vApZtuLUGs1QSY+MsXoNA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@jest/core": "30.2.0",
+ "@jest/environment": "30.2.0",
+ "@jest/fake-timers": "30.2.0",
"@jest/types": "30.2.0",
- "import-local": "^3.2.0",
- "jest-cli": "30.2.0"
- },
- "bin": {
- "jest": "bin/jest.js"
+ "@types/node": "*",
+ "jest-mock": "30.2.0",
+ "jest-util": "30.2.0",
+ "jest-validate": "30.2.0"
},
"engines": {
"node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
- },
- "peerDependencies": {
- "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
- },
- "peerDependenciesMeta": {
- "node-notifier": {
- "optional": true
- }
}
},
- "node_modules/jest-changed-files": {
+ "node_modules/jest-haste-map": {
"version": "30.2.0",
- "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-30.2.0.tgz",
- "integrity": "sha512-L8lR1ChrRnSdfeOvTrwZMlnWV8G/LLjQ0nG9MBclwWZidA2N5FviRki0Bvh20WRMOX31/JYvzdqTJrk5oBdydQ==",
+ "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-30.2.0.tgz",
+ "integrity": "sha512-sQA/jCb9kNt+neM0anSj6eZhLZUIhQgwDt7cPGjumgLM4rXsfb9kpnlacmvZz3Q5tb80nS+oG/if+NBKrHC+Xw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "execa": "^5.1.1",
+ "@jest/types": "30.2.0",
+ "@types/node": "*",
+ "anymatch": "^3.1.3",
+ "fb-watchman": "^2.0.2",
+ "graceful-fs": "^4.2.11",
+ "jest-regex-util": "30.0.1",
"jest-util": "30.2.0",
- "p-limit": "^3.1.0"
+ "jest-worker": "30.2.0",
+ "micromatch": "^4.0.8",
+ "walker": "^1.0.8"
},
"engines": {
"node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "^2.3.3"
}
},
- "node_modules/jest-circus": {
+ "node_modules/jest-leak-detector": {
"version": "30.2.0",
- "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-30.2.0.tgz",
- "integrity": "sha512-Fh0096NC3ZkFx05EP2OXCxJAREVxj1BcW/i6EWqqymcgYKWjyyDpral3fMxVcHXg6oZM7iULer9wGRFvfpl+Tg==",
+ "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-30.2.0.tgz",
+ "integrity": "sha512-M6jKAjyzjHG0SrQgwhgZGy9hFazcudwCNovY/9HPIicmNSBuockPSedAP9vlPK6ONFJ1zfyH/M2/YYJxOz5cdQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@jest/environment": "30.2.0",
- "@jest/expect": "30.2.0",
- "@jest/test-result": "30.2.0",
- "@jest/types": "30.2.0",
- "@types/node": "*",
- "chalk": "^4.1.2",
- "co": "^4.6.0",
- "dedent": "^1.6.0",
- "is-generator-fn": "^2.1.0",
- "jest-each": "30.2.0",
- "jest-matcher-utils": "30.2.0",
- "jest-message-util": "30.2.0",
- "jest-runtime": "30.2.0",
- "jest-snapshot": "30.2.0",
- "jest-util": "30.2.0",
- "p-limit": "^3.1.0",
- "pretty-format": "30.2.0",
- "pure-rand": "^7.0.0",
- "slash": "^3.0.0",
- "stack-utils": "^2.0.6"
+ "@jest/get-type": "30.1.0",
+ "pretty-format": "30.2.0"
},
"engines": {
"node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
}
},
- "node_modules/jest-circus/node_modules/ansi-styles": {
+ "node_modules/jest-leak-detector/node_modules/ansi-styles": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
"integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
@@ -11538,7 +10992,7 @@
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
- "node_modules/jest-circus/node_modules/pretty-format": {
+ "node_modules/jest-leak-detector/node_modules/pretty-format": {
"version": "30.2.0",
"resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz",
"integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==",
@@ -11553,92 +11007,23 @@
"node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
}
},
- "node_modules/jest-cli": {
+ "node_modules/jest-matcher-utils": {
"version": "30.2.0",
- "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-30.2.0.tgz",
- "integrity": "sha512-Os9ukIvADX/A9sLt6Zse3+nmHtHaE6hqOsjQtNiugFTbKRHYIYtZXNGNK9NChseXy7djFPjndX1tL0sCTlfpAA==",
+ "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-30.2.0.tgz",
+ "integrity": "sha512-dQ94Nq4dbzmUWkQ0ANAWS9tBRfqCrn0bV9AMYdOi/MHW726xn7eQmMeRTpX2ViC00bpNaWXq+7o4lIQ3AX13Hg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@jest/core": "30.2.0",
- "@jest/test-result": "30.2.0",
- "@jest/types": "30.2.0",
+ "@jest/get-type": "30.1.0",
"chalk": "^4.1.2",
- "exit-x": "^0.2.2",
- "import-local": "^3.2.0",
- "jest-config": "30.2.0",
- "jest-util": "30.2.0",
- "jest-validate": "30.2.0",
- "yargs": "^17.7.2"
- },
- "bin": {
- "jest": "bin/jest.js"
- },
- "engines": {
- "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
- },
- "peerDependencies": {
- "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
- },
- "peerDependenciesMeta": {
- "node-notifier": {
- "optional": true
- }
- }
- },
- "node_modules/jest-config": {
- "version": "30.2.0",
- "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-30.2.0.tgz",
- "integrity": "sha512-g4WkyzFQVWHtu6uqGmQR4CQxz/CH3yDSlhzXMWzNjDx843gYjReZnMRanjRCq5XZFuQrGDxgUaiYWE8BRfVckA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/core": "^7.27.4",
- "@jest/get-type": "30.1.0",
- "@jest/pattern": "30.0.1",
- "@jest/test-sequencer": "30.2.0",
- "@jest/types": "30.2.0",
- "babel-jest": "30.2.0",
- "chalk": "^4.1.2",
- "ci-info": "^4.2.0",
- "deepmerge": "^4.3.1",
- "glob": "^10.3.10",
- "graceful-fs": "^4.2.11",
- "jest-circus": "30.2.0",
- "jest-docblock": "30.2.0",
- "jest-environment-node": "30.2.0",
- "jest-regex-util": "30.0.1",
- "jest-resolve": "30.2.0",
- "jest-runner": "30.2.0",
- "jest-util": "30.2.0",
- "jest-validate": "30.2.0",
- "micromatch": "^4.0.8",
- "parse-json": "^5.2.0",
- "pretty-format": "30.2.0",
- "slash": "^3.0.0",
- "strip-json-comments": "^3.1.1"
+ "jest-diff": "30.2.0",
+ "pretty-format": "30.2.0"
},
"engines": {
"node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
- },
- "peerDependencies": {
- "@types/node": "*",
- "esbuild-register": ">=3.4.0",
- "ts-node": ">=9.0.0"
- },
- "peerDependenciesMeta": {
- "@types/node": {
- "optional": true
- },
- "esbuild-register": {
- "optional": true
- },
- "ts-node": {
- "optional": true
- }
}
},
- "node_modules/jest-config/node_modules/ansi-styles": {
+ "node_modules/jest-matcher-utils/node_modules/ansi-styles": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
"integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
@@ -11651,7 +11036,7 @@
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
- "node_modules/jest-config/node_modules/pretty-format": {
+ "node_modules/jest-matcher-utils/node_modules/pretty-format": {
"version": "30.2.0",
"resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz",
"integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==",
@@ -11666,23 +11051,28 @@
"node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
}
},
- "node_modules/jest-diff": {
+ "node_modules/jest-message-util": {
"version": "30.2.0",
- "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.2.0.tgz",
- "integrity": "sha512-dQHFo3Pt4/NLlG5z4PxZ/3yZTZ1C7s9hveiOj+GCN+uT109NC2QgsoVZsVOAvbJ3RgKkvyLGXZV9+piDpWbm6A==",
+ "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.2.0.tgz",
+ "integrity": "sha512-y4DKFLZ2y6DxTWD4cDe07RglV88ZiNEdlRfGtqahfbIjfsw1nMCPx49Uev4IA/hWn3sDKyAnSPwoYSsAEdcimw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@jest/diff-sequences": "30.0.1",
- "@jest/get-type": "30.1.0",
+ "@babel/code-frame": "^7.27.1",
+ "@jest/types": "30.2.0",
+ "@types/stack-utils": "^2.0.3",
"chalk": "^4.1.2",
- "pretty-format": "30.2.0"
+ "graceful-fs": "^4.2.11",
+ "micromatch": "^4.0.8",
+ "pretty-format": "30.2.0",
+ "slash": "^3.0.0",
+ "stack-utils": "^2.0.6"
},
"engines": {
"node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
}
},
- "node_modules/jest-diff/node_modules/ansi-styles": {
+ "node_modules/jest-message-util/node_modules/ansi-styles": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
"integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
@@ -11695,7 +11085,7 @@
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
- "node_modules/jest-diff/node_modules/pretty-format": {
+ "node_modules/jest-message-util/node_modules/pretty-format": {
"version": "30.2.0",
"resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz",
"integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==",
@@ -11710,177 +11100,185 @@
"node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
}
},
- "node_modules/jest-docblock": {
- "version": "30.2.0",
- "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-30.2.0.tgz",
- "integrity": "sha512-tR/FFgZKS1CXluOQzZvNH3+0z9jXr3ldGSD8bhyuxvlVUwbeLOGynkunvlTMxchC5urrKndYiwCFC0DLVjpOCA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "detect-newline": "^3.1.0"
- },
- "engines": {
- "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
- }
- },
- "node_modules/jest-each": {
+ "node_modules/jest-mock": {
"version": "30.2.0",
- "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-30.2.0.tgz",
- "integrity": "sha512-lpWlJlM7bCUf1mfmuqTA8+j2lNURW9eNafOy99knBM01i5CQeY5UH1vZjgT9071nDJac1M4XsbyI44oNOdhlDQ==",
+ "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-30.2.0.tgz",
+ "integrity": "sha512-JNNNl2rj4b5ICpmAcq+WbLH83XswjPbjH4T7yvGzfAGCPh1rw+xVNbtk+FnRslvt9lkCcdn9i1oAoKUuFsOxRw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@jest/get-type": "30.1.0",
"@jest/types": "30.2.0",
- "chalk": "^4.1.2",
- "jest-util": "30.2.0",
- "pretty-format": "30.2.0"
+ "@types/node": "*",
+ "jest-util": "30.2.0"
},
"engines": {
"node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
}
},
- "node_modules/jest-each/node_modules/ansi-styles": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
- "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+ "node_modules/jest-pnp-resolver": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz",
+ "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==",
"dev": true,
"license": "MIT",
"engines": {
- "node": ">=10"
+ "node": ">=6"
},
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ "peerDependencies": {
+ "jest-resolve": "*"
+ },
+ "peerDependenciesMeta": {
+ "jest-resolve": {
+ "optional": true
+ }
}
},
- "node_modules/jest-each/node_modules/pretty-format": {
- "version": "30.2.0",
- "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz",
- "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==",
+ "node_modules/jest-regex-util": {
+ "version": "30.0.1",
+ "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-30.0.1.tgz",
+ "integrity": "sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "@jest/schemas": "30.0.5",
- "ansi-styles": "^5.2.0",
- "react-is": "^18.3.1"
- },
"engines": {
"node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
}
},
- "node_modules/jest-environment-node": {
+ "node_modules/jest-resolve": {
"version": "30.2.0",
- "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-30.2.0.tgz",
- "integrity": "sha512-ElU8v92QJ9UrYsKrxDIKCxu6PfNj4Hdcktcn0JX12zqNdqWHB0N+hwOnnBBXvjLd2vApZtuLUGs1QSY+MsXoNA==",
+ "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-30.2.0.tgz",
+ "integrity": "sha512-TCrHSxPlx3tBY3hWNtRQKbtgLhsXa1WmbJEqBlTBrGafd5fiQFByy2GNCEoGR+Tns8d15GaL9cxEzKOO3GEb2A==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@jest/environment": "30.2.0",
- "@jest/fake-timers": "30.2.0",
- "@jest/types": "30.2.0",
- "@types/node": "*",
- "jest-mock": "30.2.0",
+ "chalk": "^4.1.2",
+ "graceful-fs": "^4.2.11",
+ "jest-haste-map": "30.2.0",
+ "jest-pnp-resolver": "^1.2.3",
"jest-util": "30.2.0",
- "jest-validate": "30.2.0"
+ "jest-validate": "30.2.0",
+ "slash": "^3.0.0",
+ "unrs-resolver": "^1.7.11"
},
"engines": {
"node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
}
},
- "node_modules/jest-get-type": {
- "version": "29.6.3",
- "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz",
- "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==",
+ "node_modules/jest-resolve-dependencies": {
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-30.2.0.tgz",
+ "integrity": "sha512-xTOIGug/0RmIe3mmCqCT95yO0vj6JURrn1TKWlNbhiAefJRWINNPgwVkrVgt/YaerPzY3iItufd80v3lOrFJ2w==",
"dev": true,
"license": "MIT",
+ "dependencies": {
+ "jest-regex-util": "30.0.1",
+ "jest-snapshot": "30.2.0"
+ },
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
}
},
- "node_modules/jest-haste-map": {
+ "node_modules/jest-runner": {
"version": "30.2.0",
- "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-30.2.0.tgz",
- "integrity": "sha512-sQA/jCb9kNt+neM0anSj6eZhLZUIhQgwDt7cPGjumgLM4rXsfb9kpnlacmvZz3Q5tb80nS+oG/if+NBKrHC+Xw==",
+ "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-30.2.0.tgz",
+ "integrity": "sha512-PqvZ2B2XEyPEbclp+gV6KO/F1FIFSbIwewRgmROCMBo/aZ6J1w8Qypoj2pEOcg3G2HzLlaP6VUtvwCI8dM3oqQ==",
"dev": true,
"license": "MIT",
"dependencies": {
+ "@jest/console": "30.2.0",
+ "@jest/environment": "30.2.0",
+ "@jest/test-result": "30.2.0",
+ "@jest/transform": "30.2.0",
"@jest/types": "30.2.0",
"@types/node": "*",
- "anymatch": "^3.1.3",
- "fb-watchman": "^2.0.2",
+ "chalk": "^4.1.2",
+ "emittery": "^0.13.1",
+ "exit-x": "^0.2.2",
"graceful-fs": "^4.2.11",
- "jest-regex-util": "30.0.1",
+ "jest-docblock": "30.2.0",
+ "jest-environment-node": "30.2.0",
+ "jest-haste-map": "30.2.0",
+ "jest-leak-detector": "30.2.0",
+ "jest-message-util": "30.2.0",
+ "jest-resolve": "30.2.0",
+ "jest-runtime": "30.2.0",
"jest-util": "30.2.0",
+ "jest-watcher": "30.2.0",
"jest-worker": "30.2.0",
- "micromatch": "^4.0.8",
- "walker": "^1.0.8"
+ "p-limit": "^3.1.0",
+ "source-map-support": "0.5.13"
},
"engines": {
"node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
- },
- "optionalDependencies": {
- "fsevents": "^2.3.3"
}
},
- "node_modules/jest-leak-detector": {
+ "node_modules/jest-runtime": {
"version": "30.2.0",
- "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-30.2.0.tgz",
- "integrity": "sha512-M6jKAjyzjHG0SrQgwhgZGy9hFazcudwCNovY/9HPIicmNSBuockPSedAP9vlPK6ONFJ1zfyH/M2/YYJxOz5cdQ==",
+ "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-30.2.0.tgz",
+ "integrity": "sha512-p1+GVX/PJqTucvsmERPMgCPvQJpFt4hFbM+VN3n8TMo47decMUcJbt+rgzwrEme0MQUA/R+1de2axftTHkKckg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@jest/get-type": "30.1.0",
- "pretty-format": "30.2.0"
+ "@jest/environment": "30.2.0",
+ "@jest/fake-timers": "30.2.0",
+ "@jest/globals": "30.2.0",
+ "@jest/source-map": "30.0.1",
+ "@jest/test-result": "30.2.0",
+ "@jest/transform": "30.2.0",
+ "@jest/types": "30.2.0",
+ "@types/node": "*",
+ "chalk": "^4.1.2",
+ "cjs-module-lexer": "^2.1.0",
+ "collect-v8-coverage": "^1.0.2",
+ "glob": "^10.3.10",
+ "graceful-fs": "^4.2.11",
+ "jest-haste-map": "30.2.0",
+ "jest-message-util": "30.2.0",
+ "jest-mock": "30.2.0",
+ "jest-regex-util": "30.0.1",
+ "jest-resolve": "30.2.0",
+ "jest-snapshot": "30.2.0",
+ "jest-util": "30.2.0",
+ "slash": "^3.0.0",
+ "strip-bom": "^4.0.0"
},
"engines": {
"node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
}
},
- "node_modules/jest-leak-detector/node_modules/ansi-styles": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
- "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/jest-leak-detector/node_modules/pretty-format": {
- "version": "30.2.0",
- "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz",
- "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jest/schemas": "30.0.5",
- "ansi-styles": "^5.2.0",
- "react-is": "^18.3.1"
- },
- "engines": {
- "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
- }
- },
- "node_modules/jest-matcher-utils": {
- "version": "30.2.0",
- "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-30.2.0.tgz",
- "integrity": "sha512-dQ94Nq4dbzmUWkQ0ANAWS9tBRfqCrn0bV9AMYdOi/MHW726xn7eQmMeRTpX2ViC00bpNaWXq+7o4lIQ3AX13Hg==",
+ "node_modules/jest-snapshot": {
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-30.2.0.tgz",
+ "integrity": "sha512-5WEtTy2jXPFypadKNpbNkZ72puZCa6UjSr/7djeecHWOu7iYhSXSnHScT8wBz3Rn8Ena5d5RYRcsyKIeqG1IyA==",
"dev": true,
"license": "MIT",
"dependencies": {
+ "@babel/core": "^7.27.4",
+ "@babel/generator": "^7.27.5",
+ "@babel/plugin-syntax-jsx": "^7.27.1",
+ "@babel/plugin-syntax-typescript": "^7.27.1",
+ "@babel/types": "^7.27.3",
+ "@jest/expect-utils": "30.2.0",
"@jest/get-type": "30.1.0",
+ "@jest/snapshot-utils": "30.2.0",
+ "@jest/transform": "30.2.0",
+ "@jest/types": "30.2.0",
+ "babel-preset-current-node-syntax": "^1.2.0",
"chalk": "^4.1.2",
+ "expect": "30.2.0",
+ "graceful-fs": "^4.2.11",
"jest-diff": "30.2.0",
- "pretty-format": "30.2.0"
+ "jest-matcher-utils": "30.2.0",
+ "jest-message-util": "30.2.0",
+ "jest-util": "30.2.0",
+ "pretty-format": "30.2.0",
+ "semver": "^7.7.2",
+ "synckit": "^0.11.8"
},
"engines": {
"node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
}
},
- "node_modules/jest-matcher-utils/node_modules/ansi-styles": {
+ "node_modules/jest-snapshot/node_modules/ansi-styles": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
"integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
@@ -11893,7 +11291,7 @@
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
- "node_modules/jest-matcher-utils/node_modules/pretty-format": {
+ "node_modules/jest-snapshot/node_modules/pretty-format": {
"version": "30.2.0",
"resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz",
"integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==",
@@ -11908,389 +11306,134 @@
"node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
}
},
- "node_modules/jest-message-util": {
+ "node_modules/jest-util": {
"version": "30.2.0",
- "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.2.0.tgz",
- "integrity": "sha512-y4DKFLZ2y6DxTWD4cDe07RglV88ZiNEdlRfGtqahfbIjfsw1nMCPx49Uev4IA/hWn3sDKyAnSPwoYSsAEdcimw==",
+ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.2.0.tgz",
+ "integrity": "sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/code-frame": "^7.27.1",
"@jest/types": "30.2.0",
- "@types/stack-utils": "^2.0.3",
+ "@types/node": "*",
"chalk": "^4.1.2",
+ "ci-info": "^4.2.0",
"graceful-fs": "^4.2.11",
- "micromatch": "^4.0.8",
- "pretty-format": "30.2.0",
- "slash": "^3.0.0",
- "stack-utils": "^2.0.6"
- },
- "engines": {
- "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
- }
- },
- "node_modules/jest-message-util/node_modules/ansi-styles": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
- "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/jest-message-util/node_modules/pretty-format": {
- "version": "30.2.0",
- "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz",
- "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jest/schemas": "30.0.5",
- "ansi-styles": "^5.2.0",
- "react-is": "^18.3.1"
+ "picomatch": "^4.0.2"
},
"engines": {
"node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
}
},
- "node_modules/jest-mock": {
+ "node_modules/jest-validate": {
"version": "30.2.0",
- "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-30.2.0.tgz",
- "integrity": "sha512-JNNNl2rj4b5ICpmAcq+WbLH83XswjPbjH4T7yvGzfAGCPh1rw+xVNbtk+FnRslvt9lkCcdn9i1oAoKUuFsOxRw==",
+ "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-30.2.0.tgz",
+ "integrity": "sha512-FBGWi7dP2hpdi8nBoWxSsLvBFewKAg0+uSQwBaof4Y4DPgBabXgpSYC5/lR7VmnIlSpASmCi/ntRWPbv7089Pw==",
"dev": true,
"license": "MIT",
"dependencies": {
+ "@jest/get-type": "30.1.0",
"@jest/types": "30.2.0",
- "@types/node": "*",
- "jest-util": "30.2.0"
+ "camelcase": "^6.3.0",
+ "chalk": "^4.1.2",
+ "leven": "^3.1.0",
+ "pretty-format": "30.2.0"
},
"engines": {
"node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
}
},
- "node_modules/jest-pnp-resolver": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz",
- "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==",
+ "node_modules/jest-validate/node_modules/ansi-styles": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
"dev": true,
"license": "MIT",
"engines": {
- "node": ">=6"
- },
- "peerDependencies": {
- "jest-resolve": "*"
+ "node": ">=10"
},
- "peerDependenciesMeta": {
- "jest-resolve": {
- "optional": true
- }
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
- "node_modules/jest-regex-util": {
- "version": "30.0.1",
- "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-30.0.1.tgz",
- "integrity": "sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA==",
+ "node_modules/jest-validate/node_modules/camelcase": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
+ "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
"dev": true,
"license": "MIT",
"engines": {
- "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
- }
- },
- "node_modules/jest-resolve": {
- "version": "30.2.0",
- "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-30.2.0.tgz",
- "integrity": "sha512-TCrHSxPlx3tBY3hWNtRQKbtgLhsXa1WmbJEqBlTBrGafd5fiQFByy2GNCEoGR+Tns8d15GaL9cxEzKOO3GEb2A==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "chalk": "^4.1.2",
- "graceful-fs": "^4.2.11",
- "jest-haste-map": "30.2.0",
- "jest-pnp-resolver": "^1.2.3",
- "jest-util": "30.2.0",
- "jest-validate": "30.2.0",
- "slash": "^3.0.0",
- "unrs-resolver": "^1.7.11"
+ "node": ">=10"
},
- "engines": {
- "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/jest-resolve-dependencies": {
+ "node_modules/jest-validate/node_modules/pretty-format": {
"version": "30.2.0",
- "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-30.2.0.tgz",
- "integrity": "sha512-xTOIGug/0RmIe3mmCqCT95yO0vj6JURrn1TKWlNbhiAefJRWINNPgwVkrVgt/YaerPzY3iItufd80v3lOrFJ2w==",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz",
+ "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "jest-regex-util": "30.0.1",
- "jest-snapshot": "30.2.0"
+ "@jest/schemas": "30.0.5",
+ "ansi-styles": "^5.2.0",
+ "react-is": "^18.3.1"
},
"engines": {
"node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
}
},
- "node_modules/jest-runner": {
+ "node_modules/jest-watcher": {
"version": "30.2.0",
- "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-30.2.0.tgz",
- "integrity": "sha512-PqvZ2B2XEyPEbclp+gV6KO/F1FIFSbIwewRgmROCMBo/aZ6J1w8Qypoj2pEOcg3G2HzLlaP6VUtvwCI8dM3oqQ==",
+ "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-30.2.0.tgz",
+ "integrity": "sha512-PYxa28dxJ9g777pGm/7PrbnMeA0Jr7osHP9bS7eJy9DuAjMgdGtxgf0uKMyoIsTWAkIbUW5hSDdJ3urmgXBqxg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@jest/console": "30.2.0",
- "@jest/environment": "30.2.0",
"@jest/test-result": "30.2.0",
- "@jest/transform": "30.2.0",
"@jest/types": "30.2.0",
"@types/node": "*",
+ "ansi-escapes": "^4.3.2",
"chalk": "^4.1.2",
"emittery": "^0.13.1",
- "exit-x": "^0.2.2",
- "graceful-fs": "^4.2.11",
- "jest-docblock": "30.2.0",
- "jest-environment-node": "30.2.0",
- "jest-haste-map": "30.2.0",
- "jest-leak-detector": "30.2.0",
- "jest-message-util": "30.2.0",
- "jest-resolve": "30.2.0",
- "jest-runtime": "30.2.0",
"jest-util": "30.2.0",
- "jest-watcher": "30.2.0",
- "jest-worker": "30.2.0",
- "p-limit": "^3.1.0",
- "source-map-support": "0.5.13"
+ "string-length": "^4.0.2"
},
"engines": {
"node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
}
},
- "node_modules/jest-runtime": {
+ "node_modules/jest-worker": {
"version": "30.2.0",
- "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-30.2.0.tgz",
- "integrity": "sha512-p1+GVX/PJqTucvsmERPMgCPvQJpFt4hFbM+VN3n8TMo47decMUcJbt+rgzwrEme0MQUA/R+1de2axftTHkKckg==",
+ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-30.2.0.tgz",
+ "integrity": "sha512-0Q4Uk8WF7BUwqXHuAjc23vmopWJw5WH7w2tqBoUOZpOjW/ZnR44GXXd1r82RvnmI2GZge3ivrYXk/BE2+VtW2g==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@jest/environment": "30.2.0",
- "@jest/fake-timers": "30.2.0",
- "@jest/globals": "30.2.0",
- "@jest/source-map": "30.0.1",
- "@jest/test-result": "30.2.0",
- "@jest/transform": "30.2.0",
- "@jest/types": "30.2.0",
"@types/node": "*",
- "chalk": "^4.1.2",
- "cjs-module-lexer": "^2.1.0",
- "collect-v8-coverage": "^1.0.2",
- "glob": "^10.3.10",
- "graceful-fs": "^4.2.11",
- "jest-haste-map": "30.2.0",
- "jest-message-util": "30.2.0",
- "jest-mock": "30.2.0",
- "jest-regex-util": "30.0.1",
- "jest-resolve": "30.2.0",
- "jest-snapshot": "30.2.0",
+ "@ungap/structured-clone": "^1.3.0",
"jest-util": "30.2.0",
- "slash": "^3.0.0",
- "strip-bom": "^4.0.0"
+ "merge-stream": "^2.0.0",
+ "supports-color": "^8.1.1"
},
"engines": {
"node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
}
},
- "node_modules/jest-snapshot": {
- "version": "30.2.0",
- "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-30.2.0.tgz",
- "integrity": "sha512-5WEtTy2jXPFypadKNpbNkZ72puZCa6UjSr/7djeecHWOu7iYhSXSnHScT8wBz3Rn8Ena5d5RYRcsyKIeqG1IyA==",
+ "node_modules/jest-worker/node_modules/supports-color": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+ "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/core": "^7.27.4",
- "@babel/generator": "^7.27.5",
- "@babel/plugin-syntax-jsx": "^7.27.1",
- "@babel/plugin-syntax-typescript": "^7.27.1",
- "@babel/types": "^7.27.3",
- "@jest/expect-utils": "30.2.0",
- "@jest/get-type": "30.1.0",
- "@jest/snapshot-utils": "30.2.0",
- "@jest/transform": "30.2.0",
- "@jest/types": "30.2.0",
- "babel-preset-current-node-syntax": "^1.2.0",
- "chalk": "^4.1.2",
- "expect": "30.2.0",
- "graceful-fs": "^4.2.11",
- "jest-diff": "30.2.0",
- "jest-matcher-utils": "30.2.0",
- "jest-message-util": "30.2.0",
- "jest-util": "30.2.0",
- "pretty-format": "30.2.0",
- "semver": "^7.7.2",
- "synckit": "^0.11.8"
+ "has-flag": "^4.0.0"
},
- "engines": {
- "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
- }
- },
- "node_modules/jest-snapshot/node_modules/ansi-styles": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
- "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
- "dev": true,
- "license": "MIT",
"engines": {
"node": ">=10"
},
"funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/jest-snapshot/node_modules/pretty-format": {
- "version": "30.2.0",
- "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz",
- "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jest/schemas": "30.0.5",
- "ansi-styles": "^5.2.0",
- "react-is": "^18.3.1"
- },
- "engines": {
- "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
- }
- },
- "node_modules/jest-util": {
- "version": "30.2.0",
- "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.2.0.tgz",
- "integrity": "sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jest/types": "30.2.0",
- "@types/node": "*",
- "chalk": "^4.1.2",
- "ci-info": "^4.2.0",
- "graceful-fs": "^4.2.11",
- "picomatch": "^4.0.2"
- },
- "engines": {
- "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
- }
- },
- "node_modules/jest-validate": {
- "version": "30.2.0",
- "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-30.2.0.tgz",
- "integrity": "sha512-FBGWi7dP2hpdi8nBoWxSsLvBFewKAg0+uSQwBaof4Y4DPgBabXgpSYC5/lR7VmnIlSpASmCi/ntRWPbv7089Pw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jest/get-type": "30.1.0",
- "@jest/types": "30.2.0",
- "camelcase": "^6.3.0",
- "chalk": "^4.1.2",
- "leven": "^3.1.0",
- "pretty-format": "30.2.0"
- },
- "engines": {
- "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
- }
- },
- "node_modules/jest-validate/node_modules/ansi-styles": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
- "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/jest-validate/node_modules/camelcase": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
- "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/jest-validate/node_modules/pretty-format": {
- "version": "30.2.0",
- "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz",
- "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jest/schemas": "30.0.5",
- "ansi-styles": "^5.2.0",
- "react-is": "^18.3.1"
- },
- "engines": {
- "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
- }
- },
- "node_modules/jest-watcher": {
- "version": "30.2.0",
- "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-30.2.0.tgz",
- "integrity": "sha512-PYxa28dxJ9g777pGm/7PrbnMeA0Jr7osHP9bS7eJy9DuAjMgdGtxgf0uKMyoIsTWAkIbUW5hSDdJ3urmgXBqxg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jest/test-result": "30.2.0",
- "@jest/types": "30.2.0",
- "@types/node": "*",
- "ansi-escapes": "^4.3.2",
- "chalk": "^4.1.2",
- "emittery": "^0.13.1",
- "jest-util": "30.2.0",
- "string-length": "^4.0.2"
- },
- "engines": {
- "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
- }
- },
- "node_modules/jest-worker": {
- "version": "30.2.0",
- "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-30.2.0.tgz",
- "integrity": "sha512-0Q4Uk8WF7BUwqXHuAjc23vmopWJw5WH7w2tqBoUOZpOjW/ZnR44GXXd1r82RvnmI2GZge3ivrYXk/BE2+VtW2g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/node": "*",
- "@ungap/structured-clone": "^1.3.0",
- "jest-util": "30.2.0",
- "merge-stream": "^2.0.0",
- "supports-color": "^8.1.1"
- },
- "engines": {
- "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
- }
- },
- "node_modules/jest-worker/node_modules/supports-color": {
- "version": "8.1.1",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
- "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/supports-color?sponsor=1"
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
}
},
"node_modules/jiti": {
@@ -12303,15 +11446,12 @@
"jiti": "lib/jiti-cli.mjs"
}
},
- "node_modules/joycon": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz",
- "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==",
- "dev": true,
+ "node_modules/js-sha3": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz",
+ "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==",
"license": "MIT",
- "engines": {
- "node": ">=10"
- }
+ "optional": true
},
"node_modules/js-tokens": {
"version": "4.0.0",
@@ -12464,6 +11604,29 @@
"safe-buffer": "^5.0.1"
}
},
+ "node_modules/keccak": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.4.tgz",
+ "integrity": "sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "node-addon-api": "^2.0.0",
+ "node-gyp-build": "^4.2.0",
+ "readable-stream": "^3.6.0"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/keccak/node_modules/node-addon-api": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz",
+ "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==",
+ "license": "MIT",
+ "optional": true
+ },
"node_modules/keyv": {
"version": "4.5.4",
"resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
@@ -12474,16 +11637,6 @@
"json-buffer": "3.0.1"
}
},
- "node_modules/kleur": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz",
- "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
"node_modules/language-subtag-registry": {
"version": "0.3.23",
"resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz",
@@ -12795,19 +11948,6 @@
"url": "https://opencollective.com/parcel"
}
},
- "node_modules/lilconfig": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz",
- "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "url": "https://github.com/sponsors/antonk52"
- }
- },
"node_modules/lines-and-columns": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
@@ -12834,16 +11974,6 @@
"node": ">=13.2.0"
}
},
- "node_modules/load-tsconfig": {
- "version": "0.2.5",
- "resolved": "https://registry.npmjs.org/load-tsconfig/-/load-tsconfig-0.2.5.tgz",
- "integrity": "sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
- }
- },
"node_modules/loader-runner": {
"version": "4.3.1",
"resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.1.tgz",
@@ -13093,9 +12223,9 @@
}
},
"node_modules/micromatch/node_modules/picomatch": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
- "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz",
+ "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==",
"dev": true,
"license": "MIT",
"engines": {
@@ -13136,6 +12266,20 @@
"node": ">=6"
}
},
+ "node_modules/minimalistic-assert": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
+ "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==",
+ "license": "ISC",
+ "optional": true
+ },
+ "node_modules/minimalistic-crypto-utils": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz",
+ "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==",
+ "license": "MIT",
+ "optional": true
+ },
"node_modules/minimatch": {
"version": "3.1.5",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz",
@@ -13153,6 +12297,7 @@
"version": "1.2.8",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
"integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
+ "dev": true,
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/ljharb"
@@ -13179,31 +12324,6 @@
"node": ">= 18"
}
},
- "node_modules/mkdirp": {
- "version": "0.5.6",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
- "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
- "license": "MIT",
- "dependencies": {
- "minimist": "^1.2.6"
- },
- "bin": {
- "mkdirp": "bin/cmd.js"
- }
- },
- "node_modules/mlly": {
- "version": "1.8.0",
- "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.0.tgz",
- "integrity": "sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "acorn": "^8.15.0",
- "pathe": "^2.0.3",
- "pkg-types": "^1.3.1",
- "ufo": "^1.6.1"
- }
- },
"node_modules/ms": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
@@ -13211,21 +12331,22 @@
"license": "MIT"
},
"node_modules/multer": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/multer/-/multer-2.0.2.tgz",
- "integrity": "sha512-u7f2xaZ/UG8oLXHvtF/oWTRvT44p9ecwBBqTwgJVq0+4BW1g8OW01TyMEGWBHbyMOYVHXslaut7qEQ1meATXgw==",
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/multer/-/multer-2.1.1.tgz",
+ "integrity": "sha512-mo+QTzKlx8R7E5ylSXxWzGoXoZbOsRMpyitcht8By2KHvMbf3tjwosZ/Mu/XYU6UuJ3VZnODIrak5ZrPiPyB6A==",
"license": "MIT",
"dependencies": {
"append-field": "^1.0.0",
"busboy": "^1.6.0",
"concat-stream": "^2.0.0",
- "mkdirp": "^0.5.6",
- "object-assign": "^4.1.1",
- "type-is": "^1.6.18",
- "xtend": "^4.0.2"
+ "type-is": "^1.6.18"
},
"engines": {
"node": ">= 10.16.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
}
},
"node_modules/multer/node_modules/media-typer": {
@@ -13281,18 +12402,6 @@
"node": "^18.17.0 || >=20.5.0"
}
},
- "node_modules/mz": {
- "version": "2.7.0",
- "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
- "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "any-promise": "^1.0.0",
- "object-assign": "^4.0.1",
- "thenify-all": "^1.0.0"
- }
- },
"node_modules/nanoid": {
"version": "3.3.11",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
@@ -13351,14 +12460,14 @@
"license": "MIT"
},
"node_modules/next": {
- "version": "16.1.6",
- "resolved": "https://registry.npmjs.org/next/-/next-16.1.6.tgz",
- "integrity": "sha512-hkyRkcu5x/41KoqnROkfTm2pZVbKxvbZRuNvKXLRXxs3VfyO0WhY50TQS40EuKO9SW3rBj/sF3WbVwDACeMZyw==",
+ "version": "16.2.1",
+ "resolved": "https://registry.npmjs.org/next/-/next-16.2.1.tgz",
+ "integrity": "sha512-VaChzNL7o9rbfdt60HUj8tev4m6d7iC1igAy157526+cJlXOQu5LzsBXNT+xaJnTP/k+utSX5vMv7m0G+zKH+Q==",
"license": "MIT",
"dependencies": {
- "@next/env": "16.1.6",
+ "@next/env": "16.2.1",
"@swc/helpers": "0.5.15",
- "baseline-browser-mapping": "^2.8.3",
+ "baseline-browser-mapping": "^2.9.19",
"caniuse-lite": "^1.0.30001579",
"postcss": "8.4.31",
"styled-jsx": "5.1.6"
@@ -13370,15 +12479,15 @@
"node": ">=20.9.0"
},
"optionalDependencies": {
- "@next/swc-darwin-arm64": "16.1.6",
- "@next/swc-darwin-x64": "16.1.6",
- "@next/swc-linux-arm64-gnu": "16.1.6",
- "@next/swc-linux-arm64-musl": "16.1.6",
- "@next/swc-linux-x64-gnu": "16.1.6",
- "@next/swc-linux-x64-musl": "16.1.6",
- "@next/swc-win32-arm64-msvc": "16.1.6",
- "@next/swc-win32-x64-msvc": "16.1.6",
- "sharp": "^0.34.4"
+ "@next/swc-darwin-arm64": "16.2.1",
+ "@next/swc-darwin-x64": "16.2.1",
+ "@next/swc-linux-arm64-gnu": "16.2.1",
+ "@next/swc-linux-arm64-musl": "16.2.1",
+ "@next/swc-linux-x64-gnu": "16.2.1",
+ "@next/swc-linux-x64-musl": "16.2.1",
+ "@next/swc-win32-arm64-msvc": "16.2.1",
+ "@next/swc-win32-x64-msvc": "16.2.1",
+ "sharp": "^0.34.5"
},
"peerDependencies": {
"@opentelemetry/api": "^1.1.0",
@@ -13569,9 +12678,9 @@
}
},
"node_modules/nodemon/node_modules/picomatch": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
- "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz",
+ "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==",
"dev": true,
"license": "MIT",
"engines": {
@@ -13871,40 +12980,103 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/p-limit": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
- "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
- "dev": true,
+ "node_modules/ox": {
+ "version": "0.14.7",
+ "resolved": "https://registry.npmjs.org/ox/-/ox-0.14.7.tgz",
+ "integrity": "sha512-zSQ/cfBdolj7U4++NAvH7sI+VG0T3pEohITCgcQj8KlawvTDY4vGVhDT64Atsm0d6adWfIYHDpu88iUBMMp+AQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/wevm"
+ }
+ ],
"license": "MIT",
"dependencies": {
- "yocto-queue": "^0.1.0"
+ "@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"
},
- "engines": {
- "node": ">=10"
+ "peerDependencies": {
+ "typescript": ">=5.4.0"
},
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
}
},
- "node_modules/p-locate": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
- "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
- "dev": true,
+ "node_modules/ox/node_modules/@adraffy/ens-normalize": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.11.1.tgz",
+ "integrity": "sha512-nhCBV3quEgesuf7c7KYfperqSS14T8bYuvJ8PcLJp6znkZpFc0AuW4qBtr8eKVyPPe/8RSr7sglCWPU5eaxwKQ==",
+ "license": "MIT"
+ },
+ "node_modules/ox/node_modules/@noble/curves": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.1.tgz",
+ "integrity": "sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==",
"license": "MIT",
"dependencies": {
- "p-limit": "^3.0.2"
+ "@noble/hashes": "1.8.0"
},
"engines": {
- "node": ">=10"
+ "node": "^14.21.3 || >=16"
},
"funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "url": "https://paulmillr.com/funding/"
}
},
- "node_modules/p-try": {
- "version": "2.2.0",
+ "node_modules/ox/node_modules/@noble/hashes": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz",
+ "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==",
+ "license": "MIT",
+ "engines": {
+ "node": "^14.21.3 || >=16"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-locate": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-try": {
+ "version": "2.2.0",
"resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
"integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
"dev": true,
@@ -14066,12 +13238,13 @@
"license": "ISC"
},
"node_modules/path-to-regexp": {
- "version": "8.2.0",
- "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz",
- "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==",
+ "version": "8.3.0",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz",
+ "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==",
"license": "MIT",
- "engines": {
- "node": ">=16"
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
}
},
"node_modules/path-type": {
@@ -14084,13 +13257,6 @@
"node": ">=8"
}
},
- "node_modules/pathe": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz",
- "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/pause": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz",
@@ -14283,18 +13449,6 @@
"node": ">=8"
}
},
- "node_modules/pkg-types": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz",
- "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "confbox": "^0.1.8",
- "mlly": "^1.7.4",
- "pathe": "^2.0.1"
- }
- },
"node_modules/pluralize": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz",
@@ -14343,49 +13497,6 @@
"node": "^10 || ^12 || >=14"
}
},
- "node_modules/postcss-load-config": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz",
- "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==",
- "dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/postcss/"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "lilconfig": "^3.1.1"
- },
- "engines": {
- "node": ">= 18"
- },
- "peerDependencies": {
- "jiti": ">=1.21.0",
- "postcss": ">=8.0.9",
- "tsx": "^4.8.1",
- "yaml": "^2.4.2"
- },
- "peerDependenciesMeta": {
- "jiti": {
- "optional": true
- },
- "postcss": {
- "optional": true
- },
- "tsx": {
- "optional": true
- },
- "yaml": {
- "optional": true
- }
- }
- },
"node_modules/postcss-value-parser": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
@@ -14476,68 +13587,6 @@
"prettier": ">=3.0.0"
}
},
- "node_modules/pretty-format": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz",
- "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jest/schemas": "^29.6.3",
- "ansi-styles": "^5.0.0",
- "react-is": "^18.0.0"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/pretty-format/node_modules/@jest/schemas": {
- "version": "29.6.3",
- "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz",
- "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@sinclair/typebox": "^0.27.8"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/pretty-format/node_modules/@sinclair/typebox": {
- "version": "0.27.8",
- "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz",
- "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/pretty-format/node_modules/ansi-styles": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
- "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/prompts": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz",
- "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "kleur": "^3.0.3",
- "sisteransi": "^1.0.5"
- },
- "engines": {
- "node": ">= 6"
- }
- },
"node_modules/prop-types": {
"version": "15.8.1",
"resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
@@ -14572,7 +13621,8 @@
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
"integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
- "license": "MIT"
+ "license": "MIT",
+ "optional": true
},
"node_modules/pstree.remy": {
"version": "1.1.8",
@@ -14650,16 +13700,6 @@
],
"license": "MIT"
},
- "node_modules/randombytes": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
- "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "safe-buffer": "^5.1.0"
- }
- },
"node_modules/range-parser": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
@@ -14770,6 +13810,23 @@
"url": "https://paulmillr.com/funding/"
}
},
+ "node_modules/redux": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz",
+ "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==",
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/redux-thunk": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-3.1.0.tgz",
+ "integrity": "sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==",
+ "license": "MIT",
+ "optional": true,
+ "peerDependencies": {
+ "redux": "^5.0.0"
+ }
+ },
"node_modules/reflect-metadata": {
"version": "0.2.2",
"resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz",
@@ -14839,6 +13896,13 @@
"node": ">=0.10.0"
}
},
+ "node_modules/reselect": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/reselect/-/reselect-5.1.1.tgz",
+ "integrity": "sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==",
+ "license": "MIT",
+ "optional": true
+ },
"node_modules/resolve": {
"version": "1.22.10",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz",
@@ -14903,16 +13967,6 @@
"url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1"
}
},
- "node_modules/resolve.exports": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz",
- "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=10"
- }
- },
"node_modules/restore-cursor": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
@@ -14984,51 +14038,6 @@
"url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/rollup": {
- "version": "4.59.0",
- "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.59.0.tgz",
- "integrity": "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/estree": "1.0.8"
- },
- "bin": {
- "rollup": "dist/bin/rollup"
- },
- "engines": {
- "node": ">=18.0.0",
- "npm": ">=8.0.0"
- },
- "optionalDependencies": {
- "@rollup/rollup-android-arm-eabi": "4.59.0",
- "@rollup/rollup-android-arm64": "4.59.0",
- "@rollup/rollup-darwin-arm64": "4.59.0",
- "@rollup/rollup-darwin-x64": "4.59.0",
- "@rollup/rollup-freebsd-arm64": "4.59.0",
- "@rollup/rollup-freebsd-x64": "4.59.0",
- "@rollup/rollup-linux-arm-gnueabihf": "4.59.0",
- "@rollup/rollup-linux-arm-musleabihf": "4.59.0",
- "@rollup/rollup-linux-arm64-gnu": "4.59.0",
- "@rollup/rollup-linux-arm64-musl": "4.59.0",
- "@rollup/rollup-linux-loong64-gnu": "4.59.0",
- "@rollup/rollup-linux-loong64-musl": "4.59.0",
- "@rollup/rollup-linux-ppc64-gnu": "4.59.0",
- "@rollup/rollup-linux-ppc64-musl": "4.59.0",
- "@rollup/rollup-linux-riscv64-gnu": "4.59.0",
- "@rollup/rollup-linux-riscv64-musl": "4.59.0",
- "@rollup/rollup-linux-s390x-gnu": "4.59.0",
- "@rollup/rollup-linux-x64-gnu": "4.59.0",
- "@rollup/rollup-linux-x64-musl": "4.59.0",
- "@rollup/rollup-openbsd-x64": "4.59.0",
- "@rollup/rollup-openharmony-arm64": "4.59.0",
- "@rollup/rollup-win32-arm64-msvc": "4.59.0",
- "@rollup/rollup-win32-ia32-msvc": "4.59.0",
- "@rollup/rollup-win32-x64-gnu": "4.59.0",
- "@rollup/rollup-win32-x64-msvc": "4.59.0",
- "fsevents": "~2.3.2"
- }
- },
"node_modules/router": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz",
@@ -15218,16 +14227,6 @@
"node": ">= 18"
}
},
- "node_modules/serialize-javascript": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz",
- "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==",
- "dev": true,
- "license": "BSD-3-Clause",
- "dependencies": {
- "randombytes": "^2.1.0"
- }
- },
"node_modules/serve-static": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz",
@@ -15318,16 +14317,16 @@
}
},
"node_modules/sharp": {
- "version": "0.34.4",
- "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.4.tgz",
- "integrity": "sha512-FUH39xp3SBPnxWvd5iib1X8XY7J0K0X7d93sie9CJg2PO8/7gmg89Nve6OjItK53/MlAushNNxteBYfM6DEuoA==",
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz",
+ "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==",
"hasInstallScript": true,
"license": "Apache-2.0",
"optional": true,
"dependencies": {
"@img/colour": "^1.0.0",
- "detect-libc": "^2.1.0",
- "semver": "^7.7.2"
+ "detect-libc": "^2.1.2",
+ "semver": "^7.7.3"
},
"engines": {
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
@@ -15336,28 +14335,30 @@
"url": "https://opencollective.com/libvips"
},
"optionalDependencies": {
- "@img/sharp-darwin-arm64": "0.34.4",
- "@img/sharp-darwin-x64": "0.34.4",
- "@img/sharp-libvips-darwin-arm64": "1.2.3",
- "@img/sharp-libvips-darwin-x64": "1.2.3",
- "@img/sharp-libvips-linux-arm": "1.2.3",
- "@img/sharp-libvips-linux-arm64": "1.2.3",
- "@img/sharp-libvips-linux-ppc64": "1.2.3",
- "@img/sharp-libvips-linux-s390x": "1.2.3",
- "@img/sharp-libvips-linux-x64": "1.2.3",
- "@img/sharp-libvips-linuxmusl-arm64": "1.2.3",
- "@img/sharp-libvips-linuxmusl-x64": "1.2.3",
- "@img/sharp-linux-arm": "0.34.4",
- "@img/sharp-linux-arm64": "0.34.4",
- "@img/sharp-linux-ppc64": "0.34.4",
- "@img/sharp-linux-s390x": "0.34.4",
- "@img/sharp-linux-x64": "0.34.4",
- "@img/sharp-linuxmusl-arm64": "0.34.4",
- "@img/sharp-linuxmusl-x64": "0.34.4",
- "@img/sharp-wasm32": "0.34.4",
- "@img/sharp-win32-arm64": "0.34.4",
- "@img/sharp-win32-ia32": "0.34.4",
- "@img/sharp-win32-x64": "0.34.4"
+ "@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"
}
},
"node_modules/shebang-command": {
@@ -15478,13 +14479,6 @@
"node": ">=10"
}
},
- "node_modules/sisteransi": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz",
- "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/slash": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
@@ -15916,9 +14910,9 @@
}
},
"node_modules/strtok3": {
- "version": "10.3.4",
- "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-10.3.4.tgz",
- "integrity": "sha512-KIy5nylvC5le1OdaaoCJ07L+8iQzJHGH6pWDuzS+d07Cu7n1MZ2x26P8ZKIWfbK02+XIL8Mp4RkWeqdUCrDMfg==",
+ "version": "10.3.5",
+ "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-10.3.5.tgz",
+ "integrity": "sha512-ki4hZQfh5rX0QDLLkOCj+h+CVNkqmp/CMf8v8kZpkNVK6jGQooMytqzLZYUVYIZcFZ6yDB70EfD8POcFXiF5oA==",
"license": "MIT",
"dependencies": {
"@tokenizer/token": "^0.3.0"
@@ -15954,29 +14948,6 @@
}
}
},
- "node_modules/sucrase": {
- "version": "3.35.1",
- "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz",
- "integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jridgewell/gen-mapping": "^0.3.2",
- "commander": "^4.0.0",
- "lines-and-columns": "^1.1.6",
- "mz": "^2.7.0",
- "pirates": "^4.0.1",
- "tinyglobby": "^0.2.11",
- "ts-interface-checker": "^0.1.9"
- },
- "bin": {
- "sucrase": "bin/sucrase",
- "sucrase-node": "bin/sucrase-node"
- },
- "engines": {
- "node": ">=16 || 14 >=14.17"
- }
- },
"node_modules/supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
@@ -16081,9 +15052,9 @@
}
},
"node_modules/tar": {
- "version": "7.5.9",
- "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.9.tgz",
- "integrity": "sha512-BTLcK0xsDh2+PUe9F6c2TlRp4zOOBMTkoQHQIWSIzI0R7KG46uEwq4OPk2W7bZcprBMsuaeFsqwYr7pjh6CuHg==",
+ "version": "7.5.13",
+ "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.13.tgz",
+ "integrity": "sha512-tOG/7GyXpFevhXVh8jOPJrmtRpOTsYqUIkVdVooZYJS/z8WhfQUX8RJILmeuJNinGAMSu1veBr4asSHFt5/hng==",
"license": "BlueOak-1.0.0",
"dependencies": {
"@isaacs/fs-minipass": "^4.0.0",
@@ -16125,16 +15096,15 @@
}
},
"node_modules/terser-webpack-plugin": {
- "version": "5.3.16",
- "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.16.tgz",
- "integrity": "sha512-h9oBFCWrq78NyWWVcSwZarJkZ01c2AyGrzs1crmHZO3QUg9D61Wu4NPjBy69n7JqylFF5y+CsUZYmYEIZ3mR+Q==",
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.4.0.tgz",
+ "integrity": "sha512-Bn5vxm48flOIfkdl5CaD2+1CiUVbonWQ3KQPyP7/EuIl9Gbzq/gQFOzaMFUEgVjB1396tcK0SG8XcNJ/2kDH8g==",
"dev": true,
"license": "MIT",
"dependencies": {
"@jridgewell/trace-mapping": "^0.3.25",
"jest-worker": "^27.4.5",
"schema-utils": "^4.3.0",
- "serialize-javascript": "^6.0.2",
"terser": "^5.31.1"
},
"engines": {
@@ -16337,36 +15307,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/thenify": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
- "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "any-promise": "^1.0.0"
- }
- },
- "node_modules/thenify-all": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
- "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "thenify": ">= 3.1.0 < 4"
- },
- "engines": {
- "node": ">=0.8"
- }
- },
- "node_modules/tinyexec": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz",
- "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/tinyglobby": {
"version": "0.2.15",
"resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz",
@@ -16385,9 +15325,9 @@
}
},
"node_modules/tinyglobby/node_modules/picomatch": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
- "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz",
+ "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==",
"dev": true,
"license": "MIT",
"engines": {
@@ -16441,12 +15381,12 @@
}
},
"node_modules/token-types": {
- "version": "6.1.1",
- "resolved": "https://registry.npmjs.org/token-types/-/token-types-6.1.1.tgz",
- "integrity": "sha512-kh9LVIWH5CnL63Ipf0jhlBIy0UsrMj/NJDfpsy1SqOXlLKEVyXXYrnFxFT1yOOYVGBSApeVnjPw/sBz5BfEjAQ==",
+ "version": "6.1.2",
+ "resolved": "https://registry.npmjs.org/token-types/-/token-types-6.1.2.tgz",
+ "integrity": "sha512-dRXchy+C0IgK8WPC6xvCHFRIWYUbqqdEIKPaKo/AcTUNzwLTK6AH7RjdLWsEZcAN/TBdtfUw3PYEgPr5VPr6ww==",
"license": "MIT",
"dependencies": {
- "@borewit/text-codec": "^0.1.0",
+ "@borewit/text-codec": "^0.2.1",
"@tokenizer/token": "^0.3.0",
"ieee754": "^1.2.1"
},
@@ -16468,16 +15408,6 @@
"nodetouch": "bin/nodetouch.js"
}
},
- "node_modules/tree-kill": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz",
- "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==",
- "dev": true,
- "license": "MIT",
- "bin": {
- "tree-kill": "cli.js"
- }
- },
"node_modules/ts-api-utils": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz",
@@ -16491,13 +15421,6 @@
"typescript": ">=4.8.4"
}
},
- "node_modules/ts-interface-checker": {
- "version": "0.1.13",
- "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz",
- "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==",
- "dev": true,
- "license": "Apache-2.0"
- },
"node_modules/ts-jest": {
"version": "29.4.5",
"resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.4.5.tgz",
@@ -16662,100 +15585,27 @@
"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
"license": "0BSD"
},
- "node_modules/tsup": {
- "version": "8.5.1",
- "resolved": "https://registry.npmjs.org/tsup/-/tsup-8.5.1.tgz",
- "integrity": "sha512-xtgkqwdhpKWr3tKPmCkvYmS9xnQK3m3XgxZHwSUjvfTjp7YfXe5tT3GgWi0F2N+ZSMsOeWeZFh7ZZFg5iPhing==",
+ "node_modules/type-check": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
"dev": true,
"license": "MIT",
"dependencies": {
- "bundle-require": "^5.1.0",
- "cac": "^6.7.14",
- "chokidar": "^4.0.3",
- "consola": "^3.4.0",
- "debug": "^4.4.0",
- "esbuild": "^0.27.0",
- "fix-dts-default-cjs-exports": "^1.0.0",
- "joycon": "^3.1.1",
- "picocolors": "^1.1.1",
- "postcss-load-config": "^6.0.1",
- "resolve-from": "^5.0.0",
- "rollup": "^4.34.8",
- "source-map": "^0.7.6",
- "sucrase": "^3.35.0",
- "tinyexec": "^0.3.2",
- "tinyglobby": "^0.2.11",
- "tree-kill": "^1.2.2"
- },
- "bin": {
- "tsup": "dist/cli-default.js",
- "tsup-node": "dist/cli-node.js"
+ "prelude-ls": "^1.2.1"
},
"engines": {
- "node": ">=18"
- },
- "peerDependencies": {
- "@microsoft/api-extractor": "^7.36.0",
- "@swc/core": "^1",
- "postcss": "^8.4.12",
- "typescript": ">=4.5.0"
- },
- "peerDependenciesMeta": {
- "@microsoft/api-extractor": {
- "optional": true
- },
- "@swc/core": {
- "optional": true
- },
- "postcss": {
- "optional": true
- },
- "typescript": {
- "optional": true
- }
+ "node": ">= 0.8.0"
}
},
- "node_modules/tsup/node_modules/resolve-from": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
- "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+ "node_modules/type-detect": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
+ "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
"dev": true,
"license": "MIT",
"engines": {
- "node": ">=8"
- }
- },
- "node_modules/tsup/node_modules/source-map": {
- "version": "0.7.6",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz",
- "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==",
- "dev": true,
- "license": "BSD-3-Clause",
- "engines": {
- "node": ">= 12"
- }
- },
- "node_modules/type-check": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
- "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "prelude-ls": "^1.2.1"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/type-detect": {
- "version": "4.0.8",
- "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
- "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=4"
+ "node": ">=4"
}
},
"node_modules/type-fest": {
@@ -17016,2054 +15866,994 @@
}
},
"node_modules/typeorm/node_modules/uuid": {
- "version": "11.1.0",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz",
- "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==",
- "funding": [
- "https://github.com/sponsors/broofa",
- "https://github.com/sponsors/ctavan"
- ],
- "license": "MIT",
- "bin": {
- "uuid": "dist/esm/bin/uuid"
- }
- },
- "node_modules/typescript": {
- "version": "5.9.3",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
- "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
- "license": "Apache-2.0",
- "bin": {
- "tsc": "bin/tsc",
- "tsserver": "bin/tsserver"
- },
- "engines": {
- "node": ">=14.17"
- }
- },
- "node_modules/typescript-eslint": {
- "version": "8.46.2",
- "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.46.2.tgz",
- "integrity": "sha512-vbw8bOmiuYNdzzV3lsiWv6sRwjyuKJMQqWulBOU7M0RrxedXledX8G8kBbQeiOYDnTfiXz0Y4081E1QMNB6iQg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@typescript-eslint/eslint-plugin": "8.46.2",
- "@typescript-eslint/parser": "8.46.2",
- "@typescript-eslint/typescript-estree": "8.46.2",
- "@typescript-eslint/utils": "8.46.2"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "eslint": "^8.57.0 || ^9.0.0",
- "typescript": ">=4.8.4 <6.0.0"
- }
- },
- "node_modules/ufo": {
- "version": "1.6.1",
- "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.1.tgz",
- "integrity": "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/uglify-js": {
- "version": "3.19.3",
- "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz",
- "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==",
- "dev": true,
- "license": "BSD-2-Clause",
- "optional": true,
- "bin": {
- "uglifyjs": "bin/uglifyjs"
- },
- "engines": {
- "node": ">=0.8.0"
- }
- },
- "node_modules/uid": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/uid/-/uid-2.0.2.tgz",
- "integrity": "sha512-u3xV3X7uzvi5b1MncmZo3i2Aw222Zk1keqLA1YkHldREkAhAqi65wuPfe7lHx8H/Wzy+8CE7S7uS3jekIM5s8g==",
- "license": "MIT",
- "dependencies": {
- "@lukeed/csprng": "^1.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/uint8array-extras": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/uint8array-extras/-/uint8array-extras-1.5.0.tgz",
- "integrity": "sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A==",
- "license": "MIT",
- "engines": {
- "node": ">=18"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/unbox-primitive": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz",
- "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "call-bound": "^1.0.3",
- "has-bigints": "^1.0.2",
- "has-symbols": "^1.1.0",
- "which-boxed-primitive": "^1.1.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/undefsafe": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz",
- "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/undici-types": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz",
- "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==",
- "license": "MIT"
- },
- "node_modules/universalify": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
- "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 10.0.0"
- }
- },
- "node_modules/unpipe": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
- "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/unrs-resolver": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz",
- "integrity": "sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==",
- "dev": true,
- "hasInstallScript": true,
- "license": "MIT",
- "dependencies": {
- "napi-postinstall": "^0.3.0"
- },
- "funding": {
- "url": "https://opencollective.com/unrs-resolver"
- },
- "optionalDependencies": {
- "@unrs/resolver-binding-android-arm-eabi": "1.11.1",
- "@unrs/resolver-binding-android-arm64": "1.11.1",
- "@unrs/resolver-binding-darwin-arm64": "1.11.1",
- "@unrs/resolver-binding-darwin-x64": "1.11.1",
- "@unrs/resolver-binding-freebsd-x64": "1.11.1",
- "@unrs/resolver-binding-linux-arm-gnueabihf": "1.11.1",
- "@unrs/resolver-binding-linux-arm-musleabihf": "1.11.1",
- "@unrs/resolver-binding-linux-arm64-gnu": "1.11.1",
- "@unrs/resolver-binding-linux-arm64-musl": "1.11.1",
- "@unrs/resolver-binding-linux-ppc64-gnu": "1.11.1",
- "@unrs/resolver-binding-linux-riscv64-gnu": "1.11.1",
- "@unrs/resolver-binding-linux-riscv64-musl": "1.11.1",
- "@unrs/resolver-binding-linux-s390x-gnu": "1.11.1",
- "@unrs/resolver-binding-linux-x64-gnu": "1.11.1",
- "@unrs/resolver-binding-linux-x64-musl": "1.11.1",
- "@unrs/resolver-binding-wasm32-wasi": "1.11.1",
- "@unrs/resolver-binding-win32-arm64-msvc": "1.11.1",
- "@unrs/resolver-binding-win32-ia32-msvc": "1.11.1",
- "@unrs/resolver-binding-win32-x64-msvc": "1.11.1"
- }
- },
- "node_modules/update-browserslist-db": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz",
- "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==",
- "dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/browserslist"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/browserslist"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "escalade": "^3.2.0",
- "picocolors": "^1.1.1"
- },
- "bin": {
- "update-browserslist-db": "cli.js"
- },
- "peerDependencies": {
- "browserslist": ">= 4.21.0"
- }
- },
- "node_modules/uri-js": {
- "version": "4.4.1",
- "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
- "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
- "dev": true,
- "license": "BSD-2-Clause",
- "dependencies": {
- "punycode": "^2.1.0"
- }
- },
- "node_modules/use-sync-external-store": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz",
- "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==",
- "license": "MIT",
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
- }
- },
- "node_modules/util-deprecate": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
- "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
- "license": "MIT"
- },
- "node_modules/utils-merge": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
- "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.4.0"
- }
- },
- "node_modules/uuid": {
- "version": "13.0.0",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-13.0.0.tgz",
- "integrity": "sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w==",
- "funding": [
- "https://github.com/sponsors/broofa",
- "https://github.com/sponsors/ctavan"
- ],
- "license": "MIT",
- "bin": {
- "uuid": "dist-node/bin/uuid"
- }
- },
- "node_modules/v8-compile-cache-lib": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz",
- "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==",
- "devOptional": true,
- "license": "MIT"
- },
- "node_modules/v8-to-istanbul": {
- "version": "9.3.0",
- "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz",
- "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "@jridgewell/trace-mapping": "^0.3.12",
- "@types/istanbul-lib-coverage": "^2.0.1",
- "convert-source-map": "^2.0.0"
- },
- "engines": {
- "node": ">=10.12.0"
- }
- },
- "node_modules/validator": {
- "version": "13.15.26",
- "resolved": "https://registry.npmjs.org/validator/-/validator-13.15.26.tgz",
- "integrity": "sha512-spH26xU080ydGggxRyR1Yhcbgx+j3y5jbNXk/8L+iRvdIEQ4uTRH2Sgf2dokud6Q4oAtsbNvJ1Ft+9xmm6IZcA==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/vary": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
- "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/walker": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz",
- "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "makeerror": "1.0.12"
- }
- },
- "node_modules/watchpack": {
- "version": "2.4.4",
- "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.4.tgz",
- "integrity": "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "glob-to-regexp": "^0.4.1",
- "graceful-fs": "^4.1.2"
- },
- "engines": {
- "node": ">=10.13.0"
- }
- },
- "node_modules/wcwidth": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz",
- "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "defaults": "^1.0.3"
- }
- },
- "node_modules/webpack": {
- "version": "5.104.1",
- "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.104.1.tgz",
- "integrity": "sha512-Qphch25abbMNtekmEGJmeRUhLDbe+QfiWTiqpKYkpCOWY64v9eyl+KRRLmqOFA2AvKPpc9DC6+u2n76tQLBoaA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/eslint-scope": "^3.7.7",
- "@types/estree": "^1.0.8",
- "@types/json-schema": "^7.0.15",
- "@webassemblyjs/ast": "^1.14.1",
- "@webassemblyjs/wasm-edit": "^1.14.1",
- "@webassemblyjs/wasm-parser": "^1.14.1",
- "acorn": "^8.15.0",
- "acorn-import-phases": "^1.0.3",
- "browserslist": "^4.28.1",
- "chrome-trace-event": "^1.0.2",
- "enhanced-resolve": "^5.17.4",
- "es-module-lexer": "^2.0.0",
- "eslint-scope": "5.1.1",
- "events": "^3.2.0",
- "glob-to-regexp": "^0.4.1",
- "graceful-fs": "^4.2.11",
- "json-parse-even-better-errors": "^2.3.1",
- "loader-runner": "^4.3.1",
- "mime-types": "^2.1.27",
- "neo-async": "^2.6.2",
- "schema-utils": "^4.3.3",
- "tapable": "^2.3.0",
- "terser-webpack-plugin": "^5.3.16",
- "watchpack": "^2.4.4",
- "webpack-sources": "^3.3.3"
- },
- "bin": {
- "webpack": "bin/webpack.js"
- },
- "engines": {
- "node": ">=10.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- },
- "peerDependenciesMeta": {
- "webpack-cli": {
- "optional": true
- }
- }
- },
- "node_modules/webpack-node-externals": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/webpack-node-externals/-/webpack-node-externals-3.0.0.tgz",
- "integrity": "sha512-LnL6Z3GGDPht/AigwRh2dvL9PQPFQ8skEpVrWZXLWBYmqcaojHNN0onvHzie6rq7EWKrrBfPYqNEzTJgiwEQDQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/webpack-sources": {
- "version": "3.3.3",
- "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz",
- "integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=10.13.0"
- }
- },
- "node_modules/webpack/node_modules/ajv": {
- "version": "8.18.0",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz",
- "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "fast-deep-equal": "^3.1.3",
- "fast-uri": "^3.0.1",
- "json-schema-traverse": "^1.0.0",
- "require-from-string": "^2.0.2"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/epoberezkin"
- }
- },
- "node_modules/webpack/node_modules/ajv-formats": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz",
- "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ajv": "^8.0.0"
- },
- "peerDependencies": {
- "ajv": "^8.0.0"
- },
- "peerDependenciesMeta": {
- "ajv": {
- "optional": true
- }
- }
- },
- "node_modules/webpack/node_modules/ajv-keywords": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
- "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "fast-deep-equal": "^3.1.3"
- },
- "peerDependencies": {
- "ajv": "^8.8.2"
- }
- },
- "node_modules/webpack/node_modules/eslint-scope": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
- "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
- "dev": true,
- "license": "BSD-2-Clause",
- "dependencies": {
- "esrecurse": "^4.3.0",
- "estraverse": "^4.1.1"
- },
- "engines": {
- "node": ">=8.0.0"
- }
- },
- "node_modules/webpack/node_modules/estraverse": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
- "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
- "dev": true,
- "license": "BSD-2-Clause",
- "engines": {
- "node": ">=4.0"
- }
- },
- "node_modules/webpack/node_modules/json-schema-traverse": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
- "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/webpack/node_modules/mime-db": {
- "version": "1.52.0",
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
- "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/webpack/node_modules/mime-types": {
- "version": "2.1.35",
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
- "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "mime-db": "1.52.0"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/webpack/node_modules/schema-utils": {
- "version": "4.3.3",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz",
- "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/json-schema": "^7.0.9",
- "ajv": "^8.9.0",
- "ajv-formats": "^2.1.1",
- "ajv-keywords": "^5.1.0"
- },
- "engines": {
- "node": ">= 10.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- }
- },
- "node_modules/which": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
- "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
- "license": "ISC",
- "dependencies": {
- "isexe": "^2.0.0"
- },
- "bin": {
- "node-which": "bin/node-which"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/which-boxed-primitive": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz",
- "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-bigint": "^1.1.0",
- "is-boolean-object": "^1.2.1",
- "is-number-object": "^1.1.1",
- "is-string": "^1.1.1",
- "is-symbol": "^1.1.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/which-builtin-type": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz",
- "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "call-bound": "^1.0.2",
- "function.prototype.name": "^1.1.6",
- "has-tostringtag": "^1.0.2",
- "is-async-function": "^2.0.0",
- "is-date-object": "^1.1.0",
- "is-finalizationregistry": "^1.1.0",
- "is-generator-function": "^1.0.10",
- "is-regex": "^1.2.1",
- "is-weakref": "^1.0.2",
- "isarray": "^2.0.5",
- "which-boxed-primitive": "^1.1.0",
- "which-collection": "^1.0.2",
- "which-typed-array": "^1.1.16"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/which-collection": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz",
- "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-map": "^2.0.3",
- "is-set": "^2.0.3",
- "is-weakmap": "^2.0.2",
- "is-weakset": "^2.0.3"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/which-typed-array": {
- "version": "1.1.19",
- "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz",
- "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==",
- "license": "MIT",
- "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"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/word-wrap": {
- "version": "1.2.5",
- "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
- "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/wordwrap": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
- "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/wrap-ansi": {
- "version": "6.2.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
- "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^4.0.0",
- "string-width": "^4.1.0",
- "strip-ansi": "^6.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/wrap-ansi-cjs": {
- "name": "wrap-ansi",
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
- "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^4.0.0",
- "string-width": "^4.1.0",
- "strip-ansi": "^6.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
- }
- },
- "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
- "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
- "license": "MIT",
- "dependencies": {
- "ansi-regex": "^5.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/wrap-ansi/node_modules/strip-ansi": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
- "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ansi-regex": "^5.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/wrappy": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
- "license": "ISC"
- },
- "node_modules/write-file-atomic": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz",
- "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "imurmurhash": "^0.1.4",
- "signal-exit": "^4.0.1"
- },
- "engines": {
- "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
- }
- },
- "node_modules/ws": {
- "version": "8.17.1",
- "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz",
- "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==",
- "license": "MIT",
- "engines": {
- "node": ">=10.0.0"
- },
- "peerDependencies": {
- "bufferutil": "^4.0.1",
- "utf-8-validate": ">=5.0.2"
- },
- "peerDependenciesMeta": {
- "bufferutil": {
- "optional": true
- },
- "utf-8-validate": {
- "optional": true
- }
- }
- },
- "node_modules/xtend": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
- "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
- "license": "MIT",
- "engines": {
- "node": ">=0.4"
- }
- },
- "node_modules/y18n": {
- "version": "5.0.8",
- "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
- "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
- "license": "ISC",
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/yallist": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
- "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/yargs": {
- "version": "17.7.2",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
- "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
- "license": "MIT",
- "dependencies": {
- "cliui": "^8.0.1",
- "escalade": "^3.1.1",
- "get-caller-file": "^2.0.5",
- "require-directory": "^2.1.1",
- "string-width": "^4.2.3",
- "y18n": "^5.0.5",
- "yargs-parser": "^21.1.1"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/yargs-parser": {
- "version": "21.1.1",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
- "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
- "license": "ISC",
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/yn": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
- "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==",
- "devOptional": true,
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/yocto-queue": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
- "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/yoctocolors-cjs": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz",
- "integrity": "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=18"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/zod": {
- "version": "4.1.12",
- "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.12.tgz",
- "integrity": "sha512-JInaHOamG8pt5+Ey8kGmdcAcg3OL9reK8ltczgHTAwNhMys/6ThXHityHxVV2p3fkw/c+MAvBHFVYHFZDmjMCQ==",
- "dev": true,
- "license": "MIT",
- "funding": {
- "url": "https://github.com/sponsors/colinhacks"
- }
- },
- "node_modules/zod-validation-error": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz",
- "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==",
- "dev": true,
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz",
+ "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==",
+ "funding": [
+ "https://github.com/sponsors/broofa",
+ "https://github.com/sponsors/ctavan"
+ ],
"license": "MIT",
- "engines": {
- "node": ">=18.0.0"
- },
- "peerDependencies": {
- "zod": "^3.25.0 || ^4.0.0"
+ "bin": {
+ "uuid": "dist/esm/bin/uuid"
}
},
- "paymaster/admin": {
- "version": "0.1.0",
- "extraneous": true,
- "dependencies": {
- "@svgr/webpack": "^8.1.0",
- "@testing-library/dom": "^10.4.1",
- "@testing-library/jest-dom": "^6.8.0",
- "@testing-library/react": "^16.3.0",
- "@testing-library/user-event": "^14.6.1",
- "@types/jest": "^30.0.0",
- "@types/react": "^19.1.15",
- "@types/react-dom": "^19.1.9",
- "ethers": "^6.15.0",
- "react": "^19.1.1",
- "react-dom": "^19.1.1",
- "typescript": "^5.9.2",
- "web-vitals": "^5.1.0"
+ "node_modules/typescript": {
+ "version": "5.9.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
+ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
+ "license": "Apache-2.0",
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
},
- "devDependencies": {
- "@eslint/js": "^9.37.0",
- "@types/node": "^24.7.0",
- "@typescript-eslint/eslint-plugin": "^8.45.0",
- "@typescript-eslint/parser": "^8.45.0",
- "@vitejs/plugin-react": "^5.0.4",
- "eslint": "^9.37.0",
- "eslint-plugin-react": "^7.37.5",
- "eslint-plugin-react-hooks": "^6.1.1",
- "vite": "^7.1.7"
+ "engines": {
+ "node": ">=14.17"
}
},
- "sdk": {
- "name": "@yaaa/sdk",
- "version": "0.1.0",
+ "node_modules/typescript-eslint": {
+ "version": "8.46.2",
+ "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.46.2.tgz",
+ "integrity": "sha512-vbw8bOmiuYNdzzV3lsiWv6sRwjyuKJMQqWulBOU7M0RrxedXledX8G8kBbQeiOYDnTfiXz0Y4081E1QMNB6iQg==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "@noble/curves": "^2.0.1",
- "@simplewebauthn/browser": "^13.2.2",
- "axios": "^1.12.2"
+ "@typescript-eslint/eslint-plugin": "8.46.2",
+ "@typescript-eslint/parser": "8.46.2",
+ "@typescript-eslint/typescript-estree": "8.46.2",
+ "@typescript-eslint/utils": "8.46.2"
},
- "devDependencies": {
- "@eslint/js": "^9.17.0",
- "@types/jest": "^29.5.12",
- "@types/node": "^20.11.17",
- "eslint": "^9.17.0",
- "ethers": "^6.11.1",
- "jest": "^29.7.0",
- "ts-jest": "^29.1.2",
- "tsup": "^8.0.2",
- "typescript": "^5.3.3",
- "typescript-eslint": "^8.18.2"
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
},
"peerDependencies": {
- "ethers": "^6.0.0"
+ "eslint": "^8.57.0 || ^9.0.0",
+ "typescript": ">=4.8.4 <6.0.0"
}
},
- "sdk/node_modules/@jest/console": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz",
- "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==",
+ "node_modules/uglify-js": {
+ "version": "3.19.3",
+ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz",
+ "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==",
"dev": true,
- "license": "MIT",
- "dependencies": {
- "@jest/types": "^29.6.3",
- "@types/node": "*",
- "chalk": "^4.0.0",
- "jest-message-util": "^29.7.0",
- "jest-util": "^29.7.0",
- "slash": "^3.0.0"
+ "license": "BSD-2-Clause",
+ "optional": true,
+ "bin": {
+ "uglifyjs": "bin/uglifyjs"
},
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": ">=0.8.0"
}
},
- "sdk/node_modules/@jest/core": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz",
- "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==",
- "dev": true,
+ "node_modules/uid": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/uid/-/uid-2.0.2.tgz",
+ "integrity": "sha512-u3xV3X7uzvi5b1MncmZo3i2Aw222Zk1keqLA1YkHldREkAhAqi65wuPfe7lHx8H/Wzy+8CE7S7uS3jekIM5s8g==",
"license": "MIT",
"dependencies": {
- "@jest/console": "^29.7.0",
- "@jest/reporters": "^29.7.0",
- "@jest/test-result": "^29.7.0",
- "@jest/transform": "^29.7.0",
- "@jest/types": "^29.6.3",
- "@types/node": "*",
- "ansi-escapes": "^4.2.1",
- "chalk": "^4.0.0",
- "ci-info": "^3.2.0",
- "exit": "^0.1.2",
- "graceful-fs": "^4.2.9",
- "jest-changed-files": "^29.7.0",
- "jest-config": "^29.7.0",
- "jest-haste-map": "^29.7.0",
- "jest-message-util": "^29.7.0",
- "jest-regex-util": "^29.6.3",
- "jest-resolve": "^29.7.0",
- "jest-resolve-dependencies": "^29.7.0",
- "jest-runner": "^29.7.0",
- "jest-runtime": "^29.7.0",
- "jest-snapshot": "^29.7.0",
- "jest-util": "^29.7.0",
- "jest-validate": "^29.7.0",
- "jest-watcher": "^29.7.0",
- "micromatch": "^4.0.4",
- "pretty-format": "^29.7.0",
- "slash": "^3.0.0",
- "strip-ansi": "^6.0.0"
+ "@lukeed/csprng": "^1.0.0"
},
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- },
- "peerDependencies": {
- "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
- },
- "peerDependenciesMeta": {
- "node-notifier": {
- "optional": true
- }
+ "node": ">=8"
}
},
- "sdk/node_modules/@jest/environment": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz",
- "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==",
- "dev": true,
+ "node_modules/uint8array-extras": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/uint8array-extras/-/uint8array-extras-1.5.0.tgz",
+ "integrity": "sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A==",
"license": "MIT",
- "dependencies": {
- "@jest/fake-timers": "^29.7.0",
- "@jest/types": "^29.6.3",
- "@types/node": "*",
- "jest-mock": "^29.7.0"
- },
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "sdk/node_modules/@jest/expect": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz",
- "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==",
+ "node_modules/unbox-primitive": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz",
+ "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "expect": "^29.7.0",
- "jest-snapshot": "^29.7.0"
+ "call-bound": "^1.0.3",
+ "has-bigints": "^1.0.2",
+ "has-symbols": "^1.1.0",
+ "which-boxed-primitive": "^1.1.1"
},
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "sdk/node_modules/@jest/expect-utils": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz",
- "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==",
+ "node_modules/undefsafe": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz",
+ "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/undici-types": {
+ "version": "7.16.0",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz",
+ "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==",
+ "license": "MIT"
+ },
+ "node_modules/universalify": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
+ "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "jest-get-type": "^29.6.3"
- },
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": ">= 10.0.0"
}
},
- "sdk/node_modules/@jest/fake-timers": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz",
- "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==",
- "dev": true,
+ "node_modules/unpipe": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+ "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
"license": "MIT",
- "dependencies": {
- "@jest/types": "^29.6.3",
- "@sinonjs/fake-timers": "^10.0.2",
- "@types/node": "*",
- "jest-message-util": "^29.7.0",
- "jest-mock": "^29.7.0",
- "jest-util": "^29.7.0"
- },
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": ">= 0.8"
}
},
- "sdk/node_modules/@jest/globals": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz",
- "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==",
+ "node_modules/unrs-resolver": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz",
+ "integrity": "sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==",
"dev": true,
+ "hasInstallScript": true,
"license": "MIT",
"dependencies": {
- "@jest/environment": "^29.7.0",
- "@jest/expect": "^29.7.0",
- "@jest/types": "^29.6.3",
- "jest-mock": "^29.7.0"
+ "napi-postinstall": "^0.3.0"
},
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "funding": {
+ "url": "https://opencollective.com/unrs-resolver"
+ },
+ "optionalDependencies": {
+ "@unrs/resolver-binding-android-arm-eabi": "1.11.1",
+ "@unrs/resolver-binding-android-arm64": "1.11.1",
+ "@unrs/resolver-binding-darwin-arm64": "1.11.1",
+ "@unrs/resolver-binding-darwin-x64": "1.11.1",
+ "@unrs/resolver-binding-freebsd-x64": "1.11.1",
+ "@unrs/resolver-binding-linux-arm-gnueabihf": "1.11.1",
+ "@unrs/resolver-binding-linux-arm-musleabihf": "1.11.1",
+ "@unrs/resolver-binding-linux-arm64-gnu": "1.11.1",
+ "@unrs/resolver-binding-linux-arm64-musl": "1.11.1",
+ "@unrs/resolver-binding-linux-ppc64-gnu": "1.11.1",
+ "@unrs/resolver-binding-linux-riscv64-gnu": "1.11.1",
+ "@unrs/resolver-binding-linux-riscv64-musl": "1.11.1",
+ "@unrs/resolver-binding-linux-s390x-gnu": "1.11.1",
+ "@unrs/resolver-binding-linux-x64-gnu": "1.11.1",
+ "@unrs/resolver-binding-linux-x64-musl": "1.11.1",
+ "@unrs/resolver-binding-wasm32-wasi": "1.11.1",
+ "@unrs/resolver-binding-win32-arm64-msvc": "1.11.1",
+ "@unrs/resolver-binding-win32-ia32-msvc": "1.11.1",
+ "@unrs/resolver-binding-win32-x64-msvc": "1.11.1"
}
},
- "sdk/node_modules/@jest/reporters": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz",
- "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==",
+ "node_modules/update-browserslist-db": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz",
+ "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==",
"dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
"license": "MIT",
"dependencies": {
- "@bcoe/v8-coverage": "^0.2.3",
- "@jest/console": "^29.7.0",
- "@jest/test-result": "^29.7.0",
- "@jest/transform": "^29.7.0",
- "@jest/types": "^29.6.3",
- "@jridgewell/trace-mapping": "^0.3.18",
- "@types/node": "*",
- "chalk": "^4.0.0",
- "collect-v8-coverage": "^1.0.0",
- "exit": "^0.1.2",
- "glob": "^7.1.3",
- "graceful-fs": "^4.2.9",
- "istanbul-lib-coverage": "^3.0.0",
- "istanbul-lib-instrument": "^6.0.0",
- "istanbul-lib-report": "^3.0.0",
- "istanbul-lib-source-maps": "^4.0.0",
- "istanbul-reports": "^3.1.3",
- "jest-message-util": "^29.7.0",
- "jest-util": "^29.7.0",
- "jest-worker": "^29.7.0",
- "slash": "^3.0.0",
- "string-length": "^4.0.1",
- "strip-ansi": "^6.0.0",
- "v8-to-istanbul": "^9.0.1"
+ "escalade": "^3.2.0",
+ "picocolors": "^1.1.1"
},
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "bin": {
+ "update-browserslist-db": "cli.js"
},
"peerDependencies": {
- "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
- },
- "peerDependenciesMeta": {
- "node-notifier": {
- "optional": true
- }
+ "browserslist": ">= 4.21.0"
+ }
+ },
+ "node_modules/uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "node_modules/use-sync-external-store": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz",
+ "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==",
+ "license": "MIT",
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
}
},
- "sdk/node_modules/@jest/schemas": {
- "version": "29.6.3",
- "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz",
- "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==",
- "dev": true,
+ "node_modules/util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
+ "license": "MIT"
+ },
+ "node_modules/utility-types": {
+ "version": "3.11.0",
+ "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.11.0.tgz",
+ "integrity": "sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==",
"license": "MIT",
- "dependencies": {
- "@sinclair/typebox": "^0.27.8"
- },
+ "optional": true,
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": ">= 4"
}
},
- "sdk/node_modules/@jest/source-map": {
- "version": "29.6.3",
- "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz",
- "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==",
- "dev": true,
+ "node_modules/utils-merge": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
+ "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
"license": "MIT",
- "dependencies": {
- "@jridgewell/trace-mapping": "^0.3.18",
- "callsites": "^3.0.0",
- "graceful-fs": "^4.2.9"
- },
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": ">= 0.4.0"
}
},
- "sdk/node_modules/@jest/test-result": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz",
- "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==",
- "dev": true,
+ "node_modules/uuid": {
+ "version": "13.0.0",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-13.0.0.tgz",
+ "integrity": "sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w==",
+ "funding": [
+ "https://github.com/sponsors/broofa",
+ "https://github.com/sponsors/ctavan"
+ ],
"license": "MIT",
- "dependencies": {
- "@jest/console": "^29.7.0",
- "@jest/types": "^29.6.3",
- "@types/istanbul-lib-coverage": "^2.0.0",
- "collect-v8-coverage": "^1.0.0"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "bin": {
+ "uuid": "dist-node/bin/uuid"
}
},
- "sdk/node_modules/@jest/test-sequencer": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz",
- "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==",
+ "node_modules/v8-compile-cache-lib": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz",
+ "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==",
+ "devOptional": true,
+ "license": "MIT"
+ },
+ "node_modules/v8-to-istanbul": {
+ "version": "9.3.0",
+ "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz",
+ "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==",
"dev": true,
- "license": "MIT",
+ "license": "ISC",
"dependencies": {
- "@jest/test-result": "^29.7.0",
- "graceful-fs": "^4.2.9",
- "jest-haste-map": "^29.7.0",
- "slash": "^3.0.0"
+ "@jridgewell/trace-mapping": "^0.3.12",
+ "@types/istanbul-lib-coverage": "^2.0.1",
+ "convert-source-map": "^2.0.0"
},
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": ">=10.12.0"
}
},
- "sdk/node_modules/@jest/transform": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz",
- "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==",
- "dev": true,
+ "node_modules/validator": {
+ "version": "13.15.26",
+ "resolved": "https://registry.npmjs.org/validator/-/validator-13.15.26.tgz",
+ "integrity": "sha512-spH26xU080ydGggxRyR1Yhcbgx+j3y5jbNXk/8L+iRvdIEQ4uTRH2Sgf2dokud6Q4oAtsbNvJ1Ft+9xmm6IZcA==",
"license": "MIT",
- "dependencies": {
- "@babel/core": "^7.11.6",
- "@jest/types": "^29.6.3",
- "@jridgewell/trace-mapping": "^0.3.18",
- "babel-plugin-istanbul": "^6.1.1",
- "chalk": "^4.0.0",
- "convert-source-map": "^2.0.0",
- "fast-json-stable-stringify": "^2.1.0",
- "graceful-fs": "^4.2.9",
- "jest-haste-map": "^29.7.0",
- "jest-regex-util": "^29.6.3",
- "jest-util": "^29.7.0",
- "micromatch": "^4.0.4",
- "pirates": "^4.0.4",
- "slash": "^3.0.0",
- "write-file-atomic": "^4.0.2"
- },
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": ">= 0.10"
}
},
- "sdk/node_modules/@jest/types": {
- "version": "29.6.3",
- "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz",
- "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==",
- "dev": true,
+ "node_modules/vary": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
+ "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
"license": "MIT",
- "dependencies": {
- "@jest/schemas": "^29.6.3",
- "@types/istanbul-lib-coverage": "^2.0.0",
- "@types/istanbul-reports": "^3.0.0",
- "@types/node": "*",
- "@types/yargs": "^17.0.8",
- "chalk": "^4.0.0"
- },
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": ">= 0.8"
}
},
- "sdk/node_modules/@sinclair/typebox": {
- "version": "0.27.8",
- "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz",
- "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==",
- "dev": true,
- "license": "MIT"
- },
- "sdk/node_modules/@sinonjs/fake-timers": {
- "version": "10.3.0",
- "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz",
- "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==",
- "dev": true,
- "license": "BSD-3-Clause",
+ "node_modules/viem": {
+ "version": "2.47.6",
+ "resolved": "https://registry.npmjs.org/viem/-/viem-2.47.6.tgz",
+ "integrity": "sha512-zExmbI99NGvMdYa7fmqSTLgkwh48dmhgEqFrUgkpL4kfG4XkVefZ8dZqIKVUhZo6Uhf0FrrEXOsHm9LUyIvI2Q==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/wevm"
+ }
+ ],
+ "license": "MIT",
"dependencies": {
- "@sinonjs/commons": "^3.0.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",
+ "isows": "1.0.7",
+ "ox": "0.14.7",
+ "ws": "8.18.3"
+ },
+ "peerDependencies": {
+ "typescript": ">=5.0.4"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
}
},
- "sdk/node_modules/@types/jest": {
- "version": "29.5.14",
- "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.14.tgz",
- "integrity": "sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==",
- "dev": true,
+ "node_modules/viem/node_modules/@noble/curves": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.1.tgz",
+ "integrity": "sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==",
"license": "MIT",
"dependencies": {
- "expect": "^29.0.0",
- "pretty-format": "^29.0.0"
+ "@noble/hashes": "1.8.0"
+ },
+ "engines": {
+ "node": "^14.21.3 || >=16"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
}
},
- "sdk/node_modules/@types/node": {
- "version": "20.19.27",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.27.tgz",
- "integrity": "sha512-N2clP5pJhB2YnZJ3PIHFk5RkygRX5WO/5f0WC08tp0wd+sv0rsJk3MqWn3CbNmT2J505a5336jaQj4ph1AdMug==",
- "dev": true,
+ "node_modules/viem/node_modules/@noble/hashes": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz",
+ "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==",
"license": "MIT",
- "dependencies": {
- "undici-types": "~6.21.0"
+ "engines": {
+ "node": "^14.21.3 || >=16"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
}
},
- "sdk/node_modules/babel-jest": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz",
- "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==",
- "dev": true,
+ "node_modules/viem/node_modules/ws": {
+ "version": "8.18.3",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz",
+ "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==",
"license": "MIT",
- "dependencies": {
- "@jest/transform": "^29.7.0",
- "@types/babel__core": "^7.1.14",
- "babel-plugin-istanbul": "^6.1.1",
- "babel-preset-jest": "^29.6.3",
- "chalk": "^4.0.0",
- "graceful-fs": "^4.2.9",
- "slash": "^3.0.0"
- },
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": ">=10.0.0"
},
"peerDependencies": {
- "@babel/core": "^7.8.0"
+ "bufferutil": "^4.0.1",
+ "utf-8-validate": ">=5.0.2"
+ },
+ "peerDependenciesMeta": {
+ "bufferutil": {
+ "optional": true
+ },
+ "utf-8-validate": {
+ "optional": true
+ }
}
},
- "sdk/node_modules/babel-plugin-istanbul": {
- "version": "6.1.1",
- "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz",
- "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==",
+ "node_modules/walker": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz",
+ "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==",
"dev": true,
- "license": "BSD-3-Clause",
+ "license": "Apache-2.0",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.0.0",
- "@istanbuljs/load-nyc-config": "^1.0.0",
- "@istanbuljs/schema": "^0.1.2",
- "istanbul-lib-instrument": "^5.0.4",
- "test-exclude": "^6.0.0"
- },
- "engines": {
- "node": ">=8"
+ "makeerror": "1.0.12"
}
},
- "sdk/node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz",
- "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==",
+ "node_modules/watchpack": {
+ "version": "2.4.4",
+ "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.4.tgz",
+ "integrity": "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==",
"dev": true,
- "license": "BSD-3-Clause",
+ "license": "MIT",
"dependencies": {
- "@babel/core": "^7.12.3",
- "@babel/parser": "^7.14.7",
- "@istanbuljs/schema": "^0.1.2",
- "istanbul-lib-coverage": "^3.2.0",
- "semver": "^6.3.0"
+ "glob-to-regexp": "^0.4.1",
+ "graceful-fs": "^4.1.2"
},
"engines": {
- "node": ">=8"
- }
- },
- "sdk/node_modules/babel-plugin-istanbul/node_modules/semver": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
- "dev": true,
- "license": "ISC",
- "bin": {
- "semver": "bin/semver.js"
+ "node": ">=10.13.0"
}
},
- "sdk/node_modules/babel-plugin-jest-hoist": {
- "version": "29.6.3",
- "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz",
- "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==",
+ "node_modules/wcwidth": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz",
+ "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/template": "^7.3.3",
- "@babel/types": "^7.3.3",
- "@types/babel__core": "^7.1.14",
- "@types/babel__traverse": "^7.0.6"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "defaults": "^1.0.3"
}
},
- "sdk/node_modules/babel-preset-jest": {
- "version": "29.6.3",
- "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz",
- "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==",
+ "node_modules/webpack": {
+ "version": "5.104.1",
+ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.104.1.tgz",
+ "integrity": "sha512-Qphch25abbMNtekmEGJmeRUhLDbe+QfiWTiqpKYkpCOWY64v9eyl+KRRLmqOFA2AvKPpc9DC6+u2n76tQLBoaA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "babel-plugin-jest-hoist": "^29.6.3",
- "babel-preset-current-node-syntax": "^1.0.0"
+ "@types/eslint-scope": "^3.7.7",
+ "@types/estree": "^1.0.8",
+ "@types/json-schema": "^7.0.15",
+ "@webassemblyjs/ast": "^1.14.1",
+ "@webassemblyjs/wasm-edit": "^1.14.1",
+ "@webassemblyjs/wasm-parser": "^1.14.1",
+ "acorn": "^8.15.0",
+ "acorn-import-phases": "^1.0.3",
+ "browserslist": "^4.28.1",
+ "chrome-trace-event": "^1.0.2",
+ "enhanced-resolve": "^5.17.4",
+ "es-module-lexer": "^2.0.0",
+ "eslint-scope": "5.1.1",
+ "events": "^3.2.0",
+ "glob-to-regexp": "^0.4.1",
+ "graceful-fs": "^4.2.11",
+ "json-parse-even-better-errors": "^2.3.1",
+ "loader-runner": "^4.3.1",
+ "mime-types": "^2.1.27",
+ "neo-async": "^2.6.2",
+ "schema-utils": "^4.3.3",
+ "tapable": "^2.3.0",
+ "terser-webpack-plugin": "^5.3.16",
+ "watchpack": "^2.4.4",
+ "webpack-sources": "^3.3.3"
},
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "bin": {
+ "webpack": "bin/webpack.js"
},
- "peerDependencies": {
- "@babel/core": "^7.0.0"
- }
- },
- "sdk/node_modules/camelcase": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
- "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
- "dev": true,
- "license": "MIT",
"engines": {
- "node": ">=10"
+ "node": ">=10.13.0"
},
"funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "sdk/node_modules/ci-info": {
- "version": "3.9.0",
- "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
- "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/sibiraj-s"
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependenciesMeta": {
+ "webpack-cli": {
+ "optional": true
}
- ],
- "license": "MIT",
- "engines": {
- "node": ">=8"
}
},
- "sdk/node_modules/cjs-module-lexer": {
- "version": "1.4.3",
- "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz",
- "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==",
- "dev": true,
- "license": "MIT"
- },
- "sdk/node_modules/expect": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz",
- "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==",
+ "node_modules/webpack-node-externals": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/webpack-node-externals/-/webpack-node-externals-3.0.0.tgz",
+ "integrity": "sha512-LnL6Z3GGDPht/AigwRh2dvL9PQPFQ8skEpVrWZXLWBYmqcaojHNN0onvHzie6rq7EWKrrBfPYqNEzTJgiwEQDQ==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "@jest/expect-utils": "^29.7.0",
- "jest-get-type": "^29.6.3",
- "jest-matcher-utils": "^29.7.0",
- "jest-message-util": "^29.7.0",
- "jest-util": "^29.7.0"
- },
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": ">=6"
}
},
- "sdk/node_modules/glob": {
- "version": "7.2.3",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
- "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
- "deprecated": "Glob versions prior to v9 are no longer supported",
+ "node_modules/webpack-sources": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz",
+ "integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==",
"dev": true,
- "license": "ISC",
- "dependencies": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.1.1",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- },
+ "license": "MIT",
"engines": {
- "node": "*"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
+ "node": ">=10.13.0"
}
},
- "sdk/node_modules/istanbul-lib-source-maps": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz",
- "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==",
+ "node_modules/webpack/node_modules/ajv": {
+ "version": "8.18.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz",
+ "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==",
"dev": true,
- "license": "BSD-3-Clause",
+ "license": "MIT",
"dependencies": {
- "debug": "^4.1.1",
- "istanbul-lib-coverage": "^3.0.0",
- "source-map": "^0.6.1"
+ "fast-deep-equal": "^3.1.3",
+ "fast-uri": "^3.0.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2"
},
- "engines": {
- "node": ">=10"
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
}
},
- "sdk/node_modules/jest": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz",
- "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==",
+ "node_modules/webpack/node_modules/ajv-formats": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz",
+ "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@jest/core": "^29.7.0",
- "@jest/types": "^29.6.3",
- "import-local": "^3.0.2",
- "jest-cli": "^29.7.0"
- },
- "bin": {
- "jest": "bin/jest.js"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "ajv": "^8.0.0"
},
"peerDependencies": {
- "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
+ "ajv": "^8.0.0"
},
"peerDependenciesMeta": {
- "node-notifier": {
+ "ajv": {
"optional": true
}
}
},
- "sdk/node_modules/jest-changed-files": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz",
- "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==",
+ "node_modules/webpack/node_modules/ajv-keywords": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
+ "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "execa": "^5.0.0",
- "jest-util": "^29.7.0",
- "p-limit": "^3.1.0"
+ "fast-deep-equal": "^3.1.3"
},
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "peerDependencies": {
+ "ajv": "^8.8.2"
}
},
- "sdk/node_modules/jest-circus": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz",
- "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==",
+ "node_modules/webpack/node_modules/eslint-scope": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
+ "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
"dev": true,
- "license": "MIT",
+ "license": "BSD-2-Clause",
"dependencies": {
- "@jest/environment": "^29.7.0",
- "@jest/expect": "^29.7.0",
- "@jest/test-result": "^29.7.0",
- "@jest/types": "^29.6.3",
- "@types/node": "*",
- "chalk": "^4.0.0",
- "co": "^4.6.0",
- "dedent": "^1.0.0",
- "is-generator-fn": "^2.0.0",
- "jest-each": "^29.7.0",
- "jest-matcher-utils": "^29.7.0",
- "jest-message-util": "^29.7.0",
- "jest-runtime": "^29.7.0",
- "jest-snapshot": "^29.7.0",
- "jest-util": "^29.7.0",
- "p-limit": "^3.1.0",
- "pretty-format": "^29.7.0",
- "pure-rand": "^6.0.0",
- "slash": "^3.0.0",
- "stack-utils": "^2.0.3"
+ "esrecurse": "^4.3.0",
+ "estraverse": "^4.1.1"
},
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": ">=8.0.0"
}
},
- "sdk/node_modules/jest-cli": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz",
- "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==",
+ "node_modules/webpack/node_modules/estraverse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
"dev": true,
- "license": "MIT",
- "dependencies": {
- "@jest/core": "^29.7.0",
- "@jest/test-result": "^29.7.0",
- "@jest/types": "^29.6.3",
- "chalk": "^4.0.0",
- "create-jest": "^29.7.0",
- "exit": "^0.1.2",
- "import-local": "^3.0.2",
- "jest-config": "^29.7.0",
- "jest-util": "^29.7.0",
- "jest-validate": "^29.7.0",
- "yargs": "^17.3.1"
- },
- "bin": {
- "jest": "bin/jest.js"
- },
+ "license": "BSD-2-Clause",
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- },
- "peerDependencies": {
- "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
- },
- "peerDependenciesMeta": {
- "node-notifier": {
- "optional": true
- }
+ "node": ">=4.0"
}
},
- "sdk/node_modules/jest-config": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz",
- "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==",
+ "node_modules/webpack/node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/webpack/node_modules/mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "@babel/core": "^7.11.6",
- "@jest/test-sequencer": "^29.7.0",
- "@jest/types": "^29.6.3",
- "babel-jest": "^29.7.0",
- "chalk": "^4.0.0",
- "ci-info": "^3.2.0",
- "deepmerge": "^4.2.2",
- "glob": "^7.1.3",
- "graceful-fs": "^4.2.9",
- "jest-circus": "^29.7.0",
- "jest-environment-node": "^29.7.0",
- "jest-get-type": "^29.6.3",
- "jest-regex-util": "^29.6.3",
- "jest-resolve": "^29.7.0",
- "jest-runner": "^29.7.0",
- "jest-util": "^29.7.0",
- "jest-validate": "^29.7.0",
- "micromatch": "^4.0.4",
- "parse-json": "^5.2.0",
- "pretty-format": "^29.7.0",
- "slash": "^3.0.0",
- "strip-json-comments": "^3.1.1"
- },
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- },
- "peerDependencies": {
- "@types/node": "*",
- "ts-node": ">=9.0.0"
- },
- "peerDependenciesMeta": {
- "@types/node": {
- "optional": true
- },
- "ts-node": {
- "optional": true
- }
+ "node": ">= 0.6"
}
},
- "sdk/node_modules/jest-diff": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz",
- "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==",
+ "node_modules/webpack/node_modules/mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "chalk": "^4.0.0",
- "diff-sequences": "^29.6.3",
- "jest-get-type": "^29.6.3",
- "pretty-format": "^29.7.0"
+ "mime-db": "1.52.0"
},
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": ">= 0.6"
}
},
- "sdk/node_modules/jest-docblock": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz",
- "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==",
+ "node_modules/webpack/node_modules/schema-utils": {
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz",
+ "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "detect-newline": "^3.0.0"
+ "@types/json-schema": "^7.0.9",
+ "ajv": "^8.9.0",
+ "ajv-formats": "^2.1.1",
+ "ajv-keywords": "^5.1.0"
},
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": ">= 10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
}
},
- "sdk/node_modules/jest-each": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz",
- "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==",
- "dev": true,
- "license": "MIT",
+ "node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "license": "ISC",
"dependencies": {
- "@jest/types": "^29.6.3",
- "chalk": "^4.0.0",
- "jest-get-type": "^29.6.3",
- "jest-util": "^29.7.0",
- "pretty-format": "^29.7.0"
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
},
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": ">= 8"
}
},
- "sdk/node_modules/jest-environment-node": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz",
- "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==",
+ "node_modules/which-boxed-primitive": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz",
+ "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@jest/environment": "^29.7.0",
- "@jest/fake-timers": "^29.7.0",
- "@jest/types": "^29.6.3",
- "@types/node": "*",
- "jest-mock": "^29.7.0",
- "jest-util": "^29.7.0"
+ "is-bigint": "^1.1.0",
+ "is-boolean-object": "^1.2.1",
+ "is-number-object": "^1.1.1",
+ "is-string": "^1.1.1",
+ "is-symbol": "^1.1.1"
},
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "sdk/node_modules/jest-haste-map": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz",
- "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==",
+ "node_modules/which-builtin-type": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz",
+ "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@jest/types": "^29.6.3",
- "@types/graceful-fs": "^4.1.3",
- "@types/node": "*",
- "anymatch": "^3.0.3",
- "fb-watchman": "^2.0.0",
- "graceful-fs": "^4.2.9",
- "jest-regex-util": "^29.6.3",
- "jest-util": "^29.7.0",
- "jest-worker": "^29.7.0",
- "micromatch": "^4.0.4",
- "walker": "^1.0.8"
+ "call-bound": "^1.0.2",
+ "function.prototype.name": "^1.1.6",
+ "has-tostringtag": "^1.0.2",
+ "is-async-function": "^2.0.0",
+ "is-date-object": "^1.1.0",
+ "is-finalizationregistry": "^1.1.0",
+ "is-generator-function": "^1.0.10",
+ "is-regex": "^1.2.1",
+ "is-weakref": "^1.0.2",
+ "isarray": "^2.0.5",
+ "which-boxed-primitive": "^1.1.0",
+ "which-collection": "^1.0.2",
+ "which-typed-array": "^1.1.16"
},
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": ">= 0.4"
},
- "optionalDependencies": {
- "fsevents": "^2.3.2"
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "sdk/node_modules/jest-leak-detector": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz",
- "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==",
+ "node_modules/which-collection": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz",
+ "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "jest-get-type": "^29.6.3",
- "pretty-format": "^29.7.0"
+ "is-map": "^2.0.3",
+ "is-set": "^2.0.3",
+ "is-weakmap": "^2.0.2",
+ "is-weakset": "^2.0.3"
},
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "sdk/node_modules/jest-matcher-utils": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz",
- "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==",
- "dev": true,
+ "node_modules/which-typed-array": {
+ "version": "1.1.19",
+ "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz",
+ "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==",
"license": "MIT",
"dependencies": {
- "chalk": "^4.0.0",
- "jest-diff": "^29.7.0",
- "jest-get-type": "^29.6.3",
- "pretty-format": "^29.7.0"
+ "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"
},
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "sdk/node_modules/jest-message-util": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz",
- "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==",
+ "node_modules/word-wrap": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
+ "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "@babel/code-frame": "^7.12.13",
- "@jest/types": "^29.6.3",
- "@types/stack-utils": "^2.0.0",
- "chalk": "^4.0.0",
- "graceful-fs": "^4.2.9",
- "micromatch": "^4.0.4",
- "pretty-format": "^29.7.0",
- "slash": "^3.0.0",
- "stack-utils": "^2.0.3"
- },
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": ">=0.10.0"
}
},
- "sdk/node_modules/jest-mock": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz",
- "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==",
+ "node_modules/wordwrap": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
+ "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/wrap-ansi": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
+ "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@jest/types": "^29.6.3",
- "@types/node": "*",
- "jest-util": "^29.7.0"
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
},
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": ">=8"
}
},
- "sdk/node_modules/jest-regex-util": {
- "version": "29.6.3",
- "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz",
- "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==",
- "dev": true,
+ "node_modules/wrap-ansi-cjs": {
+ "name": "wrap-ansi",
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
"license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
}
},
- "sdk/node_modules/jest-resolve": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz",
- "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==",
- "dev": true,
+ "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
"license": "MIT",
"dependencies": {
- "chalk": "^4.0.0",
- "graceful-fs": "^4.2.9",
- "jest-haste-map": "^29.7.0",
- "jest-pnp-resolver": "^1.2.2",
- "jest-util": "^29.7.0",
- "jest-validate": "^29.7.0",
- "resolve": "^1.20.0",
- "resolve.exports": "^2.0.0",
- "slash": "^3.0.0"
+ "ansi-regex": "^5.0.1"
},
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": ">=8"
}
},
- "sdk/node_modules/jest-resolve-dependencies": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz",
- "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==",
+ "node_modules/wrap-ansi/node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
"dev": true,
"license": "MIT",
"dependencies": {
- "jest-regex-util": "^29.6.3",
- "jest-snapshot": "^29.7.0"
+ "ansi-regex": "^5.0.1"
},
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": ">=8"
}
},
- "sdk/node_modules/jest-runner": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz",
- "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==",
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
+ "license": "ISC"
+ },
+ "node_modules/write-file-atomic": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz",
+ "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==",
"dev": true,
- "license": "MIT",
+ "license": "ISC",
"dependencies": {
- "@jest/console": "^29.7.0",
- "@jest/environment": "^29.7.0",
- "@jest/test-result": "^29.7.0",
- "@jest/transform": "^29.7.0",
- "@jest/types": "^29.6.3",
- "@types/node": "*",
- "chalk": "^4.0.0",
- "emittery": "^0.13.1",
- "graceful-fs": "^4.2.9",
- "jest-docblock": "^29.7.0",
- "jest-environment-node": "^29.7.0",
- "jest-haste-map": "^29.7.0",
- "jest-leak-detector": "^29.7.0",
- "jest-message-util": "^29.7.0",
- "jest-resolve": "^29.7.0",
- "jest-runtime": "^29.7.0",
- "jest-util": "^29.7.0",
- "jest-watcher": "^29.7.0",
- "jest-worker": "^29.7.0",
- "p-limit": "^3.1.0",
- "source-map-support": "0.5.13"
+ "imurmurhash": "^0.1.4",
+ "signal-exit": "^4.0.1"
},
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
}
},
- "sdk/node_modules/jest-runtime": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz",
- "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==",
- "dev": true,
+ "node_modules/ws": {
+ "version": "8.17.1",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz",
+ "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==",
"license": "MIT",
- "dependencies": {
- "@jest/environment": "^29.7.0",
- "@jest/fake-timers": "^29.7.0",
- "@jest/globals": "^29.7.0",
- "@jest/source-map": "^29.6.3",
- "@jest/test-result": "^29.7.0",
- "@jest/transform": "^29.7.0",
- "@jest/types": "^29.6.3",
- "@types/node": "*",
- "chalk": "^4.0.0",
- "cjs-module-lexer": "^1.0.0",
- "collect-v8-coverage": "^1.0.0",
- "glob": "^7.1.3",
- "graceful-fs": "^4.2.9",
- "jest-haste-map": "^29.7.0",
- "jest-message-util": "^29.7.0",
- "jest-mock": "^29.7.0",
- "jest-regex-util": "^29.6.3",
- "jest-resolve": "^29.7.0",
- "jest-snapshot": "^29.7.0",
- "jest-util": "^29.7.0",
- "slash": "^3.0.0",
- "strip-bom": "^4.0.0"
- },
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": ">=10.0.0"
+ },
+ "peerDependencies": {
+ "bufferutil": "^4.0.1",
+ "utf-8-validate": ">=5.0.2"
+ },
+ "peerDependenciesMeta": {
+ "bufferutil": {
+ "optional": true
+ },
+ "utf-8-validate": {
+ "optional": true
+ }
}
},
- "sdk/node_modules/jest-snapshot": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz",
- "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==",
- "dev": true,
+ "node_modules/xtend": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
+ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
"license": "MIT",
- "dependencies": {
- "@babel/core": "^7.11.6",
- "@babel/generator": "^7.7.2",
- "@babel/plugin-syntax-jsx": "^7.7.2",
- "@babel/plugin-syntax-typescript": "^7.7.2",
- "@babel/types": "^7.3.3",
- "@jest/expect-utils": "^29.7.0",
- "@jest/transform": "^29.7.0",
- "@jest/types": "^29.6.3",
- "babel-preset-current-node-syntax": "^1.0.0",
- "chalk": "^4.0.0",
- "expect": "^29.7.0",
- "graceful-fs": "^4.2.9",
- "jest-diff": "^29.7.0",
- "jest-get-type": "^29.6.3",
- "jest-matcher-utils": "^29.7.0",
- "jest-message-util": "^29.7.0",
- "jest-util": "^29.7.0",
- "natural-compare": "^1.4.0",
- "pretty-format": "^29.7.0",
- "semver": "^7.5.3"
- },
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": ">=0.4"
}
},
- "sdk/node_modules/jest-util": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz",
- "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jest/types": "^29.6.3",
- "@types/node": "*",
- "chalk": "^4.0.0",
- "ci-info": "^3.2.0",
- "graceful-fs": "^4.2.9",
- "picomatch": "^2.2.3"
- },
+ "node_modules/y18n": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+ "license": "ISC",
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": ">=10"
}
},
- "sdk/node_modules/jest-validate": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz",
- "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==",
+ "node_modules/yallist": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
"dev": true,
+ "license": "ISC"
+ },
+ "node_modules/yargs": {
+ "version": "17.7.2",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
+ "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
"license": "MIT",
"dependencies": {
- "@jest/types": "^29.6.3",
- "camelcase": "^6.2.0",
- "chalk": "^4.0.0",
- "jest-get-type": "^29.6.3",
- "leven": "^3.1.0",
- "pretty-format": "^29.7.0"
+ "cliui": "^8.0.1",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.3",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^21.1.1"
},
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": ">=12"
}
},
- "sdk/node_modules/jest-watcher": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz",
- "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jest/test-result": "^29.7.0",
- "@jest/types": "^29.6.3",
- "@types/node": "*",
- "ansi-escapes": "^4.2.1",
- "chalk": "^4.0.0",
- "emittery": "^0.13.1",
- "jest-util": "^29.7.0",
- "string-length": "^4.0.1"
- },
+ "node_modules/yargs-parser": {
+ "version": "21.1.1",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
+ "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
+ "license": "ISC",
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": ">=12"
}
},
- "sdk/node_modules/jest-worker": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz",
- "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==",
- "dev": true,
+ "node_modules/yn": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
+ "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==",
+ "devOptional": true,
"license": "MIT",
- "dependencies": {
- "@types/node": "*",
- "jest-util": "^29.7.0",
- "merge-stream": "^2.0.0",
- "supports-color": "^8.0.0"
- },
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": ">=6"
}
},
- "sdk/node_modules/picomatch": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
- "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
"dev": true,
"license": "MIT",
"engines": {
- "node": ">=8.6"
+ "node": ">=10"
},
"funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "sdk/node_modules/pure-rand": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz",
- "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://github.com/sponsors/dubzzz"
- },
- {
- "type": "opencollective",
- "url": "https://opencollective.com/fast-check"
- }
- ],
- "license": "MIT"
- },
- "sdk/node_modules/signal-exit": {
- "version": "3.0.7",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
- "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
- "dev": true,
- "license": "ISC"
- },
- "sdk/node_modules/source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "node_modules/yoctocolors-cjs": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz",
+ "integrity": "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==",
"dev": true,
- "license": "BSD-3-Clause",
+ "license": "MIT",
"engines": {
- "node": ">=0.10.0"
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "sdk/node_modules/strip-ansi": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
- "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
- "dev": true,
+ "node_modules/zod": {
+ "version": "4.1.12",
+ "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.12.tgz",
+ "integrity": "sha512-JInaHOamG8pt5+Ey8kGmdcAcg3OL9reK8ltczgHTAwNhMys/6ThXHityHxVV2p3fkw/c+MAvBHFVYHFZDmjMCQ==",
+ "devOptional": true,
"license": "MIT",
- "dependencies": {
- "ansi-regex": "^5.0.1"
- },
- "engines": {
- "node": ">=8"
+ "funding": {
+ "url": "https://github.com/sponsors/colinhacks"
}
},
- "sdk/node_modules/supports-color": {
- "version": "8.1.1",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
- "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+ "node_modules/zod-validation-error": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz",
+ "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "has-flag": "^4.0.0"
- },
"engines": {
- "node": ">=10"
+ "node": ">=18.0.0"
},
- "funding": {
- "url": "https://github.com/chalk/supports-color?sponsor=1"
+ "peerDependencies": {
+ "zod": "^3.25.0 || ^4.0.0"
}
},
- "sdk/node_modules/undici-types": {
- "version": "6.21.0",
- "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz",
- "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==",
- "dev": true,
- "license": "MIT"
+ "paymaster/admin": {
+ "version": "0.1.0",
+ "extraneous": true,
+ "dependencies": {
+ "@svgr/webpack": "^8.1.0",
+ "@testing-library/dom": "^10.4.1",
+ "@testing-library/jest-dom": "^6.8.0",
+ "@testing-library/react": "^16.3.0",
+ "@testing-library/user-event": "^14.6.1",
+ "@types/jest": "^30.0.0",
+ "@types/react": "^19.1.15",
+ "@types/react-dom": "^19.1.9",
+ "ethers": "^6.15.0",
+ "react": "^19.1.1",
+ "react-dom": "^19.1.1",
+ "typescript": "^5.9.2",
+ "web-vitals": "^5.1.0"
+ },
+ "devDependencies": {
+ "@eslint/js": "^9.37.0",
+ "@types/node": "^24.7.0",
+ "@typescript-eslint/eslint-plugin": "^8.45.0",
+ "@typescript-eslint/parser": "^8.45.0",
+ "@vitejs/plugin-react": "^5.0.4",
+ "eslint": "^9.37.0",
+ "eslint-plugin-react": "^7.37.5",
+ "eslint-plugin-react-hooks": "^6.1.1",
+ "vite": "^7.1.7"
+ }
},
- "sdk/node_modules/write-file-atomic": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz",
- "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==",
- "dev": true,
- "license": "ISC",
+ "sdk": {
+ "name": "@yaaa/sdk",
+ "version": "0.1.0",
+ "extraneous": true,
+ "license": "MIT",
"dependencies": {
- "imurmurhash": "^0.1.4",
- "signal-exit": "^3.0.7"
+ "@noble/curves": "^2.0.1",
+ "@simplewebauthn/browser": "^13.2.2",
+ "axios": "^1.12.2"
},
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
+ "devDependencies": {
+ "@eslint/js": "^9.17.0",
+ "@types/jest": "^29.5.12",
+ "@types/node": "^20.11.17",
+ "eslint": "^9.17.0",
+ "ethers": "^6.11.1",
+ "jest": "^29.7.0",
+ "ts-jest": "^29.1.2",
+ "tsup": "^8.0.2",
+ "typescript": "^5.3.3",
+ "typescript-eslint": "^8.18.2"
+ },
+ "peerDependencies": {
+ "ethers": "^6.0.0"
}
},
"signer": {
diff --git a/package.json b/package.json
index 7102e6ab..9270a911 100644
--- a/package.json
+++ b/package.json
@@ -5,8 +5,7 @@
"private": true,
"workspaces": [
"aastar",
- "aastar-frontend",
- "sdk"
+ "aastar-frontend"
],
"scripts": {
"format": "prettier --write .",
diff --git a/scripts/update-superpaymaster-price.js b/scripts/update-superpaymaster-price.js
new file mode 100644
index 00000000..ea2cd8a7
--- /dev/null
+++ b/scripts/update-superpaymaster-price.js
@@ -0,0 +1,37 @@
+#!/usr/bin/env node
+/**
+ * 定期更新 SuperPaymaster 价格(threshold = 70分钟,建议每 50 分钟跑一次)
+ * crontab: */50 * * * * node /path/to/this/script.js
+ */
+const { ethers } = require('ethers');
+const PRIVATE_KEY = '0x1b9c251d318c3c8576b96beddfdc4ec2ffbff762d70325787bde31559db83a21';
+const provider = new ethers.JsonRpcProvider('https://eth-sepolia.g.alchemy.com/v2/Bx4QRW1-vnwJUePSAAD7N');
+const wallet = new ethers.Wallet(PRIVATE_KEY, provider);
+const abi = [
+ 'function updatePrice() external',
+ 'function priceStalenessThreshold() view returns (uint256)',
+];
+
+const PAYMASTERS = [
+ { name: 'PMv4', addr: '0xD0c82dc12B7d65b03dF7972f67d13F1D33469a98' },
+ { name: 'SuperPaymaster', addr: '0x16cE0c7d846f9446bbBeb9C5a84A4D140fAeD94A' },
+];
+
+async function main() {
+ const now = Math.floor(Date.now() / 1000);
+ for (const { name, addr } of PAYMASTERS) {
+ const raw = await provider.call({ to: addr, data: '0xf60fdcb3' });
+ const ts = Number(BigInt('0x' + raw.slice(66, 130)));
+ const threshold = Number(await new ethers.Contract(addr, abi, provider).priceStalenessThreshold());
+ const age = now - ts;
+ if (age > threshold * 0.8) { // 在 80% 阈值时提前更新
+ const tx = await new ethers.Contract(addr, abi, wallet).updatePrice({ gasLimit: 300000 });
+ await tx.wait();
+ console.log(`[${new Date().toISOString()}] ${name} price updated, tx: ${tx.hash}`);
+ } else {
+ console.log(`[${new Date().toISOString()}] ${name} ok, age: ${(age/60).toFixed(1)}min / ${(threshold/60).toFixed(1)}min`);
+ }
+ }
+}
+
+main().catch(e => { console.error(e.message); process.exit(1); });
diff --git a/sdk/.prettierignore b/sdk/.prettierignore
deleted file mode 100644
index 007ea8a7..00000000
--- a/sdk/.prettierignore
+++ /dev/null
@@ -1,3 +0,0 @@
-dist
-node_modules
-coverage
diff --git a/sdk/README.md b/sdk/README.md
deleted file mode 100644
index 00a8a513..00000000
--- a/sdk/README.md
+++ /dev/null
@@ -1,341 +0,0 @@
-# @yaaa/sdk — AirAccount SDK
-
-> ERC-4337 Account Abstraction SDK with KMS WebAuthn, BLS Aggregate Signatures,
-> and Tiered Signature Routing
-
-A framework-agnostic, production-ready SDK for building Web3 applications with
-hardware-backed passkey authentication and ERC-4337 smart accounts.
-
-## Features
-
-- **KMS WebAuthn** — Hardware-backed passkey authentication via `kms1.aastar.io`
-- **BLS Aggregate Signatures** — Multi-node BLS signing with gossip discovery
-- **ERC-4337 Account Abstraction** — Smart contract wallets (v0.6 / v0.7 / v0.8)
-- **M4 Account Factory** — Built-in guardian support and daily spending limits
-- **Tiered Signature Routing** — Tier 1 (ECDSA) / Tier 2 (P256+BLS) / Tier 3
- (P256+BLS+Guardian)
-- **SuperPaymaster** — Auto-detected on M4 deployments for gasless transactions
-- **Pluggable Adapters** — Bring your own storage, signer, and logger
-- **TypeScript First** — Full type safety and IntelliSense support
-
-## Installation
-
-```bash
-npm install @yaaa/sdk
-```
-
-## Quick Start — Browser Client
-
-```typescript
-import { YAAAClient } from "@yaaa/sdk";
-
-const yaaa = new YAAAClient({
- apiURL: "https://api.your-backend.com/v1",
- tokenProvider: () => localStorage.getItem("token"),
- bls: {
- seedNodes: ["https://signer1.aastar.io"],
- },
-});
-
-// Register with KMS-backed Passkey
-const { user, token } = await yaaa.passkey.register({
- email: "user@example.com",
- username: "JohnDoe",
-});
-
-// Login with Passkey
-const result = await yaaa.passkey.authenticate();
-
-// Verify a transaction with Passkey (biometric prompt)
-const verification = await yaaa.passkey.verifyTransaction({
- to: "0x742d35Cc6634C0532925a3b844Bc454e4438f44e",
- value: "0.01",
-});
-```
-
-## Quick Start — Server Client
-
-```typescript
-import {
- YAAAServerClient,
- MemoryStorage,
- LocalWalletSigner,
-} from "@yaaa/sdk/server";
-
-const client = new YAAAServerClient({
- rpcUrl: "https://sepolia.infura.io/v3/YOUR_KEY",
- bundlerRpcUrl: "https://api.pimlico.io/v2/11155111/rpc?apikey=YOUR_KEY",
- chainId: 11155111,
- entryPoints: {
- v07: {
- entryPointAddress: "0x0000000071727De22E5E9d8BAf0edAc6f37da032",
- factoryAddress: "0x914db0a849f55e68a726c72fd02b7114b1176d88",
- },
- },
- defaultVersion: "0.7",
- storage: new MemoryStorage(),
- signer: new LocalWalletSigner("0xYOUR_PRIVATE_KEY"),
-});
-
-// Create a smart account
-const account = await client.accounts.createAccount("user-123");
-
-// Execute a transfer
-const result = await client.transfers.executeTransfer("user-123", {
- to: "0xRecipient",
- amount: "0.01",
-});
-```
-
-## API Reference
-
-### Browser SDK (`@yaaa/sdk`)
-
-#### YAAAClient
-
-```typescript
-const yaaa = new YAAAClient(config: YAAAConfig);
-```
-
-| Property | Type | Description |
-| -------------- | ---------------- | ----------------------------------- |
-| `yaaa.passkey` | `PasskeyManager` | WebAuthn passkey authentication |
-| `yaaa.bls` | `BLSManager` | BLS node discovery & message points |
-
-#### YAAAConfig
-
-```typescript
-interface YAAAConfig {
- apiURL: string;
- tokenProvider?: () => string | null;
- bls: {
- seedNodes: string[];
- discoveryTimeout?: number;
- };
-}
-```
-
-### Server SDK (`@yaaa/sdk/server`)
-
-#### YAAAServerClient
-
-```typescript
-const client = new YAAAServerClient(config: ServerConfig);
-```
-
-| Property | Type | Description |
-| ------------------ | --------------------- | ----------------------------------- |
-| `client.accounts` | `AccountManager` | Smart account creation & queries |
-| `client.transfers` | `TransferManager` | ETH/ERC20 transfers, gas estimation |
-| `client.bls` | `BLSSignatureService` | BLS signing & tiered signatures |
-| `client.paymaster` | `PaymasterManager` | Paymaster config, SuperPaymaster |
-| `client.tokens` | `TokenService` | ERC20 info, balances, calldata |
-| `client.wallets` | `WalletManager` | EOA/KMS wallet management |
-| `client.ethereum` | `EthereumProvider` | RPC, bundler, contract interactions |
-
-#### ServerConfig
-
-```typescript
-interface ServerConfig {
- rpcUrl: string;
- bundlerRpcUrl: string;
- chainId: number;
- entryPoints: {
- v06?: EntryPointConfig;
- v07?: EntryPointConfig;
- v08?: EntryPointConfig;
- };
- defaultVersion?: "0.6" | "0.7" | "0.8";
- blsSeedNodes?: string[];
- blsDiscoveryTimeout?: number;
- kmsEndpoint?: string;
- kmsEnabled?: boolean;
- kmsApiKey?: string;
- storage: IStorageAdapter;
- signer: ISignerAdapter;
- logger?: ILogger;
-}
-```
-
-### Pluggable Interfaces
-
-#### IStorageAdapter
-
-```typescript
-interface IStorageAdapter {
- // Accounts
- getAccounts(): Promise;
- saveAccount(account: AccountRecord): Promise;
- findAccountByUserId(userId: string): Promise;
- updateAccount(userId: string, updates: Partial): Promise;
- // Transfers
- saveTransfer(transfer: TransferRecord): Promise;
- findTransferById(id: string): Promise;
- findTransfersByUserId(userId: string): Promise;
- updateTransfer(id: string, updates: Partial): Promise;
- // Paymasters
- getPaymasters(userId: string): Promise;
- savePaymaster(userId: string, paymaster: PaymasterRecord): Promise;
- removePaymaster(userId: string, name: string): Promise;
- // BLS
- getBlsConfig(): Promise;
- updateSignerNodesCache(nodes: unknown[]): Promise;
-}
-```
-
-#### ISignerAdapter
-
-```typescript
-interface ISignerAdapter {
- getAddress(userId: string): Promise;
- getSigner(
- userId: string,
- ctx?: PasskeyAssertionContext
- ): Promise;
- ensureSigner(
- userId: string
- ): Promise<{ signer: ethers.Signer; address: string }>;
-}
-```
-
-#### ILogger
-
-```typescript
-interface ILogger {
- debug(message: string, ...args: unknown[]): void;
- log(message: string, ...args: unknown[]): void;
- warn(message: string, ...args: unknown[]): void;
- error(message: string, ...args: unknown[]): void;
-}
-```
-
-### KMS Integration
-
-```typescript
-import { KmsManager } from "@yaaa/sdk/server";
-
-const kms = new KmsManager({
- kmsEndpoint: "https://kms1.aastar.io",
- kmsApiKey: "your-api-key",
- kmsEnabled: true,
-});
-
-// Create KMS-backed ethers.Signer
-const signer = kms.createKmsSigner(keyId, address, assertionProvider);
-
-// Key management
-await kms.createKey(description, passkeyPublicKey);
-await kms.getKeyStatus(keyId);
-await kms.pollUntilReady(keyId);
-
-// Signing (requires passkey assertion)
-await kms.signHash(hash, assertion, target);
-
-// WebAuthn ceremonies
-await kms.beginRegistration(params);
-await kms.completeRegistration(params);
-await kms.beginAuthentication(params);
-```
-
-### Transfer Params
-
-```typescript
-interface ExecuteTransferParams {
- to: string;
- amount: string;
- data?: string;
- tokenAddress?: string; // ERC20 token address
- usePaymaster?: boolean;
- paymasterAddress?: string;
- paymasterData?: string;
- passkeyAssertion?: LegacyPasskeyAssertion; // KMS signing
- p256Signature?: string; // Tier 2/3
- guardianSigner?: ethers.Signer; // Tier 3
- useAirAccountTiering?: boolean; // Enable tiered routing
-}
-```
-
-### Signature Tiers (M4 AirAccount)
-
-| Tier | AlgId | Components | Use Case |
-| ---- | ------ | ------------------------------ | ------------------- |
-| 1 | `0x02` | Raw ECDSA (65 bytes) | Small transactions |
-| 2 | `0x04` | P256 + BLS aggregate | Medium transactions |
-| 3 | `0x05` | P256 + BLS + Guardian ECDSA | Large transactions |
-| BLS | `0x01` | Legacy BLS (prepended to pack) | Default non-tiered |
-
-### ERC-4337 Utilities
-
-```typescript
-import { ERC4337Utils } from "@yaaa/sdk";
-
-ERC4337Utils.packAccountGasLimits(verGasLimit, callGasLimit);
-ERC4337Utils.unpackAccountGasLimits(packed);
-ERC4337Utils.packGasFees(maxPriorityFee, maxFeePerGas);
-ERC4337Utils.unpackGasFees(packed);
-ERC4337Utils.packUserOperation(userOp);
-ERC4337Utils.unpackUserOperation(packedOp);
-```
-
-### Built-in Adapters
-
-| Adapter | Description |
-| ------------------- | --------------------------------------- |
-| `MemoryStorage` | In-memory storage (dev/testing) |
-| `LocalWalletSigner` | Single private key signer (dev/testing) |
-| `ConsoleLogger` | Console output with prefix |
-| `SilentLogger` | No-op logger |
-
-## Examples
-
-See the [examples](./examples) directory for complete usage:
-
-- [Basic Usage](./examples/basic-usage.ts) — Browser: registration, login,
- transactions
-- [Server Usage](./examples/server-usage.ts) — Backend: accounts, transfers,
- KMS, tiering, Express.js
-- [Examples README](./examples/README.md) — Full guide with architecture and
- troubleshooting
-
-## Architecture
-
-```
-┌─────────────┐
-│ Browser │ @yaaa/sdk (YAAAClient)
-│ (SDK) │ - PasskeyManager (WebAuthn)
-└──────┬───────┘ - BLSManager
- │ HTTPS
- ▼
-┌─────────────┐
-│ Your API │ @yaaa/sdk/server (YAAAServerClient)
-│ (Backend) │ - AccountManager, TransferManager
-└──────┬───────┘ - BLSSignatureService, GuardChecker
- │ - KmsManager, PaymasterManager
- ├─────► Bundler (Pimlico/Alchemy)
- ├─────► Paymaster / SuperPaymaster
- ├─────► BLS Validators (gossip network)
- └─────► KMS (kms1.aastar.io)
-```
-
-## Browser Support
-
-- Chrome/Edge 67+
-- Safari 13+
-- Firefox 60+
-
-**Note**: WebAuthn/Passkey requires HTTPS (localhost is OK for development).
-
-## Development
-
-```bash
-npm install # Install dependencies
-npm run build # Build with tsup
-npm test # Run tests
-npm run dev # Watch mode
-npm run lint # ESLint
-npm run format # Prettier
-```
-
-## License
-
-MIT
diff --git a/sdk/eslint.config.js b/sdk/eslint.config.js
deleted file mode 100644
index 7bf48e60..00000000
--- a/sdk/eslint.config.js
+++ /dev/null
@@ -1,23 +0,0 @@
-import js from "@eslint/js";
-import tseslint from "typescript-eslint";
-
-export default tseslint.config(
- js.configs.recommended,
- ...tseslint.configs.recommended,
- {
- ignores: ["dist/**", "node_modules/**", "*.config.js", "*.config.ts"],
- },
- {
- rules: {
- "@typescript-eslint/no-explicit-any": "off",
- "@typescript-eslint/no-unused-vars": [
- "error",
- {
- argsIgnorePattern: "^_",
- varsIgnorePattern: "^_",
- caughtErrorsIgnorePattern: "^_",
- },
- ],
- },
- }
-);
diff --git a/sdk/examples/README.md b/sdk/examples/README.md
deleted file mode 100644
index fd7f66db..00000000
--- a/sdk/examples/README.md
+++ /dev/null
@@ -1,181 +0,0 @@
-# AirAccount SDK Examples
-
-This directory contains example code demonstrating how to use the AirAccount SDK
-(`@yaaa/sdk`) in your applications.
-
-## Quick Start
-
-### Installation
-
-```bash
-npm install @yaaa/sdk
-```
-
-### Browser Client Setup
-
-```typescript
-import { YAAAClient } from "@yaaa/sdk";
-
-const yaaa = new YAAAClient({
- apiURL: "https://api.your-backend.com/v1",
- tokenProvider: () => localStorage.getItem("token"),
- bls: {
- seedNodes: ["https://signer1.aastar.io"],
- },
-});
-```
-
-### Server Client Setup
-
-```typescript
-import {
- YAAAServerClient,
- MemoryStorage,
- LocalWalletSigner,
-} from "@yaaa/sdk/server";
-
-const client = new YAAAServerClient({
- rpcUrl: "https://sepolia.infura.io/v3/YOUR_KEY",
- bundlerRpcUrl: "https://api.pimlico.io/v2/11155111/rpc?apikey=YOUR_KEY",
- chainId: 11155111,
- entryPoints: {
- v07: {
- entryPointAddress: "0x0000000071727De22E5E9d8BAf0edAc6f37da032",
- factoryAddress: "0x914db0a849f55e68a726c72fd02b7114b1176d88",
- },
- },
- defaultVersion: "0.7",
- storage: new MemoryStorage(),
- signer: new LocalWalletSigner("0xYOUR_PRIVATE_KEY"),
-});
-```
-
-## Examples
-
-### Browser / Frontend (`basic-usage.ts`)
-
-Demonstrates the browser-side SDK:
-
-- **KMS Passkey Registration** — WebAuthn registration backed by hardware KMS
-- **KMS Passkey Login** — Biometric login with KMS key verification
-- **Transaction with Passkey Assertion** — Sign & send with
- `LegacyPasskeyAssertion` format
-- **BLS Node Discovery** — Find available BLS validator nodes
-- **React/Next.js Integration** — Component example with state management
-
-### Server / Backend (`server-usage.ts`)
-
-Demonstrates the server-side SDK:
-
-- **Quick Start** — Minimal setup with MemoryStorage + LocalWalletSigner
-- **M4 Account Factory** — Using `createAccountWithDefaults` with guardian
- support
-- **KMS Signer Integration** — Hardware-backed signing with `KmsManager` and
- `KmsSigner`
-- **Custom ISignerAdapter** — Per-user KMS signing with
- `PasskeyAssertionContext`
-- **Custom IStorageAdapter** — PostgreSQL adapter example
-- **Account Management** — Create, query, multi-version accounts
-- **Token Operations** — ERC20 info, balance, transfer calldata
-- **Transfers** — ETH, ERC20, gasless (paymaster), KMS-signed, tiered (M4)
-- **Paymaster Management** — Custom, Pimlico, SuperPaymaster (auto-detected)
-- **BLS & Tiered Signatures** — Tier 1/2/3 signature routing for AirAccount
-- **Guard Checker** — On-chain tier limits and daily allowance pre-validation
-- **Multi-Version EntryPoint** — v0.6, v0.7, v0.8 side by side
-- **Express.js Integration** — Full REST API example
-
-## Architecture
-
-```
-┌─────────────┐
-│ Browser │ @yaaa/sdk (YAAAClient)
-│ (SDK) │ - PasskeyManager (WebAuthn)
-└──────┬───────┘ - BLSManager
- │ HTTPS
- ▼
-┌─────────────┐
-│ Your API │ @yaaa/sdk/server (YAAAServerClient)
-│ (Backend) │ - AccountManager
-└──────┬───────┘ - TransferManager
- │ - BLSSignatureService
- ├─────► Bundler (Pimlico/Alchemy)
- ├─────► Paymaster / SuperPaymaster
- ├─────► BLS Validators (gossip network)
- └─────► KMS (kms1.aastar.io) — Hardware key mgmt
-```
-
-## Key Concepts
-
-### KMS WebAuthn Flow
-
-1. **Registration**: Backend → KMS `BeginRegistration` → Browser WebAuthn prompt
- → KMS `CompleteRegistration` → KMS creates signing key
-2. **Login**: Backend → KMS `BeginAuthentication` → Browser WebAuthn prompt →
- Backend verifies credential
-3. **Signing**: Every signing operation requires a `LegacyPasskeyAssertion`
- (AuthenticatorData + ClientDataHash + Signature in hex format)
-
-### Signature Routing (M4 AirAccount)
-
-| Tier | AlgId | Signature Components | Use Case |
-| ---- | ------ | ------------------------------ | -------------------- |
-| 1 | `0x02` | Raw ECDSA (65 bytes) | Small transactions |
-| 2 | `0x04` | P256 + BLS aggregate | Medium transactions |
-| 3 | `0x05` | P256 + BLS + Guardian ECDSA | Large transactions |
-| BLS | `0x01` | Legacy BLS (prepended to pack) | Default (non-tiered) |
-
-### Pluggable Adapters
-
-The server SDK is framework-agnostic. You provide:
-
-- **`IStorageAdapter`** — Your database (Postgres, Mongo, in-memory, etc.)
-- **`ISignerAdapter`** — Your key management (KMS, HSM, local wallet, etc.)
-- **`ILogger`** — Your logging (console, Winston, Pino, etc.)
-
-## Running Examples
-
-```bash
-# Install dependencies
-cd sdk
-npm install
-
-# Run the basic example (requires backend running)
-npx ts-node examples/basic-usage.ts
-
-# Run the server example
-npx ts-node examples/server-usage.ts
-```
-
-## Integration Checklist
-
-- [ ] Backend API running with `@yaaa/sdk/server`
-- [ ] KMS endpoint configured (`kms1.aastar.io`)
-- [ ] Bundler RPC endpoint configured (Pimlico/Alchemy)
-- [ ] (Optional) BLS validator nodes configured
-- [ ] (Optional) Paymaster configured for gasless transactions
-- [ ] HTTPS enabled in production (required for WebAuthn/Passkey)
-- [ ] CORS configured to allow your frontend domain
-
-## Troubleshooting
-
-### "Passkey not supported"
-
-- Ensure you're using HTTPS (localhost is OK for development)
-- Check browser compatibility (Chrome 67+, Safari 13+, Edge 18+)
-
-### "KMS signing failed"
-
-- Verify `KMS_API_KEY` is set correctly
-- Check KMS key status (must be "ready")
-- Ensure the passkey assertion is in Legacy hex format
-
-### "Network request failed"
-
-- Verify `apiURL` / `rpcUrl` is correct
-- Check CORS settings on your backend
-- Ensure backend is running
-
-### "BLS nodes unavailable"
-
-- Check `blsSeedNodes` configuration
-- Verify BLS validator nodes are running and accessible
diff --git a/sdk/examples/basic-usage.ts b/sdk/examples/basic-usage.ts
deleted file mode 100644
index c483d743..00000000
--- a/sdk/examples/basic-usage.ts
+++ /dev/null
@@ -1,247 +0,0 @@
-/**
- * AirAccount SDK - Basic Usage Example (Browser/Frontend)
- *
- * This example demonstrates how to integrate the AirAccount SDK
- * into your frontend application for Passkey authentication and
- * KMS-based wallet operations with ERC-4337 account abstraction.
- */
-
-import { YAAAClient } from "@yaaa/sdk";
-
-// ============================================
-// 1. Initialize the SDK Client
-// ============================================
-
-const yaaa = new YAAAClient({
- // Your backend API URL
- apiURL: "http://localhost:3000/api/v1",
-
- // Token provider function (for authenticated requests)
- tokenProvider: () => {
- if (typeof window === "undefined") return null;
- return localStorage.getItem("token");
- },
-
- // BLS configuration
- bls: {
- seedNodes: ["https://signer1.aastar.io", "https://signer2.aastar.io"],
- discoveryTimeout: 5000,
- },
-});
-
-// ============================================
-// 2. KMS-Based Passkey Registration
-// ============================================
-
-/**
- * Registration flow (KMS + WebAuthn):
- * 1. Backend calls KMS BeginRegistration
- * 2. Browser triggers WebAuthn biometric prompt
- * 3. Backend calls KMS CompleteRegistration
- * 4. KMS creates a signing key linked to the passkey
- * 5. Backend returns JWT + user info
- */
-async function registerWithPasskey() {
- try {
- console.log("Starting KMS-backed Passkey registration...");
-
- const result = await yaaa.passkey.register({
- email: "user@example.com",
- username: "JohnDoe",
- });
-
- console.log("Registration successful!");
- console.log("User:", result.user);
- console.log("Token:", result.token);
-
- // Save token for future requests
- localStorage.setItem("token", result.token);
- localStorage.setItem("user", JSON.stringify(result.user));
-
- return result;
- } catch (error) {
- console.error("Registration failed:", error);
- throw error;
- }
-}
-
-// ============================================
-// 3. KMS Passkey Login
-// ============================================
-
-/**
- * Login flow (KMS + WebAuthn):
- * 1. Backend calls KMS BeginAuthentication
- * 2. Browser triggers WebAuthn biometric prompt
- * 3. Backend verifies credential via KMS
- * 4. Backend returns JWT token
- */
-async function loginWithPasskey() {
- try {
- console.log("Starting KMS-backed Passkey login...");
-
- const result = await yaaa.passkey.authenticate();
-
- console.log("Login successful!");
- console.log("User:", result.user);
-
- localStorage.setItem("token", result.token);
- localStorage.setItem("user", JSON.stringify(result.user));
-
- return result;
- } catch (error) {
- console.error("Login failed:", error);
- throw error;
- }
-}
-
-// ============================================
-// 4. Transaction with Passkey Assertion
-// ============================================
-
-/**
- * Transaction flow (KMS signing):
- * 1. User confirms via biometric (WebAuthn assertion)
- * 2. Assertion is sent to backend with transfer params
- * 3. Backend uses KMS to sign the UserOp with the passkey assertion
- * 4. Signed UserOp submitted to bundler
- *
- * Note: The `passkeyAssertion` field uses the Legacy format
- * with AuthenticatorData, ClientDataHash, and Signature.
- */
-async function sendTransaction() {
- try {
- console.log("Preparing transaction...");
-
- // Step 1: Verify transaction with Passkey (gets WebAuthn credential)
- const verification = await yaaa.passkey.verifyTransaction({
- to: "0x742d35Cc6634C0532925a3b844Bc454e4438f44e",
- value: "0.01",
- data: "0x",
- });
-
- console.log("Transaction verified!");
- console.log("UserOpHash:", verification.userOpHash);
-
- // Step 2: Send the verified transaction to your backend
- // The backend will construct and sign the UserOp via KMS
- const response = await fetch("http://localhost:3000/api/v1/transfer", {
- method: "POST",
- headers: {
- "Content-Type": "application/json",
- Authorization: `Bearer ${localStorage.getItem("token")}`,
- },
- body: JSON.stringify({
- to: "0x742d35Cc6634C0532925a3b844Bc454e4438f44e",
- amount: "0.01",
- // KMS passkey assertion format (Legacy hex format for BLS dual-signing)
- passkeyAssertion: {
- AuthenticatorData: verification.credential.authenticatorData,
- ClientDataHash: verification.credential.clientDataHash,
- Signature: verification.credential.signature,
- },
- usePaymaster: true,
- }),
- });
-
- const result = await response.json();
- console.log("Transaction submitted:", result);
-
- return result;
- } catch (error) {
- console.error("Transaction failed:", error);
- throw error;
- }
-}
-
-// ============================================
-// 5. BLS Signature Operations (Advanced)
-// ============================================
-
-async function demonstrateBLS() {
- try {
- // Get available BLS nodes from gossip network
- const nodes = await yaaa.bls.getAvailableNodes();
- console.log("Available BLS nodes:", nodes);
-
- // Generate message point for a UserOpHash
- const userOpHash = "0x1234...";
- const messagePoint = await yaaa.bls.generateMessagePoint(userOpHash);
- console.log("Message Point:", messagePoint);
-
- // Note: Actual BLS signing is handled by the backend
- // using the server SDK's BLSSignatureService
- } catch (error) {
- console.error("BLS operation failed:", error);
- }
-}
-
-// ============================================
-// 6. Usage in React / Next.js
-// ============================================
-
-/*
-import { YAAAClient } from '@yaaa/sdk';
-import { useState } from 'react';
-
-// Create client instance (can be shared across components)
-const yaaa = new YAAAClient({
- apiURL: process.env.NEXT_PUBLIC_API_URL!,
- tokenProvider: () => localStorage.getItem('token'),
- bls: {
- seedNodes: [process.env.NEXT_PUBLIC_BLS_SEED_NODE!],
- },
-});
-
-function LoginPage() {
- const [user, setUser] = useState(null);
- const [loading, setLoading] = useState(false);
-
- const handleRegister = async () => {
- setLoading(true);
- try {
- const result = await yaaa.passkey.register({
- email: 'user@example.com',
- username: 'JohnDoe',
- });
- setUser(result.user);
- localStorage.setItem('token', result.token);
- } catch (error) {
- console.error('Registration failed:', error);
- } finally {
- setLoading(false);
- }
- };
-
- const handleLogin = async () => {
- setLoading(true);
- try {
- const result = await yaaa.passkey.authenticate();
- setUser(result.user);
- localStorage.setItem('token', result.token);
- } catch (error) {
- console.error('Login failed:', error);
- } finally {
- setLoading(false);
- }
- };
-
- return (
-
-
- Register with Passkey
-
-
- Login with Passkey
-
- {user &&
Welcome, {user.username}!
}
-
- );
-}
-*/
-
-// ============================================
-// Export for module usage
-// ============================================
-
-export { yaaa, registerWithPasskey, loginWithPasskey, sendTransaction, demonstrateBLS };
diff --git a/sdk/examples/server-usage.ts b/sdk/examples/server-usage.ts
deleted file mode 100644
index 2a5c4333..00000000
--- a/sdk/examples/server-usage.ts
+++ /dev/null
@@ -1,689 +0,0 @@
-/**
- * AirAccount Server SDK - Usage Examples
- *
- * This example demonstrates how to integrate the AirAccount Server SDK
- * into your own Node.js backend (Express, Fastify, Koa, NestJS, etc.)
- * without any framework coupling.
- *
- * Install: npm install @yaaa/sdk
- * Import: import { ... } from '@yaaa/sdk/server';
- */
-
-import {
- YAAAServerClient,
- MemoryStorage,
- LocalWalletSigner,
- ConsoleLogger,
- EntryPointVersion,
- KmsManager,
-} from "@yaaa/sdk/server";
-
-import type {
- ServerConfig,
- IStorageAdapter,
- ISignerAdapter,
- AccountRecord,
- TransferRecord,
- PaymasterRecord,
- BlsConfigRecord,
- TokenInfo,
- PasskeyAssertionContext,
- LegacyPasskeyAssertion,
-} from "@yaaa/sdk/server";
-
-import { ethers } from "ethers";
-
-// ============================================
-// 1. Basic Setup — Quick Start
-// ============================================
-
-async function quickStart() {
- // Minimum viable setup: MemoryStorage + LocalWalletSigner
- // Good for development, testing, and prototyping.
- const client = new YAAAServerClient({
- rpcUrl: "https://sepolia.infura.io/v3/YOUR_KEY",
- bundlerRpcUrl: "https://api.pimlico.io/v2/11155111/rpc?apikey=YOUR_KEY",
- chainId: 11155111,
- entryPoints: {
- v06: {
- entryPointAddress: "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789",
- factoryAddress: "0xYOUR_FACTORY_ADDRESS",
- validatorAddress: "0xYOUR_VALIDATOR_ADDRESS",
- },
- },
- storage: new MemoryStorage(),
- signer: new LocalWalletSigner("0xYOUR_PRIVATE_KEY"),
- });
-
- // Create a smart account for a user
- const account = await client.accounts.createAccount("user-123");
- console.log("Smart account address:", account.address);
-
- // Execute a transfer
- const result = await client.transfers.executeTransfer("user-123", {
- to: "0xRecipientAddress",
- amount: "0.01",
- });
- console.log("Transfer ID:", result.transferId);
- console.log("UserOp Hash:", result.userOpHash);
-
- // Poll transfer status
- const status = await client.transfers.getTransferStatus("user-123", result.transferId);
- console.log("Status:", status.statusDescription);
-}
-
-// ============================================
-// 2. M4 Account Factory Setup
-// ============================================
-
-/**
- * M4 accounts use a different factory with built-in guardian support
- * and daily spending limits. No separate validator contract needed.
- */
-async function m4Setup() {
- const client = new YAAAServerClient({
- rpcUrl: "https://sepolia.infura.io/v3/YOUR_KEY",
- bundlerRpcUrl: "https://api.pimlico.io/v2/11155111/rpc?apikey=YOUR_KEY",
- chainId: 11155111,
- entryPoints: {
- // M4 factory — uses createAccountWithDefaults/getAddressWithDefaults
- v07: {
- entryPointAddress: "0x0000000071727De22E5E9d8BAf0edAc6f37da032",
- factoryAddress: "0x914db0a849f55e68a726c72fd02b7114b1176d88",
- // No validatorAddress → M4 ECDSA path (raw 65-byte signature)
- },
- },
- defaultVersion: "0.7",
- storage: new MemoryStorage(),
- signer: new LocalWalletSigner("0xPRIVATE_KEY"),
- });
-
- // M4 factory predicts address with: owner, salt, guardian1, guardian2, dailyLimit
- const account = await client.accounts.createAccount("user-m4");
- console.log("M4 account:", account.address);
-
- return client;
-}
-
-// ============================================
-// 3. KMS Signer Integration
-// ============================================
-
-/**
- * KMS (kms1.aastar.io) provides hardware-backed key management
- * with WebAuthn passkey authentication for every signing operation.
- *
- * The KmsSigner requires a passkey assertion for each sign call,
- * passed via the assertionProvider callback.
- */
-async function kmsSetup() {
- const kmsManager = new KmsManager({
- kmsEndpoint: "https://kms1.aastar.io",
- kmsApiKey: process.env.KMS_API_KEY,
- kmsEnabled: true,
- });
-
- // Create a KMS-backed signer
- // assertionProvider returns a LegacyPasskeyAssertion for each signing operation
- const kmsSigner = kmsManager.createKmsSigner(
- "key-id-from-kms", // KMS key ID
- "0xDerivedAddress", // Address from KMS
- async () => {
- // In production, this comes from the request context
- // (the user's WebAuthn assertion passed through the API)
- return {
- AuthenticatorData: "0x...",
- ClientDataHash: "0x...",
- Signature: "0x...",
- } satisfies LegacyPasskeyAssertion;
- }
- );
-
- // KmsSigner is an ethers.AbstractSigner — use it anywhere ethers expects a Signer
- const address = await kmsSigner.getAddress();
- console.log("KMS signer address:", address);
-
- // KMS key lifecycle
- const keyStatus = await kmsManager.getKeyStatus("key-id");
- console.log("Key status:", keyStatus.Status); // "creating" | "deriving" | "ready" | "error"
-
- // Wait for key to be ready after creation
- // const readyKey = await kmsManager.pollUntilReady("key-id", 30000);
-}
-
-// ============================================
-// 4. Custom ISignerAdapter with KMS
-// ============================================
-
-/**
- * Implement ISignerAdapter for KMS-backed per-user signing.
- * The getSigner() method accepts an optional PasskeyAssertionContext,
- * which carries the user's WebAuthn assertion through the signing chain.
- */
-class KmsSignerAdapter implements ISignerAdapter {
- private kmsManager: KmsManager;
-
- constructor(
- private userKeyMapping: Map,
- kmsEndpoint: string,
- kmsApiKey: string
- ) {
- this.kmsManager = new KmsManager({
- kmsEndpoint,
- kmsApiKey,
- kmsEnabled: true,
- });
- }
-
- async getAddress(userId: string): Promise {
- const keyInfo = this.userKeyMapping.get(userId);
- if (!keyInfo) throw new Error(`No KMS key for user ${userId}`);
- return keyInfo.address;
- }
-
- async getSigner(userId: string, ctx?: PasskeyAssertionContext): Promise {
- const keyInfo = this.userKeyMapping.get(userId);
- if (!keyInfo) throw new Error(`No KMS key for user ${userId}`);
-
- return this.kmsManager.createKmsSigner(keyInfo.keyId, keyInfo.address, async () => {
- if (!ctx?.passkeyAssertion) {
- throw new Error("Passkey assertion required for KMS signing");
- }
- return ctx.passkeyAssertion;
- });
- }
-
- async ensureSigner(userId: string): Promise<{ signer: ethers.Signer; address: string }> {
- const address = await this.getAddress(userId);
- const signer = await this.getSigner(userId);
- return { signer, address };
- }
-}
-
-// ============================================
-// 5. Custom IStorageAdapter (PostgreSQL)
-// ============================================
-
-/**
- * In production you'll want a real database.
- * Implement IStorageAdapter for your stack (PostgreSQL, MongoDB, etc.)
- */
-class PostgresStorage implements IStorageAdapter {
- constructor(private pool: any /* pg.Pool */) {}
-
- async getAccounts(): Promise {
- const { rows } = await this.pool.query("SELECT * FROM accounts");
- return rows;
- }
-
- async saveAccount(account: AccountRecord): Promise {
- await this.pool.query(
- `INSERT INTO accounts (user_id, address, signer_address, salt, deployed,
- deployment_tx_hash, validator_address, entry_point_version, factory_address, created_at)
- VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10)
- ON CONFLICT (user_id, entry_point_version) DO NOTHING`,
- [
- account.userId,
- account.address,
- account.signerAddress,
- account.salt,
- account.deployed,
- account.deploymentTxHash,
- account.validatorAddress,
- account.entryPointVersion,
- account.factoryAddress,
- account.createdAt,
- ]
- );
- }
-
- async findAccountByUserId(userId: string): Promise {
- const { rows } = await this.pool.query("SELECT * FROM accounts WHERE user_id = $1 LIMIT 1", [
- userId,
- ]);
- return rows[0] ?? null;
- }
-
- async updateAccount(userId: string, updates: Partial): Promise {
- const setClauses: string[] = [];
- const values: unknown[] = [];
- let idx = 1;
- for (const [key, value] of Object.entries(updates)) {
- setClauses.push(`${camelToSnake(key)} = $${idx++}`);
- values.push(value);
- }
- values.push(userId);
- await this.pool.query(
- `UPDATE accounts SET ${setClauses.join(", ")} WHERE user_id = $${idx}`,
- values
- );
- }
-
- async saveTransfer(transfer: TransferRecord): Promise {
- void transfer; // ... INSERT INTO transfers
- }
- async findTransfersByUserId(userId: string): Promise {
- const { rows } = await this.pool.query("SELECT * FROM transfers WHERE user_id = $1", [userId]);
- return rows;
- }
- async findTransferById(id: string): Promise {
- const { rows } = await this.pool.query("SELECT * FROM transfers WHERE id = $1", [id]);
- return rows[0] ?? null;
- }
- async updateTransfer(id: string, updates: Partial): Promise {
- void id;
- void updates;
- }
-
- async getPaymasters(userId: string): Promise {
- const { rows } = await this.pool.query("SELECT * FROM paymasters WHERE user_id = $1", [userId]);
- return rows;
- }
- async savePaymaster(userId: string, paymaster: PaymasterRecord): Promise {
- void userId;
- void paymaster;
- }
- async removePaymaster(userId: string, name: string): Promise {
- const { rowCount } = await this.pool.query(
- "DELETE FROM paymasters WHERE user_id = $1 AND name = $2",
- [userId, name]
- );
- return rowCount > 0;
- }
-
- async getBlsConfig(): Promise {
- return null;
- }
- async updateSignerNodesCache(nodes: unknown[]): Promise {
- void nodes;
- }
-}
-
-function camelToSnake(str: string): string {
- return str.replace(/[A-Z]/g, letter => `_${letter.toLowerCase()}`);
-}
-
-// ============================================
-// 6. Account Management
-// ============================================
-
-async function accountManagement(client: YAAAServerClient) {
- // Create account (idempotent — returns existing if already created)
- const account = await client.accounts.createAccount("user-abc");
- console.log("Account:", account.address);
- console.log("Deployed:", account.deployed);
- console.log("EntryPoint version:", account.entryPointVersion);
-
- // Create account with specific version
- const v6Account = await client.accounts.createAccount("user-v6", {
- entryPointVersion: EntryPointVersion.V0_6,
- });
- console.log("v0.6 account:", v6Account.address);
-
- // Get existing account with balance and nonce
- const existing = await client.accounts.getAccount("user-abc");
- if (existing) {
- console.log("Found:", existing.address);
- console.log("Balance:", existing.balance, "ETH");
- console.log("Nonce:", existing.nonce);
- }
-
- // Get wallet (EOA/KMS) address for a user
- const walletAddress = await client.wallets.getAddress("user-abc");
- console.log("Wallet (EOA/KMS) address:", walletAddress);
-}
-
-// ============================================
-// 7. Token Operations
-// ============================================
-
-async function tokenOperations(client: YAAAServerClient) {
- const USDC = "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48";
-
- // Query token info from chain
- const info: TokenInfo = await client.tokens.getTokenInfo(USDC);
- console.log(`${info.symbol} (${info.name}) — ${info.decimals} decimals`);
-
- // Check token balance
- const balance = await client.tokens.getTokenBalance(USDC, "0xYourSmartAccount");
- console.log("USDC balance (raw):", balance);
-
- // Formatted balance
- const formatted = await client.tokens.getFormattedTokenBalance(USDC, "0xYourSmartAccount");
- console.log(`Balance: ${formatted.formattedBalance} ${formatted.token.symbol}`);
-
- // Validate a token address
- const valid = await client.tokens.validateToken(USDC);
- console.log("Is valid ERC20:", valid);
-
- // Generate ERC20 transfer calldata
- const calldata = client.tokens.generateTransferCalldata(
- "0xRecipient",
- "100.5",
- 6 // USDC decimals
- );
- console.log("Transfer calldata:", calldata);
-}
-
-// ============================================
-// 8. Transfers (ETH & ERC20)
-// ============================================
-
-async function transfers(client: YAAAServerClient) {
- const userId = "user-abc";
-
- // --- ETH transfer ---
- const ethTransfer = await client.transfers.executeTransfer(userId, {
- to: "0xRecipientAddress",
- amount: "0.01",
- });
- console.log("ETH Transfer:", ethTransfer.transferId);
-
- // --- ERC20 token transfer ---
- const tokenTransfer = await client.transfers.executeTransfer(userId, {
- to: "0xRecipientAddress",
- amount: "50",
- tokenAddress: "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
- });
- console.log("Token Transfer:", tokenTransfer.transferId);
-
- // --- Gasless transfer with paymaster ---
- const gaslessTransfer = await client.transfers.executeTransfer(userId, {
- to: "0xRecipientAddress",
- amount: "0.01",
- usePaymaster: true,
- paymasterAddress: "0xYourPaymasterAddress",
- });
- console.log("Gasless Transfer:", gaslessTransfer.transferId);
-
- // --- Transfer with KMS passkey assertion ---
- const kmsTransfer = await client.transfers.executeTransfer(userId, {
- to: "0xRecipientAddress",
- amount: "0.01",
- passkeyAssertion: {
- AuthenticatorData: "0x...",
- ClientDataHash: "0x...",
- Signature: "0x...",
- },
- });
- console.log("KMS Transfer:", kmsTransfer.transferId);
-
- // --- AirAccount tiered transfer (M4) ---
- const tieredTransfer = await client.transfers.executeTransfer(userId, {
- to: "0xRecipientAddress",
- amount: "0.01",
- useAirAccountTiering: true, // Enable tier-based signature routing
- p256Signature: "0x...", // Required for Tier 2/3
- // guardianSigner: guardianEthSigner, // Required for Tier 3 only
- });
- console.log("Tiered Transfer:", tieredTransfer.transferId);
-
- // --- Check transfer status ---
- const status = await client.transfers.getTransferStatus(userId, ethTransfer.transferId);
- console.log("Status:", status.statusDescription);
- // Possible statuses:
- // pending → "Preparing transaction and generating signatures"
- // submitted → "Transaction submitted to bundler, waiting for confirmation"
- // completed → "Transaction confirmed on chain"
- // failed → "Transaction failed"
-
- if (status.explorerUrl) {
- console.log("Explorer:", status.explorerUrl);
- }
-
- // --- Transfer history with pagination ---
- const history = await client.transfers.getTransferHistory(userId, 1, 10);
- console.log(`Page 1: ${history.transfers.length} of ${history.total} transfers`);
-
- for (const tx of history.transfers) {
- console.log(` ${tx.id}: ${tx.amount} ${tx.tokenSymbol ?? "ETH"} → ${tx.to} [${tx.status}]`);
- }
-
- // --- Gas estimation ---
- const gasEstimate = await client.transfers.estimateGas(userId, {
- to: "0xRecipientAddress",
- amount: "0.01",
- });
- console.log("Gas estimate:", gasEstimate);
-}
-
-// ============================================
-// 9. Paymaster Management (SuperPaymaster)
-// ============================================
-
-async function paymasterManagement(client: YAAAServerClient) {
- const userId = "user-abc";
-
- // Add a custom paymaster
- await client.paymaster.addCustomPaymaster(
- userId,
- "my-paymaster",
- "0xPaymasterContractAddress",
- "custom"
- );
-
- // Add a Pimlico paymaster (with API key for sponsored transactions)
- await client.paymaster.addCustomPaymaster(
- userId,
- "pimlico-pm",
- "0xPimlicoPaymasterAddress",
- "pimlico",
- "pm_api_key_xxx"
- );
-
- // List available paymasters
- const paymasters = await client.paymaster.getAvailablePaymasters(userId);
- for (const pm of paymasters) {
- console.log(` ${pm.name}: ${pm.address} (configured: ${pm.configured})`);
- }
-
- // Remove a paymaster
- const removed = await client.paymaster.removeCustomPaymaster(userId, "my-paymaster");
- console.log("Removed:", removed);
-
- // Note: SuperPaymaster (v0.7/v0.8) is auto-detected on M4 deployments
- // and returns packed paymaster data format automatically
-}
-
-// ============================================
-// 10. BLS Signatures & Tiered Signing
-// ============================================
-
-async function blsSignatures(client: YAAAServerClient) {
- // BLS signatures require seed nodes for the gossip network.
- // Configure them in the ServerConfig.
-
- // Generate BLS signature for a UserOp hash
- const userOpHash = "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef";
- const blsData = await client.bls.generateBLSSignature("user-abc", userOpHash);
- console.log("BLS signature data:", blsData);
-
- // Pack signature for on-chain verification
- const packed = await client.bls.packSignature(blsData);
- console.log("Packed signature:", packed);
-
- // Generate tiered signature (AirAccount M4)
- // Tier 1: raw ECDSA (algId 0x02)
- // Tier 2: P256 + BLS aggregate (algId 0x04)
- // Tier 3: P256 + BLS + Guardian ECDSA (algId 0x05)
- const tieredSig = await client.bls.generateTieredSignature({
- tier: 2,
- userId: "user-abc",
- userOpHash,
- p256Signature: "0x...", // 64-byte P256 signature
- });
- console.log("Tiered (T2) signature:", tieredSig);
-}
-
-// ============================================
-// 11. Guard Checker (On-Chain Pre-Validation)
-// ============================================
-
-/**
- * GuardChecker reads tier limits and guard status from the AirAccount contract
- * to determine which signature tier is required for a transaction.
- */
-async function guardCheckerExample(client: YAAAServerClient) {
- const accountAddress = "0xYourSmartAccount";
-
- // Fetch tier configuration from contract
- // const tierConfig = await guardChecker.fetchTierConfig(accountAddress);
- // console.log("Tier 1 limit:", tierConfig.tier1Limit);
- // console.log("Tier 2 limit:", tierConfig.tier2Limit);
-
- // Fetch guard status
- // const guardStatus = await guardChecker.fetchGuardStatus(accountAddress);
- // console.log("Has guard:", guardStatus.hasGuard);
- // console.log("Daily remaining:", guardStatus.dailyRemaining);
-
- // Pre-check a transaction (determines required tier + algId)
- // const preCheck = await guardChecker.preCheck(accountAddress, ethers.parseEther("0.5"));
- // console.log("OK:", preCheck.ok);
- // console.log("Required tier:", preCheck.tier);
- // console.log("AlgId:", preCheck.algId);
-
- console.log("GuardChecker is used internally by TransferManager for AirAccount tiering");
- void accountAddress;
-}
-
-// ============================================
-// 12. Multi-Version EntryPoint Support
-// ============================================
-
-async function multiVersion() {
- const client = new YAAAServerClient({
- rpcUrl: "https://sepolia.infura.io/v3/YOUR_KEY",
- bundlerRpcUrl: "https://api.pimlico.io/v2/11155111/rpc?apikey=YOUR_KEY",
- chainId: 11155111,
- entryPoints: {
- v06: {
- entryPointAddress: "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789",
- factoryAddress: "0xFACTORY_V6",
- validatorAddress: "0xVALIDATOR_V6",
- },
- v07: {
- entryPointAddress: "0x0000000071727De22E5E9d8BAf0edAc6f37da032",
- factoryAddress: "0xFACTORY_V7",
- validatorAddress: "0xVALIDATOR_V7",
- },
- },
- defaultVersion: "0.7",
- storage: new MemoryStorage(),
- signer: new LocalWalletSigner("0xPRIVATE_KEY"),
- });
-
- // Create account with specific version
- const v6Account = await client.accounts.createAccount("user-1", {
- entryPointVersion: EntryPointVersion.V0_6,
- });
- console.log("v0.6 account:", v6Account.address);
-
- // Default version (v0.7 in this config)
- const defaultAccount = await client.accounts.createAccount("user-2");
- console.log("Default (v0.7) account:", defaultAccount.address);
-
- // Check configured default
- console.log("Default version:", client.ethereum.getDefaultVersion());
-}
-
-// ============================================
-// 13. Express.js Integration Example
-// ============================================
-
-/*
-import express from 'express';
-import { YAAAServerClient, MemoryStorage, LocalWalletSigner } from '@yaaa/sdk/server';
-
-const app = express();
-app.use(express.json());
-
-const client = new YAAAServerClient({
- rpcUrl: process.env.RPC_URL!,
- bundlerRpcUrl: process.env.BUNDLER_RPC_URL!,
- chainId: 11155111,
- entryPoints: {
- v07: {
- entryPointAddress: '0x0000000071727De22E5E9d8BAf0edAc6f37da032',
- factoryAddress: process.env.FACTORY_ADDRESS!,
- // No validatorAddress → M4 ECDSA path
- },
- },
- defaultVersion: '0.7',
- kmsEndpoint: process.env.KMS_ENDPOINT,
- kmsApiKey: process.env.KMS_API_KEY,
- kmsEnabled: true,
- storage: new MemoryStorage(), // Replace with your DB adapter
- signer: new LocalWalletSigner(process.env.PRIVATE_KEY!),
-});
-
-// Create account
-app.post('/api/accounts', async (req, res) => {
- try {
- const { userId } = req.body;
- const account = await client.accounts.createAccount(userId);
- res.json(account);
- } catch (err: any) {
- res.status(400).json({ error: err.message });
- }
-});
-
-// Execute transfer (with passkey assertion from frontend)
-app.post('/api/transfers', async (req, res) => {
- try {
- const { userId, to, amount, tokenAddress, usePaymaster, passkeyAssertion } = req.body;
- const result = await client.transfers.executeTransfer(userId, {
- to,
- amount,
- tokenAddress,
- usePaymaster,
- passkeyAssertion, // LegacyPasskeyAssertion from KMS
- });
- res.json(result);
- } catch (err: any) {
- res.status(400).json({ error: err.message });
- }
-});
-
-// Get transfer status
-app.get('/api/transfers/:userId/:transferId', async (req, res) => {
- try {
- const { userId, transferId } = req.params;
- const status = await client.transfers.getTransferStatus(userId, transferId);
- res.json(status);
- } catch (err: any) {
- res.status(404).json({ error: err.message });
- }
-});
-
-// Transfer history
-app.get('/api/transfers/:userId', async (req, res) => {
- try {
- const { userId } = req.params;
- const page = Number(req.query.page) || 1;
- const limit = Number(req.query.limit) || 10;
- const history = await client.transfers.getTransferHistory(userId, page, limit);
- res.json(history);
- } catch (err: any) {
- res.status(400).json({ error: err.message });
- }
-});
-
-app.listen(3000, () => console.log('Server running on :3000'));
-*/
-
-// ============================================
-// Export for reference
-// ============================================
-
-export {
- quickStart,
- m4Setup,
- kmsSetup,
- accountManagement,
- tokenOperations,
- transfers,
- paymasterManagement,
- blsSignatures,
- guardCheckerExample,
- multiVersion,
-};
diff --git a/sdk/jest.config.js b/sdk/jest.config.js
deleted file mode 100644
index 34c90265..00000000
--- a/sdk/jest.config.js
+++ /dev/null
@@ -1,19 +0,0 @@
-module.exports = {
- preset: "ts-jest",
- testEnvironment: "node",
- testMatch: ["**/*.test.ts"],
- extensionsToTreatAsEsm: [".ts"],
- moduleNameMapper: {
- "^(\\.{1,2}/.*)\\.js$": "$1",
- },
- transform: {
- "^.+\\.tsx?$": [
- "ts-jest",
- {
- useESM: true,
- },
- ],
- },
- // @noble/curves and @noble/hashes are ESM-only — transform them so Jest can load them
- transformIgnorePatterns: ["node_modules/(?!(@noble/curves|@noble/hashes)/)"],
-};
diff --git a/sdk/package.json b/sdk/package.json
deleted file mode 100644
index 06937acb..00000000
--- a/sdk/package.json
+++ /dev/null
@@ -1,99 +0,0 @@
-{
- "name": "@yaaa/sdk",
- "version": "0.1.0",
- "description": "Yet Another Account Abstraction SDK - ERC-4337 + BLS + Passkey",
- "main": "dist/index.js",
- "module": "dist/index.mjs",
- "types": "dist/index.d.ts",
- "exports": {
- ".": {
- "types": "./dist/index.d.ts",
- "import": "./dist/index.mjs",
- "require": "./dist/index.js"
- },
- "./core/bls": {
- "types": "./dist/core/bls/index.d.ts",
- "import": "./dist/core/bls/index.mjs",
- "require": "./dist/core/bls/index.js"
- },
- "./core/erc4337": {
- "types": "./dist/core/erc4337/index.d.ts",
- "import": "./dist/core/erc4337/index.mjs",
- "require": "./dist/core/erc4337/index.js"
- },
- "./auth/passkey": {
- "types": "./dist/auth/passkey/index.d.ts",
- "import": "./dist/auth/passkey/index.mjs",
- "require": "./dist/auth/passkey/index.js"
- },
- "./server": {
- "types": "./dist/server/index.d.ts",
- "import": "./dist/server/index.mjs",
- "require": "./dist/server/index.js"
- }
- },
- "typesVersions": {
- "*": {
- "server": [
- "dist/server/index.d.ts"
- ],
- "core/bls": [
- "dist/core/bls/index.d.ts"
- ],
- "core/erc4337": [
- "dist/core/erc4337/index.d.ts"
- ],
- "auth/passkey": [
- "dist/auth/passkey/index.d.ts"
- ]
- }
- },
- "files": [
- "dist",
- "README.md",
- "LICENSE"
- ],
- "scripts": {
- "build": "tsup",
- "dev": "tsup --watch",
- "test": "jest",
- "lint": "eslint src --max-warnings 0",
- "format": "prettier --write \"**/*.{ts,tsx,js,jsx,json,md}\"",
- "format:check": "prettier --check \"**/*.{ts,tsx,js,jsx,json,md}\"",
- "clean": "rm -rf dist"
- },
- "keywords": [
- "erc4337",
- "account-abstraction",
- "bls",
- "passkey",
- "webauthn",
- "ethereum",
- "web3"
- ],
- "author": "YAAA Team",
- "license": "MIT",
- "peerDependencies": {
- "ethers": "^6.0.0"
- },
- "dependencies": {
- "@noble/curves": "^2.0.1",
- "@simplewebauthn/browser": "^13.2.2",
- "axios": "^1.12.2"
- },
- "devDependencies": {
- "@eslint/js": "^9.17.0",
- "@types/jest": "^29.5.12",
- "@types/node": "^20.11.17",
- "eslint": "^9.17.0",
- "ethers": "^6.11.1",
- "jest": "^29.7.0",
- "ts-jest": "^29.1.2",
- "tsup": "^8.0.2",
- "typescript": "^5.3.3",
- "typescript-eslint": "^8.18.2"
- },
- "publishConfig": {
- "access": "public"
- }
-}
diff --git a/sdk/src/auth/passkey/index.ts b/sdk/src/auth/passkey/index.ts
deleted file mode 100644
index dd2fe92e..00000000
--- a/sdk/src/auth/passkey/index.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-export * from "./passkey.manager";
-export * from "./types";
diff --git a/sdk/src/auth/passkey/passkey.manager.ts b/sdk/src/auth/passkey/passkey.manager.ts
deleted file mode 100644
index f59baa32..00000000
--- a/sdk/src/auth/passkey/passkey.manager.ts
+++ /dev/null
@@ -1,134 +0,0 @@
-import axios, { AxiosInstance } from "axios";
-import { startRegistration, startAuthentication } from "@simplewebauthn/browser";
-import {
- PasskeyRegistrationParams,
- PasskeyAuthenticationParams,
- PasskeyInfo,
- BeginRegistrationResponse,
- BeginAuthenticationResponse,
- TransactionVerificationParams,
- BeginTransactionVerificationResponse,
-} from "./types";
-
-export class PasskeyManager {
- private api: AxiosInstance;
-
- constructor(baseURL: string, tokenProvider?: () => string | null) {
- this.api = axios.create({
- baseURL,
- headers: {
- "Content-Type": "application/json",
- },
- });
-
- // Add auth interceptor
- if (tokenProvider) {
- this.api.interceptors.request.use(config => {
- const token = tokenProvider();
- if (token) {
- config.headers.Authorization = `Bearer ${token}`;
- }
- return config;
- });
- }
- }
-
- /**
- * Complete Passkey Registration Flow
- */
- async register(
- params: PasskeyRegistrationParams
- ): Promise<{ user: any; token: string; passkey: PasskeyInfo }> {
- // 1. Begin Registration (Get options from backend)
- const beginResponse = await this.api.post(
- "/auth/passkey/register/begin",
- params
- );
-
- // 2. Client-side WebAuthn (Browser UI)
- // @ts-expect-error - simplewebauthn types mismatch sometimes
- const credential = await startRegistration(beginResponse.data);
-
- // 3. Complete Registration (Verify with backend)
- const completeResponse = await this.api.post("/auth/passkey/register/complete", {
- email: params.email,
- username: params.username,
- password: params.password,
- credential,
- });
-
- return completeResponse.data;
- }
-
- /**
- * Complete Passkey Login/Authentication Flow
- */
- async authenticate(params?: PasskeyAuthenticationParams): Promise<{ user: any; token: string }> {
- // 1. Begin Authentication
- const beginResponse = await this.api.post(
- "/auth/passkey/login/begin",
- params
- );
-
- // 2. Client-side WebAuthn
- const credential = await startAuthentication(beginResponse.data as any);
-
- // 3. Complete Authentication
- const completeResponse = await this.api.post("/auth/passkey/login/complete", { credential });
-
- return completeResponse.data;
- }
-
- /**
- * Verify a transaction (Sign UserOpHash) with Passkey
- * Returns the verification credential needed for the transaction
- */
- async verifyTransaction(params: TransactionVerificationParams): Promise {
- // 1. Begin Verification (Get challenge based on tx params)
- const beginResponse = await this.api.post(
- "/auth/transaction/verify/begin",
- { transaction: params }
- );
-
- const { userOpHash, ...authOptions } = beginResponse.data;
-
- // 2. Client-side WebAuthn (Sign the challenge)
- const credential = await startAuthentication(authOptions as any);
-
- // NOTE: We don't complete the verification here immediately.
- // The credential is sent along with the transaction to be verified during execution.
- // But for some flows, we might want to verify it pre-execution:
-
- // Optional: Verify on backend immediately (if API supports it)
- // await this.api.post("/auth/transaction/verify/complete", { credential });
-
- return {
- credential,
- userOpHash, // Return pre-calculated hash to ensure consistency
- };
- }
-
- /**
- * Add a new device (Passkey) to existing account
- */
- async addDevice(params: { email: string; password?: string }): Promise {
- // 1. Begin Device Add
- const beginResponse = await this.api.post(
- "/auth/device/passkey/begin",
- params
- );
-
- // 2. WebAuthn
- // @ts-expect-error - simplewebauthn types mismatch sometimes
- const credential = await startRegistration(beginResponse.data);
-
- // 3. Complete
- const completeResponse = await this.api.post("/auth/device/passkey/complete", {
- email: params.email,
- password: params.password,
- credential,
- });
-
- return completeResponse.data.passkey;
- }
-}
diff --git a/sdk/src/auth/passkey/types.ts b/sdk/src/auth/passkey/types.ts
deleted file mode 100644
index 1f4671f5..00000000
--- a/sdk/src/auth/passkey/types.ts
+++ /dev/null
@@ -1,46 +0,0 @@
-export interface PasskeyRegistrationParams {
- email: string;
- username: string;
- password?: string;
-}
-
-export interface PasskeyAuthenticationParams {
- email?: string;
-}
-
-export interface TransactionVerificationParams {
- to: string;
- value?: string;
- data?: string;
-}
-
-export interface PasskeyInfo {
- credentialId: string;
- publicKey: string;
- counter: number;
- deviceType: string;
- createdAt: string;
-}
-
-// Backend API Interfaces
-export interface BeginRegistrationResponse {
- challenge: string;
- rp: { name: string; id: string };
- user: { id: string; name: string; displayName: string };
- pubKeyCredParams: any[];
- timeout?: number;
- authenticatorSelection?: any;
- attestation?: string;
-}
-
-export interface BeginAuthenticationResponse {
- challenge: string;
- timeout?: number;
- rpId?: string;
- allowCredentials?: any[];
- userVerification?: string;
-}
-
-export interface BeginTransactionVerificationResponse extends BeginAuthenticationResponse {
- userOpHash: string;
-}
diff --git a/sdk/src/client.ts b/sdk/src/client.ts
deleted file mode 100644
index 2bc76e38..00000000
--- a/sdk/src/client.ts
+++ /dev/null
@@ -1,23 +0,0 @@
-import { PasskeyManager } from "./auth/passkey/passkey.manager";
-import { BLSManager } from "./core/bls/bls.manager";
-import { BLSConfig } from "./core/bls/types";
-
-export interface YAAAConfig {
- /** Backend API URL (e.g., https://api.yetanotheraa.com) */
- apiURL: string;
- /** Function to get the current auth token (JWT) */
- tokenProvider?: () => string | null;
- /** BLS Configuration */
- bls: BLSConfig;
-}
-
-export class YAAAClient {
- readonly passkey: PasskeyManager;
- readonly bls: BLSManager;
-
- constructor(private config: YAAAConfig) {
- // Initialize modules
- this.passkey = new PasskeyManager(config.apiURL, config.tokenProvider);
- this.bls = new BLSManager(config.bls);
- }
-}
diff --git a/sdk/src/core/bls/bls.manager.ts b/sdk/src/core/bls/bls.manager.ts
deleted file mode 100644
index e959e636..00000000
--- a/sdk/src/core/bls/bls.manager.ts
+++ /dev/null
@@ -1,220 +0,0 @@
-import axios from "axios";
-import { ethers } from "ethers";
-import { bls12_381 as bls } from "@noble/curves/bls12-381.js";
-import {
- BLSConfig,
- BLSNode,
- BLSSignatureData,
- CumulativeT2SignatureData,
- CumulativeT3SignatureData,
-} from "./types";
-
-export class BLSManager {
- private config: BLSConfig;
-
- constructor(config: BLSConfig) {
- this.config = config;
- }
-
- /**
- * Discover available BLS nodes from seed nodes (Gossip network)
- */
- async getAvailableNodes(): Promise {
- const { seedNodes, discoveryTimeout = 5000 } = this.config;
-
- for (const seedEndpoint of seedNodes) {
- try {
- // Try to get peers from gossip endpoint
- const response = await axios.get(`${seedEndpoint}/gossip/peers`, {
- timeout: discoveryTimeout,
- });
-
- const peers = response.data.peers || [];
-
- // Filter active nodes with proper structure
- const activeNodes: BLSNode[] = peers
- .filter((p: any) => p.status === "active" && p.apiEndpoint && p.publicKey)
- .map((p: any, index: number) => ({
- index: index + 1, // 1-based index likely expected by contract if using bitmap
- nodeId: p.nodeId,
- nodeName: p.nodeName,
- apiEndpoint: p.apiEndpoint,
- status: "active",
- publicKey: p.publicKey,
- }));
-
- if (activeNodes.length > 0) {
- return activeNodes;
- }
- } catch {
- // Try next seed node
- continue;
- }
- }
-
- return [];
- }
-
- /**
- * Helper to pack the full signature for ERC-4337 UserOp
- * Format: [nodeIdsLength][nodeIds...][blsSignature][messagePoint][aaSignature][messagePointSignature]
- */
- packSignature(data: BLSSignatureData): string {
- if (!data.nodeIds || !data.aaSignature || !data.messagePointSignature) {
- throw new Error("Missing required signature components");
- }
-
- const nodeIdsLength = ethers.solidityPacked(["uint256"], [data.nodeIds.length]);
- const nodeIdsBytes = ethers.solidityPacked(
- Array(data.nodeIds.length).fill("bytes32"),
- data.nodeIds
- );
-
- return ethers.solidityPacked(
- ["bytes", "bytes", "bytes", "bytes", "bytes", "bytes"],
- [
- nodeIdsLength,
- nodeIdsBytes,
- data.signature,
- data.messagePoint,
- data.aaSignature,
- data.messagePointSignature,
- ]
- );
- }
-
- /**
- * Calculate the MessagePoint G2 point for a given message (UserOpHash)
- */
- async generateMessagePoint(message: string | Uint8Array): Promise {
- const messageBytes = typeof message === "string" ? ethers.getBytes(message) : message;
- const DST = "BLS_SIG_BLS12381G2_XMD:SHA-256_SSWU_RO_POP_";
-
- const messagePointBLS = await bls.G2.hashToCurve(messageBytes, { DST });
- const messageG2EIP = this.encodeG2Point(messagePointBLS);
-
- return "0x" + Buffer.from(messageG2EIP).toString("hex");
- }
-
- /**
- * Encode G2 Point to bytes for EIP-2537 format
- */
- private encodeG2Point(point: any): Uint8Array {
- const result = new Uint8Array(256);
- const affine = point.toAffine();
-
- const x0Bytes = this.hexToBytes(affine.x.c0.toString(16).padStart(96, "0"));
- const x1Bytes = this.hexToBytes(affine.x.c1.toString(16).padStart(96, "0"));
- const y0Bytes = this.hexToBytes(affine.y.c0.toString(16).padStart(96, "0"));
- const y1Bytes = this.hexToBytes(affine.y.c1.toString(16).padStart(96, "0"));
-
- result.set(x0Bytes, 16);
- result.set(x1Bytes, 80);
- result.set(y0Bytes, 144);
- result.set(y1Bytes, 208);
- return result;
- }
-
- private hexToBytes(hex: string): Uint8Array {
- if (hex.startsWith("0x")) hex = hex.slice(2);
- const bytes = new Uint8Array(hex.length / 2);
- for (let i = 0; i < hex.length; i += 2) {
- bytes[i / 2] = parseInt(hex.substr(i, 2), 16);
- }
- return bytes;
- }
-
- /**
- * Pack cumulative Tier 2 signature (algId 0x04): P256 + BLS.
- *
- * Format:
- * [algId=0x04 (1)] [P256 r (32)] [P256 s (32)]
- * [nodeIdsLength (32)] [nodeIds (N×32)]
- * [blsAggregateSig (256)] [messagePoint (256)]
- * [messagePointECDSA (65)]
- */
- packCumulativeT2Signature(data: CumulativeT2SignatureData): string {
- const nodeIdsLength = ethers.solidityPacked(["uint256"], [data.nodeIds.length]);
- const nodeIdsBytes = ethers.solidityPacked(
- Array(data.nodeIds.length).fill("bytes32"),
- data.nodeIds
- );
-
- return ethers.solidityPacked(
- ["bytes1", "bytes", "bytes", "bytes", "bytes", "bytes", "bytes"],
- [
- "0x04",
- data.p256Signature,
- nodeIdsLength,
- nodeIdsBytes,
- data.blsSignature,
- data.messagePoint,
- data.messagePointSignature,
- ]
- );
- }
-
- /**
- * Pack cumulative Tier 3 signature (algId 0x05): P256 + BLS + Guardian.
- *
- * Format:
- * [algId=0x05 (1)] [P256 r (32)] [P256 s (32)]
- * [nodeIdsLength (32)] [nodeIds (N×32)]
- * [blsAggregateSig (256)] [messagePoint (256)]
- * [messagePointECDSA (65)] [guardianECDSA (65)]
- */
- packCumulativeT3Signature(data: CumulativeT3SignatureData): string {
- const nodeIdsLength = ethers.solidityPacked(["uint256"], [data.nodeIds.length]);
- const nodeIdsBytes = ethers.solidityPacked(
- Array(data.nodeIds.length).fill("bytes32"),
- data.nodeIds
- );
-
- return ethers.solidityPacked(
- ["bytes1", "bytes", "bytes", "bytes", "bytes", "bytes", "bytes", "bytes"],
- [
- "0x05",
- data.p256Signature,
- nodeIdsLength,
- nodeIdsBytes,
- data.blsSignature,
- data.messagePoint,
- data.messagePointSignature,
- data.guardianSignature,
- ]
- );
- }
-
- /**
- * Request signature from a single node
- */
- async requestNodeSignature(
- node: BLSNode,
- message: string
- ): Promise<{ signature: string; publicKey: string }> {
- const response = await axios.post(`${node.apiEndpoint}/signature/sign`, {
- message,
- });
-
- const signatureEIP = response.data.signature;
- // Prefer compact if available, logic copied from legacy service
- const signature = response.data.signatureCompact || signatureEIP;
-
- return {
- signature: signature.startsWith("0x") ? signature : `0x${signature}`,
- publicKey: response.data.publicKey,
- };
- }
-
- /**
- * Request aggregation from a node
- */
- async aggregateSignatures(node: BLSNode, signatures: string[]): Promise {
- const response = await axios.post(`${node.apiEndpoint}/signature/aggregate`, {
- signatures,
- });
-
- const sig = response.data.signature;
- return sig.startsWith("0x") ? sig : `0x${sig}`;
- }
-}
diff --git a/sdk/src/core/bls/index.ts b/sdk/src/core/bls/index.ts
deleted file mode 100644
index d5d9c1b5..00000000
--- a/sdk/src/core/bls/index.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-export * from "./bls.manager";
-export * from "./types";
diff --git a/sdk/src/core/bls/types.ts b/sdk/src/core/bls/types.ts
deleted file mode 100644
index 5b7fff3b..00000000
--- a/sdk/src/core/bls/types.ts
+++ /dev/null
@@ -1,46 +0,0 @@
-export interface BLSNode {
- index?: number;
- nodeId: string;
- nodeName: string;
- apiEndpoint: string;
- status: "active" | "inactive";
- publicKey?: string;
- lastSeen?: Date;
-}
-
-export interface BLSSignatureData {
- nodeIds: string[];
- signatures?: string[]; // Individual node signatures (before aggregation)
- publicKeys?: string[]; // Individual node public keys
- signature: string; // Aggregated BLS signature
- messagePoint: string;
- aaAddress: string;
- aaSignature: string; // ECDSA signature of userOpHash
- messagePointSignature: string; // ECDSA signature of messagePoint
- aggregatedSignature?: string; // Alias for aggregated signature
-}
-
-export interface BLSConfig {
- seedNodes: string[];
- discoveryTimeout?: number;
-}
-
-// ─── Cumulative Signature Data (M4) ────────────────────────────
-
-/**
- * Data for cumulative Tier 2 signature (algId 0x04): P256 + BLS.
- */
-export interface CumulativeT2SignatureData {
- p256Signature: string; // 64 bytes: [r(32)][s(32)]
- nodeIds: string[];
- blsSignature: string; // EIP-2537 aggregate BLS signature
- messagePoint: string; // EIP-2537 G2 message point
- messagePointSignature: string; // 65-byte ECDSA of keccak256(messagePoint)
-}
-
-/**
- * Data for cumulative Tier 3 signature (algId 0x05): P256 + BLS + Guardian.
- */
-export interface CumulativeT3SignatureData extends CumulativeT2SignatureData {
- guardianSignature: string; // 65-byte ECDSA of userOpHash by guardian
-}
diff --git a/sdk/src/core/crypto/crypto.util.test.ts b/sdk/src/core/crypto/crypto.util.test.ts
deleted file mode 100644
index 14b36427..00000000
--- a/sdk/src/core/crypto/crypto.util.test.ts
+++ /dev/null
@@ -1,92 +0,0 @@
-import { CryptoUtil } from "./crypto.util";
-
-const SECRET = "super-secret-key-32-chars-padded!!";
-
-describe("CryptoUtil", () => {
- describe("encrypt / decrypt roundtrip", () => {
- it("decrypts what was encrypted", () => {
- const plaintext = "hello world";
- const encrypted = CryptoUtil.encrypt(plaintext, SECRET);
- expect(CryptoUtil.decrypt(encrypted, SECRET)).toBe(plaintext);
- });
-
- it("handles private key format", () => {
- const pk = "0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80";
- expect(CryptoUtil.decrypt(CryptoUtil.encrypt(pk, SECRET), SECRET)).toBe(pk);
- });
-
- it("handles unicode and special characters", () => {
- const text = "こんにちは 🔐 café";
- expect(CryptoUtil.decrypt(CryptoUtil.encrypt(text, SECRET), SECRET)).toBe(text);
- });
-
- it("handles empty string", () => {
- expect(CryptoUtil.decrypt(CryptoUtil.encrypt("", SECRET), SECRET)).toBe("");
- });
-
- it("handles long strings", () => {
- const long = "x".repeat(10_000);
- expect(CryptoUtil.decrypt(CryptoUtil.encrypt(long, SECRET), SECRET)).toBe(long);
- });
-
- it("produces different ciphertext each time due to random IV", () => {
- const enc1 = CryptoUtil.encrypt("same", SECRET);
- const enc2 = CryptoUtil.encrypt("same", SECRET);
- expect(enc1).not.toBe(enc2);
- });
-
- it("encrypted output has three colon-separated parts", () => {
- const parts = CryptoUtil.encrypt("test", SECRET).split(":");
- expect(parts).toHaveLength(3);
- });
- });
-
- describe("decrypt error handling", () => {
- it("throws on data with fewer than 3 parts", () => {
- expect(() => CryptoUtil.decrypt("onlyone", SECRET)).toThrow("Decryption failed");
- });
-
- it("throws on data with two parts", () => {
- expect(() => CryptoUtil.decrypt("a:b", SECRET)).toThrow("Decryption failed");
- });
-
- it("throws on data with four parts", () => {
- expect(() => CryptoUtil.decrypt("a:b:c:d", SECRET)).toThrow("Decryption failed");
- });
-
- it("throws with wrong secret key", () => {
- const encrypted = CryptoUtil.encrypt("secret data", SECRET);
- expect(() => CryptoUtil.decrypt(encrypted, "wrong-key")).toThrow("Decryption failed");
- });
-
- it("throws on tampered ciphertext", () => {
- const parts = CryptoUtil.encrypt("data", SECRET).split(":");
- parts[2] = "deadbeef";
- expect(() => CryptoUtil.decrypt(parts.join(":"), SECRET)).toThrow("Decryption failed");
- });
-
- it("throws on tampered auth tag", () => {
- const parts = CryptoUtil.encrypt("data", SECRET).split(":");
- parts[1] = "0".repeat(32);
- expect(() => CryptoUtil.decrypt(parts.join(":"), SECRET)).toThrow("Decryption failed");
- });
- });
-
- describe("generateSecretKey", () => {
- it("returns a 64-char lowercase hex string (32 bytes)", () => {
- expect(CryptoUtil.generateSecretKey()).toMatch(/^[0-9a-f]{64}$/);
- });
-
- it("generates unique keys each time", () => {
- const keys = Array.from({ length: 5 }, () => CryptoUtil.generateSecretKey());
- const unique = new Set(keys);
- expect(unique.size).toBe(5);
- });
-
- it("generated key can be used for encrypt/decrypt", () => {
- const key = CryptoUtil.generateSecretKey();
- const plaintext = "secret payload";
- expect(CryptoUtil.decrypt(CryptoUtil.encrypt(plaintext, key), key)).toBe(plaintext);
- });
- });
-});
diff --git a/sdk/src/core/crypto/crypto.util.ts b/sdk/src/core/crypto/crypto.util.ts
deleted file mode 100644
index c8597f09..00000000
--- a/sdk/src/core/crypto/crypto.util.ts
+++ /dev/null
@@ -1,56 +0,0 @@
-import * as crypto from "crypto";
-
-export class CryptoUtil {
- private static readonly ALGORITHM = "aes-256-gcm";
- private static readonly KEY_LENGTH = 32;
- private static readonly IV_LENGTH = 16;
- private static readonly TAG_LENGTH = 16;
-
- static encrypt(text: string, secretKey: string): string {
- try {
- const key = crypto.scryptSync(secretKey, "salt", CryptoUtil.KEY_LENGTH);
- const iv = crypto.randomBytes(CryptoUtil.IV_LENGTH);
-
- const cipher = crypto.createCipheriv(CryptoUtil.ALGORITHM, key, iv);
-
- let encrypted = cipher.update(text, "utf8", "hex");
- encrypted += cipher.final("hex");
-
- const authTag = cipher.getAuthTag();
-
- // Combine iv + authTag + encrypted data
- return iv.toString("hex") + ":" + authTag.toString("hex") + ":" + encrypted;
- } catch (error: any) {
- throw new Error("Encryption failed: " + error.message);
- }
- }
-
- static decrypt(encryptedData: string, secretKey: string): string {
- try {
- const key = crypto.scryptSync(secretKey, "salt", CryptoUtil.KEY_LENGTH);
- const parts = encryptedData.split(":");
-
- if (parts.length !== 3) {
- throw new Error("Invalid encrypted data format");
- }
-
- const iv = Buffer.from(parts[0], "hex");
- const authTag = Buffer.from(parts[1], "hex");
- const encrypted = parts[2];
-
- const decipher = crypto.createDecipheriv(CryptoUtil.ALGORITHM, key, iv);
- decipher.setAuthTag(authTag);
-
- let decrypted = decipher.update(encrypted, "hex", "utf8");
- decrypted += decipher.final("utf8");
-
- return decrypted;
- } catch (error: any) {
- throw new Error("Decryption failed: " + error.message);
- }
- }
-
- static generateSecretKey(): string {
- return crypto.randomBytes(32).toString("hex");
- }
-}
diff --git a/sdk/src/core/erc4337/index.ts b/sdk/src/core/erc4337/index.ts
deleted file mode 100644
index 782806a5..00000000
--- a/sdk/src/core/erc4337/index.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-export * from "./utils";
-export * from "./userop.builder";
diff --git a/sdk/src/core/erc4337/userop.builder.test.ts b/sdk/src/core/erc4337/userop.builder.test.ts
deleted file mode 100644
index 6cc4e7c6..00000000
--- a/sdk/src/core/erc4337/userop.builder.test.ts
+++ /dev/null
@@ -1,157 +0,0 @@
-import { UserOpBuilder } from "./userop.builder";
-import { ERC4337Utils } from "./utils";
-
-const SENDER = "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266";
-const SENDER2 = "0x70997970C51812dc3A010C7d01b50e0d17dc79C8";
-const ENTRYPOINT = "0x0000000071727De22E5E9d8BAf0edAc6f37da032";
-
-const baseUserOp = () => ({
- sender: SENDER,
- nonce: 0n,
- initCode: "0x" as const,
- callData: "0xdeadbeef",
- callGasLimit: 100_000n,
- verificationGasLimit: 100_000n,
- preVerificationGas: 21_000n,
- maxFeePerGas: 1_000_000_000n,
- maxPriorityFeePerGas: 1_000_000_000n,
- paymasterAndData: "0x" as const,
- signature: "0x" as const,
-});
-
-describe("UserOpBuilder", () => {
- let builder: UserOpBuilder;
-
- beforeEach(() => {
- builder = new UserOpBuilder();
- });
-
- // ── buildUserOp ────────────────────────────────────────────────────
-
- describe("buildUserOp", () => {
- it("passes through explicitly provided values", async () => {
- const op = await builder.buildUserOp({
- sender: SENDER,
- callData: "0xcafe",
- nonce: 7n,
- callGasLimit: 200_000n,
- verificationGasLimit: 150_000n,
- preVerificationGas: 30_000n,
- maxFeePerGas: 2_000_000_000n,
- maxPriorityFeePerGas: 1_500_000_000n,
- initCode: "0xaabbcc",
- paymasterAndData: "0x1234",
- signature: "0xdeadbeef",
- });
-
- expect(op.sender).toBe(SENDER);
- expect(op.callData).toBe("0xcafe");
- expect(op.nonce).toBe(7n);
- expect(op.callGasLimit).toBe(200_000n);
- expect(op.verificationGasLimit).toBe(150_000n);
- expect(op.preVerificationGas).toBe(30_000n);
- expect(op.maxFeePerGas).toBe(2_000_000_000n);
- expect(op.maxPriorityFeePerGas).toBe(1_500_000_000n);
- expect(op.initCode).toBe("0xaabbcc");
- expect(op.paymasterAndData).toBe("0x1234");
- expect(op.signature).toBe("0xdeadbeef");
- });
-
- it("uses default nonce of 0n", async () => {
- const op = await builder.buildUserOp({ sender: SENDER, callData: "0x" });
- expect(op.nonce).toBe(0n);
- });
-
- it("uses default initCode of 0x", async () => {
- const op = await builder.buildUserOp({ sender: SENDER, callData: "0x" });
- expect(op.initCode).toBe("0x");
- });
-
- it("uses default callGasLimit of 0n (to be estimated)", async () => {
- const op = await builder.buildUserOp({ sender: SENDER, callData: "0x" });
- expect(op.callGasLimit).toBe(0n);
- });
-
- it("uses default verificationGasLimit of 100_000n", async () => {
- const op = await builder.buildUserOp({ sender: SENDER, callData: "0x" });
- expect(op.verificationGasLimit).toBe(100_000n);
- });
-
- it("uses default preVerificationGas of 21_000n", async () => {
- const op = await builder.buildUserOp({ sender: SENDER, callData: "0x" });
- expect(op.preVerificationGas).toBe(21_000n);
- });
-
- it("uses default maxFeePerGas of 1 gwei", async () => {
- const op = await builder.buildUserOp({ sender: SENDER, callData: "0x" });
- expect(op.maxFeePerGas).toBe(1_000_000_000n);
- });
-
- it("uses default maxPriorityFeePerGas of 1 gwei", async () => {
- const op = await builder.buildUserOp({ sender: SENDER, callData: "0x" });
- expect(op.maxPriorityFeePerGas).toBe(1_000_000_000n);
- });
-
- it("uses default paymasterAndData of 0x", async () => {
- const op = await builder.buildUserOp({ sender: SENDER, callData: "0x" });
- expect(op.paymasterAndData).toBe("0x");
- });
-
- it("uses default signature of 0x", async () => {
- const op = await builder.buildUserOp({ sender: SENDER, callData: "0x" });
- expect(op.signature).toBe("0x");
- });
- });
-
- // ── getUserOpHash ──────────────────────────────────────────────────
-
- describe("getUserOpHash", () => {
- const pack = (overrides: object = {}) =>
- ERC4337Utils.packUserOperation({ ...baseUserOp(), ...overrides });
-
- it("returns a 32-byte 0x-prefixed hex string", () => {
- const hash = builder.getUserOpHash(pack(), ENTRYPOINT, 11155111);
- expect(hash).toMatch(/^0x[0-9a-fA-F]{64}$/);
- });
-
- it("is deterministic for identical inputs", () => {
- const packed = pack();
- expect(builder.getUserOpHash(packed, ENTRYPOINT, 11155111)).toBe(
- builder.getUserOpHash(packed, ENTRYPOINT, 11155111)
- );
- });
-
- it("differs when sender changes", () => {
- const h1 = builder.getUserOpHash(pack({ sender: SENDER }), ENTRYPOINT, 1);
- const h2 = builder.getUserOpHash(pack({ sender: SENDER2 }), ENTRYPOINT, 1);
- expect(h1).not.toBe(h2);
- });
-
- it("differs when nonce changes", () => {
- const h1 = builder.getUserOpHash(pack({ nonce: 0n }), ENTRYPOINT, 1);
- const h2 = builder.getUserOpHash(pack({ nonce: 1n }), ENTRYPOINT, 1);
- expect(h1).not.toBe(h2);
- });
-
- it("differs when callData changes", () => {
- const h1 = builder.getUserOpHash(pack({ callData: "0xaabb" }), ENTRYPOINT, 1);
- const h2 = builder.getUserOpHash(pack({ callData: "0xccdd" }), ENTRYPOINT, 1);
- expect(h1).not.toBe(h2);
- });
-
- it("differs when chainId changes", () => {
- const packed = pack();
- const h1 = builder.getUserOpHash(packed, ENTRYPOINT, 1);
- const h2 = builder.getUserOpHash(packed, ENTRYPOINT, 11155111);
- expect(h1).not.toBe(h2);
- });
-
- it("differs when entryPoint address changes", () => {
- const packed = pack();
- const ep2 = "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789";
- const h1 = builder.getUserOpHash(packed, ENTRYPOINT, 1);
- const h2 = builder.getUserOpHash(packed, ep2, 1);
- expect(h1).not.toBe(h2);
- });
- });
-});
diff --git a/sdk/src/core/erc4337/userop.builder.ts b/sdk/src/core/erc4337/userop.builder.ts
deleted file mode 100644
index 674b7fe8..00000000
--- a/sdk/src/core/erc4337/userop.builder.ts
+++ /dev/null
@@ -1,76 +0,0 @@
-import { ethers } from "ethers";
-import type { PackedUserOperation, UserOperation } from "../types";
-
-export class UserOpBuilder {
- // Basic defaults
- private static DEFAULT_VERIFICATION_GAS_LIMIT = 100000n;
- private static DEFAULT_PRE_VERIFICATION_GAS = 21000n;
- private static DEFAULT_MAX_FEE_PER_GAS = 1000000000n; // 1 gwei
- private static DEFAULT_MAX_PRIORITY_FEE_PER_GAS = 1000000000n; // 1 gwei
-
- constructor() {}
-
- /**
- * Build specific parts of a UserOperation
- * Note: Full construction often requires chain interaction (nonce, gas price),
- * which typically happens in the application layer or via a Provider wrapper.
- * This builder focuses on formatting and structure.
- */
- async buildUserOp(params: {
- sender: string;
- callData: string;
- nonce?: bigint;
- initCode?: string;
- callGasLimit?: bigint;
- verificationGasLimit?: bigint;
- preVerificationGas?: bigint;
- maxFeePerGas?: bigint;
- maxPriorityFeePerGas?: bigint;
- paymasterAndData?: string;
- signature?: string;
- }): Promise {
- return {
- sender: params.sender,
- nonce: params.nonce || 0n,
- initCode: params.initCode || "0x",
- callData: params.callData,
- callGasLimit: params.callGasLimit || 0n, // Should be estimated
- verificationGasLimit:
- params.verificationGasLimit || UserOpBuilder.DEFAULT_VERIFICATION_GAS_LIMIT,
- preVerificationGas: params.preVerificationGas || UserOpBuilder.DEFAULT_PRE_VERIFICATION_GAS,
- maxFeePerGas: params.maxFeePerGas || UserOpBuilder.DEFAULT_MAX_FEE_PER_GAS,
- maxPriorityFeePerGas:
- params.maxPriorityFeePerGas || UserOpBuilder.DEFAULT_MAX_PRIORITY_FEE_PER_GAS,
- paymasterAndData: params.paymasterAndData || "0x",
- signature: params.signature || "0x",
- };
- }
-
- /**
- * Hash the UserOperation for signing (ERC-4337 v0.7)
- */
- getUserOpHash(userOp: PackedUserOperation, entryPoint: string, chainId: number): string {
- const encoded = ethers.AbiCoder.defaultAbiCoder().encode(
- ["address", "uint256", "bytes32", "bytes32", "bytes32", "uint256", "bytes32", "bytes32"],
- [
- userOp.sender,
- userOp.nonce,
- ethers.keccak256(userOp.initCode),
- ethers.keccak256(userOp.callData),
- userOp.accountGasLimits,
- userOp.preVerificationGas,
- userOp.gasFees,
- ethers.keccak256(userOp.paymasterAndData),
- ]
- );
-
- return ethers.keccak256(
- ethers.AbiCoder.defaultAbiCoder().encode(
- ["bytes32", "address", "uint256"],
- [ethers.keccak256(encoded), entryPoint, chainId]
- )
- );
- }
-
- // Legacy v0.6 hashing support could be added here if needed
-}
diff --git a/sdk/src/core/erc4337/utils.test.ts b/sdk/src/core/erc4337/utils.test.ts
deleted file mode 100644
index e266d430..00000000
--- a/sdk/src/core/erc4337/utils.test.ts
+++ /dev/null
@@ -1,49 +0,0 @@
-import { ERC4337Utils } from "./utils";
-
-describe("ERC4337Utils", () => {
- it("should pack and unpack account gas limits correctly", () => {
- const verificationGasLimit = 100000n;
- const callGasLimit = 50000n;
-
- const packed = ERC4337Utils.packAccountGasLimits(verificationGasLimit, callGasLimit);
- const unpacked = ERC4337Utils.unpackAccountGasLimits(packed);
-
- expect(unpacked.verificationGasLimit).toBe(verificationGasLimit);
- expect(unpacked.callGasLimit).toBe(callGasLimit);
- });
-
- it("should pack and unpack gas fees correctly", () => {
- const maxPriorityFeePerGas = 1000000000n; // 1 gwei
- const maxFeePerGas = 2000000000n; // 2 gwei
-
- const packed = ERC4337Utils.packGasFees(maxPriorityFeePerGas, maxFeePerGas);
- const unpacked = ERC4337Utils.unpackGasFees(packed);
-
- expect(unpacked.maxPriorityFeePerGas).toBe(maxPriorityFeePerGas);
- expect(unpacked.maxFeePerGas).toBe(maxFeePerGas);
- });
-
- it("should handle full UserOp pack/unpack cycle", () => {
- const userOp = {
- sender: "0x1234567890123456789012345678901234567890",
- nonce: 1n,
- initCode: "0x",
- callData: "0xabcdef",
- callGasLimit: 10000n,
- verificationGasLimit: 20000n,
- preVerificationGas: 5000n,
- maxFeePerGas: 3000000000n,
- maxPriorityFeePerGas: 1000000000n,
- paymasterAndData: "0x",
- signature: "0x123456",
- };
-
- const packed = ERC4337Utils.packUserOperation(userOp);
- const unpacked = ERC4337Utils.unpackUserOperation(packed);
-
- expect(unpacked.sender).toBe(userOp.sender);
- expect(BigInt(unpacked.nonce)).toBe(userOp.nonce);
- expect(unpacked.initCode).toBe(userOp.initCode);
- expect(BigInt(unpacked.callGasLimit)).toBe(userOp.callGasLimit);
- });
-});
diff --git a/sdk/src/core/erc4337/utils.ts b/sdk/src/core/erc4337/utils.ts
deleted file mode 100644
index 1a398e94..00000000
--- a/sdk/src/core/erc4337/utils.ts
+++ /dev/null
@@ -1,78 +0,0 @@
-import type { PackedUserOperation } from "../types";
-
-export class ERC4337Utils {
- static packAccountGasLimits(
- verificationGasLimit: bigint | string,
- callGasLimit: bigint | string
- ): string {
- const vgl = BigInt(verificationGasLimit);
- const cgl = BigInt(callGasLimit);
- const packed = (vgl << 128n) | cgl;
- return "0x" + packed.toString(16).padStart(64, "0");
- }
-
- static unpackAccountGasLimits(accountGasLimits: string): {
- verificationGasLimit: bigint;
- callGasLimit: bigint;
- } {
- const packed = BigInt(accountGasLimits);
- return {
- verificationGasLimit: packed >> 128n,
- callGasLimit: packed & ((1n << 128n) - 1n),
- };
- }
-
- static packGasFees(maxPriorityFeePerGas: bigint | string, maxFeePerGas: bigint | string): string {
- const priority = BigInt(maxPriorityFeePerGas);
- const max = BigInt(maxFeePerGas);
- const packed = (priority << 128n) | max;
- return "0x" + packed.toString(16).padStart(64, "0");
- }
-
- static unpackGasFees(gasFees: string): {
- maxPriorityFeePerGas: bigint;
- maxFeePerGas: bigint;
- } {
- const packed = BigInt(gasFees);
- return {
- maxPriorityFeePerGas: packed >> 128n,
- maxFeePerGas: packed & ((1n << 128n) - 1n),
- };
- }
-
- static packUserOperation(userOp: any): PackedUserOperation {
- return {
- sender: userOp.sender,
- nonce: userOp.nonce,
- initCode: userOp.initCode || "0x",
- callData: userOp.callData,
- accountGasLimits: ERC4337Utils.packAccountGasLimits(
- userOp.verificationGasLimit,
- userOp.callGasLimit
- ),
- preVerificationGas: userOp.preVerificationGas,
- gasFees: ERC4337Utils.packGasFees(userOp.maxPriorityFeePerGas, userOp.maxFeePerGas),
- paymasterAndData: userOp.paymasterAndData || "0x",
- signature: userOp.signature || "0x",
- };
- }
-
- static unpackUserOperation(packedOp: PackedUserOperation): any {
- const gasLimits = ERC4337Utils.unpackAccountGasLimits(packedOp.accountGasLimits);
- const gasFees = ERC4337Utils.unpackGasFees(packedOp.gasFees);
-
- return {
- sender: packedOp.sender,
- nonce: packedOp.nonce,
- initCode: packedOp.initCode,
- callData: packedOp.callData,
- callGasLimit: "0x" + gasLimits.callGasLimit.toString(16),
- verificationGasLimit: "0x" + gasLimits.verificationGasLimit.toString(16),
- preVerificationGas: packedOp.preVerificationGas,
- maxFeePerGas: "0x" + gasFees.maxFeePerGas.toString(16),
- maxPriorityFeePerGas: "0x" + gasFees.maxPriorityFeePerGas.toString(16),
- paymasterAndData: packedOp.paymasterAndData,
- signature: packedOp.signature,
- };
- }
-}
diff --git a/sdk/src/core/types/index.ts b/sdk/src/core/types/index.ts
deleted file mode 100644
index 2b6282b2..00000000
--- a/sdk/src/core/types/index.ts
+++ /dev/null
@@ -1,31 +0,0 @@
-export interface UserOperation {
- sender: string;
- nonce: bigint | string;
- initCode: string;
- callData: string;
- callGasLimit: bigint | string;
- verificationGasLimit: bigint | string;
- preVerificationGas: bigint | string;
- maxFeePerGas: bigint | string;
- maxPriorityFeePerGas: bigint | string;
- paymasterAndData: string;
- signature: string;
-}
-
-export interface PackedUserOperation {
- sender: string;
- nonce: bigint | string;
- initCode: string;
- callData: string;
- accountGasLimits: string; // Packed: verificationGasLimit (16 bytes) + callGasLimit (16 bytes)
- preVerificationGas: bigint | string;
- gasFees: string; // Packed: maxPriorityFeePerGas (16 bytes) + maxFeePerGas (16 bytes)
- paymasterAndData: string;
- signature: string;
-}
-
-export interface GasEstimate {
- callGasLimit: string;
- verificationGasLimit: string;
- preVerificationGas: string;
-}
diff --git a/sdk/src/index.ts b/sdk/src/index.ts
deleted file mode 100644
index d57ca625..00000000
--- a/sdk/src/index.ts
+++ /dev/null
@@ -1,9 +0,0 @@
-export * from "./client";
-export * from "./auth/passkey/types";
-export * from "./auth/passkey/passkey.manager";
-export * from "./core/bls/types";
-export * from "./core/bls/bls.manager";
-export * from "./core/crypto/crypto.util";
-export * from "./core/types";
-export * from "./core/erc4337";
-export * from "./core/tier";
diff --git a/sdk/src/server/__tests__/account-manager.test.ts b/sdk/src/server/__tests__/account-manager.test.ts
deleted file mode 100644
index 962d4548..00000000
--- a/sdk/src/server/__tests__/account-manager.test.ts
+++ /dev/null
@@ -1,228 +0,0 @@
-import { AccountManager } from "../services/account-manager";
-import { MemoryStorage } from "../adapters/memory-storage";
-import { LocalWalletSigner } from "../adapters/local-wallet-signer";
-import { SilentLogger } from "../interfaces/logger";
-import { EntryPointVersion } from "../constants/entrypoint";
-
-// Hardhat account #0 — deterministic private key for tests
-const PRIVATE_KEY = "0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80";
-const SIGNER_ADDRESS = "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266";
-const ACCOUNT_ADDRESS = "0xDeployedAccountAddress000000000000000001";
-const VALIDATOR_ADDRESS = "0xValidatorAddress0000000000000000000000001";
-const FACTORY_ADDRESS = "0xFactoryAddress00000000000000000000000001";
-
-/** Build a minimal EthereumProvider mock. */
-function makeEthereumMock(overrides: Record = {}) {
- const mockFactory = {
- "getAddress(address,address,address,bool,uint256)": jest
- .fn()
- .mockResolvedValue(ACCOUNT_ADDRESS),
- target: FACTORY_ADDRESS,
- };
-
- return {
- getDefaultVersion: jest.fn().mockReturnValue(EntryPointVersion.V0_6),
- getFactoryContract: jest.fn().mockReturnValue(mockFactory),
- getValidatorContract: jest.fn().mockReturnValue({ target: VALIDATOR_ADDRESS }),
- getValidatorAddress: jest.fn().mockReturnValue(VALIDATOR_ADDRESS),
- getFactoryAddress: jest.fn().mockReturnValue(FACTORY_ADDRESS),
- getProvider: jest.fn().mockReturnValue({
- getCode: jest.fn().mockResolvedValue("0x"), // not deployed by default
- }),
- getBalance: jest.fn().mockResolvedValue("1.5"),
- getNonce: jest.fn().mockResolvedValue(3n),
- ...overrides,
- };
-}
-
-describe("AccountManager", () => {
- let storage: MemoryStorage;
- let signer: LocalWalletSigner;
- let ethereum: ReturnType;
- let manager: AccountManager;
-
- beforeEach(() => {
- storage = new MemoryStorage();
- signer = new LocalWalletSigner(PRIVATE_KEY);
- ethereum = makeEthereumMock();
- manager = new AccountManager(ethereum as any, storage, signer, new SilentLogger());
- });
-
- // ── createAccount ──────────────────────────────────────────────────
-
- describe("createAccount", () => {
- it("creates a new account and persists it", async () => {
- const account = await manager.createAccount("user-1", { salt: 42 });
-
- expect(account.userId).toBe("user-1");
- expect(account.address).toBe(ACCOUNT_ADDRESS);
- expect(account.signerAddress).toBe(SIGNER_ADDRESS);
- expect(account.salt).toBe(42);
- expect(account.deployed).toBe(false);
- expect(account.validatorAddress).toBe(VALIDATOR_ADDRESS);
- expect(account.factoryAddress).toBe(FACTORY_ADDRESS);
- expect(account.entryPointVersion).toBe("0.6");
- expect(account.deploymentTxHash).toBeNull();
- expect(account.createdAt).toBeTruthy();
-
- const saved = await storage.findAccountByUserId("user-1");
- expect(saved).toMatchObject({ userId: "user-1", address: ACCOUNT_ADDRESS });
- });
-
- it("returns the existing account without creating a duplicate", async () => {
- const first = await manager.createAccount("user-1");
- const second = await manager.createAccount("user-1");
-
- expect(second).toEqual(first);
- expect((await storage.getAccounts()).length).toBe(1);
- });
-
- it("creates separate accounts for different users", async () => {
- await manager.createAccount("user-1");
- await manager.createAccount("user-2");
-
- expect((await storage.getAccounts()).length).toBe(2);
- });
-
- it("creates separate accounts for different EntryPoint versions", async () => {
- await manager.createAccount("user-1", { entryPointVersion: EntryPointVersion.V0_6 });
- await manager.createAccount("user-1", { entryPointVersion: EntryPointVersion.V0_7 });
-
- expect((await storage.getAccounts()).length).toBe(2);
- });
-
- it("uses the provided EntryPoint version", async () => {
- await manager.createAccount("user-1", { entryPointVersion: EntryPointVersion.V0_7 });
- expect(ethereum.getFactoryContract).toHaveBeenCalledWith(EntryPointVersion.V0_7);
- });
-
- it("falls back to default version when none provided", async () => {
- await manager.createAccount("user-1");
- expect(ethereum.getDefaultVersion).toHaveBeenCalled();
- });
-
- it("marks account as deployed when contract code exists", async () => {
- ethereum.getProvider.mockReturnValue({
- getCode: jest.fn().mockResolvedValue("0x6080604052"), // non-empty bytecode
- });
-
- const account = await manager.createAccount("user-1");
- expect(account.deployed).toBe(true);
- });
-
- it("marks account as not deployed when getCode throws (RPC failure)", async () => {
- ethereum.getProvider.mockReturnValue({
- getCode: jest.fn().mockRejectedValue(new Error("RPC error")),
- });
-
- const account = await manager.createAccount("user-1");
- expect(account.deployed).toBe(false);
- });
-
- it("calls factory getAddress with signer as both creator and signer", async () => {
- await manager.createAccount("user-1", { salt: 99 });
-
- const mockFactory = ethereum.getFactoryContract.mock.results[0].value;
- expect(mockFactory["getAddress(address,address,address,bool,uint256)"]).toHaveBeenCalledWith(
- SIGNER_ADDRESS, // creator
- SIGNER_ADDRESS, // signer
- VALIDATOR_ADDRESS,
- true,
- 99
- );
- });
- });
-
- // ── getAccount ─────────────────────────────────────────────────────
-
- describe("getAccount", () => {
- it("returns null when no account exists", async () => {
- expect(await manager.getAccount("unknown")).toBeNull();
- });
-
- it("returns account enriched with balance and nonce", async () => {
- await manager.createAccount("user-1");
- const result = await manager.getAccount("user-1");
-
- expect(result).not.toBeNull();
- expect(result!.balance).toBe("1.5");
- expect(result!.nonce).toBe("3");
- });
-
- it('uses balance "0" when getBalance throws', async () => {
- ethereum.getBalance.mockRejectedValue(new Error("RPC failure"));
- await manager.createAccount("user-1");
-
- const result = await manager.getAccount("user-1");
- expect(result!.balance).toBe("0");
- });
-
- it("still returns nonce even when balance fetch fails", async () => {
- ethereum.getBalance.mockRejectedValue(new Error("RPC failure"));
- await manager.createAccount("user-1");
-
- const result = await manager.getAccount("user-1");
- expect(result!.nonce).toBe("3");
- });
- });
-
- // ── getAccountAddress ──────────────────────────────────────────────
-
- describe("getAccountAddress", () => {
- it("returns the account address", async () => {
- await manager.createAccount("user-1");
- expect(await manager.getAccountAddress("user-1")).toBe(ACCOUNT_ADDRESS);
- });
-
- it("throws Account not found for unknown user", async () => {
- await expect(manager.getAccountAddress("nobody")).rejects.toThrow("Account not found");
- });
- });
-
- // ── getAccountBalance ──────────────────────────────────────────────
-
- describe("getAccountBalance", () => {
- it("returns address, balance, and balanceInWei", async () => {
- await manager.createAccount("user-1");
- const result = await manager.getAccountBalance("user-1");
-
- expect(result.address).toBe(ACCOUNT_ADDRESS);
- expect(result.balance).toBe("1.5");
- expect(result.balanceInWei).toMatch(/^\d+$/);
- });
-
- it("throws Account not found for unknown user", async () => {
- await expect(manager.getAccountBalance("nobody")).rejects.toThrow("Account not found");
- });
- });
-
- // ── getAccountNonce ────────────────────────────────────────────────
-
- describe("getAccountNonce", () => {
- it("returns address and nonce as string", async () => {
- await manager.createAccount("user-1");
- const result = await manager.getAccountNonce("user-1");
-
- expect(result.address).toBe(ACCOUNT_ADDRESS);
- expect(result.nonce).toBe("3");
- });
-
- it("throws Account not found for unknown user", async () => {
- await expect(manager.getAccountNonce("nobody")).rejects.toThrow("Account not found");
- });
- });
-
- // ── getAccountByUserId ─────────────────────────────────────────────
-
- describe("getAccountByUserId", () => {
- it("returns null when no account exists", async () => {
- expect(await manager.getAccountByUserId("nobody")).toBeNull();
- });
-
- it("returns the account record when found", async () => {
- await manager.createAccount("user-1");
- const result = await manager.getAccountByUserId("user-1");
- expect(result?.userId).toBe("user-1");
- });
- });
-});
diff --git a/sdk/src/server/__tests__/bls-manager.test.ts b/sdk/src/server/__tests__/bls-manager.test.ts
deleted file mode 100644
index d9876748..00000000
--- a/sdk/src/server/__tests__/bls-manager.test.ts
+++ /dev/null
@@ -1,319 +0,0 @@
-// Mock @noble/curves before any imports so BLSManager doesn't fail to load
-jest.mock("@noble/curves/bls12-381.js", () => ({
- bls12_381: {
- G2: {
- hashToCurve: jest.fn().mockResolvedValue({
- toAffine: () => ({
- x: { c0: 0n, c1: 0n },
- y: { c0: 0n, c1: 0n },
- }),
- }),
- ProjectivePoint: { fromHex: jest.fn() },
- },
- getPublicKey: jest.fn(),
- sign: jest.fn(),
- verify: jest.fn(),
- aggregateSignatures: jest.fn(),
- aggregatePublicKeys: jest.fn(),
- },
-}));
-
-import axios from "axios";
-import { BLSManager } from "../../core/bls/bls.manager";
-import type { BLSNode } from "../../core/bls/types";
-
-jest.mock("axios");
-const mockAxios = axios as jest.Mocked;
-
-const makeNode = (overrides: Partial = {}): BLSNode => ({
- nodeId: "node-1",
- nodeName: "Test Node",
- apiEndpoint: "http://node1.example.com",
- status: "active",
- publicKey: "0xdeadbeef",
- ...overrides,
-});
-
-describe("BLSManager", () => {
- let manager: BLSManager;
-
- beforeEach(() => {
- manager = new BLSManager({
- seedNodes: ["http://seed1.example.com"],
- discoveryTimeout: 500,
- });
- mockAxios.get.mockReset();
- mockAxios.post.mockReset();
- });
-
- // ── getAvailableNodes ──────────────────────────────────────────────
-
- describe("getAvailableNodes", () => {
- it("returns active nodes that have apiEndpoint and publicKey", async () => {
- mockAxios.get.mockResolvedValueOnce({
- data: {
- peers: [
- {
- nodeId: "n1",
- nodeName: "N1",
- apiEndpoint: "http://n1.com",
- publicKey: "0xpk1",
- status: "active",
- },
- {
- nodeId: "n2",
- nodeName: "N2",
- apiEndpoint: "http://n2.com",
- publicKey: "0xpk2",
- status: "active",
- },
- ],
- },
- });
-
- const nodes = await manager.getAvailableNodes();
- expect(nodes).toHaveLength(2);
- expect(nodes[0].nodeId).toBe("n1");
- expect(nodes[1].nodeId).toBe("n2");
- });
-
- it("assigns 1-based index to returned nodes", async () => {
- mockAxios.get.mockResolvedValueOnce({
- data: {
- peers: [
- { nodeId: "n1", apiEndpoint: "http://n1.com", publicKey: "0xpk1", status: "active" },
- { nodeId: "n2", apiEndpoint: "http://n2.com", publicKey: "0xpk2", status: "active" },
- { nodeId: "n3", apiEndpoint: "http://n3.com", publicKey: "0xpk3", status: "active" },
- ],
- },
- });
-
- const nodes = await manager.getAvailableNodes();
- expect(nodes[0].index).toBe(1);
- expect(nodes[1].index).toBe(2);
- expect(nodes[2].index).toBe(3);
- });
-
- it("filters out nodes with inactive status", async () => {
- mockAxios.get.mockResolvedValueOnce({
- data: {
- peers: [
- { nodeId: "n1", apiEndpoint: "http://n1.com", publicKey: "0xpk1", status: "active" },
- { nodeId: "n2", apiEndpoint: "http://n2.com", publicKey: "0xpk2", status: "inactive" },
- { nodeId: "n3", apiEndpoint: "http://n3.com", publicKey: "0xpk3", status: "error" },
- ],
- },
- });
-
- const nodes = await manager.getAvailableNodes();
- expect(nodes).toHaveLength(1);
- expect(nodes[0].nodeId).toBe("n1");
- });
-
- it("filters out nodes missing publicKey", async () => {
- mockAxios.get.mockResolvedValueOnce({
- data: {
- peers: [
- { nodeId: "n1", apiEndpoint: "http://n1.com", status: "active" }, // no publicKey
- { nodeId: "n2", apiEndpoint: "http://n2.com", publicKey: "0xpk2", status: "active" },
- ],
- },
- });
-
- const nodes = await manager.getAvailableNodes();
- expect(nodes).toHaveLength(1);
- expect(nodes[0].nodeId).toBe("n2");
- });
-
- it("filters out nodes missing apiEndpoint", async () => {
- mockAxios.get.mockResolvedValueOnce({
- data: {
- peers: [
- { nodeId: "n1", publicKey: "0xpk1", status: "active" }, // no apiEndpoint
- { nodeId: "n2", apiEndpoint: "http://n2.com", publicKey: "0xpk2", status: "active" },
- ],
- },
- });
-
- const nodes = await manager.getAvailableNodes();
- expect(nodes).toHaveLength(1);
- expect(nodes[0].nodeId).toBe("n2");
- });
-
- it("returns empty array when seed node returns empty peers", async () => {
- mockAxios.get.mockResolvedValueOnce({ data: { peers: [] } });
- expect(await manager.getAvailableNodes()).toEqual([]);
- });
-
- it("returns empty array when all seed nodes fail", async () => {
- mockAxios.get.mockRejectedValue(new Error("Connection refused"));
- expect(await manager.getAvailableNodes()).toEqual([]);
- });
-
- it("tries next seed node after a failure", async () => {
- const mgr = new BLSManager({
- seedNodes: ["http://seed1.fail.com", "http://seed2.ok.com"],
- discoveryTimeout: 500,
- });
-
- mockAxios.get.mockRejectedValueOnce(new Error("Connection refused")).mockResolvedValueOnce({
- data: {
- peers: [
- { nodeId: "n1", apiEndpoint: "http://n1.com", publicKey: "0xpk1", status: "active" },
- ],
- },
- });
-
- const nodes = await mgr.getAvailableNodes();
- expect(nodes).toHaveLength(1);
- expect(mockAxios.get).toHaveBeenCalledTimes(2);
- });
- });
-
- // ── packSignature ──────────────────────────────────────────────────
-
- describe("packSignature", () => {
- const validData = () => ({
- nodeIds: ["0x" + "11".repeat(32), "0x" + "22".repeat(32)],
- signature: "0x" + "aa".repeat(96),
- messagePoint: "0x" + "bb".repeat(256),
- aaSignature: "0x" + "cc".repeat(65),
- messagePointSignature: "0x" + "dd".repeat(65),
- });
-
- it("returns a hex string for valid data", () => {
- const packed = manager.packSignature(validData() as any);
- expect(packed).toMatch(/^0x[0-9a-fA-F]+$/);
- });
-
- it("packed output is longer than the sum of inputs (includes length prefix)", () => {
- const data = validData();
- const packed = manager.packSignature(data as any);
- // Length prefix alone is 32 bytes = 64 hex chars + '0x'
- expect(packed.length).toBeGreaterThan(100);
- });
-
- it("throws when nodeIds is missing", () => {
- const { nodeIds: _nodeIds, ...rest } = validData();
- expect(() => manager.packSignature(rest as any)).toThrow(
- "Missing required signature components"
- );
- });
-
- it("throws when aaSignature is missing", () => {
- const { aaSignature: _aaSig, ...rest } = validData();
- expect(() => manager.packSignature(rest as any)).toThrow(
- "Missing required signature components"
- );
- });
-
- it("throws when messagePointSignature is missing", () => {
- const { messagePointSignature: _msgPtSig, ...rest } = validData();
- expect(() => manager.packSignature(rest as any)).toThrow(
- "Missing required signature components"
- );
- });
-
- it("produces different output for different nodeIds", () => {
- const d1 = { ...validData(), nodeIds: ["0x" + "11".repeat(32)] };
- const d2 = { ...validData(), nodeIds: ["0x" + "22".repeat(32)] };
- expect(manager.packSignature(d1 as any)).not.toBe(manager.packSignature(d2 as any));
- });
- });
-
- // ── generateMessagePoint ───────────────────────────────────────────
-
- describe("generateMessagePoint", () => {
- it("returns a 0x-prefixed hex string", async () => {
- const result = await manager.generateMessagePoint("0x" + "ab".repeat(32));
- expect(result).toMatch(/^0x[0-9a-fA-F]*/);
- });
-
- it("accepts a Uint8Array input", async () => {
- const bytes = new Uint8Array(32).fill(0xab);
- const result = await manager.generateMessagePoint(bytes);
- expect(result).toMatch(/^0x/);
- });
-
- it("accepts a plain hex string input", async () => {
- const result = await manager.generateMessagePoint("0xdeadbeef");
- expect(result).toMatch(/^0x/);
- });
- });
-
- // ── requestNodeSignature ───────────────────────────────────────────
-
- describe("requestNodeSignature", () => {
- it("returns signature with 0x prefix added when missing", async () => {
- mockAxios.post.mockResolvedValueOnce({
- data: { signature: "aabbccdd", publicKey: "0xpk" },
- });
-
- const result = await manager.requestNodeSignature(makeNode(), "0xmessage");
- expect(result.signature).toBe("0xaabbccdd");
- expect(result.publicKey).toBe("0xpk");
- });
-
- it("preserves existing 0x prefix in signature", async () => {
- mockAxios.post.mockResolvedValueOnce({
- data: { signature: "0xalreadyprefixed", publicKey: "0xpk" },
- });
-
- const result = await manager.requestNodeSignature(makeNode(), "0xmessage");
- expect(result.signature).toBe("0xalreadyprefixed");
- });
-
- it("prefers signatureCompact over signature when both present", async () => {
- mockAxios.post.mockResolvedValueOnce({
- data: { signature: "0xeipformat", signatureCompact: "0xcompact", publicKey: "0xpk" },
- });
-
- const result = await manager.requestNodeSignature(makeNode(), "0xmessage");
- expect(result.signature).toBe("0xcompact");
- });
-
- it("POSTs to the correct node endpoint", async () => {
- mockAxios.post.mockResolvedValueOnce({
- data: { signature: "0xsig", publicKey: "0xpk" },
- });
-
- const node = makeNode({ apiEndpoint: "http://mynode.example.com" });
- await manager.requestNodeSignature(node, "0xmessage");
-
- expect(mockAxios.post).toHaveBeenCalledWith(
- "http://mynode.example.com/signature/sign",
- expect.objectContaining({ message: "0xmessage" })
- );
- });
- });
-
- // ── aggregateSignatures ────────────────────────────────────────────
-
- describe("aggregateSignatures", () => {
- it("returns aggregated signature with 0x prefix added", async () => {
- mockAxios.post.mockResolvedValueOnce({ data: { signature: "agg1234" } });
-
- const result = await manager.aggregateSignatures(makeNode(), ["0xsig1", "0xsig2"]);
- expect(result).toBe("0xagg1234");
- });
-
- it("preserves existing 0x prefix in aggregated signature", async () => {
- mockAxios.post.mockResolvedValueOnce({ data: { signature: "0xpreagg" } });
-
- const result = await manager.aggregateSignatures(makeNode(), ["0xsig1"]);
- expect(result).toBe("0xpreagg");
- });
-
- it("POSTs to the correct aggregate endpoint", async () => {
- mockAxios.post.mockResolvedValueOnce({ data: { signature: "0xagg" } });
-
- const node = makeNode({ apiEndpoint: "http://agg.example.com" });
- await manager.aggregateSignatures(node, ["0xa", "0xb"]);
-
- expect(mockAxios.post).toHaveBeenCalledWith(
- "http://agg.example.com/signature/aggregate",
- expect.objectContaining({ signatures: ["0xa", "0xb"] })
- );
- });
- });
-});
diff --git a/sdk/src/server/__tests__/config.test.ts b/sdk/src/server/__tests__/config.test.ts
deleted file mode 100644
index 396543e6..00000000
--- a/sdk/src/server/__tests__/config.test.ts
+++ /dev/null
@@ -1,130 +0,0 @@
-import { validateConfig, ServerConfig } from "../config";
-import { MemoryStorage } from "../adapters/memory-storage";
-import { LocalWalletSigner } from "../adapters/local-wallet-signer";
-
-const PRIVATE_KEY = "0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80";
-
-function makeValidConfig(overrides: Partial = {}): ServerConfig {
- return {
- rpcUrl: "https://rpc.example.com",
- bundlerRpcUrl: "https://bundler.example.com",
- chainId: 11155111,
- entryPoints: {
- v06: {
- entryPointAddress: "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789",
- factoryAddress: "0x1234567890123456789012345678901234567890",
- validatorAddress: "0xaabbccddee112233445566778899001122334455",
- },
- },
- storage: new MemoryStorage(),
- signer: new LocalWalletSigner(PRIVATE_KEY),
- ...overrides,
- };
-}
-
-describe("validateConfig", () => {
- it("should pass with a valid config", () => {
- expect(() => validateConfig(makeValidConfig())).not.toThrow();
- });
-
- it("should throw if rpcUrl is missing", () => {
- expect(() => validateConfig(makeValidConfig({ rpcUrl: "" }))).toThrow("rpcUrl is required");
- });
-
- it("should throw if bundlerRpcUrl is missing", () => {
- expect(() => validateConfig(makeValidConfig({ bundlerRpcUrl: "" }))).toThrow(
- "bundlerRpcUrl is required"
- );
- });
-
- it("should throw if chainId is missing", () => {
- expect(() => validateConfig(makeValidConfig({ chainId: 0 }))).toThrow("chainId is required");
- });
-
- it("should throw if no entryPoint version is configured", () => {
- expect(() => validateConfig(makeValidConfig({ entryPoints: {} }))).toThrow(
- "at least one entryPoint version must be configured"
- );
- });
-
- it("should throw if entryPoint is missing entryPointAddress", () => {
- expect(() =>
- validateConfig(
- makeValidConfig({
- entryPoints: {
- v06: {
- entryPointAddress: "",
- factoryAddress: "0x1234567890123456789012345678901234567890",
- validatorAddress: "0xaabbccddee112233445566778899001122334455",
- },
- },
- })
- )
- ).toThrow("entryPoints.v06.entryPointAddress is required");
- });
-
- it("should throw if entryPoint is missing factoryAddress", () => {
- expect(() =>
- validateConfig(
- makeValidConfig({
- entryPoints: {
- v07: {
- entryPointAddress: "0x0000000071727De22E5E9d8BAf0edAc6f37da032",
- factoryAddress: "",
- validatorAddress: "0xaabbccddee112233445566778899001122334455",
- },
- },
- })
- )
- ).toThrow("entryPoints.v07.factoryAddress is required");
- });
-
- it("should throw if entryPoint is missing validatorAddress", () => {
- expect(() =>
- validateConfig(
- makeValidConfig({
- entryPoints: {
- v08: {
- entryPointAddress: "0x0576a174D229E3cFA37253523E645A78A0C91B57",
- factoryAddress: "0x1234567890123456789012345678901234567890",
- validatorAddress: "",
- },
- },
- })
- )
- ).toThrow("entryPoints.v08.validatorAddress is required");
- });
-
- it("should throw if storage is missing", () => {
- expect(() => validateConfig(makeValidConfig({ storage: undefined as any }))).toThrow(
- "storage adapter is required"
- );
- });
-
- it("should throw if signer is missing", () => {
- expect(() => validateConfig(makeValidConfig({ signer: undefined as any }))).toThrow(
- "signer adapter is required"
- );
- });
-
- it("should accept multiple entryPoint versions", () => {
- expect(() =>
- validateConfig(
- makeValidConfig({
- entryPoints: {
- v06: {
- entryPointAddress: "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789",
- factoryAddress: "0x1111111111111111111111111111111111111111",
- validatorAddress: "0x2222222222222222222222222222222222222222",
- },
- v07: {
- entryPointAddress: "0x0000000071727De22E5E9d8BAf0edAc6f37da032",
- factoryAddress: "0x3333333333333333333333333333333333333333",
- validatorAddress: "0x4444444444444444444444444444444444444444",
- },
- },
- })
- )
- ).not.toThrow();
- });
-});
diff --git a/sdk/src/server/__tests__/entrypoint.test.ts b/sdk/src/server/__tests__/entrypoint.test.ts
deleted file mode 100644
index 2ac0bebf..00000000
--- a/sdk/src/server/__tests__/entrypoint.test.ts
+++ /dev/null
@@ -1,73 +0,0 @@
-import {
- EntryPointVersion,
- ENTRYPOINT_ADDRESSES,
- ENTRYPOINT_ABI_V6,
- ENTRYPOINT_ABI_V7_V8,
- FACTORY_ABI_V6,
- FACTORY_ABI_V7_V8,
- ACCOUNT_ABI,
- VALIDATOR_ABI,
- ERC20_ABI,
-} from "../constants/entrypoint";
-
-describe("EntryPoint constants", () => {
- describe("EntryPointVersion enum", () => {
- it("should have v0.6, v0.7, v0.8", () => {
- expect(EntryPointVersion.V0_6).toBe("0.6");
- expect(EntryPointVersion.V0_7).toBe("0.7");
- expect(EntryPointVersion.V0_8).toBe("0.8");
- });
- });
-
- describe("ENTRYPOINT_ADDRESSES", () => {
- it("should have addresses for all versions", () => {
- expect(ENTRYPOINT_ADDRESSES[EntryPointVersion.V0_6].sepolia).toMatch(/^0x[a-fA-F0-9]{40}$/);
- expect(ENTRYPOINT_ADDRESSES[EntryPointVersion.V0_7].sepolia).toMatch(/^0x[a-fA-F0-9]{40}$/);
- expect(ENTRYPOINT_ADDRESSES[EntryPointVersion.V0_8].sepolia).toMatch(/^0x[a-fA-F0-9]{40}$/);
- });
-
- it("should have matching mainnet and sepolia addresses (canonical deployment)", () => {
- for (const version of Object.values(EntryPointVersion)) {
- expect(ENTRYPOINT_ADDRESSES[version].sepolia).toBe(ENTRYPOINT_ADDRESSES[version].mainnet);
- }
- });
- });
-
- describe("ABIs", () => {
- it("should include getUserOpHash in v0.6 ABI", () => {
- expect(ENTRYPOINT_ABI_V6.some(s => s.includes("getUserOpHash"))).toBe(true);
- });
-
- it("should include getUserOpHash in v0.7/v0.8 ABI", () => {
- expect(ENTRYPOINT_ABI_V7_V8.some(s => s.includes("getUserOpHash"))).toBe(true);
- });
-
- it("should include getNonce in both ABIs", () => {
- expect(ENTRYPOINT_ABI_V6.some(s => s.includes("getNonce"))).toBe(true);
- expect(ENTRYPOINT_ABI_V7_V8.some(s => s.includes("getNonce"))).toBe(true);
- });
-
- it("v0.6 factory should have createAccountWithAAStarValidator", () => {
- expect(FACTORY_ABI_V6.some(s => s.includes("createAccountWithAAStarValidator"))).toBe(true);
- });
-
- it("v0.7/v0.8 factory should have createAccount", () => {
- expect(FACTORY_ABI_V7_V8.some(s => s.includes("createAccount"))).toBe(true);
- });
-
- it("ACCOUNT_ABI should have execute function", () => {
- expect(ACCOUNT_ABI.some(s => s.includes("execute"))).toBe(true);
- });
-
- it("VALIDATOR_ABI should have getGasEstimate", () => {
- expect(VALIDATOR_ABI.some(s => s.includes("getGasEstimate"))).toBe(true);
- });
-
- it("ERC20_ABI should have standard ERC20 functions", () => {
- const expected = ["name", "symbol", "decimals", "balanceOf", "transfer", "approve"];
- for (const fn of expected) {
- expect(ERC20_ABI.some(s => s.includes(fn))).toBe(true);
- }
- });
- });
-});
diff --git a/sdk/src/server/__tests__/ethereum-provider-rpc.test.ts b/sdk/src/server/__tests__/ethereum-provider-rpc.test.ts
deleted file mode 100644
index 4ea5bb43..00000000
--- a/sdk/src/server/__tests__/ethereum-provider-rpc.test.ts
+++ /dev/null
@@ -1,330 +0,0 @@
-/**
- * Tests for EthereumProvider RPC methods (getBalance, getNonce, getUserOpHash,
- * estimateUserOperationGas, sendUserOperation, waitForUserOp, getUserOperationGasPrice).
- *
- * Strategy: construct a real EthereumProvider, then replace the private
- * `provider` and `bundlerProvider` fields with jest mocks.
- */
-import { ethers } from "ethers";
-import { EthereumProvider } from "../providers/ethereum-provider";
-import { EntryPointVersion } from "../constants/entrypoint";
-import { ERC4337Utils } from "../../core/erc4337/utils";
-import { SilentLogger } from "../interfaces/logger";
-import type { ServerConfig } from "../config";
-import type { UserOperation } from "../../core/types";
-
-const CHAIN_CONFIG: ServerConfig = {
- rpcUrl: "http://localhost:8545",
- bundlerRpcUrl: "http://localhost:4337",
- chainId: 11155111,
- entryPoints: {
- v06: {
- entryPointAddress: "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789",
- factoryAddress: "0x1111111111111111111111111111111111111111",
- validatorAddress: "0x2222222222222222222222222222222222222222",
- },
- v07: {
- entryPointAddress: "0x0000000071727De22E5E9d8BAf0edAc6f37da032",
- factoryAddress: "0x3333333333333333333333333333333333333333",
- validatorAddress: "0x4444444444444444444444444444444444444444",
- },
- },
- storage: null as any,
- signer: null as any,
- logger: new SilentLogger(),
-};
-
-const ACCOUNT = "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266";
-
-/** Injects mock providers into the private fields of EthereumProvider. */
-function injectMocks(ep: EthereumProvider) {
- const mockProvider = {
- getBalance: jest.fn(),
- getCode: jest.fn(),
- getFeeData: jest.fn(),
- send: jest.fn(),
- // Contract method stubs (used indirectly via getEntryPointContract)
- call: jest.fn(),
- };
-
- const mockBundler = {
- send: jest.fn(),
- };
-
- (ep as any).provider = mockProvider;
- (ep as any).bundlerProvider = mockBundler;
-
- return { mockProvider, mockBundler };
-}
-
-describe("EthereumProvider — RPC methods", () => {
- let ep: EthereumProvider;
- let mockProvider: ReturnType["mockProvider"];
- let mockBundler: ReturnType["mockBundler"];
-
- beforeEach(() => {
- ep = new EthereumProvider(CHAIN_CONFIG);
- ({ mockProvider, mockBundler } = injectMocks(ep));
- });
-
- // ── getBalance ───────────────────────────────────────────────────
-
- describe("getBalance", () => {
- it("returns balance formatted as ether string", async () => {
- mockProvider.getBalance.mockResolvedValue(ethers.parseEther("1.5"));
-
- const balance = await ep.getBalance(ACCOUNT);
- expect(balance).toBe("1.5");
- expect(mockProvider.getBalance).toHaveBeenCalledWith(ACCOUNT);
- });
-
- it('returns "0.0" for zero balance', async () => {
- mockProvider.getBalance.mockResolvedValue(0n);
- expect(await ep.getBalance(ACCOUNT)).toBe("0.0");
- });
-
- it("handles large balances without precision loss", async () => {
- const wei = ethers.parseEther("10000.123456789012345678");
- mockProvider.getBalance.mockResolvedValue(wei);
- const balance = await ep.getBalance(ACCOUNT);
- expect(balance).toContain("10000");
- });
- });
-
- // ── getNonce ─────────────────────────────────────────────────────
-
- describe("getNonce", () => {
- it("calls the EntryPoint contract getNonce and returns bigint", async () => {
- // Mock the contract call at the provider level
- mockProvider.call = jest.fn().mockResolvedValue(
- // ABI-encode uint256(5) as the return value
- ethers.AbiCoder.defaultAbiCoder().encode(["uint256"], [5n])
- );
-
- const nonce = await ep.getNonce(ACCOUNT, 0, EntryPointVersion.V0_6);
- expect(nonce).toBe(5n);
- });
-
- it("uses EntryPoint V0_6 by default", async () => {
- mockProvider.call = jest
- .fn()
- .mockResolvedValue(ethers.AbiCoder.defaultAbiCoder().encode(["uint256"], [0n]));
-
- await ep.getNonce(ACCOUNT);
- // The call should hit the V0_6 entry point address
- const callArg = mockProvider.call.mock.calls[0][0];
- expect(callArg.to?.toLowerCase()).toBe(
- "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789".toLowerCase()
- );
- });
- });
-
- // ── getUserOpHash ─────────────────────────────────────────────────
-
- describe("getUserOpHash", () => {
- const EXPECTED_HASH = "0x" + "ab".repeat(32);
-
- it("calls the V0_6 EntryPoint getUserOpHash for v0.6", async () => {
- mockProvider.call = jest
- .fn()
- .mockResolvedValue(ethers.AbiCoder.defaultAbiCoder().encode(["bytes32"], [EXPECTED_HASH]));
-
- const op: UserOperation = {
- sender: ACCOUNT,
- nonce: 0n,
- initCode: "0x",
- callData: "0x",
- callGasLimit: 100_000n,
- verificationGasLimit: 100_000n,
- preVerificationGas: 21_000n,
- maxFeePerGas: 1_000_000_000n,
- maxPriorityFeePerGas: 1_000_000_000n,
- paymasterAndData: "0x",
- signature: "0x",
- };
-
- const hash = await ep.getUserOpHash(op, EntryPointVersion.V0_6);
- expect(hash).toBe(EXPECTED_HASH);
- });
-
- it("uses packed format for V0_7", async () => {
- mockProvider.call = jest
- .fn()
- .mockResolvedValue(ethers.AbiCoder.defaultAbiCoder().encode(["bytes32"], [EXPECTED_HASH]));
-
- const packed = ERC4337Utils.packUserOperation({
- sender: ACCOUNT,
- nonce: 0n,
- initCode: "0x",
- callData: "0x",
- callGasLimit: 100_000n,
- verificationGasLimit: 100_000n,
- preVerificationGas: 21_000n,
- maxFeePerGas: 1_000_000_000n,
- maxPriorityFeePerGas: 1_000_000_000n,
- paymasterAndData: "0x",
- signature: "0x",
- });
-
- const hash = await ep.getUserOpHash(packed, EntryPointVersion.V0_7);
- expect(hash).toBe(EXPECTED_HASH);
- // V0_7 entry point should be called
- const callArg = mockProvider.call.mock.calls[0][0];
- expect(callArg.to?.toLowerCase()).toBe(
- "0x0000000071727De22E5E9d8BAf0edAc6f37da032".toLowerCase()
- );
- });
- });
-
- // ── estimateUserOperationGas ──────────────────────────────────────
-
- describe("estimateUserOperationGas", () => {
- it("returns gas estimate from bundler", async () => {
- const estimate = {
- callGasLimit: "0x249f0",
- verificationGasLimit: "0xf4240",
- preVerificationGas: "0x11170",
- };
- mockBundler.send.mockResolvedValueOnce(estimate);
-
- const result = await ep.estimateUserOperationGas({}, EntryPointVersion.V0_6);
- expect(result).toEqual(estimate);
- expect(mockBundler.send).toHaveBeenCalledWith("eth_estimateUserOperationGas", [
- expect.any(Object),
- expect.any(String),
- ]);
- });
-
- it("returns default fallback values when bundler call fails", async () => {
- mockBundler.send.mockRejectedValueOnce(new Error("bundler unavailable"));
-
- const result = await ep.estimateUserOperationGas({});
- expect(result.callGasLimit).toBe("0x249f0");
- expect(result.verificationGasLimit).toBe("0xf4240");
- expect(result.preVerificationGas).toBe("0x11170");
- });
- });
-
- // ── sendUserOperation ─────────────────────────────────────────────
-
- describe("sendUserOperation", () => {
- it("sends to bundler and returns userOpHash", async () => {
- const userOpHash = "0x" + "aa".repeat(32);
- mockBundler.send.mockResolvedValueOnce(userOpHash);
-
- const result = await ep.sendUserOperation({}, EntryPointVersion.V0_6);
- expect(result).toBe(userOpHash);
- expect(mockBundler.send).toHaveBeenCalledWith("eth_sendUserOperation", [
- expect.any(Object),
- expect.any(String),
- ]);
- });
- });
-
- // ── waitForUserOp ─────────────────────────────────────────────────
-
- describe("waitForUserOp", () => {
- beforeEach(() => jest.useFakeTimers());
- afterEach(() => jest.useRealTimers());
-
- it("resolves with txHash when receipt is available immediately", async () => {
- const txHash = "0x" + "bb".repeat(32);
- mockBundler.send.mockResolvedValue({ transactionHash: txHash });
-
- const promise = ep.waitForUserOp("0xUserOpHash", 5);
- await jest.runAllTimersAsync();
-
- await expect(promise).resolves.toBe(txHash);
- });
-
- it("resolves with txHash from nested receipt.transactionHash", async () => {
- const txHash = "0x" + "cc".repeat(32);
- mockBundler.send.mockResolvedValue({ receipt: { transactionHash: txHash } });
-
- const promise = ep.waitForUserOp("0xUserOpHash", 5);
- await jest.runAllTimersAsync();
-
- await expect(promise).resolves.toBe(txHash);
- });
-
- it("retries when receipt is null and eventually resolves", async () => {
- const txHash = "0x" + "dd".repeat(32);
- mockBundler.send
- .mockResolvedValueOnce(null) // attempt 1: not ready
- .mockResolvedValueOnce(null) // attempt 2: not ready
- .mockResolvedValueOnce({ transactionHash: txHash }); // attempt 3: ready
-
- const promise = ep.waitForUserOp("0xUserOpHash", 10);
- // Advance timers for each poll interval (2000ms each)
- await jest.advanceTimersByTimeAsync(2000);
- await jest.advanceTimersByTimeAsync(2000);
- await jest.advanceTimersByTimeAsync(2000);
- await jest.runAllTimersAsync();
-
- await expect(promise).resolves.toBe(txHash);
- });
-
- it("throws timeout error after maxAttempts", async () => {
- mockBundler.send.mockResolvedValue(null); // always null
-
- // Attach .rejects BEFORE advancing timers to avoid unhandled-rejection warning
- const assertion = expect(ep.waitForUserOp("0xUserOpHash", 2)).rejects.toThrow(
- "UserOp timeout: 0xUserOpHash"
- );
- await jest.runAllTimersAsync();
- await assertion;
- });
-
- it("continues polling when receipt fetch throws", async () => {
- const txHash = "0x" + "ee".repeat(32);
- mockBundler.send
- .mockRejectedValueOnce(new Error("network error"))
- .mockResolvedValueOnce({ transactionHash: txHash });
-
- const promise = ep.waitForUserOp("0xUserOpHash", 5);
- await jest.runAllTimersAsync();
-
- await expect(promise).resolves.toBe(txHash);
- });
- });
-
- // ── getUserOperationGasPrice ──────────────────────────────────────
-
- describe("getUserOperationGasPrice", () => {
- it("returns gas price from Pimlico endpoint", async () => {
- mockBundler.send.mockResolvedValueOnce({
- fast: {
- maxFeePerGas: "0x77359400", // 2 gwei
- maxPriorityFeePerGas: "0x3b9aca00", // 1 gwei
- },
- });
-
- const result = await ep.getUserOperationGasPrice();
- expect(result.maxFeePerGas).toBe("0x77359400");
- expect(result.maxPriorityFeePerGas).toBe("0x3b9aca00");
- });
-
- it("falls back to provider getFeeData when Pimlico fails", async () => {
- mockBundler.send.mockRejectedValueOnce(new Error("pimlico unavailable"));
- mockProvider.getFeeData.mockResolvedValueOnce({
- maxFeePerGas: ethers.parseUnits("20", "gwei"),
- maxPriorityFeePerGas: ethers.parseUnits("2", "gwei"),
- });
-
- const result = await ep.getUserOperationGasPrice();
- expect(result.maxFeePerGas).toMatch(/^0x/);
- expect(result.maxPriorityFeePerGas).toMatch(/^0x/);
- });
-
- it("falls back to hardcoded defaults when both Pimlico and getFeeData fail", async () => {
- mockBundler.send.mockRejectedValueOnce(new Error("pimlico unavailable"));
- mockProvider.getFeeData.mockRejectedValueOnce(new Error("RPC error"));
-
- const result = await ep.getUserOperationGasPrice();
- // 3 gwei default maxFeePerGas
- expect(BigInt(result.maxFeePerGas)).toBe(ethers.parseUnits("3", "gwei"));
- // 1 gwei default maxPriorityFeePerGas
- expect(BigInt(result.maxPriorityFeePerGas)).toBe(ethers.parseUnits("1", "gwei"));
- });
- });
-});
diff --git a/sdk/src/server/__tests__/ethereum-provider.test.ts b/sdk/src/server/__tests__/ethereum-provider.test.ts
deleted file mode 100644
index 3f1ebf65..00000000
--- a/sdk/src/server/__tests__/ethereum-provider.test.ts
+++ /dev/null
@@ -1,119 +0,0 @@
-import { EthereumProvider } from "../providers/ethereum-provider";
-import { EntryPointVersion } from "../constants/entrypoint";
-import { SilentLogger } from "../interfaces/logger";
-import { MemoryStorage } from "../adapters/memory-storage";
-import { LocalWalletSigner } from "../adapters/local-wallet-signer";
-import { ServerConfig } from "../config";
-
-const PRIVATE_KEY = "0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80";
-
-const V06_EP = "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789";
-const V07_EP = "0x0000000071727De22E5E9d8BAf0edAc6f37da032";
-const V06_FACTORY = "0x1111111111111111111111111111111111111111";
-const V07_FACTORY = "0x2222222222222222222222222222222222222222";
-const V06_VALIDATOR = "0x3333333333333333333333333333333333333333";
-const V07_VALIDATOR = "0x4444444444444444444444444444444444444444";
-
-function makeConfig(overrides: Partial = {}): ServerConfig {
- return {
- rpcUrl: "http://localhost:8545",
- bundlerRpcUrl: "http://localhost:4337",
- chainId: 11155111,
- entryPoints: {
- v06: {
- entryPointAddress: V06_EP,
- factoryAddress: V06_FACTORY,
- validatorAddress: V06_VALIDATOR,
- },
- v07: {
- entryPointAddress: V07_EP,
- factoryAddress: V07_FACTORY,
- validatorAddress: V07_VALIDATOR,
- },
- },
- storage: new MemoryStorage(),
- signer: new LocalWalletSigner(PRIVATE_KEY),
- logger: new SilentLogger(),
- ...overrides,
- };
-}
-
-describe("EthereumProvider", () => {
- let provider: EthereumProvider;
-
- beforeEach(() => {
- provider = new EthereumProvider(makeConfig());
- });
-
- describe("getProvider / getBundlerProvider", () => {
- it("should return JsonRpcProvider instances", () => {
- expect(provider.getProvider()).toBeDefined();
- expect(provider.getBundlerProvider()).toBeDefined();
- });
- });
-
- describe("address lookups", () => {
- it("should return v0.6 entry point address", () => {
- expect(provider.getEntryPointAddress(EntryPointVersion.V0_6)).toBe(V06_EP);
- });
-
- it("should return v0.7 entry point address", () => {
- expect(provider.getEntryPointAddress(EntryPointVersion.V0_7)).toBe(V07_EP);
- });
-
- it("should return factory address for configured version", () => {
- expect(provider.getFactoryAddress(EntryPointVersion.V0_6)).toBe(V06_FACTORY);
- expect(provider.getFactoryAddress(EntryPointVersion.V0_7)).toBe(V07_FACTORY);
- });
-
- it("should return validator address for configured version", () => {
- expect(provider.getValidatorAddress(EntryPointVersion.V0_6)).toBe(V06_VALIDATOR);
- expect(provider.getValidatorAddress(EntryPointVersion.V0_7)).toBe(V07_VALIDATOR);
- });
-
- it("should throw for unconfigured version", () => {
- expect(() => provider.getEntryPointAddress(EntryPointVersion.V0_8)).toThrow(
- "EntryPoint version 0.8 is not configured"
- );
- });
- });
-
- describe("getDefaultVersion", () => {
- it("should default to V0_6 when not specified", () => {
- expect(provider.getDefaultVersion()).toBe(EntryPointVersion.V0_6);
- });
-
- it("should return V0_7 when configured", () => {
- const p = new EthereumProvider(makeConfig({ defaultVersion: "0.7" }));
- expect(p.getDefaultVersion()).toBe(EntryPointVersion.V0_7);
- });
-
- it("should return V0_8 when configured", () => {
- const p = new EthereumProvider(makeConfig({ defaultVersion: "0.8" }));
- expect(p.getDefaultVersion()).toBe(EntryPointVersion.V0_8);
- });
- });
-
- describe("contract factories", () => {
- it("should create entry point contract with correct address", () => {
- const contract = provider.getEntryPointContract(EntryPointVersion.V0_6);
- expect(contract.target).toBe(V06_EP);
- });
-
- it("should create factory contract with correct address", () => {
- const contract = provider.getFactoryContract(EntryPointVersion.V0_6);
- expect(contract.target).toBe(V06_FACTORY);
- });
-
- it("should create validator contract with correct address", () => {
- const contract = provider.getValidatorContract(EntryPointVersion.V0_6);
- expect(contract.target).toBe(V06_VALIDATOR);
- });
-
- it("should create account contract with given address", () => {
- const addr = "0xDeaDbeefdEAdbeefdEadbEEFdeadbeEFdEaDbeeF";
- const contract = provider.getAccountContract(addr);
- expect(contract.target).toBe(addr);
- });
- });
-});
diff --git a/sdk/src/server/__tests__/kms-signer.test.ts b/sdk/src/server/__tests__/kms-signer.test.ts
deleted file mode 100644
index c91d6e69..00000000
--- a/sdk/src/server/__tests__/kms-signer.test.ts
+++ /dev/null
@@ -1,344 +0,0 @@
-import axios from "axios";
-import { ethers } from "ethers";
-import { KmsManager, KmsSigner, LegacyPasskeyAssertion } from "../services/kms-signer";
-import { SilentLogger } from "../interfaces/logger";
-
-// Mock axios.create to return an object with mock post/get methods
-const mockPost = jest.fn();
-const mockGet = jest.fn();
-jest.mock("axios", () => ({
- ...jest.requireActual("axios"),
- create: jest.fn(() => ({
- post: mockPost,
- get: mockGet,
- })),
-}));
-
-const ENDPOINT = "https://kms.test.example";
-const ADDRESS = "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266";
-const API_KEY = "test-api-key";
-
-const FAKE_SIG_HEX =
- "1b" +
- "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" +
- "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb";
-
-const MOCK_ASSERTION: LegacyPasskeyAssertion = {
- AuthenticatorData: "0xaabbcc",
- ClientDataHash: "0xddeeff",
- Signature: "0x112233",
-};
-
-// ── KmsManager ────────────────────────────────────────────────────────
-
-describe("KmsManager", () => {
- afterEach(() => {
- jest.clearAllMocks();
- });
-
- describe("isKmsEnabled", () => {
- it("returns false when kmsEnabled is not set", () => {
- expect(new KmsManager({}).isKmsEnabled()).toBe(false);
- });
-
- it("returns false when kmsEnabled is false", () => {
- expect(new KmsManager({ kmsEnabled: false }).isKmsEnabled()).toBe(false);
- });
-
- it("returns true when kmsEnabled is true", () => {
- expect(new KmsManager({ kmsEnabled: true }).isKmsEnabled()).toBe(true);
- });
- });
-
- describe("constructor", () => {
- it("creates axios instance with apiKey header when provided", () => {
- new KmsManager({
- kmsEndpoint: ENDPOINT,
- kmsEnabled: true,
- kmsApiKey: API_KEY,
- logger: new SilentLogger(),
- });
-
- expect(axios.create).toHaveBeenCalledWith(
- expect.objectContaining({
- baseURL: ENDPOINT,
- headers: expect.objectContaining({
- "x-api-key": API_KEY,
- }),
- })
- );
- });
-
- it("does not add apiKey header when not provided", () => {
- new KmsManager({
- kmsEndpoint: ENDPOINT,
- kmsEnabled: true,
- logger: new SilentLogger(),
- });
-
- const callArgs = (axios.create as jest.Mock).mock.calls[0][0];
- expect(callArgs.headers).not.toHaveProperty("x-api-key");
- });
- });
-
- describe("createKey", () => {
- it("throws when KMS is not enabled", async () => {
- const m = new KmsManager({ kmsEndpoint: ENDPOINT, kmsEnabled: false });
- await expect(m.createKey("desc", "0xpubkey")).rejects.toThrow("KMS service is not enabled");
- });
-
- it("POSTs to /CreateKey with x-amz-target header and PasskeyPublicKey", async () => {
- mockPost.mockResolvedValueOnce({
- data: {
- KeyMetadata: { KeyId: "key-abc" },
- Status: "deriving",
- },
- });
-
- const m = new KmsManager({
- kmsEndpoint: ENDPOINT,
- kmsEnabled: true,
- logger: new SilentLogger(),
- });
- const result = await m.createKey("my-key", "0xpubkey123");
-
- expect(mockPost).toHaveBeenCalledWith(
- "/CreateKey",
- {
- Description: "my-key",
- KeyUsage: "SIGN_VERIFY",
- KeySpec: "ECC_SECG_P256K1",
- Origin: "EXTERNAL_KMS",
- PasskeyPublicKey: "0xpubkey123",
- },
- expect.objectContaining({
- headers: expect.objectContaining({
- "x-amz-target": "TrentService.CreateKey",
- }),
- })
- );
- expect(result.KeyMetadata.KeyId).toBe("key-abc");
- });
- });
-
- describe("signHash", () => {
- it("throws when KMS is not enabled", async () => {
- const m = new KmsManager({ kmsEndpoint: ENDPOINT });
- await expect(m.signHash("0xhash", MOCK_ASSERTION, { Address: ADDRESS })).rejects.toThrow(
- "KMS service is not enabled"
- );
- });
-
- it("adds 0x prefix to hash that lacks it", async () => {
- mockPost.mockResolvedValueOnce({ data: { Signature: "aabbcc" } });
-
- const m = new KmsManager({
- kmsEndpoint: ENDPOINT,
- kmsEnabled: true,
- logger: new SilentLogger(),
- });
- await m.signHash("noprefixhash", MOCK_ASSERTION, { Address: ADDRESS });
-
- expect(mockPost).toHaveBeenCalledWith(
- "/SignHash",
- expect.objectContaining({
- Hash: "0xnoprefixhash",
- Address: ADDRESS,
- Passkey: MOCK_ASSERTION,
- }),
- expect.any(Object)
- );
- });
-
- it("preserves existing 0x prefix on hash", async () => {
- mockPost.mockResolvedValueOnce({ data: { Signature: "ddeeff" } });
-
- const m = new KmsManager({
- kmsEndpoint: ENDPOINT,
- kmsEnabled: true,
- logger: new SilentLogger(),
- });
- await m.signHash("0xalreadyprefixed", MOCK_ASSERTION, { Address: ADDRESS });
-
- expect(mockPost).toHaveBeenCalledWith(
- "/SignHash",
- expect.objectContaining({ Hash: "0xalreadyprefixed" }),
- expect.any(Object)
- );
- });
-
- it("supports KeyId target", async () => {
- mockPost.mockResolvedValueOnce({ data: { Signature: FAKE_SIG_HEX } });
-
- const m = new KmsManager({
- kmsEndpoint: ENDPOINT,
- kmsEnabled: true,
- logger: new SilentLogger(),
- });
- await m.signHash("0xhash", MOCK_ASSERTION, { KeyId: "key-1" });
-
- expect(mockPost).toHaveBeenCalledWith(
- "/SignHash",
- expect.objectContaining({ KeyId: "key-1" }),
- expect.any(Object)
- );
- });
- });
-
- describe("WebAuthn methods", () => {
- it("beginRegistration POSTs to /BeginRegistration", async () => {
- mockPost.mockResolvedValueOnce({
- data: { ChallengeId: "ch-1", Options: {} },
- });
-
- const m = new KmsManager({
- kmsEndpoint: ENDPOINT,
- kmsEnabled: true,
- logger: new SilentLogger(),
- });
- const result = await m.beginRegistration({ UserName: "test@test.com" });
-
- expect(mockPost).toHaveBeenCalledWith("/BeginRegistration", {
- UserName: "test@test.com",
- });
- expect(result.ChallengeId).toBe("ch-1");
- });
-
- it("beginAuthentication POSTs to /BeginAuthentication", async () => {
- mockPost.mockResolvedValueOnce({
- data: { ChallengeId: "ch-2", Options: {} },
- });
-
- const m = new KmsManager({
- kmsEndpoint: ENDPOINT,
- kmsEnabled: true,
- logger: new SilentLogger(),
- });
- const result = await m.beginAuthentication({ Address: ADDRESS });
-
- expect(mockPost).toHaveBeenCalledWith("/BeginAuthentication", {
- Address: ADDRESS,
- });
- expect(result.ChallengeId).toBe("ch-2");
- });
- });
-
- describe("getKeyStatus", () => {
- it("GETs /KeyStatus with KeyId query param", async () => {
- mockGet.mockResolvedValueOnce({
- data: { KeyId: "key-1", Status: "ready", Address: ADDRESS },
- });
-
- const m = new KmsManager({
- kmsEndpoint: ENDPOINT,
- kmsEnabled: true,
- logger: new SilentLogger(),
- });
- const result = await m.getKeyStatus("key-1");
-
- expect(mockGet).toHaveBeenCalledWith("/KeyStatus", {
- params: { KeyId: "key-1" },
- });
- expect(result.Status).toBe("ready");
- expect(result.Address).toBe(ADDRESS);
- });
- });
-
- describe("createKmsSigner", () => {
- it("throws when KMS is not enabled", () => {
- const m = new KmsManager({ kmsEndpoint: ENDPOINT });
- expect(() =>
- m.createKmsSigner("key-1", ADDRESS, () => Promise.resolve(MOCK_ASSERTION))
- ).toThrow("KMS service is not enabled");
- });
-
- it("returns a KmsSigner instance", () => {
- const m = new KmsManager({
- kmsEndpoint: ENDPOINT,
- kmsEnabled: true,
- logger: new SilentLogger(),
- });
- const s = m.createKmsSigner("key-1", ADDRESS, () => Promise.resolve(MOCK_ASSERTION));
- expect(s).toBeInstanceOf(KmsSigner);
- });
- });
-});
-
-// ── KmsSigner ─────────────────────────────────────────────────────────
-
-describe("KmsSigner", () => {
- let manager: KmsManager;
- let signer: KmsSigner;
-
- beforeEach(() => {
- mockPost.mockReset();
- manager = new KmsManager({
- kmsEndpoint: ENDPOINT,
- kmsEnabled: true,
- logger: new SilentLogger(),
- });
- signer = manager.createKmsSigner("key-1", ADDRESS, () => Promise.resolve(MOCK_ASSERTION));
- });
-
- it("getAddress returns the KMS-managed address", async () => {
- expect(await signer.getAddress()).toBe(ADDRESS);
- });
-
- it("signMessage calls signHash with EIP-191 message hash and assertion", async () => {
- mockPost.mockResolvedValueOnce({ data: { Signature: FAKE_SIG_HEX } });
-
- const result = await signer.signMessage("hello");
- expect(result).toBe("0x" + FAKE_SIG_HEX);
-
- expect(mockPost).toHaveBeenCalledWith(
- "/SignHash",
- expect.objectContaining({
- Address: ADDRESS,
- Hash: expect.stringMatching(/^0x[0-9a-f]{64}$/i),
- Passkey: MOCK_ASSERTION,
- }),
- expect.any(Object)
- );
- });
-
- it("signMessage handles Uint8Array input", async () => {
- mockPost.mockResolvedValueOnce({ data: { Signature: FAKE_SIG_HEX } });
- const bytes = new TextEncoder().encode("hello");
- const result = await signer.signMessage(bytes);
- expect(result).toBe("0x" + FAKE_SIG_HEX);
- });
-
- it("signTypedData calls signHash with typed data hash", async () => {
- mockPost.mockResolvedValueOnce({ data: { Signature: FAKE_SIG_HEX } });
-
- const domain = { name: "TestApp", version: "1", chainId: 1 };
- const types = { Message: [{ name: "content", type: "string" }] };
- const value = { content: "hello" };
-
- const result = await signer.signTypedData(domain, types, value);
- expect(result).toBe("0x" + FAKE_SIG_HEX);
- expect(mockPost).toHaveBeenCalledWith(
- "/SignHash",
- expect.objectContaining({
- Address: ADDRESS,
- Passkey: MOCK_ASSERTION,
- }),
- expect.any(Object)
- );
- });
-
- it("signTransaction throws without provider", async () => {
- await expect(signer.signTransaction({ to: ADDRESS, value: 0n })).rejects.toThrow(
- "Provider is required"
- );
- });
-
- it("connect returns a new KmsSigner with the given provider", () => {
- const provider = new ethers.JsonRpcProvider("http://localhost:8545");
- const connected = signer.connect(provider);
-
- expect(connected).toBeInstanceOf(KmsSigner);
- expect(connected).not.toBe(signer);
- expect(connected.provider).toBe(provider);
- });
-});
diff --git a/sdk/src/server/__tests__/local-wallet-signer.test.ts b/sdk/src/server/__tests__/local-wallet-signer.test.ts
deleted file mode 100644
index 6a1b8383..00000000
--- a/sdk/src/server/__tests__/local-wallet-signer.test.ts
+++ /dev/null
@@ -1,44 +0,0 @@
-import { ethers } from "ethers";
-import { LocalWalletSigner } from "../adapters/local-wallet-signer";
-
-// Hardhat account #0
-const PRIVATE_KEY = "0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80";
-const EXPECTED_ADDRESS = "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266";
-
-describe("LocalWalletSigner", () => {
- let signer: LocalWalletSigner;
-
- beforeEach(() => {
- signer = new LocalWalletSigner(PRIVATE_KEY);
- });
-
- it("should return the correct address for any userId", async () => {
- const addr1 = await signer.getAddress("user-a");
- const addr2 = await signer.getAddress("user-b");
- expect(addr1).toBe(EXPECTED_ADDRESS);
- expect(addr2).toBe(EXPECTED_ADDRESS);
- });
-
- it("should return an ethers Signer", async () => {
- const s = await signer.getSigner("user-x");
- expect(s).toBeDefined();
- const address = await s.getAddress();
- expect(address).toBe(EXPECTED_ADDRESS);
- });
-
- it("should return signer and address from ensureSigner", async () => {
- const result = await signer.ensureSigner("user-z");
- expect(result.address).toBe(EXPECTED_ADDRESS);
- expect(result.signer).toBeDefined();
- const signerAddr = await result.signer.getAddress();
- expect(signerAddr).toBe(EXPECTED_ADDRESS);
- });
-
- it("should produce a valid signature", async () => {
- const s = (await signer.getSigner("user-a")) as ethers.Wallet;
- const message = "hello";
- const signature = await s.signMessage(message);
- const recovered = ethers.verifyMessage(message, signature);
- expect(recovered).toBe(EXPECTED_ADDRESS);
- });
-});
diff --git a/sdk/src/server/__tests__/logger.test.ts b/sdk/src/server/__tests__/logger.test.ts
deleted file mode 100644
index 9893586b..00000000
--- a/sdk/src/server/__tests__/logger.test.ts
+++ /dev/null
@@ -1,71 +0,0 @@
-import { ConsoleLogger, SilentLogger } from "../interfaces/logger";
-
-describe("ConsoleLogger", () => {
- let logger: ConsoleLogger;
- const spies: Record = {};
-
- beforeEach(() => {
- logger = new ConsoleLogger("[TEST]");
- spies.debug = jest.spyOn(console, "debug").mockImplementation();
- spies.log = jest.spyOn(console, "log").mockImplementation();
- spies.warn = jest.spyOn(console, "warn").mockImplementation();
- spies.error = jest.spyOn(console, "error").mockImplementation();
- });
-
- afterEach(() => {
- Object.values(spies).forEach(s => s.mockRestore());
- });
-
- it("should prefix debug messages", () => {
- logger.debug("hello");
- expect(spies.debug).toHaveBeenCalledWith("[TEST] hello");
- });
-
- it("should prefix log messages", () => {
- logger.log("info message");
- expect(spies.log).toHaveBeenCalledWith("[TEST] info message");
- });
-
- it("should prefix warn messages", () => {
- logger.warn("warning");
- expect(spies.warn).toHaveBeenCalledWith("[TEST] warning");
- });
-
- it("should prefix error messages", () => {
- logger.error("failure");
- expect(spies.error).toHaveBeenCalledWith("[TEST] failure");
- });
-
- it("should pass extra args through", () => {
- logger.log("count", 42, { key: "val" });
- expect(spies.log).toHaveBeenCalledWith("[TEST] count", 42, { key: "val" });
- });
-
- it("should use default prefix when none provided", () => {
- const defaultLogger = new ConsoleLogger();
- defaultLogger.log("msg");
- expect(spies.log).toHaveBeenCalledWith("[YAAA] msg");
- });
-});
-
-describe("SilentLogger", () => {
- let logger: SilentLogger;
-
- beforeEach(() => {
- logger = new SilentLogger();
- });
-
- it("should not throw on any method call", () => {
- expect(() => logger.debug("a")).not.toThrow();
- expect(() => logger.log("b")).not.toThrow();
- expect(() => logger.warn("c")).not.toThrow();
- expect(() => logger.error("d")).not.toThrow();
- });
-
- it("should not output to console", () => {
- const spy = jest.spyOn(console, "log").mockImplementation();
- logger.log("silent");
- expect(spy).not.toHaveBeenCalled();
- spy.mockRestore();
- });
-});
diff --git a/sdk/src/server/__tests__/memory-storage.test.ts b/sdk/src/server/__tests__/memory-storage.test.ts
deleted file mode 100644
index 7c51e4c7..00000000
--- a/sdk/src/server/__tests__/memory-storage.test.ts
+++ /dev/null
@@ -1,223 +0,0 @@
-import { MemoryStorage } from "../adapters/memory-storage";
-import { AccountRecord, TransferRecord, PaymasterRecord } from "../interfaces/storage-adapter";
-
-function makeAccount(overrides: Partial = {}): AccountRecord {
- return {
- userId: "user-1",
- address: "0xaaaa",
- signerAddress: "0xbbbb",
- salt: 123,
- deployed: false,
- deploymentTxHash: null,
- validatorAddress: "0xcccc",
- entryPointVersion: "0.6",
- factoryAddress: "0xdddd",
- createdAt: new Date().toISOString(),
- ...overrides,
- };
-}
-
-function makeTransfer(overrides: Partial = {}): TransferRecord {
- return {
- id: "tx-1",
- userId: "user-1",
- from: "0xaaaa",
- to: "0xeeee",
- amount: "0.01",
- userOpHash: "0xhash1",
- status: "pending",
- nodeIndices: [],
- createdAt: new Date().toISOString(),
- ...overrides,
- };
-}
-
-describe("MemoryStorage", () => {
- let storage: MemoryStorage;
-
- beforeEach(() => {
- storage = new MemoryStorage();
- });
-
- // ── Accounts ────────────────────────────────────────────────
-
- describe("accounts", () => {
- it("should start with empty accounts", async () => {
- expect(await storage.getAccounts()).toEqual([]);
- });
-
- it("should save and retrieve accounts", async () => {
- const account = makeAccount();
- await storage.saveAccount(account);
-
- const accounts = await storage.getAccounts();
- expect(accounts).toHaveLength(1);
- expect(accounts[0].userId).toBe("user-1");
- });
-
- it("should find account by userId", async () => {
- await storage.saveAccount(makeAccount({ userId: "user-1" }));
- await storage.saveAccount(makeAccount({ userId: "user-2", address: "0xffff" }));
-
- const found = await storage.findAccountByUserId("user-2");
- expect(found).not.toBeNull();
- expect(found!.address).toBe("0xffff");
- });
-
- it("should return null for non-existent userId", async () => {
- const found = await storage.findAccountByUserId("no-such-user");
- expect(found).toBeNull();
- });
-
- it("should update account fields", async () => {
- await storage.saveAccount(makeAccount({ userId: "user-1", deployed: false }));
- await storage.updateAccount("user-1", { deployed: true, deploymentTxHash: "0xtx" });
-
- const updated = await storage.findAccountByUserId("user-1");
- expect(updated!.deployed).toBe(true);
- expect(updated!.deploymentTxHash).toBe("0xtx");
- });
-
- it("should not mutate the original object on save", async () => {
- const account = makeAccount();
- await storage.saveAccount(account);
- account.deployed = true;
-
- const stored = await storage.findAccountByUserId("user-1");
- expect(stored!.deployed).toBe(false);
- });
- });
-
- // ── Transfers ───────────────────────────────────────────────
-
- describe("transfers", () => {
- it("should save and find transfers by userId", async () => {
- await storage.saveTransfer(makeTransfer({ id: "tx-1", userId: "user-1" }));
- await storage.saveTransfer(makeTransfer({ id: "tx-2", userId: "user-2" }));
- await storage.saveTransfer(makeTransfer({ id: "tx-3", userId: "user-1" }));
-
- const user1Transfers = await storage.findTransfersByUserId("user-1");
- expect(user1Transfers).toHaveLength(2);
- });
-
- it("should find transfer by id", async () => {
- await storage.saveTransfer(makeTransfer({ id: "tx-42" }));
-
- const found = await storage.findTransferById("tx-42");
- expect(found).not.toBeNull();
- expect(found!.id).toBe("tx-42");
- });
-
- it("should return null for non-existent transfer id", async () => {
- const found = await storage.findTransferById("non-existent");
- expect(found).toBeNull();
- });
-
- it("should update transfer status", async () => {
- await storage.saveTransfer(makeTransfer({ id: "tx-1", status: "pending" }));
- await storage.updateTransfer("tx-1", {
- status: "completed",
- transactionHash: "0xtxhash",
- });
-
- const updated = await storage.findTransferById("tx-1");
- expect(updated!.status).toBe("completed");
- expect(updated!.transactionHash).toBe("0xtxhash");
- });
-
- it("should return empty array for user with no transfers", async () => {
- const transfers = await storage.findTransfersByUserId("ghost");
- expect(transfers).toEqual([]);
- });
- });
-
- // ── Paymasters ──────────────────────────────────────────────
-
- describe("paymasters", () => {
- it("should start with no paymasters for a user", async () => {
- const paymasters = await storage.getPaymasters("user-1");
- expect(paymasters).toEqual([]);
- });
-
- it("should save and retrieve paymasters per user", async () => {
- const pm: PaymasterRecord = {
- name: "my-pm",
- address: "0x1111",
- type: "custom",
- };
- await storage.savePaymaster("user-1", pm);
-
- const list = await storage.getPaymasters("user-1");
- expect(list).toHaveLength(1);
- expect(list[0].name).toBe("my-pm");
-
- // Other user should not see it
- const otherList = await storage.getPaymasters("user-2");
- expect(otherList).toEqual([]);
- });
-
- it("should replace paymaster with same name", async () => {
- await storage.savePaymaster("user-1", {
- name: "pm-a",
- address: "0x1111",
- type: "custom",
- });
- await storage.savePaymaster("user-1", {
- name: "pm-a",
- address: "0x2222",
- type: "pimlico",
- apiKey: "key123",
- });
-
- const list = await storage.getPaymasters("user-1");
- expect(list).toHaveLength(1);
- expect(list[0].address).toBe("0x2222");
- expect(list[0].type).toBe("pimlico");
- });
-
- it("should add multiple paymasters with different names", async () => {
- await storage.savePaymaster("user-1", { name: "a", address: "0x1", type: "custom" });
- await storage.savePaymaster("user-1", { name: "b", address: "0x2", type: "custom" });
-
- const list = await storage.getPaymasters("user-1");
- expect(list).toHaveLength(2);
- });
-
- it("should remove paymaster by name", async () => {
- await storage.savePaymaster("user-1", { name: "del-me", address: "0x1", type: "custom" });
- await storage.savePaymaster("user-1", { name: "keep-me", address: "0x2", type: "custom" });
-
- const removed = await storage.removePaymaster("user-1", "del-me");
- expect(removed).toBe(true);
-
- const list = await storage.getPaymasters("user-1");
- expect(list).toHaveLength(1);
- expect(list[0].name).toBe("keep-me");
- });
-
- it("should return false when removing non-existent paymaster", async () => {
- const removed = await storage.removePaymaster("user-1", "nothing");
- expect(removed).toBe(false);
- });
- });
-
- // ── BLS Config ──────────────────────────────────────────────
-
- describe("bls config", () => {
- it("should start with null bls config", async () => {
- const config = await storage.getBlsConfig();
- expect(config).toBeNull();
- });
-
- it("should update signer nodes cache", async () => {
- const nodes = [
- { nodeId: "n1", nodeName: "Node 1", apiEndpoint: "http://node1", status: "active" },
- ];
- await storage.updateSignerNodesCache(nodes);
-
- const config = await storage.getBlsConfig();
- expect(config).not.toBeNull();
- expect(config!.signerNodes).toBeDefined();
- });
- });
-});
diff --git a/sdk/src/server/__tests__/paymaster-manager.test.ts b/sdk/src/server/__tests__/paymaster-manager.test.ts
deleted file mode 100644
index f1a11033..00000000
--- a/sdk/src/server/__tests__/paymaster-manager.test.ts
+++ /dev/null
@@ -1,196 +0,0 @@
-import { PaymasterManager } from "../services/paymaster-manager";
-import { MemoryStorage } from "../adapters/memory-storage";
-import { SilentLogger } from "../interfaces/logger";
-import { EthereumProvider } from "../providers/ethereum-provider";
-import { LocalWalletSigner } from "../adapters/local-wallet-signer";
-
-const PRIVATE_KEY = "0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80";
-
-function makeEthereumProvider(): EthereumProvider {
- return new EthereumProvider({
- rpcUrl: "http://localhost:8545",
- bundlerRpcUrl: "http://localhost:4337",
- chainId: 11155111,
- entryPoints: {
- v06: {
- entryPointAddress: "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789",
- factoryAddress: "0x1111111111111111111111111111111111111111",
- validatorAddress: "0x2222222222222222222222222222222222222222",
- },
- },
- storage: new MemoryStorage(),
- signer: new LocalWalletSigner(PRIVATE_KEY),
- logger: new SilentLogger(),
- });
-}
-
-describe("PaymasterManager", () => {
- let pm: PaymasterManager;
- let storage: MemoryStorage;
-
- beforeEach(() => {
- storage = new MemoryStorage();
- pm = new PaymasterManager(makeEthereumProvider(), storage, new SilentLogger());
- });
-
- describe("addCustomPaymaster / getAvailablePaymasters", () => {
- it("should return empty list initially", async () => {
- const list = await pm.getAvailablePaymasters("user-1");
- expect(list).toEqual([]);
- });
-
- it("should add and retrieve a custom paymaster", async () => {
- await pm.addCustomPaymaster(
- "user-1",
- "my-pm",
- "0xaAaAaAaaAaAaAaaAaAAAAAAAAaaaAaAaAaaAaaAa",
- "custom"
- );
-
- const list = await pm.getAvailablePaymasters("user-1");
- expect(list).toHaveLength(1);
- expect(list[0].name).toBe("my-pm");
- expect(list[0].configured).toBe(true);
- });
-
- it("should mark paymaster with 0x address as not configured", async () => {
- await storage.savePaymaster("user-1", {
- name: "empty",
- address: "0x",
- type: "custom",
- });
-
- const list = await pm.getAvailablePaymasters("user-1");
- expect(list[0].configured).toBe(false);
- });
- });
-
- describe("removeCustomPaymaster", () => {
- it("should remove an existing paymaster", async () => {
- await pm.addCustomPaymaster(
- "user-1",
- "to-delete",
- "0x1234567890123456789012345678901234567890"
- );
- const removed = await pm.removeCustomPaymaster("user-1", "to-delete");
- expect(removed).toBe(true);
-
- const list = await pm.getAvailablePaymasters("user-1");
- expect(list).toHaveLength(0);
- });
-
- it("should return false for non-existent paymaster", async () => {
- const removed = await pm.removeCustomPaymaster("user-1", "nope");
- expect(removed).toBe(false);
- });
- });
-
- describe("getPaymasterData", () => {
- it("should return address directly for custom user-provided v0.6 paymaster", async () => {
- const addr = "0x1234567890AbcDeF1234567890abcDEf12345678";
- const v06EntryPoint = "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789";
-
- const data = await pm.getPaymasterData(
- "user-1",
- "custom-user-provided",
- {},
- v06EntryPoint,
- addr
- );
-
- expect(data.toLowerCase()).toBe(addr.toLowerCase());
- });
-
- it("should return packed data for custom user-provided v0.7 paymaster", async () => {
- const addr = "0x1234567890AbcDeF1234567890abcDEf12345678";
- const v07EntryPoint = "0x0000000071727De22E5E9d8BAf0edAc6f37da032";
-
- const data = await pm.getPaymasterData(
- "user-1",
- "custom-user-provided",
- {},
- v07EntryPoint,
- addr
- );
-
- // Should start with the paymaster address (lowercase)
- expect(data.slice(0, 42).toLowerCase()).toBe(addr.toLowerCase());
- // Should be longer than just the address (includes gas limits)
- expect(data.length).toBeGreaterThan(42);
- });
-
- it("should throw for invalid address format", async () => {
- await expect(
- pm.getPaymasterData("user-1", "custom-user-provided", {}, "0x1234", "not-an-address")
- ).rejects.toThrow("Invalid paymaster address format");
- });
-
- it("should throw for unknown paymaster name", async () => {
- await expect(pm.getPaymasterData("user-1", "unknown-pm", {}, "0x1234")).rejects.toThrow(
- "Paymaster unknown-pm not found"
- );
- });
-
- it("should return address for stored custom type", async () => {
- const addr = "0xDeaDbeefdEAdbeefdEadbEEFdeadbeEFdEaDbeeF";
- await pm.addCustomPaymaster("user-1", "my-custom", addr, "custom");
-
- const data = await pm.getPaymasterData(
- "user-1",
- "my-custom",
- {},
- "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789"
- );
- expect(data).toBe(addr);
- });
-
- it("should return 0x for pimlico type without API key", async () => {
- await storage.savePaymaster("user-1", {
- name: "no-key",
- address: "0x1234567890123456789012345678901234567890",
- type: "pimlico",
- // no apiKey
- });
-
- const data = await pm.getPaymasterData(
- "user-1",
- "no-key",
- {},
- "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789"
- );
- expect(data).toBe("0x");
- });
-
- it("should return 0x for stackup type without API key", async () => {
- await storage.savePaymaster("user-1", {
- name: "no-key-su",
- address: "0x1234567890123456789012345678901234567890",
- type: "stackup",
- });
-
- const data = await pm.getPaymasterData(
- "user-1",
- "no-key-su",
- {},
- "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789"
- );
- expect(data).toBe("0x");
- });
-
- it("should return 0x for alchemy type without API key", async () => {
- await storage.savePaymaster("user-1", {
- name: "no-key-alch",
- address: "0x1234567890123456789012345678901234567890",
- type: "alchemy",
- });
-
- const data = await pm.getPaymasterData(
- "user-1",
- "no-key-alch",
- {},
- "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789"
- );
- expect(data).toBe("0x");
- });
- });
-});
diff --git a/sdk/src/server/__tests__/server-client.test.ts b/sdk/src/server/__tests__/server-client.test.ts
deleted file mode 100644
index 3d66f35f..00000000
--- a/sdk/src/server/__tests__/server-client.test.ts
+++ /dev/null
@@ -1,108 +0,0 @@
-// Mock @noble/curves before any imports so BLSManager doesn't fail to load
-jest.mock("@noble/curves/bls12-381.js", () => ({
- bls12_381: {
- G2: { hashToCurve: jest.fn(), ProjectivePoint: { fromHex: jest.fn() } },
- getPublicKey: jest.fn(),
- sign: jest.fn(),
- verify: jest.fn(),
- aggregateSignatures: jest.fn(),
- aggregatePublicKeys: jest.fn(),
- },
-}));
-
-import { YAAAServerClient } from "../server-client";
-import { MemoryStorage } from "../adapters/memory-storage";
-import { LocalWalletSigner } from "../adapters/local-wallet-signer";
-import { SilentLogger } from "../interfaces/logger";
-import { ServerConfig } from "../config";
-
-const PRIVATE_KEY = "0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80";
-
-function makeConfig(overrides: Partial = {}): ServerConfig {
- return {
- rpcUrl: "http://localhost:8545",
- bundlerRpcUrl: "http://localhost:4337",
- chainId: 11155111,
- entryPoints: {
- v06: {
- entryPointAddress: "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789",
- factoryAddress: "0x1111111111111111111111111111111111111111",
- validatorAddress: "0x2222222222222222222222222222222222222222",
- },
- },
- storage: new MemoryStorage(),
- signer: new LocalWalletSigner(PRIVATE_KEY),
- logger: new SilentLogger(),
- ...overrides,
- };
-}
-
-describe("YAAAServerClient", () => {
- it("should construct successfully with valid config", () => {
- const client = new YAAAServerClient(makeConfig());
- expect(client).toBeDefined();
- });
-
- it("should expose all service properties", () => {
- const client = new YAAAServerClient(makeConfig());
-
- expect(client.ethereum).toBeDefined();
- expect(client.accounts).toBeDefined();
- expect(client.transfers).toBeDefined();
- expect(client.bls).toBeDefined();
- expect(client.paymaster).toBeDefined();
- expect(client.tokens).toBeDefined();
- expect(client.wallets).toBeDefined();
- });
-
- it("should throw on invalid config (missing rpcUrl)", () => {
- expect(() => new YAAAServerClient(makeConfig({ rpcUrl: "" }))).toThrow("rpcUrl is required");
- });
-
- it("should throw on invalid config (no entryPoints)", () => {
- expect(() => new YAAAServerClient(makeConfig({ entryPoints: {} }))).toThrow(
- "at least one entryPoint version must be configured"
- );
- });
-
- it("should throw on invalid config (missing storage)", () => {
- expect(() => new YAAAServerClient(makeConfig({ storage: undefined as any }))).toThrow(
- "storage adapter is required"
- );
- });
-
- it("should throw on invalid config (missing signer)", () => {
- expect(() => new YAAAServerClient(makeConfig({ signer: undefined as any }))).toThrow(
- "signer adapter is required"
- );
- });
-
- it("wallets should delegate to signer adapter", async () => {
- const client = new YAAAServerClient(makeConfig());
- const address = await client.wallets.getAddress("user-1");
- // LocalWalletSigner with the hardhat key should return the known address
- expect(address).toBe("0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266");
- });
-
- it("should accept multiple entryPoint versions", () => {
- const client = new YAAAServerClient(
- makeConfig({
- entryPoints: {
- v06: {
- entryPointAddress: "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789",
- factoryAddress: "0x1111111111111111111111111111111111111111",
- validatorAddress: "0x2222222222222222222222222222222222222222",
- },
- v07: {
- entryPointAddress: "0x0000000071727De22E5E9d8BAf0edAc6f37da032",
- factoryAddress: "0x3333333333333333333333333333333333333333",
- validatorAddress: "0x4444444444444444444444444444444444444444",
- },
- },
- defaultVersion: "0.7",
- })
- );
-
- expect(client.ethereum.getDefaultVersion()).toBe("0.7");
- });
-});
diff --git a/sdk/src/server/__tests__/token-service-onchain.test.ts b/sdk/src/server/__tests__/token-service-onchain.test.ts
deleted file mode 100644
index 994773d4..00000000
--- a/sdk/src/server/__tests__/token-service-onchain.test.ts
+++ /dev/null
@@ -1,219 +0,0 @@
-/**
- * Tests for TokenService on-chain query methods.
- *
- * ethers.Contract is replaced via jest.mock so we avoid real RPC calls.
- * The mock instance is exposed via ethers.__mockContract for per-test configuration.
- */
-
-// jest.mock is hoisted to the top — factory runs before imports.
-// We use class fields to share jest.fn() references across instances.
-jest.mock("ethers", () => {
- const actual = jest.requireActual("ethers") as any;
-
- // Singleton fn references — all MockContract instances share these.
- const _name = jest.fn().mockResolvedValue("USD Coin");
- const _symbol = jest.fn().mockResolvedValue("USDC");
- const _decimals = jest.fn().mockResolvedValue(6n);
- const _balanceOf = jest.fn().mockResolvedValue(5_000_000n);
-
- class MockContract {
- interface: any;
- name = _name;
- symbol = _symbol;
- decimals = _decimals;
- balanceOf = _balanceOf;
-
- constructor(_addr: string, abi: any) {
- this.interface = new actual.Interface(abi);
- }
- }
-
- // token-service.ts accesses `ethers.Contract` (the `ethers` namespace property),
- // so we must replace Contract inside the `ethers` object as well.
- const result = {
- ...actual,
- Contract: MockContract,
- ethers: { ...actual.ethers, Contract: MockContract },
- };
- // Expose fn references so tests can configure return values
- (result as any).__mockContract = {
- name: _name,
- symbol: _symbol,
- decimals: _decimals,
- balanceOf: _balanceOf,
- };
- return result;
-});
-
-import * as ethersModule from "ethers";
-import { ethers } from "ethers";
-import { TokenService } from "../services/token-service";
-
-const TOKEN_ADDRESS = "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48";
-const WALLET_ADDRESS = "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266";
-
-// __mockContract is on the module root (factory return value), not on the `ethers` named export.
-// Use the module namespace to access it.
-const mockFns: {
- name: jest.Mock;
- symbol: jest.Mock;
- decimals: jest.Mock;
- balanceOf: jest.Mock;
-} = (ethersModule as any).__mockContract;
-
-function makeEthereumStub() {
- return { getProvider: jest.fn().mockReturnValue({}) };
-}
-
-describe("TokenService — on-chain queries", () => {
- let service: TokenService;
-
- beforeEach(() => {
- // Reset all mocks to default return values
- mockFns.name.mockReset().mockResolvedValue("USD Coin");
- mockFns.symbol.mockReset().mockResolvedValue("USDC");
- mockFns.decimals.mockReset().mockResolvedValue(6n);
- mockFns.balanceOf.mockReset().mockResolvedValue(5_000_000n);
-
- service = new TokenService(makeEthereumStub() as any);
- });
-
- // ── getTokenInfo ────────────────────────────────────────────────
-
- describe("getTokenInfo", () => {
- it("returns name, symbol, decimals and lowercased address", async () => {
- const info = await service.getTokenInfo(TOKEN_ADDRESS);
- expect(info.name).toBe("USD Coin");
- expect(info.symbol).toBe("USDC");
- expect(info.decimals).toBe(6);
- expect(info.address).toBe(TOKEN_ADDRESS.toLowerCase());
- });
-
- it("lowercases mixed-case token address", async () => {
- const mixed = "0xA0B86991C6218B36C1D19D4A2E9EB0CE3606EB48";
- const info = await service.getTokenInfo(mixed);
- expect(info.address).toBe(mixed.toLowerCase());
- });
-
- it("calls name(), symbol(), decimals() on the contract", async () => {
- await service.getTokenInfo(TOKEN_ADDRESS);
- expect(mockFns.name).toHaveBeenCalled();
- expect(mockFns.symbol).toHaveBeenCalled();
- expect(mockFns.decimals).toHaveBeenCalled();
- });
-
- it("converts bigint decimals to number", async () => {
- mockFns.decimals.mockResolvedValue(18n);
- const info = await service.getTokenInfo(TOKEN_ADDRESS);
- expect(info.decimals).toBe(18);
- expect(typeof info.decimals).toBe("number");
- });
- });
-
- // ── getTokenBalance ─────────────────────────────────────────────
-
- describe("getTokenBalance", () => {
- it("returns raw balance as string", async () => {
- const balance = await service.getTokenBalance(TOKEN_ADDRESS, WALLET_ADDRESS);
- expect(balance).toBe("5000000");
- });
-
- it('returns "0" when balanceOf throws', async () => {
- mockFns.balanceOf.mockRejectedValueOnce(new Error("call revert"));
- expect(await service.getTokenBalance(TOKEN_ADDRESS, WALLET_ADDRESS)).toBe("0");
- });
-
- it("handles zero balance", async () => {
- mockFns.balanceOf.mockResolvedValueOnce(0n);
- expect(await service.getTokenBalance(TOKEN_ADDRESS, WALLET_ADDRESS)).toBe("0");
- });
-
- it("handles large balances", async () => {
- const large = BigInt("1000000000000000000000");
- mockFns.balanceOf.mockResolvedValueOnce(large);
- expect(await service.getTokenBalance(TOKEN_ADDRESS, WALLET_ADDRESS)).toBe(large.toString());
- });
- });
-
- // ── getFormattedTokenBalance ────────────────────────────────────
-
- describe("getFormattedTokenBalance", () => {
- it("returns token info, raw balance, and human-readable formatted balance", async () => {
- const result = await service.getFormattedTokenBalance(TOKEN_ADDRESS, WALLET_ADDRESS);
- expect(result.token.symbol).toBe("USDC");
- expect(result.token.decimals).toBe(6);
- expect(result.balance).toBe("5000000");
- expect(result.formattedBalance).toBe("5.0");
- });
-
- it("formats 18-decimal token balance correctly", async () => {
- mockFns.decimals.mockResolvedValue(18n);
- mockFns.balanceOf.mockResolvedValue(ethers.parseEther("1.5"));
- const result = await service.getFormattedTokenBalance(TOKEN_ADDRESS, WALLET_ADDRESS);
- expect(result.formattedBalance).toBe("1.5");
- });
-
- it("shows zero balance when balanceOf fails", async () => {
- mockFns.balanceOf.mockRejectedValueOnce(new Error("revert"));
- const result = await service.getFormattedTokenBalance(TOKEN_ADDRESS, WALLET_ADDRESS);
- expect(result.balance).toBe("0");
- });
- });
-
- // ── validateToken ───────────────────────────────────────────────
-
- describe("validateToken", () => {
- it("returns isValid: true with token info for a valid ERC20", async () => {
- const result = await service.validateToken(TOKEN_ADDRESS);
- expect(result.isValid).toBe(true);
- expect(result.token?.symbol).toBe("USDC");
- expect(result.token?.name).toBe("USD Coin");
- expect(result.error).toBeUndefined();
- });
-
- it("returns isValid: false with error message when contract call fails", async () => {
- mockFns.name.mockRejectedValueOnce(new Error("Not a token contract"));
- const result = await service.validateToken("0xNotAToken");
- expect(result.isValid).toBe(false);
- expect(result.error).toBe("Not a token contract");
- expect(result.token).toBeUndefined();
- });
-
- it("returns isValid: false with fallback message for non-Error throws", async () => {
- mockFns.name.mockRejectedValueOnce("some string error");
- const result = await service.validateToken("0xBad");
- expect(result.isValid).toBe(false);
- expect(result.error).toBe("Invalid ERC20 token");
- });
-
- it("lowercases address in returned token info", async () => {
- const mixed = "0xA0B86991C6218B36C1D19D4A2E9EB0CE3606EB48";
- const result = await service.validateToken(mixed);
- expect(result.token?.address).toBe(mixed.toLowerCase());
- });
- });
-
- // ── generateTransferCalldata (edge cases) ───────────────────────
-
- describe("generateTransferCalldata — edge cases", () => {
- it("encodes a fractional amount for 6-decimal tokens", () => {
- // Uses the real ethers.Interface from the mock Contract constructor
- const calldata = service.generateTransferCalldata(WALLET_ADDRESS, "1.5", 6);
- expect(calldata).toMatch(/^0x/);
- // 1.5 USDC = 1_500_000 raw; verify it appears in calldata
- expect(calldata).toContain(1_500_000n.toString(16).padStart(64, "0"));
- });
-
- it("encodes zero amount without throwing", () => {
- const calldata = service.generateTransferCalldata(WALLET_ADDRESS, "0", 18);
- expect(calldata).toMatch(/^0x/);
- });
-
- it("produces a different calldata for different recipients", () => {
- const RECIPIENT2 = "0x70997970C51812dc3A010C7d01b50e0d17dc79C8";
- const c1 = service.generateTransferCalldata(WALLET_ADDRESS, "1.0", 18);
- const c2 = service.generateTransferCalldata(RECIPIENT2, "1.0", 18);
- expect(c1).not.toBe(c2);
- });
- });
-});
diff --git a/sdk/src/server/__tests__/token-service.test.ts b/sdk/src/server/__tests__/token-service.test.ts
deleted file mode 100644
index 7fade9c8..00000000
--- a/sdk/src/server/__tests__/token-service.test.ts
+++ /dev/null
@@ -1,51 +0,0 @@
-import { ethers } from "ethers";
-import { TokenService } from "../services/token-service";
-import { EthereumProvider } from "../providers/ethereum-provider";
-
-describe("TokenService", () => {
- describe("generateTransferCalldata", () => {
- let tokenService: TokenService;
-
- beforeEach(() => {
- // We only need a minimal EthereumProvider for generateTransferCalldata (no RPC calls)
- const mockProvider = {
- getProvider: () => new ethers.JsonRpcProvider("http://localhost:8545"),
- } as unknown as EthereumProvider;
- tokenService = new TokenService(mockProvider);
- });
-
- it("should generate valid ERC20 transfer calldata", () => {
- const to = "0xDeaDbeefdEAdbeefdEadbEEFdeadbeEFdEaDbeeF";
- const calldata = tokenService.generateTransferCalldata(to, "100", 18);
-
- // Should start with the transfer function selector: 0xa9059cbb
- expect(calldata.startsWith("0xa9059cbb")).toBe(true);
- // Should be 4 bytes selector + 32 bytes address + 32 bytes amount = 68 bytes = 136 hex chars + 0x prefix
- expect(calldata.length).toBe(2 + 8 + 64 + 64); // 138
- });
-
- it("should encode the correct amount for 6 decimal tokens", () => {
- const to = "0x1234567890123456789012345678901234567890";
- const calldata = tokenService.generateTransferCalldata(to, "1.5", 6);
-
- // 1.5 USDC = 1_500_000 (6 decimals) = 0x16e360
- const iface = new ethers.Interface([
- "function transfer(address to, uint256 amount) returns (bool)",
- ]);
- const decoded = iface.decodeFunctionData("transfer", calldata);
- expect(decoded[0].toLowerCase()).toBe(to.toLowerCase());
- expect(decoded[1]).toBe(ethers.parseUnits("1.5", 6));
- });
-
- it("should encode whole amounts correctly", () => {
- const to = "0x1234567890123456789012345678901234567890";
- const calldata = tokenService.generateTransferCalldata(to, "1000", 18);
-
- const iface = new ethers.Interface([
- "function transfer(address to, uint256 amount) returns (bool)",
- ]);
- const decoded = iface.decodeFunctionData("transfer", calldata);
- expect(decoded[1]).toBe(ethers.parseUnits("1000", 18));
- });
- });
-});
diff --git a/sdk/src/server/__tests__/transfer-manager.test.ts b/sdk/src/server/__tests__/transfer-manager.test.ts
deleted file mode 100644
index c1f87b9e..00000000
--- a/sdk/src/server/__tests__/transfer-manager.test.ts
+++ /dev/null
@@ -1,229 +0,0 @@
-import { MemoryStorage } from "../adapters/memory-storage";
-import { TransferRecord } from "../interfaces/storage-adapter";
-import { TransferManager } from "../services/transfer-manager";
-import { SilentLogger } from "../interfaces/logger";
-
-/**
- * TransferManager tests — focused on the pure-logic methods
- * (getTransferStatus, getTransferHistory) that don't need RPC.
- * The full executeTransfer flow requires real chain interaction
- * and is better tested as an integration test.
- */
-describe("TransferManager", () => {
- let storage: MemoryStorage;
-
- // We create a minimal TransferManager by only testing methods
- // that rely on storage, not the full dependency chain.
- // For getTransferStatus / getTransferHistory we only need storage access.
-
- beforeEach(() => {
- storage = new MemoryStorage();
- });
-
- // Helper to create a TransferManager with all mock deps
- function makeManager(): TransferManager {
- return new TransferManager(
- {} as any, // ethereum
- {} as any, // accountManager
- {} as any, // blsService
- {} as any, // paymasterManager
- {} as any, // tokenService
- storage,
- {} as any, // signer
- new SilentLogger()
- );
- }
-
- describe("getTransferStatus", () => {
- it("should return transfer status with description", async () => {
- const transfer: TransferRecord = {
- id: "tx-1",
- userId: "user-1",
- from: "0xaaaa",
- to: "0xbbbb",
- amount: "0.01",
- userOpHash: "0xhash",
- status: "completed",
- nodeIndices: [],
- createdAt: new Date().toISOString(),
- transactionHash: "0xtxhash123",
- };
- await storage.saveTransfer(transfer);
-
- const manager = makeManager();
- const result = await manager.getTransferStatus("user-1", "tx-1");
-
- expect(result.status).toBe("completed");
- expect(result.statusDescription).toBe("Transaction confirmed on chain");
- expect(result.explorerUrl).toContain("0xtxhash123");
- });
-
- it("should include elapsed time for pending transfers", async () => {
- const createdAt = new Date(Date.now() - 10000).toISOString(); // 10s ago
- await storage.saveTransfer({
- id: "tx-2",
- userId: "user-1",
- from: "0xaaaa",
- to: "0xbbbb",
- amount: "0.01",
- userOpHash: "0xhash2",
- status: "pending",
- nodeIndices: [],
- createdAt,
- });
-
- const manager = makeManager();
- const result = await manager.getTransferStatus("user-1", "tx-2");
-
- expect(result.elapsedSeconds).toBeGreaterThanOrEqual(9);
- expect(result.statusDescription).toBe("Preparing transaction and generating signatures");
- });
-
- it("should throw for non-existent transfer", async () => {
- const manager = makeManager();
- await expect(manager.getTransferStatus("user-1", "non-existent")).rejects.toThrow(
- "Transfer not found"
- );
- });
-
- it("should throw when userId does not match", async () => {
- await storage.saveTransfer({
- id: "tx-3",
- userId: "user-1",
- from: "0xaaaa",
- to: "0xbbbb",
- amount: "0.01",
- userOpHash: "0xhash",
- status: "pending",
- nodeIndices: [],
- createdAt: new Date().toISOString(),
- });
-
- const manager = makeManager();
- await expect(
- manager.getTransferStatus("user-2", "tx-3") // wrong user
- ).rejects.toThrow("Transfer not found");
- });
-
- it("should show failed status description", async () => {
- await storage.saveTransfer({
- id: "tx-4",
- userId: "user-1",
- from: "0xaaaa",
- to: "0xbbbb",
- amount: "0.01",
- userOpHash: "0xhash",
- status: "failed",
- error: "something went wrong",
- nodeIndices: [],
- createdAt: new Date().toISOString(),
- });
-
- const manager = makeManager();
- const result = await manager.getTransferStatus("user-1", "tx-4");
- expect(result.statusDescription).toBe("Transaction failed");
- });
- });
-
- describe("getTransferHistory", () => {
- it("should return empty result for user with no transfers", async () => {
- const manager = makeManager();
- const result = await manager.getTransferHistory("user-1");
-
- expect(result.transfers).toEqual([]);
- expect(result.total).toBe(0);
- expect(result.totalPages).toBe(0);
- });
-
- it("should return transfers sorted by date descending", async () => {
- await storage.saveTransfer({
- id: "tx-old",
- userId: "user-1",
- from: "0xa",
- to: "0xb",
- amount: "0.01",
- userOpHash: "0x1",
- status: "completed",
- nodeIndices: [],
- createdAt: "2024-01-01T00:00:00Z",
- });
- await storage.saveTransfer({
- id: "tx-new",
- userId: "user-1",
- from: "0xa",
- to: "0xb",
- amount: "0.02",
- userOpHash: "0x2",
- status: "completed",
- nodeIndices: [],
- createdAt: "2024-06-01T00:00:00Z",
- });
-
- const manager = makeManager();
- const result = await manager.getTransferHistory("user-1");
-
- expect(result.transfers).toHaveLength(2);
- expect(result.transfers[0].id).toBe("tx-new");
- expect(result.transfers[1].id).toBe("tx-old");
- });
-
- it("should paginate results", async () => {
- for (let i = 0; i < 5; i++) {
- await storage.saveTransfer({
- id: `tx-${i}`,
- userId: "user-1",
- from: "0xa",
- to: "0xb",
- amount: "0.01",
- userOpHash: `0x${i}`,
- status: "completed",
- nodeIndices: [],
- createdAt: new Date(2024, i, 1).toISOString(),
- });
- }
-
- const manager = makeManager();
- const page1 = await manager.getTransferHistory("user-1", 1, 2);
- expect(page1.transfers).toHaveLength(2);
- expect(page1.total).toBe(5);
- expect(page1.totalPages).toBe(3);
- expect(page1.page).toBe(1);
-
- const page2 = await manager.getTransferHistory("user-1", 2, 2);
- expect(page2.transfers).toHaveLength(2);
-
- const page3 = await manager.getTransferHistory("user-1", 3, 2);
- expect(page3.transfers).toHaveLength(1);
- });
-
- it("should not include transfers from other users", async () => {
- await storage.saveTransfer({
- id: "tx-user1",
- userId: "user-1",
- from: "0xa",
- to: "0xb",
- amount: "0.01",
- userOpHash: "0x1",
- status: "completed",
- nodeIndices: [],
- createdAt: new Date().toISOString(),
- });
- await storage.saveTransfer({
- id: "tx-user2",
- userId: "user-2",
- from: "0xc",
- to: "0xd",
- amount: "0.02",
- userOpHash: "0x2",
- status: "completed",
- nodeIndices: [],
- createdAt: new Date().toISOString(),
- });
-
- const manager = makeManager();
- const result = await manager.getTransferHistory("user-1");
- expect(result.transfers).toHaveLength(1);
- expect(result.transfers[0].id).toBe("tx-user1");
- });
- });
-});
diff --git a/sdk/src/server/adapters/local-wallet-signer.ts b/sdk/src/server/adapters/local-wallet-signer.ts
deleted file mode 100644
index eb250c68..00000000
--- a/sdk/src/server/adapters/local-wallet-signer.ts
+++ /dev/null
@@ -1,29 +0,0 @@
-import { ethers } from "ethers";
-import { ISignerAdapter, PasskeyAssertionContext } from "../interfaces/signer-adapter";
-
-/**
- * Local wallet signer — backs all users with a single private key.
- * Suitable for testing, demos, and single-tenant server setups.
- *
- * For multi-tenant production use, implement ISignerAdapter with
- * per-user key management (e.g., KMS, HSM, or encrypted database).
- */
-export class LocalWalletSigner implements ISignerAdapter {
- private readonly wallet: ethers.Wallet;
-
- constructor(privateKey: string, provider?: ethers.Provider) {
- this.wallet = new ethers.Wallet(privateKey, provider);
- }
-
- async getAddress(_userId: string): Promise {
- return this.wallet.address;
- }
-
- async getSigner(_userId: string, _ctx?: PasskeyAssertionContext): Promise {
- return this.wallet;
- }
-
- async ensureSigner(_userId: string): Promise<{ signer: ethers.Signer; address: string }> {
- return { signer: this.wallet, address: this.wallet.address };
- }
-}
diff --git a/sdk/src/server/adapters/memory-storage.ts b/sdk/src/server/adapters/memory-storage.ts
deleted file mode 100644
index 6604c8aa..00000000
--- a/sdk/src/server/adapters/memory-storage.ts
+++ /dev/null
@@ -1,102 +0,0 @@
-import {
- IStorageAdapter,
- AccountRecord,
- TransferRecord,
- PaymasterRecord,
- BlsConfigRecord,
-} from "../interfaces/storage-adapter";
-
-/**
- * In-memory storage adapter — useful for testing and demos.
- * All data is lost when the process exits.
- */
-export class MemoryStorage implements IStorageAdapter {
- private accounts: AccountRecord[] = [];
- private transfers: TransferRecord[] = [];
- private paymasters: Map = new Map();
- private blsConfig: BlsConfigRecord | null = null;
-
- // ── Accounts ─────────────────────────────────────────────────
-
- async getAccounts(): Promise {
- return [...this.accounts];
- }
-
- async saveAccount(account: AccountRecord): Promise {
- this.accounts.push({ ...account });
- }
-
- async findAccountByUserId(userId: string): Promise {
- return this.accounts.find(a => a.userId === userId) ?? null;
- }
-
- async updateAccount(userId: string, updates: Partial): Promise {
- const index = this.accounts.findIndex(a => a.userId === userId);
- if (index >= 0) {
- this.accounts[index] = { ...this.accounts[index], ...updates };
- }
- }
-
- // ── Transfers ────────────────────────────────────────────────
-
- async saveTransfer(transfer: TransferRecord): Promise {
- this.transfers.push({ ...transfer });
- }
-
- async findTransfersByUserId(userId: string): Promise {
- return this.transfers.filter(t => t.userId === userId);
- }
-
- async findTransferById(id: string): Promise {
- return this.transfers.find(t => t.id === id) ?? null;
- }
-
- async updateTransfer(id: string, updates: Partial): Promise {
- const index = this.transfers.findIndex(t => t.id === id);
- if (index >= 0) {
- this.transfers[index] = { ...this.transfers[index], ...updates };
- }
- }
-
- // ── Paymasters ───────────────────────────────────────────────
-
- async getPaymasters(userId: string): Promise {
- return this.paymasters.get(userId) ?? [];
- }
-
- async savePaymaster(userId: string, paymaster: PaymasterRecord): Promise {
- const list = this.paymasters.get(userId) ?? [];
- const existingIndex = list.findIndex(p => p.name === paymaster.name);
- if (existingIndex >= 0) {
- list[existingIndex] = { ...paymaster };
- } else {
- list.push({ ...paymaster });
- }
- this.paymasters.set(userId, list);
- }
-
- async removePaymaster(userId: string, name: string): Promise {
- const list = this.paymasters.get(userId) ?? [];
- const filtered = list.filter(p => p.name !== name);
- if (filtered.length < list.length) {
- this.paymasters.set(userId, filtered);
- return true;
- }
- return false;
- }
-
- // ── BLS Config ───────────────────────────────────────────────
-
- async getBlsConfig(): Promise {
- return this.blsConfig;
- }
-
- async updateSignerNodesCache(nodes: unknown[]): Promise {
- this.blsConfig = {
- ...this.blsConfig,
- signerNodes: {
- nodes: nodes as BlsConfigRecord["signerNodes"] extends { nodes: infer N } ? N : never,
- },
- } as BlsConfigRecord;
- }
-}
diff --git a/sdk/src/server/config.ts b/sdk/src/server/config.ts
deleted file mode 100644
index 60316b26..00000000
--- a/sdk/src/server/config.ts
+++ /dev/null
@@ -1,94 +0,0 @@
-import { IStorageAdapter } from "./interfaces/storage-adapter";
-import { ISignerAdapter } from "./interfaces/signer-adapter";
-import { ILogger } from "./interfaces/logger";
-
-/**
- * Per-version EntryPoint configuration.
- */
-export interface EntryPointVersionConfig {
- entryPointAddress: string;
- factoryAddress: string;
- validatorAddress: string;
-}
-
-/**
- * Server SDK configuration — replaces NestJS ConfigService.
- */
-export interface ServerConfig {
- /** Main network RPC URL. */
- rpcUrl: string;
- /** Bundler RPC URL (e.g. Pimlico, StackUp). */
- bundlerRpcUrl: string;
- /** Chain ID of the target network. */
- chainId: number;
-
- /** EntryPoint configurations — at least one version must be provided. */
- entryPoints: {
- v06?: EntryPointVersionConfig;
- v07?: EntryPointVersionConfig;
- v08?: EntryPointVersionConfig;
- };
-
- /** Default EntryPoint version to use when not specified. */
- defaultVersion?: "0.6" | "0.7" | "0.8";
-
- /** BLS signer seed nodes for gossip discovery. */
- blsSeedNodes?: string[];
- /** Timeout for BLS node discovery in ms. */
- blsDiscoveryTimeout?: number;
-
- /** KMS endpoint URL (optional, for KMS-based signing). */
- kmsEndpoint?: string;
- /** Whether KMS signing is enabled. */
- kmsEnabled?: boolean;
- /** KMS API key for authenticated requests. */
- kmsApiKey?: string;
-
- /** Storage adapter (required). */
- storage: IStorageAdapter;
- /** Signer adapter (required). */
- signer: ISignerAdapter;
- /** Logger (optional, defaults to ConsoleLogger). */
- logger?: ILogger;
-}
-
-/**
- * Validate a ServerConfig and throw descriptive errors for missing fields.
- */
-export function validateConfig(config: ServerConfig): void {
- if (!config.rpcUrl) {
- throw new Error("ServerConfig: rpcUrl is required");
- }
- if (!config.bundlerRpcUrl) {
- throw new Error("ServerConfig: bundlerRpcUrl is required");
- }
- if (!config.chainId) {
- throw new Error("ServerConfig: chainId is required");
- }
-
- const { entryPoints } = config;
- if (!entryPoints || (!entryPoints.v06 && !entryPoints.v07 && !entryPoints.v08)) {
- throw new Error("ServerConfig: at least one entryPoint version must be configured");
- }
-
- for (const [key, ep] of Object.entries(entryPoints)) {
- if (ep) {
- if (!ep.entryPointAddress) {
- throw new Error(`ServerConfig: entryPoints.${key}.entryPointAddress is required`);
- }
- if (!ep.factoryAddress) {
- throw new Error(`ServerConfig: entryPoints.${key}.factoryAddress is required`);
- }
- if (!ep.validatorAddress) {
- throw new Error(`ServerConfig: entryPoints.${key}.validatorAddress is required`);
- }
- }
- }
-
- if (!config.storage) {
- throw new Error("ServerConfig: storage adapter is required");
- }
- if (!config.signer) {
- throw new Error("ServerConfig: signer adapter is required");
- }
-}
diff --git a/sdk/src/server/constants/entrypoint.ts b/sdk/src/server/constants/entrypoint.ts
deleted file mode 100644
index 16def28b..00000000
--- a/sdk/src/server/constants/entrypoint.ts
+++ /dev/null
@@ -1,117 +0,0 @@
-export enum EntryPointVersion {
- V0_6 = "0.6",
- V0_7 = "0.7",
- V0_8 = "0.8",
-}
-
-export interface EntryPointConfig {
- version: EntryPointVersion;
- address: string;
- factoryAddress: string;
- validatorAddress: string;
-}
-
-/** Default EntryPoint addresses (same on Sepolia, Mainnet, and OP Mainnet). */
-export const ENTRYPOINT_ADDRESSES = {
- [EntryPointVersion.V0_6]: {
- sepolia: "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789",
- mainnet: "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789",
- optimism: "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789",
- },
- [EntryPointVersion.V0_7]: {
- sepolia: "0x0000000071727De22E5E9d8BAf0edAc6f37da032",
- mainnet: "0x0000000071727De22E5E9d8BAf0edAc6f37da032",
- optimism: "0x0000000071727De22E5E9d8BAf0edAc6f37da032",
- },
- [EntryPointVersion.V0_8]: {
- sepolia: "0x0576a174D229E3cFA37253523E645A78A0C91B57",
- mainnet: "0x0576a174D229E3cFA37253523E645A78A0C91B57",
- optimism: "0x0576a174D229E3cFA37253523E645A78A0C91B57",
- },
-};
-
-export const ENTRYPOINT_ABI_V6 = [
- "function simulateValidation((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes) userOp) external",
- "function getNonce(address sender, uint192 key) external view returns (uint256 nonce)",
- "function getUserOpHash((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes) userOp) external view returns (bytes32)",
- "function handleOps((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[] ops, address payable beneficiary) external",
-];
-
-export const ENTRYPOINT_ABI_V7_V8 = [
- "function simulateValidation((address,uint256,bytes,bytes,bytes32,uint256,bytes32,bytes,bytes) packedUserOp) external",
- "function getNonce(address sender, uint192 key) external view returns (uint256 nonce)",
- "function getUserOpHash((address,uint256,bytes,bytes,bytes32,uint256,bytes32,bytes,bytes) packedUserOp) external view returns (bytes32)",
- "function handleOps((address,uint256,bytes,bytes,bytes32,uint256,bytes32,bytes,bytes)[] ops, address payable beneficiary) external",
-];
-
-export const FACTORY_ABI_V6 = [
- "function getAddress(address creator, address signer, address validator, bool useAAStarValidator, uint256 salt) view returns (address)",
- "function createAccountWithAAStarValidator(address creator, address signer, address aaStarValidator, bool useAAStarValidator, uint256 salt) returns (address)",
-];
-
-export const FACTORY_ABI_V7_V8 = [
- "function getAddress(address creator, address signer, address validator, bool useAAStarValidator, uint256 salt) view returns (address)",
- "function createAccount(address creator, address signer, address aaStarValidator, bool useAAStarValidator, uint256 salt) returns (address)",
-];
-
-export const ACCOUNT_ABI = [
- "function execute(address dest, uint256 value, bytes calldata func) external",
-];
-
-export const VALIDATOR_ABI = [
- "function getGasEstimate(uint256 nodeCount) external pure returns (uint256 gasEstimate)",
-];
-
-// ── AirAccount M4 Contract Addresses (Sepolia) ──────────────────
-
-export const AIRACCOUNT_ADDRESSES = {
- sepolia: {
- factory: "0x914db0a849f55e68a726c72fd02b7114b1176d88",
- validatorRouter: "0x730a162Ce3202b94cC5B74181B75b11eBB3045B1",
- blsAlgorithm: "0xc2096E8D04beb3C337bb388F5352710d62De0287",
- superPaymaster: "0x16cE0c7d846f9446bbBeb9C5a84A4D140fAeD94A",
- },
-};
-
-// ── AirAccount ABIs ──────────────────────────────────────────────
-
-export const AIRACCOUNT_ABI = [
- "function execute(address dest, uint256 value, bytes calldata func) external",
- "function executeBatch(address[] calldata dest, uint256[] calldata value, bytes[] calldata func) external",
- "function owner() external view returns (address)",
- "function validator() external view returns (address)",
- "function setValidator(address _validator) external",
- "function setP256Key(bytes32 _x, bytes32 _y) external",
- "function setTierLimits(uint256 _tier1, uint256 _tier2) external",
- "function tier1Limit() external view returns (uint256)",
- "function tier2Limit() external view returns (uint256)",
- "function p256KeyX() external view returns (bytes32)",
- "function p256KeyY() external view returns (bytes32)",
- "function guardianCount() external view returns (uint8)",
- "function getConfigDescription() external view returns (tuple(address accountOwner, address guardAddress, uint256 dailyLimit, uint256 dailyRemaining, uint256 tier1Limit, uint256 tier2Limit, address[3] guardianAddresses, uint8 guardianCount, bool hasP256Key, bool hasValidator))",
-];
-
-export const AIRACCOUNT_FACTORY_ABI = [
- "function createAccount(address owner, uint256 salt, tuple(address[3] guardians, uint256 dailyLimit, uint8[] approvedAlgIds) config) external returns (address)",
- "function getAddress(address owner, uint256 salt, tuple(address[3] guardians, uint256 dailyLimit, uint8[] approvedAlgIds) config) external view returns (address)",
- "function createAccountWithDefaults(address owner, uint256 salt, address guardian1, address guardian2, uint256 dailyLimit) external returns (address)",
- "function getAddressWithDefaults(address owner, uint256 salt, address guardian1, address guardian2, uint256 dailyLimit) external view returns (address)",
-];
-
-export const GLOBAL_GUARD_ABI = [
- "function remainingDailyAllowance() external view returns (uint256)",
- "function dailyLimit() external view returns (uint256)",
- "function approvedAlgorithms(uint8 algId) external view returns (bool)",
- "function account() external view returns (address)",
-];
-
-export const ERC20_ABI = [
- "function name() view returns (string)",
- "function symbol() view returns (string)",
- "function decimals() view returns (uint8)",
- "function totalSupply() view returns (uint256)",
- "function balanceOf(address owner) view returns (uint256)",
- "function transfer(address to, uint256 amount) returns (bool)",
- "function allowance(address owner, address spender) view returns (uint256)",
- "function approve(address spender, uint256 amount) returns (bool)",
-];
diff --git a/sdk/src/server/index.ts b/sdk/src/server/index.ts
deleted file mode 100644
index aca69540..00000000
--- a/sdk/src/server/index.ts
+++ /dev/null
@@ -1,94 +0,0 @@
-// ── Main facade ───────────────────────────────────────────────────
-export { YAAAServerClient } from "./server-client";
-
-// ── Config ────────────────────────────────────────────────────────
-export { validateConfig } from "./config";
-export type { ServerConfig, EntryPointVersionConfig } from "./config";
-
-// ── Interfaces ────────────────────────────────────────────────────
-export type {
- IStorageAdapter,
- AccountRecord,
- TransferRecord,
- PaymasterRecord,
- BlsConfigRecord,
-} from "./interfaces/storage-adapter";
-export type { ISignerAdapter, PasskeyAssertionContext } from "./interfaces/signer-adapter";
-export type { ILogger } from "./interfaces/logger";
-export { ConsoleLogger, SilentLogger } from "./interfaces/logger";
-
-// ── Providers ─────────────────────────────────────────────────────
-export { EthereumProvider } from "./providers/ethereum-provider";
-
-// ── Services ──────────────────────────────────────────────────────
-export { AccountManager } from "./services/account-manager";
-export { TransferManager } from "./services/transfer-manager";
-export type {
- ExecuteTransferParams,
- EstimateGasParams,
- TransferResult,
-} from "./services/transfer-manager";
-export { BLSSignatureService } from "./services/bls-signature-service";
-export { GuardChecker } from "./services/guard-checker";
-export { PaymasterManager } from "./services/paymaster-manager";
-export { TokenService } from "./services/token-service";
-export type { TokenInfo, TokenBalance } from "./services/token-service";
-export { WalletManager } from "./services/wallet-manager";
-export { KmsManager, KmsSigner } from "./services/kms-signer";
-export type {
- KmsCreateKeyResponse,
- KmsSignHashResponse,
- LegacyPasskeyAssertion,
- KmsBeginRegistrationRequest,
- KmsBeginRegistrationResponse,
- KmsCompleteRegistrationRequest,
- KmsCompleteRegistrationResponse,
- KmsBeginAuthenticationRequest,
- KmsBeginAuthenticationResponse,
- KmsKeyStatusResponse,
- KmsDescribeKeyResponse,
-} from "./services/kms-signer";
-
-// ── Adapters ──────────────────────────────────────────────────────
-export { MemoryStorage } from "./adapters/memory-storage";
-export { LocalWalletSigner } from "./adapters/local-wallet-signer";
-
-// ── Constants ─────────────────────────────────────────────────────
-export {
- EntryPointVersion,
- ENTRYPOINT_ADDRESSES,
- ENTRYPOINT_ABI_V6,
- ENTRYPOINT_ABI_V7_V8,
- FACTORY_ABI_V6,
- FACTORY_ABI_V7_V8,
- ACCOUNT_ABI,
- VALIDATOR_ABI,
- ERC20_ABI,
- AIRACCOUNT_ADDRESSES,
- AIRACCOUNT_ABI,
- AIRACCOUNT_FACTORY_ABI,
- GLOBAL_GUARD_ABI,
-} from "./constants/entrypoint";
-export type { EntryPointConfig } from "./constants/entrypoint";
-
-// ── Re-export shared types from core ──────────────────────────────
-export type { UserOperation, PackedUserOperation, GasEstimate } from "../core/types";
-export type {
- BLSSignatureData,
- BLSNode,
- BLSConfig,
- CumulativeT2SignatureData,
- CumulativeT3SignatureData,
-} from "../core/bls/types";
-
-// ── Tier routing ─────────────────────────────────────────────────
-export {
- ALG_BLS,
- ALG_ECDSA,
- ALG_P256,
- ALG_CUMULATIVE_T2,
- ALG_CUMULATIVE_T3,
- resolveTier,
- algIdForTier,
-} from "../core/tier";
-export type { AlgId, TierLevel, TierConfig, GuardStatus, PreCheckResult } from "../core/tier";
diff --git a/sdk/src/server/interfaces/logger.ts b/sdk/src/server/interfaces/logger.ts
deleted file mode 100644
index 50db967d..00000000
--- a/sdk/src/server/interfaces/logger.ts
+++ /dev/null
@@ -1,43 +0,0 @@
-/**
- * Optional logger interface for server SDK.
- * Implement this to integrate with your application's logging framework.
- */
-export interface ILogger {
- debug(message: string, ...args: unknown[]): void;
- log(message: string, ...args: unknown[]): void;
- warn(message: string, ...args: unknown[]): void;
- error(message: string, ...args: unknown[]): void;
-}
-
-/**
- * Default console logger used when no custom logger is provided.
- */
-export class ConsoleLogger implements ILogger {
- constructor(private readonly prefix: string = "[YAAA]") {}
-
- debug(message: string, ...args: unknown[]): void {
- console.debug(`${this.prefix} ${message}`, ...args);
- }
-
- log(message: string, ...args: unknown[]): void {
- console.log(`${this.prefix} ${message}`, ...args);
- }
-
- warn(message: string, ...args: unknown[]): void {
- console.warn(`${this.prefix} ${message}`, ...args);
- }
-
- error(message: string, ...args: unknown[]): void {
- console.error(`${this.prefix} ${message}`, ...args);
- }
-}
-
-/**
- * Silent logger that suppresses all output.
- */
-export class SilentLogger implements ILogger {
- debug(): void {}
- log(): void {}
- warn(): void {}
- error(): void {}
-}
diff --git a/sdk/src/server/interfaces/signer-adapter.ts b/sdk/src/server/interfaces/signer-adapter.ts
deleted file mode 100644
index 2a5752cf..00000000
--- a/sdk/src/server/interfaces/signer-adapter.ts
+++ /dev/null
@@ -1,28 +0,0 @@
-import { ethers } from "ethers";
-import { LegacyPasskeyAssertion } from "../services/kms-signer";
-
-/**
- * Context for passing Passkey assertion data through the signing chain.
- * Used by KMS-backed signers to authenticate signing operations.
- */
-export interface PasskeyAssertionContext {
- assertion: LegacyPasskeyAssertion;
-}
-
-/**
- * Pluggable signer adapter — replaces NestJS AuthService wallet management.
- * Implement this to provide signing capabilities from your key management system.
- */
-export interface ISignerAdapter {
- /** Get the EOA address for a given user. */
- getAddress(userId: string): Promise;
-
- /** Get an ethers Signer instance for a given user. */
- getSigner(userId: string, ctx?: PasskeyAssertionContext): Promise;
-
- /**
- * Ensure a signer exists for the user (create on demand if needed).
- * Returns the signer and its address.
- */
- ensureSigner(userId: string): Promise<{ signer: ethers.Signer; address: string }>;
-}
diff --git a/sdk/src/server/interfaces/storage-adapter.ts b/sdk/src/server/interfaces/storage-adapter.ts
deleted file mode 100644
index d7f01fee..00000000
--- a/sdk/src/server/interfaces/storage-adapter.ts
+++ /dev/null
@@ -1,99 +0,0 @@
-/**
- * Account record stored by the SDK.
- */
-export interface AccountRecord {
- userId: string;
- address: string;
- signerAddress: string;
- salt: number;
- deployed: boolean;
- deploymentTxHash: string | null;
- validatorAddress: string;
- entryPointVersion: string;
- factoryAddress: string;
- createdAt: string;
-}
-
-/**
- * Transfer record stored by the SDK.
- */
-export interface TransferRecord {
- id: string;
- userId: string;
- from: string;
- to: string;
- amount: string;
- data?: string;
- userOpHash: string;
- bundlerUserOpHash?: string;
- transactionHash?: string;
- status: "pending" | "submitted" | "completed" | "failed";
- error?: string;
- nodeIndices: number[];
- tokenAddress?: string;
- tokenSymbol?: string;
- createdAt: string;
- submittedAt?: string;
- completedAt?: string;
- failedAt?: string;
-}
-
-/**
- * Paymaster configuration record.
- */
-export interface PaymasterRecord {
- id?: string;
- name: string;
- address: string;
- apiKey?: string;
- type: "pimlico" | "stackup" | "alchemy" | "custom";
- endpoint?: string;
- createdAt?: string;
-}
-
-/**
- * BLS configuration record.
- */
-export interface BlsConfigRecord {
- signerNodes?: {
- nodes: Array<{
- nodeId: string;
- nodeName: string;
- apiEndpoint: string;
- status: string;
- lastSeen?: string;
- }>;
- };
- discovery?: {
- seedNodes?: Array<{ endpoint: string }>;
- discoveryTimeout?: number;
- };
-}
-
-/**
- * Pluggable storage adapter — replaces NestJS DatabaseService.
- * SDK only manages accounts, transfers, paymasters, and BLS config.
- * User authentication is NOT handled by the SDK.
- */
-export interface IStorageAdapter {
- // Accounts
- getAccounts(): Promise;
- saveAccount(account: AccountRecord): Promise;
- findAccountByUserId(userId: string): Promise;
- updateAccount(userId: string, updates: Partial): Promise;
-
- // Transfers
- saveTransfer(transfer: TransferRecord): Promise;
- findTransfersByUserId(userId: string): Promise;
- findTransferById(id: string): Promise;
- updateTransfer(id: string, updates: Partial): Promise;
-
- // Paymasters
- getPaymasters(userId: string): Promise;
- savePaymaster(userId: string, paymaster: PaymasterRecord): Promise;
- removePaymaster(userId: string, name: string): Promise;
-
- // BLS config
- getBlsConfig(): Promise;
- updateSignerNodesCache(nodes: unknown[]): Promise;
-}
diff --git a/sdk/src/server/providers/ethereum-provider.ts b/sdk/src/server/providers/ethereum-provider.ts
deleted file mode 100644
index c9892e51..00000000
--- a/sdk/src/server/providers/ethereum-provider.ts
+++ /dev/null
@@ -1,239 +0,0 @@
-import { ethers } from "ethers";
-import { ServerConfig, EntryPointVersionConfig } from "../config";
-import {
- EntryPointVersion,
- ENTRYPOINT_ABI_V6,
- ENTRYPOINT_ABI_V7_V8,
- FACTORY_ABI_V6,
- AIRACCOUNT_FACTORY_ABI,
- ACCOUNT_ABI,
- VALIDATOR_ABI,
-} from "../constants/entrypoint";
-import { ILogger, ConsoleLogger } from "../interfaces/logger";
-import { UserOperation, PackedUserOperation } from "../../core/types";
-
-/**
- * Unified Ethereum provider — replaces NestJS EthereumService.
- * Manages RPC + Bundler providers and contract interactions.
- */
-export class EthereumProvider {
- private readonly provider: ethers.JsonRpcProvider;
- private readonly bundlerProvider: ethers.JsonRpcProvider;
- private readonly config: ServerConfig;
- private readonly logger: ILogger;
-
- constructor(config: ServerConfig) {
- this.config = config;
- this.logger = config.logger ?? new ConsoleLogger("[EthereumProvider]");
- this.provider = new ethers.JsonRpcProvider(config.rpcUrl);
- this.bundlerProvider = new ethers.JsonRpcProvider(config.bundlerRpcUrl);
- }
-
- getProvider(): ethers.JsonRpcProvider {
- return this.provider;
- }
-
- getBundlerProvider(): ethers.JsonRpcProvider {
- return this.bundlerProvider;
- }
-
- // ── Config helpers ──────────────────────────────────────────────
-
- private getVersionConfig(version: EntryPointVersion): EntryPointVersionConfig {
- const map: Record = {
- [EntryPointVersion.V0_6]: this.config.entryPoints.v06,
- [EntryPointVersion.V0_7]: this.config.entryPoints.v07,
- [EntryPointVersion.V0_8]: this.config.entryPoints.v08,
- };
- const versionConfig = map[version];
- if (!versionConfig) {
- throw new Error(`EntryPoint version ${version} is not configured`);
- }
- return versionConfig;
- }
-
- getEntryPointAddress(version: EntryPointVersion): string {
- return this.getVersionConfig(version).entryPointAddress;
- }
-
- getFactoryAddress(version: EntryPointVersion): string {
- return this.getVersionConfig(version).factoryAddress;
- }
-
- getValidatorAddress(version: EntryPointVersion): string {
- return this.getVersionConfig(version).validatorAddress;
- }
-
- getDefaultVersion(): EntryPointVersion {
- const v = this.config.defaultVersion;
- if (v === "0.7") return EntryPointVersion.V0_7;
- if (v === "0.8") return EntryPointVersion.V0_8;
- return EntryPointVersion.V0_6;
- }
-
- // ── Contract factories ──────────────────────────────────────────
-
- getFactoryContract(version: EntryPointVersion = EntryPointVersion.V0_6): ethers.Contract {
- const address = this.getFactoryAddress(version);
- const abi = version === EntryPointVersion.V0_6 ? FACTORY_ABI_V6 : AIRACCOUNT_FACTORY_ABI;
- return new ethers.Contract(address, abi, this.provider);
- }
-
- getEntryPointContract(version: EntryPointVersion = EntryPointVersion.V0_6): ethers.Contract {
- const address = this.getEntryPointAddress(version);
- const abi = version === EntryPointVersion.V0_6 ? ENTRYPOINT_ABI_V6 : ENTRYPOINT_ABI_V7_V8;
- return new ethers.Contract(address, abi, this.provider);
- }
-
- getValidatorContract(version: EntryPointVersion = EntryPointVersion.V0_6): ethers.Contract {
- const address = this.getValidatorAddress(version);
- return new ethers.Contract(address, VALIDATOR_ABI, this.provider);
- }
-
- getAccountContract(address: string): ethers.Contract {
- return new ethers.Contract(address, ACCOUNT_ABI, this.provider);
- }
-
- // ── On-chain queries ────────────────────────────────────────────
-
- async getBalance(address: string): Promise {
- const balance = await this.provider.getBalance(address);
- return ethers.formatEther(balance);
- }
-
- async getNonce(
- accountAddress: string,
- key: number = 0,
- version: EntryPointVersion = EntryPointVersion.V0_6
- ): Promise {
- const entryPoint = this.getEntryPointContract(version);
- return await entryPoint.getNonce(accountAddress, key);
- }
-
- async getUserOpHash(
- userOp: UserOperation | PackedUserOperation,
- version: EntryPointVersion = EntryPointVersion.V0_6
- ): Promise {
- const entryPoint = this.getEntryPointContract(version);
-
- if (version === EntryPointVersion.V0_6) {
- const op = userOp as UserOperation;
- const userOpArray = [
- op.sender,
- op.nonce,
- op.initCode || "0x",
- op.callData,
- op.callGasLimit,
- op.verificationGasLimit,
- op.preVerificationGas,
- op.maxFeePerGas,
- op.maxPriorityFeePerGas,
- op.paymasterAndData || "0x",
- "0x", // Always use empty signature for hash calculation
- ];
- return await entryPoint.getUserOpHash(userOpArray);
- } else {
- const packedOp = userOp as PackedUserOperation;
- const packedOpArray = [
- packedOp.sender,
- packedOp.nonce,
- packedOp.initCode || "0x",
- packedOp.callData,
- packedOp.accountGasLimits,
- packedOp.preVerificationGas,
- packedOp.gasFees,
- packedOp.paymasterAndData || "0x",
- "0x",
- ];
- return await entryPoint.getUserOpHash(packedOpArray);
- }
- }
-
- // ── Bundler RPC ─────────────────────────────────────────────────
-
- async estimateUserOperationGas(
- userOp: unknown,
- version: EntryPointVersion = EntryPointVersion.V0_6
- ): Promise<{ callGasLimit: string; verificationGasLimit: string; preVerificationGas: string }> {
- try {
- return await this.bundlerProvider.send("eth_estimateUserOperationGas", [
- userOp,
- this.getEntryPointAddress(version),
- ]);
- } catch {
- return {
- callGasLimit: "0x249f0",
- verificationGasLimit: "0x3d0900", // 4M — enough for M4 factory deployment + BLS verification
- preVerificationGas: "0x11170",
- };
- }
- }
-
- async sendUserOperation(
- userOp: unknown,
- version: EntryPointVersion = EntryPointVersion.V0_6
- ): Promise {
- return await this.bundlerProvider.send("eth_sendUserOperation", [
- userOp,
- this.getEntryPointAddress(version),
- ]);
- }
-
- async getUserOperationReceipt(userOpHash: string): Promise {
- return await this.bundlerProvider.send("eth_getUserOperationReceipt", [userOpHash]);
- }
-
- async waitForUserOp(userOpHash: string, maxAttempts: number = 60): Promise {
- const pollInterval = 2000;
-
- for (let attempt = 0; attempt < maxAttempts; attempt++) {
- try {
- const receipt = (await this.getUserOperationReceipt(userOpHash)) as Record<
- string,
- unknown
- > | null;
- if (receipt) {
- const txHash =
- (receipt.transactionHash as string) ||
- ((receipt.receipt as Record)?.transactionHash as string);
- if (txHash) return txHash;
- }
- } catch {
- // Continue polling
- }
- await new Promise(resolve => setTimeout(resolve, pollInterval));
- }
-
- throw new Error(`UserOp timeout: ${userOpHash}`);
- }
-
- async getUserOperationGasPrice(): Promise<{
- maxFeePerGas: string;
- maxPriorityFeePerGas: string;
- }> {
- try {
- const gasPrice = await this.bundlerProvider.send("pimlico_getUserOperationGasPrice", []);
- return {
- maxFeePerGas: gasPrice.fast.maxFeePerGas,
- maxPriorityFeePerGas: gasPrice.fast.maxPriorityFeePerGas,
- };
- } catch {
- try {
- const feeData = await this.provider.getFeeData();
- const baseFee = feeData.maxFeePerGas || ethers.parseUnits("20", "gwei");
- const priorityFee = feeData.maxPriorityFeePerGas || ethers.parseUnits("2", "gwei");
- const maxFeePerGas = (baseFee * 3n) / 2n;
- const maxPriorityFeePerGas = (priorityFee * 3n) / 2n;
- return {
- maxFeePerGas: "0x" + maxFeePerGas.toString(16),
- maxPriorityFeePerGas: "0x" + maxPriorityFeePerGas.toString(16),
- };
- } catch {
- return {
- maxFeePerGas: "0x" + ethers.parseUnits("3", "gwei").toString(16),
- maxPriorityFeePerGas: "0x" + ethers.parseUnits("1", "gwei").toString(16),
- };
- }
- }
- }
-}
diff --git a/sdk/src/server/server-client.ts b/sdk/src/server/server-client.ts
deleted file mode 100644
index 4c062af7..00000000
--- a/sdk/src/server/server-client.ts
+++ /dev/null
@@ -1,77 +0,0 @@
-import { ServerConfig, validateConfig } from "./config";
-import { ConsoleLogger } from "./interfaces/logger";
-import { EthereumProvider } from "./providers/ethereum-provider";
-import { AccountManager } from "./services/account-manager";
-import { TransferManager } from "./services/transfer-manager";
-import { BLSSignatureService } from "./services/bls-signature-service";
-import { PaymasterManager } from "./services/paymaster-manager";
-import { TokenService } from "./services/token-service";
-import { WalletManager } from "./services/wallet-manager";
-
-/**
- * Main facade for the YAAA Server SDK.
- * Wires all services together from a single config object.
- *
- * @example
- * ```ts
- * import { YAAAServerClient, MemoryStorage, LocalWalletSigner } from '@yaaa/sdk/server';
- *
- * const client = new YAAAServerClient({
- * rpcUrl: 'https://sepolia.infura.io/v3/...',
- * bundlerRpcUrl: 'https://api.pimlico.io/v2/11155111/rpc?apikey=...',
- * chainId: 11155111,
- * entryPoints: {
- * v06: {
- * entryPointAddress: '0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789',
- * factoryAddress: '0x...',
- * validatorAddress: '0x...',
- * },
- * },
- * storage: new MemoryStorage(),
- * signer: new LocalWalletSigner('0xPRIVATE_KEY'),
- * });
- *
- * const account = await client.accounts.createAccount('user-123');
- * ```
- */
-export class YAAAServerClient {
- readonly ethereum: EthereumProvider;
- readonly accounts: AccountManager;
- readonly transfers: TransferManager;
- readonly bls: BLSSignatureService;
- readonly paymaster: PaymasterManager;
- readonly tokens: TokenService;
- readonly wallets: WalletManager;
-
- constructor(config: ServerConfig) {
- validateConfig(config);
-
- const logger = config.logger ?? new ConsoleLogger("[YAAA]");
-
- // Core provider
- this.ethereum = new EthereumProvider(config);
-
- // Service wiring (order matters: dependencies first)
- this.wallets = new WalletManager(config.signer);
- this.tokens = new TokenService(this.ethereum);
- this.paymaster = new PaymasterManager(this.ethereum, config.storage, logger);
- this.accounts = new AccountManager(this.ethereum, config.storage, config.signer, logger);
- this.bls = new BLSSignatureService(
- config,
- this.ethereum,
- config.storage,
- config.signer,
- logger
- );
- this.transfers = new TransferManager(
- this.ethereum,
- this.accounts,
- this.bls,
- this.paymaster,
- this.tokens,
- config.storage,
- config.signer,
- logger
- );
- }
-}
diff --git a/sdk/src/server/services/account-manager.ts b/sdk/src/server/services/account-manager.ts
deleted file mode 100644
index e79569d0..00000000
--- a/sdk/src/server/services/account-manager.ts
+++ /dev/null
@@ -1,135 +0,0 @@
-import { ethers } from "ethers";
-import { EthereumProvider } from "../providers/ethereum-provider";
-import { IStorageAdapter, AccountRecord } from "../interfaces/storage-adapter";
-import { ISignerAdapter } from "../interfaces/signer-adapter";
-import { EntryPointVersion } from "../constants/entrypoint";
-import { ILogger, ConsoleLogger } from "../interfaces/logger";
-
-/**
- * Account manager — extracted from NestJS AccountService.
- * Creates and retrieves smart accounts without framework dependencies.
- */
-export class AccountManager {
- private readonly logger: ILogger;
-
- constructor(
- private readonly ethereum: EthereumProvider,
- private readonly storage: IStorageAdapter,
- private readonly signer: ISignerAdapter,
- logger?: ILogger
- ) {
- this.logger = logger ?? new ConsoleLogger("[AccountManager]");
- }
-
- async createAccount(
- userId: string,
- options?: {
- entryPointVersion?: EntryPointVersion;
- salt?: number;
- }
- ): Promise {
- const version = options?.entryPointVersion ?? this.ethereum.getDefaultVersion();
- const versionStr = version as string;
-
- // Check for existing account with this version
- const existingAccounts = await this.storage.getAccounts();
- const existing = existingAccounts.find(
- a => a.userId === userId && a.entryPointVersion === versionStr
- );
- if (existing) return existing;
-
- const factory = this.ethereum.getFactoryContract(version);
- const validatorAddress =
- ((this.ethereum.getValidatorContract(version) as ethers.BaseContract).target as string) ||
- this.ethereum.getValidatorAddress(version);
-
- // Ensure signer wallet exists
- const { address: signerAddress } = await this.signer.ensureSigner(userId);
- const salt = options?.salt ?? Math.floor(Math.random() * 1000000);
-
- // Predict account address using new M4 factory (createAccountWithDefaults)
- const zeroAddr = ethers.ZeroAddress;
- const defaultDailyLimit = ethers.parseEther("1000"); // 1000 ETH daily limit
- const accountAddress = await factory.getAddressWithDefaults(
- signerAddress,
- salt,
- zeroAddr,
- zeroAddr,
- defaultDailyLimit
- );
-
- // Check deployment status
- let deployed = false;
- try {
- const code = await this.ethereum.getProvider().getCode(accountAddress);
- deployed = code !== "0x";
- } catch {
- // Assume not deployed
- }
-
- const account: AccountRecord = {
- userId,
- address: accountAddress,
- signerAddress,
- salt,
- deployed,
- deploymentTxHash: null,
- validatorAddress,
- entryPointVersion: versionStr,
- factoryAddress: (factory.target as string) || this.ethereum.getFactoryAddress(version),
- createdAt: new Date().toISOString(),
- };
-
- await this.storage.saveAccount(account);
- return account;
- }
-
- async getAccount(
- userId: string
- ): Promise<(AccountRecord & { balance: string; nonce: string }) | null> {
- const account = await this.storage.findAccountByUserId(userId);
- if (!account) return null;
-
- let balance = "0";
- try {
- balance = await this.ethereum.getBalance(account.address);
- } catch {
- // Use default
- }
-
- const version = (account.entryPointVersion || "0.6") as unknown as EntryPointVersion;
- const nonce = await this.ethereum.getNonce(account.address, 0, version);
-
- return { ...account, balance, nonce: nonce.toString() };
- }
-
- async getAccountAddress(userId: string): Promise {
- const account = await this.storage.findAccountByUserId(userId);
- if (!account) throw new Error("Account not found");
- return account.address;
- }
-
- async getAccountBalance(
- userId: string
- ): Promise<{ address: string; balance: string; balanceInWei: string }> {
- const account = await this.storage.findAccountByUserId(userId);
- if (!account) throw new Error("Account not found");
- const balance = await this.ethereum.getBalance(account.address);
- return {
- address: account.address,
- balance,
- balanceInWei: ethers.parseEther(balance).toString(),
- };
- }
-
- async getAccountNonce(userId: string): Promise<{ address: string; nonce: string }> {
- const account = await this.storage.findAccountByUserId(userId);
- if (!account) throw new Error("Account not found");
- const nonce = await this.ethereum.getNonce(account.address);
- return { address: account.address, nonce: nonce.toString() };
- }
-
- async getAccountByUserId(userId: string): Promise {
- return this.storage.findAccountByUserId(userId);
- }
-}
diff --git a/sdk/src/server/services/bls-signature-service.ts b/sdk/src/server/services/bls-signature-service.ts
deleted file mode 100644
index 79024d74..00000000
--- a/sdk/src/server/services/bls-signature-service.ts
+++ /dev/null
@@ -1,235 +0,0 @@
-import { ethers } from "ethers";
-import axios from "axios";
-import {
- BLSManager,
- BLSSignatureData,
- CumulativeT2SignatureData,
- CumulativeT3SignatureData,
-} from "../../core/bls";
-import { TierLevel } from "../../core/tier";
-import { EthereumProvider } from "../providers/ethereum-provider";
-import { IStorageAdapter } from "../interfaces/storage-adapter";
-import { ISignerAdapter, PasskeyAssertionContext } from "../interfaces/signer-adapter";
-import { ILogger, ConsoleLogger } from "../interfaces/logger";
-import { ServerConfig } from "../config";
-
-/**
- * BLS signature service — extracted from NestJS BlsService.
- * Uses lazy initialization instead of onModuleInit.
- */
-export class BLSSignatureService {
- private blsManager: BLSManager | null = null;
- private readonly logger: ILogger;
-
- constructor(
- private readonly config: ServerConfig,
- private readonly ethereum: EthereumProvider,
- private readonly storage: IStorageAdapter,
- private readonly signer: ISignerAdapter,
- logger?: ILogger
- ) {
- this.logger = logger ?? new ConsoleLogger("[BLSSignatureService]");
- }
-
- /** Lazy-initialize BLSManager on first use. */
- private async ensureInitialized(): Promise {
- if (this.blsManager) return this.blsManager;
-
- const blsConfig = await this.storage.getBlsConfig();
- const seedNodes =
- this.config.blsSeedNodes ?? blsConfig?.discovery?.seedNodes?.map(n => n.endpoint) ?? [];
-
- this.blsManager = new BLSManager({
- seedNodes,
- discoveryTimeout: this.config.blsDiscoveryTimeout ?? 10000,
- });
-
- return this.blsManager;
- }
-
- async getActiveSignerNodes(): Promise {
- const manager = await this.ensureInitialized();
- const nodes = await manager.getAvailableNodes();
-
- if (nodes.length > 0) {
- try {
- await this.storage.updateSignerNodesCache(nodes);
- } catch {
- // Non-critical
- }
- }
-
- return nodes;
- }
-
- async generateBLSSignature(
- userId: string,
- userOpHash: string,
- ctx?: PasskeyAssertionContext
- ): Promise {
- const manager = await this.ensureInitialized();
-
- const activeNodes = await this.getActiveSignerNodes();
- if (activeNodes.length < 1) {
- throw new Error("No active BLS signer nodes available");
- }
-
- const selectedNodes = activeNodes.slice(0, Math.min(3, activeNodes.length)) as Array<{
- apiEndpoint: string;
- }>;
-
- const signerNodeSignatures: string[] = [];
- const signerNodeIds: string[] = [];
-
- for (const node of selectedNodes) {
- try {
- const response = await axios.post(`${node.apiEndpoint}/signature/sign`, {
- message: userOpHash,
- });
-
- const signatureForAggregation = response.data.signatureCompact || response.data.signature;
- const formatted = signatureForAggregation.startsWith("0x")
- ? signatureForAggregation
- : `0x${signatureForAggregation}`;
-
- signerNodeSignatures.push(formatted);
- signerNodeIds.push(response.data.nodeId);
- } catch {
- // Continue with other nodes
- }
- }
-
- if (signerNodeSignatures.length === 0) {
- throw new Error("Failed to get signatures from any BLS signer nodes");
- }
-
- let aggregatedSignature: string;
- if (signerNodeSignatures.length > 1) {
- const aggregateResponse = await axios.post(
- `${selectedNodes[0].apiEndpoint}/signature/aggregate`,
- { signatures: signerNodeSignatures }
- );
- aggregatedSignature = aggregateResponse.data.signature.startsWith("0x")
- ? aggregateResponse.data.signature
- : `0x${aggregateResponse.data.signature}`;
- } else {
- // Single signature — re-request in EIP format
- const singleSignResponse = await axios.post(
- `${selectedNodes[0].apiEndpoint}/signature/sign`,
- { message: userOpHash }
- );
- aggregatedSignature = singleSignResponse.data.signature.startsWith("0x")
- ? singleSignResponse.data.signature
- : `0x${singleSignResponse.data.signature}`;
- }
-
- // Generate message point
- const messagePoint = await manager.generateMessagePoint(userOpHash);
-
- // Get user account and wallet for ECDSA signatures
- const account = await this.storage.findAccountByUserId(userId);
- if (!account) {
- throw new Error(`User account not found for userId: ${userId}`);
- }
-
- const wallet = await this.signer.getSigner(userId, ctx);
- const walletAddress = await wallet.getAddress();
-
- if (walletAddress.toLowerCase() !== account.signerAddress.toLowerCase()) {
- throw new Error(
- `Wallet address mismatch! Wallet: ${walletAddress}, Expected: ${account.signerAddress}`
- );
- }
-
- const aaSignature = await wallet.signMessage(ethers.getBytes(userOpHash));
- const messagePointHash = ethers.keccak256(messagePoint);
- const messagePointSignature = await wallet.signMessage(ethers.getBytes(messagePointHash));
-
- return {
- nodeIds: signerNodeIds,
- signature: aggregatedSignature,
- messagePoint,
- aaAddress: account.signerAddress,
- aaSignature,
- messagePointSignature,
- };
- }
-
- async packSignature(blsData: BLSSignatureData): Promise {
- const manager = await this.ensureInitialized();
- return manager.packSignature(blsData);
- }
-
- // ── Tiered Signature Support (M4) ─────────────────────────────
-
- /**
- * Generate a tiered signature based on the required tier level.
- *
- * - Tier 1: raw 65-byte ECDSA (no algId prefix, backwards-compat)
- * - Tier 2: algId 0x04 — P256 + BLS aggregate + messagePoint ECDSA
- * - Tier 3: algId 0x05 — P256 + BLS + messagePoint ECDSA + Guardian ECDSA
- *
- * @param tier - Required tier level (1, 2, or 3)
- * @param userId - User ID for account lookup
- * @param userOpHash - The UserOp hash to sign
- * @param p256Signature - P256 passkey signature (64 bytes, required for tier 2/3)
- * @param guardianSigner - Guardian ethers.Signer (required for tier 3)
- * @param ctx - Optional passkey assertion context for KMS signing
- */
- async generateTieredSignature(params: {
- tier: TierLevel;
- userId: string;
- userOpHash: string;
- p256Signature?: string;
- guardianSigner?: ethers.Signer;
- ctx?: PasskeyAssertionContext;
- }): Promise {
- const { tier, userId, userOpHash, p256Signature, guardianSigner, ctx } = params;
- const manager = await this.ensureInitialized();
-
- if (tier === 1) {
- // Tier 1: raw ECDSA signature (65 bytes, no algId prefix)
- const account = await this.storage.findAccountByUserId(userId);
- if (!account) throw new Error(`User account not found for userId: ${userId}`);
-
- const wallet = await this.signer.getSigner(userId, ctx);
- return wallet.signMessage(ethers.getBytes(userOpHash));
- }
-
- // Tier 2 and 3 both need BLS + P256
- if (!p256Signature) {
- throw new Error(`P256 signature required for Tier ${tier}`);
- }
-
- // Get BLS components (reuse existing generateBLSSignature for node signing + aggregation)
- const blsData = await this.generateBLSSignature(userId, userOpHash, ctx);
-
- if (tier === 2) {
- const t2Data: CumulativeT2SignatureData = {
- p256Signature,
- nodeIds: blsData.nodeIds,
- blsSignature: blsData.signature,
- messagePoint: blsData.messagePoint,
- messagePointSignature: blsData.messagePointSignature,
- };
- return manager.packCumulativeT2Signature(t2Data);
- }
-
- // Tier 3: also needs guardian signature
- if (!guardianSigner) {
- throw new Error("Guardian signer required for Tier 3");
- }
-
- const guardianSignature = await guardianSigner.signMessage(ethers.getBytes(userOpHash));
-
- const t3Data: CumulativeT3SignatureData = {
- p256Signature,
- nodeIds: blsData.nodeIds,
- blsSignature: blsData.signature,
- messagePoint: blsData.messagePoint,
- messagePointSignature: blsData.messagePointSignature,
- guardianSignature,
- };
- return manager.packCumulativeT3Signature(t3Data);
- }
-}
diff --git a/sdk/src/server/services/kms-signer.ts b/sdk/src/server/services/kms-signer.ts
deleted file mode 100644
index 3004d9ad..00000000
--- a/sdk/src/server/services/kms-signer.ts
+++ /dev/null
@@ -1,403 +0,0 @@
-import { ethers } from "ethers";
-import axios, { AxiosInstance } from "axios";
-import { ILogger, ConsoleLogger } from "../interfaces/logger";
-
-// ── Legacy Passkey Assertion (reusable for BLS dual-signing) ─────
-
-export interface LegacyPasskeyAssertion {
- AuthenticatorData: string; // "0x..."
- ClientDataHash: string; // "0x..."
- Signature: string; // "0x..."
-}
-
-// ── CreateKey ────────────────────────────────────────────────────
-
-export interface KmsCreateKeyRequest {
- Description: string;
- KeyUsage?: string;
- KeySpec?: string;
- Origin?: string;
- PasskeyPublicKey: string; // P-256 public key hex (required for new KMS)
-}
-
-export interface KmsCreateKeyResponse {
- KeyMetadata: {
- KeyId: string;
- Arn: string;
- CreationDate: string;
- Enabled: boolean;
- Description: string;
- KeyUsage: string;
- KeySpec: string;
- Origin: string;
- Address?: string;
- };
- Mnemonic: string;
- Address?: string;
- Status?: string; // "deriving" — address is derived asynchronously
-}
-
-// ── SignHash ─────────────────────────────────────────────────────
-
-export interface KmsSignHashResponse {
- Signature: string;
-}
-
-// ── WebAuthn Registration ────────────────────────────────────────
-
-export interface KmsBeginRegistrationRequest {
- Description?: string;
- UserName?: string;
- UserDisplayName?: string;
-}
-
-export interface KmsBeginRegistrationResponse {
- ChallengeId: string;
- Options: PublicKeyCredentialCreationOptions;
-}
-
-export interface KmsCompleteRegistrationRequest {
- ChallengeId: string;
- Credential: unknown; // RegistrationResponseJSON from @simplewebauthn/browser
- Description?: string;
-}
-
-export interface KmsCompleteRegistrationResponse {
- KeyId: string;
- CredentialId: string;
- Status: string;
-}
-
-// ── WebAuthn Authentication ──────────────────────────────────────
-
-export interface KmsBeginAuthenticationRequest {
- Address?: string;
- KeyId?: string;
-}
-
-export interface KmsBeginAuthenticationResponse {
- ChallengeId: string;
- Options: PublicKeyCredentialRequestOptions;
-}
-
-// ── Key Status ───────────────────────────────────────────────────
-
-export interface KmsKeyStatusResponse {
- KeyId: string;
- Status: "creating" | "deriving" | "ready" | "error";
- Address?: string;
- PublicKey?: string;
- DerivationPath?: string;
- Error?: string;
-}
-
-// ── Describe Key ─────────────────────────────────────────────────
-
-export interface KmsDescribeKeyResponse {
- KeyMetadata: {
- KeyId: string;
- Address?: string;
- PublicKey?: string;
- DerivationPath?: string;
- PasskeyPublicKey?: string;
- Arn?: string;
- CreationDate?: string;
- Enabled?: boolean;
- Description?: string;
- KeyUsage?: string;
- KeySpec?: string;
- Origin?: string;
- };
-}
-
-/**
- * KMS service for remote key management with WebAuthn/Passkey integration.
- *
- * The new STM32 KMS (kms1.aastar.io) natively integrates WebAuthn, so
- * registration/authentication ceremonies are handled by the KMS directly.
- * Signing operations require a Passkey assertion (Legacy hex or WebAuthn ceremony).
- */
-export class KmsManager {
- private readonly kmsEndpoint: string;
- private readonly isEnabled: boolean;
- private readonly apiKey?: string;
- private readonly logger: ILogger;
- private readonly http: AxiosInstance;
-
- constructor(options: {
- kmsEndpoint?: string;
- kmsEnabled?: boolean;
- kmsApiKey?: string;
- logger?: ILogger;
- }) {
- this.kmsEndpoint = options.kmsEndpoint ?? "https://kms1.aastar.io";
- this.isEnabled = options.kmsEnabled === true;
- this.apiKey = options.kmsApiKey;
- this.logger = options.logger ?? new ConsoleLogger("[KmsManager]");
-
- const headers: Record = {
- "Content-Type": "application/json",
- };
- if (this.apiKey) {
- headers["x-api-key"] = this.apiKey;
- }
-
- this.http = axios.create({
- baseURL: this.kmsEndpoint,
- headers,
- });
- }
-
- isKmsEnabled(): boolean {
- return this.isEnabled;
- }
-
- private ensureEnabled(): void {
- if (!this.isEnabled) {
- throw new Error("KMS service is not enabled");
- }
- }
-
- /** POST with x-amz-target header (required for wallet/signing operations). */
- private async amzPost(path: string, target: string, body: unknown): Promise {
- const response = await this.http.post(path, body, {
- headers: {
- "Content-Type": "application/x-amz-json-1.1",
- "x-amz-target": target,
- },
- });
- return response.data as T;
- }
-
- // ── Key Management ──────────────────────────────────────────────
-
- async createKey(description: string, passkeyPublicKey: string): Promise {
- this.ensureEnabled();
-
- return this.amzPost("/CreateKey", "TrentService.CreateKey", {
- Description: description,
- KeyUsage: "SIGN_VERIFY",
- KeySpec: "ECC_SECG_P256K1",
- Origin: "EXTERNAL_KMS",
- PasskeyPublicKey: passkeyPublicKey,
- });
- }
-
- async getKeyStatus(keyId: string): Promise {
- this.ensureEnabled();
-
- const response = await this.http.get("/KeyStatus", {
- params: { KeyId: keyId },
- });
- return response.data as KmsKeyStatusResponse;
- }
-
- async describeKey(keyId: string): Promise {
- this.ensureEnabled();
-
- return this.amzPost("/DescribeKey", "TrentService.DescribeKey", { KeyId: keyId });
- }
-
- /**
- * Poll KeyStatus until the key is ready (address derived) or timeout.
- * STM32 key derivation takes 60-75 seconds on first creation.
- */
- async pollUntilReady(
- keyId: string,
- timeoutMs: number = 120_000,
- intervalMs: number = 3_000
- ): Promise {
- this.ensureEnabled();
-
- const deadline = Date.now() + timeoutMs;
-
- while (Date.now() < deadline) {
- const status = await this.getKeyStatus(keyId);
- this.logger.debug(`Key ${keyId} status: ${status.Status}`);
-
- if (status.Status === "ready") {
- return status;
- }
- if (status.Status === "error") {
- throw new Error(`KMS key derivation failed: ${status.Error ?? "unknown error"}`);
- }
-
- await new Promise(resolve => setTimeout(resolve, intervalMs));
- }
-
- throw new Error(`KMS key derivation timed out after ${timeoutMs}ms`);
- }
-
- // ── Signing ─────────────────────────────────────────────────────
-
- /**
- * Sign a hash using Legacy Passkey assertion (reusable for BLS dual-signing).
- */
- async signHash(
- hash: string,
- assertion: LegacyPasskeyAssertion,
- target: { Address?: string; KeyId?: string }
- ): Promise {
- this.ensureEnabled();
-
- const formattedHash = hash.startsWith("0x") ? hash : `0x${hash}`;
-
- const body: Record = {
- Hash: formattedHash,
- Passkey: assertion,
- };
-
- if (target.Address) {
- body.Address = target.Address;
- }
- if (target.KeyId) {
- body.KeyId = target.KeyId;
- }
-
- return this.amzPost("/SignHash", "TrentService.SignHash", body);
- }
-
- /**
- * Sign a hash using a WebAuthn ceremony assertion (one-time use).
- */
- async signHashWithWebAuthn(
- hash: string,
- challengeId: string,
- credential: unknown,
- target: { Address?: string; KeyId?: string }
- ): Promise {
- this.ensureEnabled();
-
- const formattedHash = hash.startsWith("0x") ? hash : `0x${hash}`;
-
- const body: Record = {
- Hash: formattedHash,
- WebAuthn: { ChallengeId: challengeId, Credential: credential },
- };
-
- if (target.Address) {
- body.Address = target.Address;
- }
- if (target.KeyId) {
- body.KeyId = target.KeyId;
- }
-
- return this.amzPost("/SignHash", "TrentService.SignHash", body);
- }
-
- // ── WebAuthn Ceremonies ─────────────────────────────────────────
-
- async beginRegistration(
- params: KmsBeginRegistrationRequest
- ): Promise {
- this.ensureEnabled();
-
- const response = await this.http.post("/BeginRegistration", params);
- return response.data as KmsBeginRegistrationResponse;
- }
-
- async completeRegistration(
- params: KmsCompleteRegistrationRequest
- ): Promise {
- this.ensureEnabled();
-
- const response = await this.http.post("/CompleteRegistration", params);
- return response.data as KmsCompleteRegistrationResponse;
- }
-
- async beginAuthentication(
- params: KmsBeginAuthenticationRequest
- ): Promise {
- this.ensureEnabled();
-
- const response = await this.http.post("/BeginAuthentication", params);
- return response.data as KmsBeginAuthenticationResponse;
- }
-
- // ── Factory ─────────────────────────────────────────────────────
-
- createKmsSigner(
- keyId: string,
- address: string,
- assertionProvider: () => Promise,
- provider?: ethers.Provider
- ): KmsSigner {
- this.ensureEnabled();
- return new KmsSigner(keyId, address, this, assertionProvider, provider);
- }
-}
-
-/**
- * ethers.AbstractSigner backed by KMS with Passkey assertion.
- *
- * Each signing operation calls the `assertionProvider` to obtain a Legacy
- * Passkey assertion, which is then passed to KMS SignHash. The Legacy format
- * is reusable (no challenge consumption), enabling BLS dual-signing.
- */
-export class KmsSigner extends ethers.AbstractSigner {
- constructor(
- private readonly keyId: string,
- private readonly _address: string,
- private readonly kmsManager: KmsManager,
- private readonly assertionProvider: () => Promise,
- provider?: ethers.Provider
- ) {
- super(provider);
- }
-
- async getAddress(): Promise {
- return this._address;
- }
-
- async signMessage(message: string | Uint8Array): Promise {
- const messageBytes = typeof message === "string" ? ethers.toUtf8Bytes(message) : message;
- const messageHash = ethers.hashMessage(messageBytes);
- const assertion = await this.assertionProvider();
- const signResponse = await this.kmsManager.signHash(messageHash, assertion, {
- Address: this._address,
- });
- return "0x" + signResponse.Signature;
- }
-
- async signTransaction(tx: ethers.TransactionRequest): Promise {
- if (!this.provider) {
- throw new Error("Provider is required for signing transactions");
- }
- const populated = await this.populateTransaction(tx);
- const unsignedTx = ethers.Transaction.from(populated);
- const txHash = unsignedTx.hash;
- if (!txHash) {
- throw new Error("Failed to compute transaction hash");
- }
- const assertion = await this.assertionProvider();
- const signResponse = await this.kmsManager.signHash(txHash, assertion, {
- Address: this._address,
- });
- const sig = ethers.Signature.from("0x" + signResponse.Signature);
- unsignedTx.signature = sig;
- return unsignedTx.serialized;
- }
-
- async signTypedData(
- domain: ethers.TypedDataDomain,
- types: Record,
- value: Record
- ): Promise {
- const hash = ethers.TypedDataEncoder.hash(domain, types, value);
- const assertion = await this.assertionProvider();
- const signResponse = await this.kmsManager.signHash(hash, assertion, {
- Address: this._address,
- });
- return "0x" + signResponse.Signature;
- }
-
- connect(provider: ethers.Provider): KmsSigner {
- return new KmsSigner(
- this.keyId,
- this._address,
- this.kmsManager,
- this.assertionProvider,
- provider
- );
- }
-}
diff --git a/sdk/src/server/services/paymaster-manager.ts b/sdk/src/server/services/paymaster-manager.ts
deleted file mode 100644
index 414e1af8..00000000
--- a/sdk/src/server/services/paymaster-manager.ts
+++ /dev/null
@@ -1,310 +0,0 @@
-import { ethers } from "ethers";
-import { EthereumProvider } from "../providers/ethereum-provider";
-import { IStorageAdapter, PaymasterRecord } from "../interfaces/storage-adapter";
-import { ILogger, ConsoleLogger } from "../interfaces/logger";
-
-/**
- * Paymaster manager — extracted from NestJS PaymasterService.
- * Storage via IStorageAdapter instead of filesystem JSON files.
- */
-export class PaymasterManager {
- private readonly logger: ILogger;
-
- constructor(
- private readonly ethereum: EthereumProvider,
- private readonly storage: IStorageAdapter,
- logger?: ILogger
- ) {
- this.logger = logger ?? new ConsoleLogger("[PaymasterManager]");
- }
-
- async getAvailablePaymasters(
- userId: string
- ): Promise<{ name: string; address: string; configured: boolean }[]> {
- const paymasters = await this.storage.getPaymasters(userId);
- return paymasters.map(config => ({
- name: config.name,
- address: config.address,
- configured: !!config.address && config.address !== "0x",
- }));
- }
-
- async addCustomPaymaster(
- userId: string,
- name: string,
- address: string,
- type: "pimlico" | "stackup" | "alchemy" | "custom" = "custom",
- apiKey?: string,
- endpoint?: string
- ): Promise {
- const paymaster: PaymasterRecord = {
- id: `${userId}-${name}-${Date.now()}`,
- name,
- address,
- type,
- apiKey,
- endpoint,
- createdAt: new Date().toISOString(),
- };
- await this.storage.savePaymaster(userId, paymaster);
- }
-
- async removeCustomPaymaster(userId: string, name: string): Promise {
- return this.storage.removePaymaster(userId, name);
- }
-
- async getPaymasterData(
- userId: string,
- paymasterName: string,
- userOp: unknown,
- entryPoint: string,
- customAddress?: string
- ): Promise {
- // Handle custom user-provided paymaster addresses
- if (paymasterName === "custom-user-provided" && customAddress) {
- const formattedAddress = customAddress.toLowerCase().startsWith("0x")
- ? customAddress
- : `0x${customAddress}`;
-
- if (!/^0x[a-fA-F0-9]{40}$/.test(formattedAddress)) {
- throw new Error(`Invalid paymaster address format: ${customAddress}`);
- }
-
- const isV07OrV08 =
- entryPoint.toLowerCase() === "0x0000000071727De22E5E9d8BAf0edAc6f37da032".toLowerCase() ||
- entryPoint.toLowerCase() === "0x0576a174D229E3cFA37253523E645A78A0C91B57".toLowerCase();
-
- if (isV07OrV08) {
- const provider = this.ethereum.getProvider();
-
- // Detect SuperPaymaster vs PaymasterV4
- let isSuperPaymaster = false;
- let operatorAddress = "0x";
- try {
- const spContract = new ethers.Contract(
- formattedAddress,
- [
- "function owner() view returns (address)",
- "function operators(address) view returns (bool,uint256,address,uint256)",
- ],
- provider
- );
- const owner = await spContract.owner();
- const opInfo = await spContract.operators(owner);
- if (opInfo && opInfo[0] === true) {
- isSuperPaymaster = true;
- operatorAddress = owner;
- this.logger.log(`SuperPaymaster detected, operator: ${operatorAddress}`);
- }
- } catch {
- /* not SuperPaymaster */
- }
-
- if (isSuperPaymaster) {
- const verGas = BigInt(80000);
- const postGas = BigInt(100000);
- const maxRate = (BigInt(1) << BigInt(256)) - BigInt(1);
- return ethers.concat([
- formattedAddress,
- ethers.zeroPadValue(ethers.toBeHex(verGas), 16),
- ethers.zeroPadValue(ethers.toBeHex(postGas), 16),
- operatorAddress,
- ethers.zeroPadValue(ethers.toBeHex(maxRate), 32),
- ]);
- }
-
- // PaymasterV4 path
- const paymasterVerificationGasLimit = BigInt(0x30000);
- const paymasterPostOpGasLimit = BigInt(0x30000);
-
- let gasTokenData = "0x";
- try {
- const pmContract = new ethers.Contract(
- formattedAddress,
- [
- "function getSupportedGasTokens() view returns (address[])",
- "function tokenPrices(address) view returns (uint256)",
- ],
- provider
- );
-
- try {
- const gasTokens: string[] = await pmContract.getSupportedGasTokens();
- if (gasTokens && gasTokens.length > 0) {
- gasTokenData = gasTokens[0];
- this.logger.log(`PaymasterV4 gas token (from list): ${gasTokenData}`);
- }
- } catch {
- const knownGasTokens = [
- "0xDf669834F04988BcEE0E3B6013B6b867Bd38778d", // aPNTs (Sepolia)
- ];
- for (const token of knownGasTokens) {
- try {
- const price = await pmContract.tokenPrices(token);
- if (price > 0n) {
- gasTokenData = token;
- this.logger.log(`PaymasterV4 gas token (from price check): ${gasTokenData}`);
- break;
- }
- } catch {
- /* skip */
- }
- }
- }
- } catch {
- this.logger.log("Could not query gas tokens from paymaster, proceeding without");
- }
-
- return ethers.concat([
- formattedAddress,
- ethers.zeroPadValue(ethers.toBeHex(paymasterVerificationGasLimit), 16),
- ethers.zeroPadValue(ethers.toBeHex(paymasterPostOpGasLimit), 16),
- gasTokenData,
- ]);
- }
-
- return formattedAddress;
- }
-
- const paymasters = await this.storage.getPaymasters(userId);
- const config = paymasters.find(p => p.name === paymasterName);
- if (!config) {
- throw new Error(`Paymaster ${paymasterName} not found`);
- }
-
- switch (config.type) {
- case "pimlico":
- if (!config.apiKey) return "0x";
- return this.getPimlicoPaymasterData(config, userOp, entryPoint);
- case "stackup":
- if (!config.apiKey) return "0x";
- return this.getStackUpPaymasterData(config, userOp, entryPoint);
- case "alchemy":
- if (!config.apiKey) return "0x";
- return this.getAlchemyPaymasterData(config, userOp, entryPoint);
- case "custom":
- if (
- config.address.toLowerCase() ===
- "0x0000000000325602a77416A16136FDafd04b299f".toLowerCase() &&
- config.apiKey
- ) {
- return this.getPimlicoPaymasterData(
- { ...config, type: "pimlico", endpoint: "https://api.pimlico.io/v2/11155111/rpc" },
- userOp,
- entryPoint
- );
- }
- return config.address;
- default:
- return "0x";
- }
- }
-
- private async getPimlicoPaymasterData(
- config: PaymasterRecord,
- userOp: unknown,
- entryPoint: string
- ): Promise {
- const url = `${config.endpoint}?apikey=${config.apiKey}`;
- const response = await globalThis.fetch(url, {
- method: "POST",
- headers: { "Content-Type": "application/json" },
- body: JSON.stringify({
- jsonrpc: "2.0",
- method: "pm_sponsorUserOperation",
- params: [userOp, entryPoint, {}],
- id: 1,
- }),
- });
-
- const result = (await response.json()) as {
- error?: { message?: string };
- result?: {
- paymasterAndData?: string;
- paymaster?: string;
- paymasterVerificationGasLimit?: string;
- paymasterPostOpGasLimit?: string;
- paymasterData?: string;
- };
- };
-
- if (result.error) {
- throw new Error(
- `Pimlico sponsorship failed: ${result.error.message || JSON.stringify(result.error)}`
- );
- }
-
- if (result.result) {
- if (result.result.paymasterAndData) {
- return result.result.paymasterAndData;
- }
- if (result.result.paymaster) {
- return ethers.concat([
- result.result.paymaster,
- ethers.zeroPadValue(
- ethers.toBeHex(BigInt(result.result.paymasterVerificationGasLimit || "0x30000")),
- 16
- ),
- ethers.zeroPadValue(
- ethers.toBeHex(BigInt(result.result.paymasterPostOpGasLimit || "0x30000")),
- 16
- ),
- result.result.paymasterData || "0x",
- ]);
- }
- }
-
- throw new Error("Pimlico API did not return valid paymaster data");
- }
-
- private async getStackUpPaymasterData(
- config: PaymasterRecord,
- userOp: unknown,
- entryPoint: string
- ): Promise {
- try {
- const response = await globalThis.fetch(`${config.endpoint}/${config.apiKey}`, {
- method: "POST",
- headers: { "Content-Type": "application/json" },
- body: JSON.stringify({
- jsonrpc: "2.0",
- method: "pm_sponsorUserOperation",
- params: { userOperation: userOp, entryPoint, context: { type: "payg" } },
- id: 1,
- }),
- });
- const result = (await response.json()) as { error?: unknown; result?: string };
- if (result.error) return "0x";
- return result.result || "0x";
- } catch {
- return "0x";
- }
- }
-
- private async getAlchemyPaymasterData(
- config: PaymasterRecord,
- userOp: unknown,
- entryPoint: string
- ): Promise {
- try {
- const response = await globalThis.fetch(`${config.endpoint}/${config.apiKey}`, {
- method: "POST",
- headers: { "Content-Type": "application/json" },
- body: JSON.stringify({
- jsonrpc: "2.0",
- method: "alchemy_requestGasAndPaymasterAndData",
- params: [{ policyId: "default", entryPoint, userOperation: userOp }],
- id: 1,
- }),
- });
- const result = (await response.json()) as {
- error?: unknown;
- result?: { paymasterAndData?: string };
- };
- if (result.error) return "0x";
- return result.result?.paymasterAndData || "0x";
- } catch {
- return "0x";
- }
- }
-}
diff --git a/sdk/src/server/services/token-service.ts b/sdk/src/server/services/token-service.ts
deleted file mode 100644
index 92420fbd..00000000
--- a/sdk/src/server/services/token-service.ts
+++ /dev/null
@@ -1,101 +0,0 @@
-import { ethers } from "ethers";
-import { EthereumProvider } from "../providers/ethereum-provider";
-import { ERC20_ABI } from "../constants/entrypoint";
-
-export interface TokenInfo {
- address: string;
- symbol: string;
- name: string;
- decimals: number;
-}
-
-export interface TokenBalance {
- token: TokenInfo;
- balance: string;
- formattedBalance: string;
-}
-
-/**
- * Token service — extracted from NestJS TokenService.
- * Only on-chain queries and calldata generation (no preset token list).
- */
-export class TokenService {
- constructor(private readonly ethereum: EthereumProvider) {}
-
- async getTokenInfo(tokenAddress: string): Promise {
- const provider = this.ethereum.getProvider();
- const contract = new ethers.Contract(tokenAddress, ERC20_ABI, provider);
-
- const [name, symbol, decimals] = await Promise.all([
- contract.name(),
- contract.symbol(),
- contract.decimals(),
- ]);
-
- return {
- address: tokenAddress.toLowerCase(),
- name,
- symbol,
- decimals: Number(decimals),
- };
- }
-
- async getTokenBalance(tokenAddress: string, walletAddress: string): Promise {
- const provider = this.ethereum.getProvider();
- const contract = new ethers.Contract(tokenAddress, ERC20_ABI, provider);
-
- try {
- const balance = await contract.balanceOf(walletAddress);
- return balance.toString();
- } catch {
- return "0";
- }
- }
-
- async getFormattedTokenBalance(
- tokenAddress: string,
- walletAddress: string
- ): Promise {
- const tokenInfo = await this.getTokenInfo(tokenAddress);
- const rawBalance = await this.getTokenBalance(tokenAddress, walletAddress);
- const formattedBalance = ethers.formatUnits(rawBalance, tokenInfo.decimals);
- return { token: tokenInfo, balance: rawBalance, formattedBalance };
- }
-
- generateTransferCalldata(to: string, amount: string, decimals: number): string {
- const contract = new ethers.Contract(ethers.ZeroAddress, ERC20_ABI);
- const parsedAmount = ethers.parseUnits(amount, decimals);
- return contract.interface.encodeFunctionData("transfer", [to, parsedAmount]);
- }
-
- async validateToken(tokenAddress: string): Promise<{
- isValid: boolean;
- token?: TokenInfo;
- error?: string;
- }> {
- try {
- const provider = this.ethereum.getProvider();
- const contract = new ethers.Contract(tokenAddress, ERC20_ABI, provider);
-
- const [name, symbol, decimals] = (await Promise.race([
- Promise.all([contract.name(), contract.symbol(), contract.decimals()]),
- new Promise((_, reject) => setTimeout(() => reject(new Error("Timeout")), 10000)),
- ])) as [string, string, bigint];
-
- return {
- isValid: true,
- token: {
- address: tokenAddress.toLowerCase(),
- name,
- symbol,
- decimals: Number(decimals),
- },
- };
- } catch (error: unknown) {
- return {
- isValid: false,
- error: error instanceof Error ? error.message : "Invalid ERC20 token",
- };
- }
- }
-}
diff --git a/sdk/src/server/services/transfer-manager.ts b/sdk/src/server/services/transfer-manager.ts
deleted file mode 100644
index 535d9635..00000000
--- a/sdk/src/server/services/transfer-manager.ts
+++ /dev/null
@@ -1,670 +0,0 @@
-import { ethers } from "ethers";
-import { EthereumProvider } from "../providers/ethereum-provider";
-import { AccountManager } from "./account-manager";
-import { BLSSignatureService } from "./bls-signature-service";
-import { GuardChecker } from "./guard-checker";
-import { PaymasterManager } from "./paymaster-manager";
-import { TokenService } from "./token-service";
-import { IStorageAdapter } from "../interfaces/storage-adapter";
-import { ISignerAdapter, PasskeyAssertionContext } from "../interfaces/signer-adapter";
-import { LegacyPasskeyAssertion } from "./kms-signer";
-import { EntryPointVersion } from "../constants/entrypoint";
-import { ILogger, ConsoleLogger } from "../interfaces/logger";
-import { UserOperation, PackedUserOperation } from "../../core/types";
-import { ERC4337Utils } from "../../core/erc4337";
-import { TierLevel } from "../../core/tier";
-
-// ── Public DTOs ───────────────────────────────────────────────────
-
-export interface ExecuteTransferParams {
- to: string;
- amount: string;
- data?: string;
- tokenAddress?: string;
- usePaymaster?: boolean;
- paymasterAddress?: string;
- paymasterData?: string;
- passkeyAssertion?: LegacyPasskeyAssertion;
- /** P256 passkey signature (64 bytes hex). Required for AirAccount Tier 2/3. */
- p256Signature?: string;
- /** Guardian ethers.Signer instance. Required for AirAccount Tier 3. */
- guardianSigner?: ethers.Signer;
- /** Enable AirAccount tiered signature routing. Default: false (legacy BLS-only). */
- useAirAccountTiering?: boolean;
-}
-
-export interface EstimateGasParams {
- to: string;
- amount: string;
- data?: string;
- tokenAddress?: string;
-}
-
-export interface TransferResult {
- success: boolean;
- transferId: string;
- userOpHash: string;
- status: string;
- message: string;
- from: string;
- to: string;
- amount: string;
-}
-
-// ── Helper to generate UUID-like IDs without external dependency ──
-
-function generateId(): string {
- const hex = () => Math.random().toString(16).slice(2, 10);
- return `${hex()}${hex()}-${hex()}-${hex()}-${hex()}-${hex()}${hex()}${hex()}`;
-}
-
-/**
- * Transfer manager — extracted from NestJS TransferService.
- * No passkey verification: callers are responsible for their own auth.
- */
-export class TransferManager {
- private readonly logger: ILogger;
-
- private readonly guardChecker: GuardChecker | null;
-
- constructor(
- private readonly ethereum: EthereumProvider,
- private readonly accountManager: AccountManager,
- private readonly blsService: BLSSignatureService,
- private readonly paymasterManager: PaymasterManager,
- private readonly tokenService: TokenService,
- private readonly storage: IStorageAdapter,
- private readonly signer: ISignerAdapter,
- logger?: ILogger,
- guardChecker?: GuardChecker
- ) {
- this.logger = logger ?? new ConsoleLogger("[TransferManager]");
- this.guardChecker = guardChecker ?? null;
- }
-
- async executeTransfer(userId: string, params: ExecuteTransferParams): Promise {
- // Get user's account
- const account = await this.accountManager.getAccountByUserId(userId);
- if (!account) throw new Error("User account not found");
-
- // Check deployment
- const code = await this.ethereum.getProvider().getCode(account.address);
- const needsDeployment = code === "0x";
- if (needsDeployment) {
- this.logger.log("Account needs deployment, will deploy with first transaction");
- }
-
- // Balance validation
- const smartAccountBalance = parseFloat(await this.ethereum.getBalance(account.address));
- const isTokenTransfer = !!params.tokenAddress;
- const transferAmount = isTokenTransfer ? 0 : parseFloat(params.amount);
-
- if (!params.usePaymaster) {
- const minRequiredBalance = 0.0002;
- const totalNeeded = transferAmount + minRequiredBalance;
- if (smartAccountBalance < totalNeeded) {
- throw new Error(
- `Insufficient balance: Account has ${smartAccountBalance} ETH but needs ${totalNeeded} ETH`
- );
- }
- } else if (!isTokenTransfer && transferAmount > smartAccountBalance) {
- throw new Error(
- `Insufficient balance: Account has ${smartAccountBalance} ETH but trying to send ${transferAmount} ETH`
- );
- }
-
- const version = (account.entryPointVersion || "0.6") as unknown as EntryPointVersion;
-
- // Build UserOperation
- const userOp = await this.buildUserOperation(
- userId,
- account.address,
- params.to,
- params.amount,
- params.data || "0x",
- params.usePaymaster,
- params.paymasterAddress,
- params.paymasterData,
- params.tokenAddress,
- version
- );
-
- // Get hash
- const userOpHash = await this.ethereum.getUserOpHash(userOp, version);
-
- // Ensure wallet exists
- await this.signer.ensureSigner(userId);
-
- // BLS signature (pass assertion context for KMS-backed signing)
- const assertionCtx: PasskeyAssertionContext | undefined = params.passkeyAssertion
- ? { assertion: params.passkeyAssertion }
- : undefined;
-
- // M4 accounts: check if validator is set; if not, use ECDSA instead of BLS
- let useECDSA = false;
- if (version === EntryPointVersion.V0_7 || version === EntryPointVersion.V0_8) {
- try {
- const provider = this.ethereum.getProvider();
- const accountCode = await provider.getCode(account.address);
- if (accountCode === "0x") {
- useECDSA = true;
- } else {
- const acc = new ethers.Contract(
- account.address,
- ["function validator() view returns (address)"],
- provider
- );
- const v = await acc.validator();
- if (v === ethers.ZeroAddress) useECDSA = true;
- }
- } catch {
- useECDSA = true;
- }
- }
-
- if (useECDSA) {
- // M4 ECDSA path: raw 65-byte sig, no validator needed
- this.logger.log("M4: using ECDSA signature (validator not set)");
- const signer = await this.signer.getSigner(userId, assertionCtx);
- const ecdsaSig = await signer.signMessage(ethers.getBytes(userOpHash));
- userOp.signature = ecdsaSig;
- } else if (params.useAirAccountTiering && this.guardChecker) {
- // AirAccount tiered signature routing
- const transferValue = params.tokenAddress ? 0n : ethers.parseEther(params.amount);
- const preCheck = await this.guardChecker.preCheck(account.address, transferValue);
-
- if (!preCheck.ok) {
- throw new Error(`Guard pre-check failed: ${preCheck.errors.join("; ")}`);
- }
-
- this.logger.log(
- `Tier ${preCheck.tier} selected (algId=0x${preCheck.algId.toString(16).padStart(2, "0")})`
- );
-
- userOp.signature = await this.blsService.generateTieredSignature({
- tier: preCheck.tier as TierLevel,
- userId,
- userOpHash,
- p256Signature: params.p256Signature,
- guardianSigner: params.guardianSigner,
- ctx: assertionCtx,
- });
- } else {
- // BLS triple signature with algId 0x01 prefix for M4 account routing
- const blsData = await this.blsService.generateBLSSignature(userId, userOpHash, assertionCtx);
- const packedBls = await this.blsService.packSignature(blsData);
- // Prepend algId=0x01 byte for M4 _validateSignature routing
- userOp.signature = "0x01" + packedBls.slice(2);
- }
-
- // Create transfer record
- const transferId = generateId();
- let tokenSymbol = "ETH";
- if (params.tokenAddress) {
- try {
- const tokenInfo = await this.tokenService.getTokenInfo(params.tokenAddress);
- tokenSymbol = tokenInfo.symbol;
- } catch {
- tokenSymbol = `${params.tokenAddress.slice(0, 6)}...${params.tokenAddress.slice(-4)}`;
- }
- }
-
- await this.storage.saveTransfer({
- id: transferId,
- userId,
- from: account.address,
- to: params.to,
- amount: params.amount,
- data: params.data,
- userOpHash,
- status: "pending",
- nodeIndices: [],
- createdAt: new Date().toISOString(),
- tokenAddress: params.tokenAddress,
- tokenSymbol,
- });
-
- // Process asynchronously
- this.processTransferAsync(transferId, userOp, account.address, version);
-
- return {
- success: true,
- transferId,
- userOpHash,
- status: "pending",
- message: "Transfer submitted successfully. Use transferId to check status.",
- from: account.address,
- to: params.to,
- amount: params.amount,
- };
- }
-
- private async processTransferAsync(
- transferId: string,
- userOp: UserOperation | PackedUserOperation,
- from: string,
- version: EntryPointVersion
- ): Promise {
- try {
- const formatted = this.formatUserOpForBundler(userOp, version);
- const bundlerUserOpHash = await this.ethereum.sendUserOperation(formatted, version);
-
- await this.storage.updateTransfer(transferId, {
- bundlerUserOpHash,
- status: "submitted",
- submittedAt: new Date().toISOString(),
- } as Partial);
-
- const txHash = await this.ethereum.waitForUserOp(bundlerUserOpHash);
-
- await this.storage.updateTransfer(transferId, {
- transactionHash: txHash,
- status: "completed",
- completedAt: new Date().toISOString(),
- } as Partial);
-
- // Update deployment status if first tx
- const code = await this.ethereum.getProvider().getCode(from);
- if (code !== "0x") {
- const account = (await this.storage.getAccounts()).find(a => a.address === from);
- if (account && !account.deployed) {
- await this.storage.updateAccount(account.userId, {
- deployed: true,
- deploymentTxHash: txHash,
- });
- }
- }
- } catch (error: unknown) {
- const message = error instanceof Error ? error.message : String(error);
- await this.storage.updateTransfer(transferId, {
- status: "failed",
- error: message,
- failedAt: new Date().toISOString(),
- } as Partial);
- this.logger.error(`Transfer ${transferId} failed: ${message}`);
- }
- }
-
- async estimateGas(userId: string, params: EstimateGasParams) {
- const account = await this.accountManager.getAccountByUserId(userId);
- if (!account) throw new Error("User account not found");
-
- const version = (account.entryPointVersion || "0.6") as unknown as EntryPointVersion;
-
- const userOp = await this.buildUserOperation(
- userId,
- account.address,
- params.to,
- params.amount,
- params.data || "0x",
- false,
- undefined,
- undefined,
- params.tokenAddress,
- version
- );
-
- const formatted = this.formatUserOpForBundler(userOp, version);
- const gasEstimates = await this.ethereum.estimateUserOperationGas(formatted, version);
- const gasPrices = await this.ethereum.getUserOperationGasPrice();
-
- const validatorContract = this.ethereum.getValidatorContract(version);
- const validatorGasEstimate = await validatorContract.getGasEstimate(3);
-
- return {
- callGasLimit: gasEstimates.callGasLimit,
- verificationGasLimit: gasEstimates.verificationGasLimit,
- preVerificationGas: gasEstimates.preVerificationGas,
- validatorGasEstimate: validatorGasEstimate.toString(),
- totalGasEstimate: (
- BigInt(gasEstimates.callGasLimit) +
- BigInt(gasEstimates.verificationGasLimit) +
- BigInt(gasEstimates.preVerificationGas)
- ).toString(),
- maxFeePerGas: gasPrices.maxFeePerGas,
- maxPriorityFeePerGas: gasPrices.maxPriorityFeePerGas,
- };
- }
-
- async getTransferStatus(userId: string, transferId: string) {
- const transfer = await this.storage.findTransferById(transferId);
- if (!transfer || transfer.userId !== userId) {
- throw new Error("Transfer not found");
- }
-
- const response: Record = { ...transfer };
-
- if (transfer.status === "pending" || transfer.status === "submitted") {
- const elapsed = Math.floor((Date.now() - new Date(transfer.createdAt).getTime()) / 1000);
- response.elapsedSeconds = elapsed;
- }
-
- if (transfer.transactionHash) {
- response.explorerUrl = `https://sepolia.etherscan.io/tx/${transfer.transactionHash}`;
- }
-
- const statusDescriptions: Record = {
- pending: "Preparing transaction and generating signatures",
- submitted: "Transaction submitted to bundler, waiting for confirmation",
- completed: "Transaction confirmed on chain",
- failed: "Transaction failed",
- };
- response.statusDescription = statusDescriptions[transfer.status] || transfer.status;
-
- return response;
- }
-
- async getTransferHistory(userId: string, page = 1, limit = 10) {
- const transfers = await this.storage.findTransfersByUserId(userId);
- if (!transfers || transfers.length === 0) {
- return { transfers: [], total: 0, page, limit, totalPages: 0 };
- }
-
- transfers.sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());
-
- const start = (page - 1) * limit;
- const paginated = transfers.slice(start, start + limit);
-
- return {
- transfers: paginated,
- total: transfers.length,
- page,
- limit,
- totalPages: Math.ceil(transfers.length / limit),
- };
- }
-
- // ── Private helpers ─────────────────────────────────────────────
-
- private async buildUserOperation(
- userId: string,
- sender: string,
- to: string,
- amount: string,
- data: string,
- usePaymaster?: boolean,
- paymasterAddress?: string,
- _paymasterData?: string,
- tokenAddress?: string,
- version: EntryPointVersion = EntryPointVersion.V0_6
- ): Promise {
- const accountContract = this.ethereum.getAccountContract(sender);
- const nonce = await this.ethereum.getNonce(sender, 0, version);
-
- // initCode for deployment
- const provider = this.ethereum.getProvider();
- const code = await provider.getCode(sender);
- const needsDeployment = code === "0x";
-
- let initCode = "0x";
- if (needsDeployment) {
- const accounts = await this.storage.getAccounts();
- const account = accounts.find(a => a.address === sender);
- if (account) {
- const factory = this.ethereum.getFactoryContract(version);
- const factoryAddress = await factory.getAddress();
-
- let deployCalldata: string;
- if (version === EntryPointVersion.V0_7 || version === EntryPointVersion.V0_8) {
- // New M4 factory: createAccountWithDefaults(owner, salt, guardian1, guardian2, dailyLimit)
- deployCalldata = factory.interface.encodeFunctionData("createAccountWithDefaults", [
- account.signerAddress,
- account.salt,
- ethers.ZeroAddress,
- ethers.ZeroAddress,
- ethers.parseEther("1000"),
- ]);
- } else {
- deployCalldata = factory.interface.encodeFunctionData(
- "createAccountWithAAStarValidator",
- [
- account.signerAddress,
- account.signerAddress,
- account.validatorAddress,
- true,
- account.salt,
- ]
- );
- }
-
- initCode = ethers.concat([factoryAddress, deployCalldata]);
- }
- }
-
- // callData
- let callData: string;
- if (tokenAddress) {
- const tokenInfo = await this.tokenService.getTokenInfo(tokenAddress);
- const transferCalldata = this.tokenService.generateTransferCalldata(
- to,
- amount,
- tokenInfo.decimals
- );
- callData = accountContract.interface.encodeFunctionData("execute", [
- tokenAddress,
- 0,
- transferCalldata,
- ]);
- } else {
- callData = accountContract.interface.encodeFunctionData("execute", [
- to,
- ethers.parseEther(amount),
- data,
- ]);
- }
-
- const gasPrices = await this.ethereum.getUserOperationGasPrice();
-
- const isV07 = version === EntryPointVersion.V0_7 || version === EntryPointVersion.V0_8;
-
- let baseUserOp: Record;
- if (isV07) {
- // v0.7/v0.8: use factory/factoryData and separate paymaster fields
- let factory: string | undefined;
- let factoryData: string | undefined;
- if (initCode && initCode !== "0x" && initCode.length > 2) {
- factory = initCode.slice(0, 42);
- factoryData = initCode.length > 42 ? "0x" + initCode.slice(42) : "0x";
- }
- baseUserOp = {
- sender,
- nonce: "0x" + nonce.toString(16),
- ...(factory ? { factory, factoryData } : {}),
- callData,
- callGasLimit: "0x0",
- verificationGasLimit: "0x0",
- preVerificationGas: "0x0",
- maxFeePerGas: gasPrices.maxFeePerGas,
- maxPriorityFeePerGas: gasPrices.maxPriorityFeePerGas,
- signature: "0x",
- };
- } else {
- // v0.6: use initCode and paymasterAndData
- baseUserOp = {
- sender,
- nonce: "0x" + nonce.toString(16),
- initCode,
- callData,
- callGasLimit: "0x0",
- verificationGasLimit: "0x0",
- preVerificationGas: "0x0",
- maxFeePerGas: gasPrices.maxFeePerGas,
- maxPriorityFeePerGas: gasPrices.maxPriorityFeePerGas,
- paymasterAndData: "0x",
- signature: "0x",
- };
- }
-
- // Paymaster
- let paymasterAndData = "0x";
- if (usePaymaster) {
- if (paymasterAddress) {
- const entryPoint = this.ethereum.getEntryPointAddress(version);
- paymasterAndData = await this.paymasterManager.getPaymasterData(
- userId,
- "custom-user-provided",
- baseUserOp,
- entryPoint,
- paymasterAddress
- );
- } else {
- const available = await this.paymasterManager.getAvailablePaymasters(userId);
- const configured = available.find(pm => pm.configured);
- if (configured) {
- const entryPoint = this.ethereum.getEntryPointAddress(version);
- paymasterAndData = await this.paymasterManager.getPaymasterData(
- userId,
- configured.name,
- baseUserOp,
- entryPoint
- );
- } else {
- throw new Error("No paymaster configured and no paymaster address provided");
- }
- }
-
- if (!paymasterAndData || paymasterAndData === "0x") {
- throw new Error(
- `Paymaster failed to provide sponsorship data. The paymaster at ${paymasterAddress} may not be configured correctly.`
- );
- }
-
- if (isV07) {
- // For v0.7, split paymasterAndData into separate fields on the baseUserOp
- baseUserOp.paymaster = paymasterAndData.slice(0, 42);
- if (paymasterAndData.length >= 74) {
- baseUserOp.paymasterVerificationGasLimit =
- "0x" + BigInt("0x" + paymasterAndData.slice(42, 74)).toString(16);
- }
- if (paymasterAndData.length >= 106) {
- baseUserOp.paymasterPostOpGasLimit =
- "0x" + BigInt("0x" + paymasterAndData.slice(74, 106)).toString(16);
- }
- if (paymasterAndData.length > 106) {
- baseUserOp.paymasterData = "0x" + paymasterAndData.slice(106);
- }
- } else {
- baseUserOp.paymasterAndData = paymasterAndData;
- }
- }
-
- // Gas estimation
- const gasEstimates = await this.ethereum.estimateUserOperationGas(baseUserOp, version);
-
- const standardUserOp: UserOperation = {
- sender,
- nonce,
- initCode,
- callData,
- callGasLimit: BigInt(gasEstimates.callGasLimit),
- verificationGasLimit: BigInt(gasEstimates.verificationGasLimit),
- preVerificationGas: BigInt(gasEstimates.preVerificationGas),
- maxFeePerGas: BigInt(gasPrices.maxFeePerGas),
- maxPriorityFeePerGas: BigInt(gasPrices.maxPriorityFeePerGas),
- paymasterAndData,
- signature: "0x",
- };
-
- if (version === EntryPointVersion.V0_7 || version === EntryPointVersion.V0_8) {
- return ERC4337Utils.packUserOperation(standardUserOp);
- }
-
- return standardUserOp;
- }
-
- private formatUserOpForBundler(
- userOp: UserOperation | PackedUserOperation,
- version: EntryPointVersion = EntryPointVersion.V0_6
- ): Record {
- if (version === EntryPointVersion.V0_7 || version === EntryPointVersion.V0_8) {
- const packedOp = userOp as PackedUserOperation;
- const gasLimits = ERC4337Utils.unpackAccountGasLimits(packedOp.accountGasLimits);
- const gasFees = ERC4337Utils.unpackGasFees(packedOp.gasFees);
-
- let factory: string | undefined;
- let factoryData: string | undefined;
- if (packedOp.initCode && packedOp.initCode !== "0x" && packedOp.initCode.length > 2) {
- factory = packedOp.initCode.slice(0, 42);
- if (packedOp.initCode.length > 42) {
- factoryData = "0x" + packedOp.initCode.slice(42);
- }
- }
-
- let paymaster: string | undefined;
- let paymasterVerificationGasLimit: string | undefined;
- let paymasterPostOpGasLimit: string | undefined;
- let paymasterData: string | undefined;
-
- if (
- packedOp.paymasterAndData &&
- packedOp.paymasterAndData !== "0x" &&
- packedOp.paymasterAndData.length > 2
- ) {
- paymaster = packedOp.paymasterAndData.slice(0, 42);
- if (packedOp.paymasterAndData.length >= 74) {
- paymasterVerificationGasLimit =
- "0x" + BigInt("0x" + packedOp.paymasterAndData.slice(42, 74)).toString(16);
- }
- if (packedOp.paymasterAndData.length >= 106) {
- paymasterPostOpGasLimit =
- "0x" + BigInt("0x" + packedOp.paymasterAndData.slice(74, 106)).toString(16);
- }
- if (packedOp.paymasterAndData.length > 106) {
- paymasterData = "0x" + packedOp.paymasterAndData.slice(106);
- }
- }
-
- const result: Record = {
- sender: packedOp.sender,
- nonce:
- typeof packedOp.nonce === "bigint"
- ? "0x" + packedOp.nonce.toString(16)
- : packedOp.nonce.toString().startsWith("0x")
- ? packedOp.nonce.toString()
- : "0x" + BigInt(packedOp.nonce).toString(16),
- callData: packedOp.callData,
- callGasLimit: "0x" + gasLimits.callGasLimit.toString(16),
- verificationGasLimit: "0x" + gasLimits.verificationGasLimit.toString(16),
- preVerificationGas:
- typeof packedOp.preVerificationGas === "bigint"
- ? "0x" + packedOp.preVerificationGas.toString(16)
- : packedOp.preVerificationGas.toString().startsWith("0x")
- ? packedOp.preVerificationGas.toString()
- : "0x" + BigInt(packedOp.preVerificationGas).toString(16),
- maxFeePerGas: "0x" + gasFees.maxFeePerGas.toString(16),
- maxPriorityFeePerGas: "0x" + gasFees.maxPriorityFeePerGas.toString(16),
- signature: packedOp.signature || "0x",
- };
-
- if (factory) result.factory = factory;
- if (factoryData) result.factoryData = factoryData;
-
- if (paymaster) {
- result.paymaster = paymaster;
- result.paymasterVerificationGasLimit = paymasterVerificationGasLimit || "0x30000";
- result.paymasterPostOpGasLimit = paymasterPostOpGasLimit || "0x30000";
- if (paymasterData && paymasterData !== "0x") {
- result.paymasterData = paymasterData;
- }
- }
-
- return result;
- }
-
- // v0.6 format
- const op = userOp as UserOperation;
- return {
- sender: op.sender,
- nonce: "0x" + op.nonce.toString(16),
- initCode: op.initCode,
- callData: op.callData,
- callGasLimit: "0x" + op.callGasLimit.toString(16),
- verificationGasLimit: "0x" + op.verificationGasLimit.toString(16),
- preVerificationGas: "0x" + op.preVerificationGas.toString(16),
- maxFeePerGas: "0x" + op.maxFeePerGas.toString(16),
- maxPriorityFeePerGas: "0x" + op.maxPriorityFeePerGas.toString(16),
- paymasterAndData: op.paymasterAndData,
- signature: op.signature,
- };
- }
-}
diff --git a/sdk/src/server/services/wallet-manager.ts b/sdk/src/server/services/wallet-manager.ts
deleted file mode 100644
index bd0c2042..00000000
--- a/sdk/src/server/services/wallet-manager.ts
+++ /dev/null
@@ -1,21 +0,0 @@
-import { ethers } from "ethers";
-import { ISignerAdapter } from "../interfaces/signer-adapter";
-
-/**
- * Thin wrapper around ISignerAdapter for consistent wallet access.
- */
-export class WalletManager {
- constructor(private readonly signer: ISignerAdapter) {}
-
- async getAddress(userId: string): Promise {
- return this.signer.getAddress(userId);
- }
-
- async getSigner(userId: string): Promise {
- return this.signer.getSigner(userId);
- }
-
- async ensureSigner(userId: string): Promise<{ signer: ethers.Signer; address: string }> {
- return this.signer.ensureSigner(userId);
- }
-}
diff --git a/sdk/src/test-build.ts b/sdk/src/test-build.ts
deleted file mode 100644
index dc8b681f..00000000
--- a/sdk/src/test-build.ts
+++ /dev/null
@@ -1,15 +0,0 @@
-import { YAAAClient } from "../src";
-
-// Basic import test
-try {
- console.log("Checking exports...");
- if (YAAAClient) {
- console.log("YAAAClient exported successfully");
- } else {
- throw new Error("YAAAClient export failed");
- }
- console.log("SDK build verification passed!");
-} catch (error) {
- console.error("Verification failed:", error);
- process.exit(1);
-}
diff --git a/sdk/tsconfig.json b/sdk/tsconfig.json
deleted file mode 100644
index e0d5077b..00000000
--- a/sdk/tsconfig.json
+++ /dev/null
@@ -1,21 +0,0 @@
-{
- "compilerOptions": {
- "target": "ES2020",
- "module": "ESNext",
- "lib": ["ES2020", "DOM"],
- "declaration": true,
- "declarationMap": true,
- "sourceMap": true,
- "outDir": "./dist",
- "rootDir": "./src",
- "strict": true,
- "esModuleInterop": true,
- "skipLibCheck": true,
- "forceConsistentCasingInFileNames": true,
- "moduleResolution": "bundler",
- "resolveJsonModule": true,
- "isolatedModules": true
- },
- "include": ["src/**/*"],
- "exclude": ["node_modules", "dist", "**/*.test.ts"]
-}
diff --git a/sdk/tsup.config.ts b/sdk/tsup.config.ts
deleted file mode 100644
index f5a15ea6..00000000
--- a/sdk/tsup.config.ts
+++ /dev/null
@@ -1,19 +0,0 @@
-import { defineConfig } from "tsup";
-
-export default defineConfig({
- entry: {
- index: "src/index.ts",
- "core/bls/index": "src/core/bls/index.ts",
- "core/erc4337/index": "src/core/erc4337/index.ts",
- "auth/passkey/index": "src/auth/passkey/index.ts",
- "server/index": "src/server/index.ts",
- },
- format: ["cjs", "esm"],
- dts: true,
- splitting: false,
- sourcemap: true,
- clean: true,
- minify: false, // Keep readable for debugging initially
- treeshake: true,
- external: ["ethers", "@simplewebauthn/browser"],
-});
diff --git a/sdk/verify-dist.js b/sdk/verify-dist.js
deleted file mode 100644
index 3442b30f..00000000
--- a/sdk/verify-dist.js
+++ /dev/null
@@ -1,13 +0,0 @@
-const sdk = require("./dist/index.js");
-
-try {
- if (sdk.YAAAClient) {
- console.log("SUCCESS: YAAAClient found in build output");
- } else {
- console.error("FAILURE: YAAAClient not found");
- process.exit(1);
- }
-} catch (e) {
- console.error(e);
- process.exit(1);
-}