From d233118cad886bd6e3483574508ab893cb225adf Mon Sep 17 00:00:00 2001
From: Matvii Nesterenko <51422901+kapustazh@users.noreply.github.com>
Date: Thu, 10 Sep 2026 00:11:07 +0200
Subject: [PATCH 01/10] feat(web): define the operator session port
---
apps/web/src/auth/session.ts | 32 +++++++++++++++++++++++++++
apps/web/test/session.test.ts | 24 ++++++++++++++++++++
apps/web/test/support/fake-session.ts | 19 ++++++++++++++++
3 files changed, 75 insertions(+)
create mode 100644 apps/web/src/auth/session.ts
create mode 100644 apps/web/test/session.test.ts
create mode 100644 apps/web/test/support/fake-session.ts
diff --git a/apps/web/src/auth/session.ts b/apps/web/src/auth/session.ts
new file mode 100644
index 0000000..59f422a
--- /dev/null
+++ b/apps/web/src/auth/session.ts
@@ -0,0 +1,32 @@
+export type OperatorSessionStatus = 'UNCONFIGURED' | 'LOADING' | 'SIGNED_OUT' | 'SIGNED_IN';
+
+/**
+ * The console's view of operator identity. The access token is held as a plain
+ * value so the three API clients keep their synchronous `getAuthToken` port;
+ * the adapter refreshes it well inside the token's one-hour lifetime.
+ */
+export interface OperatorSession {
+ readonly status: OperatorSessionStatus;
+ readonly subject: string | null;
+ readonly accessToken: string | null;
+ login(): void;
+ logout(): void;
+}
+
+export type UseOperatorSession = () => OperatorSession;
+
+export const unconfiguredOperatorSession: UseOperatorSession = () => ({
+ status: 'UNCONFIGURED',
+ subject: null,
+ accessToken: null,
+ login() {},
+ logout() {},
+});
+
+/**
+ * A Privy session always wins over a typed machine token, so an operator who is
+ * signed in cannot accidentally act under a shared service credential.
+ */
+export function selectCredential(session: OperatorSession, machineToken: string): string | null {
+ return session.accessToken ?? (machineToken.trim() || null);
+}
diff --git a/apps/web/test/session.test.ts b/apps/web/test/session.test.ts
new file mode 100644
index 0000000..52ba640
--- /dev/null
+++ b/apps/web/test/session.test.ts
@@ -0,0 +1,24 @@
+import { describe, expect, it } from 'vitest';
+import { selectCredential, unconfiguredOperatorSession } from '../src/auth/session.js';
+import { fakeSession, signedInSession } from './support/fake-session.js';
+
+describe('selectCredential', () => {
+ it('prefers the Privy access token over a typed machine token', () => {
+ expect(selectCredential(signedInSession('did:privy:x', 'aaa.bbb.ccc'), 'machine')).toBe(
+ 'aaa.bbb.ccc',
+ );
+ });
+
+ it('falls back to the machine token when there is no session token', () => {
+ expect(selectCredential(fakeSession(), 'machine-token')).toBe('machine-token');
+ });
+
+ it('trims a machine token and treats whitespace as absent', () => {
+ expect(selectCredential(fakeSession(), ' machine-token ')).toBe('machine-token');
+ expect(selectCredential(fakeSession(), ' ')).toBeNull();
+ });
+
+ it('returns null when neither credential exists', () => {
+ expect(selectCredential(unconfiguredOperatorSession(), '')).toBeNull();
+ });
+});
diff --git a/apps/web/test/support/fake-session.ts b/apps/web/test/support/fake-session.ts
new file mode 100644
index 0000000..db8a950
--- /dev/null
+++ b/apps/web/test/support/fake-session.ts
@@ -0,0 +1,19 @@
+import type { OperatorSession } from '../../src/auth/session.js';
+
+export function fakeSession(overrides: Partial = {}): OperatorSession {
+ return {
+ status: 'SIGNED_OUT',
+ subject: null,
+ accessToken: null,
+ login() {},
+ logout() {},
+ ...overrides,
+ };
+}
+
+export function signedInSession(
+ subject = 'did:privy:test-operator',
+ accessToken = 'header.payload.signature',
+): OperatorSession {
+ return fakeSession({ status: 'SIGNED_IN', subject, accessToken });
+}
From abc7454a35ee477ff1409c7bacd0a96555706460 Mon Sep 17 00:00:00 2001
From: Matvii Nesterenko <51422901+kapustazh@users.noreply.github.com>
Date: Thu, 10 Sep 2026 00:18:48 +0200
Subject: [PATCH 02/10] feat(web): gate the console behind an operator sign-in
surface
---
apps/web/src/components/LoginGate.tsx | 96 +++++++++++++++++++++++
apps/web/src/styles.css | 24 ++++++
apps/web/test/login-gate.test.tsx | 106 ++++++++++++++++++++++++++
3 files changed, 226 insertions(+)
create mode 100644 apps/web/src/components/LoginGate.tsx
create mode 100644 apps/web/test/login-gate.test.tsx
diff --git a/apps/web/src/components/LoginGate.tsx b/apps/web/src/components/LoginGate.tsx
new file mode 100644
index 0000000..9abf4e7
--- /dev/null
+++ b/apps/web/src/components/LoginGate.tsx
@@ -0,0 +1,96 @@
+import { useState, type ReactNode } from 'react';
+import type { OperatorSession } from '../auth/session.js';
+
+export interface LoginGateProps {
+ readonly session: OperatorSession;
+ readonly machineToken: string;
+ readonly onMachineTokenChange: (value: string) => void;
+ readonly children: ReactNode;
+}
+
+function MachineTokenField(props: {
+ readonly value: string;
+ readonly onChange: (value: string) => void;
+}) {
+ return (
+
+ Machine token (advanced)
+ Machine token
+ props.onChange(event.target.value)}
+ />
+
+ Memory only, never stored. Use the service token issued to the worker and agent clients.
+
+
+ );
+}
+
+export function LoginGate(props: LoginGateProps) {
+ const [copied, setCopied] = useState(false);
+ const machineTokenPresent = props.machineToken.trim().length > 0;
+ const unlocked = props.session.status === 'SIGNED_IN' || machineTokenPresent;
+
+ async function copySubject(subject: string): Promise {
+ try {
+ await navigator.clipboard?.writeText(subject);
+ setCopied(true);
+ } catch {
+ setCopied(false);
+ }
+ }
+
+ if (!unlocked) {
+ return (
+
+ {props.session.status === 'LOADING' ? (
+ Checking your session…
+ ) : props.session.status === 'UNCONFIGURED' ? (
+
+ Privy login is not configured for this build. Set VITE_PRIVY_APP_ID to
+ enable it.
+
+ ) : (
+ <>
+ Operator sign-in
+ The console reads authoritative payment state. Sign in to continue.
+ props.session.login()}>
+ Sign in with Privy
+
+ >
+ )}
+
+
+ );
+ }
+
+ return (
+ <>
+
+ {props.session.status === 'SIGNED_IN' && props.session.subject ? (
+ <>
+ Signed in as
+ {props.session.subject}
+ void copySubject(props.session.subject ?? '')}>
+ {copied ? 'Copied' : 'Copy DID'}
+
+ Add this DID to PRIVY_AUTH_ALLOWED_SUBJECTS to grant console access.
+ props.session.logout()}>
+ Sign out
+
+ >
+ ) : (
+ <>
+ Using a machine token
+
+ >
+ )}
+
+ {props.children}
+ >
+ );
+}
diff --git a/apps/web/src/styles.css b/apps/web/src/styles.css
index 4070894..7bc8689 100644
--- a/apps/web/src/styles.css
+++ b/apps/web/src/styles.css
@@ -410,6 +410,30 @@ p {
border: 0;
}
+.login-gate {
+ display: grid;
+ gap: 0.75rem;
+ padding: 1.5rem;
+ border: 1px solid var(--border, #d0d5dd);
+ border-radius: 8px;
+}
+
+.operator-identity {
+ display: flex;
+ flex-wrap: wrap;
+ align-items: center;
+ gap: 0.5rem;
+ padding: 0.5rem 0;
+}
+
+.operator-identity code {
+ overflow-wrap: anywhere;
+}
+
+.machine-token summary {
+ cursor: pointer;
+}
+
@media (max-width: 640px) {
.app-shell {
width: min(100% - 1rem, 880px);
diff --git a/apps/web/test/login-gate.test.tsx b/apps/web/test/login-gate.test.tsx
new file mode 100644
index 0000000..59964a0
--- /dev/null
+++ b/apps/web/test/login-gate.test.tsx
@@ -0,0 +1,106 @@
+import { cleanup, render, screen } from '@testing-library/react';
+import userEvent from '@testing-library/user-event';
+import { afterEach, describe, expect, it, vi } from 'vitest';
+
+import { LoginGate } from '../src/components/LoginGate.js';
+import { fakeSession, signedInSession } from './support/fake-session.js';
+
+afterEach(cleanup);
+
+const CONSOLE_TEXT = 'console contents';
+
+describe('LoginGate', () => {
+ it('hides the console and offers Privy sign-in when signed out', () => {
+ render(
+ {}}>
+ {CONSOLE_TEXT}
+ ,
+ );
+ expect(screen.queryByText(CONSOLE_TEXT)).toBeNull();
+ expect(screen.getByRole('button', { name: 'Sign in with Privy' })).toBeTruthy();
+ });
+
+ it('calls login when the sign-in button is pressed', async () => {
+ const login = vi.fn();
+ const user = userEvent.setup();
+ render(
+ {}}>
+ {CONSOLE_TEXT}
+ ,
+ );
+ await user.click(screen.getByRole('button', { name: 'Sign in with Privy' }));
+ expect(login).toHaveBeenCalledTimes(1);
+ });
+
+ it('shows the console and the operator DID when signed in', () => {
+ render(
+ {}}
+ >
+ {CONSOLE_TEXT}
+ ,
+ );
+ expect(screen.getByText(CONSOLE_TEXT)).toBeTruthy();
+ expect(screen.getByText('did:privy:abc123')).toBeTruthy();
+ });
+
+ it('never renders the access token', () => {
+ const { container } = render(
+ {}}
+ >
+ {CONSOLE_TEXT}
+ ,
+ );
+ expect(container.textContent).not.toContain('secret.token.value');
+ });
+
+ it('explains that Privy is not configured and still allows a machine token', async () => {
+ const onMachineTokenChange = vi.fn();
+ const user = userEvent.setup();
+ render(
+
+ {CONSOLE_TEXT}
+ ,
+ );
+ expect(screen.getByText(/Privy login is not configured/i)).toBeTruthy();
+ expect(screen.queryByRole('button', { name: 'Sign in with Privy' })).toBeNull();
+ await user.type(screen.getByLabelText('Machine token'), 'x');
+ expect(onMachineTokenChange).toHaveBeenCalled();
+ });
+
+ it('unlocks the console when a machine token is present', () => {
+ render(
+ {}}
+ >
+ {CONSOLE_TEXT}
+ ,
+ );
+ expect(screen.getByText(CONSOLE_TEXT)).toBeTruthy();
+ });
+
+ it('shows a loading state while the session resolves', () => {
+ render(
+ {}}
+ >
+ {CONSOLE_TEXT}
+ ,
+ );
+ expect(screen.queryByText(CONSOLE_TEXT)).toBeNull();
+ expect(screen.getByText(/Checking your session/i)).toBeTruthy();
+ });
+});
From 50511507a9f66785f807d0f6dda9a654745a7dab Mon Sep 17 00:00:00 2001
From: Matvii Nesterenko <51422901+kapustazh@users.noreply.github.com>
Date: Thu, 10 Sep 2026 00:40:44 +0200
Subject: [PATCH 03/10] feat(api): verify Privy access tokens against an
operator allowlist
---
apps/api/package.json | 1 +
apps/api/src/index.ts | 1 +
apps/api/src/privy-auth.ts | 73 ++++++++++++++++++++
apps/api/test/privy-auth.test.ts | 113 +++++++++++++++++++++++++++++++
pnpm-lock.yaml | 3 +
5 files changed, 191 insertions(+)
create mode 100644 apps/api/src/privy-auth.ts
create mode 100644 apps/api/test/privy-auth.test.ts
diff --git a/apps/api/package.json b/apps/api/package.json
index 5fd7a30..215c0a4 100644
--- a/apps/api/package.json
+++ b/apps/api/package.json
@@ -25,6 +25,7 @@
"@oneshot/contracts": "workspace:*",
"@oneshot/storage-postgres": "workspace:*",
"fastify": "5.12.3",
+ "jose": "6.2.12",
"pg": "8.23.0"
},
"devDependencies": {
diff --git a/apps/api/src/index.ts b/apps/api/src/index.ts
index 7843a79..28e3bc0 100644
--- a/apps/api/src/index.ts
+++ b/apps/api/src/index.ts
@@ -1,5 +1,6 @@
export * from './app.js';
export * from './auth.js';
export * from './config.js';
+export * from './privy-auth.js';
export * from './rate-limit.js';
export * from './runtime.js';
diff --git a/apps/api/src/privy-auth.ts b/apps/api/src/privy-auth.ts
new file mode 100644
index 0000000..eb62e7c
--- /dev/null
+++ b/apps/api/src/privy-auth.ts
@@ -0,0 +1,73 @@
+import { importSPKI, jwtVerify } from 'jose';
+import type { ServiceAuthenticator } from './auth.js';
+
+export const PRIVY_ISSUER = 'privy.io';
+export const PRIVY_DID_PREFIX = 'did:privy:';
+
+const BEARER_PREFIX = 'Bearer ';
+const BASE64URL_SEGMENT = /^[A-Za-z0-9_-]+$/;
+
+export interface PrivyAccessTokenAuthenticatorConfig {
+ readonly appId: string;
+ readonly verificationKey: string;
+ readonly allowedSubjects: readonly string[];
+ readonly clockToleranceSeconds?: number;
+ readonly onForbiddenSubject?: (subject: string) => void;
+}
+
+export function looksLikeJwt(token: string): boolean {
+ const parts = token.split('.');
+ return parts.length === 3 && parts.every((part) => BASE64URL_SEGMENT.test(part));
+}
+
+function bearerToken(authorization: string | undefined): string | null {
+ if (!authorization?.startsWith(BEARER_PREFIX)) return null;
+ const token = authorization.slice(BEARER_PREFIX.length);
+ return token.length > 0 ? token : null;
+}
+
+export function isJwtCredential(authorization: string | undefined): boolean {
+ const token = bearerToken(authorization);
+ return token !== null && looksLikeJwt(token);
+}
+
+export function createPrivyAccessTokenAuthenticator(
+ config: PrivyAccessTokenAuthenticatorConfig,
+): ServiceAuthenticator {
+ if (config.appId.trim().length === 0) throw new Error('Privy app id must not be empty');
+ if (config.allowedSubjects.length === 0) {
+ throw new Error('Privy operator allowlist must not be empty');
+ }
+ const allowed = new Set(config.allowedSubjects);
+ const clockTolerance = config.clockToleranceSeconds ?? 60;
+ const keyPromise = importSPKI(config.verificationKey, 'ES256');
+ // An unusable key must not become an unhandled rejection before the first request.
+ void keyPromise.catch(() => undefined);
+
+ return {
+ async authenticate(authorization) {
+ const token = bearerToken(authorization);
+ if (token === null || !looksLikeJwt(token)) return 'UNAUTHORIZED';
+
+ let subject: string | undefined;
+ try {
+ const { payload } = await jwtVerify(token, await keyPromise, {
+ algorithms: ['ES256'],
+ issuer: PRIVY_ISSUER,
+ audience: config.appId,
+ clockTolerance,
+ });
+ subject = payload.sub;
+ } catch {
+ return 'UNAUTHORIZED';
+ }
+
+ if (subject === undefined || subject.length === 0) return 'UNAUTHORIZED';
+ if (!allowed.has(subject)) {
+ config.onForbiddenSubject?.(subject);
+ return 'FORBIDDEN';
+ }
+ return 'AUTHORIZED';
+ },
+ };
+}
diff --git a/apps/api/test/privy-auth.test.ts b/apps/api/test/privy-auth.test.ts
new file mode 100644
index 0000000..2fa5ac4
--- /dev/null
+++ b/apps/api/test/privy-auth.test.ts
@@ -0,0 +1,113 @@
+import { beforeAll, describe, expect, it } from 'vitest';
+import { exportSPKI, generateKeyPair, SignJWT } from 'jose';
+
+type GeneratedPrivateKey = Awaited>['privateKey'];
+import { createPrivyAccessTokenAuthenticator, looksLikeJwt } from '../src/privy-auth.js';
+
+const APP_ID = 'test-app-id';
+const OPERATOR = 'did:privy:operator-one';
+const OUTSIDER = 'did:privy:operator-two';
+
+let privateKey: GeneratedPrivateKey;
+let verificationKey: string;
+
+beforeAll(async () => {
+ const pair = await generateKeyPair('ES256', { extractable: true });
+ privateKey = pair.privateKey;
+ verificationKey = await exportSPKI(pair.publicKey);
+});
+
+async function sign(
+ options: {
+ subject?: string;
+ issuer?: string;
+ audience?: string;
+ expiresIn?: string;
+ } = {},
+): Promise {
+ return new SignJWT({})
+ .setProtectedHeader({ alg: 'ES256' })
+ .setSubject(options.subject ?? OPERATOR)
+ .setIssuer(options.issuer ?? 'privy.io')
+ .setAudience(options.audience ?? APP_ID)
+ .setIssuedAt()
+ .setExpirationTime(options.expiresIn ?? '1h')
+ .sign(privateKey);
+}
+
+function authenticator(overrides: { onForbiddenSubject?: (subject: string) => void } = {}) {
+ return createPrivyAccessTokenAuthenticator({
+ appId: APP_ID,
+ verificationKey,
+ allowedSubjects: [OPERATOR],
+ ...overrides,
+ });
+}
+
+describe('Privy access token authenticator', () => {
+ it('authorizes an allowlisted operator', async () => {
+ const token = await sign();
+ expect(await authenticator().authenticate(`Bearer ${token}`)).toBe('AUTHORIZED');
+ });
+
+ it('forbids a verified but unlisted subject', async () => {
+ const seen: string[] = [];
+ const token = await sign({ subject: OUTSIDER });
+ const decision = await authenticator({
+ onForbiddenSubject: (subject) => seen.push(subject),
+ }).authenticate(`Bearer ${token}`);
+ expect(decision).toBe('FORBIDDEN');
+ expect(seen).toEqual([OUTSIDER]);
+ });
+
+ it('rejects a wrong audience', async () => {
+ const token = await sign({ audience: 'someone-elses-app' });
+ expect(await authenticator().authenticate(`Bearer ${token}`)).toBe('UNAUTHORIZED');
+ });
+
+ it('rejects a wrong issuer', async () => {
+ const token = await sign({ issuer: 'evil.example' });
+ expect(await authenticator().authenticate(`Bearer ${token}`)).toBe('UNAUTHORIZED');
+ });
+
+ it('rejects an expired token', async () => {
+ const token = await sign({ expiresIn: '-10m' });
+ expect(await authenticator().authenticate(`Bearer ${token}`)).toBe('UNAUTHORIZED');
+ });
+
+ it('rejects a tampered signature', async () => {
+ const token = await sign();
+ const parts = token.split('.');
+ const flipped = parts[2]?.startsWith('A') ? `B${parts[2].slice(1)}` : `A${parts[2]?.slice(1)}`;
+ expect(await authenticator().authenticate(`Bearer ${parts[0]}.${parts[1]}.${flipped}`)).toBe(
+ 'UNAUTHORIZED',
+ );
+ });
+
+ it('rejects an unsigned token that claims alg none', async () => {
+ const header = Buffer.from(JSON.stringify({ alg: 'none', typ: 'JWT' })).toString('base64url');
+ const payload = Buffer.from(
+ JSON.stringify({ sub: OPERATOR, iss: 'privy.io', aud: APP_ID, exp: 4_102_444_800 }),
+ ).toString('base64url');
+ expect(await authenticator().authenticate(`Bearer ${header}.${payload}.`)).toBe('UNAUTHORIZED');
+ });
+
+ it('rejects a missing or malformed authorization header', async () => {
+ expect(await authenticator().authenticate(undefined)).toBe('UNAUTHORIZED');
+ expect(await authenticator().authenticate('Bearer not-a-jwt')).toBe('UNAUTHORIZED');
+ expect(await authenticator().authenticate('Basic abc.def.ghi')).toBe('UNAUTHORIZED');
+ });
+
+ it('refuses to construct without an allowlist', () => {
+ expect(() =>
+ createPrivyAccessTokenAuthenticator({ appId: APP_ID, verificationKey, allowedSubjects: [] }),
+ ).toThrow('allowlist');
+ });
+
+ it('recognizes JWT shape', () => {
+ expect(looksLikeJwt('aaa.bbb.ccc')).toBe(true);
+ expect(looksLikeJwt('opaque-service-token')).toBe(false);
+ expect(looksLikeJwt('aaa.bbb')).toBe(false);
+ expect(looksLikeJwt('aaa..ccc')).toBe(false);
+ });
+});
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 1cd7374..0f51ce1 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -60,6 +60,9 @@ importers:
fastify:
specifier: 5.12.3
version: 5.12.3
+ jose:
+ specifier: 6.2.12
+ version: 6.2.12
pg:
specifier: 8.23.0
version: 8.23.0
From c7504a8da389daf37d5c4a0d4deca2001db48dd6 Mon Sep 17 00:00:00 2001
From: Matvii Nesterenko <51422901+kapustazh@users.noreply.github.com>
Date: Thu, 10 Sep 2026 00:42:09 +0200
Subject: [PATCH 04/10] feat(api): route credentials to one authenticator by
token shape
---
apps/api/src/auth.ts | 21 ++++++++
apps/api/test/auth-routing.test.ts | 81 ++++++++++++++++++++++++++++++
2 files changed, 102 insertions(+)
create mode 100644 apps/api/test/auth-routing.test.ts
diff --git a/apps/api/src/auth.ts b/apps/api/src/auth.ts
index f6099cb..b60520e 100644
--- a/apps/api/src/auth.ts
+++ b/apps/api/src/auth.ts
@@ -18,3 +18,24 @@ export function staticBearerAuthenticator(expectedToken: string): ServiceAuthent
},
};
}
+
+export interface CredentialRoute {
+ readonly matches: (authorization: string | undefined) => boolean;
+ readonly authenticator: ServiceAuthenticator;
+}
+
+export function compositeAuthenticator(routes: readonly CredentialRoute[]): ServiceAuthenticator {
+ return {
+ async authenticate(authorization) {
+ if (!authorization) return 'UNAUTHORIZED';
+ let sawForbidden = false;
+ for (const route of routes) {
+ if (!route.matches(authorization)) continue;
+ const decision = await route.authenticator.authenticate(authorization);
+ if (decision === 'AUTHORIZED') return 'AUTHORIZED';
+ if (decision === 'FORBIDDEN') sawForbidden = true;
+ }
+ return sawForbidden ? 'FORBIDDEN' : 'UNAUTHORIZED';
+ },
+ };
+}
diff --git a/apps/api/test/auth-routing.test.ts b/apps/api/test/auth-routing.test.ts
new file mode 100644
index 0000000..393381c
--- /dev/null
+++ b/apps/api/test/auth-routing.test.ts
@@ -0,0 +1,81 @@
+import { describe, expect, it } from 'vitest';
+import type { AuthenticationDecision, ServiceAuthenticator } from '../src/auth.js';
+import { compositeAuthenticator, staticBearerAuthenticator } from '../src/auth.js';
+import { isJwtCredential } from '../src/privy-auth.js';
+
+function fixed(decision: AuthenticationDecision, calls: string[] = []): ServiceAuthenticator {
+ return {
+ async authenticate() {
+ calls.push(decision);
+ return decision;
+ },
+ };
+}
+
+describe('composite authenticator', () => {
+ it('returns AUTHORIZED when any eligible authenticator authorizes', async () => {
+ const auth = compositeAuthenticator([
+ { matches: () => true, authenticator: fixed('UNAUTHORIZED') },
+ { matches: () => true, authenticator: fixed('AUTHORIZED') },
+ ]);
+ expect(await auth.authenticate('Bearer anything')).toBe('AUTHORIZED');
+ });
+
+ it('prefers FORBIDDEN over UNAUTHORIZED when nothing authorizes', async () => {
+ const auth = compositeAuthenticator([
+ { matches: () => true, authenticator: fixed('UNAUTHORIZED') },
+ { matches: () => true, authenticator: fixed('FORBIDDEN') },
+ ]);
+ expect(await auth.authenticate('Bearer anything')).toBe('FORBIDDEN');
+ });
+
+ it('returns UNAUTHORIZED when no route matches', async () => {
+ const auth = compositeAuthenticator([
+ { matches: () => false, authenticator: fixed('AUTHORIZED') },
+ ]);
+ expect(await auth.authenticate('Bearer anything')).toBe('UNAUTHORIZED');
+ });
+
+ it('returns UNAUTHORIZED when the header is absent', async () => {
+ const auth = compositeAuthenticator([
+ { matches: () => true, authenticator: fixed('AUTHORIZED') },
+ ]);
+ expect(await auth.authenticate(undefined)).toBe('UNAUTHORIZED');
+ });
+
+ it('never shows an opaque service token to the JWT route', async () => {
+ const jwtCalls: string[] = [];
+ const bearerCalls: string[] = [];
+ const auth = compositeAuthenticator([
+ { matches: isJwtCredential, authenticator: fixed('FORBIDDEN', jwtCalls) },
+ {
+ matches: (authorization) => !isJwtCredential(authorization),
+ authenticator: fixed('AUTHORIZED', bearerCalls),
+ },
+ ]);
+ expect(await auth.authenticate('Bearer opaque-service-token')).toBe('AUTHORIZED');
+ expect(jwtCalls).toEqual([]);
+ expect(bearerCalls).toEqual(['AUTHORIZED']);
+ });
+
+ it('never shows a JWT to the constant-time bearer route', async () => {
+ const bearerCalls: string[] = [];
+ const auth = compositeAuthenticator([
+ { matches: isJwtCredential, authenticator: fixed('FORBIDDEN') },
+ {
+ matches: (authorization) => !isJwtCredential(authorization),
+ authenticator: fixed('AUTHORIZED', bearerCalls),
+ },
+ ]);
+ expect(await auth.authenticate('Bearer aaa.bbb.ccc')).toBe('FORBIDDEN');
+ expect(bearerCalls).toEqual([]);
+ });
+
+ it('leaves the existing static bearer behavior unchanged', async () => {
+ const bearer = staticBearerAuthenticator('service-token');
+ expect(await bearer.authenticate('Bearer service-token')).toBe('AUTHORIZED');
+ expect(await bearer.authenticate('Bearer wrong-token-x')).toBe('FORBIDDEN');
+ expect(await bearer.authenticate('Bearer short')).toBe('UNAUTHORIZED');
+ expect(await bearer.authenticate(undefined)).toBe('UNAUTHORIZED');
+ });
+});
From fc1d68ce0bba7d9c6cdc3735004d6e731fd99bbd Mon Sep 17 00:00:00 2001
From: Matvii Nesterenko <51422901+kapustazh@users.noreply.github.com>
Date: Thu, 10 Sep 2026 00:44:25 +0200
Subject: [PATCH 05/10] feat(api): load and validate Privy operator auth
configuration
---
apps/api/src/config.ts | 55 +++++++++++++++++++++
apps/api/test/config.test.ts | 96 ++++++++++++++++++++++++++++++++++++
2 files changed, 151 insertions(+)
diff --git a/apps/api/src/config.ts b/apps/api/src/config.ts
index 68dd48b..ba565d2 100644
--- a/apps/api/src/config.ts
+++ b/apps/api/src/config.ts
@@ -1,4 +1,12 @@
+import { createPublicKey } from 'node:crypto';
import type { PoolConfig } from 'pg';
+import { PRIVY_DID_PREFIX } from './privy-auth.js';
+
+export interface PrivyAuthRuntimeConfig {
+ readonly appId: string;
+ readonly verificationKey: string;
+ readonly allowedSubjects: readonly string[];
+}
export interface ApiRuntimeConfig {
readonly host: string;
@@ -6,6 +14,7 @@ export interface ApiRuntimeConfig {
readonly serviceBearerToken: string;
readonly database: PoolConfig;
readonly submissionsDisabled: boolean;
+ readonly privyAuth?: PrivyAuthRuntimeConfig;
}
function required(environment: NodeJS.ProcessEnv, name: string): string {
@@ -53,14 +62,60 @@ function databaseConfig(environment: NodeJS.ProcessEnv): PoolConfig {
};
}
+function normalizeVerificationKey(raw: string): string {
+ const normalized = raw.replace(/\\n/g, '\n').trim();
+ const key = createPublicKey(normalized);
+ if (key.asymmetricKeyType !== 'ec' || key.asymmetricKeyDetails?.namedCurve !== 'prime256v1') {
+ throw new Error('PRIVY_AUTH_VERIFICATION_KEY must be an EC P-256 (ES256) public key');
+ }
+ return normalized;
+}
+
+function privyAuthConfig(environment: NodeJS.ProcessEnv): PrivyAuthRuntimeConfig | undefined {
+ const appId = environment.PRIVY_AUTH_APP_ID?.trim() ?? '';
+ const rawKey = environment.PRIVY_AUTH_VERIFICATION_KEY?.trim() ?? '';
+ const rawSubjects = environment.PRIVY_AUTH_ALLOWED_SUBJECTS?.trim() ?? '';
+ if (appId.length === 0 && rawKey.length === 0 && rawSubjects.length === 0) return undefined;
+
+ if (appId.length === 0)
+ throw new Error('Missing required environment variable: PRIVY_AUTH_APP_ID');
+ if (rawKey.length === 0) {
+ throw new Error('Missing required environment variable: PRIVY_AUTH_VERIFICATION_KEY');
+ }
+ if (rawSubjects.length === 0) {
+ throw new Error('Missing required environment variable: PRIVY_AUTH_ALLOWED_SUBJECTS');
+ }
+
+ const allowedSubjects = [
+ ...new Set(
+ rawSubjects
+ .split(',')
+ .map((subject) => subject.trim())
+ .filter((subject) => subject.length > 0),
+ ),
+ ];
+ if (allowedSubjects.length === 0) {
+ throw new Error('PRIVY_AUTH_ALLOWED_SUBJECTS must list at least one Privy DID');
+ }
+ for (const subject of allowedSubjects) {
+ if (!subject.startsWith(PRIVY_DID_PREFIX)) {
+ throw new Error(`PRIVY_AUTH_ALLOWED_SUBJECTS entries must start with ${PRIVY_DID_PREFIX}`);
+ }
+ }
+
+ return { appId, verificationKey: normalizeVerificationKey(rawKey), allowedSubjects };
+}
+
export function loadApiRuntimeConfig(
environment: NodeJS.ProcessEnv = process.env,
): ApiRuntimeConfig {
+ const privyAuth = privyAuthConfig(environment);
return {
host: environment.HOST?.trim() || '0.0.0.0',
port: integer(environment, 'PORT', 3000, 1, 65_535),
serviceBearerToken: required(environment, 'SERVICE_BEARER_TOKEN'),
database: databaseConfig(environment),
submissionsDisabled: environment.ONESHOT_SUBMISSIONS_DISABLED === 'true',
+ ...(privyAuth ? { privyAuth } : {}),
};
}
diff --git a/apps/api/test/config.test.ts b/apps/api/test/config.test.ts
index 4a86204..d0959bc 100644
--- a/apps/api/test/config.test.ts
+++ b/apps/api/test/config.test.ts
@@ -1,7 +1,19 @@
+import { generateKeyPairSync } from 'node:crypto';
import { describe, expect, it } from 'vitest';
import { loadApiRuntimeConfig } from '../src/config.js';
describe('API runtime configuration', () => {
+ const testKey = generateKeyPairSync('ec', {
+ namedCurve: 'prime256v1',
+ publicKeyEncoding: { type: 'spki', format: 'pem' },
+ privateKeyEncoding: { type: 'pkcs8', format: 'pem' },
+ }).publicKey;
+
+ const base = {
+ DATABASE_URL: 'postgresql://oneshot:secret@localhost:5432/oneshot',
+ SERVICE_BEARER_TOKEN: 'service-token',
+ };
+
it('uses DATABASE_URL for local and managed TCP PostgreSQL', () => {
const config = loadApiRuntimeConfig({
DATABASE_URL: 'postgresql://oneshot:secret@localhost:5432/oneshot',
@@ -42,4 +54,88 @@ describe('API runtime configuration', () => {
'Database configuration requires',
);
});
+
+ it('leaves Privy login disabled when no Privy variable is set', () => {
+ const config = loadApiRuntimeConfig({ ...base });
+ expect(config.privyAuth).toBeUndefined();
+ expect(config.serviceBearerToken).toBe('service-token');
+ });
+
+ it('loads a complete Privy configuration', () => {
+ const config = loadApiRuntimeConfig({
+ ...base,
+ PRIVY_AUTH_APP_ID: 'cmtqbf5zo013w0cky3r0jqjca',
+ PRIVY_AUTH_VERIFICATION_KEY: testKey,
+ PRIVY_AUTH_ALLOWED_SUBJECTS: 'did:privy:one, did:privy:two ,did:privy:one',
+ });
+ expect(config.privyAuth?.appId).toBe('cmtqbf5zo013w0cky3r0jqjca');
+ expect(config.privyAuth?.allowedSubjects).toEqual(['did:privy:one', 'did:privy:two']);
+ expect(config.privyAuth?.verificationKey).toContain('BEGIN PUBLIC KEY');
+ });
+
+ it('accepts a verification key carrying escaped newlines', () => {
+ const config = loadApiRuntimeConfig({
+ ...base,
+ PRIVY_AUTH_APP_ID: 'app',
+ PRIVY_AUTH_VERIFICATION_KEY: testKey.trimEnd().replace(/\n/g, '\\n'),
+ PRIVY_AUTH_ALLOWED_SUBJECTS: 'did:privy:one',
+ });
+ expect(config.privyAuth?.verificationKey.split('\n').length).toBeGreaterThan(2);
+ });
+
+ it('refuses to start on partial Privy configuration', () => {
+ expect(() => loadApiRuntimeConfig({ ...base, PRIVY_AUTH_APP_ID: 'app' })).toThrow(
+ 'PRIVY_AUTH_VERIFICATION_KEY',
+ );
+ expect(() =>
+ loadApiRuntimeConfig({
+ ...base,
+ PRIVY_AUTH_APP_ID: 'app',
+ PRIVY_AUTH_VERIFICATION_KEY: testKey,
+ }),
+ ).toThrow('PRIVY_AUTH_ALLOWED_SUBJECTS');
+ expect(() =>
+ loadApiRuntimeConfig({
+ ...base,
+ PRIVY_AUTH_APP_ID: 'app',
+ PRIVY_AUTH_VERIFICATION_KEY: testKey,
+ PRIVY_AUTH_ALLOWED_SUBJECTS: ' ',
+ }),
+ ).toThrow('PRIVY_AUTH_ALLOWED_SUBJECTS');
+ });
+
+ it('rejects an allowlist entry that is not a Privy DID', () => {
+ expect(() =>
+ loadApiRuntimeConfig({
+ ...base,
+ PRIVY_AUTH_APP_ID: 'app',
+ PRIVY_AUTH_VERIFICATION_KEY: testKey,
+ PRIVY_AUTH_ALLOWED_SUBJECTS: 'operator@example.com',
+ }),
+ ).toThrow('did:privy:');
+ });
+
+ it('rejects a verification key that is not an EC P-256 public key', () => {
+ const rsa = generateKeyPairSync('rsa', {
+ modulusLength: 2048,
+ publicKeyEncoding: { type: 'spki', format: 'pem' },
+ privateKeyEncoding: { type: 'pkcs8', format: 'pem' },
+ }).publicKey;
+ expect(() =>
+ loadApiRuntimeConfig({
+ ...base,
+ PRIVY_AUTH_APP_ID: 'app',
+ PRIVY_AUTH_VERIFICATION_KEY: rsa,
+ PRIVY_AUTH_ALLOWED_SUBJECTS: 'did:privy:one',
+ }),
+ ).toThrow('P-256');
+ expect(() =>
+ loadApiRuntimeConfig({
+ ...base,
+ PRIVY_AUTH_APP_ID: 'app',
+ PRIVY_AUTH_VERIFICATION_KEY: 'not a key at all',
+ PRIVY_AUTH_ALLOWED_SUBJECTS: 'did:privy:one',
+ }),
+ ).toThrow();
+ });
});
From 654fc9bfc0afeda3181d5430ef271be98b4ad283 Mon Sep 17 00:00:00 2001
From: Matvii Nesterenko <51422901+kapustazh@users.noreply.github.com>
Date: Thu, 10 Sep 2026 00:46:09 +0200
Subject: [PATCH 06/10] feat(api): compose Privy and service-bearer
authenticators at runtime
---
apps/api/src/runtime.ts | 29 ++++++++++++-
apps/api/test/app.test.ts | 28 +++++++++++++
apps/api/test/runtime-auth.test.ts | 66 ++++++++++++++++++++++++++++++
3 files changed, 121 insertions(+), 2 deletions(-)
create mode 100644 apps/api/test/runtime-auth.test.ts
diff --git a/apps/api/src/runtime.ts b/apps/api/src/runtime.ts
index 28ada53..7032f50 100644
--- a/apps/api/src/runtime.ts
+++ b/apps/api/src/runtime.ts
@@ -2,14 +2,39 @@ import { randomUUID } from 'node:crypto';
import { IntentLedger, migrate } from '@oneshot/storage-postgres';
import { Pool } from 'pg';
import { buildApi } from './app.js';
-import { staticBearerAuthenticator } from './auth.js';
+import {
+ compositeAuthenticator,
+ staticBearerAuthenticator,
+ type ServiceAuthenticator,
+} from './auth.js';
import { loadApiRuntimeConfig, type ApiRuntimeConfig } from './config.js';
+import { createPrivyAccessTokenAuthenticator, isJwtCredential } from './privy-auth.js';
export interface ApiRuntime {
readonly address: string;
close(): Promise;
}
+export function buildApiAuthenticator(
+ config: ApiRuntimeConfig,
+ log: (line: string) => void = (line) => process.stderr.write(line),
+): ServiceAuthenticator {
+ const bearer = staticBearerAuthenticator(config.serviceBearerToken);
+ if (!config.privyAuth) return bearer;
+
+ const privy = createPrivyAccessTokenAuthenticator({
+ ...config.privyAuth,
+ onForbiddenSubject: (subject) => {
+ log(`privy operator is not allowlisted: ${subject}\n`);
+ },
+ });
+
+ return compositeAuthenticator([
+ { matches: isJwtCredential, authenticator: privy },
+ { matches: (authorization) => !isJwtCredential(authorization), authenticator: bearer },
+ ]);
+}
+
export async function startApiRuntime(config: ApiRuntimeConfig): Promise {
const pool = new Pool(config.database);
try {
@@ -20,7 +45,7 @@ export async function startApiRuntime(config: ApiRuntimeConfig): Promise {
+ it('never reaches the ledger when the credential is forbidden', async () => {
+ const calls: string[] = [];
+ const app = buildApi({
+ ledger: createMockLedger({
+ async enqueueReconciliation() {
+ calls.push('enqueueReconciliation');
+ return { business_intent_id: 'intent-api-1', queued: true, state: 'UNKNOWN' };
+ },
+ }),
+ authenticator: {
+ async authenticate() {
+ return 'FORBIDDEN';
+ },
+ },
+ });
+
+ const response = await app.inject({
+ method: 'POST',
+ url: '/v1/intents/intent-api-1/reconcile',
+ headers: { authorization: 'Bearer aaa.bbb.ccc' },
+ });
+
+ expect(response.statusCode).toBe(403);
+ expect(response.json().code).toBe('FORBIDDEN');
+ expect(calls).toEqual([]);
+ await app.close();
+ });
+
it('requires service authentication and returns a sanitized error', async () => {
const app = buildApi({
ledger: createMockLedger(),
diff --git a/apps/api/test/runtime-auth.test.ts b/apps/api/test/runtime-auth.test.ts
new file mode 100644
index 0000000..9866a6d
--- /dev/null
+++ b/apps/api/test/runtime-auth.test.ts
@@ -0,0 +1,66 @@
+import { beforeAll, describe, expect, it } from 'vitest';
+import { exportSPKI, generateKeyPair, SignJWT } from 'jose';
+
+type GeneratedPrivateKey = Awaited>['privateKey'];
+import type { ApiRuntimeConfig } from '../src/config.js';
+import { buildApiAuthenticator } from '../src/runtime.js';
+
+const APP_ID = 'cmtqbf5zo013w0cky3r0jqjca';
+const OPERATOR = 'did:privy:allowed-operator';
+
+let privateKey: GeneratedPrivateKey;
+let verificationKey: string;
+
+beforeAll(async () => {
+ const pair = await generateKeyPair('ES256', { extractable: true });
+ privateKey = pair.privateKey;
+ verificationKey = await exportSPKI(pair.publicKey);
+});
+
+function config(privyEnabled: boolean): ApiRuntimeConfig {
+ return {
+ host: '0.0.0.0',
+ port: 3000,
+ serviceBearerToken: 'service-token',
+ database: { connectionString: 'postgresql://localhost/oneshot' },
+ submissionsDisabled: false,
+ ...(privyEnabled
+ ? { privyAuth: { appId: APP_ID, verificationKey, allowedSubjects: [OPERATOR] } }
+ : {}),
+ };
+}
+
+async function token(subject: string): Promise {
+ return new SignJWT({})
+ .setProtectedHeader({ alg: 'ES256' })
+ .setSubject(subject)
+ .setIssuer('privy.io')
+ .setAudience(APP_ID)
+ .setIssuedAt()
+ .setExpirationTime('1h')
+ .sign(privateKey);
+}
+
+describe('API authenticator composition', () => {
+ it('accepts only the service bearer when Privy is disabled', async () => {
+ const auth = buildApiAuthenticator(config(false));
+ expect(await auth.authenticate('Bearer service-token')).toBe('AUTHORIZED');
+ expect(await auth.authenticate(`Bearer ${await token(OPERATOR)}`)).toBe('UNAUTHORIZED');
+ });
+
+ it('accepts both credential classes when Privy is enabled', async () => {
+ const auth = buildApiAuthenticator(config(true));
+ expect(await auth.authenticate('Bearer service-token')).toBe('AUTHORIZED');
+ expect(await auth.authenticate(`Bearer ${await token(OPERATOR)}`)).toBe('AUTHORIZED');
+ });
+
+ it('logs the rejected subject without any token material', async () => {
+ const lines: string[] = [];
+ const auth = buildApiAuthenticator(config(true), (line) => lines.push(line));
+ const outsiderToken = await token('did:privy:outsider');
+ expect(await auth.authenticate(`Bearer ${outsiderToken}`)).toBe('FORBIDDEN');
+ expect(lines).toHaveLength(1);
+ expect(lines[0]).toContain('did:privy:outsider');
+ expect(lines[0]).not.toContain(outsiderToken);
+ });
+});
From cd46bd8cbf8842100d07d95968aa379ae8dc30c3 Mon Sep 17 00:00:00 2001
From: Matvii Nesterenko <51422901+kapustazh@users.noreply.github.com>
Date: Thu, 10 Sep 2026 00:51:04 +0200
Subject: [PATCH 07/10] feat(web): require an operator session before the
console renders
---
apps/web/browser/p5.spec.ts | 10 ++
apps/web/src/App.tsx | 140 ++++++++++++-------------
apps/web/test/app-auth.test.tsx | 90 ++++++++++++++++
apps/web/test/app-composition.test.tsx | 2 +
apps/web/test/composition.test.tsx | 8 +-
apps/web/test/gate-p5.spec.ts | 8 +-
6 files changed, 185 insertions(+), 73 deletions(-)
create mode 100644 apps/web/test/app-auth.test.tsx
diff --git a/apps/web/browser/p5.spec.ts b/apps/web/browser/p5.spec.ts
index cf04b4a..0097a5b 100644
--- a/apps/web/browser/p5.spec.ts
+++ b/apps/web/browser/p5.spec.ts
@@ -125,6 +125,12 @@ async function stubReadiness(page: Page): Promise {
await page.route('**/health/ready', (route) => json(route, 200, { status: 'ok' }));
}
+async function unlockConsole(page: Page, token = 'browser-memory-token'): Promise {
+ await page.getByText('Machine token (advanced)').click();
+ await page.getByLabel('Machine token').fill(token);
+ await expect(page.getByRole('tab', { name: 'Create or replay' })).toBeVisible();
+}
+
async function fillIntentForm(page: Page): Promise {
await page.getByLabel('Recipient').fill(RECIPIENT);
await page.getByLabel('Amount in USDC').fill('1.25');
@@ -173,6 +179,7 @@ test.describe('P5 composed operator experience', () => {
});
await page.goto('/');
+ await unlockConsole(page);
await expect(page.getByRole('tab', { name: 'Create or replay' })).toBeVisible();
await fillIntentForm(page);
await page.getByRole('button', { name: /Submit Intent/u }).click();
@@ -226,6 +233,7 @@ test.describe('P5 composed operator experience', () => {
});
await page.goto('/');
+ await unlockConsole(page);
await fillIntentForm(page);
await page.getByRole('button', { name: /Submit Intent/u }).click();
await expect(page.locator('.state-card > div:first-child > strong')).toHaveText('COMMITTED');
@@ -261,6 +269,7 @@ test.describe('P5 composed operator experience', () => {
await json(route, 200, match?.[2] ? recoveryView(id) : intent('UNKNOWN', id));
});
await page.goto('/');
+ await unlockConsole(page);
for (const [id, expected] of [
['intent-graph-discovery', 'FRESH'],
['intent-graph-lag', 'LAGGING'],
@@ -283,6 +292,7 @@ test.describe('P5 composed operator experience', () => {
test('covers keyboard tab navigation and responsive layout', async ({ page }) => {
await stubReadiness(page);
await page.goto('/');
+ await unlockConsole(page);
const createTab = page.getByRole('tab', { name: 'Create or replay' });
await createTab.focus();
await page.keyboard.press('ArrowRight');
diff --git a/apps/web/src/App.tsx b/apps/web/src/App.tsx
index 98d56ce..dc24707 100644
--- a/apps/web/src/App.tsx
+++ b/apps/web/src/App.tsx
@@ -1,4 +1,4 @@
-import { useMemo, useRef, useState, type KeyboardEvent } from 'react';
+import { useCallback, useMemo, useRef, useState, type KeyboardEvent } from 'react';
import { createSettlementClient, type SettlementClient } from '@oneshot/settlement-ui';
import type { RecoveryClient } from '@oneshot/recovery-ui';
import '@oneshot/recovery-ui/styles.css';
@@ -6,9 +6,15 @@ import '@oneshot/settlement-ui/styles.css';
import { OneShotApiClient } from './api/client.js';
import { createApiRecoveryClient } from './api/recovery-client.js';
+import {
+ selectCredential,
+ unconfiguredOperatorSession,
+ type UseOperatorSession,
+} from './auth/session.js';
import { ErrorBoundary } from './components/ErrorBoundary.js';
import { IntentForm } from './components/IntentForm.js';
import { IntentStatusView } from './components/IntentStatusView.js';
+import { LoginGate } from './components/LoginGate.js';
import { ReadinessBanner } from './components/ReadinessBanner.js';
import { RecoverySurface, SettlementSurface } from './components/FrontendSurfaces.js';
import './styles.css';
@@ -26,12 +32,18 @@ export interface AppProps {
readonly apiClient?: OneShotApiClient;
readonly settlementClient?: SettlementClient;
readonly recoveryClient?: RecoveryClient;
+ readonly useOperatorSession?: UseOperatorSession;
}
export function App(props: AppProps = {}) {
+ const useOperatorSession = props.useOperatorSession ?? unconfiguredOperatorSession;
+ const session = useOperatorSession();
const [activeTab, setActiveTab] = useState('create');
const [selectedIntentId, setSelectedIntentId] = useState('');
- const [authToken, setAuthToken] = useState('');
+ const [machineToken, setMachineToken] = useState('');
+ const credentialRef = useRef(null);
+ credentialRef.current = selectCredential(session, machineToken);
+ const getAuthToken = useCallback(() => credentialRef.current, []);
const tabRefs = useRef>({
create: null,
status: null,
@@ -40,28 +52,20 @@ export function App(props: AppProps = {}) {
});
const apiBaseUrl = import.meta.env.VITE_ONESHOT_API_BASE_URL ?? '';
const apiClient = useMemo(
- () =>
- props.apiClient ??
- new OneShotApiClient({ baseUrl: apiBaseUrl, getAuthToken: () => authToken.trim() || null }),
- [apiBaseUrl, authToken, props.apiClient],
+ () => props.apiClient ?? new OneShotApiClient({ baseUrl: apiBaseUrl, getAuthToken }),
+ [apiBaseUrl, getAuthToken, props.apiClient],
);
const settlementClient = useMemo(
() =>
props.settlementClient ??
- createSettlementClient({
- baseUrl: apiBaseUrl,
- getAuthToken: () => authToken.trim() || null,
- }),
- [apiBaseUrl, authToken, props.settlementClient],
+ createSettlementClient({ baseUrl: apiBaseUrl, getAuthToken }),
+ [apiBaseUrl, getAuthToken, props.settlementClient],
);
const recoveryClient = useMemo(
() =>
props.recoveryClient ??
- createApiRecoveryClient({
- baseUrl: apiBaseUrl,
- getAuthToken: () => authToken.trim() || null,
- }),
- [apiBaseUrl, authToken, props.recoveryClient],
+ createApiRecoveryClient({ baseUrl: apiBaseUrl, getAuthToken }),
+ [apiBaseUrl, getAuthToken, props.recoveryClient],
);
function selectIntent(intentId: string): void {
@@ -95,63 +99,57 @@ export function App(props: AppProps = {}) {
-
-
-
+
+
-
- {TAB_ORDER.map((tab) => (
- {
- tabRefs.current[tab] = element;
- }}
- type="button"
- role="tab"
- tabIndex={activeTab === tab ? 0 : -1}
- aria-selected={activeTab === tab}
- aria-controls={`${tab}-panel`}
- onClick={() => setActiveTab(tab)}
- onKeyDown={(event) => handleTabKeyDown(event, tab)}
- >
- {TAB_LABELS[tab]}
-
- ))}
-
+
+ {TAB_ORDER.map((tab) => (
+ {
+ tabRefs.current[tab] = element;
+ }}
+ type="button"
+ role="tab"
+ tabIndex={activeTab === tab ? 0 : -1}
+ aria-selected={activeTab === tab}
+ aria-controls={`${tab}-panel`}
+ onClick={() => setActiveTab(tab)}
+ onKeyDown={(event) => handleTabKeyDown(event, tab)}
+ >
+ {TAB_LABELS[tab]}
+
+ ))}
+
-
- {activeTab === 'create' ? (
-
- ) : activeTab === 'status' ? (
-
- ) : activeTab === 'settlement' ? (
-
- ) : (
-
- )}
-
+
+ {activeTab === 'create' ? (
+
+ ) : activeTab === 'status' ? (
+
+ ) : activeTab === 'settlement' ? (
+
+ ) : (
+
+ )}
+
+
);
diff --git a/apps/web/test/app-auth.test.tsx b/apps/web/test/app-auth.test.tsx
new file mode 100644
index 0000000..75b8540
--- /dev/null
+++ b/apps/web/test/app-auth.test.tsx
@@ -0,0 +1,90 @@
+import { cleanup, render, screen, waitFor } from '@testing-library/react';
+import userEvent from '@testing-library/user-event';
+import { afterEach, describe, expect, it, vi } from 'vitest';
+
+import { App } from '../src/App.js';
+import { OneShotApiClient } from '../src/api/client.js';
+import { fakeSession, signedInSession } from './support/fake-session.js';
+
+afterEach(() => {
+ cleanup();
+ vi.unstubAllGlobals();
+});
+
+function okClient(fetchFn: typeof fetch): OneShotApiClient {
+ return new OneShotApiClient({ fetchFn });
+}
+
+function respondingFetch(seen: string[]) {
+ return vi.fn(async (input: RequestInfo | URL, init?: RequestInit) => {
+ const authorization = new Headers(init?.headers).get('authorization');
+ if (authorization !== null) seen.push(authorization);
+ if (String(input).includes('/health/ready')) {
+ return new Response(JSON.stringify({ status: 'ok' }), {
+ status: 200,
+ headers: { 'content-type': 'application/json' },
+ });
+ }
+ return new Response(JSON.stringify({ code: 'INTENT_NOT_FOUND', message: 'absent' }), {
+ status: 404,
+ headers: { 'content-type': 'application/json' },
+ });
+ });
+}
+
+describe('App operator gating', () => {
+ it('hides every console tab until the operator signs in', () => {
+ const fetchFn = vi.fn(
+ async () =>
+ new Response(JSON.stringify({ status: 'ok' }), {
+ status: 200,
+ headers: { 'content-type': 'application/json' },
+ }),
+ );
+ render( fakeSession()} />);
+ expect(screen.queryByRole('tab', { name: 'Create or replay' })).toBeNull();
+ expect(screen.getByRole('button', { name: 'Sign in with Privy' })).toBeTruthy();
+ });
+
+ it('shows the console once a Privy session exists', () => {
+ const fetchFn = vi.fn(
+ async () =>
+ new Response(JSON.stringify({ status: 'ok' }), {
+ status: 200,
+ headers: { 'content-type': 'application/json' },
+ }),
+ );
+ render( signedInSession()} />);
+ expect(screen.getByRole('tab', { name: 'Create or replay' })).toBeTruthy();
+ });
+
+ it('sends the Privy access token on an authenticated request', async () => {
+ const seen: string[] = [];
+ vi.stubGlobal('fetch', respondingFetch(seen));
+
+ const user = userEvent.setup();
+ render( signedInSession('did:privy:x', 'aaa.bbb.ccc')} />);
+
+ await user.click(screen.getByRole('tab', { name: 'Authoritative status' }));
+ await user.type(screen.getByLabelText('Business Intent ID'), 'intent-1');
+ await user.click(screen.getByRole('button', { name: 'Lookup' }));
+
+ await waitFor(() => expect(seen).toContain('Bearer aaa.bbb.ccc'));
+ });
+
+ it('falls back to the machine token when no Privy session exists', async () => {
+ const seen: string[] = [];
+ vi.stubGlobal('fetch', respondingFetch(seen));
+
+ const user = userEvent.setup();
+ render( fakeSession({ status: 'UNCONFIGURED' })} />);
+
+ await user.click(screen.getByText('Machine token (advanced)'));
+ await user.type(screen.getByLabelText('Machine token'), 'service-token');
+ await user.click(screen.getByRole('tab', { name: 'Authoritative status' }));
+ await user.type(screen.getByLabelText('Business Intent ID'), 'intent-1');
+ await user.click(screen.getByRole('button', { name: 'Lookup' }));
+
+ await waitFor(() => expect(seen).toContain('Bearer service-token'));
+ });
+});
diff --git a/apps/web/test/app-composition.test.tsx b/apps/web/test/app-composition.test.tsx
index ca2871b..a2ffc82 100644
--- a/apps/web/test/app-composition.test.tsx
+++ b/apps/web/test/app-composition.test.tsx
@@ -9,6 +9,7 @@ import { afterEach, describe, expect, it } from 'vitest';
import { App } from '../src/App.js';
import { OneShotApiClient } from '../src/api/client.js';
+import { signedInSession } from './support/fake-session.js';
afterEach(cleanup);
@@ -29,6 +30,7 @@ describe('Gate P5 shell composition', () => {
apiClient={apiClient}
settlementClient={createInMemorySettlementClient(SETTLEMENT_SCENARIO_INTENTS)}
recoveryClient={createInMemoryRecoveryClient('lagging')}
+ useOperatorSession={() => signedInSession()}
/>,
);
diff --git a/apps/web/test/composition.test.tsx b/apps/web/test/composition.test.tsx
index 48ef040..5717482 100644
--- a/apps/web/test/composition.test.tsx
+++ b/apps/web/test/composition.test.tsx
@@ -9,6 +9,7 @@ import { createInMemoryRecoveryClient, recoveryScenarioPages } from '@oneshot/re
import { App } from '../src/App.js';
import { SettlementSurface } from '../src/components/FrontendSurfaces.js';
+import { signedInSession } from './support/fake-session.js';
afterEach(() => {
cleanup();
@@ -30,7 +31,12 @@ describe('composed frontend shell', () => {
});
const user = userEvent.setup();
- render( );
+ render(
+ signedInSession()}
+ />,
+ );
expect(screen.getByRole('tab', { name: 'Create or replay' })).toBeTruthy();
expect(screen.getByRole('tab', { name: 'Authoritative status' })).toBeTruthy();
diff --git a/apps/web/test/gate-p5.spec.ts b/apps/web/test/gate-p5.spec.ts
index 7b85e43..03ed17e 100644
--- a/apps/web/test/gate-p5.spec.ts
+++ b/apps/web/test/gate-p5.spec.ts
@@ -165,9 +165,16 @@ async function selectIntent(page: Page, id: string, tab: string): Promise
await page.getByRole('tab', { name: tab }).click();
}
+async function unlockConsole(page: Page, token = 'browser-memory-token'): Promise {
+ await page.getByText('Machine token (advanced)').click();
+ await page.getByLabel('Machine token').fill(token);
+ await expect(page.getByRole('tab', { name: 'Create or replay' })).toBeVisible();
+}
+
test.beforeEach(async ({ page }) => {
await mockApi(page);
await page.goto('/');
+ await unlockConsole(page);
});
test('policy denial and committed settlement render through B05', async ({ page }) => {
@@ -205,7 +212,6 @@ test('service-unavailable, keyboard, responsive, and token-memory checks fail sa
seenHeaders.push((await route.request().allHeaders()).authorization ?? '');
await route.fulfill({ status: 503, contentType: 'application/json', body: '{}' });
});
- await page.getByLabel('Demo service token').fill('browser-memory-token');
await selectIntent(page, 'intent-service-unavailable', 'Recovery evidence');
await expect(page.getByRole('alert')).toContainText('Evidence unavailable');
expect(seenHeaders).toContain('Bearer browser-memory-token');
From ab21bd6038fcde688b30bd8c16fc062167717d4a Mon Sep 17 00:00:00 2001
From: Matvii Nesterenko <51422901+kapustazh@users.noreply.github.com>
Date: Thu, 10 Sep 2026 00:51:30 +0200
Subject: [PATCH 08/10] style(web): format operator session wiring
---
apps/web/src/App.tsx | 8 ++------
1 file changed, 2 insertions(+), 6 deletions(-)
diff --git a/apps/web/src/App.tsx b/apps/web/src/App.tsx
index dc24707..38d5d06 100644
--- a/apps/web/src/App.tsx
+++ b/apps/web/src/App.tsx
@@ -56,15 +56,11 @@ export function App(props: AppProps = {}) {
[apiBaseUrl, getAuthToken, props.apiClient],
);
const settlementClient = useMemo(
- () =>
- props.settlementClient ??
- createSettlementClient({ baseUrl: apiBaseUrl, getAuthToken }),
+ () => props.settlementClient ?? createSettlementClient({ baseUrl: apiBaseUrl, getAuthToken }),
[apiBaseUrl, getAuthToken, props.settlementClient],
);
const recoveryClient = useMemo(
- () =>
- props.recoveryClient ??
- createApiRecoveryClient({ baseUrl: apiBaseUrl, getAuthToken }),
+ () => props.recoveryClient ?? createApiRecoveryClient({ baseUrl: apiBaseUrl, getAuthToken }),
[apiBaseUrl, getAuthToken, props.recoveryClient],
);
From dd424c7e6651539f8c0b0d0abf9347393c00d6b2 Mon Sep 17 00:00:00 2001
From: Matvii Nesterenko <51422901+kapustazh@users.noreply.github.com>
Date: Thu, 10 Sep 2026 01:04:14 +0200
Subject: [PATCH 09/10] feat(web): mount the Privy provider lazily behind the
session port
---
apps/web/.env.example | 3 +
apps/web/package.json | 1 +
apps/web/src/auth/privy-session.tsx | 63 +
apps/web/src/main.tsx | 30 +-
apps/web/src/vite-env.d.ts | 1 +
pnpm-lock.yaml | 2508 ++++++++++++++++++++++++++-
pnpm-workspace.yaml | 7 +
7 files changed, 2606 insertions(+), 7 deletions(-)
create mode 100644 apps/web/src/auth/privy-session.tsx
diff --git a/apps/web/.env.example b/apps/web/.env.example
index 92999af..0c08190 100644
--- a/apps/web/.env.example
+++ b/apps/web/.env.example
@@ -1 +1,4 @@
VITE_ONESHOT_API_BASE_URL=http://127.0.0.1:3001
+
+# Public Privy application identifier. Safe to commit; the verification key is not.
+VITE_PRIVY_APP_ID=cmtqbf5zo013w0cky3r0jqjca
diff --git a/apps/web/package.json b/apps/web/package.json
index 077276f..31e0b0a 100644
--- a/apps/web/package.json
+++ b/apps/web/package.json
@@ -18,6 +18,7 @@
"@oneshot/contracts": "workspace:*",
"@oneshot/recovery-ui": "workspace:*",
"@oneshot/settlement-ui": "workspace:*",
+ "@privy-io/react-auth": "3.6.1",
"react": "19.2.8",
"react-dom": "19.2.8"
},
diff --git a/apps/web/src/auth/privy-session.tsx b/apps/web/src/auth/privy-session.tsx
new file mode 100644
index 0000000..255fb29
--- /dev/null
+++ b/apps/web/src/auth/privy-session.tsx
@@ -0,0 +1,63 @@
+import { PrivyProvider, usePrivy } from '@privy-io/react-auth';
+import { useEffect, useState, type ReactNode } from 'react';
+import type { OperatorSession, OperatorSessionStatus } from './session.js';
+
+const REFRESH_INTERVAL_MS = 5 * 60 * 1000;
+
+export function PrivyOperatorProvider(props: {
+ readonly appId: string;
+ readonly children: ReactNode;
+}) {
+ return (
+
+ {props.children}
+
+ );
+}
+
+export function usePrivyOperatorSession(): OperatorSession {
+ const { ready, authenticated, user, login, logout, getAccessToken } = usePrivy();
+ const [accessToken, setAccessToken] = useState(null);
+
+ useEffect(() => {
+ if (!ready || !authenticated) {
+ setAccessToken(null);
+ return;
+ }
+ let cancelled = false;
+ const refresh = async (): Promise => {
+ try {
+ const token = await getAccessToken();
+ if (!cancelled) setAccessToken(token ?? null);
+ } catch {
+ if (!cancelled) setAccessToken(null);
+ }
+ };
+ void refresh();
+ const timer = window.setInterval(() => void refresh(), REFRESH_INTERVAL_MS);
+ return () => {
+ cancelled = true;
+ window.clearInterval(timer);
+ };
+ }, [ready, authenticated, getAccessToken]);
+
+ const status: OperatorSessionStatus = !ready
+ ? 'LOADING'
+ : authenticated
+ ? 'SIGNED_IN'
+ : 'SIGNED_OUT';
+
+ return {
+ status,
+ subject: user?.id ?? null,
+ accessToken: status === 'SIGNED_IN' ? accessToken : null,
+ login,
+ logout,
+ };
+}
diff --git a/apps/web/src/main.tsx b/apps/web/src/main.tsx
index 28d3d29..0c1c0dd 100644
--- a/apps/web/src/main.tsx
+++ b/apps/web/src/main.tsx
@@ -1,15 +1,33 @@
-import React from 'react';
+import { lazy, StrictMode, Suspense } from 'react';
import { createRoot } from 'react-dom/client';
import { App } from './App.js';
+const appId = import.meta.env.VITE_PRIVY_APP_ID ?? '';
+
+const PrivyConsole = lazy(async () => {
+ const module = await import('./auth/privy-session.js');
+ return {
+ default: () => (
+
+
+
+ ),
+ };
+});
+
const container = document.getElementById('root');
if (!container) {
throw new Error('Root container #root not found in document');
}
-const root = createRoot(container);
-root.render(
-
-
- ,
+createRoot(container).render(
+
+ {appId ? (
+ Loading the console…
}>
+
+
+ ) : (
+
+ )}
+ ,
);
diff --git a/apps/web/src/vite-env.d.ts b/apps/web/src/vite-env.d.ts
index 92dea2d..a03464f 100644
--- a/apps/web/src/vite-env.d.ts
+++ b/apps/web/src/vite-env.d.ts
@@ -2,6 +2,7 @@
interface ImportMetaEnv {
readonly VITE_ONESHOT_API_BASE_URL?: string;
+ readonly VITE_PRIVY_APP_ID?: string;
}
interface ImportMeta {
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 0f51ce1..4a05abb 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -4,6 +4,10 @@ settings:
autoInstallPeers: true
excludeLinksFromLockfile: false
+overrides:
+ lucide-react: 0.475.0
+ use-sync-external-store: 1.4.0
+
importers:
.:
@@ -82,6 +86,9 @@ importers:
'@oneshot/settlement-ui':
specifier: workspace:*
version: link:../../packages/settlement-ui
+ '@privy-io/react-auth':
+ specifier: 3.6.1
+ version: 3.6.1(@types/react@19.2.18)(encoding@0.1.13)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@6.0.3)(use-sync-external-store@1.4.0(react@19.2.8))(zod@3.25.76)
react:
specifier: 19.2.8
version: 19.2.8
@@ -367,6 +374,9 @@ packages:
'@balena/dockerignore@1.0.2':
resolution: {integrity: sha512-wMue2Sy4GAVTk6Ic4tJVcnfdau+gx2EnG7S+uAEe+TWJFqE4YoWN4/H8MSLj4eYJKxGg26lZwboEniNiNwZQ6Q==}
+ '@base-org/account@1.1.1':
+ resolution: {integrity: sha512-IfVJPrDPhHfqXRDb89472hXkpvJuQQR7FDI9isLPHEqSYt/45whIoBxSPgZ0ssTt379VhQo4+87PWI1DoLSfAQ==}
+
'@bramus/specificity@2.4.2':
resolution: {integrity: sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw==}
hasBin: true
@@ -426,6 +436,9 @@ packages:
cpu: [x64]
os: [win32]
+ '@coinbase/wallet-sdk@4.3.2':
+ resolution: {integrity: sha512-hOLA2YONq8Z9n8f6oVP6N//FEEHOen7nq+adG/cReol6juFTHUelVN5GnA5zTIxiLFMDcrhDwwgCA6Tdb5jubw==}
+
'@cspotcode/source-map-support@0.8.1':
resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==}
engines: {node: '>=12'}
@@ -479,6 +492,12 @@ packages:
'@emnapi/wasi-threads@1.2.3':
resolution: {integrity: sha512-ELEBe8PsLvvJ6QMr0zLt8ffvOHW/dc1m3CEzNMg7aJUv3bMaoDtw2TXyDAwkYBuroxxuHEwhRTLJSe5sya547g==}
+ '@emotion/is-prop-valid@1.4.0':
+ resolution: {integrity: sha512-QgD4fyscGcbbKwJmqNvUMSE02OsHUa+lAWKdEUIJKgqe5IwRSKd7+KhibEWdaKwgjLj0DRSHA9biAIqGBk05lw==}
+
+ '@emotion/memoize@0.9.0':
+ resolution: {integrity: sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==}
+
'@esbuild/aix-ppc64@0.28.1':
resolution: {integrity: sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==}
engines: {node: '>=18'}
@@ -708,6 +727,27 @@ packages:
resolution: {integrity: sha512-yZ0H5e3EpAYKokX/AbtplzlvSxEJY7ZfpvQyDzyODkks0hakAAlDG6fQu1SlDJMWorY7bbq1j7fCiFeTWci6TA==}
hasBin: true
+ '@floating-ui/core@1.8.0':
+ resolution: {integrity: sha512-0CIZ5itps/8x7BG8dEIhs53BvCUH2PCoogtakwRTut+Arm58sJooJ0AuZhLw2HJYIR5cMLNPBSS728sPho2khQ==}
+
+ '@floating-ui/dom@1.8.0':
+ resolution: {integrity: sha512-yXSrzeHZBTZadLOlfyhCkJHNeLJnHRnRInwdZ40L7ZiaAtrBwoYlsDrX3v5zB1Utk7CLfzcOVnVVWoXEky7Ceg==}
+
+ '@floating-ui/react-dom@2.1.9':
+ resolution: {integrity: sha512-JDjEFGCpImxDCA7JJKviA0M9+RtmJdj0m/NVU5IMgBK+AmZouAQQ7/+2GLH0GXXY0YMw9oXPB8hKdbPYg5QLYg==}
+ peerDependencies:
+ react: '>=16.8.0'
+ react-dom: '>=16.8.0'
+
+ '@floating-ui/react@0.26.28':
+ resolution: {integrity: sha512-yORQuuAtVpiRjpMhdc0wJj06b9JFjrYF4qp96j++v2NBpbi6SEGF7donUJ3TMieerQ6qVkAv1tgr7L4r5roTqw==}
+ peerDependencies:
+ react: '>=16.8.0'
+ react-dom: '>=16.8.0'
+
+ '@floating-ui/utils@0.2.12':
+ resolution: {integrity: sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww==}
+
'@graphile/logger@0.2.0':
resolution: {integrity: sha512-jjcWBokl9eb1gVJ85QmoaQ73CQ52xAaOCF29ukRbYNl6lY+ts0ErTaDYOBlejcbUs2OpaiqYLO5uDhyLFzWw4w==}
@@ -733,6 +773,18 @@ packages:
engines: {node: '>=6'}
hasBin: true
+ '@headlessui/react@2.2.10':
+ resolution: {integrity: sha512-5pVLNK9wlpxTUTy9GpgbX/SdcRh+HBnPktjM2wbiLTH4p+2EPHBO1aoSryUCuKUIItdDWO9ITlhUL8UnUN/oIA==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ react: ^18 || ^19 || ^19.0.0-rc
+ react-dom: ^18 || ^19 || ^19.0.0-rc
+
+ '@heroicons/react@2.2.0':
+ resolution: {integrity: sha512-LMcepvRaS9LYHJGsF0zzmgKCUim/X3N/DQKc4jepAXJ7l8QxJ1PmxJzqplF2Z3FE4PqBAIGyJAQ/w4B5dsqbtQ==}
+ peerDependencies:
+ react: '>= 16 || ^19.0.0-rc'
+
'@hpke/chacha20poly1305@1.8.0':
resolution: {integrity: sha512-FcBfAQ+Y99vMNJP2yrZ9wpL8V0GOwp1+zMyzvc6alasrBygfFjFm1yeUtyADJCu/27C3Lm5mJzx6u7pwg+cX5w==}
engines: {node: '>=16.0.0'}
@@ -1061,6 +1113,15 @@ packages:
'@types/node':
optional: true
+ '@internationalized/date@3.12.4':
+ resolution: {integrity: sha512-M1dEn4c1U1HsSlaVR8upZtSqvXrTkHDfv18H01uCSJyjVLDxnBR38v/fMxecmlwXKR4i9HeZcmgQAPE6A+aGJQ==}
+
+ '@internationalized/number@3.6.8':
+ resolution: {integrity: sha512-8UmMFia46DUt+k97zKd9fKWXcWHR+k8ae3eYzILETuT2KbIvLyOfac7zesw+sJdRAAZ7Q9pM1Mk22aXp2LD0Ig==}
+
+ '@internationalized/string@3.2.10':
+ resolution: {integrity: sha512-PDx6//vHSpRnHfxqMqto11zQvhsaU74O3mKv2F/0eicGZcl9NLjQmGlbHz/LsJh5tLKp4A4L7ZVTzN1/MmMTvA==}
+
'@ipld/dag-cbor@9.2.7':
resolution: {integrity: sha512-ZmfXmElRWATr+hoUTSAOr6HUcjVhOcNHDqgczc76qte2DHHFEK0ZhNzUcdTDQhF/VSIvf2ioaRTRLWwLc83sNw==}
@@ -1125,6 +1186,27 @@ packages:
'@libp2p/peer-id@5.1.9':
resolution: {integrity: sha512-cVDp7lX187Epmi/zr0Qq2RsEMmueswP9eIxYSFoMcHL/qcvRFhsxOfUGB8361E26s2WJvC9sXZ0oJS9XVueJhQ==}
+ '@lit-labs/ssr-dom-shim@1.6.0':
+ resolution: {integrity: sha512-VHb0ALPMTlgKjM6yIxxoQNnpKyUKLD04VzeQdsiXkMqkvYlAHxq9glGLmgbb889/1GsohSOAjvQYoiBppXFqrQ==}
+
+ '@lit/react@1.0.8':
+ resolution: {integrity: sha512-p2+YcF+JE67SRX3mMlJ1TKCSTsgyOVdAwd/nxp3NuV1+Cb6MWALbN6nT7Ld4tpmYofcE5kcaSY1YBB9erY+6fw==}
+ peerDependencies:
+ '@types/react': 17 || 18 || 19
+
+ '@lit/reactive-element@2.1.2':
+ resolution: {integrity: sha512-pbCDiVMnne1lYUIaYNN5wrwQXDtHaYtg7YEFPeW+hws6U47WeFvISGUWekPGKWOP1ygrs0ef0o1VJMk1exos5A==}
+
+ '@marsidev/react-turnstile@1.6.1':
+ resolution: {integrity: sha512-ojI9NLYv821IRKi7KraTkxTto6KC/m58hNNyKxvYxm/cQBu5MI5eMkaiJs2JSQBFiXE3LPQI3seJVjv/2lgALA==}
+ peerDependencies:
+ react: ^17.0.2 || ^18.0.0 || ^19.0
+ react-dom: ^17.0.2 || ^18.0.0 || ^19.0
+
+ '@msgpack/msgpack@3.1.2':
+ resolution: {integrity: sha512-JEW4DEtBzfe8HvUYecLU9e6+XJnKDlUAIve8FvPzF3Kzs6Xo/KuZkZJsDH0wJXl/qEZbeeE7edxDNY3kMs39hQ==}
+ engines: {node: '>= 18'}
+
'@multiformats/dns@1.0.15':
resolution: {integrity: sha512-W0zAMABtAn+3chgFcPGvllKND7M6GblMAAFcJQTy+iMmGiyFErZYPzAh2b50Y3SFf340iFV7+ckVgZkGfUyxzA==}
@@ -1151,10 +1233,18 @@ packages:
'@noble/curves@1.4.2':
resolution: {integrity: sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==}
+ '@noble/curves@1.8.0':
+ resolution: {integrity: sha512-j84kjAbzEnQHaSIhRPUmB3/eVXu2k3dKPl2LOrR8fSOIL+89U+7lV117EWHtq/GHM3ReGHM46iRBdZfpc4HRUQ==}
+ engines: {node: ^14.21.3 || >=16}
+
'@noble/curves@1.9.1':
resolution: {integrity: sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==}
engines: {node: ^14.21.3 || >=16}
+ '@noble/curves@1.9.6':
+ resolution: {integrity: sha512-GIKz/j99FRthB8icyJQA51E8Uk5hXmdyThjgQXRKiv9h0zeRlzSCLIzFw6K1LotZ3XuB7yzlf76qk7uBmTdFqA==}
+ engines: {node: ^14.21.3 || >=16}
+
'@noble/curves@1.9.7':
resolution: {integrity: sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==}
engines: {node: ^14.21.3 || >=16}
@@ -1167,6 +1257,10 @@ packages:
resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==}
engines: {node: '>= 16'}
+ '@noble/hashes@1.7.0':
+ resolution: {integrity: sha512-HXydb0DgzTpDPwbVeDGCG1gIu7X6+AuU6Zl6av/E/KG8LMsvPntvq+w17CHRpKBmN6Ybdrt1eP3k4cj8DJa78w==}
+ engines: {node: ^14.21.3 || >=16}
+
'@noble/hashes@1.8.0':
resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==}
engines: {node: ^14.21.3 || >=16}
@@ -1214,6 +1308,9 @@ packages:
'@oxc-project/types@0.115.0':
resolution: {integrity: sha512-4n91DKnebUS4yjUHl2g3/b2T+IUdCfmoZGhmwsovZCDaJSs+QkVAM+0AqqTxHSsHfeiMuueT75cZaZcT/m0pSw==}
+ '@phosphor-icons/webcomponents@2.1.5':
+ resolution: {integrity: sha512-JcvQkZxvcX2jK+QCclm8+e8HXqtdFW9xV4/kk2aL9Y3dJA2oQVt+pzbv1orkumz3rfx4K9mn9fDoMr1He1yr7Q==}
+
'@pinax/graph-networks-registry@0.7.1':
resolution: {integrity: sha512-Gn2kXRiEd5COAaMY/aDCRO0V+zfb1uQKCu5HFPoWka+EsZW27AlTINA7JctYYYEMuCbjMia5FBOzskjgEvj6LA==}
@@ -1250,6 +1347,31 @@ packages:
'@poppinss/exception@1.2.3':
resolution: {integrity: sha512-dCED+QRChTVatE9ibtoaxc+WkdzOSjYTKi/+uacHWIsfodVfpsueo3+DKpgU5Px8qXjgmXkSvhXvSCz3fnP9lw==}
+ '@privy-io/api-base@1.7.1':
+ resolution: {integrity: sha512-8BT7TTxZrx0NFO0ycaZugxNcogK+hC7HRDS0U4x9XiG8AkRrVYWR8DdkLi3EGcZAZrn73YcBc1GPiBI2IkNaCQ==}
+
+ '@privy-io/api-types@0.1.1':
+ resolution: {integrity: sha512-GGsuXcqqMUupldRvkohDUDhXbDHgxpAdg4MKJJ+NQ/k/eY0HhOT2YNNtxHiSTQzvuGtlKMzbadIkNq+BfN6jeg==}
+
+ '@privy-io/chains@0.0.5':
+ resolution: {integrity: sha512-5fOmCOOs7DjGTGnPRv4/2X6/xBKG8fRNrFgNv9ajYdRsKUg86CixszQCYyvZmVxv7XSGrX1oiS1ATAXzfqRmDg==}
+
+ '@privy-io/ethereum@0.0.2':
+ resolution: {integrity: sha512-FnJ1dzgg/tij4jLeKHLlZM9uNk4WN+iIOkc8CG0FZKUQxqXH60Fs/dMF6Xbndd5CQkUO8LUU7FLom/405VKXpQ==}
+ peerDependencies:
+ viem: ^2.21.36
+
+ '@privy-io/js-sdk-core@0.57.1':
+ resolution: {integrity: sha512-UHUBbHP0LXMx3tlHCUO05MGu6MtX4FY+W3FoYWY68LhVU+i9iwx98ZS953OhNwey2BuoiLFoBXO1OJkB4ojtpg==}
+ peerDependencies:
+ permissionless: ^0.2.47
+ viem: ^2.30.6
+ peerDependenciesMeta:
+ permissionless:
+ optional: true
+ viem:
+ optional: true
+
'@privy-io/node@0.34.0':
resolution: {integrity: sha512-oAcn4KSalOgRCKVEbQyF6VzZ6U6HHHe9uQShoy0cAJXQOkfY9beHASMHCVAEGcajo4fM1QV8a/3zf4gWoOKw7w==}
peerDependencies:
@@ -1270,6 +1392,40 @@ packages:
viem:
optional: true
+ '@privy-io/popup@0.0.1':
+ resolution: {integrity: sha512-4Z4K5yX9jVzGpx6GgNMlQce35tKfHJwN2A3naTsA82Pff44eVhcQZjaSxj/Y1OKv0hku8WXPwyczhcMfKp1ULg==}
+
+ '@privy-io/react-auth@3.6.1':
+ resolution: {integrity: sha512-baH/kmWAYxes5hAfOKuTITwWAA1UvDyXOvw82tf+fAJeScYsZqCjBYckmM4KrGRnSKPIrKpOiBd0FsNZfbPeBw==}
+ peerDependencies:
+ '@abstract-foundation/agw-client': ^1.0.0
+ '@solana-program/memo': ^0.8.0
+ '@solana-program/system': ^0.8.0
+ '@solana-program/token': ^0.6.0
+ '@solana/kit': ^3.0.3
+ permissionless: ^0.2.47
+ react: ^18 || ^19
+ react-dom: ^18 || ^19
+ peerDependenciesMeta:
+ '@abstract-foundation/agw-client':
+ optional: true
+ '@solana-program/memo':
+ optional: true
+ '@solana-program/system':
+ optional: true
+ '@solana-program/token':
+ optional: true
+ '@solana/kit':
+ optional: true
+ permissionless:
+ optional: true
+
+ '@privy-io/routes@0.0.2':
+ resolution: {integrity: sha512-A5cnmcb7X8469w6XGsWSUkdUmhKcY+1rkr5VQT9hT/wHFVauxVATHLC+43aoizXu4R029UOrTspuhj9nOQbi8A==}
+
+ '@privy-io/urls@0.0.5':
+ resolution: {integrity: sha512-cy4SQY60I9aGm+Er/gL4P+Rrsw2B7RoD6GKw5ZlwEN3jCm3tfclWeZI+xlJSKIwIu71YV9fWpO0bjLTs0tMLgQ==}
+
'@protobufjs/aspromise@1.1.2':
resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==}
@@ -1297,6 +1453,52 @@ packages:
'@protobufjs/utf8@1.1.2':
resolution: {integrity: sha512-b1UQwcEZ4yCnMCD8DAL1VlbvBJE9/IX4FTIp7BG1xYpf29SLazLSrqUkj4w7Y5y7cCVP6E5tcqqcI0xemPkHug==}
+ '@react-aria/focus@3.22.1':
+ resolution: {integrity: sha512-CPxtkyrBi/HYY5P3lE/57sQ6qfa0lN8E55TOm89H0kNGv0lKt+/0zP7lWERzBjRr5IxBVrQX4gFEowBN52LPaA==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+ react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-aria/interactions@3.28.1':
+ resolution: {integrity: sha512-Bqb+HrD5I5MHS2SKBhISYqo2SW8Y2dfzgF/Y1lIJq7xqLxheo9vzxPGEHhz+XzkgGfoqEJx8A6a3C7uiqS3HWA==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+ react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-types/shared@3.36.1':
+ resolution: {integrity: sha512-AzsuD9OfxTOZMMvTRhlN3oHBwOmFN7tDh27LzqmHt4+uOgPhJT7ZM7/kVs/8/o0WxayMUIk3hBmCFRHv1FUoag==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@reown/appkit-common@1.8.9':
+ resolution: {integrity: sha512-drseYLBDqcQR2WvhfAwrKRiDJdTmsmwZsRBg72sxQDvAwxfKNSmiqsqURq5c/Q9SeeTwclge58Dyq7Ijo6TeeQ==}
+
+ '@reown/appkit-controllers@1.8.9':
+ resolution: {integrity: sha512-/8hgFAgiYCTDG3gSxJr8hXy6GnO28UxN8JOXFUEi5gOODy7d3+3Jwm+7OEghf7hGKrShDedibsXdXKdX1PUT+g==}
+
+ '@reown/appkit-pay@1.8.9':
+ resolution: {integrity: sha512-AEmaPqxnzjawSRFenyiTtq0vjKM5IPb2CTD9wa+OMXFpe6FissO+1Eg1H47sfdrycZCvUizSRmQmYqkJaI8BCw==}
+
+ '@reown/appkit-polyfills@1.8.9':
+ resolution: {integrity: sha512-33YCU8dxe4UkpNf9qCAaHx5crSoEu6tbmZxE/0eEPCYRDRXoiH9VGiN7xwTDOVduacg/U8H6/32ibmYZKnRk5Q==}
+
+ '@reown/appkit-scaffold-ui@1.8.9':
+ resolution: {integrity: sha512-F7PSM1nxvlvj2eu8iL355GzvCNiL8RKiCqT1zag8aB4QpxjU24l+vAF6debtkg4HY8nJOyDifZ7Z1jkKrHlIDQ==}
+
+ '@reown/appkit-ui@1.8.9':
+ resolution: {integrity: sha512-WR17ql77KOMKfyDh7RW4oSfmj+p5gIl0u8Wmopzbx5Hd0HcPVZ5HmTDpwOM9WCSxYcin0fsSAoI+nVdvrhWNtw==}
+
+ '@reown/appkit-utils@1.8.9':
+ resolution: {integrity: sha512-U9hx4h7tIE7ha/QWKjZpZc/imaLumdwe0QNdku9epjp/npXVjGuwUrW5mj8yWNSkjtQpY/BEItNdDAUKZ7rrjw==}
+ peerDependencies:
+ valtio: 2.1.7
+
+ '@reown/appkit-wallet@1.8.9':
+ resolution: {integrity: sha512-rcAXvkzOVG4941eZVCGtr2dSJAMOclzZGSe+8hnOUnhK4zxa5svxiP6K9O5SMBp3MrAS3WNsRj5hqx6+JHb7iA==}
+
+ '@reown/appkit@1.8.9':
+ resolution: {integrity: sha512-e3N2DAzf3Xv3jnoD8IsUo0/Yfwuhk7npwJBe1+9rDJIRwgPsyYcCLD4gKPDFC5IUIfOLqK7YtGOh9oPEUnIWpw==}
+
'@rescript/std@9.0.0':
resolution: {integrity: sha512-zGzFsgtZ44mgL4Xef2gOy1hrRVdrs9mcxCOOKZrIPsmbZW14yTkaF591GXxpQvjXiHtgZ/iA9qLyWH6oSReIxQ==}
@@ -1419,6 +1621,9 @@ packages:
'@scure/bip39@1.6.0':
resolution: {integrity: sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A==}
+ '@simplewebauthn/browser@13.3.0':
+ resolution: {integrity: sha512-BE/UWv6FOToAdVk0EokzkqQQDOWtNydYlY6+OrmiZ5SCNmb41VehttboTetUM3T/fr6EAFYVXjz4My2wg230rQ==}
+
'@sindresorhus/is@7.2.0':
resolution: {integrity: sha512-P1Cz1dWaFfR4IR+U13mqqiGsLFf1KbayybWwdd2vfctdV6hDpUkgCY0nKOLLTMSoRd/jJNjtbqzf13K8DCCXQw==}
engines: {node: '>=18'}
@@ -1429,6 +1634,18 @@ packages:
'@stablelib/base64@1.0.1':
resolution: {integrity: sha512-1bnPQqSxSuc3Ii6MhBysoWCg58j97aUjuCSZrGSmDxNqtytIi0k8utUenAwTZN4V5mXXYGsVUI9zeBqy+jBOSQ==}
+ '@swc/helpers@0.5.23':
+ resolution: {integrity: sha512-5lSsMOTXURePglDfvuAQUqkGek9Hg2kksOYay2m0+XR++b2NWYL/4sWyuvVBIs8oKnJaxkdi9whaL/sqN13afw==}
+
+ '@tanstack/react-virtual@3.14.11':
+ resolution: {integrity: sha512-SStWf8bYdTgAquYqG4Pi2+d1XimQKoCIJ94H3jsm0D6UA0yqffvWuvUzrrQ4idewFWq8BSPpahnmLVosJIAs6g==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+ react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+
+ '@tanstack/virtual-core@3.17.9':
+ resolution: {integrity: sha512-M8Bzy7CCMvUjRiuoHVH9mRjyUVczRs8v8RcUEphLFGc445ZP4KQ15Y1sLqhQqJi/HgGJrxfCHnEnIX0x9mVrBg==}
+
'@testcontainers/postgresql@12.1.0':
resolution: {integrity: sha512-Pjf2VSVNirEPfz36nidyrVAnZvc2YhajOznY4VgyEsvfTd5qiMNOuPq96drREvxAUtXl5SFLX7vXj7sSq4aTcA==}
@@ -1534,6 +1751,9 @@ packages:
'@types/ssh2@1.15.6':
resolution: {integrity: sha512-oGdxhBqcRTwSTKFm+9EiKzkNVYRLEFkcW44lhguvBalGJbWfGnDt/ezwSUZc+SF9m9bMc3VyklNAtp7zICjS5w==}
+ '@types/trusted-types@2.0.7':
+ resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==}
+
'@types/ws@7.4.7':
resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==}
@@ -1626,6 +1846,109 @@ packages:
'@vitest/spy@5.0.0':
resolution: {integrity: sha512-uy+luWBAPw9XfthoHi5AkfHUnuPYEESjl0p/r+meoBnU8bxg5GDQ3Ey8MjcJ6sqahkL4PFyrvfMJJBw7LbU06g==}
+ '@wallet-standard/app@1.1.1':
+ resolution: {integrity: sha512-WDGwoByhP5gwHH01r5EaLgQdLVkACPCdOMQhmhn8rsm10h/siSgTorShzBxrn0ExSPof+Lu+C3TfgqBrPa1xoQ==}
+ engines: {node: '>=22'}
+
+ '@wallet-standard/base@1.1.1':
+ resolution: {integrity: sha512-gggIHTtxicF9XFMQ12DkfS6NAG92Ak795JeSA7f2whAQ6Y3AkMWWuCMxSZXG2NIPN42kEaZSNVjqMsJRaJRxMQ==}
+ engines: {node: '>=22'}
+
+ '@wallet-standard/wallet@1.1.0':
+ resolution: {integrity: sha512-Gt8TnSlDZpAl+RWOOAB/kuvC7RpcdWAlFbHNoi4gsXsfaWa1QCT6LBcfIYTPdOZC9OVZUDwqGuGAcqZejDmHjg==}
+ engines: {node: '>=16'}
+
+ '@walletconnect/core@2.21.9':
+ resolution: {integrity: sha512-SlSknLvbO4i9Y4y8zU0zeCuJv1klQIUX3HRSBs1BaYvQKVVkrdiWPgRj4jcrL2wEOINa9NXw6HXp6x5XCXOolA==}
+ engines: {node: '>=18.20.8'}
+
+ '@walletconnect/core@2.22.4':
+ resolution: {integrity: sha512-ZQnyDDpqDPAk5lyLV19BRccQ3wwK3LmAwibuIv3X+44aT/dOs2kQGu9pla3iW2LgZ5qRMYvgvvfr5g3WlDGceQ==}
+ engines: {node: '>=18.20.8'}
+
+ '@walletconnect/environment@1.0.1':
+ resolution: {integrity: sha512-T426LLZtHj8e8rYnKfzsw1aG6+M0BT1ZxayMdv/p8yM0MU+eJDISqNY3/bccxRr4LrF9csq02Rhqt08Ibl0VRg==}
+
+ '@walletconnect/ethereum-provider@2.22.4':
+ resolution: {integrity: sha512-qhBxU95nlndiKGz8lO8z9JlsA4Ai8i1via4VWut2fXsW1fkl6qXG9mYhDRFsbavuynUe3dQ+QLjBVDaaNkcKCA==}
+
+ '@walletconnect/events@1.0.1':
+ resolution: {integrity: sha512-NPTqaoi0oPBVNuLv7qPaJazmGHs5JGyO8eEAk5VGKmJzDR7AHzD4k6ilox5kxk1iwiOnFopBOOMLs86Oa76HpQ==}
+
+ '@walletconnect/heartbeat@1.2.2':
+ resolution: {integrity: sha512-uASiRmC5MwhuRuf05vq4AT48Pq8RMi876zV8rr8cV969uTOzWdB/k+Lj5yI2PBtB1bGQisGen7MM1GcZlQTBXw==}
+
+ '@walletconnect/jsonrpc-http-connection@1.0.8':
+ resolution: {integrity: sha512-+B7cRuaxijLeFDJUq5hAzNyef3e3tBDIxyaCNmFtjwnod5AGis3RToNqzFU33vpVcxFhofkpE7Cx+5MYejbMGw==}
+
+ '@walletconnect/jsonrpc-provider@1.0.14':
+ resolution: {integrity: sha512-rtsNY1XqHvWj0EtITNeuf8PHMvlCLiS3EjQL+WOkxEOA4KPxsohFnBDeyPYiNm4ZvkQdLnece36opYidmtbmow==}
+
+ '@walletconnect/jsonrpc-types@1.0.4':
+ resolution: {integrity: sha512-P6679fG/M+wuWg9TY8mh6xFSdYnFyFjwFelxyISxMDrlbXokorEVXYOxiqEbrU3x1BmBoCAJJ+vtEaEoMlpCBQ==}
+
+ '@walletconnect/jsonrpc-utils@1.0.8':
+ resolution: {integrity: sha512-vdeb03bD8VzJUL6ZtzRYsFMq1eZQcM3EAzT0a3st59dyLfJ0wq+tKMpmGH7HlB7waD858UWgfIcudbPFsbzVdw==}
+
+ '@walletconnect/jsonrpc-ws-connection@1.0.16':
+ resolution: {integrity: sha512-G81JmsMqh5nJheE1mPst1W0WfVv0SG3N7JggwLLGnI7iuDZJq8cRJvQwLGKHn5H1WTW7DEPCo00zz5w62AbL3Q==}
+
+ '@walletconnect/keyvaluestorage@1.1.1':
+ resolution: {integrity: sha512-V7ZQq2+mSxAq7MrRqDxanTzu2RcElfK1PfNYiaVnJgJ7Q7G7hTVwF8voIBx92qsRyGHZihrwNPHuZd1aKkd0rA==}
+ peerDependencies:
+ '@react-native-async-storage/async-storage': 1.x
+ peerDependenciesMeta:
+ '@react-native-async-storage/async-storage':
+ optional: true
+
+ '@walletconnect/logger@2.1.2':
+ resolution: {integrity: sha512-aAb28I3S6pYXZHQm5ESB+V6rDqIYfsnHaQyzFbwUUBFY4H0OXx/YtTl8lvhUNhMMfb9UxbwEBS253TlXUYJWSw==}
+
+ '@walletconnect/logger@3.0.0':
+ resolution: {integrity: sha512-DDktPBFdmt5d7U3sbp4e3fQHNS1b6amsR8FmtOnt6L2SnV7VfcZr8VmAGL12zetAR+4fndegbREmX0P8Mw6eDg==}
+
+ '@walletconnect/relay-api@1.0.11':
+ resolution: {integrity: sha512-tLPErkze/HmC9aCmdZOhtVmYZq1wKfWTJtygQHoWtgg722Jd4homo54Cs4ak2RUFUZIGO2RsOpIcWipaua5D5Q==}
+
+ '@walletconnect/relay-auth@1.1.0':
+ resolution: {integrity: sha512-qFw+a9uRz26jRCDgL7Q5TA9qYIgcNY8jpJzI1zAWNZ8i7mQjaijRnWFKsCHAU9CyGjvt6RKrRXyFtFOpWTVmCQ==}
+
+ '@walletconnect/safe-json@1.0.2':
+ resolution: {integrity: sha512-Ogb7I27kZ3LPC3ibn8ldyUr5544t3/STow9+lzz7Sfo808YD7SBWk7SAsdBFlYgP2zDRy2hS3sKRcuSRM0OTmA==}
+
+ '@walletconnect/sign-client@2.21.9':
+ resolution: {integrity: sha512-EKLDS97o1rk/0XilD0nQdSR9SNgRsVoIK5M5HpS9sDTvHPv2EF5pIqu6Xr2vLsKcQ0KnCx+D5bnpav8Yh4NVZg==}
+
+ '@walletconnect/sign-client@2.22.4':
+ resolution: {integrity: sha512-la+sol0KL33Fyx5DRlupHREIv8wA6W33bRfuLAfLm8pINRTT06j9rz0IHIqJihiALebFxVZNYzJnF65PhV0q3g==}
+
+ '@walletconnect/time@1.0.2':
+ resolution: {integrity: sha512-uzdd9woDcJ1AaBZRhqy5rNC9laqWGErfc4dxA9a87mPdKOgWMD85mcFo9dIYIts/Jwocfwn07EC6EzclKubk/g==}
+
+ '@walletconnect/types@2.21.9':
+ resolution: {integrity: sha512-+82TRNX3lGRO96WyLISaBs/FkLts7y4hVgmOI4we84I7XdBu1xsjgiJj0JwYXnurz+X94lTqzOkzPps+wadWKw==}
+
+ '@walletconnect/types@2.22.4':
+ resolution: {integrity: sha512-KJdiS9ezXzx1uASanldYaaenDwb42VOQ6Rj86H7FRwfYddhNnYnyEaDjDKOdToGRGcpt5Uzom6qYUOnrWEbp5g==}
+
+ '@walletconnect/universal-provider@2.21.9':
+ resolution: {integrity: sha512-dVA9DWSz9jYe37FW5GSRV5zlY9E7rX1kktcDGI7i1/9oG/z9Pk5UKp5r/DFys4Zjml9wZc46R/jlEgeBXTT06A==}
+
+ '@walletconnect/universal-provider@2.22.4':
+ resolution: {integrity: sha512-TF2RNX13qxa0rrBAhVDs5+C2G8CHX7L0PH5hF2uyQHdGyxZ3pFbXf8rxmeW1yKlB76FSbW80XXNrUes6eK/xHg==}
+
+ '@walletconnect/utils@2.21.9':
+ resolution: {integrity: sha512-FHagysDvp7yQl+74veIeuqwZZnMiTyTW3Lw0NXsbIKnlmlSQu5pma+4EnRD/CnSzbN6PV39k2t1KBaaZ4PjDgg==}
+
+ '@walletconnect/utils@2.22.4':
+ resolution: {integrity: sha512-coAPrNiTiD+snpiXQyXakMVeYcddqVqII7aLU39TeILdPoXeNPc2MAja+MF7cKNM/PA3tespljvvxck/oTm4+Q==}
+
+ '@walletconnect/window-getters@1.0.1':
+ resolution: {integrity: sha512-vHp+HqzGxORPAN8gY03qnbTMnhqIwjeRJNOMOAzePRg4xVEEE2WvYsI9G2NMjOknA8hnuYbU3/hwLcKbjhc8+Q==}
+
+ '@walletconnect/window-metadata@1.0.1':
+ resolution: {integrity: sha512-9koTqyGrM2cqFRW517BPY/iEtUDx2r1+Pwwu5m7sJ7ka79wi3EyqhqcICk/yDmv6jAS1rjKgTKXlEhanYjijcA==}
+
'@whatwg-node/disposablestack@0.0.6':
resolution: {integrity: sha512-LOtTn+JgJvX8WfBVJtF08TGrdjuFzGJc4mkP8EdDI8ADbvO7kiexYep1o8dwnt0okb0jYclCDXF13xU7Ge4zSw==}
engines: {node: '>=18.0.0'}
@@ -1651,6 +1974,17 @@ packages:
zod:
optional: true
+ abitype@1.0.8:
+ resolution: {integrity: sha512-ZeiI6h3GnW06uYDLx0etQtX/p8E24UaHHBj57RSjK7YBFe7iuVn07EDpOeP451D06sF27VOz9JJPlIKJmXgkEg==}
+ peerDependencies:
+ typescript: '>=5.0.4'
+ zod: ^3 >=3.22.0
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+ zod:
+ optional: true
+
abitype@1.2.3:
resolution: {integrity: sha512-Ofer5QUnuUdTFsBRwARMoWKOH1ND5ehwYhJ3OJ/BQO+StkwQjHw0XyVh4vDttzHB7QOFhPHa/o413PJ82gU/Tg==}
peerDependencies:
@@ -1744,6 +2078,10 @@ packages:
resolution: {integrity: sha512-LndMvYuAPf4rC195lk7oSFuHOYFpOszIYrNYv0gHAvz+aEhE9qPZLhmrIz5pXP2BSsPOXvsuHDXEGaiQhIh9wA==}
engines: {node: '>=16.0.0', npm: '>=7.0.0'}
+ anymatch@3.1.3:
+ resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
+ engines: {node: '>= 8'}
+
apisauce@2.1.6:
resolution: {integrity: sha512-MdxR391op/FucS2YQRfB/NMRyCnHEPDd4h17LRIuVYi0BpGmMhpxc0shbOpfs5ahABuBEffNCGal5EcsydbBWg==}
@@ -1761,6 +2099,10 @@ packages:
argparse@2.0.1:
resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
+ aria-hidden@1.2.6:
+ resolution: {integrity: sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==}
+ engines: {node: '>=10'}
+
aria-query@5.3.0:
resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==}
@@ -1856,6 +2198,9 @@ packages:
bare-url@2.5.4:
resolution: {integrity: sha512-Gxa7UVWBr0/edU1b+TJhn/AZvMQUj9OGspvYsaTYQrAbZA4BOTZGL3LiZxvD+CeMlDH4juwD84+eTAp/bLYW5g==}
+ base-x@5.0.1:
+ resolution: {integrity: sha512-M7uio8Zt++eg3jPj+rHMfCC+IuygQHHCOU+IYsVtik6FWjuYpVt/+MRKcgsAMHh8mMFAwnB+Bs+mTrFiXjMzKg==}
+
base64-js@1.5.1:
resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
@@ -1865,6 +2210,9 @@ packages:
bidi-js@1.1.0:
resolution: {integrity: sha512-fX1Onk0tdVPC7obPWB5EbJ1z7NVhLq4m2xZLq2YXBkxzMXIGRpNMU88n0EPgWseKl12J7zXs7qrDxPK4sRs2fg==}
+ big.js@6.2.2:
+ resolution: {integrity: sha512-y/ie+Faknx7sZA5MfGA2xKlu0GDv8RWrXGsmlteyJQ2lvoKv9GBK/fpRMc2qlSoBAgNxrixICFCBefIq8WCQpQ==}
+
bignumber.js@9.3.1:
resolution: {integrity: sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==}
@@ -1885,6 +2233,9 @@ packages:
blake3-wasm@2.1.5:
resolution: {integrity: sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==}
+ blakejs@1.2.1:
+ resolution: {integrity: sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==}
+
blob-to-it@2.0.12:
resolution: {integrity: sha512-0zEZt8t8/QrdH4boktG19F/9fqfPWFjuh1QlK0qTCO13oUWaBAR8kpNloQNb3OWUtaA0mu8qfPy0R3CZDC8M2g==}
@@ -1905,6 +2256,9 @@ packages:
browser-readablestream-to-it@2.0.12:
resolution: {integrity: sha512-VDAcuM39JVtxZ7auqE2p0zHYk1fq+pac0cWLOQJ48MIChTZ1RjCR2PYCdL3kIisst7oGZCxYrJhfHlbNYIa0Tg==}
+ bs58@6.0.0:
+ resolution: {integrity: sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==}
+
buffer-alloc-unsafe@1.1.0:
resolution: {integrity: sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==}
@@ -1964,6 +2318,10 @@ packages:
resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
engines: {node: '>=6'}
+ camelcase@5.3.1:
+ resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==}
+ engines: {node: '>=6'}
+
canonicalize@2.1.0:
resolution: {integrity: sha512-F705O3xrsUtgt98j7leetNhTWPe+5S72rlL5O4jA1pKqBVQ/dT1O1D6PFxmSXvc0SUOinWS57DKx0I3CHrXJHQ==}
hasBin: true
@@ -1991,6 +2349,10 @@ packages:
resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==}
engines: {node: '>= 14.16.0'}
+ chokidar@5.0.0:
+ resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==}
+ engines: {node: '>= 20.19.0'}
+
chownr@1.1.4:
resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==}
@@ -2014,6 +2376,9 @@ packages:
resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==}
engines: {node: '>= 12'}
+ cliui@6.0.0:
+ resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==}
+
cliui@8.0.1:
resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==}
engines: {node: '>=12'}
@@ -2022,6 +2387,14 @@ packages:
resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==}
engines: {node: '>=0.8'}
+ clsx@1.2.1:
+ resolution: {integrity: sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==}
+ engines: {node: '>=6'}
+
+ clsx@2.1.1:
+ resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==}
+ engines: {node: '>=6'}
+
color-convert@1.9.3:
resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==}
@@ -2035,6 +2408,9 @@ packages:
color-name@1.1.4:
resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
+ colorette@2.0.20:
+ resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==}
+
colors@1.4.0:
resolution: {integrity: sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==}
engines: {node: '>=0.1.90'}
@@ -2056,6 +2432,9 @@ packages:
resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==}
engines: {node: '>= 0.6'}
+ cookie-es@1.2.3:
+ resolution: {integrity: sha512-lXVyvUvrNXblMqzIRrxHb57UUVmqsSWlxqt3XIjCkUP0wDAf6uicO6KMbEgYrMNtEvWgWHwe42CKxPu9MYAnWw==}
+
cookie@1.1.1:
resolution: {integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==}
engines: {node: '>=18'}
@@ -2089,6 +2468,9 @@ packages:
resolution: {integrity: sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==}
engines: {node: '>= 14'}
+ cross-fetch@3.2.0:
+ resolution: {integrity: sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==}
+
cross-spawn@7.0.3:
resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==}
engines: {node: '>= 8'}
@@ -2097,6 +2479,9 @@ packages:
resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
engines: {node: '>= 8'}
+ crossws@0.3.5:
+ resolution: {integrity: sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==}
+
css-tree@3.2.1:
resolution: {integrity: sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==}
engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0}
@@ -2115,6 +2500,12 @@ packages:
resolution: {integrity: sha512-23XHcCF+coGYevirZceTVD7NdJOqVn+49IHyxgszm+JIiHLoB2TkmPtsYkNWT1pvRSGkc35L6NHs0yHkN2SumA==}
engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0}
+ dateformat@4.6.3:
+ resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==}
+
+ dayjs@1.11.13:
+ resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==}
+
debug@4.4.3:
resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==}
engines: {node: '>=6.0'}
@@ -2124,6 +2515,10 @@ packages:
supports-color:
optional: true
+ decamelize@1.2.0:
+ resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==}
+ engines: {node: '>=0.10.0'}
+
decimal.js@10.6.0:
resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==}
@@ -2169,6 +2564,9 @@ packages:
resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==}
engines: {node: '>=12'}
+ defu@6.1.7:
+ resolution: {integrity: sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==}
+
delay@5.0.0:
resolution: {integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==}
engines: {node: '>=10'}
@@ -2177,10 +2575,19 @@ packages:
resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==}
engines: {node: '>=6'}
+ destr@2.0.5:
+ resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==}
+
+ detect-browser@5.3.0:
+ resolution: {integrity: sha512-53rsFbGdwMwlF7qvCt0ypLM5V5/Mbl0szB7GPN8y9NCcbknYOeVVXdrXEq+90IwAfrrzt6Hd+u2E2ntakICU8w==}
+
detect-libc@2.1.2:
resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==}
engines: {node: '>=8'}
+ dijkstrajs@1.0.3:
+ resolution: {integrity: sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==}
+
docker-compose@1.3.0:
resolution: {integrity: sha512-7Gevk/5eGD50+eMD+XDnFnOrruFkL0kSd7jEG4cjmqweDSUhB7i0g8is/nBdVpl+Bx338SqIB2GLKm32M+Vs6g==}
engines: {node: '>= 6.0.0'}
@@ -2204,6 +2611,9 @@ packages:
resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==}
engines: {node: '>= 0.4'}
+ duplexify@4.1.3:
+ resolution: {integrity: sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==}
+
eastasianwidth@0.2.0:
resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==}
@@ -2235,6 +2645,9 @@ packages:
emoji-regex@9.2.2:
resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==}
+ encode-utf8@1.0.3:
+ resolution: {integrity: sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==}
+
encoding@0.1.13:
resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==}
@@ -2273,6 +2686,9 @@ packages:
resolution: {integrity: sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==}
engines: {node: '>= 0.4'}
+ es-toolkit@1.39.3:
+ resolution: {integrity: sha512-Qb/TCFCldgOy8lZ5uC7nLGdqJwSabkQiYQShmw4jyiPk1pZzaYWTwaYKYP7EgLccWYgZocMrtItrwh683voaww==}
+
es6-promise@4.2.8:
resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==}
@@ -2376,6 +2792,9 @@ packages:
resolution: {integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==}
engines: {node: '> 0.1.90'}
+ fast-copy@3.1.0:
+ resolution: {integrity: sha512-IuCOCDFM1F/s4LtG7Bjr3yUUwPHybyhqN74xk2cMYoP51vVeErMy8+6HGFchi/+45lW8uzhs6lBeEqks2GWt6A==}
+
fast-decode-uri-component@1.0.1:
resolution: {integrity: sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==}
@@ -2401,9 +2820,19 @@ packages:
fast-levenshtein@3.0.0:
resolution: {integrity: sha512-hKKNajm46uNmTlhHSyZkmToAc56uZJwYq7yrciZjqOxnlfQwERDQJmHPUp7m1m9wx8vgOe8IaCKZ5Kv2k1DdCQ==}
+ fast-password-entropy@1.1.1:
+ resolution: {integrity: sha512-dxm29/BPFrNgyEDygg/lf9c2xQR0vnQhG7+hZjAI39M/3um9fD4xiqG6F0ZjW6bya5m9CI0u6YryHGRtxCGCiw==}
+
fast-querystring@1.1.2:
resolution: {integrity: sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==}
+ fast-redact@3.5.0:
+ resolution: {integrity: sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==}
+ engines: {node: '>=6'}
+
+ fast-safe-stringify@2.1.1:
+ resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==}
+
fast-sha256@1.3.0:
resolution: {integrity: sha512-n11RGP/lrWEFI/bWdygLxhI+pVeo1ZYIVwvvPkW7azl/rOy+F3HYRZ2K5zeE9mmkhQppyv9sQFx0JM9UabnpPQ==}
@@ -2439,6 +2868,9 @@ packages:
resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==}
engines: {node: ^12.20 || >= 14.13}
+ fetch-retry@6.0.0:
+ resolution: {integrity: sha512-BUFj1aMubgib37I3v4q78fYo63Po7t4HUPTpQ6/QE6yK6cIQrP+W43FYToeTEyg5m2Y7eFUtijUuAv/PDlWuag==}
+
file-entry-cache@11.1.5:
resolution: {integrity: sha512-+PFTHITI08JIGhnNpGNI8T8inUpgZfk3GNEqfT9R2zZV2iFXg3CvqzSl/uEhs7TSGujYRELEANyDvS8Fj7+S7Q==}
@@ -2465,6 +2897,10 @@ packages:
resolution: {integrity: sha512-sJsgZ1sQH2UDuowPuMKg8az7Qc8F0jnj+SKkFWU/+T0xcFlgV5skgXOGUqmQzOdmW6ALA7AhJINWx3qFBkbLHA==}
engines: {node: '>=20'}
+ find-up@4.1.0:
+ resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==}
+ engines: {node: '>=8'}
+
find-up@5.0.0:
resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==}
engines: {node: '>=10'}
@@ -2627,6 +3063,9 @@ packages:
resolution: {integrity: sha512-mS1lbMsxgQj6hge1XZ6p7GPhbrtFwUFYi3wRzXAC/FmYnyXMTvvI3td3rjmQ2u8ewXueaSvRPWaEcgVVOT9Jnw==}
engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0}
+ h3@1.15.11:
+ resolution: {integrity: sha512-L3THSe2MPeBwgIZVSH5zLdBBU90TOxarvhK9d04IDY2AmVS8j2Jz2LIWtwsGOU3lu2I5jCN7FNvVfY2+XyF+mg==}
+
has-flag@3.0.0:
resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==}
engines: {node: '>=4'}
@@ -2657,6 +3096,9 @@ packages:
resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==}
engines: {node: '>= 0.4'}
+ help-me@5.0.0:
+ resolution: {integrity: sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==}
+
hookified@1.15.1:
resolution: {integrity: sha512-MvG/clsADq1GPM2KGo2nyfaWVyn9naPiXrqIe4jYjXNZQt238kWyOGrsyc/DmRAQ+Re6yeo6yX/yoNCG5KAEVg==}
@@ -2687,6 +3129,12 @@ packages:
resolution: {integrity: sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==}
engines: {node: '>=0.10.0'}
+ idb-keyval@6.2.1:
+ resolution: {integrity: sha512-8Sb3veuYCyrZL+VBt9LJfZjLUPWVvqn8tG28VqYNFCo43KHcKuq+b4EiXGeuaLAQWL2YmyDgMp2aSpH9JHsEQg==}
+
+ idb-keyval@6.3.0:
+ resolution: {integrity: sha512-um+2dgAWmYsu615EXpWVwSmapJhON0G43t3Ka/EVaohzPQXSMqKEqeDK/oIW3Ow+BXaF2PvSc+oBTFp793A5Ow==}
+
ieee754@1.2.1:
resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==}
@@ -2740,6 +3188,9 @@ packages:
ipfs-unixfs@11.2.5:
resolution: {integrity: sha512-uasYJ0GLPbViaTFsOLnL9YPjX5VmhnqtWRriogAHOe4ApmIi9VAOFBzgDHsUW2ub4pEa/EysbtWk126g2vkU/g==}
+ iron-webcrypto@1.2.1:
+ resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==}
+
is-arguments@1.2.0:
resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==}
engines: {node: '>= 0.4'}
@@ -2898,9 +3349,19 @@ packages:
engines: {node: '>=8'}
hasBin: true
+ jose@4.15.9:
+ resolution: {integrity: sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==}
+
jose@6.2.12:
resolution: {integrity: sha512-9NiFmJEex0sy2Dk58j2UGBSHgUs2ypF9eZSu4L6vjOX3Dp96Sw1F3uL+H+D1sx02jZZdzUT0HgvCy59CuvXcWw==}
+ joycon@3.1.1:
+ resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==}
+ engines: {node: '>=10'}
+
+ js-cookie@3.0.8:
+ resolution: {integrity: sha512-yeJd4aNAdYZQjaon2bpD/Gb0B/omw7HQOsynXXcOiWVCacbBcPlgn8S/d1X6blFSaHao7ozqtW7NZW19xpCtIw==}
+
js-tokens@4.0.0:
resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
@@ -2962,6 +3423,9 @@ packages:
keyv@5.6.0:
resolution: {integrity: sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==}
+ keyvaluestorage-interface@1.0.0:
+ resolution: {integrity: sha512-8t6Q3TclQ4uZynJY9IGr2+SsIGwK9JHcO6ootkHCGA0CrQCRy+VkouYNO2xicET6b9al7QKzpebNow+gkpCL8g==}
+
kleur@4.1.5:
resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==}
engines: {node: '>=6'}
@@ -2977,6 +3441,9 @@ packages:
resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
engines: {node: '>= 0.8.0'}
+ libphonenumber-js@1.13.12:
+ resolution: {integrity: sha512-uLVeV1c9OTk6qkdqnj+mpMD+ZdnZ0szVyWu58HwMmpwkHA1gCEkyjd3veZQXDnuw9KEwSRjcc9B1pS9XKIN1fA==}
+
light-my-request@6.6.0:
resolution: {integrity: sha512-CHYbu8RtboSIoVsHZ6Ye4cj4Aw/yg2oAFimlF7mNvfDV192LR7nDiKtSIfCuLT7KokPSTn/9kfVLm5OGN0A28A==}
@@ -3061,6 +3528,19 @@ packages:
lines-and-columns@1.2.4:
resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
+ lit-element@4.2.2:
+ resolution: {integrity: sha512-aFKhNToWxoyhkNDmWZwEva2SlQia+jfG0fjIWV//YeTaWrVnOxD89dPKfigCUspXFmjzOEUQpOkejH5Ly6sG0w==}
+
+ lit-html@3.3.3:
+ resolution: {integrity: sha512-el8M6jK2o3RXBnrSHX3ZKrsN8zEV63pSExTO1wYJz7QndGYZ8353e2a5PPX+qHe2aGayfnchQmkAojaWAREOIA==}
+
+ lit@3.3.0:
+ resolution: {integrity: sha512-DGVsqsOIHBww2DqnuZzW7QsuCdahp50ojuDaBPC7jUDRpYoH0z7kHBBYZewRzer75FwtrkmkKk7iOAwSaWdBmw==}
+
+ locate-path@5.0.0:
+ resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==}
+ engines: {node: '>=8'}
+
locate-path@6.0.0:
resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
engines: {node: '>=10'}
@@ -3131,6 +3611,11 @@ packages:
resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==}
engines: {node: '>=10'}
+ lucide-react@0.475.0:
+ resolution: {integrity: sha512-NJzvVu1HwFVeZ+Gwq2q00KygM1aBhy/ZrhY9FsAgJtpB+E4R7uxRk9M2iKvHa6/vNxZydIB59htha4c2vvwvVg==}
+ peerDependencies:
+ react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0
+
lz-string@1.5.0:
resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==}
hasBin: true
@@ -3190,10 +3675,21 @@ packages:
resolution: {integrity: sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==}
engines: {node: '>=16 || 14 >=14.17'}
+ minimist@1.2.8:
+ resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
+
minipass@7.1.3:
resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==}
engines: {node: '>=16 || 14 >=14.17'}
+ mipd@0.0.7:
+ resolution: {integrity: sha512-aAPZPNDQ3uMTdKbuO2YmAw2TxLHO0moa4YKAyETM/DTj5FloZo+a+8tU+iv4GmW+sOxKLSRwcSFuczk+Cpt6fg==}
+ peerDependencies:
+ typescript: '>=5.0.4'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
mkdirp-classic@0.5.3:
resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==}
@@ -3218,6 +3714,9 @@ packages:
multiformats@14.0.5:
resolution: {integrity: sha512-vbIm83F2yZ1pWJGS0yl0ysracIvv56LtbrIyiIQHoLdYDJOMoLfVFsXhh9DUH4SFdkdkFhucyWniihsNzVEjkQ==}
+ multiformats@9.9.0:
+ resolution: {integrity: sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==}
+
mute-stream@2.0.0:
resolution: {integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==}
engines: {node: ^18.17.0 || >=20.5.0}
@@ -3248,10 +3747,25 @@ packages:
engines: {node: '>=10.5.0'}
deprecated: Use your platform's native DOMException instead
+ node-fetch-native@1.6.7:
+ resolution: {integrity: sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==}
+
+ node-fetch@2.7.0:
+ resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==}
+ engines: {node: 4.x || >=6.0.0}
+ peerDependencies:
+ encoding: ^0.1.0
+ peerDependenciesMeta:
+ encoding:
+ optional: true
+
node-fetch@3.3.2:
resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ node-mock-http@1.0.5:
+ resolution: {integrity: sha512-KQyt/wLjG3TAc7DOUhpqWzgd4ERxR80JOlTK5VE5R1S12IaPVN5qkj4klBce9HPG1Njuup4Sb5bljaT34lIyjw==}
+
normalize-path@3.0.0:
resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
engines: {node: '>=0.10.0'}
@@ -3268,6 +3782,12 @@ packages:
resolution: {integrity: sha512-4a+OsYv9UktOJKE+l1A4OufDgdRF9PifWj+tJnHURo/P+WOxpG4GzUFL9qCalmWauao6ogiG+QvnCovwPoyAWA==}
engines: {node: '>=12.20.0'}
+ ofetch@1.5.1:
+ resolution: {integrity: sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==}
+
+ on-exit-leak-free@0.2.0:
+ resolution: {integrity: sha512-dqaz3u44QbRXQooZLTUKU41ZrzYrcvLISVgbrzbyCMxpmSLJvZ3ZamIJIZ29P6OhZIkNIQKosdeM6t1LYbA9hg==}
+
on-exit-leak-free@2.1.2:
resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==}
engines: {node: '>=14.0.0'}
@@ -3299,6 +3819,30 @@ packages:
typescript:
optional: true
+ ox@0.6.9:
+ resolution: {integrity: sha512-wi5ShvzE4eOcTwQVsIPdFr+8ycyX+5le/96iAJutaZAvCes1J0+RvpEPg5QDPDiaR0XQQAvZVl7AwqQcINuUug==}
+ peerDependencies:
+ typescript: '>=5.4.0'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
+ ox@0.9.1:
+ resolution: {integrity: sha512-NVI0cajROntJWtFnxZQ1aXDVy+c6DLEXJ3wwON48CgbPhmMJrpRTfVbuppR+47RmXm3lZ/uMaKiFSkLdAO1now==}
+ peerDependencies:
+ typescript: '>=5.4.0'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
+ ox@0.9.3:
+ resolution: {integrity: sha512-KzyJP+fPV4uhuuqrTZyok4DC7vFzi7HLUFiUNEmpbyh59htKWkOC98IONC1zgXJPbHAhQgqs6B0Z6StCGhmQvg==}
+ peerDependencies:
+ typescript: '>=5.4.0'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
p-defer@3.0.0:
resolution: {integrity: sha512-ugZxsxmtTln604yeYd29EGrNhazN2lywetzpKhfmQjW/VJmhpDmWbiX+h0zL8V91R0UXkhb3KtPmyq9PZw3aYw==}
engines: {node: '>=8'}
@@ -3310,10 +3854,18 @@ packages:
p-fifo@1.0.0:
resolution: {integrity: sha512-IjoCxXW48tqdtDFz6fqo5q1UfFVjjVZe8TC1QRflvNUJtNfCUhxOUw6MOVZhDPjqhSzc26xKdugsO17gmzd5+A==}
+ p-limit@2.3.0:
+ resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==}
+ engines: {node: '>=6'}
+
p-limit@3.1.0:
resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
engines: {node: '>=10'}
+ p-locate@4.1.0:
+ resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==}
+ engines: {node: '>=8'}
+
p-locate@5.0.0:
resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
engines: {node: '>=10'}
@@ -3326,6 +3878,10 @@ packages:
resolution: {integrity: sha512-AxTM2wDGORHGEkPCt8yqxOTMgpfbEHqF51f/5fJCmwFC3C/zNcGT63SymH2ttOAaiIws2zVg4+izQCjrakcwHg==}
engines: {node: '>=20'}
+ p-try@2.2.0:
+ resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==}
+ engines: {node: '>=6'}
+
package-json-from-dist@1.0.1:
resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==}
@@ -3441,16 +3997,40 @@ packages:
resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==}
engines: {node: '>=0.10.0'}
+ pino-abstract-transport@0.5.0:
+ resolution: {integrity: sha512-+KAgmVeqXYbTtU2FScx1XS3kNyfZ5TrXY07V96QnUSFqo2gAqlvmaxH67Lj7SWazqsMabf+58ctdTcBgnOLUOQ==}
+
+ pino-abstract-transport@1.2.0:
+ resolution: {integrity: sha512-Guhh8EZfPCfH+PMXAb6rKOjGQEoy0xlAIn+irODG5kgfYV+BQ0rGYYWTIel3P5mmyXqkYkPmdIkywsn6QKUR1Q==}
+
+ pino-abstract-transport@2.0.0:
+ resolution: {integrity: sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw==}
+
pino-abstract-transport@3.0.0:
resolution: {integrity: sha512-wlfUczU+n7Hy/Ha5j9a/gZNy7We5+cXp8YL+X+PG8S0KXxw7n/JXA3c46Y0zQznIJ83URJiwy7Lh56WLokNuxg==}
+ pino-pretty@10.3.1:
+ resolution: {integrity: sha512-az8JbIYeN/1iLj2t0jR9DV48/LQ3RC6hZPpapKPkb84Q+yTidMCpgWxIT3N0flnBDilyBQ1luWNpOeJptjdp/g==}
+ hasBin: true
+
+ pino-std-serializers@4.0.0:
+ resolution: {integrity: sha512-cK0pekc1Kjy5w9V2/n+8MkZwusa6EyyxfeQCB799CQRhRt/CqYKiWs5adeu8Shve2ZNffvfC/7J64A2PJo1W/Q==}
+
pino-std-serializers@7.1.0:
resolution: {integrity: sha512-BndPH67/JxGExRgiX1dX0w1FvZck5Wa4aal9198SrRhZjH3GxKQUKIBnYJTdj2HDN3UQAS06HlfcSbQj2OHmaw==}
+ pino@10.0.0:
+ resolution: {integrity: sha512-eI9pKwWEix40kfvSzqEP6ldqOoBIN7dwD/o91TY5z8vQI12sAffpR/pOqAD1IVVwIVHDpHjkq0joBPdJD0rafA==}
+ hasBin: true
+
pino@10.3.1:
resolution: {integrity: sha512-r34yH/GlQpKZbU1BvFFqOjhISRo1MNx1tWYsYvmj6KIRHSPMT2+yHOEb1SG6NMvRoHRF0a07kCOox/9yakl1vg==}
hasBin: true
+ pino@7.11.0:
+ resolution: {integrity: sha512-dMACeu63HtRLmCG8VKdy4cShCPKaYDR4youZqoSWLxl5Gu99HUw8bw75thbPv9Nip+H+QYX8o3ZJbTdVZZ2TVg==}
+ hasBin: true
+
playwright-core@1.63.0:
resolution: {integrity: sha512-rYCsBF/M5HjUch52bbtVONEFjv6Xu8sm8h72dNlR5bzIE1fvC/bxgspzkjSfU+MweEMmPM8KJebG6nnyxo5mCg==}
engines: {node: '>=20'}
@@ -3465,6 +4045,10 @@ packages:
resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==}
engines: {node: '>=4'}
+ pngjs@5.0.0:
+ resolution: {integrity: sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==}
+ engines: {node: '>=10.13.0'}
+
possible-typed-array-names@1.1.0:
resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==}
engines: {node: '>= 0.4'}
@@ -3493,6 +4077,17 @@ packages:
resolution: {integrity: sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==}
engines: {node: '>=20'}
+ preact@10.24.2:
+ resolution: {integrity: sha512-1cSoF0aCC8uaARATfrlz4VCBqE8LwZwRfLgkxJOQwAlQt6ayTmi0D9OF7nXid1POI5SZidFuG9CnlXbDfLqY/Q==}
+
+ preact@10.29.8:
+ resolution: {integrity: sha512-ej2aVZ+vZ8WO7tvlQWRM9N63A0KzF9q4mWJfDUHgYaIofWY9hu74QdnQrjoPMmZi2/nZ5gN0bJCQF49xQqx09Q==}
+ peerDependencies:
+ preact-render-to-string: '>=5'
+ peerDependenciesMeta:
+ preact-render-to-string:
+ optional: true
+
prelude-ls@1.2.1:
resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
engines: {node: '>= 0.8.0'}
@@ -3514,6 +4109,9 @@ packages:
process-nextick-args@2.0.1:
resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==}
+ process-warning@1.0.0:
+ resolution: {integrity: sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q==}
+
process-warning@4.0.1:
resolution: {integrity: sha512-3c2LzQ3rY9d0hc1emcsHhfT9Jwz0cChib/QN89oME2R451w5fy3f0afAhERFZAwrbDU43wk12d0ORBpDVME50Q==}
@@ -3551,6 +4149,9 @@ packages:
protons-runtime@7.0.0:
resolution: {integrity: sha512-r/e72006xoVND4Uvf1aIs4OQOkJaASBU3ip4DzOWAktoKAkTiOYqKoS3TYMBm8HnnYU8+h0uEzr5gIRwk/pmTg==}
+ proxy-compare@3.0.1:
+ resolution: {integrity: sha512-V9plBAt3qjMlS1+nC8771KNf6oJ12gExvaxnNzN/9yVRLdTv/lc+oJlnSzrdYDAvBfTStPCoiaCOTmTs0adv7Q==}
+
pump@3.0.4:
resolution: {integrity: sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==}
@@ -3562,12 +4163,37 @@ packages:
resolution: {integrity: sha512-+Owyggi9IxT1ePKGafcI87ubSmxol6smwJ+RAHDQlx9+9cPwFWDiKFFCPuWhr9ignlGpZ9vDQLw67N4dcTVFEA==}
engines: {node: '>=20'}
+ qrcode@1.5.3:
+ resolution: {integrity: sha512-puyri6ApkEHYiVl4CFzo1tDkAZ+ATcnbJrJ6RiBM1Fhctdn/ix9MTE3hRph33omisEbC/2fcfemsseiKgBPKZg==}
+ engines: {node: '>=10.13.0'}
+ hasBin: true
+
+ qrcode@1.5.4:
+ resolution: {integrity: sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg==}
+ engines: {node: '>=10.13.0'}
+ hasBin: true
+
queue-microtask@1.2.3:
resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
quick-format-unescaped@4.0.4:
resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==}
+ radix3@1.1.2:
+ resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==}
+
+ react-aria@3.52.1:
+ resolution: {integrity: sha512-fdZZruC9/x/joCg0mhKGs5aHpwrXLCSZ4GOJmhhYyiE0ffyEsk9MLFt9LCOCF9tn8ErTD+UDQP4oDUSlZkmpCg==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+ react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ react-device-detect@2.2.3:
+ resolution: {integrity: sha512-buYY3qrCnQVlIFHrC5UcUoAj7iANs/+srdkwsnNjI7anr3Tt7UY6MqNxtMLlr0tMBied0O49UZVK8XKs3ZIiPw==}
+ peerDependencies:
+ react: '>= 0.14.0'
+ react-dom: '>= 0.14.0'
+
react-dom@19.2.8:
resolution: {integrity: sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==}
peerDependencies:
@@ -3579,6 +4205,11 @@ packages:
react-native-fetch-api@3.0.0:
resolution: {integrity: sha512-g2rtqPjdroaboDKTsJCTlcmtw54E25OjyaunUP0anOZn4Fuo2IKs8BVfe02zVggA/UysbmfSnRJIqtNkAgggNA==}
+ react-stately@3.50.0:
+ resolution: {integrity: sha512-TnckvpDQGU0672wEaLZqdzvhuSeXWjgW6vijMWxiKOxc8CosQUfPGISdcZyfHqjX3XMjEtRxj4w9HumvX4h4mw==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
react@19.2.8:
resolution: {integrity: sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==}
engines: {node: '>=0.10.0'}
@@ -3601,6 +4232,14 @@ packages:
resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==}
engines: {node: '>= 14.18.0'}
+ readdirp@5.1.1:
+ resolution: {integrity: sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==}
+ engines: {node: '>= 20.19.0'}
+
+ real-require@0.1.0:
+ resolution: {integrity: sha512-r/H9MzAWtrv8aSVjPCMFpDMl5q66GqtmmRkRjpHTsp4zBAa+snZyiQNlMONiUmEJcsnaw0wCauJ2GWODr/aFkg==}
+ engines: {node: '>= 12.13.0'}
+
real-require@0.2.0:
resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==}
engines: {node: '>= 12.13.0'}
@@ -3620,6 +4259,9 @@ packages:
resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==}
engines: {node: '>=0.10.0'}
+ require-main-filename@2.0.0:
+ resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==}
+
resolve-from@4.0.0:
resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
engines: {node: '>=4'}
@@ -3688,9 +4330,15 @@ packages:
scheduler@0.27.0:
resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==}
+ secure-json-parse@2.7.0:
+ resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==}
+
secure-json-parse@4.1.0:
resolution: {integrity: sha512-l4KnYfEyqYJxDwlNVyRfO2E4NTHfMKAWdUuA8J0yve2Dz/E/PdBepY03RvyJpssIpRFwJoCD55wA+mEDs6ByWA==}
+ secure-password-utilities@0.2.1:
+ resolution: {integrity: sha512-znUg8ae3cpuAaogiFBhP82gD2daVkSz4Qv/L7OWjB7wWvfbCdeqqQuJkm2/IvhKQPOV0T739YPR6rb7vs0uWaw==}
+
seek-bzip@1.0.6:
resolution: {integrity: sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ==}
hasBin: true
@@ -3700,6 +4348,11 @@ packages:
engines: {node: '>=10'}
hasBin: true
+ semver@7.7.2:
+ resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==}
+ engines: {node: '>=10'}
+ hasBin: true
+
semver@7.7.3:
resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==}
engines: {node: '>=10'}
@@ -3710,6 +4363,9 @@ packages:
engines: {node: '>=10'}
hasBin: true
+ set-blocking@2.0.0:
+ resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==}
+
set-cookie-parser@2.7.2:
resolution: {integrity: sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==}
@@ -3739,6 +4395,15 @@ packages:
resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==}
engines: {node: '>=14'}
+ slow-redact@0.3.2:
+ resolution: {integrity: sha512-MseHyi2+E/hBRqdOi5COy6wZ7j7DxXRz9NkseavNYSvvWC06D8a5cidVZX3tcG5eCW3NIyVU4zT63hw0Q486jw==}
+
+ sonic-boom@2.8.0:
+ resolution: {integrity: sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg==}
+
+ sonic-boom@3.8.1:
+ resolution: {integrity: sha512-y4Z8LCDBuum+PBP3lSV7RHrXscqksve/bi0as7mhwVnBW+/wUqKT/2Kb7um8yqcFy0duYbbPxzt89Zy2nOCaxg==}
+
sonic-boom@4.2.1:
resolution: {integrity: sha512-w6AxtubXa2wTXAUsZMMWERrsIRAdrK0Sc+FUytWvYAhBJLyuI4llrMIC1DtlNSdI99EI86KZum2MMq3EAZlF9Q==}
@@ -3782,6 +4447,9 @@ packages:
stream-json@1.9.1:
resolution: {integrity: sha512-uWkjJ+2Nt/LO9Z/JyKZbMusL8Dkh97uUBTv3AJQ74y07lVahLY4eEFsPsE97pxYBwr8nnjMAIch5eqI0gPShyw==}
+ stream-shift@1.0.3:
+ resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==}
+
stream-to-it@1.0.1:
resolution: {integrity: sha512-AqHYAYPHcmvMrcLNgncE/q0Aj/ajP6A4qGhxP6EVn7K3YTNs0bJpJyk57wc2Heb7MUL64jurvmnmui8D9kjZgA==}
@@ -3821,6 +4489,32 @@ packages:
resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==}
engines: {node: '>=6'}
+ strip-json-comments@3.1.1:
+ resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
+ engines: {node: '>=8'}
+
+ styled-components@6.5.3:
+ resolution: {integrity: sha512-vAX79sfpmUerP9fsTTxoTrBDE0RuO4ahjInyWYoohNgqrdg63Ms4q6FJ/o2Fyity82NU3cujOT8Ewl9TThBdwg==}
+ engines: {node: '>= 16'}
+ peerDependencies:
+ css-to-react-native: '>= 3.2.0'
+ react: '>= 16.8.0'
+ react-dom: '>= 16.8.0'
+ react-native: '>= 0.68.0'
+ peerDependenciesMeta:
+ css-to-react-native:
+ optional: true
+ react-dom:
+ optional: true
+ react-native:
+ optional: true
+
+ stylis@4.3.6:
+ resolution: {integrity: sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==}
+
+ stylis@4.4.0:
+ resolution: {integrity: sha512-5Z9ZpRzfuH6l/UAvCPAPUo3665Nk2wLaZU3x+TLHKVzIz33+sbJqbtrYoC3KD4/uVOr2Zp+L0LySezP9OHV9yA==}
+
supports-color@10.2.2:
resolution: {integrity: sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==}
engines: {node: '>=18'}
@@ -3843,6 +4537,9 @@ packages:
symbol-tree@3.2.4:
resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==}
+ tabbable@6.5.0:
+ resolution: {integrity: sha512-wieBHXygIm7OyQOu5hQlkk62/WyCFYGlWg7L6/ZCUZwx0o398Zkn4pVmMyfYhfMG8kGrj/Krt8eIk6UKC6VzwA==}
+
tar-fs@2.1.5:
resolution: {integrity: sha512-OboTd8mmMhZDNPV+UjQcK9yKAatXu2aJ+r1w4im1Otd4M4fl2hwvdoXUxIYHFTHWK/3y3FarBP70v3vwmGlOxw==}
@@ -3870,6 +4567,12 @@ packages:
text-decoder@1.2.7:
resolution: {integrity: sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ==}
+ thread-stream@0.15.2:
+ resolution: {integrity: sha512-UkEhKIg2pD+fjkHQKyJO3yoIvAP3N6RlNFt2dUhcS1FGvCD1cQa1M/PGknCLFIyZdtJOWQjejp7bdNqmN7zwdA==}
+
+ thread-stream@3.2.0:
+ resolution: {integrity: sha512-zLBvqpwr4Esa0kRjcrzGU6zL25lePWaCLMx0RQFrmteozIfeNdaMLpG5U7PeHzvlFkAWaRKA9/KVW4F60iB+qw==}
+
thread-stream@4.2.0:
resolution: {integrity: sha512-e2zZ96wSChazBsbENf/Pcm/4swHt2cEKQ92rhUjkL9GCKiTDJIaTBenjE/m9DXi0QBmTMDkFDdOomUy20A1tDQ==}
engines: {node: '>=20'}
@@ -3881,6 +4584,9 @@ packages:
resolution: {integrity: sha512-9APumHG7r4yOk4X4WlkmE71aZcv1gvin1czO3OQ1U9iJcFA5Ja/ygyb0vPOVHTthFozUYs8CLoLUlM8grb2lTQ==}
engines: {node: '>=20.0.0'}
+ tinycolor2@1.6.0:
+ resolution: {integrity: sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==}
+
tinyexec@1.3.0:
resolution: {integrity: sha512-QKAl9m8gWWGHV8jZcPeym6j+XULi6tOf1mT83WYJ4Lk2ytW/uwAWkrP0uFsdoYMdueVJ0qs26wZ+23xeB4ibNQ==}
engines: {node: '>=18'}
@@ -3919,6 +4625,9 @@ packages:
resolution: {integrity: sha512-exgYmnmL/sJpR3upZfXG5PoatXQii55xAiXGXzY+sROLZ/Y+SLcp9PgJNI9Vz37HpQ74WvDcLT8eqm+kV3FzrA==}
engines: {node: '>=16'}
+ tr46@0.0.3:
+ resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==}
+
tr46@6.0.0:
resolution: {integrity: sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==}
engines: {node: '>=20'}
@@ -3929,6 +4638,9 @@ packages:
peerDependencies:
typescript: '>=4.8.4'
+ tslib@1.14.1:
+ resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==}
+
tslib@2.8.1:
resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
@@ -3962,6 +4674,13 @@ packages:
engines: {node: '>=14.17'}
hasBin: true
+ ua-parser-js@1.0.41:
+ resolution: {integrity: sha512-LbBDqdIC5s8iROCUjMbW1f5dJQTEFB1+KO9ogbvlb3nm9n4YHa5p4KTvFPWvh2Hs8gZMBuiB1/8+pdfe/tDPug==}
+ hasBin: true
+
+ ufo@1.6.4:
+ resolution: {integrity: sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==}
+
uint8-varint@2.0.5:
resolution: {integrity: sha512-jeFLbL/x30wBRnWjKE1qVBXeumG46r7XmYkpis955lTQ+blccGKFrOsSMHlxePwYB1pI7L8YPHz1t4jLxEs3nA==}
@@ -3974,6 +4693,9 @@ packages:
uint8arraylist@3.0.2:
resolution: {integrity: sha512-LDVoq9BQaGJzGDUovEnoX6rpKCvnY/Jbtws4ikwnBzjRbq5qBAFpBZevUEbSmMM87aO0Sp+wOZy2ZXf5yODmXQ==}
+ uint8arrays@3.1.1:
+ resolution: {integrity: sha512-+QJa8QRnbdXVpHYjLoTpJIdCTiw9Ir62nocClWuXIq2JIh4Uta0cQsTSpFL678p2CN8B+XSApwcU+pQEqVpKWg==}
+
uint8arrays@5.1.1:
resolution: {integrity: sha512-9muQwa4wZG4dKi9gMAIBtnk2Pw87SRpvWTH6lOGm19V2Uqxr4uomUf2PGqPnWc+qs06sN8owUU4jfcoWOcfwVQ==}
@@ -3983,6 +4705,9 @@ packages:
unbzip2-stream@1.4.3:
resolution: {integrity: sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==}
+ uncrypto@0.1.3:
+ resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==}
+
undici-types@5.26.5:
resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==}
@@ -4011,12 +4736,79 @@ packages:
resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==}
engines: {node: '>= 10.0.0'}
+ unstorage@1.17.5:
+ resolution: {integrity: sha512-0i3iqvRfx29hkNntHyQvJTpf5W9dQ9ZadSoRU8+xVlhVtT7jAX57fazYO9EHvcRCfBCyi5YRya7XCDOsbTgkPg==}
+ peerDependencies:
+ '@azure/app-configuration': ^1.8.0
+ '@azure/cosmos': ^4.2.0
+ '@azure/data-tables': ^13.3.0
+ '@azure/identity': ^4.6.0
+ '@azure/keyvault-secrets': ^4.9.0
+ '@azure/storage-blob': ^12.26.0
+ '@capacitor/preferences': ^6 || ^7 || ^8
+ '@deno/kv': '>=0.9.0'
+ '@netlify/blobs': ^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0
+ '@planetscale/database': ^1.19.0
+ '@upstash/redis': ^1.34.3
+ '@vercel/blob': '>=0.27.1'
+ '@vercel/functions': ^2.2.12 || ^3.0.0
+ '@vercel/kv': ^1 || ^2 || ^3
+ aws4fetch: ^1.0.20
+ db0: '>=0.2.1'
+ idb-keyval: ^6.2.1
+ ioredis: ^5.4.2
+ uploadthing: ^7.4.4
+ peerDependenciesMeta:
+ '@azure/app-configuration':
+ optional: true
+ '@azure/cosmos':
+ optional: true
+ '@azure/data-tables':
+ optional: true
+ '@azure/identity':
+ optional: true
+ '@azure/keyvault-secrets':
+ optional: true
+ '@azure/storage-blob':
+ optional: true
+ '@capacitor/preferences':
+ optional: true
+ '@deno/kv':
+ optional: true
+ '@netlify/blobs':
+ optional: true
+ '@planetscale/database':
+ optional: true
+ '@upstash/redis':
+ optional: true
+ '@vercel/blob':
+ optional: true
+ '@vercel/functions':
+ optional: true
+ '@vercel/kv':
+ optional: true
+ aws4fetch:
+ optional: true
+ db0:
+ optional: true
+ idb-keyval:
+ optional: true
+ ioredis:
+ optional: true
+ uploadthing:
+ optional: true
+
uri-js@4.4.1:
resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
urlpattern-polyfill@10.1.0:
resolution: {integrity: sha512-IGjKp/o0NL3Bso1PymYURCJxMPNAf/ILOpendP9f5B6e1rTJgdgiOvgfoT8VxCAdY+Wisb9uhGaJJf3yZ2V9nw==}
+ use-sync-external-store@1.4.0:
+ resolution: {integrity: sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+
utf8-codec@1.0.0:
resolution: {integrity: sha512-S/QSLezp3qvG4ld5PUfXiH7mCFxLKjSVZRFkB3DOjgwHuJPFDkInAXc/anf7BAbHt/D38ozDzL+QMZ6/7gsI6w==}
@@ -4031,6 +4823,26 @@ packages:
deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).
hasBin: true
+ valtio@2.1.7:
+ resolution: {integrity: sha512-DwJhCDpujuQuKdJ2H84VbTjEJJteaSmqsuUltsfbfdbotVfNeTE4K/qc/Wi57I9x8/2ed4JNdjEna7O6PfavRg==}
+ engines: {node: '>=12.20.0'}
+ peerDependencies:
+ '@types/react': '>=18.0.0'
+ react: '>=18.0.0'
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ react:
+ optional: true
+
+ viem@2.36.0:
+ resolution: {integrity: sha512-Xz7AkGtR43K+NY74X2lBevwfRrsXuifGUzt8QiULO47NXIcT7g3jcA4nIvl5m2OTE5v8SlzishwXmg64xOIVmQ==}
+ peerDependencies:
+ typescript: '>=5.0.4'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
viem@2.56.3:
resolution: {integrity: sha512-vUObq3GO7D3lz9gPNEE/xd5jIUnMbeVDWewh252o54pDEDlW4pDe6FEd/qTGL5RyK52cGHMM7kQ3wjxhilEvkQ==}
peerDependencies:
@@ -4157,6 +4969,9 @@ packages:
resolution: {integrity: sha512-qn9id0/l1bWmvH4XfnG/JtGKKwut2Vokl6YXP5Kfg424npysmtRLe9DgiNBM9Op7QL/aSiaA0TVXibuIuWcizg==}
engines: {node: '>=14', npm: '>=6.12.0'}
+ webidl-conversions@3.0.1:
+ resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==}
+
webidl-conversions@8.0.1:
resolution: {integrity: sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==}
engines: {node: '>=20'}
@@ -4173,10 +4988,16 @@ packages:
resolution: {integrity: sha512-3GeworPmc2ZfEEHP7lEbUfBX/L75wdEsi0rLNhXcXxnoN5jyq0SL5gCy06SGW2cyTIZdTvWIDQNQoza++vKeaw==}
engines: {node: ^22.14.0 || >=24.0.0}
+ whatwg-url@5.0.0:
+ resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==}
+
wherearewe@2.0.1:
resolution: {integrity: sha512-XUguZbDxCA2wBn2LoFtcEhXL6AXo+hVjGonwhSTTTU9SzbWG8Xu3onNIpzf9j/mYUcJQ0f+m37SzG77G851uFw==}
engines: {node: '>=16.0.0', npm: '>=7.0.0'}
+ which-module@2.0.1:
+ resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==}
+
which-typed-array@1.1.22:
resolution: {integrity: sha512-fvO4ExWMFsqyhG3AiPAObMuY1lxaqgYcxbc49CNdWDDECOJNgQyvsOWVwbZc+qf3rzRtxojBK+CMEv0Ld5CYpw==}
engines: {node: '>= 0.4'}
@@ -4244,6 +5065,18 @@ packages:
utf-8-validate:
optional: true
+ ws@8.18.3:
+ resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==}
+ 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
+
ws@8.21.0:
resolution: {integrity: sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==}
engines: {node: '>=10.0.0'}
@@ -4275,6 +5108,9 @@ packages:
resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==}
engines: {node: '>=0.4'}
+ y18n@4.0.3:
+ resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==}
+
y18n@5.0.8:
resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==}
engines: {node: '>=10'}
@@ -4296,10 +5132,18 @@ packages:
engines: {node: '>= 14.6'}
hasBin: true
+ yargs-parser@18.1.3:
+ resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==}
+ engines: {node: '>=6'}
+
yargs-parser@21.1.1:
resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==}
engines: {node: '>=12'}
+ yargs@15.4.1:
+ resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==}
+ engines: {node: '>=8'}
+
yargs@17.7.3:
resolution: {integrity: sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g==}
engines: {node: '>=12'}
@@ -4325,9 +5169,48 @@ packages:
resolution: {integrity: sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==}
engines: {node: '>= 14'}
+ zod@3.22.4:
+ resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==}
+
zod@3.25.76:
resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==}
+ zustand@5.0.15:
+ resolution: {integrity: sha512-MpSEjRiBkA9crSYeOUH32rJC7SVqAbm0Fqcqge/bUi2PPoLcBWKOsG+C8mevmpr8TwXHBVkChbbJiyvkE+i/3A==}
+ engines: {node: '>=12.20.0'}
+ peerDependencies:
+ '@types/react': '>=18.0.0'
+ immer: '>=9.0.6'
+ react: '>=18.0.0'
+ use-sync-external-store: 1.4.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ immer:
+ optional: true
+ react:
+ optional: true
+ use-sync-external-store:
+ optional: true
+
+ zustand@5.0.3:
+ resolution: {integrity: sha512-14fwWQtU3pH4dE0dOpdMiWjddcH+QzKIgk1cl8epwSE7yag43k/AD/m4L6+K7DytAOr9gGBe3/EXj9g7cdostg==}
+ engines: {node: '>=12.20.0'}
+ peerDependencies:
+ '@types/react': '>=18.0.0'
+ immer: '>=9.0.6'
+ react: '>=18.0.0'
+ use-sync-external-store: 1.4.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ immer:
+ optional: true
+ react:
+ optional: true
+ use-sync-external-store:
+ optional: true
+
snapshots:
'@adraffy/ens-normalize@1.11.1': {}
@@ -4359,6 +5242,26 @@ snapshots:
'@balena/dockerignore@1.0.2': {}
+ '@base-org/account@1.1.1(@types/react@19.2.18)(react@19.2.8)(typescript@6.0.3)(use-sync-external-store@1.4.0(react@19.2.8))(zod@3.25.76)':
+ dependencies:
+ '@noble/hashes': 1.4.0
+ clsx: 1.2.1
+ eventemitter3: 5.0.1
+ idb-keyval: 6.2.1
+ ox: 0.6.9(typescript@6.0.3)(zod@3.25.76)
+ preact: 10.24.2
+ viem: 2.56.3(typescript@6.0.3)(zod@3.25.76)
+ zustand: 5.0.3(@types/react@19.2.18)(react@19.2.8)(use-sync-external-store@1.4.0(react@19.2.8))
+ transitivePeerDependencies:
+ - '@types/react'
+ - bufferutil
+ - immer
+ - react
+ - typescript
+ - use-sync-external-store
+ - utf-8-validate
+ - zod
+
'@bramus/specificity@2.4.2':
dependencies:
css-tree: 3.2.1
@@ -4404,6 +5307,15 @@ snapshots:
'@cloudflare/workerd-windows-64@1.20260826.1':
optional: true
+ '@coinbase/wallet-sdk@4.3.2':
+ dependencies:
+ '@noble/hashes': 1.8.0
+ clsx: 1.2.1
+ eventemitter3: 5.0.4
+ preact: 10.29.8
+ transitivePeerDependencies:
+ - preact-render-to-string
+
'@cspotcode/source-map-support@0.8.1':
dependencies:
'@jridgewell/trace-mapping': 0.3.9
@@ -4453,6 +5365,12 @@ snapshots:
tslib: 2.8.1
optional: true
+ '@emotion/is-prop-valid@1.4.0':
+ dependencies:
+ '@emotion/memoize': 0.9.0
+
+ '@emotion/memoize@0.9.0': {}
+
'@esbuild/aix-ppc64@0.28.1':
optional: true
@@ -4601,6 +5519,31 @@ snapshots:
graphql-import-node: 0.0.5(graphql@16.11.0)
js-yaml: 4.3.2
+ '@floating-ui/core@1.8.0':
+ dependencies:
+ '@floating-ui/utils': 0.2.12
+
+ '@floating-ui/dom@1.8.0':
+ dependencies:
+ '@floating-ui/core': 1.8.0
+ '@floating-ui/utils': 0.2.12
+
+ '@floating-ui/react-dom@2.1.9(react-dom@19.2.8(react@19.2.8))(react@19.2.8)':
+ dependencies:
+ '@floating-ui/dom': 1.8.0
+ react: 19.2.8
+ react-dom: 19.2.8(react@19.2.8)
+
+ '@floating-ui/react@0.26.28(react-dom@19.2.8(react@19.2.8))(react@19.2.8)':
+ dependencies:
+ '@floating-ui/react-dom': 2.1.9(react-dom@19.2.8(react@19.2.8))(react@19.2.8)
+ '@floating-ui/utils': 0.2.12
+ react: 19.2.8
+ react-dom: 19.2.8(react@19.2.8)
+ tabbable: 6.5.0
+
+ '@floating-ui/utils@0.2.12': {}
+
'@graphile/logger@0.2.0': {}
'@graphprotocol/graph-cli@0.98.1(@types/node@24.13.3)(supports-color@8.1.1)(typescript@6.0.3)(zod@3.25.76)':
@@ -4664,6 +5607,20 @@ snapshots:
protobufjs: 7.6.6
yargs: 17.7.3
+ '@headlessui/react@2.2.10(react-dom@19.2.8(react@19.2.8))(react@19.2.8)':
+ dependencies:
+ '@floating-ui/react': 0.26.28(react-dom@19.2.8(react@19.2.8))(react@19.2.8)
+ '@react-aria/focus': 3.22.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8)
+ '@react-aria/interactions': 3.28.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8)
+ '@tanstack/react-virtual': 3.14.11(react-dom@19.2.8(react@19.2.8))(react@19.2.8)
+ react: 19.2.8
+ react-dom: 19.2.8(react@19.2.8)
+ use-sync-external-store: 1.4.0(react@19.2.8)
+
+ '@heroicons/react@2.2.0(react@19.2.8)':
+ dependencies:
+ react: 19.2.8
+
'@hpke/chacha20poly1305@1.8.0':
dependencies:
'@hpke/common': 1.10.1
@@ -4921,6 +5878,18 @@ snapshots:
optionalDependencies:
'@types/node': 24.13.3
+ '@internationalized/date@3.12.4':
+ dependencies:
+ '@swc/helpers': 0.5.23
+
+ '@internationalized/number@3.6.8':
+ dependencies:
+ '@swc/helpers': 0.5.23
+
+ '@internationalized/string@3.2.10':
+ dependencies:
+ '@swc/helpers': 0.5.23
+
'@ipld/dag-cbor@9.2.7':
dependencies:
cborg: 5.1.11
@@ -5023,6 +5992,24 @@ snapshots:
multiformats: 13.4.2
uint8arrays: 5.1.1
+ '@lit-labs/ssr-dom-shim@1.6.0': {}
+
+ '@lit/react@1.0.8(@types/react@19.2.18)':
+ dependencies:
+ '@types/react': 19.2.18
+ optional: true
+
+ '@lit/reactive-element@2.1.2':
+ dependencies:
+ '@lit-labs/ssr-dom-shim': 1.6.0
+
+ '@marsidev/react-turnstile@1.6.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8)':
+ dependencies:
+ react: 19.2.8
+ react-dom: 19.2.8(react@19.2.8)
+
+ '@msgpack/msgpack@3.1.2': {}
+
'@multiformats/dns@1.0.15':
dependencies:
'@dnsquery/dns-packet': 6.1.1
@@ -5066,10 +6053,18 @@ snapshots:
dependencies:
'@noble/hashes': 1.4.0
+ '@noble/curves@1.8.0':
+ dependencies:
+ '@noble/hashes': 1.7.0
+
'@noble/curves@1.9.1':
dependencies:
'@noble/hashes': 1.8.0
+ '@noble/curves@1.9.6':
+ dependencies:
+ '@noble/hashes': 1.8.0
+
'@noble/curves@1.9.7':
dependencies:
'@noble/hashes': 1.8.0
@@ -5080,6 +6075,8 @@ snapshots:
'@noble/hashes@1.4.0': {}
+ '@noble/hashes@1.7.0': {}
+
'@noble/hashes@1.8.0': {}
'@noble/hashes@2.4.0': {}
@@ -5171,6 +6168,10 @@ snapshots:
'@oxc-project/types@0.115.0': {}
+ '@phosphor-icons/webcomponents@2.1.5':
+ dependencies:
+ lit: 3.3.0
+
'@pinax/graph-networks-registry@0.7.1': {}
'@pinojs/redact@0.4.0': {}
@@ -5206,6 +6207,35 @@ snapshots:
'@poppinss/exception@1.2.3': {}
+ '@privy-io/api-base@1.7.1':
+ dependencies:
+ zod: 3.25.76
+
+ '@privy-io/api-types@0.1.1': {}
+
+ '@privy-io/chains@0.0.5': {}
+
+ '@privy-io/ethereum@0.0.2(viem@2.56.3(typescript@6.0.3)(zod@3.25.76))':
+ dependencies:
+ viem: 2.56.3(typescript@6.0.3)(zod@3.25.76)
+
+ '@privy-io/js-sdk-core@0.57.1(viem@2.56.3(typescript@6.0.3)(zod@3.25.76))':
+ dependencies:
+ '@privy-io/api-base': 1.7.1
+ '@privy-io/chains': 0.0.5
+ '@privy-io/ethereum': 0.0.2(viem@2.56.3(typescript@6.0.3)(zod@3.25.76))
+ '@privy-io/routes': 0.0.2
+ canonicalize: 2.1.0
+ eventemitter3: 5.0.4
+ fetch-retry: 6.0.0
+ jose: 4.15.9
+ js-cookie: 3.0.8
+ libphonenumber-js: 1.13.12
+ set-cookie-parser: 2.7.2
+ uuid: 8.3.2
+ optionalDependencies:
+ viem: 2.56.3(typescript@6.0.3)(zod@3.25.76)
+
'@privy-io/node@0.34.0(viem@2.56.3(typescript@6.0.3)(zod@3.25.76))':
dependencies:
'@hpke/chacha20poly1305': 1.8.0
@@ -5220,6 +6250,87 @@ snapshots:
optionalDependencies:
viem: 2.56.3(typescript@6.0.3)(zod@3.25.76)
+ '@privy-io/popup@0.0.1': {}
+
+ '@privy-io/react-auth@3.6.1(@types/react@19.2.18)(encoding@0.1.13)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@6.0.3)(use-sync-external-store@1.4.0(react@19.2.8))(zod@3.25.76)':
+ dependencies:
+ '@base-org/account': 1.1.1(@types/react@19.2.18)(react@19.2.8)(typescript@6.0.3)(use-sync-external-store@1.4.0(react@19.2.8))(zod@3.25.76)
+ '@coinbase/wallet-sdk': 4.3.2
+ '@floating-ui/react': 0.26.28(react-dom@19.2.8(react@19.2.8))(react@19.2.8)
+ '@headlessui/react': 2.2.10(react-dom@19.2.8(react@19.2.8))(react@19.2.8)
+ '@heroicons/react': 2.2.0(react@19.2.8)
+ '@marsidev/react-turnstile': 1.6.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8)
+ '@privy-io/api-base': 1.7.1
+ '@privy-io/api-types': 0.1.1
+ '@privy-io/chains': 0.0.5
+ '@privy-io/ethereum': 0.0.2(viem@2.56.3(typescript@6.0.3)(zod@3.25.76))
+ '@privy-io/js-sdk-core': 0.57.1(viem@2.56.3(typescript@6.0.3)(zod@3.25.76))
+ '@privy-io/popup': 0.0.1
+ '@privy-io/routes': 0.0.2
+ '@privy-io/urls': 0.0.5
+ '@scure/base': 1.2.6
+ '@simplewebauthn/browser': 13.3.0
+ '@tanstack/react-virtual': 3.14.11(react-dom@19.2.8(react@19.2.8))(react@19.2.8)
+ '@wallet-standard/app': 1.1.1
+ '@walletconnect/ethereum-provider': 2.22.4(@types/react@19.2.18)(encoding@0.1.13)(react@19.2.8)(typescript@6.0.3)(zod@3.25.76)
+ '@walletconnect/universal-provider': 2.22.4(encoding@0.1.13)(typescript@6.0.3)(zod@3.25.76)
+ eventemitter3: 5.0.4
+ fast-password-entropy: 1.1.1
+ jose: 4.15.9
+ js-cookie: 3.0.8
+ lucide-react: 0.475.0(react@19.2.8)
+ mipd: 0.0.7(typescript@6.0.3)
+ ofetch: 1.5.1
+ pino-pretty: 10.3.1
+ qrcode: 1.5.4
+ react: 19.2.8
+ react-device-detect: 2.2.3(react-dom@19.2.8(react@19.2.8))(react@19.2.8)
+ react-dom: 19.2.8(react@19.2.8)
+ secure-password-utilities: 0.2.1
+ styled-components: 6.5.3(react-dom@19.2.8(react@19.2.8))(react@19.2.8)
+ stylis: 4.4.0
+ tinycolor2: 1.6.0
+ uuid: 8.3.2
+ viem: 2.56.3(typescript@6.0.3)(zod@3.25.76)
+ zustand: 5.0.15(@types/react@19.2.18)(react@19.2.8)(use-sync-external-store@1.4.0(react@19.2.8))
+ transitivePeerDependencies:
+ - '@azure/app-configuration'
+ - '@azure/cosmos'
+ - '@azure/data-tables'
+ - '@azure/identity'
+ - '@azure/keyvault-secrets'
+ - '@azure/storage-blob'
+ - '@capacitor/preferences'
+ - '@deno/kv'
+ - '@netlify/blobs'
+ - '@planetscale/database'
+ - '@react-native-async-storage/async-storage'
+ - '@types/react'
+ - '@upstash/redis'
+ - '@vercel/blob'
+ - '@vercel/functions'
+ - '@vercel/kv'
+ - aws4fetch
+ - bufferutil
+ - css-to-react-native
+ - db0
+ - encoding
+ - immer
+ - ioredis
+ - preact-render-to-string
+ - react-native
+ - typescript
+ - uploadthing
+ - use-sync-external-store
+ - utf-8-validate
+ - zod
+
+ '@privy-io/routes@0.0.2':
+ dependencies:
+ '@privy-io/api-types': 0.1.1
+
+ '@privy-io/urls@0.0.5': {}
+
'@protobufjs/aspromise@1.1.2': {}
'@protobufjs/base64@1.1.2': {}
@@ -5240,6 +6351,290 @@ snapshots:
'@protobufjs/utf8@1.1.2': {}
+ '@react-aria/focus@3.22.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8)':
+ dependencies:
+ '@swc/helpers': 0.5.23
+ react: 19.2.8
+ react-aria: 3.52.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8)
+ react-dom: 19.2.8(react@19.2.8)
+
+ '@react-aria/interactions@3.28.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8)':
+ dependencies:
+ '@react-types/shared': 3.36.1(react@19.2.8)
+ '@swc/helpers': 0.5.23
+ react: 19.2.8
+ react-aria: 3.52.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8)
+ react-dom: 19.2.8(react@19.2.8)
+
+ '@react-types/shared@3.36.1(react@19.2.8)':
+ dependencies:
+ react: 19.2.8
+
+ '@reown/appkit-common@1.8.9(typescript@6.0.3)(zod@3.22.4)':
+ dependencies:
+ big.js: 6.2.2
+ dayjs: 1.11.13
+ viem: 2.56.3(typescript@6.0.3)(zod@3.22.4)
+ transitivePeerDependencies:
+ - bufferutil
+ - typescript
+ - utf-8-validate
+ - zod
+
+ '@reown/appkit-common@1.8.9(typescript@6.0.3)(zod@3.25.76)':
+ dependencies:
+ big.js: 6.2.2
+ dayjs: 1.11.13
+ viem: 2.56.3(typescript@6.0.3)(zod@3.25.76)
+ transitivePeerDependencies:
+ - bufferutil
+ - typescript
+ - utf-8-validate
+ - zod
+
+ '@reown/appkit-controllers@1.8.9(@types/react@19.2.18)(encoding@0.1.13)(react@19.2.8)(typescript@6.0.3)(zod@3.25.76)':
+ dependencies:
+ '@reown/appkit-common': 1.8.9(typescript@6.0.3)(zod@3.25.76)
+ '@reown/appkit-wallet': 1.8.9(typescript@6.0.3)
+ '@walletconnect/universal-provider': 2.21.9(encoding@0.1.13)(typescript@6.0.3)(zod@3.25.76)
+ valtio: 2.1.7(@types/react@19.2.18)(react@19.2.8)
+ viem: 2.56.3(typescript@6.0.3)(zod@3.25.76)
+ transitivePeerDependencies:
+ - '@azure/app-configuration'
+ - '@azure/cosmos'
+ - '@azure/data-tables'
+ - '@azure/identity'
+ - '@azure/keyvault-secrets'
+ - '@azure/storage-blob'
+ - '@capacitor/preferences'
+ - '@deno/kv'
+ - '@netlify/blobs'
+ - '@planetscale/database'
+ - '@react-native-async-storage/async-storage'
+ - '@types/react'
+ - '@upstash/redis'
+ - '@vercel/blob'
+ - '@vercel/functions'
+ - '@vercel/kv'
+ - aws4fetch
+ - bufferutil
+ - db0
+ - encoding
+ - ioredis
+ - react
+ - typescript
+ - uploadthing
+ - utf-8-validate
+ - zod
+
+ '@reown/appkit-pay@1.8.9(@types/react@19.2.18)(encoding@0.1.13)(react@19.2.8)(typescript@6.0.3)(zod@3.25.76)':
+ dependencies:
+ '@reown/appkit-common': 1.8.9(typescript@6.0.3)(zod@3.25.76)
+ '@reown/appkit-controllers': 1.8.9(@types/react@19.2.18)(encoding@0.1.13)(react@19.2.8)(typescript@6.0.3)(zod@3.25.76)
+ '@reown/appkit-ui': 1.8.9(@types/react@19.2.18)(encoding@0.1.13)(react@19.2.8)(typescript@6.0.3)(zod@3.25.76)
+ '@reown/appkit-utils': 1.8.9(@types/react@19.2.18)(encoding@0.1.13)(react@19.2.8)(typescript@6.0.3)(valtio@2.1.7(@types/react@19.2.18)(react@19.2.8))(zod@3.25.76)
+ lit: 3.3.0
+ valtio: 2.1.7(@types/react@19.2.18)(react@19.2.8)
+ transitivePeerDependencies:
+ - '@azure/app-configuration'
+ - '@azure/cosmos'
+ - '@azure/data-tables'
+ - '@azure/identity'
+ - '@azure/keyvault-secrets'
+ - '@azure/storage-blob'
+ - '@capacitor/preferences'
+ - '@deno/kv'
+ - '@netlify/blobs'
+ - '@planetscale/database'
+ - '@react-native-async-storage/async-storage'
+ - '@types/react'
+ - '@upstash/redis'
+ - '@vercel/blob'
+ - '@vercel/functions'
+ - '@vercel/kv'
+ - aws4fetch
+ - bufferutil
+ - db0
+ - encoding
+ - ioredis
+ - react
+ - typescript
+ - uploadthing
+ - utf-8-validate
+ - zod
+
+ '@reown/appkit-polyfills@1.8.9':
+ dependencies:
+ buffer: 6.0.3
+
+ '@reown/appkit-scaffold-ui@1.8.9(@types/react@19.2.18)(encoding@0.1.13)(react@19.2.8)(typescript@6.0.3)(valtio@2.1.7(@types/react@19.2.18)(react@19.2.8))(zod@3.25.76)':
+ dependencies:
+ '@reown/appkit-common': 1.8.9(typescript@6.0.3)(zod@3.25.76)
+ '@reown/appkit-controllers': 1.8.9(@types/react@19.2.18)(encoding@0.1.13)(react@19.2.8)(typescript@6.0.3)(zod@3.25.76)
+ '@reown/appkit-ui': 1.8.9(@types/react@19.2.18)(encoding@0.1.13)(react@19.2.8)(typescript@6.0.3)(zod@3.25.76)
+ '@reown/appkit-utils': 1.8.9(@types/react@19.2.18)(encoding@0.1.13)(react@19.2.8)(typescript@6.0.3)(valtio@2.1.7(@types/react@19.2.18)(react@19.2.8))(zod@3.25.76)
+ '@reown/appkit-wallet': 1.8.9(typescript@6.0.3)
+ lit: 3.3.0
+ transitivePeerDependencies:
+ - '@azure/app-configuration'
+ - '@azure/cosmos'
+ - '@azure/data-tables'
+ - '@azure/identity'
+ - '@azure/keyvault-secrets'
+ - '@azure/storage-blob'
+ - '@capacitor/preferences'
+ - '@deno/kv'
+ - '@netlify/blobs'
+ - '@planetscale/database'
+ - '@react-native-async-storage/async-storage'
+ - '@types/react'
+ - '@upstash/redis'
+ - '@vercel/blob'
+ - '@vercel/functions'
+ - '@vercel/kv'
+ - aws4fetch
+ - bufferutil
+ - db0
+ - encoding
+ - ioredis
+ - react
+ - typescript
+ - uploadthing
+ - utf-8-validate
+ - valtio
+ - zod
+
+ '@reown/appkit-ui@1.8.9(@types/react@19.2.18)(encoding@0.1.13)(react@19.2.8)(typescript@6.0.3)(zod@3.25.76)':
+ dependencies:
+ '@phosphor-icons/webcomponents': 2.1.5
+ '@reown/appkit-common': 1.8.9(typescript@6.0.3)(zod@3.25.76)
+ '@reown/appkit-controllers': 1.8.9(@types/react@19.2.18)(encoding@0.1.13)(react@19.2.8)(typescript@6.0.3)(zod@3.25.76)
+ '@reown/appkit-wallet': 1.8.9(typescript@6.0.3)
+ lit: 3.3.0
+ qrcode: 1.5.3
+ transitivePeerDependencies:
+ - '@azure/app-configuration'
+ - '@azure/cosmos'
+ - '@azure/data-tables'
+ - '@azure/identity'
+ - '@azure/keyvault-secrets'
+ - '@azure/storage-blob'
+ - '@capacitor/preferences'
+ - '@deno/kv'
+ - '@netlify/blobs'
+ - '@planetscale/database'
+ - '@react-native-async-storage/async-storage'
+ - '@types/react'
+ - '@upstash/redis'
+ - '@vercel/blob'
+ - '@vercel/functions'
+ - '@vercel/kv'
+ - aws4fetch
+ - bufferutil
+ - db0
+ - encoding
+ - ioredis
+ - react
+ - typescript
+ - uploadthing
+ - utf-8-validate
+ - zod
+
+ '@reown/appkit-utils@1.8.9(@types/react@19.2.18)(encoding@0.1.13)(react@19.2.8)(typescript@6.0.3)(valtio@2.1.7(@types/react@19.2.18)(react@19.2.8))(zod@3.25.76)':
+ dependencies:
+ '@reown/appkit-common': 1.8.9(typescript@6.0.3)(zod@3.25.76)
+ '@reown/appkit-controllers': 1.8.9(@types/react@19.2.18)(encoding@0.1.13)(react@19.2.8)(typescript@6.0.3)(zod@3.25.76)
+ '@reown/appkit-polyfills': 1.8.9
+ '@reown/appkit-wallet': 1.8.9(typescript@6.0.3)
+ '@wallet-standard/wallet': 1.1.0
+ '@walletconnect/logger': 2.1.2
+ '@walletconnect/universal-provider': 2.21.9(encoding@0.1.13)(typescript@6.0.3)(zod@3.25.76)
+ valtio: 2.1.7(@types/react@19.2.18)(react@19.2.8)
+ viem: 2.56.3(typescript@6.0.3)(zod@3.25.76)
+ transitivePeerDependencies:
+ - '@azure/app-configuration'
+ - '@azure/cosmos'
+ - '@azure/data-tables'
+ - '@azure/identity'
+ - '@azure/keyvault-secrets'
+ - '@azure/storage-blob'
+ - '@capacitor/preferences'
+ - '@deno/kv'
+ - '@netlify/blobs'
+ - '@planetscale/database'
+ - '@react-native-async-storage/async-storage'
+ - '@types/react'
+ - '@upstash/redis'
+ - '@vercel/blob'
+ - '@vercel/functions'
+ - '@vercel/kv'
+ - aws4fetch
+ - bufferutil
+ - db0
+ - encoding
+ - ioredis
+ - react
+ - typescript
+ - uploadthing
+ - utf-8-validate
+ - zod
+
+ '@reown/appkit-wallet@1.8.9(typescript@6.0.3)':
+ dependencies:
+ '@reown/appkit-common': 1.8.9(typescript@6.0.3)(zod@3.22.4)
+ '@reown/appkit-polyfills': 1.8.9
+ '@walletconnect/logger': 2.1.2
+ zod: 3.22.4
+ transitivePeerDependencies:
+ - bufferutil
+ - typescript
+ - utf-8-validate
+
+ '@reown/appkit@1.8.9(@types/react@19.2.18)(encoding@0.1.13)(react@19.2.8)(typescript@6.0.3)(zod@3.25.76)':
+ dependencies:
+ '@reown/appkit-common': 1.8.9(typescript@6.0.3)(zod@3.25.76)
+ '@reown/appkit-controllers': 1.8.9(@types/react@19.2.18)(encoding@0.1.13)(react@19.2.8)(typescript@6.0.3)(zod@3.25.76)
+ '@reown/appkit-pay': 1.8.9(@types/react@19.2.18)(encoding@0.1.13)(react@19.2.8)(typescript@6.0.3)(zod@3.25.76)
+ '@reown/appkit-polyfills': 1.8.9
+ '@reown/appkit-scaffold-ui': 1.8.9(@types/react@19.2.18)(encoding@0.1.13)(react@19.2.8)(typescript@6.0.3)(valtio@2.1.7(@types/react@19.2.18)(react@19.2.8))(zod@3.25.76)
+ '@reown/appkit-ui': 1.8.9(@types/react@19.2.18)(encoding@0.1.13)(react@19.2.8)(typescript@6.0.3)(zod@3.25.76)
+ '@reown/appkit-utils': 1.8.9(@types/react@19.2.18)(encoding@0.1.13)(react@19.2.8)(typescript@6.0.3)(valtio@2.1.7(@types/react@19.2.18)(react@19.2.8))(zod@3.25.76)
+ '@reown/appkit-wallet': 1.8.9(typescript@6.0.3)
+ '@walletconnect/universal-provider': 2.21.9(encoding@0.1.13)(typescript@6.0.3)(zod@3.25.76)
+ bs58: 6.0.0
+ semver: 7.7.2
+ valtio: 2.1.7(@types/react@19.2.18)(react@19.2.8)
+ viem: 2.56.3(typescript@6.0.3)(zod@3.25.76)
+ optionalDependencies:
+ '@lit/react': 1.0.8(@types/react@19.2.18)
+ transitivePeerDependencies:
+ - '@azure/app-configuration'
+ - '@azure/cosmos'
+ - '@azure/data-tables'
+ - '@azure/identity'
+ - '@azure/keyvault-secrets'
+ - '@azure/storage-blob'
+ - '@capacitor/preferences'
+ - '@deno/kv'
+ - '@netlify/blobs'
+ - '@planetscale/database'
+ - '@react-native-async-storage/async-storage'
+ - '@types/react'
+ - '@upstash/redis'
+ - '@vercel/blob'
+ - '@vercel/functions'
+ - '@vercel/kv'
+ - aws4fetch
+ - bufferutil
+ - db0
+ - encoding
+ - ioredis
+ - react
+ - typescript
+ - uploadthing
+ - utf-8-validate
+ - zod
+
'@rescript/std@9.0.0': {}
'@rolldown/binding-android-arm64@1.0.0-rc.9':
@@ -5322,12 +6717,26 @@ snapshots:
'@noble/hashes': 1.8.0
'@scure/base': 1.2.6
+ '@simplewebauthn/browser@13.3.0': {}
+
'@sindresorhus/is@7.2.0': {}
'@speed-highlight/core@1.2.24': {}
'@stablelib/base64@1.0.1': {}
+ '@swc/helpers@0.5.23':
+ dependencies:
+ tslib: 2.8.1
+
+ '@tanstack/react-virtual@3.14.11(react-dom@19.2.8(react@19.2.8))(react@19.2.8)':
+ dependencies:
+ '@tanstack/virtual-core': 3.17.9
+ react: 19.2.8
+ react-dom: 19.2.8(react@19.2.8)
+
+ '@tanstack/virtual-core@3.17.9': {}
+
'@testcontainers/postgresql@12.1.0(supports-color@10.2.2)':
dependencies:
testcontainers: 12.1.0(supports-color@10.2.2)
@@ -5452,6 +6861,8 @@ snapshots:
dependencies:
'@types/node': 18.19.130
+ '@types/trusted-types@2.0.7': {}
+
'@types/ws@7.4.7':
dependencies:
'@types/node': 24.13.3
@@ -5563,6 +6974,562 @@ snapshots:
'@vitest/spy@5.0.0': {}
+ '@wallet-standard/app@1.1.1':
+ dependencies:
+ '@wallet-standard/base': 1.1.1
+
+ '@wallet-standard/base@1.1.1': {}
+
+ '@wallet-standard/wallet@1.1.0':
+ dependencies:
+ '@wallet-standard/base': 1.1.1
+
+ '@walletconnect/core@2.21.9(typescript@6.0.3)(zod@3.25.76)':
+ dependencies:
+ '@walletconnect/heartbeat': 1.2.2
+ '@walletconnect/jsonrpc-provider': 1.0.14
+ '@walletconnect/jsonrpc-types': 1.0.4
+ '@walletconnect/jsonrpc-utils': 1.0.8
+ '@walletconnect/jsonrpc-ws-connection': 1.0.16
+ '@walletconnect/keyvaluestorage': 1.1.1
+ '@walletconnect/logger': 2.1.2
+ '@walletconnect/relay-api': 1.0.11
+ '@walletconnect/relay-auth': 1.1.0
+ '@walletconnect/safe-json': 1.0.2
+ '@walletconnect/time': 1.0.2
+ '@walletconnect/types': 2.21.9
+ '@walletconnect/utils': 2.21.9(typescript@6.0.3)(zod@3.25.76)
+ '@walletconnect/window-getters': 1.0.1
+ es-toolkit: 1.39.3
+ events: 3.3.0
+ uint8arrays: 3.1.1
+ transitivePeerDependencies:
+ - '@azure/app-configuration'
+ - '@azure/cosmos'
+ - '@azure/data-tables'
+ - '@azure/identity'
+ - '@azure/keyvault-secrets'
+ - '@azure/storage-blob'
+ - '@capacitor/preferences'
+ - '@deno/kv'
+ - '@netlify/blobs'
+ - '@planetscale/database'
+ - '@react-native-async-storage/async-storage'
+ - '@upstash/redis'
+ - '@vercel/blob'
+ - '@vercel/functions'
+ - '@vercel/kv'
+ - aws4fetch
+ - bufferutil
+ - db0
+ - ioredis
+ - typescript
+ - uploadthing
+ - utf-8-validate
+ - zod
+
+ '@walletconnect/core@2.22.4(typescript@6.0.3)(zod@3.25.76)':
+ dependencies:
+ '@walletconnect/heartbeat': 1.2.2
+ '@walletconnect/jsonrpc-provider': 1.0.14
+ '@walletconnect/jsonrpc-types': 1.0.4
+ '@walletconnect/jsonrpc-utils': 1.0.8
+ '@walletconnect/jsonrpc-ws-connection': 1.0.16
+ '@walletconnect/keyvaluestorage': 1.1.1
+ '@walletconnect/logger': 3.0.0
+ '@walletconnect/relay-api': 1.0.11
+ '@walletconnect/relay-auth': 1.1.0
+ '@walletconnect/safe-json': 1.0.2
+ '@walletconnect/time': 1.0.2
+ '@walletconnect/types': 2.22.4
+ '@walletconnect/utils': 2.22.4(typescript@6.0.3)(zod@3.25.76)
+ '@walletconnect/window-getters': 1.0.1
+ es-toolkit: 1.39.3
+ events: 3.3.0
+ uint8arrays: 3.1.1
+ transitivePeerDependencies:
+ - '@azure/app-configuration'
+ - '@azure/cosmos'
+ - '@azure/data-tables'
+ - '@azure/identity'
+ - '@azure/keyvault-secrets'
+ - '@azure/storage-blob'
+ - '@capacitor/preferences'
+ - '@deno/kv'
+ - '@netlify/blobs'
+ - '@planetscale/database'
+ - '@react-native-async-storage/async-storage'
+ - '@upstash/redis'
+ - '@vercel/blob'
+ - '@vercel/functions'
+ - '@vercel/kv'
+ - aws4fetch
+ - bufferutil
+ - db0
+ - ioredis
+ - typescript
+ - uploadthing
+ - utf-8-validate
+ - zod
+
+ '@walletconnect/environment@1.0.1':
+ dependencies:
+ tslib: 1.14.1
+
+ '@walletconnect/ethereum-provider@2.22.4(@types/react@19.2.18)(encoding@0.1.13)(react@19.2.8)(typescript@6.0.3)(zod@3.25.76)':
+ dependencies:
+ '@reown/appkit': 1.8.9(@types/react@19.2.18)(encoding@0.1.13)(react@19.2.8)(typescript@6.0.3)(zod@3.25.76)
+ '@walletconnect/jsonrpc-http-connection': 1.0.8(encoding@0.1.13)
+ '@walletconnect/jsonrpc-provider': 1.0.14
+ '@walletconnect/jsonrpc-types': 1.0.4
+ '@walletconnect/jsonrpc-utils': 1.0.8
+ '@walletconnect/keyvaluestorage': 1.1.1
+ '@walletconnect/logger': 3.0.0
+ '@walletconnect/sign-client': 2.22.4(typescript@6.0.3)(zod@3.25.76)
+ '@walletconnect/types': 2.22.4
+ '@walletconnect/universal-provider': 2.22.4(encoding@0.1.13)(typescript@6.0.3)(zod@3.25.76)
+ '@walletconnect/utils': 2.22.4(typescript@6.0.3)(zod@3.25.76)
+ events: 3.3.0
+ transitivePeerDependencies:
+ - '@azure/app-configuration'
+ - '@azure/cosmos'
+ - '@azure/data-tables'
+ - '@azure/identity'
+ - '@azure/keyvault-secrets'
+ - '@azure/storage-blob'
+ - '@capacitor/preferences'
+ - '@deno/kv'
+ - '@netlify/blobs'
+ - '@planetscale/database'
+ - '@react-native-async-storage/async-storage'
+ - '@types/react'
+ - '@upstash/redis'
+ - '@vercel/blob'
+ - '@vercel/functions'
+ - '@vercel/kv'
+ - aws4fetch
+ - bufferutil
+ - db0
+ - encoding
+ - ioredis
+ - react
+ - typescript
+ - uploadthing
+ - utf-8-validate
+ - zod
+
+ '@walletconnect/events@1.0.1':
+ dependencies:
+ keyvaluestorage-interface: 1.0.0
+ tslib: 1.14.1
+
+ '@walletconnect/heartbeat@1.2.2':
+ dependencies:
+ '@walletconnect/events': 1.0.1
+ '@walletconnect/time': 1.0.2
+ events: 3.3.0
+
+ '@walletconnect/jsonrpc-http-connection@1.0.8(encoding@0.1.13)':
+ dependencies:
+ '@walletconnect/jsonrpc-utils': 1.0.8
+ '@walletconnect/safe-json': 1.0.2
+ cross-fetch: 3.2.0(encoding@0.1.13)
+ events: 3.3.0
+ transitivePeerDependencies:
+ - encoding
+
+ '@walletconnect/jsonrpc-provider@1.0.14':
+ dependencies:
+ '@walletconnect/jsonrpc-utils': 1.0.8
+ '@walletconnect/safe-json': 1.0.2
+ events: 3.3.0
+
+ '@walletconnect/jsonrpc-types@1.0.4':
+ dependencies:
+ events: 3.3.0
+ keyvaluestorage-interface: 1.0.0
+
+ '@walletconnect/jsonrpc-utils@1.0.8':
+ dependencies:
+ '@walletconnect/environment': 1.0.1
+ '@walletconnect/jsonrpc-types': 1.0.4
+ tslib: 1.14.1
+
+ '@walletconnect/jsonrpc-ws-connection@1.0.16':
+ dependencies:
+ '@walletconnect/jsonrpc-utils': 1.0.8
+ '@walletconnect/safe-json': 1.0.2
+ events: 3.3.0
+ ws: 7.5.13
+ transitivePeerDependencies:
+ - bufferutil
+ - utf-8-validate
+
+ '@walletconnect/keyvaluestorage@1.1.1':
+ dependencies:
+ '@walletconnect/safe-json': 1.0.2
+ idb-keyval: 6.3.0
+ unstorage: 1.17.5(idb-keyval@6.3.0)
+ transitivePeerDependencies:
+ - '@azure/app-configuration'
+ - '@azure/cosmos'
+ - '@azure/data-tables'
+ - '@azure/identity'
+ - '@azure/keyvault-secrets'
+ - '@azure/storage-blob'
+ - '@capacitor/preferences'
+ - '@deno/kv'
+ - '@netlify/blobs'
+ - '@planetscale/database'
+ - '@upstash/redis'
+ - '@vercel/blob'
+ - '@vercel/functions'
+ - '@vercel/kv'
+ - aws4fetch
+ - db0
+ - ioredis
+ - uploadthing
+
+ '@walletconnect/logger@2.1.2':
+ dependencies:
+ '@walletconnect/safe-json': 1.0.2
+ pino: 7.11.0
+
+ '@walletconnect/logger@3.0.0':
+ dependencies:
+ '@walletconnect/safe-json': 1.0.2
+ pino: 10.0.0
+
+ '@walletconnect/relay-api@1.0.11':
+ dependencies:
+ '@walletconnect/jsonrpc-types': 1.0.4
+
+ '@walletconnect/relay-auth@1.1.0':
+ dependencies:
+ '@noble/curves': 1.8.0
+ '@noble/hashes': 1.7.0
+ '@walletconnect/safe-json': 1.0.2
+ '@walletconnect/time': 1.0.2
+ uint8arrays: 3.1.1
+
+ '@walletconnect/safe-json@1.0.2':
+ dependencies:
+ tslib: 1.14.1
+
+ '@walletconnect/sign-client@2.21.9(typescript@6.0.3)(zod@3.25.76)':
+ dependencies:
+ '@walletconnect/core': 2.21.9(typescript@6.0.3)(zod@3.25.76)
+ '@walletconnect/events': 1.0.1
+ '@walletconnect/heartbeat': 1.2.2
+ '@walletconnect/jsonrpc-utils': 1.0.8
+ '@walletconnect/logger': 2.1.2
+ '@walletconnect/time': 1.0.2
+ '@walletconnect/types': 2.21.9
+ '@walletconnect/utils': 2.21.9(typescript@6.0.3)(zod@3.25.76)
+ events: 3.3.0
+ transitivePeerDependencies:
+ - '@azure/app-configuration'
+ - '@azure/cosmos'
+ - '@azure/data-tables'
+ - '@azure/identity'
+ - '@azure/keyvault-secrets'
+ - '@azure/storage-blob'
+ - '@capacitor/preferences'
+ - '@deno/kv'
+ - '@netlify/blobs'
+ - '@planetscale/database'
+ - '@react-native-async-storage/async-storage'
+ - '@upstash/redis'
+ - '@vercel/blob'
+ - '@vercel/functions'
+ - '@vercel/kv'
+ - aws4fetch
+ - bufferutil
+ - db0
+ - ioredis
+ - typescript
+ - uploadthing
+ - utf-8-validate
+ - zod
+
+ '@walletconnect/sign-client@2.22.4(typescript@6.0.3)(zod@3.25.76)':
+ dependencies:
+ '@walletconnect/core': 2.22.4(typescript@6.0.3)(zod@3.25.76)
+ '@walletconnect/events': 1.0.1
+ '@walletconnect/heartbeat': 1.2.2
+ '@walletconnect/jsonrpc-utils': 1.0.8
+ '@walletconnect/logger': 3.0.0
+ '@walletconnect/time': 1.0.2
+ '@walletconnect/types': 2.22.4
+ '@walletconnect/utils': 2.22.4(typescript@6.0.3)(zod@3.25.76)
+ events: 3.3.0
+ transitivePeerDependencies:
+ - '@azure/app-configuration'
+ - '@azure/cosmos'
+ - '@azure/data-tables'
+ - '@azure/identity'
+ - '@azure/keyvault-secrets'
+ - '@azure/storage-blob'
+ - '@capacitor/preferences'
+ - '@deno/kv'
+ - '@netlify/blobs'
+ - '@planetscale/database'
+ - '@react-native-async-storage/async-storage'
+ - '@upstash/redis'
+ - '@vercel/blob'
+ - '@vercel/functions'
+ - '@vercel/kv'
+ - aws4fetch
+ - bufferutil
+ - db0
+ - ioredis
+ - typescript
+ - uploadthing
+ - utf-8-validate
+ - zod
+
+ '@walletconnect/time@1.0.2':
+ dependencies:
+ tslib: 1.14.1
+
+ '@walletconnect/types@2.21.9':
+ dependencies:
+ '@walletconnect/events': 1.0.1
+ '@walletconnect/heartbeat': 1.2.2
+ '@walletconnect/jsonrpc-types': 1.0.4
+ '@walletconnect/keyvaluestorage': 1.1.1
+ '@walletconnect/logger': 2.1.2
+ events: 3.3.0
+ transitivePeerDependencies:
+ - '@azure/app-configuration'
+ - '@azure/cosmos'
+ - '@azure/data-tables'
+ - '@azure/identity'
+ - '@azure/keyvault-secrets'
+ - '@azure/storage-blob'
+ - '@capacitor/preferences'
+ - '@deno/kv'
+ - '@netlify/blobs'
+ - '@planetscale/database'
+ - '@react-native-async-storage/async-storage'
+ - '@upstash/redis'
+ - '@vercel/blob'
+ - '@vercel/functions'
+ - '@vercel/kv'
+ - aws4fetch
+ - db0
+ - ioredis
+ - uploadthing
+
+ '@walletconnect/types@2.22.4':
+ dependencies:
+ '@walletconnect/events': 1.0.1
+ '@walletconnect/heartbeat': 1.2.2
+ '@walletconnect/jsonrpc-types': 1.0.4
+ '@walletconnect/keyvaluestorage': 1.1.1
+ '@walletconnect/logger': 3.0.0
+ events: 3.3.0
+ transitivePeerDependencies:
+ - '@azure/app-configuration'
+ - '@azure/cosmos'
+ - '@azure/data-tables'
+ - '@azure/identity'
+ - '@azure/keyvault-secrets'
+ - '@azure/storage-blob'
+ - '@capacitor/preferences'
+ - '@deno/kv'
+ - '@netlify/blobs'
+ - '@planetscale/database'
+ - '@react-native-async-storage/async-storage'
+ - '@upstash/redis'
+ - '@vercel/blob'
+ - '@vercel/functions'
+ - '@vercel/kv'
+ - aws4fetch
+ - db0
+ - ioredis
+ - uploadthing
+
+ '@walletconnect/universal-provider@2.21.9(encoding@0.1.13)(typescript@6.0.3)(zod@3.25.76)':
+ dependencies:
+ '@walletconnect/events': 1.0.1
+ '@walletconnect/jsonrpc-http-connection': 1.0.8(encoding@0.1.13)
+ '@walletconnect/jsonrpc-provider': 1.0.14
+ '@walletconnect/jsonrpc-types': 1.0.4
+ '@walletconnect/jsonrpc-utils': 1.0.8
+ '@walletconnect/keyvaluestorage': 1.1.1
+ '@walletconnect/logger': 2.1.2
+ '@walletconnect/sign-client': 2.21.9(typescript@6.0.3)(zod@3.25.76)
+ '@walletconnect/types': 2.21.9
+ '@walletconnect/utils': 2.21.9(typescript@6.0.3)(zod@3.25.76)
+ es-toolkit: 1.39.3
+ events: 3.3.0
+ transitivePeerDependencies:
+ - '@azure/app-configuration'
+ - '@azure/cosmos'
+ - '@azure/data-tables'
+ - '@azure/identity'
+ - '@azure/keyvault-secrets'
+ - '@azure/storage-blob'
+ - '@capacitor/preferences'
+ - '@deno/kv'
+ - '@netlify/blobs'
+ - '@planetscale/database'
+ - '@react-native-async-storage/async-storage'
+ - '@upstash/redis'
+ - '@vercel/blob'
+ - '@vercel/functions'
+ - '@vercel/kv'
+ - aws4fetch
+ - bufferutil
+ - db0
+ - encoding
+ - ioredis
+ - typescript
+ - uploadthing
+ - utf-8-validate
+ - zod
+
+ '@walletconnect/universal-provider@2.22.4(encoding@0.1.13)(typescript@6.0.3)(zod@3.25.76)':
+ dependencies:
+ '@walletconnect/events': 1.0.1
+ '@walletconnect/jsonrpc-http-connection': 1.0.8(encoding@0.1.13)
+ '@walletconnect/jsonrpc-provider': 1.0.14
+ '@walletconnect/jsonrpc-types': 1.0.4
+ '@walletconnect/jsonrpc-utils': 1.0.8
+ '@walletconnect/keyvaluestorage': 1.1.1
+ '@walletconnect/logger': 3.0.0
+ '@walletconnect/sign-client': 2.22.4(typescript@6.0.3)(zod@3.25.76)
+ '@walletconnect/types': 2.22.4
+ '@walletconnect/utils': 2.22.4(typescript@6.0.3)(zod@3.25.76)
+ es-toolkit: 1.39.3
+ events: 3.3.0
+ transitivePeerDependencies:
+ - '@azure/app-configuration'
+ - '@azure/cosmos'
+ - '@azure/data-tables'
+ - '@azure/identity'
+ - '@azure/keyvault-secrets'
+ - '@azure/storage-blob'
+ - '@capacitor/preferences'
+ - '@deno/kv'
+ - '@netlify/blobs'
+ - '@planetscale/database'
+ - '@react-native-async-storage/async-storage'
+ - '@upstash/redis'
+ - '@vercel/blob'
+ - '@vercel/functions'
+ - '@vercel/kv'
+ - aws4fetch
+ - bufferutil
+ - db0
+ - encoding
+ - ioredis
+ - typescript
+ - uploadthing
+ - utf-8-validate
+ - zod
+
+ '@walletconnect/utils@2.21.9(typescript@6.0.3)(zod@3.25.76)':
+ dependencies:
+ '@msgpack/msgpack': 3.1.2
+ '@noble/ciphers': 1.3.0
+ '@noble/curves': 1.9.7
+ '@noble/hashes': 1.8.0
+ '@scure/base': 1.2.6
+ '@walletconnect/jsonrpc-utils': 1.0.8
+ '@walletconnect/keyvaluestorage': 1.1.1
+ '@walletconnect/relay-api': 1.0.11
+ '@walletconnect/relay-auth': 1.1.0
+ '@walletconnect/safe-json': 1.0.2
+ '@walletconnect/time': 1.0.2
+ '@walletconnect/types': 2.21.9
+ '@walletconnect/window-getters': 1.0.1
+ '@walletconnect/window-metadata': 1.0.1
+ blakejs: 1.2.1
+ bs58: 6.0.0
+ detect-browser: 5.3.0
+ uint8arrays: 3.1.1
+ viem: 2.36.0(typescript@6.0.3)(zod@3.25.76)
+ transitivePeerDependencies:
+ - '@azure/app-configuration'
+ - '@azure/cosmos'
+ - '@azure/data-tables'
+ - '@azure/identity'
+ - '@azure/keyvault-secrets'
+ - '@azure/storage-blob'
+ - '@capacitor/preferences'
+ - '@deno/kv'
+ - '@netlify/blobs'
+ - '@planetscale/database'
+ - '@react-native-async-storage/async-storage'
+ - '@upstash/redis'
+ - '@vercel/blob'
+ - '@vercel/functions'
+ - '@vercel/kv'
+ - aws4fetch
+ - bufferutil
+ - db0
+ - ioredis
+ - typescript
+ - uploadthing
+ - utf-8-validate
+ - zod
+
+ '@walletconnect/utils@2.22.4(typescript@6.0.3)(zod@3.25.76)':
+ dependencies:
+ '@msgpack/msgpack': 3.1.2
+ '@noble/ciphers': 1.3.0
+ '@noble/curves': 1.9.7
+ '@noble/hashes': 1.8.0
+ '@scure/base': 1.2.6
+ '@walletconnect/jsonrpc-utils': 1.0.8
+ '@walletconnect/keyvaluestorage': 1.1.1
+ '@walletconnect/logger': 3.0.0
+ '@walletconnect/relay-api': 1.0.11
+ '@walletconnect/relay-auth': 1.1.0
+ '@walletconnect/safe-json': 1.0.2
+ '@walletconnect/time': 1.0.2
+ '@walletconnect/types': 2.22.4
+ '@walletconnect/window-getters': 1.0.1
+ '@walletconnect/window-metadata': 1.0.1
+ blakejs: 1.2.1
+ bs58: 6.0.0
+ detect-browser: 5.3.0
+ ox: 0.9.3(typescript@6.0.3)(zod@3.25.76)
+ uint8arrays: 3.1.1
+ transitivePeerDependencies:
+ - '@azure/app-configuration'
+ - '@azure/cosmos'
+ - '@azure/data-tables'
+ - '@azure/identity'
+ - '@azure/keyvault-secrets'
+ - '@azure/storage-blob'
+ - '@capacitor/preferences'
+ - '@deno/kv'
+ - '@netlify/blobs'
+ - '@planetscale/database'
+ - '@react-native-async-storage/async-storage'
+ - '@upstash/redis'
+ - '@vercel/blob'
+ - '@vercel/functions'
+ - '@vercel/kv'
+ - aws4fetch
+ - db0
+ - ioredis
+ - typescript
+ - uploadthing
+ - zod
+
+ '@walletconnect/window-getters@1.0.1':
+ dependencies:
+ tslib: 1.14.1
+
+ '@walletconnect/window-metadata@1.0.1':
+ dependencies:
+ '@walletconnect/window-getters': 1.0.1
+ tslib: 1.14.1
+
'@whatwg-node/disposablestack@0.0.6':
dependencies:
'@whatwg-node/promise-helpers': 1.3.2
@@ -5590,6 +7557,16 @@ snapshots:
optionalDependencies:
zod: 3.25.76
+ abitype@1.0.8(typescript@6.0.3)(zod@3.25.76):
+ optionalDependencies:
+ typescript: 6.0.3
+ zod: 3.25.76
+
+ abitype@1.2.3(typescript@6.0.3)(zod@3.22.4):
+ optionalDependencies:
+ typescript: 6.0.3
+ zod: 3.22.4
+
abitype@1.2.3(typescript@6.0.3)(zod@3.25.76):
optionalDependencies:
typescript: 6.0.3
@@ -5657,6 +7634,11 @@ snapshots:
any-signal@4.2.0: {}
+ anymatch@3.1.3:
+ dependencies:
+ normalize-path: 3.0.0
+ picomatch: 2.3.2
+
apisauce@2.1.6(debug@4.4.3(supports-color@8.1.1)):
dependencies:
axios: 0.21.4(debug@4.4.3(supports-color@8.1.1))
@@ -5691,6 +7673,10 @@ snapshots:
argparse@2.0.1: {}
+ aria-hidden@1.2.6:
+ dependencies:
+ tslib: 2.8.1
+
aria-query@5.3.0:
dependencies:
dequal: 2.0.3
@@ -5770,6 +7756,8 @@ snapshots:
dependencies:
bare-path: 3.1.2
+ base-x@5.0.1: {}
+
base64-js@1.5.1: {}
bcrypt-pbkdf@1.0.2:
@@ -5780,6 +7768,8 @@ snapshots:
dependencies:
require-from-string: 2.0.2
+ big.js@6.2.2: {}
+
bignumber.js@9.3.1: {}
binaryen@102.0.0-nightly.20211028: {}
@@ -5799,6 +7789,8 @@ snapshots:
blake3-wasm@2.1.5: {}
+ blakejs@1.2.1: {}
+
blob-to-it@2.0.12:
dependencies:
browser-readablestream-to-it: 2.0.12
@@ -5822,6 +7814,10 @@ snapshots:
browser-readablestream-to-it@2.0.12: {}
+ bs58@6.0.0:
+ dependencies:
+ base-x: 5.0.1
+
buffer-alloc-unsafe@1.1.0: {}
buffer-alloc@1.2.0:
@@ -5885,6 +7881,8 @@ snapshots:
callsites@3.1.0: {}
+ camelcase@5.3.1: {}
+
canonicalize@2.1.0: {}
cborg@5.1.11: {}
@@ -5908,6 +7906,10 @@ snapshots:
dependencies:
readdirp: 4.1.2
+ chokidar@5.0.0:
+ dependencies:
+ readdirp: 5.1.1
+
chownr@1.1.4: {}
clean-stack@3.0.1:
@@ -5929,6 +7931,12 @@ snapshots:
cli-width@4.1.0: {}
+ cliui@6.0.0:
+ dependencies:
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+ wrap-ansi: 6.2.0
+
cliui@8.0.1:
dependencies:
string-width: 4.2.3
@@ -5937,6 +7945,10 @@ snapshots:
clone@1.0.4: {}
+ clsx@1.2.1: {}
+
+ clsx@2.1.1: {}
+
color-convert@1.9.3:
dependencies:
color-name: 1.1.3
@@ -5949,6 +7961,8 @@ snapshots:
color-name@1.1.4: {}
+ colorette@2.0.20: {}
+
colors@1.4.0: {}
commander@2.20.3: {}
@@ -5970,6 +7984,8 @@ snapshots:
content-type@1.0.5: {}
+ cookie-es@1.2.3: {}
+
cookie@1.1.1: {}
core-util-is@1.0.3: {}
@@ -6004,6 +8020,12 @@ snapshots:
crc-32: 1.2.2
readable-stream: 4.7.0
+ cross-fetch@3.2.0(encoding@0.1.13):
+ dependencies:
+ node-fetch: 2.7.0(encoding@0.1.13)
+ transitivePeerDependencies:
+ - encoding
+
cross-spawn@7.0.3:
dependencies:
path-key: 3.1.1
@@ -6016,6 +8038,10 @@ snapshots:
shebang-command: 2.0.0
which: 2.0.2
+ crossws@0.3.5:
+ dependencies:
+ uncrypto: 0.1.3
+
css-tree@3.2.1:
dependencies:
mdn-data: 2.27.1
@@ -6037,6 +8063,10 @@ snapshots:
transitivePeerDependencies:
- '@noble/hashes'
+ dateformat@4.6.3: {}
+
+ dayjs@1.11.13: {}
+
debug@4.4.3(supports-color@10.2.2):
dependencies:
ms: 2.1.3
@@ -6055,6 +8085,8 @@ snapshots:
optionalDependencies:
supports-color: 8.1.1
+ decamelize@1.2.0: {}
+
decimal.js@10.6.0: {}
decompress-tar@4.1.1:
@@ -6116,12 +8148,20 @@ snapshots:
define-lazy-prop@3.0.0: {}
+ defu@6.1.7: {}
+
delay@5.0.0: {}
dequal@2.0.3: {}
+ destr@2.0.5: {}
+
+ detect-browser@5.3.0: {}
+
detect-libc@2.1.2: {}
+ dijkstrajs@1.0.3: {}
+
docker-compose@1.3.0:
dependencies:
yaml: 2.9.0
@@ -6158,6 +8198,13 @@ snapshots:
es-errors: 1.3.0
gopd: 1.2.0
+ duplexify@4.1.3:
+ dependencies:
+ end-of-stream: 1.4.5
+ inherits: 2.0.4
+ readable-stream: 3.6.2
+ stream-shift: 1.0.3
+
eastasianwidth@0.2.0: {}
ecdsa-sig-formatter@1.0.11:
@@ -6182,6 +8229,8 @@ snapshots:
emoji-regex@9.2.2: {}
+ encode-utf8@1.0.3: {}
+
encoding@0.1.13:
dependencies:
iconv-lite: 0.6.3
@@ -6214,6 +8263,8 @@ snapshots:
dependencies:
es-errors: 1.3.0
+ es-toolkit@1.39.3: {}
+
es6-promise@4.2.8: {}
es6-promisify@5.0.0:
@@ -6362,6 +8413,8 @@ snapshots:
eyes@0.1.8: {}
+ fast-copy@3.1.0: {}
+
fast-decode-uri-component@1.0.1: {}
fast-deep-equal@3.1.3: {}
@@ -6393,10 +8446,16 @@ snapshots:
dependencies:
fastest-levenshtein: 1.0.16
+ fast-password-entropy@1.1.1: {}
+
fast-querystring@1.1.2:
dependencies:
fast-decode-uri-component: 1.0.1
+ fast-redact@3.5.0: {}
+
+ fast-safe-stringify@2.1.1: {}
+
fast-sha256@1.3.0: {}
fast-uri@3.1.7: {}
@@ -6440,6 +8499,8 @@ snapshots:
node-domexception: 1.0.0
web-streams-polyfill: 3.3.3
+ fetch-retry@6.0.0: {}
+
file-entry-cache@11.1.5:
dependencies:
flat-cache: 6.1.23
@@ -6464,6 +8525,11 @@ snapshots:
fast-querystring: 1.1.2
safe-regex2: 5.1.1
+ find-up@4.1.0:
+ dependencies:
+ locate-path: 5.0.0
+ path-exists: 4.0.0
+
find-up@5.0.0:
dependencies:
locate-path: 6.0.0
@@ -6692,6 +8758,18 @@ snapshots:
graphql@16.11.0: {}
+ h3@1.15.11:
+ dependencies:
+ cookie-es: 1.2.3
+ crossws: 0.3.5
+ defu: 6.1.7
+ destr: 2.0.5
+ iron-webcrypto: 1.2.1
+ node-mock-http: 1.0.5
+ radix3: 1.1.2
+ ufo: 1.6.4
+ uncrypto: 0.1.3
+
has-flag@3.0.0: {}
has-flag@4.0.0: {}
@@ -6716,6 +8794,8 @@ snapshots:
dependencies:
function-bind: 1.1.2
+ help-me@5.0.0: {}
+
hookified@1.15.1: {}
hookified@2.2.0: {}
@@ -6754,6 +8834,10 @@ snapshots:
dependencies:
safer-buffer: 2.1.2
+ idb-keyval@6.2.1: {}
+
+ idb-keyval@6.3.0: {}
+
ieee754@1.2.1: {}
ignore@5.3.2: {}
@@ -6796,6 +8880,8 @@ snapshots:
protons-runtime: 5.6.0
uint8arraylist: 2.4.9
+ iron-webcrypto@1.2.1: {}
+
is-arguments@1.2.0:
dependencies:
call-bound: 1.0.4
@@ -6878,6 +8964,10 @@ snapshots:
dependencies:
ws: 7.5.13
+ isows@1.0.7(ws@8.18.3):
+ dependencies:
+ ws: 8.18.3
+
isows@1.0.7(ws@8.21.0):
dependencies:
ws: 8.21.0
@@ -6947,8 +9037,14 @@ snapshots:
- bufferutil
- utf-8-validate
+ jose@4.15.9: {}
+
jose@6.2.12: {}
+ joycon@3.1.1: {}
+
+ js-cookie@3.0.8: {}
+
js-tokens@4.0.0: {}
js-yaml@4.1.0:
@@ -7028,6 +9124,8 @@ snapshots:
dependencies:
'@keyv/serialize': 1.1.1
+ keyvaluestorage-interface@1.0.0: {}
+
kleur@4.1.5: {}
kubo-rpc-client@5.4.1(undici@7.16.0):
@@ -7077,6 +9175,8 @@ snapshots:
prelude-ls: 1.2.1
type-check: 0.4.0
+ libphonenumber-js@1.13.12: {}
+
light-my-request@6.6.0:
dependencies:
cookie: 1.1.1
@@ -7136,6 +9236,26 @@ snapshots:
lines-and-columns@1.2.4: {}
+ lit-element@4.2.2:
+ dependencies:
+ '@lit-labs/ssr-dom-shim': 1.6.0
+ '@lit/reactive-element': 2.1.2
+ lit-html: 3.3.3
+
+ lit-html@3.3.3:
+ dependencies:
+ '@types/trusted-types': 2.0.7
+
+ lit@3.3.0:
+ dependencies:
+ '@lit/reactive-element': 2.1.2
+ lit-element: 4.2.2
+ lit-html: 3.3.3
+
+ locate-path@5.0.0:
+ dependencies:
+ p-locate: 4.1.0
+
locate-path@6.0.0:
dependencies:
p-locate: 5.0.0
@@ -7186,6 +9306,10 @@ snapshots:
dependencies:
yallist: 4.0.0
+ lucide-react@0.475.0(react@19.2.8):
+ dependencies:
+ react: 19.2.8
+
lz-string@1.5.0: {}
magic-string@1.2.3:
@@ -7245,8 +9369,14 @@ snapshots:
dependencies:
brace-expansion: 2.1.4
+ minimist@1.2.8: {}
+
minipass@7.1.3: {}
+ mipd@0.0.7(typescript@6.0.3):
+ optionalDependencies:
+ typescript: 6.0.3
+
mkdirp-classic@0.5.3: {}
mkdirp@3.0.1: {}
@@ -7261,6 +9391,8 @@ snapshots:
multiformats@14.0.5: {}
+ multiformats@9.9.0: {}
+
mute-stream@2.0.0: {}
nan@2.28.0:
@@ -7278,12 +9410,22 @@ snapshots:
node-domexception@1.0.0: {}
+ node-fetch-native@1.6.7: {}
+
+ node-fetch@2.7.0(encoding@0.1.13):
+ dependencies:
+ whatwg-url: 5.0.0
+ optionalDependencies:
+ encoding: 0.1.13
+
node-fetch@3.3.2:
dependencies:
data-uri-to-buffer: 4.0.1
fetch-blob: 3.2.0
formdata-polyfill: 4.0.10
+ node-mock-http@1.0.5: {}
+
normalize-path@3.0.0: {}
npm-run-path@4.0.1:
@@ -7294,6 +9436,14 @@ snapshots:
obug@2.1.4: {}
+ ofetch@1.5.1:
+ dependencies:
+ destr: 2.0.5
+ node-fetch-native: 1.6.7
+ ufo: 1.6.4
+
+ on-exit-leak-free@0.2.0: {}
+
on-exit-leak-free@2.1.2: {}
once@1.4.0:
@@ -7330,6 +9480,21 @@ snapshots:
strip-ansi: 5.2.0
wcwidth: 1.0.1
+ ox@0.14.44(typescript@6.0.3)(zod@3.22.4):
+ dependencies:
+ '@adraffy/ens-normalize': 1.11.1
+ '@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(typescript@6.0.3)(zod@3.22.4)
+ eventemitter3: 5.0.1
+ optionalDependencies:
+ typescript: 6.0.3
+ transitivePeerDependencies:
+ - zod
+
ox@0.14.44(typescript@6.0.3)(zod@3.25.76):
dependencies:
'@adraffy/ens-normalize': 1.11.1
@@ -7345,6 +9510,50 @@ snapshots:
transitivePeerDependencies:
- zod
+ ox@0.6.9(typescript@6.0.3)(zod@3.25.76):
+ dependencies:
+ '@adraffy/ens-normalize': 1.11.1
+ '@noble/curves': 1.9.7
+ '@noble/hashes': 1.8.0
+ '@scure/bip32': 1.7.0
+ '@scure/bip39': 1.6.0
+ abitype: 1.2.3(typescript@6.0.3)(zod@3.25.76)
+ eventemitter3: 5.0.1
+ optionalDependencies:
+ typescript: 6.0.3
+ transitivePeerDependencies:
+ - zod
+
+ ox@0.9.1(typescript@6.0.3)(zod@3.25.76):
+ dependencies:
+ '@adraffy/ens-normalize': 1.11.1
+ '@noble/ciphers': 1.3.0
+ '@noble/curves': 1.9.7
+ '@noble/hashes': 1.8.0
+ '@scure/bip32': 1.7.0
+ '@scure/bip39': 1.6.0
+ abitype: 1.2.3(typescript@6.0.3)(zod@3.25.76)
+ eventemitter3: 5.0.1
+ optionalDependencies:
+ typescript: 6.0.3
+ transitivePeerDependencies:
+ - zod
+
+ ox@0.9.3(typescript@6.0.3)(zod@3.25.76):
+ dependencies:
+ '@adraffy/ens-normalize': 1.11.1
+ '@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(typescript@6.0.3)(zod@3.25.76)
+ eventemitter3: 5.0.1
+ optionalDependencies:
+ typescript: 6.0.3
+ transitivePeerDependencies:
+ - zod
+
p-defer@3.0.0: {}
p-defer@4.0.1: {}
@@ -7354,10 +9563,18 @@ snapshots:
fast-fifo: 1.3.2
p-defer: 3.0.0
+ p-limit@2.3.0:
+ dependencies:
+ p-try: 2.2.0
+
p-limit@3.1.0:
dependencies:
yocto-queue: 0.1.0
+ p-locate@4.1.0:
+ dependencies:
+ p-limit: 2.3.0
+
p-locate@5.0.0:
dependencies:
p-limit: 3.1.0
@@ -7369,6 +9586,8 @@ snapshots:
p-timeout@7.0.1: {}
+ p-try@2.2.0: {}
+
package-json-from-dist@1.0.1: {}
parent-module@1.0.1:
@@ -7468,12 +9687,59 @@ snapshots:
pinkie@2.0.4: {}
+ pino-abstract-transport@0.5.0:
+ dependencies:
+ duplexify: 4.1.3
+ split2: 4.2.0
+
+ pino-abstract-transport@1.2.0:
+ dependencies:
+ readable-stream: 4.7.0
+ split2: 4.2.0
+
+ pino-abstract-transport@2.0.0:
+ dependencies:
+ split2: 4.2.0
+
pino-abstract-transport@3.0.0:
dependencies:
split2: 4.2.0
+ pino-pretty@10.3.1:
+ dependencies:
+ colorette: 2.0.20
+ dateformat: 4.6.3
+ fast-copy: 3.1.0
+ fast-safe-stringify: 2.1.1
+ help-me: 5.0.0
+ joycon: 3.1.1
+ minimist: 1.2.8
+ on-exit-leak-free: 2.1.2
+ pino-abstract-transport: 1.2.0
+ pump: 3.0.4
+ readable-stream: 4.7.0
+ secure-json-parse: 2.7.0
+ sonic-boom: 3.8.1
+ strip-json-comments: 3.1.1
+
+ pino-std-serializers@4.0.0: {}
+
pino-std-serializers@7.1.0: {}
+ pino@10.0.0:
+ dependencies:
+ atomic-sleep: 1.0.0
+ on-exit-leak-free: 2.1.2
+ pino-abstract-transport: 2.0.0
+ pino-std-serializers: 7.1.0
+ process-warning: 5.1.0
+ quick-format-unescaped: 4.0.4
+ real-require: 0.2.0
+ safe-stable-stringify: 2.5.0
+ slow-redact: 0.3.2
+ sonic-boom: 4.2.1
+ thread-stream: 3.2.0
+
pino@10.3.1:
dependencies:
'@pinojs/redact': 0.4.0
@@ -7488,6 +9754,20 @@ snapshots:
sonic-boom: 4.2.1
thread-stream: 4.2.0
+ pino@7.11.0:
+ dependencies:
+ atomic-sleep: 1.0.0
+ fast-redact: 3.5.0
+ on-exit-leak-free: 0.2.0
+ pino-abstract-transport: 0.5.0
+ pino-std-serializers: 4.0.0
+ process-warning: 1.0.0
+ quick-format-unescaped: 4.0.4
+ real-require: 0.1.0
+ safe-stable-stringify: 2.5.0
+ sonic-boom: 2.8.0
+ thread-stream: 0.15.2
+
playwright-core@1.63.0: {}
playwright@1.63.0:
@@ -7496,6 +9776,8 @@ snapshots:
pluralize@8.0.0: {}
+ pngjs@5.0.0: {}
+
possible-typed-array-names@1.1.0: {}
postcss@8.5.28:
@@ -7516,6 +9798,10 @@ snapshots:
powershell-utils@0.1.0: {}
+ preact@10.24.2: {}
+
+ preact@10.29.8: {}
+
prelude-ls@1.2.1: {}
prettier@3.6.2: {}
@@ -7530,6 +9816,8 @@ snapshots:
process-nextick-args@2.0.1: {}
+ process-warning@1.0.0: {}
+
process-warning@4.0.1: {}
process-warning@5.1.0: {}
@@ -7581,6 +9869,8 @@ snapshots:
uint8arraylist: 3.0.2
uint8arrays: 6.1.1
+ proxy-compare@3.0.1: {}
+
pump@3.0.4:
dependencies:
end-of-stream: 1.4.5
@@ -7592,10 +9882,45 @@ snapshots:
dependencies:
hookified: 2.2.0
+ qrcode@1.5.3:
+ dependencies:
+ dijkstrajs: 1.0.3
+ encode-utf8: 1.0.3
+ pngjs: 5.0.0
+ yargs: 15.4.1
+
+ qrcode@1.5.4:
+ dependencies:
+ dijkstrajs: 1.0.3
+ pngjs: 5.0.0
+ yargs: 15.4.1
+
queue-microtask@1.2.3: {}
quick-format-unescaped@4.0.4: {}
+ radix3@1.1.2: {}
+
+ react-aria@3.52.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8):
+ dependencies:
+ '@internationalized/date': 3.12.4
+ '@internationalized/number': 3.6.8
+ '@internationalized/string': 3.2.10
+ '@react-types/shared': 3.36.1(react@19.2.8)
+ '@swc/helpers': 0.5.23
+ aria-hidden: 1.2.6
+ clsx: 2.1.1
+ react: 19.2.8
+ react-dom: 19.2.8(react@19.2.8)
+ react-stately: 3.50.0(react@19.2.8)
+ use-sync-external-store: 1.4.0(react@19.2.8)
+
+ react-device-detect@2.2.3(react-dom@19.2.8(react@19.2.8))(react@19.2.8):
+ dependencies:
+ react: 19.2.8
+ react-dom: 19.2.8(react@19.2.8)
+ ua-parser-js: 1.0.41
+
react-dom@19.2.8(react@19.2.8):
dependencies:
react: 19.2.8
@@ -7607,6 +9932,16 @@ snapshots:
dependencies:
p-defer: 3.0.0
+ react-stately@3.50.0(react@19.2.8):
+ dependencies:
+ '@internationalized/date': 3.12.4
+ '@internationalized/number': 3.6.8
+ '@internationalized/string': 3.2.10
+ '@react-types/shared': 3.36.1(react@19.2.8)
+ '@swc/helpers': 0.5.23
+ react: 19.2.8
+ use-sync-external-store: 1.4.0(react@19.2.8)
+
react@19.2.8: {}
readable-stream@2.3.8:
@@ -7639,6 +9974,10 @@ snapshots:
readdirp@4.1.2: {}
+ readdirp@5.1.1: {}
+
+ real-require@0.1.0: {}
+
real-require@0.2.0: {}
real-require@1.0.0: {}
@@ -7651,6 +9990,8 @@ snapshots:
require-from-string@2.0.2: {}
+ require-main-filename@2.0.0: {}
+
resolve-from@4.0.0: {}
restore-cursor@3.1.0:
@@ -7724,8 +10065,12 @@ snapshots:
scheduler@0.27.0: {}
+ secure-json-parse@2.7.0: {}
+
secure-json-parse@4.1.0: {}
+ secure-password-utilities@0.2.1: {}
+
seek-bzip@1.0.6:
dependencies:
commander: 2.20.3
@@ -7734,10 +10079,14 @@ snapshots:
dependencies:
lru-cache: 6.0.0
+ semver@7.7.2: {}
+
semver@7.7.3: {}
semver@7.8.5: {}
+ set-blocking@2.0.0: {}
+
set-cookie-parser@2.7.2: {}
set-function-length@1.2.2:
@@ -7793,6 +10142,16 @@ snapshots:
signal-exit@4.1.0: {}
+ slow-redact@0.3.2: {}
+
+ sonic-boom@2.8.0:
+ dependencies:
+ atomic-sleep: 1.0.0
+
+ sonic-boom@3.8.1:
+ dependencies:
+ atomic-sleep: 1.0.0
+
sonic-boom@4.2.1:
dependencies:
atomic-sleep: 1.0.0
@@ -7838,6 +10197,8 @@ snapshots:
dependencies:
stream-chain: 2.2.5
+ stream-shift@1.0.3: {}
+
stream-to-it@1.0.1:
dependencies:
it-stream-types: 2.0.4
@@ -7889,6 +10250,21 @@ snapshots:
strip-final-newline@2.0.0: {}
+ strip-json-comments@3.1.1: {}
+
+ styled-components@6.5.3(react-dom@19.2.8(react@19.2.8))(react@19.2.8):
+ dependencies:
+ '@emotion/is-prop-valid': 1.4.0
+ csstype: 3.2.3
+ react: 19.2.8
+ stylis: 4.3.6
+ optionalDependencies:
+ react-dom: 19.2.8(react@19.2.8)
+
+ stylis@4.3.6: {}
+
+ stylis@4.4.0: {}
+
supports-color@10.2.2: {}
supports-color@5.5.0:
@@ -7909,6 +10285,8 @@ snapshots:
symbol-tree@3.2.4: {}
+ tabbable@6.5.0: {}
+
tar-fs@2.1.5:
dependencies:
chownr: 1.1.4
@@ -7993,6 +10371,14 @@ snapshots:
transitivePeerDependencies:
- react-native-b4a
+ thread-stream@0.15.2:
+ dependencies:
+ real-require: 0.1.0
+
+ thread-stream@3.2.0:
+ dependencies:
+ real-require: 0.2.0
+
thread-stream@4.2.0:
dependencies:
real-require: 1.0.0
@@ -8001,6 +10387,8 @@ snapshots:
tinybench@6.1.4: {}
+ tinycolor2@1.6.0: {}
+
tinyexec@1.3.0: {}
tinyglobby@0.2.17:
@@ -8036,6 +10424,8 @@ snapshots:
dependencies:
tldts: 7.4.11
+ tr46@0.0.3: {}
+
tr46@6.0.0:
dependencies:
punycode: 2.3.1
@@ -8044,6 +10434,8 @@ snapshots:
dependencies:
typescript: 6.0.3
+ tslib@1.14.1: {}
+
tslib@2.8.1: {}
tunnel-agent@0.6.0:
@@ -8077,6 +10469,10 @@ snapshots:
typescript@6.0.3: {}
+ ua-parser-js@1.0.41: {}
+
+ ufo@1.6.4: {}
+
uint8-varint@2.0.5:
dependencies:
uint8arraylist: 2.4.9
@@ -8095,6 +10491,10 @@ snapshots:
dependencies:
uint8arrays: 6.1.1
+ uint8arrays@3.1.1:
+ dependencies:
+ multiformats: 9.9.0
+
uint8arrays@5.1.1:
dependencies:
multiformats: 13.4.2
@@ -8108,6 +10508,8 @@ snapshots:
buffer: 5.7.1
through: 2.3.8
+ uncrypto@0.1.3: {}
+
undici-types@5.26.5: {}
undici-types@6.21.0: {}
@@ -8126,12 +10528,29 @@ snapshots:
universalify@2.0.1: {}
+ unstorage@1.17.5(idb-keyval@6.3.0):
+ dependencies:
+ anymatch: 3.1.3
+ chokidar: 5.0.0
+ destr: 2.0.5
+ h3: 1.15.11
+ lru-cache: 11.5.2
+ node-fetch-native: 1.6.7
+ ofetch: 1.5.1
+ ufo: 1.6.4
+ optionalDependencies:
+ idb-keyval: 6.3.0
+
uri-js@4.4.1:
dependencies:
punycode: 2.3.1
urlpattern-polyfill@10.1.0: {}
+ use-sync-external-store@1.4.0(react@19.2.8):
+ dependencies:
+ react: 19.2.8
+
utf8-codec@1.0.0: {}
util-deprecate@1.0.2: {}
@@ -8146,6 +10565,47 @@ snapshots:
uuid@8.3.2: {}
+ valtio@2.1.7(@types/react@19.2.18)(react@19.2.8):
+ dependencies:
+ proxy-compare: 3.0.1
+ optionalDependencies:
+ '@types/react': 19.2.18
+ react: 19.2.8
+
+ viem@2.36.0(typescript@6.0.3)(zod@3.25.76):
+ dependencies:
+ '@noble/curves': 1.9.6
+ '@noble/hashes': 1.8.0
+ '@scure/bip32': 1.7.0
+ '@scure/bip39': 1.6.0
+ abitype: 1.0.8(typescript@6.0.3)(zod@3.25.76)
+ isows: 1.0.7(ws@8.18.3)
+ ox: 0.9.1(typescript@6.0.3)(zod@3.25.76)
+ ws: 8.18.3
+ optionalDependencies:
+ typescript: 6.0.3
+ transitivePeerDependencies:
+ - bufferutil
+ - utf-8-validate
+ - zod
+
+ viem@2.56.3(typescript@6.0.3)(zod@3.22.4):
+ dependencies:
+ '@noble/curves': 1.9.1
+ '@noble/hashes': 1.8.0
+ '@scure/bip32': 1.7.0
+ '@scure/bip39': 1.6.0
+ abitype: 1.2.3(typescript@6.0.3)(zod@3.22.4)
+ isows: 1.0.7(ws@8.21.0)
+ ox: 0.14.44(typescript@6.0.3)(zod@3.22.4)
+ ws: 8.21.0
+ optionalDependencies:
+ typescript: 6.0.3
+ transitivePeerDependencies:
+ - bufferutil
+ - utf-8-validate
+ - zod
+
viem@2.56.3(typescript@6.0.3)(zod@3.25.76):
dependencies:
'@noble/curves': 1.9.1
@@ -8236,7 +10696,7 @@ snapshots:
web3-utils@4.3.3:
dependencies:
ethereum-cryptography: 2.2.1
- eventemitter3: 5.0.1
+ eventemitter3: 5.0.4
web3-errors: 1.3.1
web3-types: 1.10.0
web3-validator: 2.0.6
@@ -8249,6 +10709,8 @@ snapshots:
web3-types: 1.10.0
zod: 3.25.76
+ webidl-conversions@3.0.1: {}
+
webidl-conversions@8.0.1: {}
whatwg-mimetype@5.0.0: {}
@@ -8269,10 +10731,17 @@ snapshots:
transitivePeerDependencies:
- '@noble/hashes'
+ whatwg-url@5.0.0:
+ dependencies:
+ tr46: 0.0.3
+ webidl-conversions: 3.0.1
+
wherearewe@2.0.1:
dependencies:
is-electron: 2.2.2
+ which-module@2.0.1: {}
+
which-typed-array@1.1.22:
dependencies:
available-typed-arrays: 1.0.7
@@ -8346,6 +10815,8 @@ snapshots:
ws@7.5.13: {}
+ ws@8.18.3: {}
+
ws@8.21.0: {}
wsl-utils@0.1.0:
@@ -8363,6 +10834,8 @@ snapshots:
xtend@4.0.2: {}
+ y18n@4.0.3: {}
+
y18n@5.0.8: {}
yallist@4.0.0: {}
@@ -8373,8 +10846,27 @@ snapshots:
yaml@2.9.0: {}
+ yargs-parser@18.1.3:
+ dependencies:
+ camelcase: 5.3.1
+ decamelize: 1.2.0
+
yargs-parser@21.1.1: {}
+ yargs@15.4.1:
+ dependencies:
+ cliui: 6.0.0
+ decamelize: 1.2.0
+ find-up: 4.1.0
+ get-caller-file: 2.0.5
+ require-directory: 2.1.1
+ require-main-filename: 2.0.0
+ set-blocking: 2.0.0
+ string-width: 4.2.3
+ which-module: 2.0.1
+ y18n: 4.0.3
+ yargs-parser: 18.1.3
+
yargs@17.7.3:
dependencies:
cliui: 8.0.1
@@ -8413,4 +10905,18 @@ snapshots:
compress-commons: 6.0.2
readable-stream: 4.7.0
+ zod@3.22.4: {}
+
zod@3.25.76: {}
+
+ zustand@5.0.15(@types/react@19.2.18)(react@19.2.8)(use-sync-external-store@1.4.0(react@19.2.8)):
+ optionalDependencies:
+ '@types/react': 19.2.18
+ react: 19.2.8
+ use-sync-external-store: 1.4.0(react@19.2.8)
+
+ zustand@5.0.3(@types/react@19.2.18)(react@19.2.8)(use-sync-external-store@1.4.0(react@19.2.8)):
+ optionalDependencies:
+ '@types/react': 19.2.18
+ react: 19.2.8
+ use-sync-external-store: 1.4.0(react@19.2.8)
diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml
index f0f3289..ea171f9 100644
--- a/pnpm-workspace.yaml
+++ b/pnpm-workspace.yaml
@@ -6,9 +6,16 @@ packages:
saveExact: true
strictPeerDependencies: true
autoInstallPeers: true
+overrides:
+ lucide-react: 0.475.0
+ use-sync-external-store: 1.4.0
allowBuilds:
+ '@reown/appkit': false
+ bufferutil: false
cpu-features: false
esbuild: true
+ keccak: false
protobufjs: true
ssh2: false
+ utf-8-validate: false
workerd: true
From 18a554eb362f5331f10684b7c22a6d427056e183 Mon Sep 17 00:00:00 2001
From: Matvii Nesterenko <51422901+kapustazh@users.noreply.github.com>
Date: Thu, 10 Sep 2026 01:07:58 +0200
Subject: [PATCH 10/10] docs: describe the Privy operator sign-in boundary
---
...20260909T190000Z-privy-auth-ops-landing.md | 80 +++++++++++++++++++
.env.example | 8 ++
README.md | 17 ++++
3 files changed, 105 insertions(+)
create mode 100644 .agent/context/20260909T190000Z-privy-auth-ops-landing.md
diff --git a/.agent/context/20260909T190000Z-privy-auth-ops-landing.md b/.agent/context/20260909T190000Z-privy-auth-ops-landing.md
new file mode 100644
index 0000000..641fb8b
--- /dev/null
+++ b/.agent/context/20260909T190000Z-privy-auth-ops-landing.md
@@ -0,0 +1,80 @@
+# Session Context: Privy operator authentication
+
+## Date/time
+
+- UTC: 2026-09-09T22:34:33Z
+
+## User goal
+
+Implement the Privy operator-authentication plan through validation, mandatory review gates, and a draft pull request.
+
+## Original prompt/request
+
+Complete `2026-09-09-privy-operator-auth.md` from the current Task 5/10 state through all remaining work and required gates.
+
+## Assumptions
+
+- The named `feature/privy-operator-auth` branch is the intended short-lived branch.
+- Tasks 1–4 are missing from the branch and must be completed before Tasks 7–10.
+- Privy operator login is separate from the existing Privy wallet-authorization boundary.
+
+## Plan
+
+1. Implement and test missing API authentication Tasks 1–4.
+2. Complete web Tasks 7–8 and operator documentation.
+3. Run full validation, Gate A, draft PR CI, and Gate B.
+
+## Key decisions
+
+- Route JWT-shaped credentials only to the Privy verifier and opaque credentials only to the existing constant-time service-token verifier.
+- Keep operator access tokens in memory and never render or log them.
+- Preserve the existing service bearer for worker and agent clients.
+
+## Files/components touched
+
+- `apps/api/src/privy-auth.ts`, `auth.ts`, `config.ts`, and `runtime.ts`: ES256 verification, credential routing, fail-closed configuration, and runtime composition.
+- `apps/api/test`: JWT rejection, allowlist, configuration, routing, runtime, logging, and forbidden-ledger boundary coverage.
+- `apps/web/src/auth`, `LoginGate.tsx`, `App.tsx`, and `main.tsx`: in-memory operator session, gated console, credential selection, and lazy Privy provider.
+- `apps/web/test` and `apps/web/browser`: unit, composition, credential-header, storage, token-leak, and Playwright gate coverage.
+- `apps/web/package.json`, `pnpm-lock.yaml`, and `pnpm-workspace.yaml`: official React SDK plus strict-peer-compatible transitive pins and denied optional native build scripts.
+- `.env.example`, `apps/web/.env.example`, and `README.md`: safe placeholders and operator bootstrap documentation.
+
+## Commands/checks
+
+- Task 5: 4 focused tests, typecheck, lint, and format passed.
+- Task 6: 7 focused tests; full web suite 46/46; typecheck, lint, and format passed.
+- API focused suite: 40/40 tests passed, including forbidden reconciliation never reaching the ledger.
+- Web focused suite: 50/50 tests passed; Playwright: 7/7 passed.
+- `pnpm peers check` - passed with no peer dependency issues.
+- `pnpm format:check`, `pnpm lint`, `pnpm typecheck`, and `pnpm check:generated` - passed.
+- `pnpm test` - passed: 64 files, 942 tests.
+- `pnpm --filter @oneshot/web test:browser` - passed: 7 tests.
+- `pnpm --filter @oneshot/web build` - passed; Privy emitted as a separate lazy chunk.
+
+## External-doc findings
+
+- Privy access-token documentation checked 2026-09-09: access tokens are ES256 JWTs with `privy.io` issuer, app-id audience, Privy DID subject, and roughly one-hour lifetime; `getAccessToken` refreshes when needed.
+- Privy login UI documentation checked 2026-09-09: React authentication state is exposed through `usePrivy`; configured login methods include email and wallet.
+- Privy dashboard documentation checked 2026-09-09: the public verification key is available under Configuration, App settings, Basics, “Verify with key instead.”
+
+## Unresolved questions
+
+- Local Node is 22.23.2 while the repository requires 24.19.0; all checks passed with an engine warning, and CI must confirm on the required version.
+- Planned React SDK 3.41.0 was younger than the 24-hour supply-chain threshold and introduced an unsatisfied Solana/TypeScript peer graph. Version 3.6.1 is the newest tested version before that dependency break; upgrade after a compatible release clears policy.
+
+## Git and PR state
+
+- Branch: `feature/privy-operator-auth`
+- Base: `origin/develop` at `78b9d74bd4b111a6418485baff6379464325960c`
+- Commit: `dd424c7e6651539f8c0b0d0abf9347393c00d6b2`
+- PR: not created
+- CI: not run
+
+## Review gates
+
+- Gate A: NOT RUN
+- Gate B: NOT RUN
+
+## Handoff/next steps
+
+1. Commit operator documentation, run Gate A, push a draft PR, wait for CI, then run Gate B.
diff --git a/.env.example b/.env.example
index 007fe6e..d7b3f1e 100644
--- a/.env.example
+++ b/.env.example
@@ -24,6 +24,14 @@ ONESHOT_SETTLEMENT_CAP_ATOMIC=1000000
ONESHOT_RPC_TIMEOUT_MS=10000
ONESHOT_ALLOW_MAINNET_ACTIVATION=false
+# Operator login boundary. Separate from the ONESHOT_PRIVY_* wallet-authorization
+# variables above; both may reference the same Privy application.
+# The verification key is the PUBLIC ES256 key from the Privy dashboard.
+# Leave all three empty to keep the service-bearer-only behavior.
+PRIVY_AUTH_APP_ID=
+PRIVY_AUTH_VERIFICATION_KEY=
+PRIVY_AUTH_ALLOWED_SUBJECTS=did:privy:
+
# Recovery discovery and advisory configuration. Graph evidence is candidate-only;
# Vertex recommendations cannot authorize or submit settlement.
ONESHOT_SUBGRAPH_MCP_ENDPOINT=https://
diff --git a/README.md b/README.md
index 9ec2086..4079e39 100644
--- a/README.md
+++ b/README.md
@@ -170,6 +170,23 @@ Copy `.env.example` to `.env` and fill in placeholders. Never commit a real
secret; see `docs/settlement/SETTLEMENT_CONFIG_V1.md` for how each variable is
classified.
+### Operator sign-in
+
+Privy operator login is optional and separate from the Privy wallet and
+settlement-policy adapter in `packages/privy-adapter`. Set all three API
+variables together: `PRIVY_AUTH_APP_ID`, `PRIVY_AUTH_VERIFICATION_KEY`, and
+`PRIVY_AUTH_ALLOWED_SUBJECTS`. A partial configuration makes the API refuse to
+start. With none set, the API accepts only `SERVICE_BEARER_TOKEN`; worker and
+agent clients continue to use that service credential.
+
+Bootstrap an operator by setting `VITE_PRIVY_APP_ID`, starting the web app,
+signing in, copying the DID shown by the console, adding that DID to
+`PRIVY_AUTH_ALLOWED_SUBJECTS`, and then starting the API. Copy the public ES256
+verification key from Privy Dashboard → Configuration → App settings → Basics
+→ Verify with key instead into runtime environment configuration. Never commit
+the key. This boundary does not use the Privy app secret; never add that secret
+to its configuration.
+
To verify a configured Arc endpoint really is the chain and token you think it
is: