diff --git a/packages/interfold-dashboard/README.md b/packages/interfold-dashboard/README.md index 131fbdbedd..ee6f00e26b 100644 --- a/packages/interfold-dashboard/README.md +++ b/packages/interfold-dashboard/README.md @@ -91,6 +91,32 @@ rewards** sends `claimRewards(e3Ids)` for the completed E3s of the connected rec `claimHonestNodeReward` for each failed E3. Each transaction waits for the previous one. E3s that an earlier refund manager recorded are not listed. The amounts use the `FEE_TOKEN_*` display settings. +**Bond-owner identity** (`src/lib/identity.ts`) shows when the operator has a bond owner. Governance +can require each bond owner to prove one identity document with ZKPassport (`OwnerIdentityRegistry` +and `ZKPassportIdentityVerifier`). The page: + +1. Reads the policy from the bonding registry's storage (it has no view). Then it reads the + verifier's fixed settings (domain, scope, ZKPassport version, identifier type, FaceMatch, proof + validity, maximum validity) and the owner's credential (`identityOf`, `isVerifiedAt`). +2. Creates a ZKPassport request with `@zkpassport/sdk` in `compressed-evm` mode. The document must + be valid until a chosen date, and the proof binds the bond owner and the chain. The SDK and the + QR code load only when the owner asks for a proof. +3. Builds the evidence, `abi.encode(ProofVerificationParams, validUntil)`. `validUntil` is the + expiry bound that the proof committed to, not the typed date. +4. Registers it. An owner wallet sends `register(evidence)`. A Safe downloads a Safe Transaction + Builder batch and executes it before the proof's validity ends. + +The page warns when the proof's ZKPassport version differs from the verifier's, when the proof is +too old, when a renewal would shorten the credential, and when the credential ends inside the +current 30-day capacity window. Before a deployment (no policy yet), it makes a proof with the +planned settings (`PREVIEW_SERVICE`) and offers only the download. The download holds the proofs, +the verifier parameters, and the evidence, so a fork test can replay it. + +The policy has no view, so the panel reads it from the bonding registry's ERC-7201 storage +(`IDENTITY_STORAGE_SLOT` in `src/lib/identity.ts`). These storage reads need no log history, so any +RPC serves them, and the page needs no setting for the identity upgrade. A contracts spec pins the +slots. + Only `VITE_BONDING_REGISTRY_ADDRESS` is configured. The ciphernode bond token, ticket wrapper, ticket underlying, bond size, ticket price, minimum tickets, and exit delay are all read back from the registry, so the guide follows the deployment instead of a hardcoded token list. diff --git a/packages/interfold-dashboard/package.json b/packages/interfold-dashboard/package.json index d4e0c708d7..00a9b0726c 100644 --- a/packages/interfold-dashboard/package.json +++ b/packages/interfold-dashboard/package.json @@ -9,16 +9,19 @@ "dev": "vite", "build": "vite build", "preview": "vite preview", - "test": "tsx --test src/Inspector.test.tsx src/Operator.test.tsx", + "test": "tsx --test src/Inspector.test.tsx src/Operator.test.tsx src/lib/identity.test.ts src/lib/networks.test.ts", "typecheck": "tsc --noEmit" }, "dependencies": { "@interfold/contracts": "workspace:*", + "@zkpassport/sdk": "0.19.2", + "qrcode": "1.5.4", "react": "^18.3.1", "react-dom": "^18.3.1", "viem": "^2.21.0" }, "devDependencies": { + "@types/qrcode": "1.5.5", "@types/react": "^18.3.3", "@types/react-dom": "^18.3.0", "@vitejs/plugin-react": "^4.3.1", diff --git a/packages/interfold-dashboard/src/Operator.test.tsx b/packages/interfold-dashboard/src/Operator.test.tsx index f5883d1e75..2a0c524d4f 100644 --- a/packages/interfold-dashboard/src/Operator.test.tsx +++ b/packages/interfold-dashboard/src/Operator.test.tsx @@ -8,10 +8,20 @@ import assert from 'node:assert/strict' import test from 'node:test' import { renderToStaticMarkup } from 'react-dom/server' import type { Address } from 'viem' -import { CommitteeRewardsView, ManagePosition, positionActions, ticketBurnAmount } from './Operator' -import { CONTRACTS, E3Stage, FEE_TOKEN } from './lib/chain' +import { CommitteeRewardsView, IdentityView, ManagePosition, positionActions, ticketBurnAmount, type IdentityService } from './Operator' +import { CHAIN, CONTRACTS, E3Stage, FEE_TOKEN } from './lib/chain' import type { BondingConfig, OperatorStatus } from './lib/bonding' import { claimPlan, summarizeRewards, type CommitteeSeat, type SeatStatus } from './lib/rewards' +import { + boundChainName, + buildProofBundle, + dateInput, + identityStatusText, + parseDateInput, + type OwnerAccount, + type VerifierConfig, +} from './lib/identity' +import { pad, toHex, type Hex } from 'viem' const OPERATOR = '0x1111111111111111111111111111111111111111' as Address const OWNER = '0x2222222222222222222222222222222222222222' as Address @@ -168,3 +178,233 @@ test('the claim covers the claimable seats of the connected recipient, and the s assert.match(renderToStaticMarkup(), /Reading rewards/) assert.match(renderToStaticMarkup(), /No committee has selected/) }) + +// ─── Bond-owner identity ─────────────────────────────────────────────────── + +const DAY = 86_400n +const NOW = 1_790_000_000n +const word = (value: bigint): Hex => pad(toHex(value), { size: 32 }) +const VERSION = word(0x14n << 232n) + +const service: IdentityService = { + domain: 'dashboard.theinterfold.com', + scope: 'interfold-bond-owner', + faceMatch: true, + nullifierType: 0, + proofValidity: 7n * DAY, + maxValidity: 365n * DAY, +} + +const verifier: VerifierConfig = { + address: OTHER, + domain: service.domain, + scope: service.scope, + version: VERSION, + nullifierType: 0, + oprfKeyHash: word(0n), + faceMatchRequired: true, + proofValidity: service.proofValidity, + maxValidity: service.maxValidity, +} + +const policy = { registry: PROPOSED, required: true, timepoint: NOW - 10n * DAY } + +function account(overrides: Partial = {}): OwnerAccount { + return { now: NOW, isContract: false, identity: { identityId: word(0n), expiresAt: 0n, verifiedNow: false }, ...overrides } +} + +function bundle(version: Hex = VERSION, boundTo: Address = OWNER) { + return buildProofBundle({ + success: { + proofs: [ + { + name: 'compare_expiry_evm', + committedInputs: { compare_expiry_evm: { minDateTimestamp: Number(NOW + 400n * DAY), maxDateTimestamp: 0 } }, + }, + { + name: 'outer_evm_count_5', + proof: '0x02', + committedInputs: { bind_evm: { data: { user_address: boundTo, chain: boundChainName(CHAIN.id) } } }, + }, + ], + result: {}, + }, + params: { + version, + proofVerificationData: { + vkeyHash: word(7n), + proof: '0x1234', + publicInputs: [word(1n), word(2n), word(NOW), word(0n), word(9n), word(0n)], + }, + committedInputs: '0xbeef', + serviceConfig: { validityPeriodInSeconds: 604_800, domain: service.domain, scope: service.scope, devMode: false }, + }, + owner: OWNER, + chainId: 11_155_111, + faceMatch: true, + }) +} + +const identityProps = { + owner: OWNER, + policy, + verifier, + account: account(), + loadFailed: false, + service, + validUntilInput: '2027-12-01', + onValidUntil: () => {}, + previewFaceMatch: true, + onPreviewFaceMatch: () => {}, + request: { phase: 'idle' } as const, + canRegister: true, + busy: null, + errFor: () => null, + onReload: () => {}, + onCreate: () => {}, + onCancel: () => {}, + onRegister: () => {}, + onDownloadProof: () => {}, + onDownloadSafe: () => {}, +} + +test('date fields round-trip in UTC and reject impossible dates', () => { + assert.equal(parseDateInput('2027-12-01'), BigInt(Date.UTC(2027, 11, 1) / 1000)) + assert.equal(dateInput(parseDateInput('2027-12-01')!), '2027-12-01') + assert.equal(parseDateInput('2026-02-31'), null) + assert.equal(parseDateInput('01/12/2027'), null) + assert.equal(parseDateInput('0099-01-01'), BigInt(Date.parse('0099-01-01T00:00:00Z') / 1000)) +}) + +test('the identity panel shows the credential and offers a request', () => { + const unverified = renderToStaticMarkup() + assert.match(unverified, /Yes, since/) + assert.match(unverified, /Not verified/) + assert.match(unverified, /Verify the owner/) + assert.match(unverified, />Create ZKPassport request) + assert.match(renew, /Renew the credential/) + assert.match(renew, /A renewal cannot shorten the credential/) + + // A credential that ends inside the current window does not count toward request capacity. + const short = account({ identity: { identityId: word(1n), expiresAt: NOW + 1n, verifiedNow: true } }) + assert.match(renderToStaticMarkup(), /does not count toward request capacity/) + assert.match( + renderToStaticMarkup(), + /would not count toward request/, + ) +}) + +test('before a deployment the panel makes a proof to download', () => { + const preview = renderToStaticMarkup( + , + ) + assert.match(preview, /No identity registry on/) + assert.match(preview, /planned settings/) + assert.match(preview, /Require FaceMatch/) + + const ready = renderToStaticMarkup( + , + ) + assert.match(ready, /Proof ready/) + assert.match(ready, />Download the proof \(JSON\) { + const ready = { phase: 'ready', bundle: bundle() } as const + const eoa = renderToStaticMarkup() + assert.match(eoa, / + + ) : policy === undefined || !account ? ( +

Loading the identity status…

+ ) : ( + <> +
+
Bond owner
+
+ + {account.isContract && · contract wallet (Safe)} +
+
Identity required
+
+ {preview ? ( + No identity registry on {NETWORK_NAME} yet + ) : policy.required ? ( + `Yes, since ${fmtDay(policy.timepoint)}` + ) : ( + 'Not yet' + )} +
+ {!preview && ( + <> +
Credential
+
{identityStatusText(account)}
+ + )} +
+ {capacityApplies && account.identity && account.identity.verifiedNow && windowEnd !== null && currentExpiry < windowEnd && ( + + The credential ends before this 30-day window ends ({fmtDay(windowEnd)}), so this owner does not count toward request capacity + in this window. Renew it. + + )} + {preview && ( + + You can still make a proof and download it. It uses the planned settings: domain{' '} + {service.domain}, scope {service.scope}. + + )} + + {!chain ? ( + ZKPassport does not verify proofs on {NETWORK_NAME}. + ) : registrationClosed ? ( + + This page cannot register with the identity registry now: it has no verifier, or its verifier is not a ZKPassport verifier. + Credentials it issued stay valid. + + ) : request.phase === 'ready' ? ( + + ) : ( +
+

{account.identity?.expiresAt ? 'Renew the credential' : 'Verify the owner'}

+

+ Use a passport, ID card or residence permit with a chip, and a phone with NFC and the ZKPassport app. The proof is bound to + this owner and to {NETWORK_NAME}. +

+ + {capacityApplies && plannedEnd !== null && windowEnd !== null && plannedEnd < windowEnd && ( + + This date is before the end of the current 30-day window ({fmtDay(windowEnd)}). The owner would not count toward request + capacity in this window. + + )} + {plannedEnd !== null && account.identity && plannedEnd < currentExpiry && ( + + Pick a date after the current expiry ({fmtDay(currentExpiry)}). A renewal cannot shorten the credential. + + )} + {preview ? ( + + ) : ( + service.faceMatch && The app also asks for a face scan (FaceMatch). + )} + + {request.phase === 'waiting' ? ( +
+ ZKPassport request QR code +
+

+ {request.received + ? 'The request is open in the app. Check the site and the bound address, then approve it.' + : 'Scan this code with the ZKPassport app.'} +

+ + Open the request on this phone + +
+
+ ) : request.phase === 'proving' ? ( +

The app is making the proof. This takes up to a minute.

+ ) : request.phase === 'failed' ? ( + {request.message} + ) : null} + +
+ {requesting ? ( + + ) : ( + + )} +
+
+ )} + + )} + + ) +} + +/** A proof from the app: what the verifier will read from it, and the ways to register it. */ +function IdentityProof({ + bundle, + owner, + preview, + verifier, + account, + service, + canRegister, + busy, + errFor, + onRegister, + onDownloadProof, + onDownloadSafe, + refreshInBatch, + onRefresh, + onRestart, +}: { + bundle: ProofBundle + owner: Address + preview: boolean + verifier: VerifierConfig | null + account: OwnerAccount + service: IdentityService + canRegister: boolean + busy: string | null + errFor: (key: string) => ReactNode + onRegister: (bundle: ProofBundle) => void + onDownloadProof: (bundle: ProofBundle) => void + onDownloadSafe: (bundle: ProofBundle) => void + refreshInBatch: boolean + onRefresh: (() => void) | null + onRestart: () => void +}) { + const validUntil = BigInt(bundle.validUntil) + const proofDate = BigInt(bundle.proofDate) + const ends = credentialEnd(validUntil, proofDate, service.maxValidity) + const deadline = proofDeadline(bundle, service) + // A proof bound to another owner or chain would only revert. Read the binding from the proof. + const binding = proofBinding(bundle.proofs) + const bound = binding !== null && sameAddress(binding.owner, owner) && binding.chain === boundChainName(CHAIN.id) + const versionMatches = !verifier || bundle.version.toLowerCase() === verifier.version.toLowerCase() + const keyMatches = + !verifier || + (bundle.nullifierType === verifier.nullifierType && bundle.oprfKeyHash.toLowerCase() === verifier.oprfKeyHash.toLowerCase()) + const expired = account.now > deadline + const shortens = account.identity !== null && ends < account.identity.expiresAt + const blocked = !bound || !versionMatches || !keyMatches || expired || shortens + + return ( +
+

Proof ready

+
+
Bound to
+
+ on {NETWORK_NAME} +
+
Document valid until
+
{fmtDay(validUntil)}
+
Credential ends
+
{fmtDay(ends)}
+
Register before
+
{fmtMoment(deadline)}
+
Identifier type
+
{bundle.nullifierType === 1 ? 'Salted' : 'Not salted'}
+
+ {!bound && This proof is bound to another owner or network. Create a new request.} + {!keyMatches && ( + The proof's identifier type or OPRF key differs from the verifier's. The verifier would reject it. + )} + {!versionMatches && ( + + The app made the proof with another ZKPassport version than the verifier accepts. Governance must deploy a verifier for the new + version first. + + )} + {expired && The proof is too old to register. Create a new request.} + {shortens && This proof ends before the current credential. A renewal cannot shorten it.} + +
+ {!preview && !account.isContract && ( + + )} + {!preview && account.isContract && ( + + )} + {!preview && !account.isContract && onRefresh && account.identity?.verifiedNow && ( + + )} + + +
+ {errFor(REGISTER_IDENTITY_KEY)} + {errFor(REFRESH_AFTER_IDENTITY_KEY)} + {!preview && !account.isContract && !canRegister && Connect the bond-owner wallet {shortAddr(owner)} to register.} + {!preview && account.isContract && ( + + Load the file in the Safe Transaction Builder and execute it before {fmtMoment(deadline)}. The registration costs about 1.3 + million gas. + + )} + {!preview && + (account.isContract && refreshInBatch ? ( + The batch also refreshes the operator's status, so the owner counts toward this window's request capacity. + ) : ( + + The owner's operators count toward this window's request capacity after their next status refresh. Each node refreshes itself + when a window starts;{' '} + {onRefresh ? ( + <> + to count now, register and then use Count the owner now. + + ) : ( + <> + to count now, use Refresh the status in Manage the position. + + )} + + ))} +
+ ) +} + +/** The last moment that this proof can register under `service`. */ +function proofDeadline(bundle: ProofBundle, service: IdentityService): bigint { + const proofDate = BigInt(bundle.proofDate) + return registrationDeadline(proofDate, service.proofValidity, credentialEnd(BigInt(bundle.validUntil), proofDate, service.maxValidity)) +} + +/** A Unix timestamp as a UTC date and time, to the minute. */ +function fmtMoment(ts: bigint): string { + return `${new Date(Number(ts) * 1000).toISOString().slice(0, 16).replace('T', ' ')} UTC` +} + +function downloadJson(name: string, value: unknown) { + const text = JSON.stringify(value, (_, v) => (typeof v === 'bigint' ? v.toString() : v), 2) + const url = URL.createObjectURL(new Blob([text], { type: 'application/json' })) + const link = document.createElement('a') + link.href = url + link.download = name + link.click() + URL.revokeObjectURL(url) +} + const bigMax = (a: bigint, b: bigint): bigint => (a > b ? a : b) // Parse a user-typed decimal amount. Returns null for anything that isn't a diff --git a/packages/interfold-dashboard/src/lib/bonding.ts b/packages/interfold-dashboard/src/lib/bonding.ts index ae8f3ad2a6..1a974460c7 100644 --- a/packages/interfold-dashboard/src/lib/bonding.ts +++ b/packages/interfold-dashboard/src/lib/bonding.ts @@ -295,6 +295,10 @@ export function useBonding(operator: string | null, account: Address | null): Bo } }, [validOperator, account, nonce]) + // The render that switches identity still holds the previous identity's state: the + // clearing above applies from the next render. Return the cleared values now, so a + // caller never stores the previous operator's status for the new one. + if (identity !== loadedIdentity) return { config, status: null, funds: null, loading: true, error: null, refresh } return { config, status, funds, loading, error, refresh } } diff --git a/packages/interfold-dashboard/src/lib/chain.ts b/packages/interfold-dashboard/src/lib/chain.ts index 5ea364f783..e440e840d5 100644 --- a/packages/interfold-dashboard/src/lib/chain.ts +++ b/packages/interfold-dashboard/src/lib/chain.ts @@ -15,9 +15,12 @@ import { CiphernodeRegistryOwnable__factory, E3RefundManager__factory, Faucet__factory, + IOwnerIdentityRegistry__factory, + IZKPassportVerifier__factory, Interfold__factory, InterfoldTicketToken__factory, InterfoldToken__factory, + ZKPassportIdentityVerifier__factory, } from '@interfold/contracts/types' import { NETWORKS, overrideKey, selectNetwork, type Env, type Setting } from './networks' @@ -137,3 +140,11 @@ export const bondingRegistryAbi = BondingRegistry__factory.abi export const ticketTokenAbi = InterfoldTicketToken__factory.abi export const ciphernodeBondTokenAbi = InterfoldToken__factory.abi export const faucetAbi = Faucet__factory.abi +export const ownerIdentityRegistryAbi = IOwnerIdentityRegistry__factory.abi +export const zkPassportIdentityVerifierAbi = ZKPassportIdentityVerifier__factory.abi +export const zkPassportRootVerifierAbi = IZKPassportVerifier__factory.abi +// `register` also reverts with the verifier's errors, so the call's ABI lists them to decode them. +export const identityRegisterAbi = [ + ...ownerIdentityRegistryAbi, + ...zkPassportIdentityVerifierAbi.filter((item) => item.type === 'error'), +] as const diff --git a/packages/interfold-dashboard/src/lib/identity.test.ts b/packages/interfold-dashboard/src/lib/identity.test.ts new file mode 100644 index 0000000000..b4683a529a --- /dev/null +++ b/packages/interfold-dashboard/src/lib/identity.test.ts @@ -0,0 +1,214 @@ +// SPDX-License-Identifier: LGPL-3.0-only +// +// This file is provided WITHOUT ANY WARRANTY; +// without even the implied warranty of MERCHANTABILITY +// or FITNESS FOR A PARTICULAR PURPOSE. + +import assert from 'node:assert/strict' +import test from 'node:test' +import { + decodeAbiParameters, + decodeFunctionData, + encodeAbiParameters, + getAbiItem, + keccak256, + pad, + toHex, + type Address, + type Hex, +} from 'viem' +import type { RequestSuccess, SolidityVerifierParameters } from '@zkpassport/sdk' +import { bondingRegistryAbi, identityRegisterAbi, ownerIdentityRegistryAbi, zkPassportRootVerifierAbi } from './chain' +import { + CAPACITY_WINDOW, + boundChainName, + buildProofBundle, + capacityWindowEnd, + credentialEnd, + encodeEvidence, + expiryLowerBound, + isContractCode, + outerEvmProof, + proofFacts, + registrationDeadline, + safeRegistrationBatch, + type ProofResult, + IDENTITY_STORAGE_SLOT, + proofBinding, + readIdentityPolicy, +} from './identity' + +const OWNER = '0x2222222222222222222222222222222222222222' as Address +const REGISTRY = '0x5555555555555555555555555555555555555555' as Address +const word = (value: bigint): Hex => pad(toHex(value), { size: 32 }) +const PROOF_DATE = 1_790_000_000n +const VALID_UNTIL = 1_830_000_000n + +function verifierParams(): SolidityVerifierParameters { + return { + version: word(0x14_00_00n << 224n), + proofVerificationData: { + vkeyHash: word(7n), + proof: '0x1234', + // The verifier reads the proof date at index 2 and ends with + // [nullifier type, scoped nullifier, OPRF key hash]. + publicInputs: [word(1n), word(2n), word(PROOF_DATE), word(9n), word(0n), word(0xabcdefn), word(0n)], + }, + committedInputs: '0xbeef', + serviceConfig: { + validityPeriodInSeconds: 604_800, + domain: 'dashboard.theinterfold.com', + scope: 'interfold-bond-owner', + devMode: false, + }, + } +} + +function proofs(): ProofResult[] { + return [ + { name: 'sig_check_dsc', proof: '0x01' }, + { name: 'compare_expiry_evm', committedInputs: { compare_expiry_evm: { minDateTimestamp: Number(VALID_UNTIL), maxDateTimestamp: 0 } } }, + { name: 'outer_evm_count_5', proof: '0x02', version: '0.21.1' }, + ] +} + +test('capacity windows end at the same second as BondOwnerCapacityLib', () => { + const start = CAPACITY_WINDOW * 680n + assert.equal(capacityWindowEnd(start), start + CAPACITY_WINDOW - 1n) + assert.equal(capacityWindowEnd(start + CAPACITY_WINDOW - 1n), start + CAPACITY_WINDOW - 1n) + assert.equal(capacityWindowEnd(start + CAPACITY_WINDOW), start + 2n * CAPACITY_WINDOW - 1n) +}) + +test('a proof binds to the ZKPassport name of the dashboard chain', () => { + assert.equal(boundChainName(1), 'ethereum') + assert.equal(boundChainName(11_155_111), 'ethereum_sepolia') + assert.equal(boundChainName(8453), null) +}) + +test('the evidence carries the outer proof and the committed expiry bound', () => { + assert.equal(outerEvmProof(proofs())?.name, 'outer_evm_count_5') + assert.equal(outerEvmProof(proofs().slice(0, 2)), null) + assert.equal(expiryLowerBound(proofs()), VALID_UNTIL) + assert.equal(expiryLowerBound([{ name: 'outer_evm' }]), null) + + const facts = proofFacts(verifierParams()) + assert.deepEqual(facts, { proofDate: PROOF_DATE, nullifierType: 0, scopedNullifier: word(0xabcdefn), oprfKeyHash: word(0n) }) + assert.equal(credentialEnd(VALID_UNTIL, PROOF_DATE, 365n * 86_400n), PROOF_DATE + 365n * 86_400n) + assert.equal(credentialEnd(PROOF_DATE + 10n, PROOF_DATE, 365n * 86_400n), PROOF_DATE + 10n) +}) + +test('the evidence decodes as the verifier decodes it', () => { + const params = verifierParams() + const evidence = encodeEvidence(params, VALID_UNTIL) + const tuple = getAbiItem({ abi: zkPassportRootVerifierAbi, name: 'verify' }).inputs[0] + const [decoded, validUntil] = decodeAbiParameters([tuple, { type: 'uint256' }], evidence) as [any, bigint] + assert.equal(validUntil, VALID_UNTIL) + assert.equal(decoded.version, params.version) + assert.equal(decoded.proofVerificationData.proof, '0x1234') + assert.deepEqual(decoded.proofVerificationData.publicInputs, params.proofVerificationData.publicInputs) + assert.equal(decoded.committedInputs, '0xbeef') + assert.equal(decoded.serviceConfig.domain, 'dashboard.theinterfold.com') + assert.equal(decoded.serviceConfig.validityPeriodInSeconds, 604_800n) +}) + +test('a Safe batch registers the evidence from the bound Safe', () => { + const evidence = encodeEvidence(verifierParams(), VALID_UNTIL) + const batch = safeRegistrationBatch(REGISTRY, OWNER, 1, evidence, 1_700_000_000_000) + assert.equal(batch.chainId, '1') + assert.equal(batch.meta.createdFromSafeAddress, OWNER) + assert.equal(batch.transactions.length, 1) + assert.equal(batch.transactions[0].to, REGISTRY) + assert.equal(batch.transactions[0].value, '0') + const call = decodeFunctionData({ abi: ownerIdentityRegistryAbi, data: batch.transactions[0].data }) + assert.equal(call.functionName, 'register') + assert.deepEqual(call.args, [evidence]) + + // With a registered operator, the same batch counts the owner in this window. + const bonding = '0x6666666666666666666666666666666666666666' as Address + const operator = '0x7777777777777777777777777777777777777777' as Address + const counted = safeRegistrationBatch(REGISTRY, OWNER, 1, evidence, 1_700_000_000_000, { bondingRegistry: bonding, operator }) + assert.equal(counted.transactions.length, 2) + assert.deepEqual(counted.transactions[0], batch.transactions[0]) + assert.equal(counted.transactions[1].to, bonding) + const refresh = decodeFunctionData({ abi: bondingRegistryAbi, data: counted.transactions[1].data }) + assert.equal(refresh.functionName, 'refreshOperatorStatus') + assert.deepEqual(refresh.args, [operator]) +}) + +test('the downloaded bundle describes the proof that it carries', () => { + const success = { proofs: proofs(), result: {} } as RequestSuccess + const bundle = buildProofBundle({ success, params: verifierParams(), owner: OWNER, chainId: 1, faceMatch: true }) + assert.equal(bundle.owner, OWNER) + assert.equal(bundle.chainId, 1) + assert.equal(bundle.validUntil, VALID_UNTIL.toString()) + assert.equal(bundle.proofDate, PROOF_DATE.toString()) + assert.equal(bundle.domain, 'dashboard.theinterfold.com') + assert.equal(bundle.scope, 'interfold-bond-owner') + assert.equal(bundle.evidence, encodeEvidence(verifierParams(), VALID_UNTIL)) + assert.doesNotThrow(() => JSON.stringify(bundle)) + + assert.throws( + () => + buildProofBundle({ + success: { proofs: [], result: {} } as RequestSuccess, + params: verifierParams(), + owner: OWNER, + chainId: 1, + faceMatch: true, + }), + /no expiry-date check/, + ) +}) + +test('an EIP-7702 account registers itself; a contract wallet goes through its own transaction', () => { + assert.equal(isContractCode(undefined), false) + assert.equal(isContractCode('0x'), false) + assert.equal(isContractCode(`0xef0100${'ab'.repeat(20)}`), false) + assert.equal(isContractCode(`0xEF0100${'AB'.repeat(20)}`), false) + assert.equal(isContractCode('0x6080604052'), true) + assert.equal(isContractCode(`0xef0100${'ab'.repeat(21)}`), true) +}) + +test('a proof registers until it is too old or its credential ends', () => { + assert.equal(registrationDeadline(1_000n, 600n, 5_000n), 1_600n) + assert.equal(registrationDeadline(1_000n, 600n, 1_200n), 1_200n) +}) + +test('the policy comes from the bonding registry storage', async () => { + const registry = '0x4444444444444444444444444444444444444444' as Address + const slots = (versions: bigint, version: bigint, policy: bigint) => { + const checkpoints = BigInt(keccak256(word(IDENTITY_STORAGE_SLOT))) + const policySlot = keccak256(encodeAbiParameters([{ type: 'uint256' }, { type: 'uint256' }], [version, IDENTITY_STORAGE_SLOT + 1n])) + const values = new Map([ + [word(IDENTITY_STORAGE_SLOT), versions], + [word(checkpoints + versions - 1n), (version << 48n) | 1_700n], + [policySlot, policy], + ]) + return async (slot: Hex) => values.get(slot) ?? 0n + } + // The second version requires the registry: `required` sits in the byte above the address. + assert.deepEqual(await readIdentityPolicy(slots(2n, 2n, (1n << 160n) | BigInt(registry))), { + registry, + required: true, + timepoint: 1_700n, + }) + assert.deepEqual(await readIdentityPolicy(slots(1n, 1n, BigInt(registry))), { registry, required: false, timepoint: 1_700n }) + // A policy that clears the registry turns the gate off, and before the first policy there is none. + assert.equal(await readIdentityPolicy(slots(3n, 3n, 0n)), null) + assert.equal(await readIdentityPolicy(async () => 0n), null) +}) + +test('the binding check reads the owner and chain from the proof', () => { + const proofs = [ + { name: 'compare_expiry_evm', committedInputs: { compare_expiry_evm: { minDateTimestamp: 1, maxDateTimestamp: 0 } } }, + { name: 'outer_evm_count_6', proof: '0x02', committedInputs: { bind_evm: { data: { user_address: OWNER, chain: 'ethereum' } } } }, + ] as unknown as ProofResult[] + assert.deepEqual(proofBinding(proofs), { owner: OWNER, chain: 'ethereum' }) + assert.equal(proofBinding(proofs.slice(0, 1)), null) +}) + +test('a registration that the verifier rejects shows the error name', () => { + const errors = identityRegisterAbi.filter((item) => item.type === 'error').map((item) => item.name) + assert.ok(errors.includes('WrongBinding')) + assert.ok(errors.includes('IdentityInUse')) +}) diff --git a/packages/interfold-dashboard/src/lib/identity.ts b/packages/interfold-dashboard/src/lib/identity.ts new file mode 100644 index 0000000000..481ac43ff2 --- /dev/null +++ b/packages/interfold-dashboard/src/lib/identity.ts @@ -0,0 +1,426 @@ +// SPDX-License-Identifier: LGPL-3.0-only +// +// This file is provided WITHOUT ANY WARRANTY; +// without even the implied warranty of MERCHANTABILITY +// or FITNESS FOR A PARTICULAR PURPOSE. +// Bond-owner identity behind the operator guide: the governance policy, the owner's credential, and +// the evidence that OwnerIdentityRegistry.register takes for a ZKPassport proof. +// +// The policy has no view, so the page reads it from the bonding registry's ERC-7201 storage. Three +// storage reads need no log history, so any RPC serves them. The verifier's fixed settings (domain, scope, +// ZKPassport version, identifier type) are read from the verifier itself, so the page follows the +// deployment. Before a deployment, the page can still make a proof with the planned settings +// (PREVIEW_SERVICE) and offer it as a download. + +import { + BaseError, + ContractFunctionRevertedError, + ContractFunctionZeroDataError, + encodeAbiParameters, + encodeFunctionData, + getAbiItem, + getAddress, + keccak256, + toHex, + type Address, + type Hex, +} from 'viem' +import type { RequestSuccess, SolidityVerifierParameters } from '@zkpassport/sdk' +import { + CONTRACTS, + bondingRegistryAbi, + ownerIdentityRegistryAbi, + publicClient, + zkPassportIdentityVerifierAbi, + zkPassportRootVerifierAbi, +} from './chain' + +export type ProofResult = RequestSuccess['proofs'][number] + +const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000' + +/** `BondOwnerCapacityLib.IDENTITY_CAPACITY_WINDOW`. Windows start at multiples of it from Unix time zero. */ +export const CAPACITY_WINDOW = 30n * 86_400n + +/** + * The verifier settings for a proof before governance deploys a verifier. The domain and scope are part + * of every identifier, so the deployment must use the same values. + */ +export const PREVIEW_SERVICE = { + domain: 'dashboard.theinterfold.com', + scope: 'interfold-bond-owner', + proofValidity: 7n * 86_400n, + maxValidity: 365n * 86_400n, +} as const + +const PROOF_VERIFICATION_PARAMS = getAbiItem({ abi: zkPassportRootVerifierAbi, name: 'verify' }).inputs[0] + +export type IdentityPolicy = { + registry: Address + required: boolean + /** Timestamp from which the policy applies. */ + timepoint: bigint +} + +/** The settings that the deployed ZKPassportIdentityVerifier fixes for every proof. */ +export type VerifierConfig = { + address: Address + domain: string + scope: string + /** The one ZKPassport version that the verifier accepts. */ + version: Hex + /** 0 non-salted, 1 salted. */ + nullifierType: number + oprfKeyHash: Hex + faceMatchRequired: boolean + /** Maximum proof age, in seconds, when the registration is mined. */ + proofValidity: bigint + /** Longest credential, in seconds after the proof date. */ + maxValidity: bigint +} + +export type OwnerAccount = { + /** Latest block timestamp. */ + now: bigint + /** A contract owner (a Safe) registers through its own transaction. */ + isContract: boolean + /** The owner's credential, or null when the network has no identity registry. */ + identity: { identityId: Hex; expiresAt: bigint; verifiedNow: boolean } | null +} + +/** + * ERC-7201 slot of the bonding registry's identity storage (`interfold.storage.BondingIdentity`). + * It holds `policyVersions` (a Trace208 of version checkpoints), then `policies` (version to policy). + */ +export const IDENTITY_STORAGE_SLOT = 0xc8753641d15ccfa7705fd1448b954f166a67eee148357f9bd69a050022902400n + +const word = (value: bigint): Hex => toHex(value, { size: 32 }) +const low = (value: bigint, bits: bigint) => value & ((1n << bits) - 1n) + +/** + * The current policy, from three reads of the bonding registry's storage: the number of policy + * versions, the latest checkpoint (key in the low 48 bits, version above it), and that version's + * policy (registry in the low 160 bits, `required` in the next byte). Null before the first policy + * and when the latest policy clears the registry. + */ +export async function readIdentityPolicy(readSlot: (slot: Hex) => Promise): Promise { + const versions = await readSlot(word(IDENTITY_STORAGE_SLOT)) + if (versions === 0n) return null + const checkpoints = BigInt(keccak256(word(IDENTITY_STORAGE_SLOT))) + const checkpoint = await readSlot(word(checkpoints + versions - 1n)) + const version = checkpoint >> 48n + const policySlot = keccak256(encodeAbiParameters([{ type: 'uint256' }, { type: 'uint256' }], [version, IDENTITY_STORAGE_SLOT + 1n])) + const policy = await readSlot(policySlot) + const registry = getAddress(toHex(low(policy, 160n), { size: 20 })) + if (registry === ZERO_ADDRESS) return null + return { registry, required: low(policy >> 160n, 8n) === 1n, timepoint: low(checkpoint, 48n) } +} + +/** The current identity policy of the bonding registry. Null before the first policy. */ +export function fetchIdentityPolicy(): Promise { + return readIdentityPolicy(async (slot) => + BigInt((await publicClient.getStorageAt({ address: CONTRACTS.BondingRegistry, slot })) ?? '0x0'), + ) +} + +/** Whether `error` is a contract call that reverted or returned no data, not a network failure. */ +export function isContractRevert(error: unknown): boolean { + return ( + error instanceof BaseError && + error.walk((cause) => cause instanceof ContractFunctionRevertedError || cause instanceof ContractFunctionZeroDataError) !== null + ) +} + +/** + * The verifier settings, or null while this page cannot register: the registry has no verifier, or + * its verifier is not a ZKPassport verifier. + */ +export async function fetchVerifierConfig(registry: Address): Promise { + const address = (await (publicClient.readContract as any)({ + address: registry, + abi: ownerIdentityRegistryAbi, + functionName: 'verifier', + })) as Address + if (address === ZERO_ADDRESS) return null + const read = (functionName: string) => (publicClient.readContract as any)({ address, abi: zkPassportIdentityVerifierAbi, functionName }) + let settings + try { + settings = await Promise.all([ + read('domain'), + read('scope'), + read('VERSION'), + read('NULLIFIER_TYPE'), + read('OPRF_KEY_HASH'), + read('FACE_MATCH_REQUIRED'), + read('PROOF_VALIDITY'), + read('MAX_VALIDITY'), + ]) + } catch (error) { + // Another kind of verifier has none of these reads. + if (isContractRevert(error)) return null + throw error + } + const [domain, scope, version, nullifierType, oprfKeyHash, faceMatchRequired, proofValidity, maxValidity] = settings + return { + address, + domain, + scope, + version, + nullifierType: Number(nullifierType), + oprfKeyHash, + faceMatchRequired, + proofValidity: BigInt(proofValidity), + maxValidity: BigInt(maxValidity), + } +} + +export async function fetchOwnerAccount(owner: Address, registry: Address | null): Promise { + const block = await publicClient.getBlock() + const read = (functionName: string, args: readonly unknown[]) => + (publicClient.readContract as any)({ address: registry, abi: ownerIdentityRegistryAbi, functionName, args }) + const [code, identity] = await Promise.all([ + publicClient.getCode({ address: owner }), + registry + ? Promise.all([read('identityOf', [owner]), read('isVerifiedAt', [owner, block.timestamp])]).then( + ([[identityId, expiresAt], verifiedNow]: [[Hex, number | bigint], boolean]) => ({ + identityId, + expiresAt: BigInt(expiresAt), + verifiedNow, + }), + ) + : Promise.resolve(null), + ]) + return { now: block.timestamp, isContract: isContractCode(code), identity } +} + +/** + * Whether account code makes the owner a contract wallet, such as a Safe. An EIP-7702 account's + * code is a delegation designator (`0xef0100` and an address): it is still an EOA that sends its own + * transactions. + */ +export function isContractCode(code: Hex | undefined): boolean { + if (!code || code === '0x') return false + return !(code.toLowerCase().startsWith('0xef0100') && code.length === 2 + 2 * 23) +} + +/** + * The last moment that a registration can be mined: ZKPassport rejects a proof older than the proof + * validity, and the registry rejects a credential that has already ended. + */ +export function registrationDeadline(proofDate: bigint, proofValidity: bigint, credentialEnds: bigint): bigint { + const proofExpires = proofDate + proofValidity + return proofExpires < credentialEnds ? proofExpires : credentialEnds +} + +/** The last second of the capacity window that contains `timestamp` (`BondOwnerCapacityLib._windowEnd`). */ +export function capacityWindowEnd(timestamp: bigint): bigint { + return (timestamp / CAPACITY_WINDOW + 1n) * CAPACITY_WINDOW - 1n +} + +/** The ZKPassport chain name that binds a proof to `chainId`, or null where ZKPassport has no verifier. */ +export function boundChainName(chainId: number): 'ethereum' | 'ethereum_sepolia' | null { + if (chainId === 1) return 'ethereum' + if (chainId === 11_155_111) return 'ethereum_sepolia' + return null +} + +/** The owner and chain that the proof binds, from its `bind_evm` committed inputs. */ +export function proofBinding(proofs: readonly ProofResult[]): { owner: string; chain: string } | null { + for (const proof of proofs) { + const data = (proof.committedInputs as { bind_evm?: { data?: { user_address?: unknown; chain?: unknown } } } | undefined)?.bind_evm + ?.data + if (typeof data?.user_address === 'string' && typeof data.chain === 'string') { + return { owner: data.user_address, chain: data.chain } + } + } + return null +} + +/** The outer EVM proof: the one proof that the verifier checks. */ +export function outerEvmProof(proofs: readonly ProofResult[]): ProofResult | null { + return proofs.find((proof) => proof.name?.startsWith('outer_evm')) ?? null +} + +/** + * The lower bound of the proof's expiry-date check. The evidence must carry exactly this value as + * `validUntil`, because the verifier asks ZKPassport's helper to confirm the committed bound. + */ +export function expiryLowerBound(proofs: readonly ProofResult[]): bigint | null { + for (const proof of proofs) { + const committed = proof.committedInputs?.compare_expiry_evm as { minDateTimestamp?: number } | undefined + if (committed?.minDateTimestamp !== undefined) return BigInt(committed.minDateTimestamp) + } + return null +} + +/** The values that the verifier reads from the proof's public inputs. */ +export function proofFacts(params: SolidityVerifierParameters): { + proofDate: bigint + nullifierType: number + scopedNullifier: Hex + oprfKeyHash: Hex +} { + const inputs = params.proofVerificationData.publicInputs + return { + proofDate: BigInt(inputs[2]), + nullifierType: Number(BigInt(inputs[inputs.length - 3])), + scopedNullifier: inputs[inputs.length - 2] as Hex, + oprfKeyHash: inputs[inputs.length - 1] as Hex, + } +} + +/** The credential end that the verifier sets: `validUntil`, or `maxValidity` after the proof date if earlier. */ +export function credentialEnd(validUntil: bigint, proofDate: bigint, maxValidity: bigint): bigint { + const capped = proofDate + maxValidity + return validUntil < capped ? validUntil : capped +} + +/** `abi.encode(ProofVerificationParams, validUntil)`, the evidence of ZKPassportIdentityVerifier. */ +export function encodeEvidence(params: SolidityVerifierParameters, validUntil: bigint): Hex { + return encodeAbiParameters( + [PROOF_VERIFICATION_PARAMS, { type: 'uint256' }], + [ + { + version: params.version as Hex, + proofVerificationData: { + vkeyHash: params.proofVerificationData.vkeyHash as Hex, + proof: params.proofVerificationData.proof as Hex, + publicInputs: params.proofVerificationData.publicInputs as Hex[], + }, + committedInputs: params.committedInputs as Hex, + serviceConfig: { + validityPeriodInSeconds: BigInt(params.serviceConfig.validityPeriodInSeconds), + domain: params.serviceConfig.domain, + scope: params.serviceConfig.scope, + devMode: params.serviceConfig.devMode, + }, + }, + validUntil, + ], + ) +} + +/** + * A Safe Transaction Builder batch that registers the proof from the Safe that it binds. With a + * registered operator of the Safe, the batch then refreshes its status, so the owner counts toward + * request capacity in the current window. The operator must stay registered: the batch is atomic. + */ +export function safeRegistrationBatch( + registry: Address, + safe: Address, + chainId: number, + evidence: Hex, + createdAt: number, + refresh?: { bondingRegistry: Address; operator: Address }, +) { + const transactions = [ + { + to: registry, + value: '0', + data: encodeFunctionData({ abi: ownerIdentityRegistryAbi, functionName: 'register', args: [evidence] }), + }, + ] + if (refresh) { + transactions.push({ + to: refresh.bondingRegistry, + value: '0', + data: encodeFunctionData({ abi: bondingRegistryAbi, functionName: 'refreshOperatorStatus', args: [refresh.operator] }), + }) + } + return { + version: '1.0', + chainId: String(chainId), + createdAt, + meta: { + name: 'Interfold bond-owner identity', + description: refresh + ? 'OwnerIdentityRegistry.register for this Safe, then a status refresh of its operator. Execute it before the proof expires.' + : 'OwnerIdentityRegistry.register for this Safe. Execute it before the proof expires.', + createdFromSafeAddress: safe, + }, + transactions, + } +} + +/** The credential line of the identity panel. */ +export function identityStatusText(account: OwnerAccount): string { + const identity = account.identity + if (!identity || identity.expiresAt === 0n) return 'Not verified' + return identity.verifiedNow ? `Verified until ${fmtDay(identity.expiresAt)}` : `Expired on ${fmtDay(identity.expiresAt)}` +} + +export function fmtDay(ts: bigint): string { + return new Date(Number(ts) * 1000).toLocaleDateString('en-US', { year: 'numeric', month: 'short', day: 'numeric', timeZone: 'UTC' }) +} + +/** A Unix timestamp as the value of a date field: YYYY-MM-DD in UTC. */ +export function dateInput(ts: bigint): string { + return new Date(Number(ts) * 1000).toISOString().slice(0, 10) +} + +/** A YYYY-MM-DD date field as the Unix timestamp of its UTC midnight, or null. */ +export function parseDateInput(value: string): bigint | null { + const match = /^(\d{4})-(\d{2})-(\d{2})$/.exec(value.trim()) + if (!match) return null + // setUTCFullYear keeps a year below 100, which Date.UTC would move to 19xx. + const day = new Date(0) + day.setUTCFullYear(Number(match[1]), Number(match[2]) - 1, Number(match[3])) + // Reject dates that roll over, such as 2026-02-31. + if (day.getUTCMonth() !== Number(match[2]) - 1 || day.getUTCDate() !== Number(match[3])) return null + return BigInt(day.getTime() / 1000) +} + +/** Everything that a registration or a test needs to replay one proof, as the page downloads it. */ +export type ProofBundle = { + kind: 'interfold.identity.zkpassport-proof' + chainId: number + owner: Address + domain: string + scope: string + faceMatch: boolean + /** Unix seconds. */ + validUntil: string + proofDate: string + nullifierType: number + oprfKeyHash: Hex + version: Hex + params: SolidityVerifierParameters + evidence: Hex + proofs: ProofResult[] + result: RequestSuccess['result'] +} + +export function buildProofBundle({ + success, + params, + owner, + chainId, + faceMatch, +}: { + success: RequestSuccess + params: SolidityVerifierParameters + owner: Address + chainId: number + faceMatch: boolean +}): ProofBundle { + const validUntil = expiryLowerBound(success.proofs) + if (validUntil === null) throw new Error('The proof has no expiry-date check.') + const facts = proofFacts(params) + return { + kind: 'interfold.identity.zkpassport-proof', + chainId, + owner, + domain: params.serviceConfig.domain, + scope: params.serviceConfig.scope, + faceMatch, + validUntil: validUntil.toString(), + proofDate: facts.proofDate.toString(), + nullifierType: facts.nullifierType, + oprfKeyHash: facts.oprfKeyHash, + version: params.version as Hex, + params, + evidence: encodeEvidence(params, validUntil), + proofs: success.proofs, + result: success.result, + } +} diff --git a/packages/interfold-dashboard/src/lib/networks.test.ts b/packages/interfold-dashboard/src/lib/networks.test.ts new file mode 100644 index 0000000000..249fd38a51 --- /dev/null +++ b/packages/interfold-dashboard/src/lib/networks.test.ts @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: LGPL-3.0-only +// +// This file is provided WITHOUT ANY WARRANTY; +// without even the implied warranty of MERCHANTABILITY +// or FITNESS FOR A PARTICULAR PURPOSE. + +import assert from 'node:assert/strict' +import test from 'node:test' +import { invalidBlockOverrides } from './networks' + +test('block overrides must be whole numbers on every network', () => { + assert.deepEqual( + invalidBlockOverrides({ + VITE_MAINNET_DEPLOY_BLOCK: '26300000.0', + VITE_SEPOLIA_DEPLOY_BLOCK: ' ', + }), + ['VITE_MAINNET_DEPLOY_BLOCK'], + ) + assert.deepEqual(invalidBlockOverrides({}), []) +}) diff --git a/packages/interfold-dashboard/src/lib/networks.ts b/packages/interfold-dashboard/src/lib/networks.ts index 9a895dc412..60fb58f486 100644 --- a/packages/interfold-dashboard/src/lib/networks.ts +++ b/packages/interfold-dashboard/src/lib/networks.ts @@ -155,3 +155,13 @@ export function selectNetwork(env: Env, hostname: string | undefined): NetworkKe export function unscopedOverrideKeys(env: Env): string[] { return SETTINGS.map((setting) => `VITE_${setting}`).filter((key) => key in env) } + +// Block overrides that are not whole numbers, for example "26300000.0". The page reads +// them with BigInt when it loads, so one bad value would stop the whole page. +export function invalidBlockOverrides(env: Env): string[] { + const settings: Setting[] = ['DEPLOY_BLOCK'] + return NETWORK_KEYS.flatMap((network) => settings.map((setting) => overrideKey(network, setting))).filter((key) => { + const value = env[key]?.trim() + return value !== undefined && value !== '' && !/^\d+$/.test(value) + }) +} diff --git a/packages/interfold-dashboard/src/styles.css b/packages/interfold-dashboard/src/styles.css index ca7a14ff03..edb8d56f2b 100644 --- a/packages/interfold-dashboard/src/styles.css +++ b/packages/interfold-dashboard/src/styles.css @@ -2037,6 +2037,30 @@ button { margin: 0; } +/* Bond-owner identity: the ZKPassport request and its QR code */ +.opidentity__request { + display: flex; + flex-wrap: wrap; + align-items: center; + gap: 18px; +} +.opidentity__qr { + width: 240px; + height: 240px; + border: 1px solid var(--rule); + border-radius: 8px; + background: #fff; + image-rendering: pixelated; +} +.opcheck { + display: flex; + align-items: center; + gap: 8px; + font-size: 13.5px; + color: var(--ink-2); + cursor: pointer; +} + /* E3 rewards: the claimable total first, then the committee history */ .oprewards__title { font-family: var(--serif); diff --git a/packages/interfold-dashboard/vite.config.ts b/packages/interfold-dashboard/vite.config.ts index 39a54f6a55..7c4135e927 100644 --- a/packages/interfold-dashboard/vite.config.ts +++ b/packages/interfold-dashboard/vite.config.ts @@ -5,7 +5,7 @@ // or FITNESS FOR A PARTICULAR PURPOSE. import { defineConfig, loadEnv } from 'vite' import react from '@vitejs/plugin-react' -import { parseNetworkHosts, selectNetwork, unscopedOverrideKeys } from './src/lib/networks' +import { invalidBlockOverrides, parseNetworkHosts, selectNetwork, unscopedOverrideKeys } from './src/lib/networks' export default defineConfig(({ mode }) => { // Fail the build, not the page: the bundle reads these values only in the browser. @@ -17,6 +17,10 @@ export default defineConfig(({ mode }) => { 'Network overrides use VITE__, for example VITE_MAINNET_RPC_URL. See .env.example.', ) } + const badBlocks = invalidBlockOverrides(env) + if (badBlocks.length > 0) { + throw new Error(`${badBlocks.join(', ')} must be a whole block number. See .env.example.`) + } parseNetworkHosts(env.VITE_NETWORK_HOSTS) selectNetwork(env, undefined) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 44f784310a..c96286f6c0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -309,6 +309,12 @@ importers: '@interfold/contracts': specifier: workspace:* version: link:../interfold-contracts + '@zkpassport/sdk': + specifier: 0.19.2 + version: 0.19.2(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3) + qrcode: + specifier: 1.5.4 + version: 1.5.4 react: specifier: ^18.3.1 version: 18.3.1 @@ -319,6 +325,9 @@ importers: specifier: 2.38.6 version: 2.38.6(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3) devDependencies: + '@types/qrcode': + specifier: 1.5.5 + version: 1.5.5 '@types/react': specifier: ^18.3.3 version: 18.3.31 @@ -410,10 +419,10 @@ importers: version: 18.3.1 viem: specifier: 2.38.6 - version: 2.38.6(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3) + version: 2.38.6(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) wagmi: specifier: ^2.14.16 - version: 2.19.5(@tanstack/query-core@5.101.4)(@tanstack/react-query@5.101.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.38.6(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3))(zod@4.4.3) + version: 2.19.5(@tanstack/query-core@5.101.4)(@tanstack/react-query@5.101.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.38.6(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76) devDependencies: '@interfold/config': specifier: workspace:* @@ -719,6 +728,14 @@ packages: resolution: {integrity: sha512-w+rlVHbSbb1neDeJGMDSbNZCxuD6TeSrN/1lbnVgqhKcVfqdDXdTt2b6RUToCsk7Q2Dmx4oqU5tfBcFY//LQtg==} hasBin: true + '@aztec/bb.js@4.2.0-aztecnr-rc.2': + resolution: {integrity: sha512-ksFWHrm8QYAXP059paItEKCM/UhpHg5Dwl/eSp2BI6EAtD9+JlonkOwJ+94TYai2y5Gz0qnrgd65dsvDwJelVQ==} + hasBin: true + + '@aztec/bb.js@5.0.0': + resolution: {integrity: sha512-O4HDjzrjXMvM44+VbgDG1GaDUztWGEVujbBmwZAEVJh6BHpmJfMxBB2/69h1oi4kX2adgaowlJNFhpzcz1MHSA==} + hasBin: true + '@babel/code-frame@7.27.1': resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} engines: {node: '>=6.9.0'} @@ -1701,6 +1718,11 @@ packages: '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + '@lapo/asn1js@2.1.3': + resolution: {integrity: sha512-eX1xNRPeP5dCtUpQg/lqHZjBd0//wJ05yn/4osewSc4rxC1KCXBfbUeCiQEdNREbGMa3xjZxjkYNY1AHzUkleQ==} + engines: {node: '>=14.6.0'} + hasBin: true + '@lit-labs/ssr-dom-shim@1.6.0': resolution: {integrity: sha512-VHb0ALPMTlgKjM6yIxxoQNnpKyUKLD04VzeQdsiXkMqkvYlAHxq9glGLmgbb889/1GsohSOAjvQYoiBppXFqrQ==} @@ -2059,6 +2081,10 @@ packages: resolution: {integrity: sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==} engines: {node: ^14.21.3 || >=16} + '@noble/curves@2.4.0': + resolution: {integrity: sha512-P4/62zrgfH33CneE3Dn4WhJVA22YUU0eR51wKIan4NVRvwsA0YnPTwWGpNbpuacSujmSFLvyzpyuR30+fbq2Ew==} + engines: {node: '>= 20.19.0'} + '@noble/hashes@1.2.0': resolution: {integrity: sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==} @@ -2086,9 +2112,16 @@ packages: resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} engines: {node: ^14.21.3 || >=16} + '@noble/hashes@2.4.0': + resolution: {integrity: sha512-X5XaVWZIBCT7HHZGm5I7ZQXDwLG+bGXuSrMQAW+7Zvl87h1kmc1ZB1VSRJcpUfoUrGQp4Fkoxm5kZ+Ms+aW+eA==} + engines: {node: '>= 20.19.0'} + '@noble/secp256k1@1.7.1': resolution: {integrity: sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==} + '@noble/secp256k1@2.3.0': + resolution: {integrity: sha512-0TQed2gcBbIrh7Ccyw+y/uZQvbJwm7Ao4scBUxqpBCcsOlZG0O4KGfjtNAy/li4W8n1xt3dxrwJ0beZ2h2G6Kw==} + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -2101,15 +2134,27 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} + '@noir-lang/acvm_js@1.0.0-beta.22': + resolution: {integrity: sha512-2xXfSKrnskUNmPiG/Kj6yvWi1E6wJBl/1ZsmzVaHEEyJsUBf15xaSRBZR7X1361whUR2vqyG80ck2huLZPb5bA==} + '@noir-lang/acvm_js@1.0.0-rc.3': resolution: {integrity: sha512-bTTrcPphNHVrFkbJPVcFrrigwwU/N9+trgEa9PF2X/VWWAX0B1gOGSBwqziOKMwThpU7H2Jb3Z6OFMEhpMKaEQ==} + '@noir-lang/noir_js@1.0.0-beta.22': + resolution: {integrity: sha512-Ts+QI2fN2PsrVjx38CszFSR0TyWpip9TgJ6HM17DIK05Jku4TSKtHMIjrE6lRii4Y+JV0rn70v+TrunJmt/X4w==} + '@noir-lang/noir_js@1.0.0-rc.3': resolution: {integrity: sha512-NrJZPd7zpBWXzP240rP78fr6RE8vg3mFIMIsT5Xiqbh6zdBKfLI8Nb7Ea4UFwFWyRFDqZO3qGd3HbGyRWxxZ8Q==} + '@noir-lang/noirc_abi@1.0.0-beta.22': + resolution: {integrity: sha512-vpZtWb946eb4ZxERxY32I4Fv62SAAjhAyJpb2YzWYvnDVTyFVIvr/MSVunrM1osUP35nnRPRGuXVTWy4sBQkIg==} + '@noir-lang/noirc_abi@1.0.0-rc.3': resolution: {integrity: sha512-jax7q2CAAG4jxCzr8MllH/LZxnxnS5PF1YyzmFJ7DTf97k3+LaHSnBPXE8TwQYDsWwyNxQTqDWw1QVEoO1ESaQ==} + '@noir-lang/types@1.0.0-beta.22': + resolution: {integrity: sha512-PXD8cmvMT4wybDe1pUPwv2Uz1FYh9B/hdXrY5eOMf1elNVxomj2tHDDYoKI/zNDrJ1JzTL0xhbAX1vBTMMFvBw==} + '@noir-lang/types@1.0.0-rc.3': resolution: {integrity: sha512-k1UHd67/OSPJb9E6WNKeMtuoDbflLpu803jtbaVqDlr2P/rH8+joDuIxK+nwBMVlnCO2LlcJaN4wpQ/TRHJ78w==} @@ -2305,6 +2350,11 @@ packages: resolution: {integrity: sha512-q4n32/FNKIhQ3zQGGw5CvPF6GTvDCpYwIf7bEY/dZTZbgfDsHyjJwURxUJf3VQuuJj+fDIFl4+KkBVbw4Ef6jA==} engines: {node: '>= 12'} + '@obsidion/bridge@0.12.2': + resolution: {integrity: sha512-3swoUCqf+Z06qFYW9fOG5EoETA1lnqbXpmn+LjKT1FqOdgy51Q6gWxyNn99ZMKQcMkk/vbWV11DLpDQAH7YYsg==} + peerDependencies: + typescript: 5.8.3 + '@offchainlabs/upgrade-executor@1.1.0-beta.0': resolution: {integrity: sha512-mpn6PHjH/KDDjNX0pXHEKdyv8m6DVGQiI2nGzQn0JbM1nOSHJpWx6fvfjtH7YxHJ6zBZTcsKkqGkFKDtCfoSLw==} @@ -2341,12 +2391,56 @@ packages: resolution: {integrity: sha512-IHnV6A+zxU7XwmKFinmYjUcwlyK9+xkG3/s9KcQhI9BjQKycrJ1JRO+FbNYPwZiPKW3je/DR0k7w8/gLa5eaxQ==} deprecated: 'Switch to "qr" (new package name) for security updates: npm install qr' + '@peculiar/asn1-cms@2.11.1': + resolution: {integrity: sha512-Bk+oatE62dW0Tzzpfk6vdQxfGGEfvuGdWgmijnKjcv7HqZCJISs85z4zw2uDArrk+R1Oel1wts/BBl7HHrtAcA==} + engines: {node: '>=14'} + + '@peculiar/asn1-csr@2.11.1': + resolution: {integrity: sha512-KVfbXaKng8886/tOPG55t5K1XkTkGbR4amjIJzytXWobFU5nZgw/sKnSpa1hxP17nUSsrOF/7Mt9WUYeyLsi6Q==} + engines: {node: '>=14'} + + '@peculiar/asn1-ecc@2.11.1': + resolution: {integrity: sha512-7MSNji77fQa/oN3WAfwagMy8EoJFg50sW4hZ1dtr0zU1BSugit0I2DGpIdPhvkNplopQhz5bogxpn1077eaamA==} + engines: {node: '>=14'} + + '@peculiar/asn1-pfx@2.11.1': + resolution: {integrity: sha512-2SN2z8qkc2hk/GgTYA8RN54wtsCDZShg9gI2Mq1vLhdj1adcv5fhTbiEmExZUaAMqlizxiEpULQDfHM5iYtn1g==} + engines: {node: '>=14'} + + '@peculiar/asn1-pkcs8@2.11.1': + resolution: {integrity: sha512-HqsSrnpQghRp9SM9QSmR6fa4z/BNktnKq7928+oq4qF0VAnuHZ4cyePKvcxh9fP4taBCP/WHNItlVNsYaQm2qw==} + engines: {node: '>=14'} + + '@peculiar/asn1-pkcs9@2.11.1': + resolution: {integrity: sha512-OHFkTg8D2zYafILqFE4KPbqX8srpvd3diGDc2h2cduumawc765mOHGcuFMGvLWlL2bbCMWMmMSCtlXptsOuiPA==} + engines: {node: '>=14'} + + '@peculiar/asn1-rsa@2.11.1': + resolution: {integrity: sha512-6KwKGjulF489CpidZqkogNgLj6oGzgC4BL2FClM8PuJQ4t5NqT4q4a6A4vrSxBIBhMnL8hGYkLOpbVw0Vq38Tw==} + engines: {node: '>=14'} + + '@peculiar/asn1-schema@2.11.1': + resolution: {integrity: sha512-jaU9OaCcbZUdyXx9hMETZB9xoNmxTGjOGFqd3cOwKFkpKnyKd9WxF3uqj4PvX4cyOMP9bSdHg5YyML2qtx/d/g==} + engines: {node: '>=14'} + '@peculiar/asn1-schema@2.8.0': resolution: {integrity: sha512-7YT0U/ze0tF2QOBbE15gKZwy5tvgGyLRiRHLzhlbOpf7BT032oBSd0haZqXn5W6l26WLlu3dyxzjM+2638/z2Q==} + '@peculiar/asn1-x509-attr@2.11.1': + resolution: {integrity: sha512-n7RKFrbTzt8pGBlZ90kmKEn1qsLTTyw7lrvHMK0xsA42kQugPk/GXYpNbEcl7DkkdVsU/one5UX7KQPfxLj8vQ==} + engines: {node: '>=14'} + + '@peculiar/asn1-x509@2.11.1': + resolution: {integrity: sha512-SXU4/X6B3FquqQAN6ARI0bFDUV7+L1WlvPEPMKzEMkstd2D7UyM0r93fv241+OjdhqAKYGx5MvV3gzZMAp0APA==} + engines: {node: '>=14'} + '@peculiar/utils@2.0.3': resolution: {integrity: sha512-+oL3HPFRIZ1St2K50lWCXiioIgSoxzz7R1J3uF6neO2yl1sgmpgY6XXJH4BdpoDkMWznQTeYF6oWNDZLCdQ4eQ==} + '@peculiar/x509@1.14.3': + resolution: {integrity: sha512-C2Xj8FZ0uHWeCXXqX5B4/gVFQmtSkiuOolzAgutjTfseNOHT3pUjljDZsTSxXFGgio54bCzVFqmEOUrIVk8RDA==} + engines: {node: '>=20.0.0'} + '@phosphor-icons/react@2.1.10': resolution: {integrity: sha512-vt8Tvq8GLjheAZZYa+YG/pW7HDbov8El/MANW8pOAz4eGxrwhnbfrQZq0Cp4q8zBEu8NIhHdnr+r8thnfRSNYA==} engines: {node: '>=10'} @@ -3165,6 +3259,18 @@ packages: resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} engines: {node: '>=14.16'} + '@taceo/oprf-client@0.9.0': + resolution: {integrity: sha512-kokCCLYjLSH3I7n4D2Yhg1ybNquMRnbHh3r/YTgHIiXxJ+FLsbE9AGT8vhwTmwe2m4X1U3r57yKMsIiaeu/DAg==} + engines: {node: '>=22'} + + '@taceo/oprf-core@0.4.0': + resolution: {integrity: sha512-Mlo2pjb8O9HDGvjpcun06ZWrW7oBblQESr9EDhW1WvHLDkKDgdlKdx43EVzJMGHcFXaVT4/1MnC1De/5KTQTNg==} + engines: {node: '>=22'} + + '@taceo/poseidon2@0.2.0': + resolution: {integrity: sha512-+EyFO7zaRrlsdzNEvzTLELDkrgjUgZgSlxGUSQghmmtlZ14nZklYX7D+gecyOkVe/47AGDtA+uZ9sdXiNB8rng==} + engines: {node: '>=22'} + '@tailwindcss/typography@0.5.20': resolution: {integrity: sha512-hwbzQuNUfcPvbegQFatVPl/MY/tcM9KLl963hQ5laJKPh81TEZ1+dNG9PirGvcaDBkp+BCshExAyKVPW91dozw==} peerDependencies: @@ -3346,12 +3452,18 @@ packages: '@types/node@22.7.5': resolution: {integrity: sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==} + '@types/pako@2.0.4': + resolution: {integrity: sha512-VWDCbrLeVXJM9fihYodcLiIv0ku+AlOa/TQ1SvYOaBuyrSKgEcro95LJyIsJ4vSo6BXIxOKxiJAat04CmST9Fw==} + '@types/prettier@2.7.3': resolution: {integrity: sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==} '@types/prop-types@15.7.15': resolution: {integrity: sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==} + '@types/qrcode@1.5.5': + resolution: {integrity: sha512-CdfBi/e3Qk+3Z/fXYShipBT13OJ2fDO2Q2w5CIP5anLTLIndQG9z6P1cnm+8zCWSpm5dnxMFd/uREtb0EXuQzg==} + '@types/qs@6.15.1': resolution: {integrity: sha512-GZHUBZR9hckSUhrxmp1nG6NwdpM9fCunJwyThLW1X3AyHgd9IlHb6VANpQQqDr2o/qQp6McZ3y/IA2rVzKzSbw==} @@ -3687,9 +3799,27 @@ packages: '@zk-kit/lean-imt@2.2.5': resolution: {integrity: sha512-7pJIWiWp30wKz7OlbzV/+ATvHD+Emwy1aejU+9R4V+a1BkdY/yhGA/hFoVULxYyZ/RohiCfcJC/48cU2xI6Rtw==} + '@zk-kit/utils@1.3.0': + resolution: {integrity: sha512-Gqsq5KLDf2WPuZSsNc2KZy25XeK5d5UV9hwLaPEM5wq+GD2qCi1ZBFzNs0OptiJ9GRGtP2J/xptrszWri+pRqQ==} + '@zk-kit/utils@1.4.1': resolution: {integrity: sha512-IoXzy3ElfkvRfC/s6uk3eFQO8uxkCdAOVxKlJlaEjM7pgckX5AK46Q+7n5yMQD/v/o6OL0mMtet065o5EpUocA==} + '@zkpassport/poseidon2@0.6.2': + resolution: {integrity: sha512-6sFHX9kAcrmDmBEEndvjZ8DA9FomunirQ5oCV6oD7bqr/lP0n0OBSRn86SZgQBXwRR+vq7sk16y31OgRBIOJ5Q==} + + '@zkpassport/registry@0.15.3': + resolution: {integrity: sha512-Er6bxcB79qtGg9xhAVUkwlbpZYOHsO2hKlbguu+ycnx83NOUsrUyeOYBtajYaDAbHRopFODFYABQFS2zRGKbgg==} + + '@zkpassport/sdk@0.19.2': + resolution: {integrity: sha512-OyA9CtXJQTXI2EuDsXegyCQ7lzkuVR4qGaewuIXlgngOsua827X99muh6zSZ7Pv2HzBL0SDAc57D7MONTCbgiQ==} + + '@zkpassport/utils@0.39.0': + resolution: {integrity: sha512-oNflZQ9M2bHdQpwYWBN9v6joulMwwy1jdVPVyHFE9FXlRWfJSj7A/tOht/LRzbWq5qTafCuSSyWM1NNbOXOxIg==} + + '@zkpassport/utils@0.40.0-beta.2': + resolution: {integrity: sha512-9mAIATw0YsOlw7IWlbaHyP2jxnKXV8u94h+yhhkIYq636xcx3tsf2VetWKVjyPLrCGPM9BE7ifhaz5IOEvSeLQ==} + abbrev@1.0.9: resolution: {integrity: sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q==} @@ -4617,6 +4747,9 @@ packages: resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} engines: {node: '>=0.11'} + date-fns@4.4.0: + resolution: {integrity: sha512-+1UMbeh68lH1SegH83CGWwpb6OHHbpSgr3+s5Eww5M4CAgswBpoWS0AjTOfEJ33HiYKz1hdj/KTFprzXHmq/6w==} + dayjs@1.11.13: resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} @@ -4729,6 +4862,9 @@ packages: devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + diacritics@1.3.0: + resolution: {integrity: sha512-wlwEkqcsaxvPJML+rDh/2iS824jbREk6DUMUKkEaSlxdYHeS43cClJtsWglvw2RfeXGm6ohKDqsXteJ5sP5enA==} + didyoumean@1.2.2: resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} @@ -5621,6 +5757,10 @@ packages: engines: {node: '>=18'} hasBin: true + i18n-iso-countries@7.14.0: + resolution: {integrity: sha512-nXHJZYtNrfsi1UQbyRqm3Gou431elgLjKl//CYlnBGt5aTWdRPH1PiS2T/p/n8Q8LnqYqzQJik3Q7mkwvLokeg==} + engines: {node: '>= 12'} + iconv-lite@0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} @@ -7475,6 +7615,9 @@ packages: resolution: {integrity: sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==} engines: {node: '>=6'} + reflect-metadata@0.2.2: + resolution: {integrity: sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==} + registry-auth-token@5.1.1: resolution: {integrity: sha512-P7B4+jq8DeD2nMsAcdfaqHbssgHtZ7Z5+++a5ask90fvmJ8p5je4mOa+wzu+DB4vQ5tdJV/xywY+UnVFeQLV5Q==} engines: {node: '>=14'} @@ -8238,6 +8381,10 @@ packages: engines: {node: '>=18.0.0'} hasBin: true + tsyringe@4.10.0: + resolution: {integrity: sha512-axr3IdNuVIxnaK5XGEUFTu3YmAQ6lllgrvqfEoR16g/HGnYY/6We4oWENtAnzK6/LpJ2ur9PAb80RBt7/U4ugw==} + engines: {node: '>= 6.0.0'} + type-check@0.3.2: resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} engines: {node: '>= 0.8.0'} @@ -9066,6 +9213,24 @@ snapshots: proper-lockfile: 4.1.2 tslib: 2.8.1 + '@aztec/bb.js@4.2.0-aztecnr-rc.2': + dependencies: + comlink: 4.4.2 + commander: 12.1.0 + idb-keyval: 6.3.0 + msgpackr: 1.12.1 + pako: 2.2.0 + tslib: 2.8.1 + + '@aztec/bb.js@5.0.0': + dependencies: + comlink: 4.4.2 + commander: 12.1.0 + idb-keyval: 6.3.0 + msgpackr: 1.12.1 + pako: 2.2.0 + tslib: 2.8.1 + '@babel/code-frame@7.27.1': dependencies: '@babel/helper-validator-identifier': 7.28.5 @@ -9265,6 +9430,33 @@ snapshots: '@babel/helper-string-parser': 7.29.7 '@babel/helper-validator-identifier': 7.29.7 + '@base-org/account@2.4.0(@types/react@18.3.31)(bufferutil@4.1.0)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@coinbase/cdp-sdk': 1.54.0(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10) + '@noble/hashes': 1.4.0 + clsx: 1.2.1 + eventemitter3: 5.0.1 + idb-keyval: 6.2.1 + ox: 0.6.9(typescript@5.8.3)(zod@3.25.76) + preact: 10.24.2 + viem: 2.38.6(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + zustand: 5.0.3(@types/react@18.3.31)(immer@10.0.2)(react@18.3.1)(use-sync-external-store@1.4.0(react@18.3.1)) + transitivePeerDependencies: + - '@types/react' + - '@x402/core' + - '@x402/evm' + - '@x402/extensions' + - '@x402/svm' + - bufferutil + - debug + - fastestsmallesttextencoderdecoder + - immer + - react + - typescript + - use-sync-external-store + - utf-8-validate + - zod + '@base-org/account@2.4.0(@types/react@18.3.31)(bufferutil@4.1.0)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(utf-8-validate@5.0.10)(zod@4.4.3)': dependencies: '@coinbase/cdp-sdk': 1.54.0(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10) @@ -9504,6 +9696,26 @@ snapshots: - preact-render-to-string - supports-color + '@coinbase/wallet-sdk@4.3.6(@types/react@18.3.31)(bufferutil@4.1.0)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(utf-8-validate@5.0.10)(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@5.8.3)(zod@3.25.76) + preact: 10.24.2 + viem: 2.38.6(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + zustand: 5.0.3(@types/react@18.3.31)(immer@10.0.2)(react@18.3.1)(use-sync-external-store@1.4.0(react@18.3.1)) + transitivePeerDependencies: + - '@types/react' + - bufferutil + - immer + - react + - typescript + - use-sync-external-store + - utf-8-validate + - zod + '@coinbase/wallet-sdk@4.3.6(@types/react@18.3.31)(bufferutil@4.1.0)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(utf-8-validate@5.0.10)(zod@4.4.3)': dependencies: '@noble/hashes': 1.4.0 @@ -10004,6 +10216,14 @@ snapshots: '@fastify/busboy@2.1.1': {} + '@gemini-wallet/core@0.3.2(viem@2.38.6(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76))': + dependencies: + '@metamask/rpc-errors': 7.0.2 + eventemitter3: 5.0.1 + viem: 2.38.6(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + transitivePeerDependencies: + - supports-color + '@gemini-wallet/core@0.3.2(viem@2.38.6(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3))': dependencies: '@metamask/rpc-errors': 7.0.2 @@ -10228,6 +10448,8 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 + '@lapo/asn1js@2.1.3': {} + '@lit-labs/ssr-dom-shim@1.6.0': {} '@lit/reactive-element@2.1.2': @@ -10696,6 +10918,10 @@ snapshots: dependencies: '@noble/hashes': 1.8.0 + '@noble/curves@2.4.0': + dependencies: + '@noble/hashes': 2.4.0 + '@noble/hashes@1.2.0': {} '@noble/hashes@1.3.2': {} @@ -10710,8 +10936,12 @@ snapshots: '@noble/hashes@1.8.0': {} + '@noble/hashes@2.4.0': {} + '@noble/secp256k1@1.7.1': {} + '@noble/secp256k1@2.3.0': {} + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -10724,8 +10954,17 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.20.1 + '@noir-lang/acvm_js@1.0.0-beta.22': {} + '@noir-lang/acvm_js@1.0.0-rc.3': {} + '@noir-lang/noir_js@1.0.0-beta.22': + dependencies: + '@noir-lang/acvm_js': 1.0.0-beta.22 + '@noir-lang/noirc_abi': 1.0.0-beta.22 + '@noir-lang/types': 1.0.0-beta.22 + pako: 2.2.0 + '@noir-lang/noir_js@1.0.0-rc.3': dependencies: '@noir-lang/acvm_js': 1.0.0-rc.3 @@ -10733,10 +10972,16 @@ snapshots: '@noir-lang/types': 1.0.0-rc.3 pako: 3.0.1 + '@noir-lang/noirc_abi@1.0.0-beta.22': + dependencies: + '@noir-lang/types': 1.0.0-beta.22 + '@noir-lang/noirc_abi@1.0.0-rc.3': dependencies: '@noir-lang/types': 1.0.0-rc.3 + '@noir-lang/types@1.0.0-beta.22': {} + '@noir-lang/types@1.0.0-rc.3': {} '@nomicfoundation/edr-darwin-arm64@0.12.0-next.10': {} @@ -11064,6 +11309,21 @@ snapshots: '@nomicfoundation/solidity-analyzer-linux-x64-musl': 0.1.2 '@nomicfoundation/solidity-analyzer-win32-x64-msvc': 0.1.2 + '@obsidion/bridge@0.12.2(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)': + dependencies: + '@noble/ciphers': 1.3.0 + '@noble/hashes': 1.8.0 + '@noble/secp256k1': 2.3.0 + '@types/pako': 2.0.4 + debug: 4.4.3(supports-color@5.5.0) + pako: 2.2.0 + typescript: 5.8.3 + ws: 8.21.1(bufferutil@4.1.0)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + '@offchainlabs/upgrade-executor@1.1.0-beta.0': dependencies: '@openzeppelin/contracts': 4.7.3 @@ -11091,17 +11351,105 @@ snapshots: '@paulmillr/qr@0.2.1': {} + '@peculiar/asn1-cms@2.11.1': + dependencies: + '@peculiar/asn1-schema': 2.11.1 + '@peculiar/asn1-x509': 2.11.1 + '@peculiar/asn1-x509-attr': 2.11.1 + asn1js: 3.0.10 + tslib: 2.8.1 + + '@peculiar/asn1-csr@2.11.1': + dependencies: + '@peculiar/asn1-schema': 2.11.1 + '@peculiar/asn1-x509': 2.11.1 + asn1js: 3.0.10 + tslib: 2.8.1 + + '@peculiar/asn1-ecc@2.11.1': + dependencies: + '@peculiar/asn1-schema': 2.11.1 + '@peculiar/asn1-x509': 2.11.1 + asn1js: 3.0.10 + tslib: 2.8.1 + + '@peculiar/asn1-pfx@2.11.1': + dependencies: + '@peculiar/asn1-cms': 2.11.1 + '@peculiar/asn1-pkcs8': 2.11.1 + '@peculiar/asn1-rsa': 2.11.1 + '@peculiar/asn1-schema': 2.11.1 + asn1js: 3.0.10 + tslib: 2.8.1 + + '@peculiar/asn1-pkcs8@2.11.1': + dependencies: + '@peculiar/asn1-schema': 2.11.1 + '@peculiar/asn1-x509': 2.11.1 + asn1js: 3.0.10 + tslib: 2.8.1 + + '@peculiar/asn1-pkcs9@2.11.1': + dependencies: + '@peculiar/asn1-cms': 2.11.1 + '@peculiar/asn1-pfx': 2.11.1 + '@peculiar/asn1-pkcs8': 2.11.1 + '@peculiar/asn1-schema': 2.11.1 + '@peculiar/asn1-x509': 2.11.1 + '@peculiar/asn1-x509-attr': 2.11.1 + asn1js: 3.0.10 + tslib: 2.8.1 + + '@peculiar/asn1-rsa@2.11.1': + dependencies: + '@peculiar/asn1-schema': 2.11.1 + '@peculiar/asn1-x509': 2.11.1 + asn1js: 3.0.10 + tslib: 2.8.1 + + '@peculiar/asn1-schema@2.11.1': + dependencies: + '@peculiar/utils': 2.0.3 + asn1js: 3.0.10 + tslib: 2.8.1 + '@peculiar/asn1-schema@2.8.0': dependencies: '@peculiar/utils': 2.0.3 asn1js: 3.0.10 tslib: 2.8.1 - optional: true + + '@peculiar/asn1-x509-attr@2.11.1': + dependencies: + '@peculiar/asn1-schema': 2.11.1 + '@peculiar/asn1-x509': 2.11.1 + asn1js: 3.0.10 + tslib: 2.8.1 + + '@peculiar/asn1-x509@2.11.1': + dependencies: + '@peculiar/asn1-schema': 2.11.1 + '@peculiar/utils': 2.0.3 + asn1js: 3.0.10 + tslib: 2.8.1 '@peculiar/utils@2.0.3': dependencies: tslib: 2.8.1 - optional: true + + '@peculiar/x509@1.14.3': + dependencies: + '@peculiar/asn1-cms': 2.11.1 + '@peculiar/asn1-csr': 2.11.1 + '@peculiar/asn1-ecc': 2.11.1 + '@peculiar/asn1-pkcs9': 2.11.1 + '@peculiar/asn1-rsa': 2.11.1 + '@peculiar/asn1-schema': 2.8.0 + '@peculiar/asn1-x509': 2.11.1 + pvtsutils: 1.3.6 + reflect-metadata: 0.2.2 + tslib: 2.8.1 + tsyringe: 4.10.0 '@phosphor-icons/react@2.1.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: @@ -11162,6 +11510,17 @@ snapshots: - utf-8-validate - zod + '@reown/appkit-common@1.7.8(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + big.js: 6.2.2 + dayjs: 1.11.13 + viem: 2.38.6(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + - zod + '@reown/appkit-common@1.7.8(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3)': dependencies: big.js: 6.2.2 @@ -11173,13 +11532,13 @@ snapshots: - utf-8-validate - zod - '@reown/appkit-controllers@1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3)': + '@reown/appkit-controllers@1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: - '@reown/appkit-common': 1.7.8(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3) + '@reown/appkit-common': 1.7.8(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) '@reown/appkit-wallet': 1.7.8(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10) - '@walletconnect/universal-provider': 2.21.0(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3) + '@walletconnect/universal-provider': 2.21.0(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) valtio: 1.13.2(@types/react@18.3.31)(react@18.3.1) - viem: 2.38.6(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3) + viem: 2.38.6(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -11208,14 +11567,13 @@ snapshots: - utf-8-validate - zod - '@reown/appkit-pay@1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3)': + '@reown/appkit-controllers@1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3)': dependencies: '@reown/appkit-common': 1.7.8(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3) - '@reown/appkit-controllers': 1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3) - '@reown/appkit-ui': 1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3) - '@reown/appkit-utils': 1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.3.31)(react@18.3.1))(zod@4.4.3) - lit: 3.3.0 + '@reown/appkit-wallet': 1.7.8(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10) + '@walletconnect/universal-provider': 2.21.0(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3) valtio: 1.13.2(@types/react@18.3.31)(react@18.3.1) + viem: 2.38.6(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -11244,18 +11602,14 @@ snapshots: - utf-8-validate - zod - '@reown/appkit-polyfills@1.7.8': - dependencies: - buffer: 6.0.3 - - '@reown/appkit-scaffold-ui@1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.3.31)(react@18.3.1))(zod@4.4.3)': + '@reown/appkit-pay@1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: - '@reown/appkit-common': 1.7.8(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3) - '@reown/appkit-controllers': 1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3) - '@reown/appkit-ui': 1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3) - '@reown/appkit-utils': 1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.3.31)(react@18.3.1))(zod@4.4.3) - '@reown/appkit-wallet': 1.7.8(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10) + '@reown/appkit-common': 1.7.8(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-controllers': 1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-ui': 1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-utils': 1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.3.31)(react@18.3.1))(zod@3.25.76) lit: 3.3.0 + valtio: 1.13.2(@types/react@18.3.31)(react@18.3.1) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -11282,16 +11636,16 @@ snapshots: - typescript - uploadthing - utf-8-validate - - valtio - zod - '@reown/appkit-ui@1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3)': + '@reown/appkit-pay@1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3)': dependencies: '@reown/appkit-common': 1.7.8(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3) '@reown/appkit-controllers': 1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3) - '@reown/appkit-wallet': 1.7.8(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10) + '@reown/appkit-ui': 1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3) + '@reown/appkit-utils': 1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.3.31)(react@18.3.1))(zod@4.4.3) lit: 3.3.0 - qrcode: 1.5.3 + valtio: 1.13.2(@types/react@18.3.31)(react@18.3.1) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -11320,16 +11674,202 @@ snapshots: - utf-8-validate - zod - '@reown/appkit-utils@1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.3.31)(react@18.3.1))(zod@4.4.3)': + '@reown/appkit-polyfills@1.7.8': dependencies: - '@reown/appkit-common': 1.7.8(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3) - '@reown/appkit-controllers': 1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3) - '@reown/appkit-polyfills': 1.7.8 + buffer: 6.0.3 + + '@reown/appkit-scaffold-ui@1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.3.31)(react@18.3.1))(zod@3.25.76)': + dependencies: + '@reown/appkit-common': 1.7.8(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-controllers': 1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-ui': 1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-utils': 1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.3.31)(react@18.3.1))(zod@3.25.76) '@reown/appkit-wallet': 1.7.8(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10) - '@walletconnect/logger': 2.1.2 - '@walletconnect/universal-provider': 2.21.0(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3) - valtio: 1.13.2(@types/react@18.3.31)(react@18.3.1) - viem: 2.38.6(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.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-scaffold-ui@1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.3.31)(react@18.3.1))(zod@4.4.3)': + dependencies: + '@reown/appkit-common': 1.7.8(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3) + '@reown/appkit-controllers': 1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3) + '@reown/appkit-ui': 1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3) + '@reown/appkit-utils': 1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.3.31)(react@18.3.1))(zod@4.4.3) + '@reown/appkit-wallet': 1.7.8(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10) + 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.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@reown/appkit-common': 1.7.8(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-controllers': 1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-wallet': 1.7.8(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10) + 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-ui@1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3)': + dependencies: + '@reown/appkit-common': 1.7.8(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3) + '@reown/appkit-controllers': 1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3) + '@reown/appkit-wallet': 1.7.8(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10) + 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.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.3.31)(react@18.3.1))(zod@3.25.76)': + dependencies: + '@reown/appkit-common': 1.7.8(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-controllers': 1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-polyfills': 1.7.8 + '@reown/appkit-wallet': 1.7.8(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10) + '@walletconnect/logger': 2.1.2 + '@walletconnect/universal-provider': 2.21.0(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + valtio: 1.13.2(@types/react@18.3.31)(react@18.3.1) + viem: 2.38.6(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(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-utils@1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.3.31)(react@18.3.1))(zod@4.4.3)': + dependencies: + '@reown/appkit-common': 1.7.8(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3) + '@reown/appkit-controllers': 1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3) + '@reown/appkit-polyfills': 1.7.8 + '@reown/appkit-wallet': 1.7.8(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10) + '@walletconnect/logger': 2.1.2 + '@walletconnect/universal-provider': 2.21.0(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3) + valtio: 1.13.2(@types/react@18.3.31)(react@18.3.1) + viem: 2.38.6(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -11369,6 +11909,49 @@ snapshots: - typescript - utf-8-validate + '@reown/appkit@1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@reown/appkit-common': 1.7.8(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-controllers': 1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-pay': 1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-polyfills': 1.7.8 + '@reown/appkit-scaffold-ui': 1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.3.31)(react@18.3.1))(zod@3.25.76) + '@reown/appkit-ui': 1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-utils': 1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.3.31)(react@18.3.1))(zod@3.25.76) + '@reown/appkit-wallet': 1.7.8(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10) + '@walletconnect/types': 2.21.0 + '@walletconnect/universal-provider': 2.21.0(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + bs58: 6.0.0 + valtio: 1.13.2(@types/react@18.3.31)(react@18.3.1) + viem: 2.38.6(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(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@1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3)': dependencies: '@reown/appkit-common': 1.7.8(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3) @@ -11570,6 +12153,16 @@ snapshots: - utf-8-validate - zod + '@safe-global/safe-apps-provider@0.18.6(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + events: 3.3.0 + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + - zod + '@safe-global/safe-apps-provider@0.18.6(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3)': dependencies: '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3) @@ -11580,6 +12173,16 @@ snapshots: - utf-8-validate - zod + '@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@safe-global/safe-gateway-typescript-sdk': 3.23.1 + viem: 2.38.6(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + - zod + '@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3)': dependencies: '@safe-global/safe-gateway-typescript-sdk': 3.23.1 @@ -12213,6 +12816,22 @@ snapshots: dependencies: defer-to-connect: 2.0.1 + '@taceo/oprf-client@0.9.0': + dependencies: + '@noble/curves': 2.4.0 + '@noble/hashes': 2.4.0 + '@taceo/oprf-core': 0.4.0 + + '@taceo/oprf-core@0.4.0': + dependencies: + '@noble/curves': 2.4.0 + '@noble/hashes': 2.4.0 + '@taceo/poseidon2': 0.2.0 + + '@taceo/poseidon2@0.2.0': + dependencies: + '@noble/curves': 2.4.0 + '@tailwindcss/typography@0.5.20(tailwindcss@3.4.19(tsx@4.20.6)(yaml@2.8.2))': dependencies: postcss-selector-parser: 6.0.10 @@ -12417,10 +13036,16 @@ snapshots: dependencies: undici-types: 6.19.8 + '@types/pako@2.0.4': {} + '@types/prettier@2.7.3': {} '@types/prop-types@15.7.15': {} + '@types/qrcode@1.5.5': + dependencies: + '@types/node': 22.7.5 + '@types/qs@6.15.1': {} '@types/range-parser@1.2.7': {} @@ -12719,19 +13344,19 @@ snapshots: '@vue/shared@3.5.40': {} - '@wagmi/connectors@6.2.0(@tanstack/react-query@5.101.4(react@18.3.1))(@types/react@18.3.31)(@wagmi/core@2.22.1(@tanstack/query-core@5.101.4)(@types/react@18.3.31)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.38.6(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3)))(bufferutil@4.1.0)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(utf-8-validate@5.0.10)(viem@2.38.6(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3))(wagmi@2.19.5(@tanstack/query-core@5.101.4)(@tanstack/react-query@5.101.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.38.6(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3))(zod@4.4.3))(zod@4.4.3)': + '@wagmi/connectors@6.2.0(@tanstack/react-query@5.101.4(react@18.3.1))(@types/react@18.3.31)(@wagmi/core@2.22.1(@tanstack/query-core@5.101.4)(@types/react@18.3.31)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.38.6(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)))(bufferutil@4.1.0)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(utf-8-validate@5.0.10)(viem@2.38.6(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.19.5(@tanstack/query-core@5.101.4)(@tanstack/react-query@5.101.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.38.6(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76))(zod@3.25.76)': dependencies: - '@base-org/account': 2.4.0(@types/react@18.3.31)(bufferutil@4.1.0)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(utf-8-validate@5.0.10)(zod@4.4.3) - '@coinbase/wallet-sdk': 4.3.6(@types/react@18.3.31)(bufferutil@4.1.0)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(utf-8-validate@5.0.10)(zod@4.4.3) - '@gemini-wallet/core': 0.3.2(viem@2.38.6(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3)) + '@base-org/account': 2.4.0(@types/react@18.3.31)(bufferutil@4.1.0)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(utf-8-validate@5.0.10)(zod@3.25.76) + '@coinbase/wallet-sdk': 4.3.6(@types/react@18.3.31)(bufferutil@4.1.0)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(utf-8-validate@5.0.10)(zod@3.25.76) + '@gemini-wallet/core': 0.3.2(viem@2.38.6(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)) '@metamask/sdk': 0.33.1(bufferutil@4.1.0)(utf-8-validate@5.0.10) - '@safe-global/safe-apps-provider': 0.18.6(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3) - '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3) - '@wagmi/core': 2.22.1(@tanstack/query-core@5.101.4)(@types/react@18.3.31)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.38.6(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3)) - '@walletconnect/ethereum-provider': 2.21.1(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3) + '@safe-global/safe-apps-provider': 0.18.6(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@wagmi/core': 2.22.1(@tanstack/query-core@5.101.4)(@types/react@18.3.31)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.38.6(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)) + '@walletconnect/ethereum-provider': 2.21.1(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) cbw-sdk: '@coinbase/wallet-sdk@3.9.3' - porto: 0.2.35(@tanstack/react-query@5.101.4(react@18.3.1))(@types/react@18.3.31)(@wagmi/core@2.22.1(@tanstack/query-core@5.101.4)(@types/react@18.3.31)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.38.6(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3)))(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.38.6(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3))(wagmi@2.19.5(@tanstack/query-core@5.101.4)(@tanstack/react-query@5.101.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.38.6(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3))(zod@4.4.3)) - viem: 2.38.6(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3) + porto: 0.2.35(@tanstack/react-query@5.101.4(react@18.3.1))(@types/react@18.3.31)(@wagmi/core@2.22.1(@tanstack/query-core@5.101.4)(@types/react@18.3.31)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.38.6(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)))(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.38.6(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.19.5(@tanstack/query-core@5.101.4)(@tanstack/react-query@5.101.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.38.6(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76)) + viem: 2.38.6(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -12777,13 +13402,86 @@ snapshots: - wagmi - zod - '@wagmi/core@2.22.1(@tanstack/query-core@5.101.4)(@types/react@18.3.31)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.38.6(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3))': + '@wagmi/connectors@6.2.0(@tanstack/react-query@5.101.4(react@18.3.1))(@types/react@18.3.31)(@wagmi/core@2.22.1(@tanstack/query-core@5.101.4)(@types/react@18.3.31)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.38.6(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3)))(bufferutil@4.1.0)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(utf-8-validate@5.0.10)(viem@2.38.6(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3))(wagmi@2.19.5(@tanstack/query-core@5.101.4)(@tanstack/react-query@5.101.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.38.6(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3))(zod@4.4.3))(zod@4.4.3)': dependencies: - eventemitter3: 5.0.1 - mipd: 0.0.7(typescript@5.8.3) - viem: 2.38.6(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3) - zustand: 5.0.0(@types/react@18.3.31)(immer@10.0.2)(react@18.3.1)(use-sync-external-store@1.4.0(react@18.3.1)) - optionalDependencies: + '@base-org/account': 2.4.0(@types/react@18.3.31)(bufferutil@4.1.0)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(utf-8-validate@5.0.10)(zod@4.4.3) + '@coinbase/wallet-sdk': 4.3.6(@types/react@18.3.31)(bufferutil@4.1.0)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(utf-8-validate@5.0.10)(zod@4.4.3) + '@gemini-wallet/core': 0.3.2(viem@2.38.6(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3)) + '@metamask/sdk': 0.33.1(bufferutil@4.1.0)(utf-8-validate@5.0.10) + '@safe-global/safe-apps-provider': 0.18.6(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3) + '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3) + '@wagmi/core': 2.22.1(@tanstack/query-core@5.101.4)(@types/react@18.3.31)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.38.6(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3)) + '@walletconnect/ethereum-provider': 2.21.1(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3) + cbw-sdk: '@coinbase/wallet-sdk@3.9.3' + porto: 0.2.35(@tanstack/react-query@5.101.4(react@18.3.1))(@types/react@18.3.31)(@wagmi/core@2.22.1(@tanstack/query-core@5.101.4)(@types/react@18.3.31)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.38.6(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3)))(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.38.6(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3))(wagmi@2.19.5(@tanstack/query-core@5.101.4)(@tanstack/react-query@5.101.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.38.6(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3))(zod@4.4.3)) + viem: 2.38.6(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3) + optionalDependencies: + typescript: 5.8.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' + - '@tanstack/react-query' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - '@x402/core' + - '@x402/evm' + - '@x402/extensions' + - '@x402/svm' + - aws4fetch + - bufferutil + - db0 + - debug + - encoding + - expo-auth-session + - expo-crypto + - expo-web-browser + - fastestsmallesttextencoderdecoder + - immer + - ioredis + - preact-render-to-string + - react + - react-native + - supports-color + - uploadthing + - use-sync-external-store + - utf-8-validate + - wagmi + - zod + + '@wagmi/core@2.22.1(@tanstack/query-core@5.101.4)(@types/react@18.3.31)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.38.6(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76))': + dependencies: + eventemitter3: 5.0.1 + mipd: 0.0.7(typescript@5.8.3) + viem: 2.38.6(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + zustand: 5.0.0(@types/react@18.3.31)(immer@10.0.2)(react@18.3.1)(use-sync-external-store@1.4.0(react@18.3.1)) + optionalDependencies: + '@tanstack/query-core': 5.101.4 + typescript: 5.8.3 + transitivePeerDependencies: + - '@types/react' + - immer + - react + - use-sync-external-store + + '@wagmi/core@2.22.1(@tanstack/query-core@5.101.4)(@types/react@18.3.31)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.38.6(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3))': + dependencies: + eventemitter3: 5.0.1 + mipd: 0.0.7(typescript@5.8.3) + viem: 2.38.6(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3) + zustand: 5.0.0(@types/react@18.3.31)(immer@10.0.2)(react@18.3.1)(use-sync-external-store@1.4.0(react@18.3.1)) + optionalDependencies: '@tanstack/query-core': 5.101.4 typescript: 5.8.3 transitivePeerDependencies: @@ -12792,6 +13490,50 @@ snapshots: - react - use-sync-external-store + '@walletconnect/core@2.21.0(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(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(bufferutil@4.1.0)(utf-8-validate@5.0.10) + '@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.0 + '@walletconnect/utils': 2.21.0(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/window-getters': 1.0.1 + es-toolkit: 1.33.0 + events: 3.3.0 + uint8arrays: 3.1.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/core@2.21.0(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3)': dependencies: '@walletconnect/heartbeat': 1.2.2 @@ -12836,6 +13578,50 @@ snapshots: - utf-8-validate - zod + '@walletconnect/core@2.21.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(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(bufferutil@4.1.0)(utf-8-validate@5.0.10) + '@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.1 + '@walletconnect/utils': 2.21.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/window-getters': 1.0.1 + es-toolkit: 1.33.0 + events: 3.3.0 + uint8arrays: 3.1.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/core@2.21.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3)': dependencies: '@walletconnect/heartbeat': 1.2.2 @@ -12884,6 +13670,47 @@ snapshots: dependencies: tslib: 1.14.1 + '@walletconnect/ethereum-provider@2.21.1(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@reown/appkit': 1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/jsonrpc-http-connection': 1.0.8 + '@walletconnect/jsonrpc-provider': 1.0.14 + '@walletconnect/jsonrpc-types': 1.0.4 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/keyvaluestorage': 1.1.1 + '@walletconnect/sign-client': 2.21.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/types': 2.21.1 + '@walletconnect/universal-provider': 2.21.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/utils': 2.21.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(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/ethereum-provider@2.21.1(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3)': dependencies: '@reown/appkit': 1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3) @@ -13018,16 +13845,190 @@ snapshots: dependencies: tslib: 1.14.1 + '@walletconnect/sign-client@2.21.0(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@walletconnect/core': 2.21.0(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(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.0 + '@walletconnect/utils': 2.21.0(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(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.21.0(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3)': dependencies: - '@walletconnect/core': 2.21.0(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3) + '@walletconnect/core': 2.21.0(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3) + '@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.0 + '@walletconnect/utils': 2.21.0(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.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 + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod + + '@walletconnect/sign-client@2.21.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@walletconnect/core': 2.21.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(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.1 + '@walletconnect/utils': 2.21.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(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.21.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3)': + dependencies: + '@walletconnect/core': 2.21.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3) + '@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.1 + '@walletconnect/utils': 2.21.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.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 + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod + + '@walletconnect/time@1.0.2': + dependencies: + tslib: 1.14.1 + + '@walletconnect/types@2.21.0': + 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.21.1': + dependencies: '@walletconnect/events': 1.0.1 '@walletconnect/heartbeat': 1.2.2 - '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/jsonrpc-types': 1.0.4 + '@walletconnect/keyvaluestorage': 1.1.1 '@walletconnect/logger': 2.1.2 - '@walletconnect/time': 1.0.2 - '@walletconnect/types': 2.21.0 - '@walletconnect/utils': 2.21.0(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3) events: 3.3.0 transitivePeerDependencies: - '@azure/app-configuration' @@ -13046,24 +14047,23 @@ snapshots: - '@vercel/functions' - '@vercel/kv' - aws4fetch - - bufferutil - db0 - ioredis - - typescript - uploadthing - - utf-8-validate - - zod - '@walletconnect/sign-client@2.21.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3)': + '@walletconnect/universal-provider@2.21.0(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: - '@walletconnect/core': 2.21.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3) '@walletconnect/events': 1.0.1 - '@walletconnect/heartbeat': 1.2.2 + '@walletconnect/jsonrpc-http-connection': 1.0.8 + '@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/time': 1.0.2 - '@walletconnect/types': 2.21.1 - '@walletconnect/utils': 2.21.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3) + '@walletconnect/sign-client': 2.21.0(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/types': 2.21.0 + '@walletconnect/utils': 2.21.0(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + es-toolkit: 1.33.0 events: 3.3.0 transitivePeerDependencies: - '@azure/app-configuration' @@ -13084,23 +14084,26 @@ snapshots: - aws4fetch - bufferutil - db0 + - encoding - ioredis - typescript - uploadthing - utf-8-validate - zod - '@walletconnect/time@1.0.2': - dependencies: - tslib: 1.14.1 - - '@walletconnect/types@2.21.0': + '@walletconnect/universal-provider@2.21.0(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3)': dependencies: '@walletconnect/events': 1.0.1 - '@walletconnect/heartbeat': 1.2.2 + '@walletconnect/jsonrpc-http-connection': 1.0.8 + '@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.0(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3) + '@walletconnect/types': 2.21.0 + '@walletconnect/utils': 2.21.0(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3) + es-toolkit: 1.33.0 events: 3.3.0 transitivePeerDependencies: - '@azure/app-configuration' @@ -13119,17 +14122,28 @@ snapshots: - '@vercel/functions' - '@vercel/kv' - aws4fetch + - bufferutil - db0 + - encoding - ioredis + - typescript - uploadthing + - utf-8-validate + - zod - '@walletconnect/types@2.21.1': + '@walletconnect/universal-provider@2.21.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: '@walletconnect/events': 1.0.1 - '@walletconnect/heartbeat': 1.2.2 + '@walletconnect/jsonrpc-http-connection': 1.0.8 + '@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.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/types': 2.21.1 + '@walletconnect/utils': 2.21.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + es-toolkit: 1.33.0 events: 3.3.0 transitivePeerDependencies: - '@azure/app-configuration' @@ -13148,11 +14162,16 @@ snapshots: - '@vercel/functions' - '@vercel/kv' - aws4fetch + - bufferutil - db0 + - encoding - ioredis + - typescript - uploadthing + - utf-8-validate + - zod - '@walletconnect/universal-provider@2.21.0(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3)': + '@walletconnect/universal-provider@2.21.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3)': dependencies: '@walletconnect/events': 1.0.1 '@walletconnect/jsonrpc-http-connection': 1.0.8 @@ -13161,9 +14180,9 @@ snapshots: '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/keyvaluestorage': 1.1.1 '@walletconnect/logger': 2.1.2 - '@walletconnect/sign-client': 2.21.0(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3) - '@walletconnect/types': 2.21.0 - '@walletconnect/utils': 2.21.0(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3) + '@walletconnect/sign-client': 2.21.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3) + '@walletconnect/types': 2.21.1 + '@walletconnect/utils': 2.21.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3) es-toolkit: 1.33.0 events: 3.3.0 transitivePeerDependencies: @@ -13192,20 +14211,25 @@ snapshots: - utf-8-validate - zod - '@walletconnect/universal-provider@2.21.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3)': + '@walletconnect/utils@2.21.0(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: - '@walletconnect/events': 1.0.1 - '@walletconnect/jsonrpc-http-connection': 1.0.8 - '@walletconnect/jsonrpc-provider': 1.0.14 - '@walletconnect/jsonrpc-types': 1.0.4 + '@noble/ciphers': 1.2.1 + '@noble/curves': 1.8.1 + '@noble/hashes': 1.7.1 '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/keyvaluestorage': 1.1.1 - '@walletconnect/logger': 2.1.2 - '@walletconnect/sign-client': 2.21.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3) - '@walletconnect/types': 2.21.1 - '@walletconnect/utils': 2.21.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3) - es-toolkit: 1.33.0 - events: 3.3.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.21.0 + '@walletconnect/window-getters': 1.0.1 + '@walletconnect/window-metadata': 1.0.1 + bs58: 6.0.0 + detect-browser: 5.3.0 + query-string: 7.1.3 + uint8arrays: 3.1.0 + viem: 2.38.6(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -13225,7 +14249,6 @@ snapshots: - aws4fetch - bufferutil - db0 - - encoding - ioredis - typescript - uploadthing @@ -13276,6 +14299,50 @@ snapshots: - utf-8-validate - zod + '@walletconnect/utils@2.21.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@noble/ciphers': 1.2.1 + '@noble/curves': 1.8.1 + '@noble/hashes': 1.7.1 + '@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.1 + '@walletconnect/window-getters': 1.0.1 + '@walletconnect/window-metadata': 1.0.1 + bs58: 6.0.0 + detect-browser: 5.3.0 + query-string: 7.1.3 + uint8arrays: 3.1.0 + viem: 2.38.6(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(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.21.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3)': dependencies: '@noble/ciphers': 1.2.1 @@ -13346,6 +14413,10 @@ snapshots: - bufferutil - utf-8-validate + '@zk-kit/utils@1.3.0': + dependencies: + buffer: 6.0.3 + '@zk-kit/utils@1.4.1(bufferutil@4.1.0)(utf-8-validate@5.0.10)': dependencies: buffer: 6.0.3 @@ -13354,6 +14425,83 @@ snapshots: - bufferutil - utf-8-validate + '@zkpassport/poseidon2@0.6.2': {} + + '@zkpassport/registry@0.15.3': + dependencies: + '@zkpassport/poseidon2': 0.6.2 + '@zkpassport/utils': 0.39.0 + debug: 4.4.3(supports-color@5.5.0) + tslib: 2.8.1 + transitivePeerDependencies: + - supports-color + + '@zkpassport/sdk@0.19.2(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3)': + dependencies: + '@aztec/bb.js': 5.0.0 + '@aztec/bb.js-v4': '@aztec/bb.js@4.2.0-aztecnr-rc.2' + '@noble/ciphers': 1.3.0 + '@noble/hashes': 2.4.0 + '@noble/secp256k1': 2.3.0 + '@noir-lang/noir_js': 1.0.0-beta.22 + '@obsidion/bridge': 0.12.2(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10) + '@zkpassport/registry': 0.15.3 + '@zkpassport/utils': 0.40.0-beta.2 + buffer: 6.0.3 + i18n-iso-countries: 7.14.0 + pako: 2.2.0 + tslib: 2.8.1 + viem: 2.38.6(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3) + ws: 8.21.1(bufferutil@4.1.0)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - supports-color + - typescript + - utf-8-validate + - zod + + '@zkpassport/utils@0.39.0': + dependencies: + '@lapo/asn1js': 2.1.3 + '@noble/ciphers': 1.3.0 + '@noble/curves': 2.4.0 + '@noble/hashes': 2.4.0 + '@noble/secp256k1': 2.3.0 + '@peculiar/asn1-cms': 2.11.1 + '@peculiar/asn1-ecc': 2.11.1 + '@peculiar/asn1-rsa': 2.11.1 + '@peculiar/asn1-schema': 2.8.0 + '@peculiar/asn1-x509': 2.11.1 + '@peculiar/x509': 1.14.3 + '@taceo/oprf-client': 0.9.0 + '@taceo/oprf-core': 0.4.0 + '@zk-kit/utils': 1.3.0 + '@zkpassport/poseidon2': 0.6.2 + date-fns: 4.4.0 + i18n-iso-countries: 7.14.0 + tslib: 2.8.1 + + '@zkpassport/utils@0.40.0-beta.2': + dependencies: + '@lapo/asn1js': 2.1.3 + '@noble/ciphers': 1.3.0 + '@noble/curves': 2.4.0 + '@noble/hashes': 2.4.0 + '@noble/secp256k1': 2.3.0 + '@peculiar/asn1-cms': 2.11.1 + '@peculiar/asn1-ecc': 2.11.1 + '@peculiar/asn1-rsa': 2.11.1 + '@peculiar/asn1-schema': 2.8.0 + '@peculiar/asn1-x509': 2.11.1 + '@peculiar/x509': 1.14.3 + '@taceo/oprf-client': 0.9.0 + '@taceo/oprf-core': 0.4.0 + '@zk-kit/utils': 1.3.0 + '@zkpassport/poseidon2': 0.6.2 + date-fns: 4.4.0 + i18n-iso-countries: 7.14.0 + tslib: 2.8.1 + abbrev@1.0.9: {} abitype@1.0.6(typescript@5.8.3)(zod@3.25.76): @@ -13522,7 +14670,6 @@ snapshots: pvtsutils: 1.3.6 pvutils: 1.1.5 tslib: 2.8.1 - optional: true assertion-error@1.1.0: {} @@ -14295,6 +15442,8 @@ snapshots: dependencies: '@babel/runtime': 7.29.7 + date-fns@4.4.0: {} + dayjs@1.11.13: {} dayjs@1.11.21: {} @@ -14379,6 +15528,8 @@ snapshots: dependencies: dequal: 2.0.3 + diacritics@1.3.0: {} + didyoumean@1.2.2: {} diff-sequences@29.6.3: {} @@ -15593,6 +16744,10 @@ snapshots: husky@9.1.7: {} + i18n-iso-countries@7.14.0: + dependencies: + diacritics: 1.3.0 + iconv-lite@0.4.24: dependencies: safer-buffer: 2.1.2 @@ -17009,6 +18164,20 @@ snapshots: outdent@0.5.0: {} + ox@0.6.9(typescript@5.8.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.3.0(typescript@5.8.3)(zod@3.25.76) + eventemitter3: 5.0.1 + optionalDependencies: + typescript: 5.8.3 + transitivePeerDependencies: + - zod + ox@0.6.9(typescript@5.8.3)(zod@4.4.3): dependencies: '@adraffy/ens-normalize': 1.11.1 @@ -17308,6 +18477,26 @@ snapshots: style-value-types: 5.0.0 tslib: 2.8.1 + porto@0.2.35(@tanstack/react-query@5.101.4(react@18.3.1))(@types/react@18.3.31)(@wagmi/core@2.22.1(@tanstack/query-core@5.101.4)(@types/react@18.3.31)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.38.6(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)))(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.38.6(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.19.5(@tanstack/query-core@5.101.4)(@tanstack/react-query@5.101.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.38.6(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76)): + dependencies: + '@wagmi/core': 2.22.1(@tanstack/query-core@5.101.4)(@types/react@18.3.31)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.38.6(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)) + hono: 4.12.32 + idb-keyval: 6.3.0 + mipd: 0.0.7(typescript@5.8.3) + ox: 0.9.17(typescript@5.8.3)(zod@4.4.3) + viem: 2.38.6(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + zod: 4.4.3 + zustand: 5.0.14(@types/react@18.3.31)(immer@10.0.2)(react@18.3.1)(use-sync-external-store@1.4.0(react@18.3.1)) + optionalDependencies: + '@tanstack/react-query': 5.101.4(react@18.3.1) + react: 18.3.1 + typescript: 5.8.3 + wagmi: 2.19.5(@tanstack/query-core@5.101.4)(@tanstack/react-query@5.101.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.38.6(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76) + transitivePeerDependencies: + - '@types/react' + - immer + - use-sync-external-store + porto@0.2.35(@tanstack/react-query@5.101.4(react@18.3.1))(@types/react@18.3.31)(@wagmi/core@2.22.1(@tanstack/query-core@5.101.4)(@types/react@18.3.31)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.38.6(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3)))(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.38.6(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3))(wagmi@2.19.5(@tanstack/query-core@5.101.4)(@tanstack/react-query@5.101.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.38.6(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3))(zod@4.4.3)): dependencies: '@wagmi/core': 2.22.1(@tanstack/query-core@5.101.4)(@types/react@18.3.31)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.38.6(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3)) @@ -17470,10 +18659,8 @@ snapshots: pvtsutils@1.3.6: dependencies: tslib: 2.8.1 - optional: true - pvutils@1.1.5: - optional: true + pvutils@1.1.5: {} qrcode@1.5.3: dependencies: @@ -17625,6 +18812,8 @@ snapshots: reduce-flatten@2.0.0: {} + reflect-metadata@0.2.2: {} + registry-auth-token@5.1.1: dependencies: '@pnpm/npm-conf': 3.0.3 @@ -18568,6 +19757,10 @@ snapshots: optionalDependencies: fsevents: 2.3.3 + tsyringe@4.10.0: + dependencies: + tslib: 1.14.1 + type-check@0.3.2: dependencies: prelude-ls: 1.1.2 @@ -19042,6 +20235,56 @@ snapshots: vscode-uri@3.1.0: {} + wagmi@2.19.5(@tanstack/query-core@5.101.4)(@tanstack/react-query@5.101.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.38.6(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76): + dependencies: + '@tanstack/react-query': 5.101.4(react@18.3.1) + '@wagmi/connectors': 6.2.0(@tanstack/react-query@5.101.4(react@18.3.1))(@types/react@18.3.31)(@wagmi/core@2.22.1(@tanstack/query-core@5.101.4)(@types/react@18.3.31)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.38.6(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)))(bufferutil@4.1.0)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(utf-8-validate@5.0.10)(viem@2.38.6(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.19.5(@tanstack/query-core@5.101.4)(@tanstack/react-query@5.101.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.38.6(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76))(zod@3.25.76) + '@wagmi/core': 2.22.1(@tanstack/query-core@5.101.4)(@types/react@18.3.31)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.38.6(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)) + react: 18.3.1 + use-sync-external-store: 1.4.0(react@18.3.1) + viem: 2.38.6(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + optionalDependencies: + typescript: 5.8.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' + - '@tanstack/query-core' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - '@x402/core' + - '@x402/evm' + - '@x402/extensions' + - '@x402/svm' + - aws4fetch + - bufferutil + - db0 + - debug + - encoding + - expo-auth-session + - expo-crypto + - expo-web-browser + - fastestsmallesttextencoderdecoder + - immer + - ioredis + - preact-render-to-string + - react-native + - supports-color + - uploadthing + - utf-8-validate + - zod + wagmi@2.19.5(@tanstack/query-core@5.101.4)(@tanstack/react-query@5.101.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(immer@10.0.2)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.38.6(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@4.4.3))(zod@4.4.3): dependencies: '@tanstack/react-query': 5.101.4(react@18.3.1)