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) + + 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.

+ + + )} + +
+ ); + } + + return ( + <> +
+ {props.session.status === 'SIGNED_IN' && props.session.subject ? ( + <> + Signed in as + {props.session.subject} + + Add this DID to PRIVY_AUTH_ALLOWED_SUBJECTS to grant console access. + + + ) : ( + <> + 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 = {}) { -
- - setAuthToken(event.target.value)} - /> - Memory only. Sent as Bearer authorization. -
- -
- - setSelectedIntentId(event.target.value)} - placeholder="Create an intent or enter its stable ID" - /> -
+ +
+ + setSelectedIntentId(event.target.value)} + placeholder="Create an intent or enter its stable ID" + /> +
- + -
- {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: