diff --git a/apps/explorer/package.json b/apps/explorer/package.json index 933450e..a4e00f6 100644 --- a/apps/explorer/package.json +++ b/apps/explorer/package.json @@ -18,12 +18,12 @@ "@ceramic-sdk/model-instance-protocol": "workspace:^", "@ceramic-sdk/model-protocol": "workspace:^", "@didtools/key-did": "^1.0.0", - "@mantine/core": "^7.11.2", - "@mantine/hooks": "^7.11.2", + "@mantine/core": "^7.12.2", + "@mantine/hooks": "^7.12.2", "@tabler/icons-react": "^3.14.0", - "@tanstack/react-query": "^5.52.2", - "@tanstack/react-router": "^1.51.2", - "codeco": "^1.4.2", + "@tanstack/react-query": "^5.53.1", + "@tanstack/react-router": "^1.51.6", + "codeco": "^1.4.3", "jotai": "^2.9.2", "multiformats": "^13.2.2", "react": "^18.3.1", @@ -32,9 +32,9 @@ "devDependencies": { "@ceramic-sdk/model-client": "workspace:^", "@ceramic-sdk/model-instance-client": "workspace:^", - "@tanstack/router-devtools": "^1.51.2", - "@tanstack/router-plugin": "^1.51.0", - "@types/react": "^18.3.3", + "@tanstack/router-devtools": "^1.51.6", + "@tanstack/router-plugin": "^1.51.6", + "@types/react": "^18.3.5", "@types/react-dom": "^18.3.0", "@vitejs/plugin-react-swc": "^3.5.0", "postcss": "^8.4.40", diff --git a/package.json b/package.json index 49a1e6c..0ac23b3 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ "@biomejs/biome": "1.8.3", "@jest/globals": "^29.7.0", "@swc/cli": "^0.4.0", - "@swc/core": "^1.7.11", + "@swc/core": "^1.7.22", "@swc/jest": "^0.2.36", "@types/jest": "^29.5.12", "@types/node": "^20.14.12", diff --git a/packages/events/package.json b/packages/events/package.json index 2234e01..11c1f9f 100644 --- a/packages/events/package.json +++ b/packages/events/package.json @@ -37,7 +37,7 @@ "@ipld/dag-cbor": "^9.2.1", "@ipld/dag-json": "^10.2.2", "cartonne": "^3.0.1", - "codeco": "^1.4.2", + "codeco": "^1.4.3", "dag-jose": "^5.1.1", "multiformats": "^13.2.2", "multihashes-sync": "^2.0.0", diff --git a/packages/http-client/package.json b/packages/http-client/package.json index e377703..17019f2 100644 --- a/packages/http-client/package.json +++ b/packages/http-client/package.json @@ -34,13 +34,13 @@ }, "dependencies": { "@ceramic-sdk/events": "workspace:^", - "openapi-fetch": "^0.11.1" + "openapi-fetch": "^0.11.3" }, "devDependencies": { "cartonne": "^3.0.1", - "codeco": "^1.4.2", + "codeco": "^1.4.3", "multiformats": "^13.2.2", - "openapi-typescript": "^7.3.0", + "openapi-typescript": "^7.3.3", "type-fest": "^4.26.0" }, "jest": { diff --git a/packages/identifiers/package.json b/packages/identifiers/package.json index 3f06823..2a4f3b2 100644 --- a/packages/identifiers/package.json +++ b/packages/identifiers/package.json @@ -33,7 +33,7 @@ }, "dependencies": { "@ipld/dag-cbor": "^9.2.1", - "codeco": "^1.4.2", + "codeco": "^1.4.3", "mapmoize": "^1.2.1", "multiformats": "^13.2.2", "uint8arrays": "^5.1.0", diff --git a/packages/model-client/test/lib.test.ts b/packages/model-client/test/lib.test.ts index 606befa..75a790a 100644 --- a/packages/model-client/test/lib.test.ts +++ b/packages/model-client/test/lib.test.ts @@ -3,7 +3,7 @@ import { MODEL_RESOURCE_URI, type ModelDefinition, } from '@ceramic-sdk/model-protocol' -import { EthereumDID } from '@ceramic-sdk/test-utils' +import { createSession, ethereum } from '@ceramic-sdk/test-utils' import { getAuthenticatedDID } from '@didtools/key-did' import { createInitEvent } from '../src/index.js' @@ -42,14 +42,19 @@ describe('createInitEvent()', () => { }) test('supports did:pkh', async () => { - const did = await EthereumDID.random({ - domain: 'test', - resources: [MODEL_RESOURCE_URI], - }) + const authMethod = await ethereum.authMethodFromRandomKey() const [validSession, invalidSession] = await Promise.all([ - did.createSession({ expirationTime: null }), - did.createSession({ expiresInSecs: 60 }), + createSession(authMethod, { + domain: 'test', + resources: [MODEL_RESOURCE_URI], + expirationTime: null, + }), + createSession(authMethod, { + domain: 'test', + resources: [MODEL_RESOURCE_URI], + expiresInSecs: 60, + }), ]) await expect(async () => { diff --git a/packages/model-handler/test/handler.test.ts b/packages/model-handler/test/handler.test.ts index 971cc11..3eafcfb 100644 --- a/packages/model-handler/test/handler.test.ts +++ b/packages/model-handler/test/handler.test.ts @@ -14,7 +14,7 @@ import { type ModelEvent, ModelInitEventPayload, } from '@ceramic-sdk/model-protocol' -import { EthereumDID } from '@ceramic-sdk/test-utils' +import { createSession, ethereum } from '@ceramic-sdk/test-utils' import { asDIDString } from '@didtools/codecs' import { createDID, getAuthenticatedDID } from '@didtools/key-did' import { jest } from '@jest/globals' @@ -105,18 +105,19 @@ describe('handleInitEvent()', () => { }) test('supports did:pkh', async () => { - const did = await EthereumDID.random({ - domain: 'test', - resources: [MODEL_RESOURCE_URI], - }) + const authMethod = await ethereum.authMethodFromRandomKey() const [validEvent, invalidEvent] = await Promise.all([ - did - .createSession({ expirationTime: null }) - .then((session) => createModelEvent(session.did)), - did - .createSession({ expiresInSecs: 60 }) - .then((session) => createModelEvent(session.did)), + createSession(authMethod, { + domain: 'test', + resources: [MODEL_RESOURCE_URI], + expirationTime: null, + }).then((session) => createModelEvent(session.did)), + createSession(authMethod, { + domain: 'test', + resources: [MODEL_RESOURCE_URI], + expiresInSecs: 60, + }).then((session) => createModelEvent(session.did)), ]) await expect(async () => { diff --git a/packages/model-instance-handler/package.json b/packages/model-instance-handler/package.json index d77b20e..6fe1d12 100644 --- a/packages/model-instance-handler/package.json +++ b/packages/model-instance-handler/package.json @@ -37,7 +37,7 @@ "@ceramic-sdk/model-instance-protocol": "workspace:^", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", - "codeco": "^1.4.2", + "codeco": "^1.4.3", "fast-json-patch": "^3.1.1", "uint8arrays": "^5.1.0" }, diff --git a/packages/model-instance-protocol/package.json b/packages/model-instance-protocol/package.json index d3e6dae..505753f 100644 --- a/packages/model-instance-protocol/package.json +++ b/packages/model-instance-protocol/package.json @@ -35,7 +35,7 @@ "@ceramic-sdk/events": "workspace:^", "@ceramic-sdk/identifiers": "workspace:^", "@didtools/codecs": "^3.0.0", - "codeco": "^1.4.2", + "codeco": "^1.4.3", "object-sizeof": "^2.6.4" }, "devDependencies": { diff --git a/packages/model-protocol/package.json b/packages/model-protocol/package.json index 06d84d1..11ee94e 100644 --- a/packages/model-protocol/package.json +++ b/packages/model-protocol/package.json @@ -38,7 +38,7 @@ "@didtools/codecs": "^3.0.0", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", - "codeco": "^1.4.2", + "codeco": "^1.4.3", "json-ptr": "^3.1.1" }, "devDependencies": { diff --git a/packages/test-utils/package.json b/packages/test-utils/package.json index f9d99bc..717eca0 100644 --- a/packages/test-utils/package.json +++ b/packages/test-utils/package.json @@ -34,11 +34,20 @@ }, "dependencies": { "@didtools/cacao": "^3.0.1", + "@didtools/key-webauthn": "^2.0.2", + "@didtools/key-webcrypto": "^0.2.0", + "@didtools/pkh-solana": "^0.2.0", + "@noble/curves": "^1.5.0", "@noble/hashes": "^1.4.0", + "@solana/signers": "^2.0.0-rc.1", "caip": "^1.1.1", + "cborg": "^4.2.3", "did-session": "^4.0.0", "dids": "^5.0.2", - "viem": "^2.20.1" + "key-did-resolver": "^4.0.0", + "multiformats": "^13.2.2", + "uint8arrays": "^5.1.0", + "viem": "^2.21.0" }, "devDependencies": { "@didtools/pkh-ethereum": "^0.6.0" diff --git a/packages/test-vectors/scripts/utils/did.ts b/packages/test-utils/src/did.ts similarity index 86% rename from packages/test-vectors/scripts/utils/did.ts rename to packages/test-utils/src/did.ts index f334a5a..cbc1c26 100644 --- a/packages/test-vectors/scripts/utils/did.ts +++ b/packages/test-utils/src/did.ts @@ -4,7 +4,6 @@ import { type Cacao, CacaoBlock, } from '@didtools/cacao' -import { getAuthenticatedDID } from '@didtools/key-did' import { type CreateJWSOptions, DID, @@ -16,14 +15,13 @@ import { CID } from 'multiformats/cid' const VALID_EXPIRATION_TIME = new Date(9999, 0).toISOString() const INVALID_EXPIRATION_TIME = new Date(2000, 0).toISOString() -export const keyDID = await getAuthenticatedDID(new Uint8Array(32)) - export type CustomCreateJWSOptions = CreateJWSOptions & { capability?: Cacao } export class CustomCapabilityDID extends DID { get capability(): Cacao { + // @ts-ignore private field return this._capability } @@ -32,9 +30,12 @@ export class CustomCapabilityDID extends DID { payload: T, options: CustomCreateJWSOptions = {}, ): Promise { + // @ts-ignore private field if (this._client == null) throw new Error('No provider available') + // @ts-ignore private field if (this._id == null) throw new Error('DID is not authenticated') // Use capability from options when provided + // @ts-ignore private field const capability = options.capability ?? this._capability if (capability) { const cacaoBlock = await CacaoBlock.fromCacao(capability) @@ -47,7 +48,9 @@ export class CustomCapabilityDID extends DID { options.protected = options.protected || {} options.protected.cap = `ipfs://${capCID?.toString()}` } + // @ts-ignore private field const { jws } = await this._client.request('did_createJWS', { + // @ts-ignore private field did: this._id, ...options, payload, @@ -70,6 +73,7 @@ export class CustomCapabilityDID extends DID { } export async function createCapabilityDID( + keyDID: DID, authMethod: AuthMethod, authParams: AuthMethodOpts = {}, ): Promise { @@ -80,9 +84,12 @@ export async function createCapabilityDID( ...authParams, }) const did = new CustomCapabilityDID({ + // @ts-ignore private field provider: keyDID._client?.connection, + // @ts-ignore private field resolver: keyDID._resolver, capability, + // @ts-ignore private field parent: keyDID._parentId, }) await did.authenticate() @@ -95,9 +102,13 @@ export class ExpiredCapabilityDID extends DID { payload: T, options: CreateJWSOptions = {}, ): Promise { + // @ts-ignore private field if (this._client == null) throw new Error('No provider available') + // @ts-ignore private field if (this._id == null) throw new Error('DID is not authenticated') + // @ts-ignore private field if (this._capability) { + // @ts-ignore private field const cacaoBlock = await CacaoBlock.fromCacao(this._capability) const capCID = CID.asCID(cacaoBlock.cid) if (!capCID) { @@ -108,7 +119,9 @@ export class ExpiredCapabilityDID extends DID { options.protected = options.protected || {} options.protected.cap = `ipfs://${capCID?.toString()}` } + // @ts-ignore private field const { jws } = await this._client.request('did_createJWS', { + // @ts-ignore private field did: this._id, ...options, payload, @@ -118,6 +131,7 @@ export class ExpiredCapabilityDID extends DID { } export async function createExpiredCapabilityDID( + keyDID: DID, authMethod: AuthMethod, authParams: AuthMethodOpts = {}, ): Promise { @@ -128,9 +142,12 @@ export async function createExpiredCapabilityDID( ...authParams, }) const did = new ExpiredCapabilityDID({ + // @ts-ignore private field provider: keyDID._client?.connection, + // @ts-ignore private field resolver: keyDID._resolver, capability, + // @ts-ignore private field parent: keyDID._parentId, }) await did.authenticate() diff --git a/packages/test-utils/src/ethereum.ts b/packages/test-utils/src/ethereum.ts new file mode 100644 index 0000000..31da3ee --- /dev/null +++ b/packages/test-utils/src/ethereum.ts @@ -0,0 +1,39 @@ +import type { AuthMethod } from '@didtools/cacao' +import type { EIP1193Provider, Hex } from 'viem' +import { generatePrivateKey } from 'viem/accounts' + +import { createProvider, getAccount } from './ethereum/provider.js' +import { createAuthMethod } from './ethereum/siwe.js' + +// Default private key used for tests +const PRIVATE_KEY = + '0xe50df915de22bad5bf1abf43f78b55d64640afdcdfa6b1699a514d97662b23f7' as Hex + +// Re-exports from viem +export { generatePrivateKey } +export type { EIP1193Provider, Hex } + +// Re-exports useful internals +export { createAuthMethod, createProvider, getAccount } + +export async function authMethodFromProvider( + provider: EIP1193Provider, +): Promise { + const accountId = await getAccount(provider) + return createAuthMethod(provider, accountId) as AuthMethod +} + +export async function authMethodFromPrivateKey( + privateKey: Hex, +): Promise { + const provider = createProvider(privateKey) + return await authMethodFromProvider(provider) +} + +export async function authMethodFromRandomKey(): Promise { + return await authMethodFromPrivateKey(generatePrivateKey()) +} + +export async function getAuthMethod(): Promise { + return await authMethodFromPrivateKey(PRIVATE_KEY) +} diff --git a/packages/test-utils/src/provider.ts b/packages/test-utils/src/ethereum/provider.ts similarity index 100% rename from packages/test-utils/src/provider.ts rename to packages/test-utils/src/ethereum/provider.ts diff --git a/packages/test-utils/src/siwe.ts b/packages/test-utils/src/ethereum/siwe.ts similarity index 70% rename from packages/test-utils/src/siwe.ts rename to packages/test-utils/src/ethereum/siwe.ts index d387a35..6aede01 100644 --- a/packages/test-utils/src/siwe.ts +++ b/packages/test-utils/src/ethereum/siwe.ts @@ -1,10 +1,14 @@ -import { Cacao, SiweMessage, type SiwxMessage } from '@didtools/cacao' +import { + type AuthMethod, + type AuthMethodOpts, + Cacao, + SiweMessage, + type SiwxMessage, +} from '@didtools/cacao' import { bytesToHex } from '@noble/hashes/utils' import type { AccountId } from 'caip' import type { Address, EIP1193Provider, Hex } from 'viem' -import type { AuthMethod, AuthParams } from './types.js' - /** * SIWX Version */ @@ -19,27 +23,27 @@ function randomNonce(): string { export async function createCACAO( provider: EIP1193Provider, account: AccountId, - params: AuthParams, + options: AuthMethodOpts, ): Promise { const now = new Date() const message: Partial = { - domain: params.domain, + domain: options.domain, address: account.address, statement: - params.statement ?? + options.statement ?? 'Give this application access to some of your data on Ceramic', - uri: params.uri, + uri: options.uri, version: VERSION, - nonce: params.nonce ?? randomNonce(), + nonce: options.nonce ?? randomNonce(), issuedAt: now.toISOString(), chainId: account.chainId.reference, - resources: params.resources, + resources: options.resources, } // Only add expirationTime if not explicitly set to null - if (params.expirationTime !== null) { + if (options.expirationTime !== null) { message.expirationTime = - params.expirationTime ?? new Date(now.getTime() + ONE_WEEK).toISOString() + options.expirationTime ?? new Date(now.getTime() + ONE_WEEK).toISOString() } const siweMessage = new SiweMessage(message) @@ -59,7 +63,7 @@ export function createAuthMethod( provider: EIP1193Provider, account: AccountId, ): AuthMethod { - return (params) => { - return createCACAO(provider, account, params as unknown as AuthParams) + return (options: AuthMethodOpts) => { + return createCACAO(provider, account, options) } } diff --git a/packages/test-utils/src/index.ts b/packages/test-utils/src/index.ts index 4460bf8..dfebad9 100644 --- a/packages/test-utils/src/index.ts +++ b/packages/test-utils/src/index.ts @@ -1,73 +1,7 @@ -import type { AccountId } from 'caip' -import { DIDSession } from 'did-session' -import type { EIP1193Provider, Hex } from 'viem' -import { generatePrivateKey } from 'viem/accounts' - -import { createProvider, getAccount } from './provider.js' -import { createAuthMethod } from './siwe.js' -import type { AuthMethod, AuthOptions } from './types.js' - -// Re-exports from viem -export { generatePrivateKey } -export type { EIP1193Provider, Hex } - -// Re-exports useful internals -export { createAuthMethod, createProvider, getAccount } - -export type EthereumDIDParams = { - accountId: AccountId - authMethod: AuthMethod - authOptions: AuthOptions -} - -export class EthereumDID { - static async fromProvider( - provider: EIP1193Provider, - authOptions: AuthOptions, - ): Promise { - const accountId = await getAccount(provider) - const authMethod = createAuthMethod(provider, accountId) - return new EthereumDID({ accountId, authMethod, authOptions }) - } - - static async fromPrivateKey( - privateKey: Hex, - authOptions: AuthOptions, - ): Promise { - return await EthereumDID.fromProvider( - createProvider(privateKey), - authOptions, - ) - } - - static async random(authOptions: AuthOptions): Promise { - return await EthereumDID.fromPrivateKey(generatePrivateKey(), authOptions) - } - - #authMethod: AuthMethod - #authOptions: AuthOptions - #id: string - - constructor(params: EthereumDIDParams) { - if (params.authOptions.resources.length === 0) { - throw new Error( - `The "resources" array of the authorization options must contain at least one item`, - ) - } - this.#authMethod = params.authMethod - this.#authOptions = params.authOptions - this.#id = `did:pkh:${params.accountId.toString()}` - } - - get id(): string { - return this.#id - } - - async createSession(options: Partial = {}): Promise { - return await DIDSession.authorize(this.#authMethod, { - ...this.#authOptions, - ...options, - // biome-ignore lint/suspicious/noExplicitAny: AuthOpts handling - } as any) - } -} +export * from './did.js' +export * as ethereum from './ethereum.js' +export * from './session.js' +export * as solana from './solana.js' +export type * from './types.js' +export * as webauthn from './webauthn.js' +export * as webcrypto from './webcrypto.js' diff --git a/packages/test-utils/src/session.ts b/packages/test-utils/src/session.ts new file mode 100644 index 0000000..832430c --- /dev/null +++ b/packages/test-utils/src/session.ts @@ -0,0 +1,16 @@ +import type { AuthMethod } from '@didtools/cacao' +import { DIDSession } from 'did-session' + +import type { AuthOptions } from './types.js' + +export type { DIDSession } + +export async function createSession( + authMethod: AuthMethod, + options: AuthOptions, +): Promise { + return await DIDSession.authorize( + authMethod, + options as Omit, + ) +} diff --git a/packages/test-vectors/scripts/utils/solana.ts b/packages/test-utils/src/solana.ts similarity index 96% rename from packages/test-vectors/scripts/utils/solana.ts rename to packages/test-utils/src/solana.ts index e1d120b..5b687bf 100644 --- a/packages/test-vectors/scripts/utils/solana.ts +++ b/packages/test-utils/src/solana.ts @@ -7,7 +7,7 @@ import { } from '@solana/signers' import { AccountId } from 'caip' -import { getEd25519KeyPair } from './webcrypto.ts' +import { getEd25519KeyPair } from './webcrypto.js' // Value from RPC call - https://solana.com/docs/rpc/http/getgenesishash#code-sample // Sliced to only keep the first 32 characters diff --git a/packages/test-utils/src/types.ts b/packages/test-utils/src/types.ts index 4d142de..b130945 100644 --- a/packages/test-utils/src/types.ts +++ b/packages/test-utils/src/types.ts @@ -1,5 +1,6 @@ import type { Cacao } from '@didtools/cacao' +// DIDSession creation options export type AuthOptions = { domain: string expirationTime?: string | null @@ -10,6 +11,7 @@ export type AuthOptions = { statement?: string } +// AuthMethod parameters export type AuthParams = { domain: string expirationTime?: string | null @@ -20,4 +22,4 @@ export type AuthParams = { uri: string } -export type AuthMethod = (options: Partial) => Promise +export type AuthMethod = (params: AuthParams) => Promise diff --git a/packages/test-vectors/scripts/utils/webauthn.ts b/packages/test-utils/src/webauthn.ts similarity index 90% rename from packages/test-vectors/scripts/utils/webauthn.ts rename to packages/test-utils/src/webauthn.ts index 0c74404..cf2f28d 100644 --- a/packages/test-vectors/scripts/utils/webauthn.ts +++ b/packages/test-utils/src/webauthn.ts @@ -32,6 +32,7 @@ export class MockAuthenticator { const rawId = u8a.concat([pk.slice(1, 14), u8a.fromString('STUB', 'utf8')]) const id = u8a.toString(rawId, 'base64url') const userHandle = hash( + // @ts-ignore opts.publicKey?.user?.id || p256.CURVE.randomBytes(32), ) const authData = mkAuthData(pk) @@ -76,6 +77,7 @@ export class MockAuthenticator { return out } + // @ts-ignore unknow opts type async get(opts) { const { secret, id, rawId, userHandle } = this.credentials[0] // pick first const challenge = u8a.toString( @@ -116,7 +118,7 @@ export class MockAuthenticator { // assuming that the encode does not either. // The offset in authenticator data is static, // so we use a live sample and inject the test-key to satisfy utils.js#decodeAuthenticatorData(). -function mkAuthData(pk) { +function mkAuthData(pk: Uint8Array) { const authDataCreate = 'f689f6b7489197aacf01172f02a82e0715f72aff70d5f758b9b0f7d3999978d2c5000000020000000000000000000000000000000000309face7743395482aefb4e1a67134641cdea3529c5752594090f26252e2198e4a0c547a4b0bd2fa346500e47cdf9c58f6a50102032620012158209face7743395482aefb4e1a671aafbf1566cc099f7647db230952bc169f43f9c2258203462f7968f7824f955570f3453280452948cccf132f03f369a2e834546649a78a16b6372656450726f7465637402' const buffer = u8a.fromString(authDataCreate, 'hex') @@ -132,23 +134,25 @@ function mkAuthData(pk) { } // node:Buffer to Uint8Array -function bufToU8(b) { +function bufToU8(b: Buffer | Uint8Array | ArrayBuffer) { if (b instanceof Uint8Array || b instanceof ArrayBuffer) return b // no conversion needed + // @ts-ignore Buffer check return new Uint8Array(b.buffer.slice(b.offset, b.offset + b.length)) } -function hash(m) { +function hash(m: Uint8Array | string) { return p256.CURVE.hash(m) } -// Stub navigator.credentials for nodeJS -// @ts-ignore -globalThis.location ??= {} -// @ts-ignore -globalThis.location.hostname = 'http://localhost' -// @ts-ignore -globalThis.navigator ??= {} -// @ts-ignore -globalThis.navigator.credentials = new MockAuthenticator() +export function injectMockBrowserGlobals(hostname = 'localhost') { + // @ts-ignore + globalThis.location ??= {} + // @ts-ignore + globalThis.location.hostname = hostname + // @ts-ignore + globalThis.navigator ??= {} + // @ts-ignore + globalThis.navigator.credentials = new MockAuthenticator() +} export async function getAuthMethod(): Promise { const did = await WebauthnAuth.createDID('test') diff --git a/packages/test-vectors/scripts/utils/webcrypto.ts b/packages/test-utils/src/webcrypto.ts similarity index 92% rename from packages/test-vectors/scripts/utils/webcrypto.ts rename to packages/test-utils/src/webcrypto.ts index 54252d6..43c05be 100644 --- a/packages/test-vectors/scripts/utils/webcrypto.ts +++ b/packages/test-utils/src/webcrypto.ts @@ -2,6 +2,8 @@ import { WebcryptoProvider } from '@didtools/key-webcrypto' import { DID } from 'dids' import { getResolver } from 'key-did-resolver' +// Key pairs used for tests + const PUBLIC_ED25519_JWK = { key_ops: ['verify'], ext: true, @@ -34,7 +36,7 @@ const P256_IMPORT_PARAMS: EcKeyImportParams = { namedCurve: 'P-256', } -async function importKey( +export async function importKey( jwk: JsonWebKey, algorithm: AlgorithmIdentifier | EcKeyImportParams, usage: KeyUsage, @@ -58,8 +60,9 @@ export async function getP256KeyPair(): Promise { return { privateKey, publicKey } } -export async function getP256KeyDID(): Promise { - const keyPair = await getP256KeyPair() +export async function getAuthenticatedDID( + keyPair: CryptoKeyPair, +): Promise { const did = new DID({ provider: new WebcryptoProvider(keyPair), resolver: getResolver(), diff --git a/packages/test-utils/test/lib.test.ts b/packages/test-utils/test/lib.test.ts index 72eadca..af78948 100644 --- a/packages/test-utils/test/lib.test.ts +++ b/packages/test-utils/test/lib.test.ts @@ -1,11 +1,8 @@ import { Cacao } from '@didtools/cacao' import { getEIP191Verifier } from '@didtools/pkh-ethereum' import { DIDSession } from 'did-session' -import { privateKeyToAccount } from 'viem/accounts' -import { EthereumDID, generatePrivateKey } from '../src/index.js' -import { createProvider, getAccount } from '../src/provider.js' -import { createAuthMethod } from '../src/siwe.js' +import { createSession, ethereum } from '../src/index.js' import type { AuthOptions } from '../src/types.js' const defaultOptions: AuthOptions = { @@ -13,74 +10,29 @@ const defaultOptions: AuthOptions = { resources: ['test'], } -test('EthereumDID.fromProvider() creates the EthereumDID instance using the provider', async () => { - const privateKey = generatePrivateKey() - const did = await EthereumDID.fromProvider( - createProvider(privateKey), - defaultOptions, - ) - expect(did).toBeInstanceOf(EthereumDID) - const address = privateKeyToAccount(privateKey).address.toLowerCase() - expect(did.id).toBe(`did:pkh:eip155:1:${address}`) -}) - -test('EthereumDID.fromPrivateKey() creates the EthereumDID instance using the private key', async () => { - const privateKey = generatePrivateKey() - const did = await EthereumDID.fromPrivateKey(privateKey, defaultOptions) - expect(did).toBeInstanceOf(EthereumDID) - const address = privateKeyToAccount(privateKey).address.toLowerCase() - expect(did.id).toBe(`did:pkh:eip155:1:${address}`) -}) - -describe('EthereumDID', () => { - test('constructor throws if no resource is provided', async () => { - const provider = createProvider(generatePrivateKey()) - const accountId = await getAccount(provider) - const authMethod = await createAuthMethod(provider, accountId) - expect(() => { - new EthereumDID({ - accountId, - authMethod, - authOptions: { domain: 'test', resources: [] }, - }) - }).toThrow( - 'The "resources" array of the authorization options must contain at least one item', - ) - }) - +describe('Sessions', () => { test('createSession() method creates a DIDSession', async () => { - const factory = await EthereumDID.random(defaultOptions) - const session1 = await factory.createSession() + const authMethod = await ethereum.authMethodFromRandomKey() + const session1 = await createSession(authMethod, defaultOptions) expect(session1).toBeInstanceOf(DIDSession) - expect(session1.id).toBe(factory.id) - const session2 = await factory.createSession() - expect(session2.id).toBe(factory.id) + const session2 = await createSession(authMethod, defaultOptions) + expect(session2.id).toBe(session1.id) expect(session2.did.id).not.toBe(session1.did.id) }) -}) - -test('Session signing can be verified', async () => { - const verifiers = getEIP191Verifier() - const provider = createProvider(generatePrivateKey()) - const accountId = await getAccount(provider) - const authMethod = await createAuthMethod(provider, accountId) - - const eth = new EthereumDID({ - accountId, - authMethod, - authOptions: defaultOptions, - }) - const session = await eth.createSession() - expect(session.id).toBe(session.did.parent) - expect(session.id).toBe(eth.id) - const result = await session.did.createDagJWS({ test: true }) - // biome-ignore lint/style/noNonNullAssertion: existing value - const capability = await Cacao.fromBlockBytes(result.cacaoBlock!) - const verified = await session.did.verifyJWS(result.jws, { - capability, - issuer: session.id, - verifiers, + test('Session signing can be verified', async () => { + const authMethod = await ethereum.authMethodFromRandomKey() + const session = await createSession(authMethod, defaultOptions) + expect(session.id).toBe(session.did.parent) + + const result = await session.did.createDagJWS({ test: true }) + // biome-ignore lint/style/noNonNullAssertion: existing value + const capability = await Cacao.fromBlockBytes(result.cacaoBlock!) + const verified = await session.did.verifyJWS(result.jws, { + capability, + issuer: session.id, + verifiers: getEIP191Verifier(), + }) + expect(verified).toBeDefined() }) - expect(verified).toBeDefined() }) diff --git a/packages/test-vectors/assets/key-ecdsa-p256.car b/packages/test-vectors/assets/key-ecdsa-p256.car index c5cee30..64230be 100644 Binary files a/packages/test-vectors/assets/key-ecdsa-p256.car and b/packages/test-vectors/assets/key-ecdsa-p256.car differ diff --git a/packages/test-vectors/assets/pkh-ethereum.car b/packages/test-vectors/assets/pkh-ethereum.car index fdbd9a3..2156826 100644 Binary files a/packages/test-vectors/assets/pkh-ethereum.car and b/packages/test-vectors/assets/pkh-ethereum.car differ diff --git a/packages/test-vectors/assets/pkh-solana.car b/packages/test-vectors/assets/pkh-solana.car index d16669b..f56c152 100644 Binary files a/packages/test-vectors/assets/pkh-solana.car and b/packages/test-vectors/assets/pkh-solana.car differ diff --git a/packages/test-vectors/assets/pkh-webauthn.car b/packages/test-vectors/assets/pkh-webauthn.car index b2c94ad..11868bc 100644 Binary files a/packages/test-vectors/assets/pkh-webauthn.car and b/packages/test-vectors/assets/pkh-webauthn.car differ diff --git a/packages/test-vectors/package.json b/packages/test-vectors/package.json index 3b3a488..c7f9eb3 100644 --- a/packages/test-vectors/package.json +++ b/packages/test-vectors/package.json @@ -52,15 +52,8 @@ "@didtools/key-webcrypto": "^0.2.0", "@didtools/pkh-ethereum": "^0.6.0", "@didtools/pkh-solana": "^0.2.0", - "@noble/curves": "^1.5.0", - "@solana/signers": "^2.0.0-rc.1", - "caip": "^1.1.1", - "cborg": "^4.2.3", - "did-session": "^4.0.0", "dids": "^5.0.2", - "key-did-resolver": "^4.0.0", - "multiformats": "^13.1.1", - "uint8arrays": "^5.1.0" + "multiformats": "^13.1.1" }, "jest": { "extensionsToTreatAsEsm": [".ts"], diff --git a/packages/test-vectors/scripts/create-test-vectors.ts b/packages/test-vectors/scripts/create-test-vectors.ts index 36f1db2..1238e3f 100644 --- a/packages/test-vectors/scripts/create-test-vectors.ts +++ b/packages/test-vectors/scripts/create-test-vectors.ts @@ -1,132 +1,32 @@ import { InitEventPayload, - type SignedEvent, signEvent, signedEventToCAR, } from '@ceramic-sdk/events' -import { CommitID, StreamID } from '@ceramic-sdk/identifiers' +import { CommitID } from '@ceramic-sdk/identifiers' import { createDataEventPayload, createInitHeader, getDeterministicInitEvent, } from '@ceramic-sdk/model-instance-client' import { getStreamID } from '@ceramic-sdk/model-instance-protocol' -import type { AuthMethod, Cacao } from '@didtools/cacao' +import { webauthn } from '@ceramic-sdk/test-utils' import type { IBlock } from 'cartonne' import type { CreateJWSOptions, DID } from 'dids' import type { ControllerType } from '../src/index.ts' import { createCAR } from './utils/car.ts' -import { - createCapabilityDID, - createExpiredCapabilityDID, - keyDID, -} from './utils/did.ts' -import { getAuthMethod as getEthereumAuth } from './utils/ethereum.ts' +import { controllerFactories } from './utils/controllers.ts' import { writeCARFile } from './utils/fs.ts' -import { getAuthMethod as getSolanaAuth } from './utils/solana.ts' -import { getAuthMethod as getWebAuthnAuth } from './utils/webauthn.ts' -import { getP256KeyDID } from './utils/webcrypto.ts' - -function changeEventSignature(event: SignedEvent): SignedEvent { - const [firstSignature, ...otherSignatures] = event.jws.signatures - return { - ...event, - jws: { - ...event.jws, - signatures: [ - { - ...firstSignature, - signature: `${firstSignature.signature.slice(0, -4)}AAAA`, - }, - ...otherSignatures, - ], - }, - } -} - -function changeCapabilitySignature(cacao: Cacao): Cacao { - // biome-ignore lint/style/noNonNullAssertion: existing value - const signature = cacao.s! - return { ...cacao, s: { ...signature, s: `${signature.s.slice(0, -4)}AAAA` } } -} - -const MODEL_ID = - 'k2t6wz4z9kggqqnbn3vqggh2z4fe9jctr9vvbc1em2yho0qnzzrtzz1n2hr4lq' -const model = StreamID.fromString(MODEL_ID) - -type ControllerCommon = { - id: string - signer: DID -} - -type ControllerWithoutCapability = ControllerCommon & { withCapability: false } - -type ControllerWithCapability = ControllerCommon & { - withCapability: true - expiredSigner: DID - noResourceSigner: DID - expectedModelSigner: DID - otherModelSigner: DID -} - -type Controller = ControllerWithoutCapability | ControllerWithCapability - -async function createCapabilityController( - authMethod: AuthMethod, -): Promise { - const [ - signer, - expiredSigner, - noResourceSigner, - expectedModelSigner, - otherModelSigner, - ] = await Promise.all([ - createCapabilityDID(authMethod, { resources: ['ceramic://*'] }), - createExpiredCapabilityDID(authMethod, { resources: ['ceramic://*'] }), - createCapabilityDID(authMethod, { resources: [] }), - createCapabilityDID(authMethod, { - resources: [`ceramic://*?model=${MODEL_ID}`], - }), - createCapabilityDID(authMethod, { - resources: [ - 'ceramic://*?model=k2t6wz4z9kggqqnbn3vqggh2z4fe9jctr9vvbc1em2yho0qnzzrtzz1n2hr4lr', - ], - }), - ]) - return { - withCapability: true, - id: signer.id, - signer, - expiredSigner, - noResourceSigner, - expectedModelSigner, - otherModelSigner, - } -} +import { + changeCapabilitySignature, + changeEventSignature, +} from './utils/signatures.ts' +import { testModel } from './utils/streams.ts' -const controllerFactories = { - 'key-ecdsa-p256': async () => { - const signer = await getP256KeyDID() - return { withCapability: false, id: signer.id, signer } - }, - 'key-ed25519': () => { - return { withCapability: false, id: keyDID.id, signer: keyDID } - }, - 'pkh-ethereum': async () => { - const authMethod = await getEthereumAuth() - return await createCapabilityController(authMethod) - }, - 'pkh-solana': async () => { - const authMethod = await getSolanaAuth() - return await createCapabilityController(authMethod) - }, - 'pkh-webauthn': async () => { - const authMethod = await getWebAuthnAuth() - return await createCapabilityController(authMethod) - }, -} satisfies Record Controller | Promise> +// Inject mock WebAuthn authenticator +webauthn.injectMockBrowserGlobals() for (const [controllerType, createController] of Object.entries( controllerFactories, @@ -136,7 +36,7 @@ for (const [controllerType, createController] of Object.entries( // Deterministic (init) event const validDeterministicEvent = getDeterministicInitEvent( - model, + testModel, controller.id, ) @@ -145,7 +45,7 @@ for (const [controllerType, createController] of Object.entries( data: { test: true }, header: createInitHeader({ controller: controller.id, - model, + model: testModel, unique: new Uint8Array([0, 1, 2, 3]), }), }) @@ -177,7 +77,7 @@ for (const [controllerType, createController] of Object.entries( ] const carMeta: Record = { controller: controller.id, - model: model.bytes, + model: testModel.bytes, validInitEvent: validInitCAR.roots[0], validDataEvent: validDataCAR.roots[0], invalidInitEventSignature: invalidInitSignatureCAR.roots[0], diff --git a/packages/test-vectors/scripts/utils/controllers.ts b/packages/test-vectors/scripts/utils/controllers.ts new file mode 100644 index 0000000..0afd1a3 --- /dev/null +++ b/packages/test-vectors/scripts/utils/controllers.ts @@ -0,0 +1,92 @@ +import { + createCapabilityDID, + createExpiredCapabilityDID, + ethereum, + solana, + webauthn, + webcrypto, +} from '@ceramic-sdk/test-utils' +import type { AuthMethod } from '@didtools/cacao' +import { getAuthenticatedDID } from '@didtools/key-did' +import type { DID } from 'dids' + +import type { ControllerType } from '../../src/index.ts' + +import { TEST_MODEL_ID } from './streams.js' + +const keyDID = await getAuthenticatedDID(new Uint8Array(32)) + +type ControllerCommon = { + id: string + signer: DID +} + +type ControllerWithoutCapability = ControllerCommon & { withCapability: false } + +type ControllerWithCapability = ControllerCommon & { + withCapability: true + expiredSigner: DID + noResourceSigner: DID + expectedModelSigner: DID + otherModelSigner: DID +} + +type Controller = ControllerWithoutCapability | ControllerWithCapability + +async function createCapabilityController( + authMethod: AuthMethod, +): Promise { + const [ + signer, + expiredSigner, + noResourceSigner, + expectedModelSigner, + otherModelSigner, + ] = await Promise.all([ + createCapabilityDID(keyDID, authMethod, { resources: ['ceramic://*'] }), + createExpiredCapabilityDID(keyDID, authMethod, { + resources: ['ceramic://*'], + }), + createCapabilityDID(keyDID, authMethod, { resources: [] }), + createCapabilityDID(keyDID, authMethod, { + resources: [`ceramic://*?model=${TEST_MODEL_ID}`], + }), + createCapabilityDID(keyDID, authMethod, { + resources: [ + 'ceramic://*?model=k2t6wz4z9kggqqnbn3vqggh2z4fe9jctr9vvbc1em2yho0qnzzrtzz1n2hr4lr', + ], + }), + ]) + return { + withCapability: true, + id: signer.id, + signer, + expiredSigner, + noResourceSigner, + expectedModelSigner, + otherModelSigner, + } +} + +export const controllerFactories = { + 'key-ecdsa-p256': async () => { + const keyPair = await webcrypto.getP256KeyPair() + const signer = await webcrypto.getAuthenticatedDID(keyPair) + return { withCapability: false, id: signer.id, signer } + }, + 'key-ed25519': () => { + return { withCapability: false, id: keyDID.id, signer: keyDID } + }, + 'pkh-ethereum': async () => { + const authMethod = await ethereum.getAuthMethod() + return await createCapabilityController(authMethod) + }, + 'pkh-solana': async () => { + const authMethod = await solana.getAuthMethod() + return await createCapabilityController(authMethod) + }, + 'pkh-webauthn': async () => { + const authMethod = await webauthn.getAuthMethod() + return await createCapabilityController(authMethod) + }, +} satisfies Record Controller | Promise> diff --git a/packages/test-vectors/scripts/utils/ethereum.ts b/packages/test-vectors/scripts/utils/ethereum.ts deleted file mode 100644 index 2902023..0000000 --- a/packages/test-vectors/scripts/utils/ethereum.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { - type Hex, - createAuthMethod, - createProvider, - getAccount, -} from '@ceramic-sdk/test-utils' -import type { AuthMethod } from '@didtools/cacao' - -const PRIVATE_KEY = - '0xe50df915de22bad5bf1abf43f78b55d64640afdcdfa6b1699a514d97662b23f7' as Hex - -export async function getAuthMethod(): Promise { - const provider = createProvider(PRIVATE_KEY) - const accountId = await getAccount(provider) - return createAuthMethod(provider, accountId) -} diff --git a/packages/test-vectors/scripts/utils/signatures.ts b/packages/test-vectors/scripts/utils/signatures.ts new file mode 100644 index 0000000..db9598f --- /dev/null +++ b/packages/test-vectors/scripts/utils/signatures.ts @@ -0,0 +1,25 @@ +import type { SignedEvent } from '@ceramic-sdk/events' +import type { Cacao } from '@didtools/cacao' + +export function changeEventSignature(event: SignedEvent): SignedEvent { + const [firstSignature, ...otherSignatures] = event.jws.signatures + return { + ...event, + jws: { + ...event.jws, + signatures: [ + { + ...firstSignature, + signature: `${firstSignature.signature.slice(0, -4)}AAAA`, + }, + ...otherSignatures, + ], + }, + } +} + +export function changeCapabilitySignature(cacao: Cacao): Cacao { + // biome-ignore lint/style/noNonNullAssertion: existing value + const signature = cacao.s! + return { ...cacao, s: { ...signature, s: `${signature.s.slice(0, -4)}AAAA` } } +} diff --git a/packages/test-vectors/scripts/utils/streams.ts b/packages/test-vectors/scripts/utils/streams.ts new file mode 100644 index 0000000..882de88 --- /dev/null +++ b/packages/test-vectors/scripts/utils/streams.ts @@ -0,0 +1,6 @@ +import { StreamID } from '@ceramic-sdk/identifiers' + +export const TEST_MODEL_ID = + 'k2t6wz4z9kggqqnbn3vqggh2z4fe9jctr9vvbc1em2yho0qnzzrtzz1n2hr4lq' + +export const testModel = StreamID.fromString(TEST_MODEL_ID) diff --git a/packages/test-vectors/test/vectors.test.ts b/packages/test-vectors/test/vectors.test.ts index ac84f3e..f790b26 100644 --- a/packages/test-vectors/test/vectors.test.ts +++ b/packages/test-vectors/test/vectors.test.ts @@ -9,6 +9,7 @@ import { DocumentDataEventPayload, DocumentInitEventPayload, } from '@ceramic-sdk/model-instance-protocol' +import { webauthn } from '@ceramic-sdk/test-utils' import { Cacao } from '@didtools/cacao' import { createDID } from '@didtools/key-did' import { WebauthnAuth } from '@didtools/key-webauthn' @@ -17,7 +18,7 @@ import { getSolanaVerifier } from '@didtools/pkh-solana' import type { CAR } from 'cartonne' // Inject mock WebAuthn authenticator -import '../scripts/utils/webauthn.ts' +webauthn.injectMockBrowserGlobals() import { type ArchiveRootContentCommon, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 58109c6..d74473e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -16,13 +16,13 @@ importers: version: 29.7.0 '@swc/cli': specifier: ^0.4.0 - version: 0.4.0(@swc/core@1.7.18)(chokidar@3.6.0) + version: 0.4.0(@swc/core@1.7.22)(chokidar@3.6.0) '@swc/core': - specifier: ^1.7.11 - version: 1.7.18 + specifier: ^1.7.22 + version: 1.7.22 '@swc/jest': specifier: ^0.2.36 - version: 0.2.36(@swc/core@1.7.18) + version: 0.2.36(@swc/core@1.7.22) '@types/jest': specifier: ^29.5.12 version: 29.5.12 @@ -66,26 +66,26 @@ importers: specifier: ^1.0.0 version: 1.0.0(typescript@5.5.4)(zod@3.23.8) '@mantine/core': - specifier: ^7.11.2 - version: 7.12.1(@mantine/hooks@7.12.1(react@18.3.1))(@types/react@18.3.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^7.12.2 + version: 7.12.2(@mantine/hooks@7.12.2(react@18.3.1))(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mantine/hooks': - specifier: ^7.11.2 - version: 7.12.1(react@18.3.1) + specifier: ^7.12.2 + version: 7.12.2(react@18.3.1) '@tabler/icons-react': specifier: ^3.14.0 version: 3.14.0(react@18.3.1) '@tanstack/react-query': - specifier: ^5.52.2 - version: 5.52.2(react@18.3.1) + specifier: ^5.53.1 + version: 5.53.1(react@18.3.1) '@tanstack/react-router': - specifier: ^1.51.2 - version: 1.51.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^1.51.6 + version: 1.51.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) codeco: - specifier: ^1.4.2 - version: 1.4.2 + specifier: ^1.4.3 + version: 1.4.3 jotai: specifier: ^2.9.2 - version: 2.9.3(@types/react@18.3.4)(react@18.3.1) + version: 2.9.3(@types/react@18.3.5)(react@18.3.1) multiformats: specifier: ^13.2.2 version: 13.2.2 @@ -103,14 +103,14 @@ importers: specifier: workspace:^ version: link:../../packages/model-instance-client '@tanstack/router-devtools': - specifier: ^1.51.2 - version: 1.51.2(@tanstack/react-router@1.51.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(csstype@3.1.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^1.51.6 + version: 1.51.6(@tanstack/react-router@1.51.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(csstype@3.1.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@tanstack/router-plugin': - specifier: ^1.51.0 - version: 1.51.0(vite@5.4.2(@types/node@22.5.1)(sugarss@4.0.1(postcss@8.4.41))) + specifier: ^1.51.6 + version: 1.51.6(vite@5.4.2(@types/node@22.5.1)(sugarss@4.0.1(postcss@8.4.41))) '@types/react': - specifier: ^18.3.3 - version: 18.3.4 + specifier: ^18.3.5 + version: 18.3.5 '@types/react-dom': specifier: ^18.3.0 version: 18.3.0 @@ -154,8 +154,8 @@ importers: specifier: ^3.0.1 version: 3.0.1 codeco: - specifier: ^1.4.2 - version: 1.4.2 + specifier: ^1.4.3 + version: 1.4.3 dag-jose: specifier: ^5.1.1 version: 5.1.1 @@ -185,21 +185,21 @@ importers: specifier: workspace:^ version: link:../events openapi-fetch: - specifier: ^0.11.1 - version: 0.11.1 + specifier: ^0.11.3 + version: 0.11.3 devDependencies: cartonne: specifier: ^3.0.1 version: 3.0.1 codeco: - specifier: ^1.4.2 - version: 1.4.2 + specifier: ^1.4.3 + version: 1.4.3 multiformats: specifier: ^13.2.2 version: 13.2.2 openapi-typescript: - specifier: ^7.3.0 - version: 7.3.0(typescript@5.5.4) + specifier: ^7.3.3 + version: 7.3.3(typescript@5.5.4) type-fest: specifier: ^4.26.0 version: 4.26.0 @@ -210,8 +210,8 @@ importers: specifier: ^9.2.1 version: 9.2.1 codeco: - specifier: ^1.4.2 - version: 1.4.2 + specifier: ^1.4.3 + version: 1.4.3 mapmoize: specifier: ^1.2.1 version: 1.2.1 @@ -350,8 +350,8 @@ importers: specifier: ^3.0.1 version: 3.0.1(ajv@8.17.1) codeco: - specifier: ^1.4.2 - version: 1.4.2 + specifier: ^1.4.3 + version: 1.4.3 fast-json-patch: specifier: ^3.1.1 version: 3.1.1 @@ -390,8 +390,8 @@ importers: specifier: ^3.0.0 version: 3.0.0 codeco: - specifier: ^1.4.2 - version: 1.4.2 + specifier: ^1.4.3 + version: 1.4.3 object-sizeof: specifier: ^2.6.4 version: 2.6.5 @@ -424,8 +424,8 @@ importers: specifier: ^3.0.1 version: 3.0.1(ajv@8.17.1) codeco: - specifier: ^1.4.2 - version: 1.4.2 + specifier: ^1.4.3 + version: 1.4.3 json-ptr: specifier: ^3.1.1 version: 3.1.1 @@ -448,21 +448,48 @@ importers: '@didtools/cacao': specifier: ^3.0.1 version: 3.0.1(typescript@5.5.4)(zod@3.23.8) + '@didtools/key-webauthn': + specifier: ^2.0.2 + version: 2.0.2(typescript@5.5.4)(zod@3.23.8) + '@didtools/key-webcrypto': + specifier: ^0.2.0 + version: 0.2.0 + '@didtools/pkh-solana': + specifier: ^0.2.0 + version: 0.2.0(typescript@5.5.4)(zod@3.23.8) + '@noble/curves': + specifier: ^1.5.0 + version: 1.5.0 '@noble/hashes': specifier: ^1.4.0 version: 1.4.0 + '@solana/signers': + specifier: ^2.0.0-rc.1 + version: 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4) caip: specifier: ^1.1.1 version: 1.1.1 + cborg: + specifier: ^4.2.3 + version: 4.2.3 did-session: specifier: ^4.0.0 version: 4.0.0(typescript@5.5.4)(zod@3.23.8) dids: specifier: ^5.0.2 version: 5.0.2(typescript@5.5.4)(zod@3.23.8) + key-did-resolver: + specifier: ^4.0.0 + version: 4.0.0 + multiformats: + specifier: ^13.2.2 + version: 13.2.2 + uint8arrays: + specifier: ^5.1.0 + version: 5.1.0 viem: - specifier: ^2.20.1 - version: 2.20.1(typescript@5.5.4)(zod@3.23.8) + specifier: ^2.21.0 + version: 2.21.0(typescript@5.5.4)(zod@3.23.8) devDependencies: '@didtools/pkh-ethereum': specifier: ^0.6.0 @@ -519,33 +546,12 @@ importers: '@didtools/pkh-solana': specifier: ^0.2.0 version: 0.2.0(typescript@5.5.4)(zod@3.23.8) - '@noble/curves': - specifier: ^1.5.0 - version: 1.5.0 - '@solana/signers': - specifier: ^2.0.0-rc.1 - version: 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4) - caip: - specifier: ^1.1.1 - version: 1.1.1 - cborg: - specifier: ^4.2.3 - version: 4.2.3 - did-session: - specifier: ^4.0.0 - version: 4.0.0(typescript@5.5.4)(zod@3.23.8) dids: specifier: ^5.0.2 version: 5.0.2(typescript@5.5.4)(zod@3.23.8) - key-did-resolver: - specifier: ^4.0.0 - version: 4.0.0 multiformats: specifier: ^13.1.1 version: 13.2.2 - uint8arrays: - specifier: ^5.1.0 - version: 5.1.0 tests/c1-integration: dependencies: @@ -606,8 +612,8 @@ packages: resolution: {integrity: sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==} engines: {node: '>=6.9.0'} - '@babel/generator@7.25.5': - resolution: {integrity: sha512-abd43wyLfbWoxC6ahM8xTkqLpGB2iWBVyuKC9/srhFunCd1SDNrV1s72bBpK4hLj8KLzHBBcOblvLQZBNw9r3w==} + '@babel/generator@7.25.6': + resolution: {integrity: sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==} engines: {node: '>=6.9.0'} '@babel/helper-compilation-targets@7.25.2': @@ -662,6 +668,11 @@ packages: engines: {node: '>=6.0.0'} hasBin: true + '@babel/parser@7.25.6': + resolution: {integrity: sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==} + engines: {node: '>=6.0.0'} + hasBin: true + '@babel/plugin-syntax-async-generators@7.8.4': resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: @@ -741,8 +752,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/runtime@7.25.4': - resolution: {integrity: sha512-DSgLeL/FNcpXuzav5wfYvHCGvynXkJbn3Zvc3823AEe9nPwW9IK4UoCSS5yGymmQzN0pCPvivtgS6/8U2kkm1w==} + '@babel/runtime@7.25.6': + resolution: {integrity: sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ==} engines: {node: '>=6.9.0'} '@babel/template@7.25.0': @@ -753,8 +764,8 @@ packages: resolution: {integrity: sha512-HefgyP1x754oGCsKmV5reSmtV7IXj/kpaE1XYY+D9G5PvKKoFfSbiS4M77MdjuwlZKDIKFCffq9rPU+H/s3ZdQ==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.25.4': - resolution: {integrity: sha512-VJ4XsrD+nOvlXyLzmLzUs/0qjFS4sK30te5yEFlvbbUNEgKaVb2BHZUpAL+ttLPQAHNrsI3zZisbfha5Cvr8vg==} + '@babel/traverse@7.25.6': + resolution: {integrity: sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ==} engines: {node: '>=6.9.0'} '@babel/types@7.25.2': @@ -765,6 +776,10 @@ packages: resolution: {integrity: sha512-zQ1ijeeCXVEh+aNL0RlmkPkG8HUiDcU2pzQQFjtbntgAczRASFzj4H+6+bV+dy1ntKR14I/DypeuRG1uma98iQ==} engines: {node: '>=6.9.0'} + '@babel/types@7.25.6': + resolution: {integrity: sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==} + engines: {node: '>=6.9.0'} + '@bcoe/v8-coverage@0.2.3': resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} @@ -1267,15 +1282,15 @@ packages: '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} - '@mantine/core@7.12.1': - resolution: {integrity: sha512-PXKIDaT1fpNB77dPQIcdFGM2NRnfmsJSVx3uuBccngBQWMIWI0wPyiO1Y26DK4LQrbrypeb+TS+Zxpgx6RoiCA==} + '@mantine/core@7.12.2': + resolution: {integrity: sha512-FrMHOKq4s3CiPIxqZ9xnVX7H4PEGNmbtHMvWO/0YlfPgoV0Er/N/DNJOFW1ys4WSnidPTayYeB41riyxxGOpRQ==} peerDependencies: - '@mantine/hooks': 7.12.1 + '@mantine/hooks': 7.12.2 react: ^18.2.0 react-dom: ^18.2.0 - '@mantine/hooks@7.12.1': - resolution: {integrity: sha512-YPA3qiMHJkWID5+YzakBaLvjHtX3Fg3PdPY49iIb/CaWM9+lrJ+77TOVS7bsY7ZTBHXUfzft1/6Woqt3xSuweA==} + '@mantine/hooks@7.12.2': + resolution: {integrity: sha512-dVMw8jpM0hAzc8e7/GNvzkk9N0RN/m+PKycETB3H6lJGuXJJSRR4wzzgQKpEhHwPccktDpvb4rkukKDq2jA8Fg==} peerDependencies: react: ^18.2.0 @@ -1295,9 +1310,6 @@ packages: '@noble/curves@1.4.0': resolution: {integrity: sha512-p+4cb332SFCrReJkCYe8Xzm0OWi4Jji5jVdIZRL/PmacmDkFNw6MrrV+gGpiPxLHbV+zKFRywUWbaseT+tZRXg==} - '@noble/curves@1.4.2': - resolution: {integrity: sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==} - '@noble/curves@1.5.0': resolution: {integrity: sha512-J5EKamIHnKPyClwVrzmaf5wSdQXgdHcPZIZLu3bwnbeCx8/7NPK5q2ZBWF+5FvYGByjiQQsJYX6jfgB2wDPn3A==} @@ -1324,11 +1336,11 @@ packages: '@redocly/ajv@8.11.0': resolution: {integrity: sha512-9GWx27t7xWhDIR02PA18nzBdLcKQRgc46xNQvjFkrYk4UOmvKhJ/dawwiX0cCOeetN5LcaaiqQbVOWYK62SGHw==} - '@redocly/config@0.7.0': - resolution: {integrity: sha512-6GKxTo/9df0654Mtivvr4lQnMOp+pRj9neVywmI5+BwfZLTtkJnj2qB3D6d8FHTr4apsNOf6zTa5FojX0Evh4g==} + '@redocly/config@0.10.1': + resolution: {integrity: sha512-H3LnKVGzOaxskwJu8pmJYwBOWjP61qOK7TuTrbafqArDVckE06fhA6l0nO4KvBbjLPjy1Al7UnlxOu23V4Nl0w==} - '@redocly/openapi-core@1.19.0': - resolution: {integrity: sha512-ezK6qr80sXvjDgHNrk/zmRs9vwpIAeHa0T/qmo96S+ib4ThQ5a8f3qjwEqxMeVxkxCTbkaY9sYSJKOxv4ejg5w==} + '@redocly/openapi-core@1.22.1': + resolution: {integrity: sha512-pjr456gJzrbwPvBjFKlWOd9nZEcr/dp6XSH0c8ijWGWv5K+V0vpUUy2zaTAVsFAoCydx1miEoOcbLhWQ9WC2nw==} engines: {node: '>=14.19.0', npm: '>=7.0.0'} '@rollup/rollup-android-arm-eabi@4.21.1': @@ -1534,68 +1546,68 @@ packages: chokidar: optional: true - '@swc/core-darwin-arm64@1.7.18': - resolution: {integrity: sha512-MwLc5U+VGPMZm8MjlFBjEB2wyT1EK0NNJ3tn+ps9fmxdFP+PL8EpMiY1O1F2t1ydy2OzBtZz81sycjM9RieFBg==} + '@swc/core-darwin-arm64@1.7.22': + resolution: {integrity: sha512-B2Bh2W+C7ALdGwDxRWAJ+UtNExfozvwyayGiNkbR3wmDKXXeQfhGM5MK+QYUWKu7UQ6ATq69OyZrxofDobKUug==} engines: {node: '>=10'} cpu: [arm64] os: [darwin] - '@swc/core-darwin-x64@1.7.18': - resolution: {integrity: sha512-IkukOQUw7/14VkHp446OkYGCZEHqZg9pTmTdBawlUyz2JwZMSn2VodCl7aFSdGCsU4Cwni8zKA8CCgkCCAELhw==} + '@swc/core-darwin-x64@1.7.22': + resolution: {integrity: sha512-s34UQntnQ6tL9hS9aX3xG7OfGhpmy05FEEndbHaooGO8O+L5k8uWxhE5KhYCOC0N803sGdZg6YZmKtYrWN/YxA==} engines: {node: '>=10'} cpu: [x64] os: [darwin] - '@swc/core-linux-arm-gnueabihf@1.7.18': - resolution: {integrity: sha512-ATnb6jJaBeXCqrTUawWdoOy7eP9SCI7UMcfXlYIMxX4otKKspLPAEuGA5RaNxlCcj9ObyO0J3YGbtZ6hhD2pjg==} + '@swc/core-linux-arm-gnueabihf@1.7.22': + resolution: {integrity: sha512-SE69+oos1jLOXx5YdMH//Qc5zQc2xYukajB+0BWmkcFd/S/cCanGWYtdSzYausm8af2Fw1hPJMNIfndJLnBDFw==} engines: {node: '>=10'} cpu: [arm] os: [linux] - '@swc/core-linux-arm64-gnu@1.7.18': - resolution: {integrity: sha512-poHtH7zL7lEp9K2inY90lGHJABWxURAOgWNeZqrcR5+jwIe7q5KBisysH09Zf/JNF9+6iNns+U0xgWTNJzBuGA==} + '@swc/core-linux-arm64-gnu@1.7.22': + resolution: {integrity: sha512-59FzDW/ojgiTj4dlnv3Z3ESuVlzhSAq9X12CNYh4/WTCNA8BoJqOnWMRQKspWtoNlnVviFLMvpek0pGXHndEBA==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@swc/core-linux-arm64-musl@1.7.18': - resolution: {integrity: sha512-qnNI1WmcOV7Wz1ZDyK6WrOlzLvJ01rnni8ec950mMHWkLRMP53QvCvhF3S+7gFplWBwWJTOOPPUqJp/PlSxWyQ==} + '@swc/core-linux-arm64-musl@1.7.22': + resolution: {integrity: sha512-cMQMI8YRO/XR3OrYuiUlWksNsJOZSkA6gSLNyH6eHTw+FOAzv05oJ4SFYe6s1WesrOqRwhpez6y5H6OIP/EKzg==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@swc/core-linux-x64-gnu@1.7.18': - resolution: {integrity: sha512-x9SCqCLzwtlqtD5At3I1a7Gco+EuXnzrJGoucmkpeQohshHuwa+cskqsXO6u1Dz0jXJEuHbBZB9va1wYYfjgFg==} + '@swc/core-linux-x64-gnu@1.7.22': + resolution: {integrity: sha512-639kA7MXrWqWYfwuSJ+XTg21VYb/5o99R1zJrndoEjEX6m7Wza/sXssQKU5jbbkPoSEKVKNP3n/gazLWiUKgiQ==} engines: {node: '>=10'} cpu: [x64] os: [linux] - '@swc/core-linux-x64-musl@1.7.18': - resolution: {integrity: sha512-qtj8iOpMMgKjzxTv+islmEY0JBsbd93nka0gzcTTmGZxKtL5jSUsYQvkxwNPZr5M9NU1fgaR3n1vE6lFmtY0IQ==} + '@swc/core-linux-x64-musl@1.7.22': + resolution: {integrity: sha512-f3zfGgY8EJQUOk3ve25ZTkNkhB/kHo9QlN2r+0exaE1g9W7X8IS6J8pWzF3hJrV2P9dBi6ofMOt+opVA89JKHA==} engines: {node: '>=10'} cpu: [x64] os: [linux] - '@swc/core-win32-arm64-msvc@1.7.18': - resolution: {integrity: sha512-ltX/Ol9+Qu4SXmISCeuwVgAjSa8nzHTymknpozzVMgjXUoZMoz6lcynfKL1nCh5XLgqh0XNHUKLti5YFF8LrrA==} + '@swc/core-win32-arm64-msvc@1.7.22': + resolution: {integrity: sha512-p/Fav5U+LtTJD/tbbS0dKK8SVVAhXo5Jdm1TDeBPJ4BEIVguYBZEXgD3CW9wY4K34g1hscpiz2Q2rktfhFj1+A==} engines: {node: '>=10'} cpu: [arm64] os: [win32] - '@swc/core-win32-ia32-msvc@1.7.18': - resolution: {integrity: sha512-RgTcFP3wgyxnQbTCJrlgBJmgpeTXo8t807GU9GxApAXfpLZJ3swJ2GgFUmIJVdLWyffSHF5BEkF3FmF6mtH5AQ==} + '@swc/core-win32-ia32-msvc@1.7.22': + resolution: {integrity: sha512-HbmfasaCNTqeCTvDjleYj+jJZQ6MlraiVOdhW55KtbA9mAVQdPBq6DDAvR7VOero3wUNYUM/e36otFKgEJI5Rg==} engines: {node: '>=10'} cpu: [ia32] os: [win32] - '@swc/core-win32-x64-msvc@1.7.18': - resolution: {integrity: sha512-XbZ0wAgzR757+DhQcnv60Y/bK9yuWPhDNRQVFFQVRsowvK3+c6EblyfUSytIidpXgyYFzlprq/9A9ZlO/wvDWw==} + '@swc/core-win32-x64-msvc@1.7.22': + resolution: {integrity: sha512-lppIveE+hpe7WXny/9cUT+T6sBM/ND0E+dviKWJ5jFBISj2KWomlSJGUjYEsRGJVPnTEc8uOlKK7etmXBhQx9A==} engines: {node: '>=10'} cpu: [x64] os: [win32] - '@swc/core@1.7.18': - resolution: {integrity: sha512-qL9v5N5S38ijmqiQRvCFUUx2vmxWT/JJ2rswElnyaHkOHuVoAFhBB90Ywj4RKjh3R0zOjhEcemENTyF3q3G6WQ==} + '@swc/core@1.7.22': + resolution: {integrity: sha512-Asn79WKqyjEuO2VEeSnVjn2YiRMToRhFJwOsQeqftBvwWMn1FGUuzVcXtkQFBk37si8Gh2Vkk/+p0u4K5NxDig==} engines: {node: '>=10'} peerDependencies: '@swc/helpers': '*' @@ -1627,20 +1639,20 @@ packages: '@tabler/icons@3.14.0': resolution: {integrity: sha512-OakKjK1kuDWKoNwdnHHVMt11kTZAC10iZpN/8o/CSYdeBH7S3v5n8IyqAYynFxLI8yBGTyBvljtvWdmWh57zSg==} - '@tanstack/history@1.49.7': - resolution: {integrity: sha512-9e9e+QFeWve6rB5BWK9MR8/1BmQYd1LFmM5BYh1Ht15yLcyU0FoiPG4Iun9Coc3Obo1mA+NbYCoOYoSZ+h+9yw==} + '@tanstack/history@1.51.6': + resolution: {integrity: sha512-qx6HpTSDI8X6fQauiaAIHmCAEfK2m0nkED6A3WoLs0AUcnDhFiAlJ/0KGJjYnjWtiLL35LAVsHqL9ofpsm9yHA==} engines: {node: '>=12'} - '@tanstack/query-core@5.52.2': - resolution: {integrity: sha512-9vvbFecK4A0nDnrc/ks41e3UHONF1DAnGz8Tgbxkl59QcvKWmc0ewhYuIKRh8NC4ja5LTHT9EH16KHbn2AIYWA==} + '@tanstack/query-core@5.53.1': + resolution: {integrity: sha512-mvLG7s4Zy3Yvc2LsKm8BVafbmPrsReKgqwhmp4XKVmRW9us3KbWRqu3qBBfhVavcUUEHfNK7PvpTchvQpVdFpw==} - '@tanstack/react-query@5.52.2': - resolution: {integrity: sha512-d4OwmobpP+6+SvuAxW1RzAY95Pv87Gu+0GjtErzFOUXo+n0FGcwxKvzhswCsXKxsgnAr3bU2eJ2u+GXQAutkCQ==} + '@tanstack/react-query@5.53.1': + resolution: {integrity: sha512-35HU4836Ey1/W74BxmS8p9KHXcDRGPdkw6w3VX0Tc5S9v5acFl80oi/yc6nsmoLhu68wQkWMyX0h7y7cOtY5OA==} peerDependencies: react: ^18 || ^19 - '@tanstack/react-router@1.51.2': - resolution: {integrity: sha512-m4eIS4h8tGLtYJ6C75nKZe32yB8SjL23LUKlsJiEIMHkpkYMfsCI09qqEiPxL/5vEqVNNNS13LbAIzMiX8Yu3A==} + '@tanstack/react-router@1.51.6': + resolution: {integrity: sha512-Z/y8RD50vxZUnsKHJ1VP6U9fKRKwDBmJcM8eHsIbhM7fbhK2mKvYZsSWZNsNWxRT+nnzEXCF+6tU7FIq0EGhBg==} engines: {node: '>=12'} peerDependencies: react: '>=18' @@ -1652,20 +1664,20 @@ packages: react: ^17.0.0 || ^18.0.0 react-dom: ^17.0.0 || ^18.0.0 - '@tanstack/router-devtools@1.51.2': - resolution: {integrity: sha512-5ZE44al1dkluTdhL0YNh7aGpesM5Xc2XYKqOXMnyQ6qO+kMl/P/mgh/hRzycbKNC0zU5ywse3nt7QGEstNfTPw==} + '@tanstack/router-devtools@1.51.6': + resolution: {integrity: sha512-YWE5lpnkXqM1t8846rwOu1OpfUwO1uayvUgTCeAmlDX0OpBWVFupHjlRP0GZ3HMZpzPGmYOwqbd+QorWraYMMQ==} engines: {node: '>=12'} peerDependencies: - '@tanstack/react-router': ^1.51.2 + '@tanstack/react-router': ^1.51.6 react: '>=18' react-dom: '>=18' - '@tanstack/router-generator@1.51.0': - resolution: {integrity: sha512-X8bAXEhDnJ/NQuT8uqXj8URDKXi9FBPhnaxNcejmihVBNv81NrQ14nYzNdaS94esmc3hUFcARrpQLoX8hXgN0Q==} + '@tanstack/router-generator@1.51.6': + resolution: {integrity: sha512-iAzan/Z5pF/CAX1g6Ouc4QixRK77nlvSJECqeqzpYMkAzz07m2IybVN/piQzw4Vje0UMKfkO3GgBAHc1CG18vg==} engines: {node: '>=12'} - '@tanstack/router-plugin@1.51.0': - resolution: {integrity: sha512-Nck6r547pF4V1RZJcI9QmAsT6jAMsK1SxwCkHuyCIRQiTSO57CSOqDYNBf6gFin2EyGkbqhwLPSTl+DUhY6O0w==} + '@tanstack/router-plugin@1.51.6': + resolution: {integrity: sha512-wKtgsofslYDm4WCy9x7Fwm91Qtkznwvf1lAWvhO3115J6J3RXssf5Df28gW6HVeNxVLlK3yn32DBp6pIO24A/A==} engines: {node: '>=12'} peerDependencies: '@rsbuild/core': '>=1.0.0' @@ -1751,8 +1763,8 @@ packages: '@types/react-dom@18.3.0': resolution: {integrity: sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==} - '@types/react@18.3.4': - resolution: {integrity: sha512-J7W30FTdfCxDDjmfRM+/JqLHBIyl7xUIp9kwK637FGmY7+mkSFSe6L4jpZzhj5QMfLssSDP4/i75AKkrdC7/Jw==} + '@types/react@18.3.5': + resolution: {integrity: sha512-WeqMfGJLGuLCqHGYRGHxnKrXcTitc6L/nBUWfWPcTarG3t9PsquqUMuVeXZeca+mglY4Vo5GZjCi0A3Or2lnxA==} '@types/responselike@1.0.3': resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} @@ -2029,8 +2041,8 @@ packages: resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} - codeco@1.4.2: - resolution: {integrity: sha512-kMoa37m2g0JJT3VNiESLVZabq5zP/SwJ1Ds0eZIr48P+6J0mTtHdNSYlzA5MWFejeknhrCRJlRl5z+yc9Z1Y5g==} + codeco@1.4.3: + resolution: {integrity: sha512-NG2kuhCtCNVKWYEwhVb6yg1QU/hYbMUIsaJkxXGEypHQIBClAvMGQhiheEX6c4C9Dwi9L/UuzeO66Us3KrK1rA==} collect-v8-coverage@1.0.2: resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} @@ -2942,14 +2954,14 @@ packages: resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} engines: {node: '>=6'} - openapi-fetch@0.11.1: - resolution: {integrity: sha512-WtDQsrvxjXuCmo6u6WMQPfUaya8cLfL+ZCaXorPo9MMumqlU/Km/SrCXsEcJH234D4iykOkvJ6Q/iWBzK7+3rA==} + openapi-fetch@0.11.3: + resolution: {integrity: sha512-r18fERgpxFrI4pv79ABD1dqFetWz7pTfwRd7jQmRm/lFdCDpWF43kvHUiOqOZu+tWsMydDJMpJN1hlZ9inRvfA==} - openapi-typescript-helpers@0.0.12: - resolution: {integrity: sha512-FO+5kTWO6KDutigamr2MRwciYkAUYhqdctlyVRrQOe2uxif2/O2+GcS07jNnP36AUK6ubSsGu3GeBiYIc6eQzA==} + openapi-typescript-helpers@0.0.13: + resolution: {integrity: sha512-z44WK2e7ygW3aUtAtiurfEACohf/Qt9g6BsejmIYgEoY4REHeRzgFJmO3ium0libsuzPc145I+8lE9aiiZrQvQ==} - openapi-typescript@7.3.0: - resolution: {integrity: sha512-EkljRjYWOPwGXiK++uI9MkGv2Y7uhbkZbi9V1z3r3EpmWVO6aFTHXSLNvxIWo6UT6LCTYgEYkUB3BWQjwwXthg==} + openapi-typescript@7.3.3: + resolution: {integrity: sha512-NkUBI8fr5mg/3s001UPfUiBpKmHtSjkvFQO/IipCrQal5d5nGFoev1OXdxr7J9PHTswrAqU2hKdpoCL6OnammA==} hasBin: true peerDependencies: typescript: ^5.x @@ -3525,10 +3537,6 @@ packages: resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} engines: {node: '>=10'} - type-fest@4.25.0: - resolution: {integrity: sha512-bRkIGlXsnGBRBQRAY56UXBm//9qH4bmJfFvq83gSz41N282df+fjy8ofcEgc1sM8geNt5cl6mC2g9Fht1cs8Aw==} - engines: {node: '>=16'} - type-fest@4.26.0: resolution: {integrity: sha512-OduNjVJsFbifKb57UqZ2EMP1i4u64Xwow3NYXUtBbD4vIwJdQd4+xl8YDou1dlm4DVrtwT/7Ky8z8WyCULVfxw==} engines: {node: '>=16'} @@ -3635,8 +3643,8 @@ packages: typescript: optional: true - viem@2.20.1: - resolution: {integrity: sha512-a/BSe25TSfkc423GTSKYl1O0ON2J5huoQeOLkylHT1WS8wh3JFqb8nfAq7vg+aZ+W06BCTn36bbi47yp4D92Cg==} + viem@2.21.0: + resolution: {integrity: sha512-9g3Gw2nOU6t4bNuoDI5vwVExzIxseU0J7Jjx10gA2RNQVrytIrLxggW++tWEe3w4mnnm/pS1WgZFjQ/QKf/nHw==} peerDependencies: typescript: '>=5.0.4' peerDependenciesMeta: @@ -3815,9 +3823,9 @@ snapshots: '@jridgewell/trace-mapping': 0.3.25 jsesc: 2.5.2 - '@babel/generator@7.25.5': + '@babel/generator@7.25.6': dependencies: - '@babel/types': 7.25.4 + '@babel/types': 7.25.6 '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 jsesc: 2.5.2 @@ -3882,6 +3890,10 @@ snapshots: dependencies: '@babel/types': 7.25.4 + '@babel/parser@7.25.6': + dependencies: + '@babel/types': 7.25.6 + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 @@ -3957,7 +3969,7 @@ snapshots: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - '@babel/runtime@7.25.4': + '@babel/runtime@7.25.6': dependencies: regenerator-runtime: 0.14.1 @@ -3979,13 +3991,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/traverse@7.25.4': + '@babel/traverse@7.25.6': dependencies: '@babel/code-frame': 7.24.7 - '@babel/generator': 7.25.5 - '@babel/parser': 7.25.4 + '@babel/generator': 7.25.6 + '@babel/parser': 7.25.6 '@babel/template': 7.25.0 - '@babel/types': 7.25.4 + '@babel/types': 7.25.6 debug: 4.3.6(supports-color@9.4.0) globals: 11.12.0 transitivePeerDependencies: @@ -4003,6 +4015,12 @@ snapshots: '@babel/helper-validator-identifier': 7.24.7 to-fast-properties: 2.0.0 + '@babel/types@7.25.6': + dependencies: + '@babel/helper-string-parser': 7.24.8 + '@babel/helper-validator-identifier': 7.24.7 + to-fast-properties: 2.0.0 + '@bcoe/v8-coverage@0.2.3': {} '@biomejs/biome@1.8.3': @@ -4066,7 +4084,7 @@ snapshots: '@didtools/codecs@3.0.0': dependencies: - codeco: 1.4.2 + codeco: 1.4.3 multiformats: 13.2.2 uint8arrays: 5.1.0 @@ -4145,7 +4163,7 @@ snapshots: '@didtools/siwx@2.0.0': dependencies: - codeco: 1.4.2 + codeco: 1.4.3 '@esbuild/aix-ppc64@0.21.5': optional: true @@ -4516,21 +4534,21 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 - '@mantine/core@7.12.1(@mantine/hooks@7.12.1(react@18.3.1))(@types/react@18.3.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@mantine/core@7.12.2(@mantine/hooks@7.12.2(react@18.3.1))(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@floating-ui/react': 0.26.23(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@mantine/hooks': 7.12.1(react@18.3.1) + '@mantine/hooks': 7.12.2(react@18.3.1) clsx: 2.1.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) react-number-format: 5.4.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react-remove-scroll: 2.5.10(@types/react@18.3.4)(react@18.3.1) - react-textarea-autosize: 8.5.3(@types/react@18.3.4)(react@18.3.1) - type-fest: 4.25.0 + react-remove-scroll: 2.5.10(@types/react@18.3.5)(react@18.3.1) + react-textarea-autosize: 8.5.3(@types/react@18.3.5)(react@18.3.1) + type-fest: 4.26.0 transitivePeerDependencies: - '@types/react' - '@mantine/hooks@7.12.1(react@18.3.1)': + '@mantine/hooks@7.12.2(react@18.3.1)': dependencies: react: 18.3.1 @@ -4557,10 +4575,6 @@ snapshots: dependencies: '@noble/hashes': 1.4.0 - '@noble/curves@1.4.2': - dependencies: - '@noble/hashes': 1.4.0 - '@noble/curves@1.5.0': dependencies: '@noble/hashes': 1.4.0 @@ -4588,12 +4602,12 @@ snapshots: require-from-string: 2.0.2 uri-js: 4.4.1 - '@redocly/config@0.7.0': {} + '@redocly/config@0.10.1': {} - '@redocly/openapi-core@1.19.0(supports-color@9.4.0)': + '@redocly/openapi-core@1.22.1(supports-color@9.4.0)': dependencies: '@redocly/ajv': 8.11.0 - '@redocly/config': 0.7.0 + '@redocly/config': 0.10.1 colorette: 1.4.0 https-proxy-agent: 7.0.5(supports-color@9.4.0) js-levenshtein: 1.1.6 @@ -4665,7 +4679,7 @@ snapshots: '@scure/bip32@1.4.0': dependencies: - '@noble/curves': 1.4.2 + '@noble/curves': 1.4.0 '@noble/hashes': 1.4.0 '@scure/base': 1.1.7 @@ -4825,10 +4839,10 @@ snapshots: '@stablelib/wipe@1.0.1': {} - '@swc/cli@0.4.0(@swc/core@1.7.18)(chokidar@3.6.0)': + '@swc/cli@0.4.0(@swc/core@1.7.22)(chokidar@3.6.0)': dependencies: '@mole-inc/bin-wrapper': 8.0.1 - '@swc/core': 1.7.18 + '@swc/core': 1.7.22 '@swc/counter': 0.1.3 commander: 8.3.0 fast-glob: 3.3.2 @@ -4840,58 +4854,58 @@ snapshots: optionalDependencies: chokidar: 3.6.0 - '@swc/core-darwin-arm64@1.7.18': + '@swc/core-darwin-arm64@1.7.22': optional: true - '@swc/core-darwin-x64@1.7.18': + '@swc/core-darwin-x64@1.7.22': optional: true - '@swc/core-linux-arm-gnueabihf@1.7.18': + '@swc/core-linux-arm-gnueabihf@1.7.22': optional: true - '@swc/core-linux-arm64-gnu@1.7.18': + '@swc/core-linux-arm64-gnu@1.7.22': optional: true - '@swc/core-linux-arm64-musl@1.7.18': + '@swc/core-linux-arm64-musl@1.7.22': optional: true - '@swc/core-linux-x64-gnu@1.7.18': + '@swc/core-linux-x64-gnu@1.7.22': optional: true - '@swc/core-linux-x64-musl@1.7.18': + '@swc/core-linux-x64-musl@1.7.22': optional: true - '@swc/core-win32-arm64-msvc@1.7.18': + '@swc/core-win32-arm64-msvc@1.7.22': optional: true - '@swc/core-win32-ia32-msvc@1.7.18': + '@swc/core-win32-ia32-msvc@1.7.22': optional: true - '@swc/core-win32-x64-msvc@1.7.18': + '@swc/core-win32-x64-msvc@1.7.22': optional: true - '@swc/core@1.7.18': + '@swc/core@1.7.22': dependencies: '@swc/counter': 0.1.3 '@swc/types': 0.1.12 optionalDependencies: - '@swc/core-darwin-arm64': 1.7.18 - '@swc/core-darwin-x64': 1.7.18 - '@swc/core-linux-arm-gnueabihf': 1.7.18 - '@swc/core-linux-arm64-gnu': 1.7.18 - '@swc/core-linux-arm64-musl': 1.7.18 - '@swc/core-linux-x64-gnu': 1.7.18 - '@swc/core-linux-x64-musl': 1.7.18 - '@swc/core-win32-arm64-msvc': 1.7.18 - '@swc/core-win32-ia32-msvc': 1.7.18 - '@swc/core-win32-x64-msvc': 1.7.18 + '@swc/core-darwin-arm64': 1.7.22 + '@swc/core-darwin-x64': 1.7.22 + '@swc/core-linux-arm-gnueabihf': 1.7.22 + '@swc/core-linux-arm64-gnu': 1.7.22 + '@swc/core-linux-arm64-musl': 1.7.22 + '@swc/core-linux-x64-gnu': 1.7.22 + '@swc/core-linux-x64-musl': 1.7.22 + '@swc/core-win32-arm64-msvc': 1.7.22 + '@swc/core-win32-ia32-msvc': 1.7.22 + '@swc/core-win32-x64-msvc': 1.7.22 '@swc/counter@0.1.3': {} - '@swc/jest@0.2.36(@swc/core@1.7.18)': + '@swc/jest@0.2.36(@swc/core@1.7.22)': dependencies: '@jest/create-cache-key-function': 29.7.0 - '@swc/core': 1.7.18 + '@swc/core': 1.7.22 '@swc/counter': 0.1.3 jsonc-parser: 3.3.1 @@ -4910,18 +4924,18 @@ snapshots: '@tabler/icons@3.14.0': {} - '@tanstack/history@1.49.7': {} + '@tanstack/history@1.51.6': {} - '@tanstack/query-core@5.52.2': {} + '@tanstack/query-core@5.53.1': {} - '@tanstack/react-query@5.52.2(react@18.3.1)': + '@tanstack/react-query@5.53.1(react@18.3.1)': dependencies: - '@tanstack/query-core': 5.52.2 + '@tanstack/query-core': 5.53.1 react: 18.3.1 - '@tanstack/react-router@1.51.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@tanstack/react-router@1.51.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@tanstack/history': 1.49.7 + '@tanstack/history': 1.51.6 '@tanstack/react-store': 0.5.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -4935,9 +4949,9 @@ snapshots: react-dom: 18.3.1(react@18.3.1) use-sync-external-store: 1.2.2(react@18.3.1) - '@tanstack/router-devtools@1.51.2(@tanstack/react-router@1.51.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(csstype@3.1.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@tanstack/router-devtools@1.51.6(@tanstack/react-router@1.51.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(csstype@3.1.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@tanstack/react-router': 1.51.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tanstack/react-router': 1.51.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) clsx: 2.1.1 goober: 2.1.14(csstype@3.1.3) react: 18.3.1 @@ -4945,22 +4959,22 @@ snapshots: transitivePeerDependencies: - csstype - '@tanstack/router-generator@1.51.0': + '@tanstack/router-generator@1.51.6': dependencies: prettier: 3.3.3 zod: 3.23.8 - '@tanstack/router-plugin@1.51.0(vite@5.4.2(@types/node@22.5.1)(sugarss@4.0.1(postcss@8.4.41)))': + '@tanstack/router-plugin@1.51.6(vite@5.4.2(@types/node@22.5.1)(sugarss@4.0.1(postcss@8.4.41)))': dependencies: '@babel/core': 7.25.2 - '@babel/generator': 7.25.5 - '@babel/parser': 7.25.4 + '@babel/generator': 7.25.6 + '@babel/parser': 7.25.6 '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.25.2) '@babel/plugin-syntax-typescript': 7.25.4(@babel/core@7.25.2) '@babel/template': 7.25.0 - '@babel/traverse': 7.25.4 - '@babel/types': 7.25.4 - '@tanstack/router-generator': 1.51.0 + '@babel/traverse': 7.25.6 + '@babel/types': 7.25.6 + '@tanstack/router-generator': 1.51.6 '@types/babel__core': 7.20.5 '@types/babel__generator': 7.6.8 '@types/babel__template': 7.4.4 @@ -5060,9 +5074,9 @@ snapshots: '@types/react-dom@18.3.0': dependencies: - '@types/react': 18.3.4 + '@types/react': 18.3.5 - '@types/react@18.3.4': + '@types/react@18.3.5': dependencies: '@types/prop-types': 15.7.12 csstype: 3.1.3 @@ -5085,7 +5099,7 @@ snapshots: '@vitejs/plugin-react-swc@3.7.0(vite@5.4.2(@types/node@22.5.1)(sugarss@4.0.1(postcss@8.4.41)))': dependencies: - '@swc/core': 1.7.18 + '@swc/core': 1.7.22 vite: 5.4.2(@types/node@22.5.1)(sugarss@4.0.1(postcss@8.4.41)) transitivePeerDependencies: - '@swc/helpers' @@ -5162,9 +5176,9 @@ snapshots: babel-dead-code-elimination@1.0.6: dependencies: '@babel/core': 7.25.2 - '@babel/parser': 7.25.4 - '@babel/traverse': 7.25.4 - '@babel/types': 7.25.4 + '@babel/parser': 7.25.6 + '@babel/traverse': 7.25.6 + '@babel/types': 7.25.6 transitivePeerDependencies: - supports-color @@ -5364,7 +5378,7 @@ snapshots: co@4.6.0: {} - codeco@1.4.2: {} + codeco@1.4.3: {} collect-v8-coverage@1.0.2: {} @@ -5530,7 +5544,7 @@ snapshots: '@didtools/codecs': 3.0.0 '@didtools/pkh-ethereum': 0.5.0(typescript@5.5.4)(zod@3.23.8) '@stablelib/random': 1.0.2 - codeco: 1.4.2 + codeco: 1.4.3 dag-jose-utils: 4.0.0 did-jwt: 7.4.7 did-resolver: 4.1.0 @@ -6248,9 +6262,9 @@ snapshots: - supports-color - ts-node - jotai@2.9.3(@types/react@18.3.4)(react@18.3.1): + jotai@2.9.3(@types/react@18.3.5)(react@18.3.1): optionalDependencies: - '@types/react': 18.3.4 + '@types/react': 18.3.5 react: 18.3.1 js-levenshtein@1.1.6: {} @@ -6490,15 +6504,15 @@ snapshots: dependencies: mimic-fn: 2.1.0 - openapi-fetch@0.11.1: + openapi-fetch@0.11.3: dependencies: - openapi-typescript-helpers: 0.0.12 + openapi-typescript-helpers: 0.0.13 - openapi-typescript-helpers@0.0.12: {} + openapi-typescript-helpers@0.0.13: {} - openapi-typescript@7.3.0(typescript@5.5.4): + openapi-typescript@7.3.3(typescript@5.5.4): dependencies: - '@redocly/openapi-core': 1.19.0(supports-color@9.4.0) + '@redocly/openapi-core': 1.22.1(supports-color@9.4.0) ansi-colors: 4.1.3 parse-json: 8.1.0 supports-color: 9.4.0 @@ -6662,40 +6676,40 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-remove-scroll-bar@2.3.6(@types/react@18.3.4)(react@18.3.1): + react-remove-scroll-bar@2.3.6(@types/react@18.3.5)(react@18.3.1): dependencies: react: 18.3.1 - react-style-singleton: 2.2.1(@types/react@18.3.4)(react@18.3.1) + react-style-singleton: 2.2.1(@types/react@18.3.5)(react@18.3.1) tslib: 2.7.0 optionalDependencies: - '@types/react': 18.3.4 + '@types/react': 18.3.5 - react-remove-scroll@2.5.10(@types/react@18.3.4)(react@18.3.1): + react-remove-scroll@2.5.10(@types/react@18.3.5)(react@18.3.1): dependencies: react: 18.3.1 - react-remove-scroll-bar: 2.3.6(@types/react@18.3.4)(react@18.3.1) - react-style-singleton: 2.2.1(@types/react@18.3.4)(react@18.3.1) + react-remove-scroll-bar: 2.3.6(@types/react@18.3.5)(react@18.3.1) + react-style-singleton: 2.2.1(@types/react@18.3.5)(react@18.3.1) tslib: 2.7.0 - use-callback-ref: 1.3.2(@types/react@18.3.4)(react@18.3.1) - use-sidecar: 1.1.2(@types/react@18.3.4)(react@18.3.1) + use-callback-ref: 1.3.2(@types/react@18.3.5)(react@18.3.1) + use-sidecar: 1.1.2(@types/react@18.3.5)(react@18.3.1) optionalDependencies: - '@types/react': 18.3.4 + '@types/react': 18.3.5 - react-style-singleton@2.2.1(@types/react@18.3.4)(react@18.3.1): + react-style-singleton@2.2.1(@types/react@18.3.5)(react@18.3.1): dependencies: get-nonce: 1.0.1 invariant: 2.2.4 react: 18.3.1 tslib: 2.7.0 optionalDependencies: - '@types/react': 18.3.4 + '@types/react': 18.3.5 - react-textarea-autosize@8.5.3(@types/react@18.3.4)(react@18.3.1): + react-textarea-autosize@8.5.3(@types/react@18.3.5)(react@18.3.1): dependencies: - '@babel/runtime': 7.25.4 + '@babel/runtime': 7.25.6 react: 18.3.1 use-composed-ref: 1.3.0(react@18.3.1) - use-latest: 1.2.1(@types/react@18.3.4)(react@18.3.1) + use-latest: 1.2.1(@types/react@18.3.5)(react@18.3.1) transitivePeerDependencies: - '@types/react' @@ -7013,8 +7027,6 @@ snapshots: type-fest@1.4.0: {} - type-fest@4.25.0: {} - type-fest@4.26.0: {} typescript@5.5.4: {} @@ -7049,37 +7061,37 @@ snapshots: dependencies: punycode: 2.3.1 - use-callback-ref@1.3.2(@types/react@18.3.4)(react@18.3.1): + use-callback-ref@1.3.2(@types/react@18.3.5)(react@18.3.1): dependencies: react: 18.3.1 tslib: 2.7.0 optionalDependencies: - '@types/react': 18.3.4 + '@types/react': 18.3.5 use-composed-ref@1.3.0(react@18.3.1): dependencies: react: 18.3.1 - use-isomorphic-layout-effect@1.1.2(@types/react@18.3.4)(react@18.3.1): + use-isomorphic-layout-effect@1.1.2(@types/react@18.3.5)(react@18.3.1): dependencies: react: 18.3.1 optionalDependencies: - '@types/react': 18.3.4 + '@types/react': 18.3.5 - use-latest@1.2.1(@types/react@18.3.4)(react@18.3.1): + use-latest@1.2.1(@types/react@18.3.5)(react@18.3.1): dependencies: react: 18.3.1 - use-isomorphic-layout-effect: 1.1.2(@types/react@18.3.4)(react@18.3.1) + use-isomorphic-layout-effect: 1.1.2(@types/react@18.3.5)(react@18.3.1) optionalDependencies: - '@types/react': 18.3.4 + '@types/react': 18.3.5 - use-sidecar@1.1.2(@types/react@18.3.4)(react@18.3.1): + use-sidecar@1.1.2(@types/react@18.3.5)(react@18.3.1): dependencies: detect-node-es: 1.1.0 react: 18.3.1 tslib: 2.7.0 optionalDependencies: - '@types/react': 18.3.4 + '@types/react': 18.3.5 use-sync-external-store@1.2.2(react@18.3.1): dependencies: @@ -7119,7 +7131,7 @@ snapshots: - utf-8-validate - zod - viem@2.20.1(typescript@5.5.4)(zod@3.23.8): + viem@2.21.0(typescript@5.5.4)(zod@3.23.8): dependencies: '@adraffy/ens-normalize': 1.10.0 '@noble/curves': 1.4.0 @@ -7153,7 +7165,7 @@ snapshots: webauthn-p256@0.0.5: dependencies: - '@noble/curves': 1.4.2 + '@noble/curves': 1.5.0 '@noble/hashes': 1.4.0 webidl-conversions@3.0.1: {}