From 1896392d30af53507c2100b50bb2eebc5b763292 Mon Sep 17 00:00:00 2001 From: "andrey.kononov" Date: Fri, 6 Jun 2025 23:28:49 +0300 Subject: [PATCH 01/89] Added HederaCredo module Start using the hashgraph-did-js sdk --- package.json | 18 + packages/hedera/CHANGELOG.md | 8 + packages/hedera/README.md | 31 + packages/hedera/jest.config.ts | 13 + packages/hedera/package.json | 34 + packages/hedera/src/HederaModule.ts | 32 + packages/hedera/src/HederaModuleConfig.ts | 15 + .../src/anoncreds/HederaAnonCredsRegistry.ts | 249 +++++ packages/hedera/src/anoncreds/index.ts | 1 + .../hedera/src/dids/HederaDidRegistrar.ts | 104 ++ packages/hedera/src/dids/HederaDidResolver.ts | 66 ++ packages/hedera/src/dids/index.ts | 2 + packages/hedera/src/index.ts | 8 + .../hedera/src/ledger/HederaLedgerService.ts | 18 + .../src/ledger/HederaLedgerServiceCache.ts | 42 + packages/hedera/src/ledger/index.ts | 1 + packages/hedera/tests/setup.ts | 1 + packages/hedera/tests/setupHederaModule.ts | 21 + packages/hedera/tsconfig.build.json | 10 + packages/hedera/tsconfig.json | 8 + patches/@2060.io__ffi-napi@4.0.9.patch | 14 + pnpm-lock.yaml | 980 +++++++++++++++++- 22 files changed, 1670 insertions(+), 6 deletions(-) create mode 100644 packages/hedera/CHANGELOG.md create mode 100644 packages/hedera/README.md create mode 100644 packages/hedera/jest.config.ts create mode 100644 packages/hedera/package.json create mode 100644 packages/hedera/src/HederaModule.ts create mode 100644 packages/hedera/src/HederaModuleConfig.ts create mode 100644 packages/hedera/src/anoncreds/HederaAnonCredsRegistry.ts create mode 100644 packages/hedera/src/anoncreds/index.ts create mode 100644 packages/hedera/src/dids/HederaDidRegistrar.ts create mode 100644 packages/hedera/src/dids/HederaDidResolver.ts create mode 100644 packages/hedera/src/dids/index.ts create mode 100644 packages/hedera/src/index.ts create mode 100644 packages/hedera/src/ledger/HederaLedgerService.ts create mode 100644 packages/hedera/src/ledger/HederaLedgerServiceCache.ts create mode 100644 packages/hedera/src/ledger/index.ts create mode 100644 packages/hedera/tests/setup.ts create mode 100644 packages/hedera/tests/setupHederaModule.ts create mode 100644 packages/hedera/tsconfig.build.json create mode 100644 packages/hedera/tsconfig.json create mode 100644 patches/@2060.io__ffi-napi@4.0.9.patch diff --git a/package.json b/package.json index 2164aa6a43..8ed3461e9e 100644 --- a/package.json +++ b/package.json @@ -58,5 +58,23 @@ }, "engines": { "node": ">=18" + }, + "pnpm": { + "patchedDependencies": { + "@2060.io/ffi-napi@4.0.9": "patches/@2060.io__ffi-napi@4.0.9.patch" + }, + "onlyBuiltDependencies": [ + "@2060.io/ffi-napi", + "@2060.io/ref-napi", + "@hyperledger/aries-askar-nodejs", + "@hyperledger/anoncreds-nodejs", + "@hyperledger/indy-vdr-nodejs", + "@openwallet-foundation/askar-nodejs", + "@biomejs/biome", + "es5-ext", + "esbuild", + "protobufjs", + "zstd-napi" + ] } } diff --git a/packages/hedera/CHANGELOG.md b/packages/hedera/CHANGELOG.md new file mode 100644 index 0000000000..62e74296bd --- /dev/null +++ b/packages/hedera/CHANGELOG.md @@ -0,0 +1,8 @@ +# Changelog + +## 0.0.1 + +### Patch Changes + +- Added Hedera module + diff --git a/packages/hedera/README.md b/packages/hedera/README.md new file mode 100644 index 0000000000..0f0db816da --- /dev/null +++ b/packages/hedera/README.md @@ -0,0 +1,31 @@ +

+
+ Credo Logo +

+

Credo Hedera Module

+

+ License + typescript + @credo-ts/hedera version + +

+
+ +Credo hedera provides integration of the Hedera network into Credo. See the [Hedera Setup](https://credo.js.org/guides/getting-started/set-up/hedera) for installation instructions. diff --git a/packages/hedera/jest.config.ts b/packages/hedera/jest.config.ts new file mode 100644 index 0000000000..93c0197296 --- /dev/null +++ b/packages/hedera/jest.config.ts @@ -0,0 +1,13 @@ +import type { Config } from '@jest/types' + +import base from '../../jest.config.base' + +import packageJson from './package.json' + +const config: Config.InitialOptions = { + ...base, + displayName: packageJson.name, + setupFilesAfterEnv: ['./tests/setup.ts'], +} + +export default config diff --git a/packages/hedera/package.json b/packages/hedera/package.json new file mode 100644 index 0000000000..f6ef239f46 --- /dev/null +++ b/packages/hedera/package.json @@ -0,0 +1,34 @@ +{ + "name": "@credo-ts/hedera", + "main": "src/index", + "types": "src/index", + "version": "0.5.13", + "files": ["build"], + "license": "Apache-2.0", + "publishConfig": { + "access": "public" + }, + "homepage": "https://github.com/openwallet-foundation/credo-ts/tree/main/packages/hedera", + "repository": { + "type": "git", + "url": "https://github.com/openwallet-foundation/credo-ts", + "directory": "packages/hedera" + }, + "scripts": { + "build": "pnpm run clean && pnpm run compile", + "clean": "rimraf ./build", + "compile": "tsc -p tsconfig.build.json", + "prepublishOnly": "pnpm run build", + "test": "jest" + }, + "dependencies": { + "@credo-ts/anoncreds": "workspace:*", + "@credo-ts/core": "workspace:*", + "@hiero-did-sdk-js/anoncreds": "npm:@hiero-did-sdk-js/anoncreds@0.0.1", + "@swiss-digital-assets-institute/registrar": "0.3.0" + }, + "devDependencies": { + "rimraf": "^4.0.7", + "typescript": "~5.5.2" + } +} diff --git a/packages/hedera/src/HederaModule.ts b/packages/hedera/src/HederaModule.ts new file mode 100644 index 0000000000..d23a2db144 --- /dev/null +++ b/packages/hedera/src/HederaModule.ts @@ -0,0 +1,32 @@ +import { DependencyManager, Module } from '@credo-ts/core' + +import { AgentConfig, Buffer } from '@credo-ts/core' + +import { HederaModuleConfig, HederaModuleConfigOptions } from './HederaModuleConfig' +import { HederaLedgerService } from './ledger' + +export class HederaModule implements Module { + public readonly config: HederaModuleConfig + + public constructor(config: HederaModuleConfigOptions) { + this.config = new HederaModuleConfig(config) + } + + public register(dependencyManager: DependencyManager) { + // Warn about experimental module + dependencyManager + .resolve(AgentConfig) + .logger.warn( + "The '@credo-ts/hedera' module is experimental and could have unexpected breaking changes. When using this module, make sure to use strict versions for all @credo-ts packages." + ) + + // Register config + dependencyManager.registerInstance(HederaModuleConfig, this.config) + dependencyManager.registerSingleton(HederaLedgerService) + + // Hedera module needs Buffer to be available globally + // If it is not available yet, we overwrite it with the + // Buffer implementation from Credo + global.Buffer = global.Buffer || Buffer + } +} diff --git a/packages/hedera/src/HederaModuleConfig.ts b/packages/hedera/src/HederaModuleConfig.ts new file mode 100644 index 0000000000..5fe22428ef --- /dev/null +++ b/packages/hedera/src/HederaModuleConfig.ts @@ -0,0 +1,15 @@ +import { HederaAnoncredsRegistryConfiguration } from '@hiero-did-sdk-js/anoncreds' + +export type HederaModuleConfigOptions = HederaAnoncredsRegistryConfiguration + +export class HederaModuleConfig { + private readonly _options: HederaModuleConfigOptions + + public constructor(options: HederaModuleConfigOptions) { + this._options = options + } + + get options(): HederaModuleConfigOptions { + return this._options + } +} diff --git a/packages/hedera/src/anoncreds/HederaAnonCredsRegistry.ts b/packages/hedera/src/anoncreds/HederaAnonCredsRegistry.ts new file mode 100644 index 0000000000..c7ccfa9d7a --- /dev/null +++ b/packages/hedera/src/anoncreds/HederaAnonCredsRegistry.ts @@ -0,0 +1,249 @@ +import type { + AnonCredsRegistry, + GetCredentialDefinitionReturn, + GetRevocationRegistryDefinitionReturn, + GetRevocationStatusListReturn, + GetSchemaReturn, + RegisterCredentialDefinitionOptions, + RegisterCredentialDefinitionReturn, + RegisterRevocationRegistryDefinitionOptions, + RegisterRevocationRegistryDefinitionReturn, + RegisterRevocationStatusListOptions, + RegisterRevocationStatusListReturn, + RegisterSchemaOptions, + RegisterSchemaReturn, +} from '@credo-ts/anoncreds' +import type { AgentContext } from '@credo-ts/core' +import { HederaLedgerService } from '../ledger' + +export class HederaAnonCredsRegistry implements AnonCredsRegistry { + public readonly methodName = 'hedera' + public readonly supportedIdentifier = /^did:hedera:.*$/ + + public async registerSchema( + agentContext: AgentContext, + options: RegisterSchemaOptions + ): Promise { + try { + const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) + const sdk = ledgerService.getHederaAnonCredsSdk(agentContext) + agentContext.config.logger.trace('Submitting register schema request to ledger') + return await sdk.registerSchema(options) + } catch (error) { + agentContext.config.logger.debug(`Error registering schema for did '${options.schema.issuerId}'`, { + error, + did: options.schema.issuerId, + schema: options, + }) + return { + schemaMetadata: {}, + registrationMetadata: {}, + schemaState: { + state: 'failed', + schema: options.schema, + reason: `Unable to register schema: ${error.message}`, + }, + } + } + } + + public async getSchema(agentContext: AgentContext, schemaId: string): Promise { + try { + const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) + const sdk = ledgerService.getHederaAnonCredsSdk(agentContext) + agentContext.config.logger.trace(`Submitting get schema request for schema '${schemaId}' to ledger`) + return await sdk.getSchema(schemaId) + } catch (error) { + agentContext.config.logger.error(`Error retrieving schema '${schemaId}'`, { + error, + schemaId, + }) + return { + schemaId, + resolutionMetadata: { + error: 'notFound', + message: `Unable to resolve schema: ${error.message}`, + }, + schemaMetadata: {}, + } + } + } + + public async registerCredentialDefinition( + agentContext: AgentContext, + options: RegisterCredentialDefinitionOptions + ): Promise { + try { + const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) + const sdk = ledgerService.getHederaAnonCredsSdk(agentContext) + agentContext.config.logger.trace('Submitting register credential definition request to ledger') + return await sdk.registerCredentialDefinition(options) + } catch (error) { + agentContext.config.logger.error( + `Error registering credential definition for did '${options.credentialDefinition.issuerId}'`, + { + error, + did: options.credentialDefinition.issuerId, + schema: options, + } + ) + return { + credentialDefinitionMetadata: {}, + registrationMetadata: {}, + credentialDefinitionState: { + state: 'failed', + credentialDefinition: options.credentialDefinition, + reason: `Unable to register credential definition: ${error.message}`, + }, + } + } + } + + public async getCredentialDefinition( + agentContext: AgentContext, + credentialDefinitionId: string + ): Promise { + try { + const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) + const sdk = ledgerService.getHederaAnonCredsSdk(agentContext) + agentContext.config.logger.trace( + `Submitting get credential definition request for '${credentialDefinitionId}' to ledger` + ) + return await sdk.getCredentialDefinition(credentialDefinitionId) + } catch (error) { + agentContext.config.logger.error(`Error retrieving credential definition '${credentialDefinitionId}'`, { + error, + credentialDefinitionId, + }) + return { + credentialDefinitionId, + resolutionMetadata: { + error: 'notFound', + message: `Unable to resolve credential definition: ${error.message}`, + }, + credentialDefinitionMetadata: {}, + } + } + } + + public async registerRevocationRegistryDefinition( + agentContext: AgentContext, + options: RegisterRevocationRegistryDefinitionOptions + ): Promise { + try { + const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) + const sdk = ledgerService.getHederaAnonCredsSdk(agentContext) + agentContext.config.logger.trace( + `Submitting register revocation registry definition request for '${options.revocationRegistryDefinition.credDefId}' to ledger` + ) + return await sdk.registerRevocationRegistryDefinition(options) + } catch (error) { + agentContext.config.logger.error( + `Error registering revocation registry definition for did '${options.revocationRegistryDefinition.issuerId}'`, + { + error, + did: options.revocationRegistryDefinition.issuerId, + options, + } + ) + return { + revocationRegistryDefinitionMetadata: {}, + registrationMetadata: {}, + revocationRegistryDefinitionState: { + state: 'failed', + revocationRegistryDefinition: options.revocationRegistryDefinition, + reason: `Unable to register revocation registry definition: ${error.message}`, + }, + } + } + } + + public async getRevocationRegistryDefinition( + agentContext: AgentContext, + revocationRegistryDefinitionId: string + ): Promise { + try { + const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) + const sdk = ledgerService.getHederaAnonCredsSdk(agentContext) + agentContext.config.logger.trace( + `Submitting get revocation registry definition request for '${revocationRegistryDefinitionId}' to ledger` + ) + return await sdk.getRevocationRegistryDefinition(revocationRegistryDefinitionId) + } catch (error) { + agentContext.config.logger.error( + `Error retrieving revocation registry definition '${revocationRegistryDefinitionId}'`, + { + error, + revocationRegistryDefinitionId, + } + ) + return { + revocationRegistryDefinitionId, + resolutionMetadata: { + error: 'notFound', + message: `Unable to resolve revocation registry definition: ${error.message}`, + }, + revocationRegistryDefinitionMetadata: {}, + } + } + } + + public async registerRevocationStatusList( + agentContext: AgentContext, + options: RegisterRevocationStatusListOptions + ): Promise { + try { + const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) + const sdk = ledgerService.getHederaAnonCredsSdk(agentContext) + agentContext.config.logger.trace( + `Submitting register revocation status list request for '${options.revocationStatusList.revRegDefId}' to ledger` + ) + return await sdk.registerRevocationStatusList(options) + } catch (error) { + agentContext.config.logger.error( + `Error registering revocation status list for did '${options.revocationStatusList.issuerId}'`, + { + error, + did: options.revocationStatusList.issuerId, + options, + } + ) + return { + revocationStatusListMetadata: {}, + registrationMetadata: {}, + revocationStatusListState: { + state: 'failed', + revocationStatusList: options.revocationStatusList, + reason: `Unable to register revocation status list: ${error.message}`, + }, + } + } + } + + public async getRevocationStatusList( + agentContext: AgentContext, + revocationRegistryId: string, + timestamp: number + ): Promise { + try { + const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) + const sdk = ledgerService.getHederaAnonCredsSdk(agentContext) + agentContext.config.logger.trace( + `Submitting get revocation status request for '${revocationRegistryId}' to ledger` + ) + return await sdk.getRevocationStatusList(revocationRegistryId, timestamp) + } catch (error) { + agentContext.config.logger.error(`Error retrieving revocation registry status list '${revocationRegistryId}'`, { + error, + revocationRegistryId, + }) + return { + resolutionMetadata: { + error: 'notFound', + message: `Unable to resolve revocation registry status list: ${error.message}`, + }, + revocationStatusListMetadata: {}, + } + } + } +} diff --git a/packages/hedera/src/anoncreds/index.ts b/packages/hedera/src/anoncreds/index.ts new file mode 100644 index 0000000000..886cabd90b --- /dev/null +++ b/packages/hedera/src/anoncreds/index.ts @@ -0,0 +1 @@ +export { HederaAnonCredsRegistry } from './HederaAnonCredsRegistry' diff --git a/packages/hedera/src/dids/HederaDidRegistrar.ts b/packages/hedera/src/dids/HederaDidRegistrar.ts new file mode 100644 index 0000000000..51897b5fd9 --- /dev/null +++ b/packages/hedera/src/dids/HederaDidRegistrar.ts @@ -0,0 +1,104 @@ +import type { + AgentContext, + DidCreateOptions, + DidCreateResult, + DidDeactivateOptions, + DidDeactivateResult, + DidRegistrar, + DidUpdateOptions, + DidUpdateResult, +} from '@credo-ts/core' +import { + DidDocument, + DidDocumentRole, + DidRecord, + DidRepository, + JsonTransformer, + TypedArrayEncoder, +} from '@credo-ts/core' +import { HederaLedgerService } from '../ledger' +import {createDID} from "@swiss-digital-assets-institute/registrar"; + +export class HederaDidRegistrar implements DidRegistrar { + public readonly supportedMethods = ['hedera'] + + public async create(agentContext: AgentContext, options: HederaDidCreateOptions): Promise { + const didRepository = agentContext.dependencyManager.resolve(DidRepository) + const hederaLedgerService = agentContext.dependencyManager.resolve(HederaLedgerService) + + try { + const { did, didDocument } = await createDID({ + client, + }); + + console.log(`DID: ${did}`); + console.log(`DID Document: ${JSON.stringify(didDocument, null, 2)}`); + } catch (error) { + console.error("Error creating DID:", error); + } + + + + // let didDocument: DidDocument + // + // try { + // const seedBuffer = TypedArrayEncoder.fromString(options.secret.seed) + // + // await agentContext.wallet.createKey({ keyType: KeyType.Ed25519, privateKey: seedBuffer }) + // + // const hederaDid = await hederaLedgerService.registerHcsDid(Buffer.from(seedBuffer)) + // + // const did = await hederaDid.resolve() + // + // didDocument = JsonTransformer.fromJSON(did.toJsonTree(), DidDocument) + // + // // Save the did so we know we created it and can issue with it + // const didRecord = new DidRecord({ + // did: did.getId(), + // role: DidDocumentRole.Created, + // didDocument, + // }) + // await didRepository.save(agentContext, didRecord) + // + // return { + // didDocumentMetadata: {}, + // didRegistrationMetadata: {}, + // didState: { + // state: 'finished', + // did: didDocument.id, + // didDocument, + // secret: options.secret, + // }, + // } + // } catch (error) { + // agentContext.config.logger.error(`Error registering DID : ${error}`) + // return { + // didDocumentMetadata: {}, + // didRegistrationMetadata: {}, + // didState: { + // state: 'failed', + // reason: `unknownError: ${error}`, + // }, + // } + // } + } + + public async update(agentContext: AgentContext, options: DidUpdateOptions): Promise { + throw new Error('Method not implemented.') + } + + public async deactivate(agentContext: AgentContext, options: DidDeactivateOptions): Promise { + throw new Error('Method not implemented.') + } +} + +export type SeedString = string + +export interface HederaDidCreateOptions extends DidCreateOptions { + method: 'hedera' + did?: never + secret: { + network: HederaNetwork + seed: string + } +} diff --git a/packages/hedera/src/dids/HederaDidResolver.ts b/packages/hedera/src/dids/HederaDidResolver.ts new file mode 100644 index 0000000000..0a76a33844 --- /dev/null +++ b/packages/hedera/src/dids/HederaDidResolver.ts @@ -0,0 +1,66 @@ +import { + type AgentContext, + DidDocument, + type DidResolutionResult, + type DidResolver, + JsonTransformer, + type ParsedDid, +} from '@credo-ts/core' +import { HederaLedgerService } from '../ledger' + +export class HederaDidResolver implements DidResolver { + public readonly supportedMethods = ['hedera'] + + public readonly allowsCaching = true + + public readonly allowsLocalDidRecord = true + + private readonly _cache: Map = new Map() + + public async resolve(agentContext: AgentContext, did: string, parsed: ParsedDid): Promise { + const didDocumentMetadata = {} + + if (this._cache.has(did)) { + return { + didDocument: this._cache.get(did), + didDocumentMetadata, + didResolutionMetadata: { + contentType: 'application/did+json', + }, + } + } + + const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) + try { + const didDoc = await ledgerService.getHederaAnonCredsSdk().resolveDid(did) + + const didJson = didDoc.toJsonTree() + + const updatedContextDidJson = { + ...didJson, + '@context': ['https://www.w3.org/ns/did/v1', 'https://w3id.org/security/suites/ed25519-2018/v1'], + } + + const didDocument = JsonTransformer.fromJSON(updatedContextDidJson, DidDocument) + + this._cache.set(did, didDocument) + + return { + didDocument, + didDocumentMetadata, + didResolutionMetadata: { + contentType: 'application/did+json', + }, + } + } catch (error) { + return { + didDocument: null, + didDocumentMetadata, + didResolutionMetadata: { + error: 'notFound', + message: `resolver_error: Unable to resolve did '${did}': ${error}`, + }, + } + } + } +} diff --git a/packages/hedera/src/dids/index.ts b/packages/hedera/src/dids/index.ts new file mode 100644 index 0000000000..960467c6ea --- /dev/null +++ b/packages/hedera/src/dids/index.ts @@ -0,0 +1,2 @@ +export { HederaDidRegistrar } from './HederaDidRegistrar' +export { HederaDidResolver } from './HederaDidResolver' diff --git a/packages/hedera/src/index.ts b/packages/hedera/src/index.ts new file mode 100644 index 0000000000..06098167ff --- /dev/null +++ b/packages/hedera/src/index.ts @@ -0,0 +1,8 @@ +// Dids +export * from './dids' + +// AnonCreds +export * from './anoncreds' +export * from './ledger' +export * from './HederaModule' +export * from './HederaModuleConfig' diff --git a/packages/hedera/src/ledger/HederaLedgerService.ts b/packages/hedera/src/ledger/HederaLedgerService.ts new file mode 100644 index 0000000000..bc851422f2 --- /dev/null +++ b/packages/hedera/src/ledger/HederaLedgerService.ts @@ -0,0 +1,18 @@ +import { type AgentContext, injectable } from '@credo-ts/core' +import { HederaAnoncredsRegistry } from '@hiero-did-sdk-js/anoncreds' +import { HederaModuleConfig } from '../.' +import { HederaLedgerServiceCache } from './HederaLedgerServiceCache' + +@injectable() +export class HederaLedgerService { + private readonly config: HederaModuleConfig + + public constructor(config: HederaModuleConfig) { + this.config = config + } + + public getHederaAnonCredsSdk(agentContext: AgentContext): HederaAnoncredsRegistry { + const cache = this.config.options.cache ?? new HederaLedgerServiceCache(agentContext) + return new HederaAnoncredsRegistry({ ...this.config.options, cache: cache }) + } +} diff --git a/packages/hedera/src/ledger/HederaLedgerServiceCache.ts b/packages/hedera/src/ledger/HederaLedgerServiceCache.ts new file mode 100644 index 0000000000..2fd6f326c8 --- /dev/null +++ b/packages/hedera/src/ledger/HederaLedgerServiceCache.ts @@ -0,0 +1,42 @@ +import { AgentContext, CacheModuleConfig, CredoError } from '@credo-ts/core' + +export interface CredoCache { + get(agentContext: AgentContext, key: string): Promise + set(agentContext: AgentContext, key: string, value: CacheValue, expiresInSeconds?: number): Promise + remove(agentContext: AgentContext, key: string): Promise +} + +interface SdkCache { + get(key: string): Promise + set(key: string, value: CacheValue, expiresInSeconds?: number): Promise + remove(key: string): Promise +} + +export class HederaLedgerServiceCache implements SdkCache { + private readonly credoCache: CredoCache + + constructor(private readonly agentContext: AgentContext) { + this.credoCache = agentContext.dependencyManager.resolve(CacheModuleConfig).cache + } + + async get(key: string): Promise { + if (!this.credoCache) { + throw new CredoError('Error initializing cache') + } + return await this.credoCache.get(this.agentContext, key) + } + + async set(key: string, value: CacheValue, _expiresInSeconds?: number): Promise { + if (!this.credoCache) { + throw new CredoError('Error initializing cache') + } + await this.credoCache.set(this.agentContext, key, value) + } + + async remove(key: string): Promise { + if (!this.credoCache) { + throw new CredoError('Error initializing cache') + } + await this.credoCache.remove(this.agentContext, key) + } +} diff --git a/packages/hedera/src/ledger/index.ts b/packages/hedera/src/ledger/index.ts new file mode 100644 index 0000000000..20a31b739b --- /dev/null +++ b/packages/hedera/src/ledger/index.ts @@ -0,0 +1 @@ +export { HederaLedgerService } from './HederaLedgerService' diff --git a/packages/hedera/tests/setup.ts b/packages/hedera/tests/setup.ts new file mode 100644 index 0000000000..7f0aeddaa3 --- /dev/null +++ b/packages/hedera/tests/setup.ts @@ -0,0 +1 @@ +jest.setTimeout(60000) diff --git a/packages/hedera/tests/setupHederaModule.ts b/packages/hedera/tests/setupHederaModule.ts new file mode 100644 index 0000000000..92ff809e0c --- /dev/null +++ b/packages/hedera/tests/setupHederaModule.ts @@ -0,0 +1,21 @@ +import { HederaModuleConfigOptions } from '@credo-ts/hedera' +import { HederaModule } from '../src' + +export const getHederaModuleConfig = () => + ({ + networks: [ + { + network: 'testnet', + operatorId: '', + operatorKey: '', + }, + ], + }) satisfies HederaModuleConfigOptions + +export const getHederaModules = () => ({ + hederaSdk: new HederaModule(getHederaModuleConfig()), + // dids: new DidsModule({ + // registrars: [new HederaDidRegistrar()], + // resolvers: [new HederaDidResolver()], + // }), +}) diff --git a/packages/hedera/tsconfig.build.json b/packages/hedera/tsconfig.build.json new file mode 100644 index 0000000000..e7ee40ad18 --- /dev/null +++ b/packages/hedera/tsconfig.build.json @@ -0,0 +1,10 @@ +{ + "extends": "../../tsconfig.build.json", + "compilerOptions": { + "outDir": "./build", + "baseUrl": ".", + "skipDefaultLibCheck": true + }, + "include": ["src/**/*"], + "exclude": ["../core"] +} diff --git a/packages/hedera/tsconfig.json b/packages/hedera/tsconfig.json new file mode 100644 index 0000000000..f274e6f9e1 --- /dev/null +++ b/packages/hedera/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "types": ["node", "jest"], + "moduleResolution": "node", + "resolveJsonModule": true + } +} diff --git a/patches/@2060.io__ffi-napi@4.0.9.patch b/patches/@2060.io__ffi-napi@4.0.9.patch new file mode 100644 index 0000000000..2e3cb8248d --- /dev/null +++ b/patches/@2060.io__ffi-napi@4.0.9.patch @@ -0,0 +1,14 @@ +diff --git a/deps/libffi/libffi.gyp b/deps/libffi/libffi.gyp +index d02bef739c0cfb9c1bbb0a666ab3363fd34c5041..5d49572898681902fca1079b7b25d02f15f7617a 100644 +--- a/deps/libffi/libffi.gyp ++++ b/deps/libffi/libffi.gyp +@@ -74,8 +74,7 @@ + '<(INTERMEDIATE_DIR)/<(RULE_INPUT_ROOT).asm', + ], + 'action': [ +- 'call', +- 'preprocess_asm.cmd', ++ '../../../deps/libffi/preprocess_asm.cmd', + 'include', + 'config/<(OS)/<(target_arch)', + '<(RULE_INPUT_PATH)', diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9004441c5e..c9faf8b7ac 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,6 +8,11 @@ overrides: '@types/node': 18.18.8 undici: ^6.20.1 +patchedDependencies: + '@2060.io/ffi-napi@4.0.9': + hash: 6ujtm5ladmp54sbez4f5d2uhca + path: patches/@2060.io__ffi-napi@4.0.9.patch + importers: .: @@ -592,6 +597,28 @@ importers: specifier: ~5.5.2 version: 5.5.4 + packages/hedera: + dependencies: + '@credo-ts/anoncreds': + specifier: workspace:* + version: link:../anoncreds + '@credo-ts/core': + specifier: workspace:* + version: link:../core + '@hiero-did-sdk-js/anoncreds': + specifier: npm:@hiero-did-sdk-js/anoncreds@0.0.1 + version: 0.0.1(bn.js@5.2.1)(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1))(react@18.3.1) + '@swiss-digital-assets-institute/registrar': + specifier: 0.3.0 + version: 0.3.0(bn.js@5.2.1)(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1)) + devDependencies: + rimraf: + specifier: ^4.0.7 + version: 4.4.1 + typescript: + specifier: ~5.5.2 + version: 5.5.4 + packages/indy-sdk-to-askar-migration: dependencies: '@credo-ts/anoncreds': @@ -658,7 +685,7 @@ importers: dependencies: '@2060.io/ffi-napi': specifier: ^4.0.9 - version: 4.0.9 + version: 4.0.9(patch_hash=6ujtm5ladmp54sbez4f5d2uhca) '@2060.io/ref-napi': specifier: ^3.0.6 version: 3.0.6 @@ -1939,6 +1966,9 @@ packages: '@cosmjs/utils@0.33.1': resolution: {integrity: sha512-UnLHDY6KMmC+UXf3Ufyh+onE19xzEXjT4VZ504Acmk4PXxqyvG4cCPprlKUFnGUX7f0z8Or9MAOHXBx41uHBcg==} + '@craftzdog/react-native-buffer@6.1.0': + resolution: {integrity: sha512-lJXdjZ7fTllLbzDrwg/FrJLjQ5sBcAgwcqgAB6OPpXTHdCenEhHZblQpfmBLLe7/S7m0yKXL3kN3jpwOEkpjGg==} + '@cspotcode/source-map-support@0.8.1': resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} @@ -2164,6 +2194,60 @@ packages: cpu: [x64] os: [win32] + '@ethersproject/abi@5.8.0': + resolution: {integrity: sha512-b9YS/43ObplgyV6SlyQsG53/vkSal0MNA1fskSC4mbnCMi8R+NkcH8K9FPYNESf6jUefBUniE4SOKms0E/KK1Q==} + + '@ethersproject/abstract-provider@5.8.0': + resolution: {integrity: sha512-wC9SFcmh4UK0oKuLJQItoQdzS/qZ51EJegK6EmAWlh+OptpQ/npECOR3QqECd8iGHC0RJb4WKbVdSfif4ammrg==} + + '@ethersproject/abstract-signer@5.8.0': + resolution: {integrity: sha512-N0XhZTswXcmIZQdYtUnd79VJzvEwXQw6PK0dTl9VoYrEBxxCPXqS0Eod7q5TNKRxe1/5WUMuR0u0nqTF/avdCA==} + + '@ethersproject/address@5.8.0': + resolution: {integrity: sha512-GhH/abcC46LJwshoN+uBNoKVFPxUuZm6dA257z0vZkKmU1+t8xTn8oK7B9qrj8W2rFRMch4gbJl6PmVxjxBEBA==} + + '@ethersproject/base64@5.8.0': + resolution: {integrity: sha512-lN0oIwfkYj9LbPx4xEkie6rAMJtySbpOAFXSDVQaBnAzYfB4X2Qr+FXJGxMoc3Bxp2Sm8OwvzMrywxyw0gLjIQ==} + + '@ethersproject/bignumber@5.8.0': + resolution: {integrity: sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA==} + + '@ethersproject/bytes@5.8.0': + resolution: {integrity: sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A==} + + '@ethersproject/constants@5.8.0': + resolution: {integrity: sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg==} + + '@ethersproject/hash@5.8.0': + resolution: {integrity: sha512-ac/lBcTbEWW/VGJij0CNSw/wPcw9bSRgCB0AIBz8CvED/jfvDoV9hsIIiWfvWmFEi8RcXtlNwp2jv6ozWOsooA==} + + '@ethersproject/keccak256@5.8.0': + resolution: {integrity: sha512-A1pkKLZSz8pDaQ1ftutZoaN46I6+jvuqugx5KYNeQOPqq+JZ0Txm7dlWesCHB5cndJSu5vP2VKptKf7cksERng==} + + '@ethersproject/logger@5.8.0': + resolution: {integrity: sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA==} + + '@ethersproject/networks@5.8.0': + resolution: {integrity: sha512-egPJh3aPVAzbHwq8DD7Po53J4OUSsA1MjQp8Vf/OZPav5rlmWUaFLiq8cvQiGK0Z5K6LYzm29+VA/p4RL1FzNg==} + + '@ethersproject/properties@5.8.0': + resolution: {integrity: sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw==} + + '@ethersproject/rlp@5.8.0': + resolution: {integrity: sha512-LqZgAznqDbiEunaUvykH2JAoXTT9NV0Atqk8rQN9nx9SEgThA/WMx5DnW8a9FOufo//6FZOCHZ+XiClzgbqV9Q==} + + '@ethersproject/signing-key@5.8.0': + resolution: {integrity: sha512-LrPW2ZxoigFi6U6aVkFN/fa9Yx/+4AtIUe4/HACTvKJdhm0eeb107EVCIQcrLZkxaSIgc/eCrX8Q1GtbH+9n3w==} + + '@ethersproject/strings@5.8.0': + resolution: {integrity: sha512-qWEAk0MAvl0LszjdfnZ2uC8xbR2wdv4cDabyHiBh3Cldq/T8dPH3V4BbBsAYJUeonwD+8afVXld274Ls+Y1xXg==} + + '@ethersproject/transactions@5.8.0': + resolution: {integrity: sha512-UglxSDjByHG0TuU17bDfCemZ3AnKO2vYrL5/2n2oXvKzvb7Cz+W9gOWXKARjp2URVwcWlQlPOEQyAviKwT4AHg==} + + '@ethersproject/web@5.8.0': + resolution: {integrity: sha512-j7+Ksi/9KfGviws6Qtf9Q7KCqRhpwrYKQPs+JBA/rKVFF/yaWLHJEH3zfVP2plVu+eys0d2DlFmhoQJayFewcw==} + '@expo/bunyan@4.0.0': resolution: {integrity: sha512-Ydf4LidRB/EBI+YrB+cVLqIseiRfjUI/AeHBgjGMtq3GroraDu81OV7zqophRgupngoL3iS3JUMDMnxO7g39qA==} engines: {'0': node >=0.10.0} @@ -2237,6 +2321,15 @@ packages: peerDependencies: graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + '@grpc/grpc-js@1.13.4': + resolution: {integrity: sha512-GsFaMXCkMqkKIvwCQjCrwH+GHbPKBjhwo/8ZuUkWHqbI73Kky9I+pQltrlT0+MWpedCoosda53lgjYfyEPgxBg==} + engines: {node: '>=12.10.0'} + + '@grpc/proto-loader@0.7.15': + resolution: {integrity: sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ==} + engines: {node: '>=6'} + hasBin: true + '@hapi/bourne@3.0.0': resolution: {integrity: sha512-Waj1cwPXJDucOib4a3bAISsKJVb15MKi9IvmTI/7ssVEm6sywXGjVJDhl6/umt1pK1ZS7PacXU3A1PmFKHEZ2w==} @@ -2246,6 +2339,37 @@ packages: '@hapi/topo@5.1.0': resolution: {integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==} + '@hashgraph/cryptography@1.7.4': + resolution: {integrity: sha512-aYPfukqLCOoEzmilTrOSDWoJjZnzfcc84tKqrBqFbiduZLIoT+TY4Y3AA1Vdsun9dlWmRnOx8L4qIzPVlKPQhw==} + engines: {node: '>=12.0.0'} + peerDependencies: + expo-crypto: '*' + peerDependenciesMeta: + expo-crypto: + optional: true + + '@hashgraph/proto@2.18.5': + resolution: {integrity: sha512-LifEGGhvkqF49PYVP0xkcnCh8fP43q/+JkGPdZkwKglw1wFAJkPHZtQmGZSjmDpl2gbJiRyzvzJ1Q9MJ1VBA4Q==} + engines: {node: '>=10.0.0'} + + '@hashgraph/sdk@2.65.1': + resolution: {integrity: sha512-x/BhO+b6lRs8LOSjG4AJD4ed2N7Po56ZDQiye5FmKFuGQ8Q3fHFngMh8qsiCt6nwHBLpcIl1ZBTNNWcxQQKBaA==} + engines: {node: '>=18.0.0'} + peerDependencies: + bn.js: ^5.2.1 + + '@hiero-did-sdk-js/anoncreds@0.0.1': + resolution: {integrity: sha1-EtllnyN8MSx9lhkokaM7l7rIris=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk-js/anoncreds/-/@hiero-did-sdk-js/anoncreds-0.0.1.tgz} + + '@hiero-did-sdk-js/crypto@0.0.1': + resolution: {integrity: sha1-7myNI6ac/MXIhFvvimqNOjDRI3g=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk-js/crypto/-/@hiero-did-sdk-js/crypto-0.0.1.tgz} + + '@hiero-did-sdk-js/hcs@0.0.1': + resolution: {integrity: sha1-y425LHxX+szRkBI2w1k+PKB48MI=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk-js/hcs/-/@hiero-did-sdk-js/hcs-0.0.1.tgz} + + '@hiero-did-sdk-js/zstd@0.0.1': + resolution: {integrity: sha1-HX7HgYFjcb7pB5tIDHQ/IXXiMfw=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk-js/zstd/-/@hiero-did-sdk-js/zstd-0.0.1.tgz} + '@hyperledger/anoncreds-nodejs@0.3.1': resolution: {integrity: sha512-/oWmWgcOPqjAtd2+dKASPYL84Qd7sAFyCBfEKM7PAgVbObaZUZc0kqA7hkEz/qyiqUvcP/JwKTc1v4zVZi6BTg==} engines: {node: '>= 18'} @@ -2397,6 +2521,9 @@ packages: peerDependencies: '@js-joda/core': '>=1.11.0' + '@js-sdsl/ordered-map@4.4.2': + resolution: {integrity: sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==} + '@koa/bodyparser@5.1.1': resolution: {integrity: sha512-ZBF49xqNVxnmJ+8iXegq+fXPQm9RSX8giNl/aXS5rW1VpNct92wnFbGR/47vfoRJVLARGQ4HVL4WaQ0u8IJVoA==} engines: {node: '>= 16'} @@ -2706,6 +2833,9 @@ packages: '@scure/base@1.2.1': resolution: {integrity: sha512-DGmGtC8Tt63J5GfHgfl5CuAXh96VF/LD8K9Hr/Gv0J2lAoRGlPOMpqMpMbCTOoOJMZCk2Xt+DskdDyn6dEFdzQ==} + '@scure/base@1.2.6': + resolution: {integrity: sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg==} + '@sd-jwt/core@0.7.2': resolution: {integrity: sha512-vix1GplUFc1A9H42r/yXkg7cKYthggyqZEwlFdsBbn4xdZNE+AHVF4N7kPa1pPxipwN3UIHd4XnQ5MJV15mhsQ==} engines: {node: '>=18'} @@ -2827,6 +2957,38 @@ packages: '@stablelib/wipe@2.0.1': resolution: {integrity: sha512-1eU2K9EgOcV4qc9jcP6G72xxZxEm5PfeI5H55l08W95b4oRJaqhmlWRc4xZAm6IVSKhVNxMi66V67hCzzuMTAg==} + '@swiss-digital-assets-institute/core@0.3.0': + resolution: {integrity: sha1-HFqrSOZ1eNl1aHTx0e/k53tMSP0=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@swiss-digital-assets-institute/core/-/@swiss-digital-assets-institute/core-0.3.0.tgz} + engines: {node: '>=20'} + + '@swiss-digital-assets-institute/lifecycle@0.3.0': + resolution: {integrity: sha1-/yTpyVQllHnj7LthP4MvHI1s9Dc=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@swiss-digital-assets-institute/lifecycle/-/@swiss-digital-assets-institute/lifecycle-0.3.0.tgz} + engines: {node: '>=20'} + + '@swiss-digital-assets-institute/messages@0.3.0': + resolution: {integrity: sha1-KDpJdqqjOD7g4ZZjYhF+0EeRj2E=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@swiss-digital-assets-institute/messages/-/@swiss-digital-assets-institute/messages-0.3.0.tgz} + engines: {node: '>=20'} + + '@swiss-digital-assets-institute/publisher-internal@0.3.0': + resolution: {integrity: sha1-/3A4eN6tdAGVhWtBxfThxawKl9Y=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@swiss-digital-assets-institute/publisher-internal/-/@swiss-digital-assets-institute/publisher-internal-0.3.0.tgz} + engines: {node: '>=20'} + + '@swiss-digital-assets-institute/registrar@0.3.0': + resolution: {integrity: sha1-EtnZszht1lEXDI4p/+reQk3wCdw=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@swiss-digital-assets-institute/registrar/-/@swiss-digital-assets-institute/registrar-0.3.0.tgz} + engines: {node: '>=20'} + + '@swiss-digital-assets-institute/resolver@0.3.0': + resolution: {integrity: sha1-6PsOUXpYAYT2U4ac/OFQU6WU2iQ=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@swiss-digital-assets-institute/resolver/-/@swiss-digital-assets-institute/resolver-0.3.0.tgz} + engines: {node: '>=20'} + + '@swiss-digital-assets-institute/signer-internal@0.3.0': + resolution: {integrity: sha1-hXAulacwLyf6D2zPdXv1d2m7+Ek=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@swiss-digital-assets-institute/signer-internal/-/@swiss-digital-assets-institute/signer-internal-0.3.0.tgz} + engines: {node: '>=20'} + + '@swiss-digital-assets-institute/verifier-internal@0.3.0': + resolution: {integrity: sha1-bUpg621K6rPreN8td50kvOQk2OU=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@swiss-digital-assets-institute/verifier-internal/-/@swiss-digital-assets-institute/verifier-internal-0.3.0.tgz} + engines: {node: '>=20'} + '@szmarczak/http-timer@5.0.1': resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} engines: {node: '>=14.16'} @@ -3216,6 +3378,10 @@ packages: resolution: {integrity: sha512-FVnvrKJwpt9LP2lAMl8qZswRNm3T4q9CON+bxldk2iwk3FFpuwhx2FfinyitizWHsVYyaY+y5JzDR0rCMV5yTQ==} engines: {node: '>=12.0.0'} + asn1js@3.0.6: + resolution: {integrity: sha512-UOCGPYbl0tv8+006qks/dTgV9ajs97X2p0FAbyS2iyCRrmLSRolDaHdp+v/CLgnzHc3fVB+CwYiUmei7ndFcgA==} + engines: {node: '>=12.0.0'} + ast-types@0.15.2: resolution: {integrity: sha512-c27loCv9QkZinsa5ProX751khO9DJl/AcB5c2KNtA6NRvHKS0PgLfcftz72KVq504vB0Gku5s2kUZzDBvQWvHg==} engines: {node: '>=4'} @@ -3244,6 +3410,10 @@ packages: resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} engines: {node: '>= 4.0.0'} + atomic-sleep@1.0.0: + resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} + engines: {node: '>=8.0.0'} + available-typed-arrays@1.0.7: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} @@ -3476,10 +3646,18 @@ packages: resolution: {integrity: sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==} engines: {node: '>=14.16'} + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + call-bind@1.0.7: resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} engines: {node: '>= 0.4'} + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + caller-callsite@2.0.0: resolution: {integrity: sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==} engines: {node: '>=4'} @@ -3517,6 +3695,10 @@ packages: canonicalize@2.0.0: resolution: {integrity: sha512-ulDEYPv7asdKvqahuAY35c1selLdzDwHqugK92hfkzvlDCwXRRelDkR+Er33md/PtnpqHemgkuDPanZ4fiYZ8w==} + cbor2@1.12.0: + resolution: {integrity: sha512-3Cco8XQhi27DogSp9Ri6LYNZLi/TBY/JVnDe+mj06NkBjW/ZYOtekaEU4wZ4xcRMNrFkDv8KNtOAqHyDfz3lYg==} + engines: {node: '>=18.7'} + chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} @@ -3535,6 +3717,9 @@ packages: charenc@0.0.2: resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==} + chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + chownr@2.0.0: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} engines: {node: '>=10'} @@ -3644,6 +3829,9 @@ packages: colorette@1.4.0: resolution: {integrity: sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==} + colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + combined-stream@1.0.8: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} @@ -3786,6 +3974,9 @@ packages: crypt@0.0.2: resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==} + crypto-js@4.2.0: + resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==} + crypto-ld@6.0.0: resolution: {integrity: sha512-XWL1LslqggNoaCI/m3I7HcvaSt9b2tYzdrXO+jHLUj9G1BvRfvV7ZTFDVY5nifYuIGAPdAGu7unPxLRustw3VA==} engines: {node: '>=8.3.0'} @@ -3798,6 +3989,10 @@ packages: resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} engines: {node: '>=8'} + crypto@1.0.1: + resolution: {integrity: sha512-VxBKmeNcqQdiUQUW2Tzq0t377b54N2bMtXO/qiLa+6eRRmmC4qT3D4OnTGoT/U6O9aklQ/jTwbOtRMTTY8G0Ig==} + deprecated: This package is no longer supported. It's now a built-in Node module. If you've depended on crypto, you should switch to the one that's built-in. + csv-generate@3.4.3: resolution: {integrity: sha512-w/T+rqR0vwvHqWs/1ZyMDWtHHSJaN06klRqJXBEpDJaM/+dZkso0OKh1VcuuYvK3XM53KysVNq8Ko/epCK8wOw==} @@ -3838,6 +4033,9 @@ packages: resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} engines: {node: '>= 0.4'} + dateformat@4.6.3: + resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==} + dayjs@1.11.11: resolution: {integrity: sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg==} @@ -4010,6 +4208,10 @@ packages: resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} engines: {node: '>=12'} + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} @@ -4086,6 +4288,10 @@ packages: resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} engines: {node: '>= 0.4'} + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + es-errors@1.3.0: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} @@ -4094,6 +4300,10 @@ packages: resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} engines: {node: '>= 0.4'} + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + es-set-tostringtag@2.0.3: resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} engines: {node: '>= 0.4'} @@ -4196,6 +4406,10 @@ packages: resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} engines: {node: '>= 0.8.0'} + expand-template@2.0.3: + resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} + engines: {node: '>=6'} + expect@29.7.0: resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -4266,6 +4480,9 @@ packages: fast-base64-decode@1.0.0: resolution: {integrity: sha512-qwaScUgUGBYeDNRnbc/KyllVU88Jk1pRHPStuF/lO7B0/RTRLj7U0lkdTAutlBblY08rwZDff6tNU9cjv6j//Q==} + fast-copy@3.0.2: + resolution: {integrity: sha512-dl0O9Vhju8IrcLndv2eU4ldt1ftXMqqfgN4H1cpmGV7P6jeB9FwpN9a2c8DPGE1Ys88rNUJVYDHq73CGAGOPfQ==} + fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -4279,6 +4496,10 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + fast-redact@3.5.0: + resolution: {integrity: sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==} + engines: {node: '>=6'} + fast-safe-stringify@2.1.1: resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} @@ -4407,6 +4628,10 @@ packages: resolution: {integrity: sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==} engines: {node: '>=14'} + forge-light@1.1.4: + resolution: {integrity: sha512-Nr0xdu93LJawgBZVU/tC+A+4pbKqigdY5PRBz8CXNm4e5saAZIqU2Qe9+nVFtVO5TWCHSgvI0LaZZuatgE5J1g==} + engines: {node: '>= 6.13.0'} + form-data-encoder@2.1.4: resolution: {integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==} engines: {node: '>= 14.17'} @@ -4441,6 +4666,9 @@ packages: resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} engines: {node: '>= 0.6'} + fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + fs-extra@7.0.1: resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} engines: {node: '>=6 <7 || >=8'} @@ -4500,6 +4728,10 @@ packages: resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} engines: {node: '>= 0.4'} + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + get-package-type@0.1.0: resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} engines: {node: '>=8.0.0'} @@ -4508,6 +4740,10 @@ packages: resolution: {integrity: sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==} engines: {node: '>=4'} + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + get-stream@4.1.0: resolution: {integrity: sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==} engines: {node: '>=6'} @@ -4533,6 +4769,9 @@ packages: resolution: {integrity: sha512-7yetJWqbS9sbn0vIfliPsFgoXMKn/YMF+Wuiog97x+urnSRRRZ7xB+uVkwGKzRgq9CDFfMQnE9ruL5DHv9c6Xg==} engines: {node: '>=6'} + github-from-package@0.0.0: + resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} + glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -4573,6 +4812,10 @@ packages: gopd@1.0.1: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + got@13.0.0: resolution: {integrity: sha512-XfBk1CxOOScDcMr9O1yKkNaQyy865NbYs+F7dr4H0LZMVgCj2Le59k6PqbNHoL5ToeaEQUYh6c6yMfVcc6SJxA==} engines: {node: '>=16'} @@ -4619,6 +4862,10 @@ packages: resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} engines: {node: '>= 0.4'} + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + has-tostringtag@1.0.2: resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} engines: {node: '>= 0.4'} @@ -4633,6 +4880,9 @@ packages: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} + help-me@5.0.0: + resolution: {integrity: sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==} + hermes-estree@0.19.1: resolution: {integrity: sha512-daLGV3Q2MKk8w4evNMKwS8zBE/rcpA800nu1Q5kM08IKijoSnPe9Uo1iIxzPKRkn95IxxsgBMPeYHt3VG4ej2g==} @@ -4789,6 +5039,10 @@ packages: resolution: {integrity: sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==} engines: {node: '>= 10'} + is-arguments@1.2.0: + resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==} + engines: {node: '>= 0.4'} + is-array-buffer@3.0.4: resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} engines: {node: '>= 0.4'} @@ -5174,9 +5428,16 @@ packages: jose@5.9.6: resolution: {integrity: sha512-AMlnetc9+CV9asI19zHmrgS/WYsWUwCn2R7RzlbJWD7F9eWYUTGyBmU9o6PxngtLGOiDGPRu+Uc4fhKzbpteZQ==} + joycon@3.1.1: + resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} + engines: {node: '>=10'} + js-base64@3.7.7: resolution: {integrity: sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==} + js-sha3@0.8.0: + resolution: {integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==} + js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -5426,6 +5687,9 @@ packages: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} + lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + lodash.debounce@4.0.8: resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} @@ -5529,6 +5793,10 @@ packages: marky@1.2.5: resolution: {integrity: sha512-q9JtQJKjpsVxCRVgQ+WapguSbKC3SQ5HEzFGPAJMStgh3QjCawp00UKv3MTTAArTmGmmPUvllHZoNbZ3gs0I+Q==} + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + md5-file@3.2.3: resolution: {integrity: sha512-3Tkp1piAHaworfcCgH0jKbTvj1jWWFgbvh2cXaNCgHwyTCBxxvD1Y04rmfpvdPm1P4oXMOpm6+2H7sr7v9v8Fw==} engines: {node: '>=0.10'} @@ -5800,6 +6068,9 @@ packages: resolution: {integrity: sha512-5H76ANWinB1H3twpJ6JY8uvAtpmFvHNArpilJAjXRKXSDDLPIMoZArw5SH0q9z+lLs8IrMw7Q2VWpWimFKFT1Q==} engines: {node: '>= 8.0.0'} + mkdirp-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + mkdirp@0.5.6: resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} hasBin: true @@ -5858,6 +6129,9 @@ packages: engines: {node: ^18 || >=20} hasBin: true + napi-build-utils@2.0.0: + resolution: {integrity: sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==} + natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} @@ -5889,12 +6163,19 @@ packages: resolution: {integrity: sha512-xqWQQZ/Hv01tj5uL7BE4j752hhB2MHP7aaEcTp/iDT1EHsh3TYZOIx4HHFL81yRc8KFx4pqb2P2OtuxKShKhjw==} engines: {node: '>= 18'} + node-abi@3.75.0: + resolution: {integrity: sha512-OhYaY5sDsIka7H7AtijtI9jwGYLyl29eQn/W623DiN/MIv5sUqc4g7BIDThX+gb7di9f6xK02nkp8sdfFWZLTg==} + engines: {node: '>=10'} + node-addon-api@3.2.1: resolution: {integrity: sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==} node-addon-api@5.1.0: resolution: {integrity: sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==} + node-addon-api@7.1.1: + resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} + node-dir@0.1.17: resolution: {integrity: sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg==} engines: {node: '>= 0.10.5'} @@ -6006,6 +6287,10 @@ packages: resolution: {integrity: sha512-IF4PcGgzAr6XXSff26Sk/+P4KZFJVuHAJZj3wgO3vX2bMdNVp/QXTP3P7CEm9V1IdG8lDLY3HhiqpsE/nOwpPw==} engines: {node: ^10.13.0 || >=12.0.0} + on-exit-leak-free@2.1.2: + resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} + engines: {node: '>=14.0.0'} + on-finished@2.3.0: resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==} engines: {node: '>= 0.8'} @@ -6203,6 +6488,20 @@ packages: resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} engines: {node: '>=6'} + pino-abstract-transport@2.0.0: + resolution: {integrity: sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw==} + + pino-pretty@13.0.0: + resolution: {integrity: sha512-cQBBIVG3YajgoUjo1FdKVRX6t9XPxwB9lcNJVD5GCnNM4Y6T12YYx8c6zEejxQsU0wrg9TwmDulcE9LR7qcJqA==} + hasBin: true + + pino-std-serializers@7.0.0: + resolution: {integrity: sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==} + + pino@9.7.0: + resolution: {integrity: sha512-vnMCM6xZTb1WDmLvtG2lE/2p+t9hDEIvTWJsu6FejkE62vB7gDhvzrpFR4Cw2to+9JNQxVnkAKVPA1KPB98vWg==} + hasBin: true + pirates@4.0.6: resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} engines: {node: '>= 6'} @@ -6231,6 +6530,11 @@ packages: resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} engines: {node: ^10 || ^12 || >=14} + prebuild-install@7.1.3: + resolution: {integrity: sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==} + engines: {node: '>=10'} + hasBin: true + preferred-pm@3.1.3: resolution: {integrity: sha512-MkXsENfftWSRpzCzImcp4FRsCc3y1opwB73CfCNWyzMqArju2CrlMHlqB7VexKiPEOjGMbttv1r9fSCn5S610w==} engines: {node: '>=10'} @@ -6263,6 +6567,13 @@ packages: process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + process-warning@5.0.0: + resolution: {integrity: sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA==} + + process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + progress@2.0.3: resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} engines: {node: '>=0.4.0'} @@ -6288,6 +6599,10 @@ packages: resolution: {integrity: sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw==} hasBin: true + protobufjs@7.2.5: + resolution: {integrity: sha512-gGXRSXvxQ7UiPgfw8gevrfRWcTlSbOFg+p/N+JVJEK5VhueL2miT6qTymqAmjr1Q5WbOCyJbyrk6JfWKwlFn6A==} + engines: {node: '>=12.0.0'} + protobufjs@7.4.0: resolution: {integrity: sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw==} engines: {node: '>=12.0.0'} @@ -6344,6 +6659,9 @@ packages: queue@6.0.2: resolution: {integrity: sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==} + quick-format-unescaped@4.0.4: + resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} + quick-lru@4.0.1: resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} engines: {node: '>=8'} @@ -6402,11 +6720,26 @@ packages: peerDependencies: react-native: '>=0.56' + react-native-quick-base64@2.2.0: + resolution: {integrity: sha512-r7/BRsRl8QKEhS0JsHW6QX9+8LrC6NNWlwNnBnZ69h2kbcfABYsUILT71obrs9fqElEIMzuYSI5aHID955akyQ==} + peerDependencies: + react: '*' + react-native: '*' + + react-native-quick-crypto@0.7.14: + resolution: {integrity: sha512-ePl0pNgw0TCl9sn9zVX6es58PHXIA6pdDm5+dHawypD+cacyvzfpAFEqYR6opFtnBff/HHtsQrS0zX0AAfwodQ==} + react-native-securerandom@0.1.1: resolution: {integrity: sha512-CozcCx0lpBLevxiXEb86kwLRalBCHNjiGPlw3P7Fi27U6ZLdfjOCNRHD1LtBKcvPvI3TvkBXB3GOtLvqaYJLGw==} peerDependencies: react-native: '*' + react-native-zstd@1.1.0: + resolution: {integrity: sha512-x/PBfWpUOfzP8oBVMj8SwjKJdYYhRx7LGh65A9kkrK1FprJlWWEt8MX8hZFgYfIkuRx1n4yRpeHEA+KM9PHtlQ==} + peerDependencies: + react: '*' + react-native: '*' + react-native@0.78.1: resolution: {integrity: sha512-3CK/xxX02GeeVFyrXbsHvREZFVaXwHW43Km/EdYITn5G32cccWTGaqY9QdPddEBLw5O3BPip3LHbR1SywE0cpA==} engines: {node: '>=18'} @@ -6449,6 +6782,10 @@ packages: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'} + readable-stream@4.7.0: + resolution: {integrity: sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + readable-web-to-node-stream@3.0.2: resolution: {integrity: sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==} engines: {node: '>=8'} @@ -6459,6 +6796,10 @@ packages: readonly-date@1.0.0: resolution: {integrity: sha512-tMKIV7hlk0h4mO3JTmmVuIlJVXjKk3Sep9Bf5OH0O+758ruuVkUy2J9SttDLm91IEX/WHlXPSpxMGjPj4beMIQ==} + real-require@0.2.0: + resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} + engines: {node: '>= 12.13.0'} + recast@0.21.5: resolution: {integrity: sha512-hjMmLaUXAm1hIuTqOdeYObMslq/q+Xff6QE3Y2P+uoHAg2nmVlLBps2hzh1UJDdMtDTMXOFewK6ky51JQIeECg==} engines: {node: '>= 4'} @@ -6585,6 +6926,9 @@ packages: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + rfc4648@1.5.4: + resolution: {integrity: sha512-rRg/6Lb+IGfJqO05HZkN50UtY7K/JhxJag1kP23+zyMfrvoB0B7RWv06MbOzoc79RgCdNTiUaNsTT1AJZ7Z+cg==} + rimraf@2.2.8: resolution: {integrity: sha512-R5KMKHnPAQaZMqLOsyuyUmcIjSeDm+73eoqQpaXA7AZ22BL+6C+1mcUscgOsNd8WVlJuvlgAPsegcx7pjlV0Dg==} deprecated: Rimraf versions prior to v4 are no longer supported @@ -6646,6 +6990,10 @@ packages: resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} engines: {node: '>= 0.4'} + safe-stable-stringify@2.5.0: + resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} + engines: {node: '>=10'} + safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} @@ -6659,6 +7007,9 @@ packages: resolution: {integrity: sha512-lDFs9AAIaWP9UCdtWrotXWWF9t8PWgQDcxqgAnpM9rMqxb3Oaq2J0thzPVSxBwdJgyQtkU/sYtFtbM1RSt/iYA==} engines: {node: '>=18.0.0'} + secure-json-parse@2.7.0: + resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} + selfsigned@2.4.1: resolution: {integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==} engines: {node: '>=10'} @@ -6747,6 +7098,12 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} + simple-concat@1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + + simple-get@4.0.1: + resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + simple-plist@1.3.1: resolution: {integrity: sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw==} @@ -6770,6 +7127,9 @@ packages: engines: {node: '>=6'} hasBin: true + sonic-boom@4.2.0: + resolution: {integrity: sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww==} + source-map-js@1.2.0: resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} engines: {node: '>=0.10.0'} @@ -6792,6 +7152,9 @@ packages: resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} engines: {node: '>= 8'} + spark-md5@3.0.2: + resolution: {integrity: sha512-wcFzz9cDfbuqe0FZzfi2or1sgyIrsDwmPwfZC4hiNidPdPINjeUwNfv5kldczoEAcjl9Y1L3SM7Uz2PUEQzxQw==} + spawndamnit@2.0.0: resolution: {integrity: sha512-j4JKEcncSjFlqIwU5L/rp2N5SIPsdxaRsIv678+TZxZ0SRDJTm8JrxJMjE/XuiEZNEir3S8l0Fa3Ke339WI4qA==} @@ -6811,6 +7174,10 @@ packages: resolution: {integrity: sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==} engines: {node: '>=6'} + split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} + split@1.0.1: resolution: {integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==} @@ -6999,6 +7366,13 @@ packages: resolution: {integrity: sha512-sQV7phh2WCYAn81oAkakC5qjq2Ml0g8ozqz03wOGnx9dDlG1de6yrF+0RAzSJD8fPUow3PTSMf2SAbOGxb93BA==} engines: {node: '>=0.10'} + tar-fs@2.1.3: + resolution: {integrity: sha512-090nwYJDmlhwFwEW3QQl+vaNnxsO2yVsd45eTKRBzSzu+hlb1w2K9inVq5b0ngXuLVqQ4ApvsUHHnu/zQNkWAg==} + + tar-stream@2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + tar@6.2.1: resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} engines: {node: '>=10'} @@ -7058,6 +7432,9 @@ packages: thenify@3.3.1: resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + thread-stream@3.1.0: + resolution: {integrity: sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==} + throat@5.0.0: resolution: {integrity: sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==} @@ -7181,6 +7558,12 @@ packages: engines: {node: '>=8.0.0'} hasBin: true + tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + + tweetnacl@1.0.3: + resolution: {integrity: sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==} + type-check@0.3.2: resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} engines: {node: '>= 0.8.0'} @@ -7351,6 +7734,9 @@ packages: util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + util@0.12.5: + resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} + utils-merge@1.0.1: resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} engines: {node: '>= 0.4.0'} @@ -7627,9 +8013,13 @@ packages: zod@3.24.2: resolution: {integrity: sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==} + zstd-napi@0.0.10: + resolution: {integrity: sha512-pwnG+auSiIrD2BNSIpPEUtcRSK33cfYmKo3sJPTohFiPqPci9F4SIRPR7gGeI45Maj4nFoyyxzT2YDxVXIIgzQ==} + engines: {node: ^12.22.0 || ^14.17.0 || ^15.12.0 || >=16} + snapshots: - '@2060.io/ffi-napi@4.0.9': + '@2060.io/ffi-napi@4.0.9(patch_hash=6ujtm5ladmp54sbez4f5d2uhca)': dependencies: '@2060.io/ref-napi': 3.0.6 debug: 4.4.0 @@ -9119,6 +9509,14 @@ snapshots: '@cosmjs/utils@0.33.1': {} + '@craftzdog/react-native-buffer@6.1.0(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1))(react@18.3.1)': + dependencies: + ieee754: 1.2.1 + react-native-quick-base64: 2.2.0(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1))(react@18.3.1) + transitivePeerDependencies: + - react + - react-native + '@cspotcode/source-map-support@0.8.1': dependencies: '@jridgewell/trace-mapping': 0.3.9 @@ -9355,6 +9753,129 @@ snapshots: '@esbuild/win32-x64@0.23.1': optional: true + '@ethersproject/abi@5.8.0': + dependencies: + '@ethersproject/address': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/constants': 5.8.0 + '@ethersproject/hash': 5.8.0 + '@ethersproject/keccak256': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/strings': 5.8.0 + + '@ethersproject/abstract-provider@5.8.0': + dependencies: + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/networks': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/transactions': 5.8.0 + '@ethersproject/web': 5.8.0 + + '@ethersproject/abstract-signer@5.8.0': + dependencies: + '@ethersproject/abstract-provider': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/properties': 5.8.0 + + '@ethersproject/address@5.8.0': + dependencies: + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/keccak256': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/rlp': 5.8.0 + + '@ethersproject/base64@5.8.0': + dependencies: + '@ethersproject/bytes': 5.8.0 + + '@ethersproject/bignumber@5.8.0': + dependencies: + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 + bn.js: 5.2.1 + + '@ethersproject/bytes@5.8.0': + dependencies: + '@ethersproject/logger': 5.8.0 + + '@ethersproject/constants@5.8.0': + dependencies: + '@ethersproject/bignumber': 5.8.0 + + '@ethersproject/hash@5.8.0': + dependencies: + '@ethersproject/abstract-signer': 5.8.0 + '@ethersproject/address': 5.8.0 + '@ethersproject/base64': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/keccak256': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/strings': 5.8.0 + + '@ethersproject/keccak256@5.8.0': + dependencies: + '@ethersproject/bytes': 5.8.0 + js-sha3: 0.8.0 + + '@ethersproject/logger@5.8.0': {} + + '@ethersproject/networks@5.8.0': + dependencies: + '@ethersproject/logger': 5.8.0 + + '@ethersproject/properties@5.8.0': + dependencies: + '@ethersproject/logger': 5.8.0 + + '@ethersproject/rlp@5.8.0': + dependencies: + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 + + '@ethersproject/signing-key@5.8.0': + dependencies: + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/properties': 5.8.0 + bn.js: 5.2.1 + elliptic: 6.6.1 + hash.js: 1.1.7 + + '@ethersproject/strings@5.8.0': + dependencies: + '@ethersproject/bytes': 5.8.0 + '@ethersproject/constants': 5.8.0 + '@ethersproject/logger': 5.8.0 + + '@ethersproject/transactions@5.8.0': + dependencies: + '@ethersproject/address': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/constants': 5.8.0 + '@ethersproject/keccak256': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/rlp': 5.8.0 + '@ethersproject/signing-key': 5.8.0 + + '@ethersproject/web@5.8.0': + dependencies: + '@ethersproject/base64': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/strings': 5.8.0 + '@expo/bunyan@4.0.0': dependencies: uuid: 8.3.2 @@ -9640,6 +10161,18 @@ snapshots: dependencies: graphql: 15.8.0 + '@grpc/grpc-js@1.13.4': + dependencies: + '@grpc/proto-loader': 0.7.15 + '@js-sdsl/ordered-map': 4.4.2 + + '@grpc/proto-loader@0.7.15': + dependencies: + lodash.camelcase: 4.3.0 + long: 5.3.1 + protobufjs: 7.4.0 + yargs: 17.7.2 + '@hapi/bourne@3.0.0': {} '@hapi/hoek@9.3.0': @@ -9650,9 +10183,92 @@ snapshots: '@hapi/hoek': 9.3.0 optional: true + '@hashgraph/cryptography@1.7.4(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1))': + dependencies: + '@noble/curves': 1.8.1 + asn1js: 3.0.6 + bignumber.js: 9.1.2 + bn.js: 5.2.1 + buffer: 6.0.3 + crypto-js: 4.2.0 + forge-light: 1.1.4 + js-base64: 3.7.7 + react-native-get-random-values: 1.11.0(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1)) + spark-md5: 3.0.2 + tweetnacl: 1.0.3 + utf8: 3.0.0 + transitivePeerDependencies: + - react-native + + '@hashgraph/proto@2.18.5': + dependencies: + long: 5.3.1 + protobufjs: 7.2.5 + + '@hashgraph/sdk@2.65.1(bn.js@5.2.1)(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1))': + dependencies: + '@ethersproject/abi': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/rlp': 5.8.0 + '@grpc/grpc-js': 1.13.4 + '@hashgraph/cryptography': 1.7.4(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1)) + '@hashgraph/proto': 2.18.5 + bignumber.js: 9.1.2 + bn.js: 5.2.1 + crypto-js: 4.2.0 + js-base64: 3.7.7 + long: 5.3.1 + pino: 9.7.0 + pino-pretty: 13.0.0 + protobufjs: 7.2.5 + rfc4648: 1.5.4 + utf8: 3.0.0 + transitivePeerDependencies: + - expo-crypto + - react-native + + '@hiero-did-sdk-js/anoncreds@0.0.1(bn.js@5.2.1)(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1))(react@18.3.1)': + dependencies: + '@hiero-did-sdk-js/hcs': 0.0.1(bn.js@5.2.1)(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1))(react@18.3.1) + '@hiero-did-sdk-js/zstd': 0.0.1(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1))(react@18.3.1) + transitivePeerDependencies: + - bn.js + - expo-crypto + - react + - react-native + + '@hiero-did-sdk-js/crypto@0.0.1(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1))(react@18.3.1)': + dependencies: + crypto: 1.0.1 + crypto-js: 4.2.0 + react-native-quick-crypto: 0.7.14(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1))(react@18.3.1) + transitivePeerDependencies: + - react + - react-native + + '@hiero-did-sdk-js/hcs@0.0.1(bn.js@5.2.1)(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1))(react@18.3.1)': + dependencies: + '@hashgraph/sdk': 2.65.1(bn.js@5.2.1)(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1)) + '@hiero-did-sdk-js/crypto': 0.0.1(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1))(react@18.3.1) + '@hiero-did-sdk-js/zstd': 0.0.1(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1))(react@18.3.1) + transitivePeerDependencies: + - bn.js + - expo-crypto + - react + - react-native + + '@hiero-did-sdk-js/zstd@0.0.1(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1))(react@18.3.1)': + dependencies: + react-native-zstd: 1.1.0(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1))(react@18.3.1) + zstd-napi: 0.0.10 + transitivePeerDependencies: + - react + - react-native + '@hyperledger/anoncreds-nodejs@0.3.1': dependencies: - '@2060.io/ffi-napi': 4.0.9 + '@2060.io/ffi-napi': 4.0.9(patch_hash=6ujtm5ladmp54sbez4f5d2uhca) '@2060.io/ref-napi': 3.0.6 '@hyperledger/anoncreds-shared': 0.3.1 ref-array-di: 1.2.2 @@ -9666,7 +10282,7 @@ snapshots: '@hyperledger/indy-vdr-nodejs@0.2.2': dependencies: - '@2060.io/ffi-napi': 4.0.9 + '@2060.io/ffi-napi': 4.0.9(patch_hash=6ujtm5ladmp54sbez4f5d2uhca) '@2060.io/ref-napi': 3.0.6 '@hyperledger/indy-vdr-shared': 0.2.2 '@mapbox/node-pre-gyp': 1.0.11 @@ -9928,6 +10544,8 @@ snapshots: dependencies: '@js-joda/core': 5.6.3 + '@js-sdsl/ordered-map@4.4.2': {} + '@koa/bodyparser@5.1.1(koa@2.16.0)': dependencies: co-body: 6.2.0 @@ -10046,7 +10664,7 @@ snapshots: '@openwallet-foundation/askar-nodejs@0.3.1': dependencies: - '@2060.io/ffi-napi': 4.0.9 + '@2060.io/ffi-napi': 4.0.9(patch_hash=6ujtm5ladmp54sbez4f5d2uhca) '@2060.io/ref-napi': 3.0.6 '@mapbox/node-pre-gyp': 1.0.11 '@openwallet-foundation/askar-shared': 0.3.1 @@ -10617,6 +11235,8 @@ snapshots: '@scure/base@1.2.1': {} + '@scure/base@1.2.6': {} + '@sd-jwt/core@0.7.2': dependencies: '@sd-jwt/decode': 0.7.2 @@ -10770,6 +11390,87 @@ snapshots: '@stablelib/wipe@2.0.1': {} + '@swiss-digital-assets-institute/core@0.3.0(bn.js@5.2.1)(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1))': + dependencies: + '@hashgraph/sdk': 2.65.1(bn.js@5.2.1)(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1)) + '@scure/base': 1.2.6 + cbor2: 1.12.0 + transitivePeerDependencies: + - bn.js + - expo-crypto + - react-native + + '@swiss-digital-assets-institute/lifecycle@0.3.0(bn.js@5.2.1)(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1))': + dependencies: + '@swiss-digital-assets-institute/core': 0.3.0(bn.js@5.2.1)(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1)) + transitivePeerDependencies: + - bn.js + - expo-crypto + - react-native + + '@swiss-digital-assets-institute/messages@0.3.0(bn.js@5.2.1)(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1))': + dependencies: + '@hashgraph/sdk': 2.65.1(bn.js@5.2.1)(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1)) + '@swiss-digital-assets-institute/core': 0.3.0(bn.js@5.2.1)(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1)) + '@swiss-digital-assets-institute/lifecycle': 0.3.0(bn.js@5.2.1)(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1)) + '@swiss-digital-assets-institute/resolver': 0.3.0(bn.js@5.2.1)(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1)) + transitivePeerDependencies: + - bn.js + - expo-crypto + - react-native + + '@swiss-digital-assets-institute/publisher-internal@0.3.0(bn.js@5.2.1)(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1))': + dependencies: + '@hashgraph/sdk': 2.65.1(bn.js@5.2.1)(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1)) + '@swiss-digital-assets-institute/core': 0.3.0(bn.js@5.2.1)(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1)) + transitivePeerDependencies: + - bn.js + - expo-crypto + - react-native + + '@swiss-digital-assets-institute/registrar@0.3.0(bn.js@5.2.1)(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1))': + dependencies: + '@hashgraph/sdk': 2.65.1(bn.js@5.2.1)(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1)) + '@swiss-digital-assets-institute/core': 0.3.0(bn.js@5.2.1)(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1)) + '@swiss-digital-assets-institute/lifecycle': 0.3.0(bn.js@5.2.1)(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1)) + '@swiss-digital-assets-institute/messages': 0.3.0(bn.js@5.2.1)(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1)) + '@swiss-digital-assets-institute/publisher-internal': 0.3.0(bn.js@5.2.1)(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1)) + '@swiss-digital-assets-institute/resolver': 0.3.0(bn.js@5.2.1)(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1)) + '@swiss-digital-assets-institute/signer-internal': 0.3.0(bn.js@5.2.1)(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1)) + '@swiss-digital-assets-institute/verifier-internal': 0.3.0(bn.js@5.2.1)(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1)) + transitivePeerDependencies: + - bn.js + - expo-crypto + - react-native + + '@swiss-digital-assets-institute/resolver@0.3.0(bn.js@5.2.1)(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1))': + dependencies: + '@hashgraph/sdk': 2.65.1(bn.js@5.2.1)(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1)) + '@swiss-digital-assets-institute/core': 0.3.0(bn.js@5.2.1)(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1)) + '@swiss-digital-assets-institute/verifier-internal': 0.3.0(bn.js@5.2.1)(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1)) + transitivePeerDependencies: + - bn.js + - expo-crypto + - react-native + + '@swiss-digital-assets-institute/signer-internal@0.3.0(bn.js@5.2.1)(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1))': + dependencies: + '@hashgraph/sdk': 2.65.1(bn.js@5.2.1)(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1)) + '@swiss-digital-assets-institute/core': 0.3.0(bn.js@5.2.1)(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1)) + transitivePeerDependencies: + - bn.js + - expo-crypto + - react-native + + '@swiss-digital-assets-institute/verifier-internal@0.3.0(bn.js@5.2.1)(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1))': + dependencies: + '@hashgraph/sdk': 2.65.1(bn.js@5.2.1)(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1)) + '@swiss-digital-assets-institute/core': 0.3.0(bn.js@5.2.1)(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1)) + transitivePeerDependencies: + - bn.js + - expo-crypto + - react-native + '@szmarczak/http-timer@5.0.1': dependencies: defer-to-connect: 2.0.1 @@ -11205,6 +11906,12 @@ snapshots: pvutils: 1.1.3 tslib: 2.8.1 + asn1js@3.0.6: + dependencies: + pvtsutils: 1.3.6 + pvutils: 1.1.3 + tslib: 2.8.1 + ast-types@0.15.2: dependencies: tslib: 2.8.1 @@ -11229,6 +11936,8 @@ snapshots: at-least-node@1.0.0: {} + atomic-sleep@1.0.0: {} + available-typed-arrays@1.0.7: dependencies: possible-typed-array-names: 1.0.0 @@ -11592,6 +12301,11 @@ snapshots: normalize-url: 8.0.1 responselike: 3.0.0 + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + call-bind@1.0.7: dependencies: es-define-property: 1.0.0 @@ -11600,6 +12314,11 @@ snapshots: get-intrinsic: 1.2.4 set-function-length: 1.2.2 + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + caller-callsite@2.0.0: dependencies: callsites: 2.0.0 @@ -11628,6 +12347,8 @@ snapshots: canonicalize@2.0.0: {} + cbor2@1.12.0: {} + chalk@2.4.2: dependencies: ansi-styles: 3.2.1 @@ -11645,6 +12366,8 @@ snapshots: charenc@0.0.2: {} + chownr@1.1.4: {} + chownr@2.0.0: {} chownr@3.0.0: {} @@ -11752,6 +12475,8 @@ snapshots: colorette@1.4.0: optional: true + colorette@2.0.20: {} + combined-stream@1.0.8: dependencies: delayed-stream: 1.0.0 @@ -11918,12 +12643,16 @@ snapshots: crypt@0.0.2: {} + crypto-js@4.2.0: {} + crypto-ld@6.0.0: {} crypto-random-string@1.0.0: {} crypto-random-string@2.0.0: {} + crypto@1.0.1: {} + csv-generate@3.4.3: {} csv-parse@4.16.3: {} @@ -11966,6 +12695,8 @@ snapshots: es-errors: 1.3.0 is-data-view: 1.0.1 + dateformat@4.6.3: {} + dayjs@1.11.11: optional: true @@ -12105,6 +12836,12 @@ snapshots: dotenv@16.4.5: {} + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + eastasianwidth@0.2.0: {} ec-compression@0.0.1-alpha.12: {} @@ -12220,12 +12957,18 @@ snapshots: dependencies: get-intrinsic: 1.2.4 + es-define-property@1.0.1: {} + es-errors@1.3.0: {} es-object-atoms@1.0.0: dependencies: es-errors: 1.3.0 + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + es-set-tostringtag@2.0.3: dependencies: get-intrinsic: 1.2.4 @@ -12358,6 +13101,8 @@ snapshots: exit@0.1.2: {} + expand-template@2.0.3: {} + expect@29.7.0: dependencies: '@jest/expect-utils': 29.7.0 @@ -12502,6 +13247,8 @@ snapshots: fast-base64-decode@1.0.0: {} + fast-copy@3.0.2: {} + fast-deep-equal@3.1.3: {} fast-glob@3.3.2: @@ -12516,6 +13263,8 @@ snapshots: fast-levenshtein@2.0.6: {} + fast-redact@3.5.0: {} + fast-safe-stringify@2.1.1: {} fast-text-encoding@1.0.6: {} @@ -12669,6 +13418,8 @@ snapshots: cross-spawn: 7.0.3 signal-exit: 4.1.0 + forge-light@1.1.4: {} + form-data-encoder@2.1.4: {} form-data@3.0.1: @@ -12701,6 +13452,8 @@ snapshots: fresh@0.5.2: {} + fs-constants@1.0.0: {} + fs-extra@7.0.1: dependencies: graceful-fs: 4.2.11 @@ -12775,10 +13528,28 @@ snapshots: has-symbols: 1.0.3 hasown: 2.0.2 + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + get-package-type@0.1.0: {} get-port@3.2.0: {} + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + get-stream@4.1.0: dependencies: pump: 3.0.0 @@ -12803,6 +13574,8 @@ snapshots: getenv@1.0.0: {} + github-from-package@0.0.0: {} + glob-parent@5.1.2: dependencies: is-glob: 4.0.3 @@ -12870,6 +13643,8 @@ snapshots: dependencies: get-intrinsic: 1.2.4 + gopd@1.2.0: {} + got@13.0.0: dependencies: '@sindresorhus/is': 5.6.0 @@ -12911,6 +13686,8 @@ snapshots: has-symbols@1.0.3: {} + has-symbols@1.1.0: {} + has-tostringtag@1.0.2: dependencies: has-symbols: 1.0.3 @@ -12926,6 +13703,8 @@ snapshots: dependencies: function-bind: 1.1.2 + help-me@5.0.0: {} + hermes-estree@0.19.1: {} hermes-estree@0.25.1: {} @@ -13103,6 +13882,11 @@ snapshots: ipaddr.js@2.2.0: {} + is-arguments@1.2.0: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + is-array-buffer@3.0.4: dependencies: call-bind: 1.0.7 @@ -13678,8 +14462,12 @@ snapshots: jose@5.9.6: {} + joycon@3.1.1: {} + js-base64@3.7.7: {} + js-sha3@0.8.0: {} + js-tokens@4.0.0: {} js-yaml@3.14.1: @@ -13965,6 +14753,8 @@ snapshots: dependencies: p-locate: 5.0.0 + lodash.camelcase@4.3.0: {} + lodash.debounce@4.0.8: {} lodash.defaults@4.2.0: {} @@ -14053,6 +14843,8 @@ snapshots: marky@1.2.5: {} + math-intrinsics@1.1.0: {} + md5-file@3.2.3: dependencies: buffer-alloc: 1.2.0 @@ -14627,6 +15419,8 @@ snapshots: mixme@0.5.10: {} + mkdirp-classic@0.5.3: {} + mkdirp@0.5.6: dependencies: minimist: 1.2.8 @@ -14678,6 +15472,8 @@ snapshots: nanoid@5.0.9: {} + napi-build-utils@2.0.0: {} + natural-compare@1.4.0: {} ncp@2.0.0: @@ -14702,10 +15498,16 @@ snapshots: json-stringify-safe: 5.0.1 propagate: 2.0.1 + node-abi@3.75.0: + dependencies: + semver: 7.6.2 + node-addon-api@3.2.1: {} node-addon-api@5.1.0: {} + node-addon-api@7.1.1: {} + node-dir@0.1.17: dependencies: minimatch: 3.1.2 @@ -14821,6 +15623,8 @@ snapshots: oidc-token-hash@5.0.3: {} + on-exit-leak-free@2.1.2: {} + on-finished@2.3.0: dependencies: ee-first: 1.1.1 @@ -15003,6 +15807,42 @@ snapshots: pify@4.0.1: {} + pino-abstract-transport@2.0.0: + dependencies: + split2: 4.2.0 + + pino-pretty@13.0.0: + dependencies: + colorette: 2.0.20 + dateformat: 4.6.3 + fast-copy: 3.0.2 + fast-safe-stringify: 2.1.1 + help-me: 5.0.0 + joycon: 3.1.1 + minimist: 1.2.8 + on-exit-leak-free: 2.1.2 + pino-abstract-transport: 2.0.0 + pump: 3.0.0 + secure-json-parse: 2.7.0 + sonic-boom: 4.2.0 + strip-json-comments: 3.1.1 + + pino-std-serializers@7.0.0: {} + + pino@9.7.0: + dependencies: + atomic-sleep: 1.0.0 + fast-redact: 3.5.0 + on-exit-leak-free: 2.1.2 + pino-abstract-transport: 2.0.0 + pino-std-serializers: 7.0.0 + process-warning: 5.0.0 + quick-format-unescaped: 4.0.4 + real-require: 0.2.0 + safe-stable-stringify: 2.5.0 + sonic-boom: 4.2.0 + thread-stream: 3.1.0 + pirates@4.0.6: {} pkg-dir@3.0.0: @@ -15029,6 +15869,21 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.0 + prebuild-install@7.1.3: + dependencies: + detect-libc: 2.0.3 + expand-template: 2.0.3 + github-from-package: 0.0.0 + minimist: 1.2.8 + mkdirp-classic: 0.5.3 + napi-build-utils: 2.0.0 + node-abi: 3.75.0 + pump: 3.0.0 + rc: 1.2.8 + simple-get: 4.0.1 + tar-fs: 2.1.3 + tunnel-agent: 0.6.0 + preferred-pm@3.1.3: dependencies: find-up: 5.0.0 @@ -15065,6 +15920,10 @@ snapshots: process-nextick-args@2.0.1: {} + process-warning@5.0.0: {} + + process@0.11.10: {} + progress@2.0.3: {} promise@7.3.1: @@ -15104,6 +15963,21 @@ snapshots: '@types/node': 18.18.8 long: 4.0.0 + protobufjs@7.2.5: + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/base64': 1.1.2 + '@protobufjs/codegen': 2.0.4 + '@protobufjs/eventemitter': 1.1.0 + '@protobufjs/fetch': 1.1.0 + '@protobufjs/float': 1.0.2 + '@protobufjs/inquire': 1.1.0 + '@protobufjs/path': 1.1.2 + '@protobufjs/pool': 1.1.0 + '@protobufjs/utf8': 1.1.0 + '@types/node': 18.18.8 + long: 5.3.1 + protobufjs@7.4.0: dependencies: '@protobufjs/aspromise': 1.1.2 @@ -15170,6 +16044,8 @@ snapshots: dependencies: inherits: 2.0.4 + quick-format-unescaped@4.0.4: {} + quick-lru@4.0.1: {} quick-lru@5.1.1: {} @@ -15229,12 +16105,33 @@ snapshots: fast-base64-decode: 1.0.0 react-native: 0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1) + react-native-quick-base64@2.2.0(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1))(react@18.3.1): + dependencies: + react: 18.3.1 + react-native: 0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1) + + react-native-quick-crypto@0.7.14(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1))(react@18.3.1): + dependencies: + '@craftzdog/react-native-buffer': 6.1.0(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1))(react@18.3.1) + events: 3.3.0 + readable-stream: 4.7.0 + string_decoder: 1.3.0 + util: 0.12.5 + transitivePeerDependencies: + - react + - react-native + react-native-securerandom@0.1.1(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1)): dependencies: base64-js: 1.5.1 react-native: 0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1) optional: true + react-native-zstd@1.1.0(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1))(react@18.3.1): + dependencies: + react: 18.3.1 + react-native: 0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1) + react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1): dependencies: '@jest/create-cache-key-function': 29.7.0 @@ -15327,6 +16224,14 @@ snapshots: string_decoder: 1.3.0 util-deprecate: 1.0.2 + readable-stream@4.7.0: + dependencies: + abort-controller: 3.0.0 + buffer: 6.0.3 + events: 3.3.0 + process: 0.11.10 + string_decoder: 1.3.0 + readable-web-to-node-stream@3.0.2: dependencies: readable-stream: 3.6.2 @@ -15335,6 +16240,8 @@ snapshots: readonly-date@1.0.0: {} + real-require@0.2.0: {} + recast@0.21.5: dependencies: ast-types: 0.15.2 @@ -15468,6 +16375,8 @@ snapshots: reusify@1.0.4: {} + rfc4648@1.5.4: {} + rimraf@2.2.8: optional: true @@ -15526,6 +16435,8 @@ snapshots: es-errors: 1.3.0 is-regex: 1.1.4 + safe-stable-stringify@2.5.0: {} + safer-buffer@2.1.2: {} sax@1.4.1: {} @@ -15538,6 +16449,8 @@ snapshots: node-addon-api: 5.1.0 node-gyp-build: 4.8.1 + secure-json-parse@2.7.0: {} + selfsigned@2.4.1: dependencies: '@types/node-forge': 1.3.11 @@ -15651,6 +16564,14 @@ snapshots: signal-exit@4.1.0: {} + simple-concat@1.0.1: {} + + simple-get@4.0.1: + dependencies: + decompress-response: 6.0.0 + once: 1.4.0 + simple-concat: 1.0.1 + simple-plist@1.3.1: dependencies: bplist-creator: 0.1.0 @@ -15679,6 +16600,10 @@ snapshots: wcwidth: 1.0.1 yargs: 15.4.1 + sonic-boom@4.2.0: + dependencies: + atomic-sleep: 1.0.0 + source-map-js@1.2.0: {} source-map-support@0.5.13: @@ -15698,6 +16623,8 @@ snapshots: source-map@0.7.4: optional: true + spark-md5@3.0.2: {} + spawndamnit@2.0.0: dependencies: cross-spawn: 5.1.0 @@ -15719,6 +16646,8 @@ snapshots: split-on-first@1.1.0: {} + split2@4.2.0: {} + split@1.0.1: dependencies: through: 2.3.8 @@ -15909,6 +16838,21 @@ snapshots: symbol-observable@2.0.3: {} + tar-fs@2.1.3: + dependencies: + chownr: 1.1.4 + mkdirp-classic: 0.5.3 + pump: 3.0.0 + tar-stream: 2.2.0 + + tar-stream@2.2.0: + dependencies: + bl: 4.1.0 + end-of-stream: 1.4.4 + fs-constants: 1.0.0 + inherits: 2.0.4 + readable-stream: 3.6.2 + tar@6.2.1: dependencies: chownr: 2.0.0 @@ -15985,6 +16929,10 @@ snapshots: dependencies: any-promise: 1.3.0 + thread-stream@3.1.0: + dependencies: + real-require: 0.2.0 + throat@5.0.0: {} through2@2.0.5: @@ -16025,7 +16973,7 @@ snapshots: traverse@0.6.9: dependencies: - gopd: 1.0.1 + gopd: 1.2.0 typedarray.prototype.slice: 1.0.3 which-typed-array: 1.1.15 @@ -16100,6 +17048,12 @@ snapshots: wcwidth: 1.0.1 yargs: 17.7.2 + tunnel-agent@0.6.0: + dependencies: + safe-buffer: 5.2.1 + + tweetnacl@1.0.3: {} + type-check@0.3.2: dependencies: prelude-ls: 1.1.2 @@ -16254,6 +17208,14 @@ snapshots: util-deprecate@1.0.2: {} + util@0.12.5: + dependencies: + inherits: 2.0.4 + is-arguments: 1.2.0 + is-generator-function: 1.0.10 + is-typed-array: 1.1.13 + which-typed-array: 1.1.15 + utils-merge@1.0.1: {} uuid@10.0.0: {} @@ -16501,3 +17463,9 @@ snapshots: zod: 3.24.2 zod@3.24.2: {} + + zstd-napi@0.0.10: + dependencies: + '@types/node': 18.18.8 + node-addon-api: 7.1.1 + prebuild-install: 7.1.3 From e862050a91aed4c3b21f8981d0b45c1a82e16d3a Mon Sep 17 00:00:00 2001 From: "andrey.kononov" Date: Tue, 10 Jun 2025 23:27:55 +0300 Subject: [PATCH 02/89] Added DID registry Added tests --- babel.config.json | 12 + demo-openid/package.json | 18 +- demo/package.json | 15 +- demo/src/BaseAgent.ts | 16 +- jest.config.base.ts | 1 + package.json | 49 +- packages/action-menu/package.json | 12 +- packages/anoncreds/package.json | 12 +- packages/askar/package.json | 22 +- packages/cheqd/package.json | 14 +- packages/core/package.json | 54 +- packages/didcomm/package.json | 18 +- packages/drpc/package.json | 10 +- packages/hedera/jest.config.ts | 13 +- packages/hedera/package.json | 6 +- .../hedera/src/dids/HederaDidRegistrar.ts | 133 +- packages/hedera/src/dids/HederaDidResolver.ts | 46 +- .../hedera/src/ledger/HederaLedgerService.ts | 10 +- packages/hedera/src/ledger/index.ts | 1 + .../tests/HederaAnoncredsRegistry.e2e.test.ts | 197 + packages/hedera/tests/HederaDid.e2e.test.ts | 34 + .../hedera/tests/HederaW3cFlow.e2e.test.ts | 192 + packages/hedera/tests/fixtures/fixtures.ts | 182 + packages/hedera/tests/fixtures/index.ts | 1 + packages/hedera/tests/setup.ts | 1 - packages/hedera/tests/setupHederaModule.ts | 21 - .../tests/utils/InMemoryTailsFileService.ts | 59 + packages/hedera/tests/utils/hederaModule.ts | 66 + packages/hedera/tests/utils/index.ts | 3 + packages/hedera/tests/utils/testCache.ts | 28 + packages/hedera/tests/utils/utils.ts | 5 + packages/hedera/tsconfig.json | 3 +- .../indy-sdk-to-askar-migration/package.json | 12 +- packages/indy-vdr/package.json | 16 +- packages/node/package.json | 20 +- packages/openid4vc/package.json | 22 +- packages/question-answer/package.json | 12 +- packages/react-native/package.json | 16 +- packages/redis-cache/package.json | 8 +- packages/tenants/package.json | 12 +- pnpm-lock.yaml | 7215 ++++++++--------- samples/extension-module/package.json | 14 +- samples/tails/package.json | 12 +- 43 files changed, 4653 insertions(+), 3960 deletions(-) create mode 100644 babel.config.json create mode 100644 packages/hedera/tests/HederaAnoncredsRegistry.e2e.test.ts create mode 100644 packages/hedera/tests/HederaDid.e2e.test.ts create mode 100644 packages/hedera/tests/HederaW3cFlow.e2e.test.ts create mode 100644 packages/hedera/tests/fixtures/fixtures.ts create mode 100644 packages/hedera/tests/fixtures/index.ts delete mode 100644 packages/hedera/tests/setup.ts delete mode 100644 packages/hedera/tests/setupHederaModule.ts create mode 100644 packages/hedera/tests/utils/InMemoryTailsFileService.ts create mode 100644 packages/hedera/tests/utils/hederaModule.ts create mode 100644 packages/hedera/tests/utils/index.ts create mode 100644 packages/hedera/tests/utils/testCache.ts create mode 100644 packages/hedera/tests/utils/utils.ts diff --git a/babel.config.json b/babel.config.json new file mode 100644 index 0000000000..72009cef1f --- /dev/null +++ b/babel.config.json @@ -0,0 +1,12 @@ +{ + "presets": [ + [ + "@babel/preset-env", + { + "targets": { + "node": "current" + } + } + ] + ] +} diff --git a/demo-openid/package.json b/demo-openid/package.json index 8d940615fa..15dbd3a003 100644 --- a/demo-openid/package.json +++ b/demo-openid/package.json @@ -18,11 +18,11 @@ "dependencies": { "@hyperledger/anoncreds-nodejs": "^0.3.1", "@hyperledger/indy-vdr-nodejs": "^0.2.2", - "@koa/bodyparser": "^5.1.1", - "@openwallet-foundation/askar-nodejs": "^0.3.1", + "@koa/bodyparser": "^5.1.2", + "@openwallet-foundation/askar-nodejs": "^0.3.2", "express": "^4.21.2", - "inquirer": "^8.2.5", - "jose": "^5.3.0", + "inquirer": "^8.2.6", + "jose": "^5.10.0", "oidc-provider": "^8.8.1" }, "devDependencies": { @@ -30,13 +30,13 @@ "@credo-ts/core": "workspace:*", "@credo-ts/node": "workspace:*", "@credo-ts/openid4vc": "workspace:*", - "@types/express": "^4.17.21", - "@types/figlet": "^1.5.4", - "@types/inquirer": "^8.2.6", + "@types/express": "^4.17.23", + "@types/figlet": "^1.7.0", + "@types/inquirer": "^8.2.11", "@types/oidc-provider": "^8.8.1", "clear": "^0.1.0", - "figlet": "^1.5.2", + "figlet": "^1.8.1", "ts-node": "^10.9.2", - "tsx": "^4.11.0" + "tsx": "^4.19.4" } } diff --git a/demo/package.json b/demo/package.json index 9385bf2ace..6187494141 100644 --- a/demo/package.json +++ b/demo/package.json @@ -13,23 +13,24 @@ "faber": "ts-node src/FaberInquirer.ts" }, "dependencies": { - "@hyperledger/indy-vdr-nodejs": "^0.2.2", "@hyperledger/anoncreds-nodejs": "^0.3.1", - "@openwallet-foundation/askar-nodejs": "^0.3.1", - "inquirer": "^8.2.5" + "@hyperledger/indy-vdr-nodejs": "^0.2.2", + "@openwallet-foundation/askar-nodejs": "^0.3.2", + "inquirer": "^8.2.6" }, "devDependencies": { "@credo-ts/anoncreds": "workspace:*", "@credo-ts/askar": "workspace:*", + "@credo-ts/cheqd": "workspace:*", "@credo-ts/core": "workspace:*", "@credo-ts/didcomm": "workspace:*", + "@credo-ts/hedera": "workspace:*", "@credo-ts/indy-vdr": "workspace:*", - "@credo-ts/cheqd": "workspace:*", "@credo-ts/node": "workspace:*", - "@types/figlet": "^1.5.4", - "@types/inquirer": "^8.2.6", + "@types/figlet": "^1.7.0", + "@types/inquirer": "^8.2.11", "clear": "^0.1.0", - "figlet": "^1.5.2", + "figlet": "^1.8.1", "ts-node": "^10.9.2" } } diff --git a/demo/src/BaseAgent.ts b/demo/src/BaseAgent.ts index 0f19b2fadd..417c8e53f6 100644 --- a/demo/src/BaseAgent.ts +++ b/demo/src/BaseAgent.ts @@ -38,6 +38,7 @@ import { indyVdr } from '@hyperledger/indy-vdr-nodejs' import { askar } from '@openwallet-foundation/askar-nodejs' import { AskarModuleConfigStoreOptions } from '@credo-ts/askar' +import { HederaAnonCredsRegistry, HederaDidRegistrar, HederaDidResolver, HederaModule } from '@credo-ts/hedera' import { greenText } from './OutputClass' const bcovrin = `{"reqSignature":{},"txn":{"data":{"data":{"alias":"Node1","blskey":"4N8aUNHSgjQVgkpm8nhNEfDf6txHznoYREg9kirmJrkivgL4oSEimFF6nsQ6M41QvhM2Z33nves5vfSn9n1UwNFJBYtWVnHYMATn76vLuL3zU88KyeAYcHfsih3He6UHcXDxcaecHVz6jhCYz1P2UZn2bDVruL5wXpehgBfBaLKm3Ba","blskey_pop":"RahHYiCvoNCtPTrVtP7nMC5eTYrsUA8WjXbdhNc8debh1agE9bGiJxWBXYNFbnJXoXhWFMvyqhqhRoq737YQemH5ik9oL7R4NTTCz2LEZhkgLJzB3QRQqJyBNyv7acbdHrAT8nQ9UkLbaVL9NBpnWXBTw4LEMePaSHEw66RzPNdAX1","client_ip":"138.197.138.255","client_port":9702,"node_ip":"138.197.138.255","node_port":9701,"services":["VALIDATOR"]},"dest":"Gw6pDLhcBcoQesN72qfotTgFa7cbuqZpkX3Xo6pLhPhv"},"metadata":{"from":"Th7MpTaRZVRYnPiabds81Y"},"type":"0"},"txnMetadata":{"seqNo":1,"txnId":"fea82e10e894419fe2bea7d96296a6d46f50f93f9eeda954ec461b2ed2950b62"},"ver":"1"} @@ -121,7 +122,7 @@ function getAskarAnonCredsIndyModules( ], }), anoncreds: new AnonCredsModule({ - registries: [new IndyVdrAnonCredsRegistry(), new CheqdAnonCredsRegistry()], + registries: [new IndyVdrAnonCredsRegistry(), new CheqdAnonCredsRegistry(), new HederaAnonCredsRegistry()], anoncreds, }), indyVdr: new IndyVdrModule({ @@ -140,12 +141,21 @@ function getAskarAnonCredsIndyModules( }) ), dids: new DidsModule({ - resolvers: [new IndyVdrIndyDidResolver(), new CheqdDidResolver()], - registrars: [new CheqdDidRegistrar()], + resolvers: [new IndyVdrIndyDidResolver(), new CheqdDidResolver(), new HederaDidResolver()], + registrars: [new CheqdDidRegistrar(), new HederaDidRegistrar()], }), askar: new AskarModule({ askar, store: askarStoreConfig, }), + hedera: new HederaModule({ + networks: [ + { + network: 'testnet', + operatorId: process.env.HEDERA_TEST_OPERATOR_ID ?? '', + operatorKey: process.env.HEDERA_TEST_OPERATOR_KEY ?? '', + }, + ], + }), } as const } diff --git a/jest.config.base.ts b/jest.config.base.ts index 43b6b40302..d339bf9769 100644 --- a/jest.config.base.ts +++ b/jest.config.base.ts @@ -16,6 +16,7 @@ const config: Config.InitialOptions = { isolatedModules: true, }, ], + '^.+\\.[t|j]sx?$': 'babel-jest', }, } diff --git a/package.json b/package.json index 8ed3461e9e..9431135970 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,12 @@ "name": "credo-ts", "private": true, "license": "Apache-2.0", - "workspaces": ["packages/*", "demo", "demo-openid", "samples/*"], + "workspaces": [ + "packages/*", + "demo", + "demo-openid", + "samples/*" + ], "packageManager": "pnpm@9.15.3+sha512.1f79bc245a66eb0b07c5d4d83131240774642caaa86ef7d0434ab47c0d16f66b04e21e0c086eb61e62c77efc4d7f7ec071afad3796af64892fae66509173893a", "repository": { "url": "https://github.com/openwallet-foundation/credo-ts", @@ -25,32 +30,34 @@ "changeset-version": "pnpm changeset version && pnpm style:fix" }, "devDependencies": { - "@babel/core": "^7.25.8", - "@babel/preset-env": "^7.25.8", + "@babel/core": "^7.27.4", + "@babel/preset-env": "^7.27.2", "@biomejs/biome": "^1.9.4", - "@changesets/cli": "^2.27.5", - "@openwallet-foundation/askar-nodejs": "^0.3.1", + "@changesets/cli": "^2.29.4", "@jest/types": "^29.6.3", - "@types/cors": "^2.8.10", - "@types/express": "^4.17.21", - "@types/jest": "^29.5.12", - "@types/node": "^18.18.8", - "@types/supertest": "^6.0.2", - "@types/uuid": "^9.0.1", - "@types/varint": "^6.0.0", - "@types/ws": "^8.5.4", + "@openwallet-foundation/askar-nodejs": "^0.3.2", + "@types/cors": "^2.8.19", + "@types/express": "^4.17.23", + "@types/jest": "^29.5.14", + "@types/node": "18.18.8", + "@types/supertest": "^6.0.3", + "@types/uuid": "^9.0.8", + "@types/varint": "^6.0.3", + "@types/ws": "^8.18.1", + "babel-jest": "^30.0.0", "cors": "^2.8.5", "express": "^4.21.2", "jest": "^29.7.0", - "nock": "^14.0.0-beta.19", - "rxjs": "^7.8.0", - "supertest": "^7.0.0", - "ts-jest": "^29.1.2", + "nock": "^14.0.5", + "rimraf": "^4.4.1", + "rxjs": "^7.8.2", + "supertest": "^7.1.1", + "ts-jest": "^29.3.4", "ts-node": "^10.9.2", - "tsyringe": "^4.8.0", - "typescript": "~5.5.2", - "undici": "^6.20.1", - "ws": "^8.13.0" + "tsyringe": "^4.10.0", + "typescript": "~5.5.4", + "undici": "^6.21.3", + "ws": "^8.18.2" }, "resolutions": { "@types/node": "18.18.8", diff --git a/packages/action-menu/package.json b/packages/action-menu/package.json index 67e4ea3502..97ccd8bac5 100644 --- a/packages/action-menu/package.json +++ b/packages/action-menu/package.json @@ -3,7 +3,9 @@ "main": "src/index", "types": "src/index", "version": "0.5.13", - "files": ["build"], + "files": [ + "build" + ], "license": "Apache-2.0", "publishConfig": { "main": "build/index", @@ -28,11 +30,11 @@ "@credo-ts/didcomm": "workspace:*", "class-transformer": "0.5.1", "class-validator": "0.14.1", - "rxjs": "^7.8.0" + "rxjs": "^7.8.2" }, "devDependencies": { - "reflect-metadata": "^0.1.13", - "rimraf": "^4.4.0", - "typescript": "~5.5.2" + "reflect-metadata": "^0.1.14", + "rimraf": "^4.4.1", + "typescript": "~5.5.4" } } diff --git a/packages/anoncreds/package.json b/packages/anoncreds/package.json index c47e990c95..d1a1411961 100644 --- a/packages/anoncreds/package.json +++ b/packages/anoncreds/package.json @@ -3,7 +3,9 @@ "main": "src/index", "types": "src/index", "version": "0.5.13", - "files": ["build"], + "files": [ + "build" + ], "license": "Apache-2.0", "publishConfig": { "main": "build/index", @@ -30,15 +32,15 @@ "@sphereon/pex-models": "^2.3.2", "class-transformer": "0.5.1", "class-validator": "0.14.1", - "reflect-metadata": "^0.1.13" + "reflect-metadata": "^0.1.14" }, "devDependencies": { "@credo-ts/node": "workspace:*", "@hyperledger/anoncreds-nodejs": "^0.3.1", "@hyperledger/anoncreds-shared": "^0.3.1", - "rimraf": "^4.4.0", - "rxjs": "^7.8.0", - "typescript": "~5.5.2" + "rimraf": "^4.4.1", + "rxjs": "^7.8.2", + "typescript": "~5.5.4" }, "peerDependencies": { "@hyperledger/anoncreds-shared": "^0.3.1" diff --git a/packages/askar/package.json b/packages/askar/package.json index 5615d82318..68e5cc4245 100644 --- a/packages/askar/package.json +++ b/packages/askar/package.json @@ -3,7 +3,9 @@ "main": "src/index", "types": "src/index", "version": "0.5.13", - "files": ["build"], + "files": [ + "build" + ], "license": "Apache-2.0", "publishConfig": { "main": "build/index", @@ -27,18 +29,18 @@ "@credo-ts/core": "workspace:*", "class-transformer": "0.5.1", "class-validator": "0.14.1", - "rxjs": "^7.8.0", - "tsyringe": "^4.8.0" + "rxjs": "^7.8.2", + "tsyringe": "^4.10.0" }, "devDependencies": { "@credo-ts/tenants": "workspace:*", - "@openwallet-foundation/askar-nodejs": "^0.3.1", - "@openwallet-foundation/askar-shared": "^0.3.1", - "@types/ref-array-di": "^1.2.6", - "@types/ref-struct-di": "^1.1.10", - "reflect-metadata": "^0.1.13", - "rimraf": "^4.4.0", - "typescript": "~5.5.2" + "@openwallet-foundation/askar-nodejs": "^0.3.2", + "@openwallet-foundation/askar-shared": "^0.3.2", + "@types/ref-array-di": "^1.2.8", + "@types/ref-struct-di": "^1.1.12", + "reflect-metadata": "^0.1.14", + "rimraf": "^4.4.1", + "typescript": "~5.5.4" }, "peerDependencies": { "@openwallet-foundation/askar-shared": "^0.3.1" diff --git a/packages/cheqd/package.json b/packages/cheqd/package.json index c52c014d78..9fc8f5cf06 100644 --- a/packages/cheqd/package.json +++ b/packages/cheqd/package.json @@ -3,7 +3,9 @@ "main": "src/index", "types": "src/index", "version": "0.5.13", - "files": ["build"], + "files": [ + "build" + ], "license": "Apache-2.0", "publishConfig": { "main": "build/index", @@ -24,7 +26,7 @@ "test": "jest" }, "dependencies": { - "@cheqd/sdk": "^5.2.1", + "@cheqd/sdk": "^5.3.1", "@cheqd/ts-proto": "~2.4.1", "@cosmjs/crypto": "~0.30.1", "@cosmjs/proto-signing": "~0.30.1", @@ -34,11 +36,11 @@ "@stablelib/ed25519": "^1.0.3", "class-transformer": "^0.5.1", "class-validator": "0.14.1", - "rxjs": "^7.8.0", - "tsyringe": "^4.8.0" + "rxjs": "^7.8.2", + "tsyringe": "^4.10.0" }, "devDependencies": { - "rimraf": "^4.0.7", - "typescript": "~5.5.2" + "rimraf": "^4.4.1", + "typescript": "~5.5.4" } } diff --git a/packages/core/package.json b/packages/core/package.json index ffa8965023..6afd159c23 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -3,7 +3,9 @@ "main": "src/index", "types": "src/index", "version": "0.5.13", - "files": ["build"], + "files": [ + "build" + ], "license": "Apache-2.0", "publishConfig": { "main": "build/index", @@ -31,13 +33,13 @@ "@digitalcredentials/jsonld-signatures": "^9.4.0", "@digitalcredentials/vc": "^6.0.1", "@multiformats/base-x": "^4.0.1", - "@noble/curves": "^1.8.1", - "@noble/hashes": "^1.7.1", - "@peculiar/asn1-ecc": "^2.3.14", + "@noble/curves": "^1.9.2", + "@noble/hashes": "^1.8.0", + "@peculiar/asn1-ecc": "^2.3.15", "@peculiar/asn1-rsa": "^2.3.15", - "@peculiar/asn1-schema": "^2.3.13", - "@peculiar/asn1-x509": "^2.3.13", - "@peculiar/x509": "^1.12.1", + "@peculiar/asn1-schema": "^2.3.15", + "@peculiar/asn1-x509": "^2.3.15", + "@peculiar/x509": "^1.12.4", "@sd-jwt/core": "^0.7.2", "@sd-jwt/decode": "^0.7.2", "@sd-jwt/jwt-status-list": "^0.7.2", @@ -47,35 +49,35 @@ "@sd-jwt/utils": "^0.7.2", "@sphereon/pex-models": "^2.3.2", "@sphereon/ssi-types": "0.33.0", - "@stablelib/ed25519": "^1.0.2", - "@types/ws": "^8.5.4", + "@stablelib/ed25519": "^1.0.3", + "@types/ws": "^8.18.1", "borc": "^3.0.0", "buffer": "^6.0.3", "class-transformer": "0.5.1", "class-validator": "0.14.1", - "dcql": "^0.2.20", + "dcql": "^0.2.22", "did-resolver": "^4.1.0", "ec-compression": "0.0.1-alpha.12", "lru_map": "^0.4.1", "make-error": "^1.3.6", - "object-inspect": "^1.10.3", - "reflect-metadata": "^0.1.13", - "rxjs": "^7.8.0", - "tsyringe": "^4.8.0", - "uuid": "^9.0.0", + "object-inspect": "^1.13.4", + "reflect-metadata": "^0.1.14", + "rxjs": "^7.8.2", + "tsyringe": "^4.10.0", + "uuid": "^9.0.1", "varint": "^6.0.0", - "web-did-resolver": "^2.0.21", - "webcrypto-core": "^1.8.0", - "zod": "^3.24.2" + "web-did-resolver": "^2.0.30", + "webcrypto-core": "^1.8.1", + "zod": "^3.25.57" }, "devDependencies": { - "@types/events": "^3.0.0", - "@types/object-inspect": "^1.8.0", - "@types/uuid": "^9.0.1", - "@types/varint": "^6.0.0", - "nock": "^14.0.0-beta.19", - "rimraf": "^4.4.0", - "tslog": "^4.8.2", - "typescript": "~5.5.2" + "@types/events": "^3.0.3", + "@types/object-inspect": "^1.13.0", + "@types/uuid": "^9.0.8", + "@types/varint": "^6.0.3", + "nock": "^14.0.5", + "rimraf": "^4.4.1", + "tslog": "^4.9.3", + "typescript": "~5.5.4" } } diff --git a/packages/didcomm/package.json b/packages/didcomm/package.json index f9df10c143..0a716f9954 100644 --- a/packages/didcomm/package.json +++ b/packages/didcomm/package.json @@ -3,7 +3,9 @@ "main": "src/index", "types": "src/index", "version": "0.5.13", - "files": ["build"], + "files": [ + "build" + ], "license": "Apache-2.0", "publishConfig": { "main": "build/index", @@ -27,16 +29,16 @@ "@credo-ts/core": "workspace:*", "class-transformer": "0.5.1", "class-validator": "0.14.1", - "luxon": "^3.5.0", - "query-string": "^7.0.1", - "rxjs": "^7.8.0" + "luxon": "^3.6.1", + "query-string": "^7.1.3", + "rxjs": "^7.8.2" }, "devDependencies": { "@animo-id/pex": "^6.1.0", "@sphereon/pex-models": "^2.3.2", - "@types/luxon": "^3.2.0", - "reflect-metadata": "^0.1.13", - "rimraf": "^4.4.0", - "typescript": "~5.5.2" + "@types/luxon": "^3.6.2", + "reflect-metadata": "^0.1.14", + "rimraf": "^4.4.1", + "typescript": "~5.5.4" } } diff --git a/packages/drpc/package.json b/packages/drpc/package.json index e8a947cf1b..13dd1b830b 100644 --- a/packages/drpc/package.json +++ b/packages/drpc/package.json @@ -3,7 +3,9 @@ "main": "src/index", "types": "src/index", "version": "0.5.13", - "files": ["build"], + "files": [ + "build" + ], "license": "Apache-2.0", "publishConfig": { "main": "build/index", @@ -31,8 +33,8 @@ }, "devDependencies": { "@credo-ts/node": "workspace:*", - "reflect-metadata": "^0.1.13", - "rimraf": "^4.4.0", - "typescript": "~5.5.2" + "reflect-metadata": "^0.1.14", + "rimraf": "^4.4.1", + "typescript": "~5.5.4" } } diff --git a/packages/hedera/jest.config.ts b/packages/hedera/jest.config.ts index 93c0197296..4926b00d2f 100644 --- a/packages/hedera/jest.config.ts +++ b/packages/hedera/jest.config.ts @@ -6,8 +6,19 @@ import packageJson from './package.json' const config: Config.InitialOptions = { ...base, + testTimeout: 1200000, displayName: packageJson.name, - setupFilesAfterEnv: ['./tests/setup.ts'], + transform: { + '^.+\\.ts$': 'ts-jest', + '^.+\\.(t|j)s?$': 'babel-jest', + }, + transformIgnorePatterns: ['../../node_modules/.pnpm/(?!(cbor2)/)'], + extensionsToTreatAsEsm: ['.ts'], + moduleFileExtensions: ['ts', 'js', 'json', 'node'], + globals: { + Uint8Array: Uint8Array, + ArrayBuffer: ArrayBuffer, + } } export default config diff --git a/packages/hedera/package.json b/packages/hedera/package.json index f6ef239f46..b5dc0023c0 100644 --- a/packages/hedera/package.json +++ b/packages/hedera/package.json @@ -25,10 +25,10 @@ "@credo-ts/anoncreds": "workspace:*", "@credo-ts/core": "workspace:*", "@hiero-did-sdk-js/anoncreds": "npm:@hiero-did-sdk-js/anoncreds@0.0.1", - "@swiss-digital-assets-institute/registrar": "0.3.0" + "@hiero-did-sdk-js/did": "npm:@hiero-did-sdk-js/did@0.0.1" }, "devDependencies": { - "rimraf": "^4.0.7", - "typescript": "~5.5.2" + "@credo-ts/node": "workspace:*", + "@hyperledger/anoncreds-nodejs": "^0.3.1" } } diff --git a/packages/hedera/src/dids/HederaDidRegistrar.ts b/packages/hedera/src/dids/HederaDidRegistrar.ts index 51897b5fd9..1b8dce017e 100644 --- a/packages/hedera/src/dids/HederaDidRegistrar.ts +++ b/packages/hedera/src/dids/HederaDidRegistrar.ts @@ -1,104 +1,83 @@ -import type { +import { AgentContext, DidCreateOptions, DidCreateResult, DidDeactivateOptions, DidDeactivateResult, - DidRegistrar, - DidUpdateOptions, - DidUpdateResult, -} from '@credo-ts/core' -import { DidDocument, DidDocumentRole, + DidDocumentService, DidRecord, + DidRegistrar, DidRepository, - JsonTransformer, - TypedArrayEncoder, + DidUpdateOptions, + DidUpdateResult, } from '@credo-ts/core' import { HederaLedgerService } from '../ledger' -import {createDID} from "@swiss-digital-assets-institute/registrar"; export class HederaDidRegistrar implements DidRegistrar { public readonly supportedMethods = ['hedera'] - public async create(agentContext: AgentContext, options: HederaDidCreateOptions): Promise { - const didRepository = agentContext.dependencyManager.resolve(DidRepository) - const hederaLedgerService = agentContext.dependencyManager.resolve(HederaLedgerService) - + async create(agentContext: AgentContext, _options: DidCreateOptions): Promise { try { - const { did, didDocument } = await createDID({ - client, - }); - - console.log(`DID: ${did}`); - console.log(`DID Document: ${JSON.stringify(didDocument, null, 2)}`); - } catch (error) { - console.error("Error creating DID:", error); - } + const didRepository = agentContext.dependencyManager.resolve(DidRepository) + const hederaLedgerService = agentContext.dependencyManager.resolve(HederaLedgerService) + const sdk = hederaLedgerService.getHederaDidSdk(agentContext) + const { did, didDocument } = await sdk.createDid({}) + // Save the did so we know we created it and can issue with it + const credoDidDocument = new DidDocument({ + ...didDocument, + service: didDocument.service?.map((s) => new DidDocumentService(s)), + }) + await didRepository.save( + agentContext, + new DidRecord({ + did, + role: DidDocumentRole.Created, + didDocument: credoDidDocument, + }) + ) - // let didDocument: DidDocument - // - // try { - // const seedBuffer = TypedArrayEncoder.fromString(options.secret.seed) - // - // await agentContext.wallet.createKey({ keyType: KeyType.Ed25519, privateKey: seedBuffer }) - // - // const hederaDid = await hederaLedgerService.registerHcsDid(Buffer.from(seedBuffer)) - // - // const did = await hederaDid.resolve() - // - // didDocument = JsonTransformer.fromJSON(did.toJsonTree(), DidDocument) - // - // // Save the did so we know we created it and can issue with it - // const didRecord = new DidRecord({ - // did: did.getId(), - // role: DidDocumentRole.Created, - // didDocument, - // }) - // await didRepository.save(agentContext, didRecord) - // - // return { - // didDocumentMetadata: {}, - // didRegistrationMetadata: {}, - // didState: { - // state: 'finished', - // did: didDocument.id, - // didDocument, - // secret: options.secret, - // }, - // } - // } catch (error) { - // agentContext.config.logger.error(`Error registering DID : ${error}`) - // return { - // didDocumentMetadata: {}, - // didRegistrationMetadata: {}, - // didState: { - // state: 'failed', - // reason: `unknownError: ${error}`, - // }, - // } - // } + return { + didDocumentMetadata: {}, + didRegistrationMetadata: {}, + didState: { + state: 'finished', + did, + didDocument: credoDidDocument, + }, + } + } catch (error) { + agentContext.config.logger.error(`Error registering DID : ${error}`) + return { + didDocumentMetadata: {}, + didRegistrationMetadata: {}, + didState: { + state: 'failed', + reason: `Unable to register Did: ${error.message}`, + }, + } + } } - public async update(agentContext: AgentContext, options: DidUpdateOptions): Promise { + update(_agentContext: AgentContext, _options: DidUpdateOptions): Promise { throw new Error('Method not implemented.') } - public async deactivate(agentContext: AgentContext, options: DidDeactivateOptions): Promise { + deactivate(_agentContext: AgentContext, _options: DidDeactivateOptions): Promise { throw new Error('Method not implemented.') } } - -export type SeedString = string - -export interface HederaDidCreateOptions extends DidCreateOptions { - method: 'hedera' - did?: never - secret: { - network: HederaNetwork - seed: string - } -} +// +// export type SeedString = string +// +// export interface HederaDidCreateOptions extends DidCreateOptions { +// method: 'hedera' +// did?: never +// secret: { +// network: HederaNetwork +// seed: string +// } +// } diff --git a/packages/hedera/src/dids/HederaDidResolver.ts b/packages/hedera/src/dids/HederaDidResolver.ts index 0a76a33844..5fe2100cb6 100644 --- a/packages/hedera/src/dids/HederaDidResolver.ts +++ b/packages/hedera/src/dids/HederaDidResolver.ts @@ -1,6 +1,7 @@ import { type AgentContext, DidDocument, + type DidResolutionOptions, type DidResolutionResult, type DidResolver, JsonTransformer, @@ -10,44 +11,31 @@ import { HederaLedgerService } from '../ledger' export class HederaDidResolver implements DidResolver { public readonly supportedMethods = ['hedera'] - - public readonly allowsCaching = true - - public readonly allowsLocalDidRecord = true - - private readonly _cache: Map = new Map() - - public async resolve(agentContext: AgentContext, did: string, parsed: ParsedDid): Promise { - const didDocumentMetadata = {} - - if (this._cache.has(did)) { - return { - didDocument: this._cache.get(did), - didDocumentMetadata, - didResolutionMetadata: { - contentType: 'application/did+json', - }, - } - } - - const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) + public readonly allowsCaching: boolean = true + public readonly allowsLocalDidRecord?: boolean | undefined = true + + async resolve( + agentContext: AgentContext, + did: string, + _parsed: ParsedDid, + _didResolutionOptions: DidResolutionOptions + ): Promise { try { - const didDoc = await ledgerService.getHederaAnonCredsSdk().resolveDid(did) + const hederaLedgerService = agentContext.dependencyManager.resolve(HederaLedgerService) + const sdk = hederaLedgerService.getHederaDidSdk(agentContext) - const didJson = didDoc.toJsonTree() + const resolveDidResult = await sdk.resolveDid(did, 'did+json') const updatedContextDidJson = { - ...didJson, + ...resolveDidResult, '@context': ['https://www.w3.org/ns/did/v1', 'https://w3id.org/security/suites/ed25519-2018/v1'], } const didDocument = JsonTransformer.fromJSON(updatedContextDidJson, DidDocument) - this._cache.set(did, didDocument) - return { didDocument, - didDocumentMetadata, + didDocumentMetadata: {}, didResolutionMetadata: { contentType: 'application/did+json', }, @@ -55,10 +43,10 @@ export class HederaDidResolver implements DidResolver { } catch (error) { return { didDocument: null, - didDocumentMetadata, + didDocumentMetadata: {}, didResolutionMetadata: { error: 'notFound', - message: `resolver_error: Unable to resolve did '${did}': ${error}`, + message: `Unable to resolve did '${did}': ${error}`, }, } } diff --git a/packages/hedera/src/ledger/HederaLedgerService.ts b/packages/hedera/src/ledger/HederaLedgerService.ts index bc851422f2..d0fd7ad6e6 100644 --- a/packages/hedera/src/ledger/HederaLedgerService.ts +++ b/packages/hedera/src/ledger/HederaLedgerService.ts @@ -1,7 +1,7 @@ import { type AgentContext, injectable } from '@credo-ts/core' import { HederaAnoncredsRegistry } from '@hiero-did-sdk-js/anoncreds' -import { HederaModuleConfig } from '../.' -import { HederaLedgerServiceCache } from './HederaLedgerServiceCache' +import { HederaDidService } from '@hiero-did-sdk-js/did' +import { HederaLedgerServiceCache, HederaModuleConfig } from '../.' @injectable() export class HederaLedgerService { @@ -13,6 +13,10 @@ export class HederaLedgerService { public getHederaAnonCredsSdk(agentContext: AgentContext): HederaAnoncredsRegistry { const cache = this.config.options.cache ?? new HederaLedgerServiceCache(agentContext) - return new HederaAnoncredsRegistry({ ...this.config.options, cache: cache }) + return new HederaAnoncredsRegistry({ ...this.config.options, cache }) + } + + public getHederaDidSdk(_agentContext: AgentContext): HederaDidService { + return new HederaDidService({ ...this.config.options }) } } diff --git a/packages/hedera/src/ledger/index.ts b/packages/hedera/src/ledger/index.ts index 20a31b739b..77cb4eedf3 100644 --- a/packages/hedera/src/ledger/index.ts +++ b/packages/hedera/src/ledger/index.ts @@ -1 +1,2 @@ export { HederaLedgerService } from './HederaLedgerService' +export { HederaLedgerServiceCache } from './HederaLedgerServiceCache' diff --git a/packages/hedera/tests/HederaAnoncredsRegistry.e2e.test.ts b/packages/hedera/tests/HederaAnoncredsRegistry.e2e.test.ts new file mode 100644 index 0000000000..6dd33b1026 --- /dev/null +++ b/packages/hedera/tests/HederaAnoncredsRegistry.e2e.test.ts @@ -0,0 +1,197 @@ +import { Agent, ConsoleLogger, LogLevel, utils } from '@credo-ts/core' +import { getHederaAgent, waitTimeout } from './utils' +import { testCache } from './utils/testCache' + +const seed = '11011000010000111011001100010100' +const consensusTimeout = 5000 + +describe('Hedera AnonCreds support', () => { + let agent: Agent + let did: string + + const logger = new ConsoleLogger(LogLevel.error) + const cache = new testCache() + + beforeAll(async () => { + // Initialize the agent + agent = getHederaAgent({ + label: 'alice', + logger, + cache, + }) + await agent.initialize() + + // Making the test did + const didRegistrarResult = await agent.dids.create({ + method: 'hedera', + secret: { + seed, + }, + }) + if (!didRegistrarResult.didState?.didDocument?.id) throw new Error('DidRegistrarError') + + did = didRegistrarResult.didState.didDocument.id + logger.debug('DID', [did]) + }) + + beforeEach(() => { + cache.clear() + }) + + afterAll(async () => { + // Wait for messages to flush out + await new Promise((r) => setTimeout(r, 1000)) + + if (agent) { + await agent.shutdown() + } + }) + + describe('Hedera Anoncreds Registry', () => { + it('Full flow (register and resolve schema, credential definition, revocation registry definition, revocation status list)', async () => { + // Create the schema + const schemaResult = await agent.modules.anoncreds.registerSchema({ + schema: { + name: utils.uuid(), + version: '1', + issuerId: did, + attrNames: ['field1'], + }, + options: {}, + }) + logger.debug('RegisterSchema', [schemaResult]) + + const schemaId = schemaResult?.schemaState?.schemaId + expect(schemaId).toBeDefined() + + await waitTimeout(consensusTimeout) + + // Register credential definition for the schema + const credDefResult = await agent.modules.anoncreds.registerCredentialDefinition({ + credentialDefinition: { + tag: 'default', + issuerId: did, + schemaId: schemaId!, + }, + options: { + supportRevocation: true, + }, + }) + + logger.debug('credDefResult', [credDefResult]) + expect(credDefResult?.credentialDefinitionState?.state).toEqual('finished') + + const credentialDefinitionId = credDefResult.credentialDefinitionState.credentialDefinitionId ?? '' + + await waitTimeout(consensusTimeout) + + // Register revocation registry definition + const revRegDefRegResult = await agent.modules.anoncreds.registerRevocationRegistryDefinition({ + revocationRegistryDefinition: { + issuerId: did, + credentialDefinitionId, + maximumCredentialNumber: 10, + tag: 'default', + }, + options: {}, + }) + logger.debug('revRegDefRegResult', [revRegDefRegResult]) + const revocationRegistryDefinitionId = + revRegDefRegResult?.revocationRegistryDefinitionState?.revocationRegistryDefinitionId ?? '' + expect(revocationRegistryDefinitionId).toBeDefined() + + await waitTimeout(consensusTimeout) + + const resolvedRevRegDef = + await agent.modules.anoncreds.getRevocationRegistryDefinition(revocationRegistryDefinitionId) + expect(resolvedRevRegDef.revocationRegistryDefinitionId).toEqual(revocationRegistryDefinitionId) + + // Register the init revocation status list + const registerRevocationStatusListResponse = await agent.modules.anoncreds.registerRevocationStatusList({ + options: {}, + revocationStatusList: { + issuerId: did, + revocationRegistryDefinitionId, + }, + }) + logger.debug('registerRevocationStatusListResponse', [registerRevocationStatusListResponse]) + const revocationStatusList = registerRevocationStatusListResponse?.revocationStatusListState.revocationStatusList + expect(revocationStatusList).toBeDefined() + + await waitTimeout(consensusTimeout) + + // Resolve the revocation status list + const revocationStatusListResponse = await agent.modules.anoncreds.getRevocationStatusList( + revocationRegistryDefinitionId, + Date.now() + ) + logger.debug('revocationStatusListResponse', [revocationStatusListResponse]) + + expect(revocationStatusListResponse?.revocationStatusList?.revRegDefId).toEqual(revocationRegistryDefinitionId) + expect(revocationStatusListResponse?.revocationStatusList?.issuerId).toEqual(did) + expect(revocationStatusListResponse?.revocationStatusList?.revocationList).toEqual([0, 0, 0, 0, 0, 0, 0, 0, 0, 0]) + + await waitTimeout(consensusTimeout) + + // Update revocation status list - Revoke indexes + const revokeUpdateRevocationStatusListResponse = await agent.modules.anoncreds.updateRevocationStatusList({ + options: {}, + revocationStatusList: { + revocationRegistryDefinitionId: revocationRegistryDefinitionId, + issuedCredentialIndexes: undefined, + revokedCredentialIndexes: [1, 3, 5, 9], + }, + }) + logger.debug('revokeUpdateRevocationStatusListResponse', [revokeUpdateRevocationStatusListResponse]) + const revokeRevocationStatusList = + revokeUpdateRevocationStatusListResponse?.revocationStatusListState.revocationStatusList + expect(revokeRevocationStatusList).toBeDefined() + + await waitTimeout(consensusTimeout) + + // Resolve the revocation status list + const revokeRevocationStatusListResponse = await agent.modules.anoncreds.getRevocationStatusList( + revocationRegistryDefinitionId, + Date.now() + ) + logger.debug('revokeRevocationStatusListResponse', [revokeRevocationStatusListResponse]) + expect(revokeRevocationStatusListResponse?.revocationStatusList?.revRegDefId).toEqual( + revocationRegistryDefinitionId + ) + expect(revokeRevocationStatusListResponse?.revocationStatusList?.issuerId).toEqual(did) + expect(revokeRevocationStatusListResponse?.revocationStatusList?.revocationList).toEqual([ + 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, + ]) + + // Update revocation status list - Revoke/Issue indexes + const issueUpdateRevocationStatusListResponse = await agent.modules.anoncreds.updateRevocationStatusList({ + options: {}, + revocationStatusList: { + revocationRegistryDefinitionId: revocationRegistryDefinitionId, + issuedCredentialIndexes: [3, 5], + revokedCredentialIndexes: [4], + }, + }) + logger.debug('issueUpdateRevocationStatusListResponse', [issueUpdateRevocationStatusListResponse]) + const issueRevocationStatusList = + issueUpdateRevocationStatusListResponse?.revocationStatusListState.revocationStatusList + expect(issueRevocationStatusList).toBeDefined() + + await waitTimeout(consensusTimeout) + + // Resolve the revocation status list + const issueRevocationStatusListResponse = await agent.modules.anoncreds.getRevocationStatusList( + revocationRegistryDefinitionId, + Date.now() + ) + logger.debug('issueRevocationStatusListResponse', [issueRevocationStatusListResponse]) + expect(issueRevocationStatusListResponse?.revocationStatusList?.revRegDefId).toEqual( + revocationRegistryDefinitionId + ) + expect(issueRevocationStatusListResponse?.revocationStatusList?.issuerId).toEqual(did) + expect(issueRevocationStatusListResponse?.revocationStatusList?.revocationList).toEqual([ + 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, + ]) + }) + }) +}) diff --git a/packages/hedera/tests/HederaDid.e2e.test.ts b/packages/hedera/tests/HederaDid.e2e.test.ts new file mode 100644 index 0000000000..c57b737f5d --- /dev/null +++ b/packages/hedera/tests/HederaDid.e2e.test.ts @@ -0,0 +1,34 @@ +import { Agent, ConsoleLogger, LogLevel } from '@credo-ts/core' +import { getHederaAgent, waitTimeout } from './utils' + +const logger = new ConsoleLogger(LogLevel.error) + +const did = 'did:hedera:testnet:zGdjMu1hPkjbJXSPPp6RgTptnpYYM9uEkPeNbPhSkXTon_0.0.5139753' + +describe('Hedera Module did resolver', () => { + let aliceAgent: Agent + + beforeAll(async () => { + const aliceAgent = getHederaAgent({ + logger, + label: 'alice', + }) + await aliceAgent.initialize() + }) + + afterAll(async () => { + // Wait for messages to flush out + await waitTimeout(1000) + + if (aliceAgent) { + await aliceAgent.shutdown() + } + }) + + describe('HederaDidResolver', () => { + it('should resolve a hedera did when valid did is passed', async () => { + const resolvedDIDDoc = await aliceAgent.dids.resolve(did) + expect(resolvedDIDDoc).toBeDefined() + }) + }) +}) diff --git a/packages/hedera/tests/HederaW3cFlow.e2e.test.ts b/packages/hedera/tests/HederaW3cFlow.e2e.test.ts new file mode 100644 index 0000000000..811d7ce713 --- /dev/null +++ b/packages/hedera/tests/HederaW3cFlow.e2e.test.ts @@ -0,0 +1,192 @@ +import { Agent } from '@credo-ts/core' + +import { + ClaimFormat, + ConsoleLogger, + CredentialIssuancePurpose, + CredoError, + JsonTransformer, + LogLevel, + W3cCredential, + W3cJsonLdVerifiableCredential, + W3cJsonLdVerifiablePresentation, + W3cPresentation, + vcLibraries, +} from '@credo-ts/core' + +import { LinkedDataProof } from '@credo-ts/core/build/modules/vc/data-integrity/models/LinkedDataProof' +import { W3C_FIXTURES } from './fixtures' +import { getHederaAgent, waitTimeout } from './utils' + +const { jsonldSignatures } = vcLibraries +const { purposes } = jsonldSignatures + +const logger = new ConsoleLogger(LogLevel.error) + +// const did = 'did:hedera:testnet:zQDui45JN8tAZyc8aNcgcDp26wPJgVyQnw1wupqaqexKGWgsuMVfgzKmGfyg8fWPt_0.0.5139447' +const did = 'did:hedera:testnet:zGdjMu1hPkjbJXSPPp6RgTptnpYYM9uEkPeNbPhSkXTon_0.0.5139753' +// const seed = '11011000010000111011001100010100' +// const holderSeed = '00000000000000000000000000holder' + +describe('Hedera Module did resolver', () => { + let aliceAgent: Agent + let faberAgent: Agent + + beforeAll(async () => { + // Initialize alice + aliceAgent = getHederaAgent({ + logger, + label: 'alice', + }) + await aliceAgent.initialize() + + // Initialize faber + faberAgent = getHederaAgent({ + logger, + label: 'faber', + }) + await faberAgent.initialize() + }) + + afterAll(async () => { + // Wait for messages to flush out + await waitTimeout(1000) + + if (aliceAgent) { + await aliceAgent.shutdown() + } + + if (faberAgent) { + await faberAgent.shutdown() + } + }) + + describe('W3C Issuance and Verification', () => { + let issuerDid: string + let verificationMethod: string + + beforeAll(async () => { + //const seedBuffer = TypedArrayEncoder.fromString(seed) + //await faberAgent.wallet.createKey({ keyType: KeyType.Ed25519, seed: seedBuffer }) + + const _didDoc = await faberAgent.dids.resolve(did) + + issuerDid = did + verificationMethod = `${issuerDid}#key-1` + + // create did:key for holder + await aliceAgent.dids.create({ + method: 'key', + // options: { + // keyType: KeyType.Ed25519, + // }, + //seed: TypedArrayEncoder.fromString(holderSeed), + }) + }) + + describe('signCredential', () => { + it('should return a successfully signed credential', async () => { + const credentialJson = W3C_FIXTURES.TEST_LD_DOCUMENT + credentialJson.issuer = issuerDid + + const credential = JsonTransformer.fromJSON(credentialJson, W3cCredential) + + const vc = await faberAgent.w3cCredentials.signCredential({ + format: ClaimFormat.LdpVc, + credential, + proofType: 'Ed25519Signature2018', + verificationMethod, + }) + + expect(vc).toBeInstanceOf(W3cJsonLdVerifiableCredential) + expect(vc.issuer).toEqual(issuerDid) + expect(Array.isArray(vc.proof)).toBe(false) + expect(vc.proof).toBeInstanceOf(LinkedDataProof) + + vc.proof = vc.proof as LinkedDataProof + expect(vc.proof.verificationMethod).toEqual(verificationMethod) + }) + + it('should throw because of verificationMethod does not belong to this wallet', async () => { + const credentialJson = W3C_FIXTURES.TEST_LD_DOCUMENT + credentialJson.issuer = issuerDid + + const credential = JsonTransformer.fromJSON(credentialJson, W3cCredential) + + expect(async () => { + await faberAgent.w3cCredentials.signCredential({ + format: ClaimFormat.LdpVc, + credential, + proofType: 'Ed25519Signature2018', + verificationMethod: + 'did:hedera:testnet:zGdjMu1hPkjbJXSPPp6RgTptnpYYM9uEkPeNbPhSkXTon_0.0.5139619#did-root-key', + }) + }).rejects.toThrow(CredoError) + }) + }) + + describe('verifyCredential', () => { + it('should verify the credential successfully', async () => { + const result = await aliceAgent.w3cCredentials.verifyCredential({ + credential: JsonTransformer.fromJSON(W3C_FIXTURES.TEST_LD_DOCUMENT_SIGNED, W3cJsonLdVerifiableCredential), + proofPurpose: new purposes.AssertionProofPurpose(), + }) + + expect(result.isValid).toEqual(true) + }) + + it('should fail because of invalid signature', async () => { + const vc = JsonTransformer.fromJSON(W3C_FIXTURES.TEST_LD_DOCUMENT_BAD_SIGNED, W3cJsonLdVerifiableCredential) + const result = await aliceAgent.w3cCredentials.verifyCredential({ credential: vc }) + + expect(result).toEqual({ + isValid: false, + error: expect.any(Error), + validations: { + vcJs: { + error: expect.any(Error), + isValid: false, + results: expect.any(Array), + }, + }, + }) + }) + }) + + describe('signPresentation', () => { + it('should successfully create a presentation from single verifiable credential', async () => { + const presentation = JsonTransformer.fromJSON(W3C_FIXTURES.TEST_VP_DOCUMENT, W3cPresentation) + + const purpose = new CredentialIssuancePurpose({ + controller: { + id: verificationMethod, + }, + date: new Date().toISOString(), + }) + + const verifiablePresentation = await faberAgent.w3cCredentials.signPresentation({ + format: ClaimFormat.LdpVp, + presentation: presentation, + proofPurpose: purpose, + proofType: 'Ed25519Signature2018', + challenge: '7bf32d0b-39d4-41f3-96b6-45de52988e4c', + domain: 'issuer.example.com', + verificationMethod: verificationMethod, + }) + + expect(verifiablePresentation).toBeInstanceOf(W3cJsonLdVerifiablePresentation) + }) + }) + + describe('verifyPresentation', () => { + it('should successfully verify a presentation containing a single verifiable credential', async () => { + const vp = JsonTransformer.fromJSON(W3C_FIXTURES.TEST_VP_DOCUMENT_SIGNED, W3cJsonLdVerifiablePresentation) + const result = await faberAgent.w3cCredentials.verifyPresentation({ + presentation: vp, + challenge: '7bf32d0b-39d4-41f3-96b6-45de52988e4c', + }) + expect(result.isValid).toBe(true) + }) + }) + }) +}) diff --git a/packages/hedera/tests/fixtures/fixtures.ts b/packages/hedera/tests/fixtures/fixtures.ts new file mode 100644 index 0000000000..01b9c18764 --- /dev/null +++ b/packages/hedera/tests/fixtures/fixtures.ts @@ -0,0 +1,182 @@ +import { CREDENTIALS_CONTEXT_V1_URL } from '@credo-ts/core' + +export const HOLDER_DID = 'did:key:z6MkiAUh4Fh23QAqv8w8YNCFq3QSTnHV8gQSiABV5Mj9mj2m' + +export const W3C_FIXTURES = { + TEST_LD_DOCUMENT: { + '@context': [CREDENTIALS_CONTEXT_V1_URL, 'https://w3id.org/citizenship/v1'], + id: 'https://issuer.oidp.uscis.gov/credentials/83627465', + type: ['VerifiableCredential', 'PermanentResidentCard'], + issuer: '', + identifier: '83627465', + name: 'Permanent Resident Card', + description: 'Government of Example Permanent Resident Card.', + issuanceDate: '2019-12-03T12:19:52Z', + expirationDate: '2029-12-03T12:19:52Z', + credentialSubject: { + id: HOLDER_DID, + type: ['PermanentResident', 'Person'], + givenName: 'JOHN', + familyName: 'SMITH', + gender: 'Male', + image: 'data:image/png;base64,iVBORw0KGgokJggg==', + residentSince: '2015-01-01', + lprCategory: 'C09', + lprNumber: '999-999-999', + commuterClassification: 'C1', + birthCountry: 'Bahamas', + birthDate: '1958-07-17', + }, + }, + + TEST_LD_DOCUMENT_SIGNED: { + '@context': ['https://www.w3.org/2018/credentials/v1', 'https://w3id.org/citizenship/v1'], + id: 'https://issuer.oidp.uscis.gov/credentials/83627465', + type: ['VerifiableCredential', 'PermanentResidentCard'], + issuer: 'did:hedera:testnet:zGdjMu1hPkjbJXSPPp6RgTptnpYYM9uEkPeNbPhSkXTon_0.0.5139753', + identifier: '83627465', + name: 'Permanent Resident Card', + description: 'Government of Example Permanent Resident Card.', + issuanceDate: '2019-12-03T12:19:52Z', + expirationDate: '2029-12-03T12:19:52Z', + credentialSubject: { + type: ['PermanentResident', 'Person'], + givenName: 'JOHN', + familyName: 'SMITH', + gender: 'Male', + image: 'data:image/png;base64,iVBORw0KGgokJggg==', + residentSince: '2015-01-01', + lprCategory: 'C09', + lprNumber: '999-999-999', + commuterClassification: 'C1', + birthCountry: 'Bahamas', + birthDate: '1958-07-17', + id: 'did:key:z6MkiAUh4Fh23QAqv8w8YNCFq3QSTnHV8gQSiABV5Mj9mj2m', + }, + proof: { + verificationMethod: 'did:hedera:testnet:zGdjMu1hPkjbJXSPPp6RgTptnpYYM9uEkPeNbPhSkXTon_0.0.5139753#key-1', + type: 'Ed25519Signature2018', + created: '2024-11-17T14:28:27Z', + proofPurpose: 'assertionMethod', + jws: 'eyJhbGciOiJFZERTQSIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY0Il19..Dq-AI4T_H4E3bdwSb4omyetKimTogtXWNV4HtNtLYoHLl0f0ddbF3hv807ssGtck51uMUTISkZ7zkdNdn0hZAA', + }, + }, + TEST_LD_DOCUMENT_BAD_SIGNED: { + '@context': ['https://www.w3.org/2018/credentials/v1', 'https://w3id.org/citizenship/v1'], + id: 'https://issuer.oidp.uscis.gov/credentials/83627465', + type: ['VerifiableCredential', 'PermanentResidentCard'], + issuer: 'did:hedera:testnet:zGdjMu1hPkjbJXSPPp6RgTptnpYYM9uEkPeNbPhSkXTon_0.0.5139619', + identifier: '83627465', + name: 'Permanent Resident Card', + description: 'Government of Example Permanent Resident Card.', + issuanceDate: '2019-12-03T12:19:52Z', + expirationDate: '2029-12-03T12:19:52Z', + credentialSubject: { + type: ['PermanentResident', 'Person'], + givenName: 'JOHN', + familyName: 'SMITH', + gender: 'Male', + image: 'data:image/png;base64,iVBORw0KGgokJggg==', + residentSince: '2015-01-01', + lprCategory: 'C09', + lprNumber: '999-999-999', + commuterClassification: 'C1', + birthCountry: 'Bahamas', + birthDate: '1958-07-17', + id: 'did:key:z6MkiAUh4Fh23QAqv8w8YNCFq3QSTnHV8gQSiABV5Mj9mj2m', + }, + proof: { + verificationMethod: 'did:hedera:testnet:zGdjMu1hPkjbJXSPPp6RgTptnpYYM9uEkPeNbPhSkXTon_0.0.5139619#key-1', + type: 'Ed25519Signature2018', + created: '2024-11-17T13:02:11Z', + proofPurpose: 'assertionMethod', + jws: 'eyJhbGciOiJFZERTQSIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY78Il19..J50c8CreYwZfvF63sKJvdyVGZIh6m8GwORWKgsL34nfRi4AuUVBOpCD_2PhPvk8lgkXmKMfeSu2dHU5s6V--Dg', + }, + }, + + TEST_VP_DOCUMENT: { + '@context': [CREDENTIALS_CONTEXT_V1_URL], + type: ['VerifiablePresentation'], + verifiableCredential: [ + { + '@context': ['https://www.w3.org/2018/credentials/v1', 'https://w3id.org/citizenship/v1'], + id: 'https://issuer.oidp.uscis.gov/credentials/83627465', + type: ['VerifiableCredential', 'PermanentResidentCard'], + issuer: 'did:hedera:testnet:zGdjMu1hPkjbJXSPPp6RgTptnpYYM9uEkPeNbPhSkXTon_0.0.5139619', + identifier: '83627465', + name: 'Permanent Resident Card', + description: 'Government of Example Permanent Resident Card.', + issuanceDate: '2019-12-03T12:19:52Z', + expirationDate: '2029-12-03T12:19:52Z', + credentialSubject: { + type: ['PermanentResident', 'Person'], + givenName: 'JOHN', + familyName: 'SMITH', + gender: 'Male', + image: 'data:image/png;base64,iVBORw0KGgokJggg==', + residentSince: '2015-01-01', + lprCategory: 'C09', + lprNumber: '999-999-999', + commuterClassification: 'C1', + birthCountry: 'Bahamas', + birthDate: '1958-07-17', + id: 'did:key:z6MkiAUh4Fh23QAqv8w8YNCFq3QSTnHV8gQSiABV5Mj9mj2m', + }, + proof: { + verificationMethod: 'did:hedera:testnet:zGdjMu1hPkjbJXSPPp6RgTptnpYYM9uEkPeNbPhSkXTon_0.0.5139619#key-1', + type: 'Ed25519Signature2018', + created: '2024-11-17T13:02:11Z', + proofPurpose: 'assertionMethod', + jws: 'eyJhbGciOiJFZERTQSIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY0Il19..J50c8CreYwZfvF63sKJvdyVGZIh6m8GwORWKgsL34nfRi4AuUVBOpCD_2PhPvk8lgkXmKMfeSu2dHU5s6V--Dg', + }, + }, + ], + }, + TEST_VP_DOCUMENT_SIGNED: { + '@context': ['https://www.w3.org/2018/credentials/v1'], + type: ['VerifiablePresentation'], + verifiableCredential: [ + { + '@context': ['https://www.w3.org/2018/credentials/v1', 'https://w3id.org/citizenship/v1'], + id: 'https://issuer.oidp.uscis.gov/credentials/83627465', + type: ['VerifiableCredential', 'PermanentResidentCard'], + issuer: 'did:hedera:testnet:zGdjMu1hPkjbJXSPPp6RgTptnpYYM9uEkPeNbPhSkXTon_0.0.5139619', + identifier: '83627465', + name: 'Permanent Resident Card', + description: 'Government of Example Permanent Resident Card.', + issuanceDate: '2019-12-03T12:19:52Z', + expirationDate: '2029-12-03T12:19:52Z', + credentialSubject: { + type: ['PermanentResident', 'Person'], + givenName: 'JOHN', + familyName: 'SMITH', + gender: 'Male', + image: 'data:image/png;base64,iVBORw0KGgokJggg==', + residentSince: '2015-01-01', + lprCategory: 'C09', + lprNumber: '999-999-999', + commuterClassification: 'C1', + birthCountry: 'Bahamas', + birthDate: '1958-07-17', + id: 'did:key:z6MkiAUh4Fh23QAqv8w8YNCFq3QSTnHV8gQSiABV5Mj9mj2m', + }, + proof: { + verificationMethod: 'did:hedera:testnet:zGdjMu1hPkjbJXSPPp6RgTptnpYYM9uEkPeNbPhSkXTon_0.0.5139619#key-1', + type: 'Ed25519Signature2018', + created: '2024-11-17T13:02:11Z', + proofPurpose: 'assertionMethod', + jws: 'eyJhbGciOiJFZERTQSIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY0Il19..J50c8CreYwZfvF63sKJvdyVGZIh6m8GwORWKgsL34nfRi4AuUVBOpCD_2PhPvk8lgkXmKMfeSu2dHU5s6V--Dg', + }, + }, + ], + proof: { + verificationMethod: 'did:hedera:testnet:zGdjMu1hPkjbJXSPPp6RgTptnpYYM9uEkPeNbPhSkXTon_0.0.5139753#key-1', + type: 'Ed25519Signature2018', + created: '2024-11-17T14:28:30Z', + proofPurpose: 'authentication', + challenge: '7bf32d0b-39d4-41f3-96b6-45de52988e4c', + domain: 'issuer.example.com', + jws: 'eyJhbGciOiJFZERTQSIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY0Il19..TzXuwFtj4r8HaS-TsRHB7gl-HyGPhnWQJUPqWE1OxyBirPzcVskOiSKdnaNcw95DzSfkTYCHIE1U16P-rSlTCA', + }, + }, +} diff --git a/packages/hedera/tests/fixtures/index.ts b/packages/hedera/tests/fixtures/index.ts new file mode 100644 index 0000000000..272a535796 --- /dev/null +++ b/packages/hedera/tests/fixtures/index.ts @@ -0,0 +1 @@ +export * from './fixtures' diff --git a/packages/hedera/tests/setup.ts b/packages/hedera/tests/setup.ts deleted file mode 100644 index 7f0aeddaa3..0000000000 --- a/packages/hedera/tests/setup.ts +++ /dev/null @@ -1 +0,0 @@ -jest.setTimeout(60000) diff --git a/packages/hedera/tests/setupHederaModule.ts b/packages/hedera/tests/setupHederaModule.ts deleted file mode 100644 index 92ff809e0c..0000000000 --- a/packages/hedera/tests/setupHederaModule.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { HederaModuleConfigOptions } from '@credo-ts/hedera' -import { HederaModule } from '../src' - -export const getHederaModuleConfig = () => - ({ - networks: [ - { - network: 'testnet', - operatorId: '', - operatorKey: '', - }, - ], - }) satisfies HederaModuleConfigOptions - -export const getHederaModules = () => ({ - hederaSdk: new HederaModule(getHederaModuleConfig()), - // dids: new DidsModule({ - // registrars: [new HederaDidRegistrar()], - // resolvers: [new HederaDidResolver()], - // }), -}) diff --git a/packages/hedera/tests/utils/InMemoryTailsFileService.ts b/packages/hedera/tests/utils/InMemoryTailsFileService.ts new file mode 100644 index 0000000000..de7a81b73b --- /dev/null +++ b/packages/hedera/tests/utils/InMemoryTailsFileService.ts @@ -0,0 +1,59 @@ +import type { AnonCredsRevocationRegistryDefinition } from '@credo-ts/anoncreds' +import type { AgentContext, FileSystem } from '@credo-ts/core' + +import { InjectionSymbols } from '@credo-ts/core' + +import { BasicTailsFileService } from '@credo-ts/anoncreds' + +export class InMemoryTailsFileService extends BasicTailsFileService { + private tailsFilePaths: Record = {} + + public async uploadTailsFile( + _agentContext: AgentContext, + options: { + revocationRegistryDefinition: AnonCredsRevocationRegistryDefinition + } + ) { + this.tailsFilePaths[options.revocationRegistryDefinition.value.tailsHash] = + options.revocationRegistryDefinition.value.tailsLocation + + return { tailsFileUrl: options.revocationRegistryDefinition.value.tailsHash } + } + + public async getTailsFile( + agentContext: AgentContext, + options: { + revocationRegistryDefinition: AnonCredsRevocationRegistryDefinition + } + ) { + const { revocationRegistryDefinition } = options + const { tailsLocation, tailsHash } = revocationRegistryDefinition.value + + try { + agentContext.config.logger.debug( + `Checking to see if tails file for URL ${revocationRegistryDefinition.value.tailsLocation} has been stored in the FileSystem` + ) + + // hash is used as file identifier + const tailsExists = await this.tailsFileExists(agentContext, tailsHash) + const tailsFilePath = await this.getTailsFilePath(agentContext, tailsHash) + agentContext.config.logger.debug( + `Tails file for ${tailsLocation} ${tailsExists ? 'is stored' : 'is not stored'} at ${tailsFilePath}` + ) + + if (!tailsExists) { + agentContext.config.logger.debug(`Retrieving tails file from URL ${tailsLocation}`) + const fileSystem = agentContext.dependencyManager.resolve(InjectionSymbols.FileSystem) + await fileSystem.downloadToFile(tailsLocation, tailsFilePath) + agentContext.config.logger.debug(`Saved tails file to FileSystem at path ${tailsFilePath}`) + } + + return { tailsFilePath } + } catch (error) { + agentContext.config.logger.error(`Error while retrieving tails file from URL ${tailsLocation}`, { + error, + }) + throw error + } + } +} diff --git a/packages/hedera/tests/utils/hederaModule.ts b/packages/hedera/tests/utils/hederaModule.ts new file mode 100644 index 0000000000..46e956d469 --- /dev/null +++ b/packages/hedera/tests/utils/hederaModule.ts @@ -0,0 +1,66 @@ +import { AnonCredsModule } from '@credo-ts/anoncreds' +import { AskarModule } from '@credo-ts/askar' +import { Agent, Cache, CacheModule, DidsModule, Logger, utils } from '@credo-ts/core' +import { + HederaAnonCredsRegistry, + HederaDidRegistrar, + HederaDidResolver, + HederaModule, + HederaModuleConfigOptions, +} from '@credo-ts/hedera' +import { agentDependencies } from '@credo-ts/node' +import { anoncreds } from '@hyperledger/anoncreds-nodejs' +import { askar } from '@openwallet-foundation/askar-nodejs' +import { InMemoryTailsFileService } from './InMemoryTailsFileService' + +export const getHederaModuleConfig = (props: { operatorId?: string; operatorKey?: string }) => { + const operatorId = props.operatorId ?? process.env.HEDERA_TEST_OPERATOR_ID ?? '' + const operatorKey = props.operatorKey ?? process.env.HEDERA_TEST_OPERATOR_KEY ?? '' + return { + networks: [ + { + network: 'testnet', + operatorId, + operatorKey, + }, + ], + } satisfies HederaModuleConfigOptions +} + +export const getHederaAgent = (props: { + operatorId?: string + operatorKey?: string + label?: string + logger?: Logger + cache?: Cache +}) => { + const label = props.label ?? utils.uuid() + const logger = props.logger + const cache = props.cache + + let modules = {} + + modules = { + ...modules, + askar: new AskarModule({ askar, store: { id: label, key: label } }), + hedera: new HederaModule(getHederaModuleConfig(props)), + anoncreds: new AnonCredsModule({ + anoncreds, + registries: [new HederaAnonCredsRegistry()], + tailsFileService: new InMemoryTailsFileService(), + }), + dids: new DidsModule({ + resolvers: [new HederaDidResolver()], + registrars: [new HederaDidRegistrar()], + }), + } + if (cache) { + modules = { ...modules, cache: new CacheModule({ cache }) } + } + + return new Agent({ + config: { label, logger }, + dependencies: agentDependencies, + modules, + }) +} diff --git a/packages/hedera/tests/utils/index.ts b/packages/hedera/tests/utils/index.ts new file mode 100644 index 0000000000..1f91d5d2d7 --- /dev/null +++ b/packages/hedera/tests/utils/index.ts @@ -0,0 +1,3 @@ +export * from './hederaModule' +export * from './InMemoryTailsFileService' +export * from './utils' diff --git a/packages/hedera/tests/utils/testCache.ts b/packages/hedera/tests/utils/testCache.ts new file mode 100644 index 0000000000..5df1c9d1b2 --- /dev/null +++ b/packages/hedera/tests/utils/testCache.ts @@ -0,0 +1,28 @@ +import type { AgentContext, Cache } from '@credo-ts/core' + +export class testCache implements Cache { + private _cache: Map = new Map() + + get(_agentContext: AgentContext, key: string): Promise { + return Promise.resolve(this._cache.get(key)) + } + + set( + _agentContext: AgentContext, + key: string, + value: CacheValue, + _expiresInSeconds?: number | undefined + ): Promise { + this._cache.set(key, value) + return Promise.resolve() + } + + async remove(_agentContext: AgentContext, key: string): Promise { + this._cache.delete(key) + return Promise.resolve() + } + + clear() { + this._cache.clear() + } +} diff --git a/packages/hedera/tests/utils/utils.ts b/packages/hedera/tests/utils/utils.ts new file mode 100644 index 0000000000..b967e4382f --- /dev/null +++ b/packages/hedera/tests/utils/utils.ts @@ -0,0 +1,5 @@ +export const getRandomStr = (n: number) => [...Array(n)].map(() => Math.random().toString(36)[2]).join('') + +export const waitTimeout = async (timeout?: number) => { + await new Promise((resolve) => setTimeout(resolve, timeout ?? 5000)) +} diff --git a/packages/hedera/tsconfig.json b/packages/hedera/tsconfig.json index f274e6f9e1..03b41a1553 100644 --- a/packages/hedera/tsconfig.json +++ b/packages/hedera/tsconfig.json @@ -2,7 +2,6 @@ "extends": "../../tsconfig.json", "compilerOptions": { "types": ["node", "jest"], - "moduleResolution": "node", - "resolveJsonModule": true + "moduleResolution": "node" } } diff --git a/packages/indy-sdk-to-askar-migration/package.json b/packages/indy-sdk-to-askar-migration/package.json index ad9d893599..7a7c831f8a 100644 --- a/packages/indy-sdk-to-askar-migration/package.json +++ b/packages/indy-sdk-to-askar-migration/package.json @@ -3,7 +3,9 @@ "main": "src/index", "types": "src/index", "version": "0.5.13", - "files": ["build"], + "files": [ + "build" + ], "license": "Apache-2.0", "publishConfig": { "main": "build/index", @@ -30,10 +32,10 @@ "@credo-ts/node": "workspace:*" }, "devDependencies": { - "@openwallet-foundation/askar-nodejs": "^0.3.1", - "@openwallet-foundation/askar-shared": "^0.3.1", - "rimraf": "^4.4.0", - "typescript": "~5.5.2" + "@openwallet-foundation/askar-nodejs": "^0.3.2", + "@openwallet-foundation/askar-shared": "^0.3.2", + "rimraf": "^4.4.1", + "typescript": "~5.5.4" }, "peerDependencies": { "@openwallet-foundation/askar-shared": "^0.3.1" diff --git a/packages/indy-vdr/package.json b/packages/indy-vdr/package.json index 7bcd971a75..cd75e09e53 100644 --- a/packages/indy-vdr/package.json +++ b/packages/indy-vdr/package.json @@ -3,7 +3,9 @@ "main": "src/index", "types": "src/index", "version": "0.5.13", - "files": ["build"], + "files": [ + "build" + ], "license": "Apache-2.0", "publishConfig": { "main": "build/index", @@ -30,12 +32,12 @@ "devDependencies": { "@hyperledger/indy-vdr-nodejs": "^0.2.2", "@hyperledger/indy-vdr-shared": "^0.2.2", - "@stablelib/ed25519": "^1.0.2", - "@types/ref-array-di": "^1.2.6", - "@types/ref-struct-di": "^1.1.10", - "rimraf": "^4.4.0", - "rxjs": "^7.8.0", - "typescript": "~5.5.2" + "@stablelib/ed25519": "^1.0.3", + "@types/ref-array-di": "^1.2.8", + "@types/ref-struct-di": "^1.1.12", + "rimraf": "^4.4.1", + "rxjs": "^7.8.2", + "typescript": "~5.5.4" }, "peerDependencies": { "@hyperledger/indy-vdr-shared": "^0.2.2" diff --git a/packages/node/package.json b/packages/node/package.json index a18fec913b..d47101d520 100644 --- a/packages/node/package.json +++ b/packages/node/package.json @@ -3,7 +3,9 @@ "main": "src/index", "types": "src/index", "version": "0.5.13", - "files": ["build"], + "files": [ + "build" + ], "license": "Apache-2.0", "publishConfig": { "main": "build/index", @@ -28,16 +30,16 @@ "@2060.io/ref-napi": "^3.0.6", "@credo-ts/core": "workspace:*", "@credo-ts/didcomm": "workspace:*", - "@types/express": "^4.17.21", + "@types/express": "^4.17.23", "express": "^4.21.2", - "rxjs": "^7.8.0", - "ws": "^8.13.0" + "rxjs": "^7.8.2", + "ws": "^8.18.2" }, "devDependencies": { - "@types/node": "^18.18.8", - "@types/ws": "^8.5.4", - "nock": "^14.0.0-beta.19", - "rimraf": "^4.4.0", - "typescript": "~5.5.2" + "@types/node": "18.18.8", + "@types/ws": "^8.18.1", + "nock": "^14.0.5", + "rimraf": "^4.4.1", + "typescript": "~5.5.4" } } diff --git a/packages/openid4vc/package.json b/packages/openid4vc/package.json index 7e2e45d699..5ddb7d2c18 100644 --- a/packages/openid4vc/package.json +++ b/packages/openid4vc/package.json @@ -3,7 +3,9 @@ "main": "src/index", "types": "src/index", "version": "0.5.13", - "files": ["build"], + "files": [ + "build" + ], "license": "Apache-2.0", "publishConfig": { "main": "build/index", @@ -25,20 +27,20 @@ }, "dependencies": { "@credo-ts/core": "workspace:*", - "class-transformer": "^0.5.1", - "rxjs": "^7.8.0", - "zod": "^3.24.2", - "@openid4vc/openid4vci": "0.3.0-alpha-20250602121005", "@openid4vc/oauth2": "0.3.0-alpha-20250602121005", + "@openid4vc/openid4vci": "0.3.0-alpha-20250602121005", "@openid4vc/openid4vp": "0.3.0-alpha-20250602121005", - "@openid4vc/utils": "0.3.0-alpha-20250602121005" + "@openid4vc/utils": "0.3.0-alpha-20250602121005", + "class-transformer": "^0.5.1", + "rxjs": "^7.8.2", + "zod": "^3.25.57" }, "devDependencies": { "@credo-ts/tenants": "workspace:*", - "@types/express": "^4.17.21", + "@types/express": "^4.17.23", "express": "^4.21.2", - "nock": "^14.0.0-beta.19", - "rimraf": "^4.4.0", - "typescript": "~5.5.2" + "nock": "^14.0.5", + "rimraf": "^4.4.1", + "typescript": "~5.5.4" } } diff --git a/packages/question-answer/package.json b/packages/question-answer/package.json index 42af19a64a..aa63e3f3d5 100644 --- a/packages/question-answer/package.json +++ b/packages/question-answer/package.json @@ -3,7 +3,9 @@ "main": "src/index", "types": "src/index", "version": "0.5.13", - "files": ["build"], + "files": [ + "build" + ], "license": "Apache-2.0", "publishConfig": { "main": "build/index", @@ -28,12 +30,12 @@ "@credo-ts/didcomm": "workspace:*", "class-transformer": "0.5.1", "class-validator": "0.14.1", - "rxjs": "^7.8.0" + "rxjs": "^7.8.2" }, "devDependencies": { "@credo-ts/node": "workspace:*", - "reflect-metadata": "^0.1.13", - "rimraf": "^4.4.0", - "typescript": "~5.5.2" + "reflect-metadata": "^0.1.14", + "rimraf": "^4.4.1", + "typescript": "~5.5.4" } } diff --git a/packages/react-native/package.json b/packages/react-native/package.json index 1d7b63dd2e..f5fb16fa49 100644 --- a/packages/react-native/package.json +++ b/packages/react-native/package.json @@ -3,7 +3,9 @@ "main": "src/index", "types": "src/index", "version": "0.5.13", - "files": ["build"], + "files": [ + "build" + ], "license": "Apache-2.0", "publishConfig": { "main": "build/index", @@ -29,17 +31,17 @@ "events": "^3.3.0" }, "devDependencies": { - "react-native": "^0.78.1", + "react-native": "^0.78.2", "react-native-fs": "^2.20.0", - "react-native-get-random-values": "^1.8.0", - "rimraf": "^4.4.0", - "typescript": "~5.5.2" + "react-native-get-random-values": "^1.11.0", + "rimraf": "^4.4.1", + "typescript": "~5.5.4" }, "peerDependencies": { + "@animo-id/expo-secure-environment": "^0.1.1", "react-native": ">=0.71.4", "react-native-fs": "^2.20.0", - "react-native-get-random-values": "^1.8.0", - "@animo-id/expo-secure-environment": "^0.1.1" + "react-native-get-random-values": "^1.8.0" }, "peerDependenciesMeta": { "@animo-id/expo-secure-environment": { diff --git a/packages/redis-cache/package.json b/packages/redis-cache/package.json index e56e1a722c..b9e3abd4e2 100644 --- a/packages/redis-cache/package.json +++ b/packages/redis-cache/package.json @@ -3,7 +3,9 @@ "main": "src/index", "types": "src/index", "version": "0.5.13", - "files": ["build"], + "files": [ + "build" + ], "license": "Apache-2.0", "publishConfig": { "main": "build/index", @@ -28,7 +30,7 @@ "ioredis": "^5.6.1" }, "devDependencies": { - "rimraf": "^4.4.0", - "typescript": "~5.5.2" + "rimraf": "^4.4.1", + "typescript": "~5.5.4" } } diff --git a/packages/tenants/package.json b/packages/tenants/package.json index 144baf83b8..322c24fe46 100644 --- a/packages/tenants/package.json +++ b/packages/tenants/package.json @@ -3,7 +3,9 @@ "main": "src/index", "types": "src/index", "version": "0.5.13", - "files": ["build"], + "files": [ + "build" + ], "license": "Apache-2.0", "publishConfig": { "main": "build/index", @@ -26,12 +28,12 @@ "dependencies": { "@credo-ts/core": "workspace:*", "@credo-ts/didcomm": "workspace:*", - "async-mutex": "^0.4.0" + "async-mutex": "^0.4.1" }, "devDependencies": { "@credo-ts/node": "workspace:*", - "reflect-metadata": "^0.1.13", - "rimraf": "^4.4.0", - "typescript": "~5.5.2" + "reflect-metadata": "^0.1.14", + "rimraf": "^4.4.1", + "typescript": "~5.5.4" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c9faf8b7ac..ab047182fe 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -18,47 +18,50 @@ importers: .: devDependencies: '@babel/core': - specifier: ^7.25.8 - version: 7.26.0 + specifier: ^7.27.4 + version: 7.27.4 '@babel/preset-env': - specifier: ^7.25.8 - version: 7.26.0(@babel/core@7.26.0) + specifier: ^7.27.2 + version: 7.27.2(@babel/core@7.27.4) '@biomejs/biome': specifier: ^1.9.4 version: 1.9.4 '@changesets/cli': - specifier: ^2.27.5 - version: 2.27.5 + specifier: ^2.29.4 + version: 2.29.4 '@jest/types': specifier: ^29.6.3 version: 29.6.3 '@openwallet-foundation/askar-nodejs': - specifier: ^0.3.1 - version: 0.3.1 + specifier: ^0.3.2 + version: 0.3.2 '@types/cors': - specifier: ^2.8.10 - version: 2.8.17 + specifier: ^2.8.19 + version: 2.8.19 '@types/express': - specifier: ^4.17.21 - version: 4.17.21 + specifier: ^4.17.23 + version: 4.17.23 '@types/jest': - specifier: ^29.5.12 - version: 29.5.12 + specifier: ^29.5.14 + version: 29.5.14 '@types/node': specifier: 18.18.8 version: 18.18.8 '@types/supertest': - specifier: ^6.0.2 - version: 6.0.2 + specifier: ^6.0.3 + version: 6.0.3 '@types/uuid': - specifier: ^9.0.1 + specifier: ^9.0.8 version: 9.0.8 '@types/varint': - specifier: ^6.0.0 + specifier: ^6.0.3 version: 6.0.3 '@types/ws': - specifier: ^8.5.4 - version: 8.5.10 + specifier: ^8.18.1 + version: 8.18.1 + babel-jest: + specifier: ^30.0.0 + version: 30.0.0(@babel/core@7.27.4) cors: specifier: ^2.8.5 version: 2.8.5 @@ -69,32 +72,35 @@ importers: specifier: ^29.7.0 version: 29.7.0(@types/node@18.18.8)(ts-node@10.9.2(@types/node@18.18.8)(typescript@5.5.4)) nock: - specifier: ^14.0.0-beta.19 - version: 14.0.0-beta.19 + specifier: ^14.0.5 + version: 14.0.5 + rimraf: + specifier: ^4.4.1 + version: 4.4.1 rxjs: - specifier: ^7.8.0 - version: 7.8.1 + specifier: ^7.8.2 + version: 7.8.2 supertest: - specifier: ^7.0.0 - version: 7.0.0 + specifier: ^7.1.1 + version: 7.1.1 ts-jest: - specifier: ^29.1.2 - version: 29.1.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@18.18.8)(ts-node@10.9.2(@types/node@18.18.8)(typescript@5.5.4)))(typescript@5.5.4) + specifier: ^29.3.4 + version: 29.3.4(@babel/core@7.27.4)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@30.0.0(@babel/core@7.27.4))(jest@29.7.0(@types/node@18.18.8)(ts-node@10.9.2(@types/node@18.18.8)(typescript@5.5.4)))(typescript@5.5.4) ts-node: specifier: ^10.9.2 version: 10.9.2(@types/node@18.18.8)(typescript@5.5.4) tsyringe: - specifier: ^4.8.0 - version: 4.8.0 + specifier: ^4.10.0 + version: 4.10.0 typescript: - specifier: ~5.5.2 + specifier: ~5.5.4 version: 5.5.4 undici: specifier: ^6.20.1 - version: 6.21.0 + version: 6.21.3 ws: - specifier: ^8.13.0 - version: 8.17.1 + specifier: ^8.18.2 + version: 8.18.2 demo: dependencies: @@ -105,10 +111,10 @@ importers: specifier: ^0.2.2 version: 0.2.2 '@openwallet-foundation/askar-nodejs': - specifier: ^0.3.1 - version: 0.3.1 + specifier: ^0.3.2 + version: 0.3.2 inquirer: - specifier: ^8.2.5 + specifier: ^8.2.6 version: 8.2.6 devDependencies: '@credo-ts/anoncreds': @@ -126,6 +132,9 @@ importers: '@credo-ts/didcomm': specifier: workspace:* version: link:../packages/didcomm + '@credo-ts/hedera': + specifier: workspace:* + version: link:../packages/hedera '@credo-ts/indy-vdr': specifier: workspace:* version: link:../packages/indy-vdr @@ -133,17 +142,17 @@ importers: specifier: workspace:* version: link:../packages/node '@types/figlet': - specifier: ^1.5.4 - version: 1.5.8 + specifier: ^1.7.0 + version: 1.7.0 '@types/inquirer': - specifier: ^8.2.6 - version: 8.2.10 + specifier: ^8.2.11 + version: 8.2.11 clear: specifier: ^0.1.0 version: 0.1.0 figlet: - specifier: ^1.5.2 - version: 1.7.0 + specifier: ^1.8.1 + version: 1.8.1 ts-node: specifier: ^10.9.2 version: 10.9.2(@types/node@18.18.8)(typescript@5.5.4) @@ -157,20 +166,20 @@ importers: specifier: ^0.2.2 version: 0.2.2 '@koa/bodyparser': - specifier: ^5.1.1 - version: 5.1.1(koa@2.16.0) + specifier: ^5.1.2 + version: 5.1.2(koa@2.16.1) '@openwallet-foundation/askar-nodejs': - specifier: ^0.3.1 - version: 0.3.1 + specifier: ^0.3.2 + version: 0.3.2 express: specifier: ^4.21.2 version: 4.21.2 inquirer: - specifier: ^8.2.5 + specifier: ^8.2.6 version: 8.2.6 jose: - specifier: ^5.3.0 - version: 5.9.6 + specifier: ^5.10.0 + version: 5.10.0 oidc-provider: specifier: ^8.8.1 version: 8.8.1 @@ -188,14 +197,14 @@ importers: specifier: workspace:* version: link:../packages/openid4vc '@types/express': - specifier: ^4.17.21 - version: 4.17.21 + specifier: ^4.17.23 + version: 4.17.23 '@types/figlet': - specifier: ^1.5.4 - version: 1.5.8 + specifier: ^1.7.0 + version: 1.7.0 '@types/inquirer': - specifier: ^8.2.6 - version: 8.2.10 + specifier: ^8.2.11 + version: 8.2.11 '@types/oidc-provider': specifier: ^8.8.1 version: 8.8.1 @@ -203,14 +212,14 @@ importers: specifier: ^0.1.0 version: 0.1.0 figlet: - specifier: ^1.5.2 - version: 1.7.0 + specifier: ^1.8.1 + version: 1.8.1 ts-node: specifier: ^10.9.2 version: 10.9.2(@types/node@18.18.8)(typescript@5.5.4) tsx: - specifier: ^4.11.0 - version: 4.19.2 + specifier: ^4.19.4 + version: 4.19.4 packages/action-menu: dependencies: @@ -227,17 +236,17 @@ importers: specifier: 0.14.1 version: 0.14.1 rxjs: - specifier: ^7.8.0 - version: 7.8.1 + specifier: ^7.8.2 + version: 7.8.2 devDependencies: reflect-metadata: - specifier: ^0.1.13 + specifier: ^0.1.14 version: 0.1.14 rimraf: - specifier: ^4.4.0 + specifier: ^4.4.1 version: 4.4.1 typescript: - specifier: ~5.5.2 + specifier: ~5.5.4 version: 5.5.4 packages/anoncreds: @@ -261,7 +270,7 @@ importers: specifier: 0.14.1 version: 0.14.1 reflect-metadata: - specifier: ^0.1.13 + specifier: ^0.1.14 version: 0.1.14 devDependencies: '@credo-ts/node': @@ -274,13 +283,13 @@ importers: specifier: ^0.3.1 version: 0.3.1 rimraf: - specifier: ^4.4.0 + specifier: ^4.4.1 version: 4.4.1 rxjs: - specifier: ^7.8.0 - version: 7.8.1 + specifier: ^7.8.2 + version: 7.8.2 typescript: - specifier: ~5.5.2 + specifier: ~5.5.4 version: 5.5.4 packages/askar: @@ -295,42 +304,42 @@ importers: specifier: 0.14.1 version: 0.14.1 rxjs: - specifier: ^7.8.0 - version: 7.8.1 + specifier: ^7.8.2 + version: 7.8.2 tsyringe: - specifier: ^4.8.0 - version: 4.8.0 + specifier: ^4.10.0 + version: 4.10.0 devDependencies: '@credo-ts/tenants': specifier: workspace:* version: link:../tenants '@openwallet-foundation/askar-nodejs': - specifier: ^0.3.1 - version: 0.3.1 + specifier: ^0.3.2 + version: 0.3.2 '@openwallet-foundation/askar-shared': - specifier: ^0.3.1 - version: 0.3.1 + specifier: ^0.3.2 + version: 0.3.2 '@types/ref-array-di': - specifier: ^1.2.6 + specifier: ^1.2.8 version: 1.2.8 '@types/ref-struct-di': - specifier: ^1.1.10 + specifier: ^1.1.12 version: 1.1.12 reflect-metadata: - specifier: ^0.1.13 + specifier: ^0.1.14 version: 0.1.14 rimraf: - specifier: ^4.4.0 + specifier: ^4.4.1 version: 4.4.1 typescript: - specifier: ~5.5.2 + specifier: ~5.5.4 version: 5.5.4 packages/cheqd: dependencies: '@cheqd/sdk': - specifier: ^5.2.1 - version: 5.2.1 + specifier: ^5.3.1 + version: 5.3.1 '@cheqd/ts-proto': specifier: ~2.4.1 version: 2.4.1 @@ -359,17 +368,17 @@ importers: specifier: 0.14.1 version: 0.14.1 rxjs: - specifier: ^7.8.0 - version: 7.8.1 + specifier: ^7.8.2 + version: 7.8.2 tsyringe: - specifier: ^4.8.0 - version: 4.8.0 + specifier: ^4.10.0 + version: 4.10.0 devDependencies: rimraf: - specifier: ^4.0.7 + specifier: ^4.4.1 version: 4.4.1 typescript: - specifier: ~5.5.2 + specifier: ~5.5.4 version: 5.5.4 packages/core: @@ -385,37 +394,37 @@ importers: version: 1.1.2 '@digitalcredentials/jsonld': specifier: ^6.0.0 - version: 6.0.0(expo@51.0.29(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0)))(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1))(web-streams-polyfill@3.3.3) + version: 6.0.0(expo@51.0.29(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1))(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(web-streams-polyfill@3.3.3) '@digitalcredentials/jsonld-signatures': specifier: ^9.4.0 - version: 9.4.0(expo@51.0.29(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0)))(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1))(web-streams-polyfill@3.3.3) + version: 9.4.0(expo@51.0.29(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1))(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(web-streams-polyfill@3.3.3) '@digitalcredentials/vc': specifier: ^6.0.1 - version: 6.0.1(expo@51.0.29(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0)))(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1))(web-streams-polyfill@3.3.3) + version: 6.0.1(expo@51.0.29(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1))(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(web-streams-polyfill@3.3.3) '@multiformats/base-x': specifier: ^4.0.1 version: 4.0.1 '@noble/curves': - specifier: ^1.8.1 - version: 1.8.1 + specifier: ^1.9.2 + version: 1.9.2 '@noble/hashes': - specifier: ^1.7.1 - version: 1.7.1 + specifier: ^1.8.0 + version: 1.8.0 '@peculiar/asn1-ecc': - specifier: ^2.3.14 - version: 2.3.14 + specifier: ^2.3.15 + version: 2.3.15 '@peculiar/asn1-rsa': specifier: ^2.3.15 version: 2.3.15 '@peculiar/asn1-schema': - specifier: ^2.3.13 - version: 2.3.13 + specifier: ^2.3.15 + version: 2.3.15 '@peculiar/asn1-x509': - specifier: ^2.3.13 - version: 2.3.13 + specifier: ^2.3.15 + version: 2.3.15 '@peculiar/x509': - specifier: ^1.12.1 - version: 1.12.3 + specifier: ^1.12.4 + version: 1.12.4 '@sd-jwt/core': specifier: ^0.7.2 version: 0.7.2 @@ -444,11 +453,11 @@ importers: specifier: 0.33.0 version: 0.33.0 '@stablelib/ed25519': - specifier: ^1.0.2 + specifier: ^1.0.3 version: 1.0.3 '@types/ws': - specifier: ^8.5.4 - version: 8.5.10 + specifier: ^8.18.1 + version: 8.18.1 borc: specifier: ^3.0.0 version: 3.0.0 @@ -462,8 +471,8 @@ importers: specifier: 0.14.1 version: 0.14.1 dcql: - specifier: ^0.2.20 - version: 0.2.20(typescript@5.5.4) + specifier: ^0.2.22 + version: 0.2.22(typescript@5.5.4) did-resolver: specifier: ^4.1.0 version: 4.1.0 @@ -477,56 +486,56 @@ importers: specifier: ^1.3.6 version: 1.3.6 object-inspect: - specifier: ^1.10.3 - version: 1.13.1 + specifier: ^1.13.4 + version: 1.13.4 reflect-metadata: - specifier: ^0.1.13 + specifier: ^0.1.14 version: 0.1.14 rxjs: - specifier: ^7.8.0 - version: 7.8.1 + specifier: ^7.8.2 + version: 7.8.2 tsyringe: - specifier: ^4.8.0 - version: 4.8.0 + specifier: ^4.10.0 + version: 4.10.0 uuid: - specifier: ^9.0.0 + specifier: ^9.0.1 version: 9.0.1 varint: specifier: ^6.0.0 version: 6.0.0 web-did-resolver: - specifier: ^2.0.21 - version: 2.0.27 + specifier: ^2.0.30 + version: 2.0.30 webcrypto-core: - specifier: ^1.8.0 - version: 1.8.0 + specifier: ^1.8.1 + version: 1.8.1 zod: - specifier: ^3.24.2 - version: 3.24.2 + specifier: ^3.25.57 + version: 3.25.57 devDependencies: '@types/events': - specifier: ^3.0.0 + specifier: ^3.0.3 version: 3.0.3 '@types/object-inspect': - specifier: ^1.8.0 + specifier: ^1.13.0 version: 1.13.0 '@types/uuid': - specifier: ^9.0.1 + specifier: ^9.0.8 version: 9.0.8 '@types/varint': - specifier: ^6.0.0 + specifier: ^6.0.3 version: 6.0.3 nock: - specifier: ^14.0.0-beta.19 - version: 14.0.0-beta.19 + specifier: ^14.0.5 + version: 14.0.5 rimraf: - specifier: ^4.4.0 + specifier: ^4.4.1 version: 4.4.1 tslog: - specifier: ^4.8.2 + specifier: ^4.9.3 version: 4.9.3 typescript: - specifier: ~5.5.2 + specifier: ~5.5.4 version: 5.5.4 packages/didcomm: @@ -541,14 +550,14 @@ importers: specifier: 0.14.1 version: 0.14.1 luxon: - specifier: ^3.5.0 - version: 3.5.0 + specifier: ^3.6.1 + version: 3.6.1 query-string: - specifier: ^7.0.1 + specifier: ^7.1.3 version: 7.1.3 rxjs: - specifier: ^7.8.0 - version: 7.8.1 + specifier: ^7.8.2 + version: 7.8.2 devDependencies: '@animo-id/pex': specifier: ^6.1.0 @@ -557,16 +566,16 @@ importers: specifier: ^2.3.2 version: 2.3.2 '@types/luxon': - specifier: ^3.2.0 - version: 3.4.2 + specifier: ^3.6.2 + version: 3.6.2 reflect-metadata: - specifier: ^0.1.13 + specifier: ^0.1.14 version: 0.1.14 rimraf: - specifier: ^4.4.0 + specifier: ^4.4.1 version: 4.4.1 typescript: - specifier: ~5.5.2 + specifier: ~5.5.4 version: 5.5.4 packages/drpc: @@ -588,13 +597,13 @@ importers: specifier: workspace:* version: link:../node reflect-metadata: - specifier: ^0.1.13 + specifier: ^0.1.14 version: 0.1.14 rimraf: - specifier: ^4.4.0 + specifier: ^4.4.1 version: 4.4.1 typescript: - specifier: ~5.5.2 + specifier: ~5.5.4 version: 5.5.4 packages/hedera: @@ -607,17 +616,17 @@ importers: version: link:../core '@hiero-did-sdk-js/anoncreds': specifier: npm:@hiero-did-sdk-js/anoncreds@0.0.1 - version: 0.0.1(bn.js@5.2.1)(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1))(react@18.3.1) - '@swiss-digital-assets-institute/registrar': - specifier: 0.3.0 - version: 0.3.0(bn.js@5.2.1)(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1)) + version: 0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) + '@hiero-did-sdk-js/did': + specifier: npm:@hiero-did-sdk-js/did@0.0.1 + version: 0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) devDependencies: - rimraf: - specifier: ^4.0.7 - version: 4.4.1 - typescript: - specifier: ~5.5.2 - version: 5.5.4 + '@credo-ts/node': + specifier: workspace:* + version: link:../node + '@hyperledger/anoncreds-nodejs': + specifier: ^0.3.1 + version: 0.3.1 packages/indy-sdk-to-askar-migration: dependencies: @@ -635,16 +644,16 @@ importers: version: link:../node devDependencies: '@openwallet-foundation/askar-nodejs': - specifier: ^0.3.1 - version: 0.3.1 + specifier: ^0.3.2 + version: 0.3.2 '@openwallet-foundation/askar-shared': - specifier: ^0.3.1 - version: 0.3.1 + specifier: ^0.3.2 + version: 0.3.2 rimraf: - specifier: ^4.4.0 + specifier: ^4.4.1 version: 4.4.1 typescript: - specifier: ~5.5.2 + specifier: ~5.5.4 version: 5.5.4 packages/indy-vdr: @@ -663,22 +672,22 @@ importers: specifier: ^0.2.2 version: 0.2.2 '@stablelib/ed25519': - specifier: ^1.0.2 + specifier: ^1.0.3 version: 1.0.3 '@types/ref-array-di': - specifier: ^1.2.6 + specifier: ^1.2.8 version: 1.2.8 '@types/ref-struct-di': - specifier: ^1.1.10 + specifier: ^1.1.12 version: 1.1.12 rimraf: - specifier: ^4.4.0 + specifier: ^4.4.1 version: 4.4.1 rxjs: - specifier: ^7.8.0 - version: 7.8.1 + specifier: ^7.8.2 + version: 7.8.2 typescript: - specifier: ~5.5.2 + specifier: ~5.5.4 version: 5.5.4 packages/node: @@ -696,32 +705,32 @@ importers: specifier: workspace:* version: link:../didcomm '@types/express': - specifier: ^4.17.21 - version: 4.17.21 + specifier: ^4.17.23 + version: 4.17.23 express: specifier: ^4.21.2 version: 4.21.2 rxjs: - specifier: ^7.8.0 - version: 7.8.1 + specifier: ^7.8.2 + version: 7.8.2 ws: - specifier: ^8.13.0 - version: 8.17.1 + specifier: ^8.18.2 + version: 8.18.2 devDependencies: '@types/node': specifier: 18.18.8 version: 18.18.8 '@types/ws': - specifier: ^8.5.4 - version: 8.5.10 + specifier: ^8.18.1 + version: 8.18.1 nock: - specifier: ^14.0.0-beta.19 - version: 14.0.0-beta.19 + specifier: ^14.0.5 + version: 14.0.5 rimraf: - specifier: ^4.4.0 + specifier: ^4.4.1 version: 4.4.1 typescript: - specifier: ~5.5.2 + specifier: ~5.5.4 version: 5.5.4 packages/openid4vc: @@ -745,29 +754,29 @@ importers: specifier: ^0.5.1 version: 0.5.1 rxjs: - specifier: ^7.8.0 - version: 7.8.1 + specifier: ^7.8.2 + version: 7.8.2 zod: - specifier: ^3.24.2 - version: 3.24.2 + specifier: ^3.25.57 + version: 3.25.57 devDependencies: '@credo-ts/tenants': specifier: workspace:* version: link:../tenants '@types/express': - specifier: ^4.17.21 - version: 4.17.21 + specifier: ^4.17.23 + version: 4.17.23 express: specifier: ^4.21.2 version: 4.21.2 nock: - specifier: ^14.0.0-beta.19 - version: 14.0.0-beta.19 + specifier: ^14.0.5 + version: 14.0.5 rimraf: - specifier: ^4.4.0 + specifier: ^4.4.1 version: 4.4.1 typescript: - specifier: ~5.5.2 + specifier: ~5.5.4 version: 5.5.4 packages/question-answer: @@ -785,27 +794,27 @@ importers: specifier: 0.14.1 version: 0.14.1 rxjs: - specifier: ^7.8.0 - version: 7.8.1 + specifier: ^7.8.2 + version: 7.8.2 devDependencies: '@credo-ts/node': specifier: workspace:* version: link:../node reflect-metadata: - specifier: ^0.1.13 + specifier: ^0.1.14 version: 0.1.14 rimraf: - specifier: ^4.4.0 + specifier: ^4.4.1 version: 4.4.1 typescript: - specifier: ~5.5.2 + specifier: ~5.5.4 version: 5.5.4 packages/react-native: dependencies: '@animo-id/expo-secure-environment': specifier: ^0.1.1 - version: 0.1.1(expo@51.0.29(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0)))(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1))(react@18.3.1) + version: 0.1.1(expo@51.0.29(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1))(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) '@azure/core-asynciterator-polyfill': specifier: ^1.0.2 version: 1.0.2 @@ -817,19 +826,19 @@ importers: version: 3.3.0 devDependencies: react-native: - specifier: ^0.78.1 - version: 0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1) + specifier: ^0.78.2 + version: 0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1) react-native-fs: specifier: ^2.20.0 - version: 2.20.0(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1)) + version: 2.20.0(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) react-native-get-random-values: - specifier: ^1.8.0 - version: 1.11.0(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1)) + specifier: ^1.11.0 + version: 1.11.0(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) rimraf: - specifier: ^4.4.0 + specifier: ^4.4.1 version: 4.4.1 typescript: - specifier: ~5.5.2 + specifier: ~5.5.4 version: 5.5.4 packages/redis-cache: @@ -842,10 +851,10 @@ importers: version: 5.6.1 devDependencies: rimraf: - specifier: ^4.4.0 + specifier: ^4.4.1 version: 4.4.1 typescript: - specifier: ~5.5.2 + specifier: ~5.5.4 version: 5.5.4 packages/tenants: @@ -857,20 +866,20 @@ importers: specifier: workspace:* version: link:../didcomm async-mutex: - specifier: ^0.4.0 + specifier: ^0.4.1 version: 0.4.1 devDependencies: '@credo-ts/node': specifier: workspace:* version: link:../node reflect-metadata: - specifier: ^0.1.13 + specifier: ^0.1.14 version: 0.1.14 rimraf: - specifier: ^4.4.0 + specifier: ^4.4.1 version: 4.4.1 typescript: - specifier: ~5.5.2 + specifier: ~5.5.4 version: 5.5.4 samples/extension-module: @@ -888,24 +897,24 @@ importers: specifier: workspace:* version: link:../../packages/node '@openwallet-foundation/askar-nodejs': - specifier: ^0.3.1 - version: 0.3.1 + specifier: ^0.3.2 + version: 0.3.2 class-validator: specifier: 0.14.1 version: 0.14.1 rxjs: - specifier: ^7.8.0 - version: 7.8.1 + specifier: ^7.8.2 + version: 7.8.2 devDependencies: '@types/express': - specifier: ^4.17.13 - version: 4.17.21 + specifier: ^4.17.23 + version: 4.17.23 '@types/uuid': - specifier: ^9.0.1 + specifier: ^9.0.8 version: 9.0.8 '@types/ws': - specifier: ^8.5.4 - version: 8.5.10 + specifier: ^8.18.1 + version: 8.18.1 ts-node: specifier: ^10.9.2 version: 10.9.2(@types/node@18.18.8)(typescript@5.5.4) @@ -919,23 +928,23 @@ importers: specifier: workspace:* version: link:../../packages/core '@types/express': - specifier: ^4.17.13 - version: 4.17.21 + specifier: ^4.17.23 + version: 4.17.23 '@types/multer': - specifier: ^1.4.7 - version: 1.4.11 + specifier: ^1.4.13 + version: 1.4.13 '@types/uuid': - specifier: ^9.0.1 + specifier: ^9.0.8 version: 9.0.8 '@types/ws': - specifier: ^8.5.4 - version: 8.5.10 + specifier: ^8.18.1 + version: 8.18.1 form-data: - specifier: ^4.0.0 - version: 4.0.0 + specifier: ^4.0.3 + version: 4.0.3 multer: - specifier: ^1.4.5-lts.1 - version: 1.4.5-lts.1 + specifier: 1.4.5-lts.2 + version: 1.4.5-lts.2 devDependencies: ts-node: specifier: ^10.9.2 @@ -979,47 +988,47 @@ packages: '@babel/code-frame@7.10.4': resolution: {integrity: sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==} - '@babel/code-frame@7.26.2': - resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} + '@babel/code-frame@7.27.1': + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.26.3': - resolution: {integrity: sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g==} + '@babel/compat-data@7.27.5': + resolution: {integrity: sha512-KiRAp/VoJaWkkte84TvUd9qjdbZAdiqyvMxrGl1N6vzFogKmaLgoM3L1kgtLicp2HP5fBJS8JrZKLVIZGVJAVg==} engines: {node: '>=6.9.0'} - '@babel/core@7.26.0': - resolution: {integrity: sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==} + '@babel/core@7.27.4': + resolution: {integrity: sha512-bXYxrXFubeYdvB0NhD/NBB3Qi6aZeV20GOWVI47t2dkecCEoneR4NPVcb7abpXDEvejgrUfFtG6vG/zxAKmg+g==} engines: {node: '>=6.9.0'} '@babel/generator@7.2.0': resolution: {integrity: sha512-BA75MVfRlFQG2EZgFYIwyT1r6xSkwfP2bdkY/kLZusEYWiJs4xCowab/alaEaT0wSvmVuXGqiefeBlP+7V1yKg==} - '@babel/generator@7.26.3': - resolution: {integrity: sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==} + '@babel/generator@7.27.5': + resolution: {integrity: sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw==} engines: {node: '>=6.9.0'} - '@babel/helper-annotate-as-pure@7.25.9': - resolution: {integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==} + '@babel/helper-annotate-as-pure@7.27.3': + resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} engines: {node: '>=6.9.0'} - '@babel/helper-compilation-targets@7.25.9': - resolution: {integrity: sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==} + '@babel/helper-compilation-targets@7.27.2': + resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} engines: {node: '>=6.9.0'} - '@babel/helper-create-class-features-plugin@7.25.9': - resolution: {integrity: sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==} + '@babel/helper-create-class-features-plugin@7.27.1': + resolution: {integrity: sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-create-regexp-features-plugin@7.26.3': - resolution: {integrity: sha512-G7ZRb40uUgdKOQqPLjfD12ZmGA54PzqDFUv2BKImnC9QIfGhIHKvVML0oN8IUiDq4iRqpq74ABpvOaerfWdong==} + '@babel/helper-create-regexp-features-plugin@7.27.1': + resolution: {integrity: sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-define-polyfill-provider@0.6.2': - resolution: {integrity: sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==} + '@babel/helper-define-polyfill-provider@0.6.4': + resolution: {integrity: sha512-jljfR1rGnXXNWnmQg2K3+bvhkxB51Rl32QRaOTuwwjviGrHzIbSc8+x9CpraDtbT7mfyjXObULP4w/adunNwAw==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 @@ -1027,103 +1036,99 @@ packages: resolution: {integrity: sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==} engines: {node: '>=6.9.0'} - '@babel/helper-member-expression-to-functions@7.25.9': - resolution: {integrity: sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==} + '@babel/helper-member-expression-to-functions@7.27.1': + resolution: {integrity: sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==} engines: {node: '>=6.9.0'} - '@babel/helper-module-imports@7.25.9': - resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} + '@babel/helper-module-imports@7.27.1': + resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} engines: {node: '>=6.9.0'} - '@babel/helper-module-transforms@7.26.0': - resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} + '@babel/helper-module-transforms@7.27.3': + resolution: {integrity: sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-optimise-call-expression@7.25.9': - resolution: {integrity: sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==} - engines: {node: '>=6.9.0'} - - '@babel/helper-plugin-utils@7.25.9': - resolution: {integrity: sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==} + '@babel/helper-optimise-call-expression@7.27.1': + resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==} engines: {node: '>=6.9.0'} - '@babel/helper-plugin-utils@7.26.5': - resolution: {integrity: sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==} + '@babel/helper-plugin-utils@7.27.1': + resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} engines: {node: '>=6.9.0'} - '@babel/helper-remap-async-to-generator@7.25.9': - resolution: {integrity: sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==} + '@babel/helper-remap-async-to-generator@7.27.1': + resolution: {integrity: sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-replace-supers@7.25.9': - resolution: {integrity: sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==} + '@babel/helper-replace-supers@7.27.1': + resolution: {integrity: sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-skip-transparent-expression-wrappers@7.25.9': - resolution: {integrity: sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==} + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': + resolution: {integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==} engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@7.25.9': - resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.25.9': - resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} + '@babel/helper-validator-identifier@7.27.1': + resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-option@7.25.9': - resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} + '@babel/helper-validator-option@7.27.1': + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} engines: {node: '>=6.9.0'} - '@babel/helper-wrap-function@7.25.9': - resolution: {integrity: sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==} + '@babel/helper-wrap-function@7.27.1': + resolution: {integrity: sha512-NFJK2sHUvrjo8wAU/nQTWU890/zB2jj0qBcCbZbbf+005cAsv6tMjXz31fBign6M5ov1o0Bllu+9nbqkfsjjJQ==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.26.0': - resolution: {integrity: sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==} + '@babel/helpers@7.27.6': + resolution: {integrity: sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==} engines: {node: '>=6.9.0'} - '@babel/highlight@7.24.7': - resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} + '@babel/highlight@7.25.9': + resolution: {integrity: sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw==} engines: {node: '>=6.9.0'} - '@babel/parser@7.26.3': - resolution: {integrity: sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==} + '@babel/parser@7.27.5': + resolution: {integrity: sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9': - resolution: {integrity: sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==} + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.27.1': + resolution: {integrity: sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.9': - resolution: {integrity: sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==} + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1': + resolution: {integrity: sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.9': - resolution: {integrity: sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==} + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1': + resolution: {integrity: sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.25.9': - resolution: {integrity: sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==} + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1': + resolution: {integrity: sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.13.0 - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.9': - resolution: {integrity: sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==} + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.27.1': + resolution: {integrity: sha512-6BpaYGDavZqkI6yT+KSPdpZFfpnd68UKXbcjI9pJ13pvHhPrCKWOOLp+ysvMeA+DxnhuPpgIaRpxRxo5A9t5jw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -1142,14 +1147,14 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-proposal-decorators@7.24.7': - resolution: {integrity: sha512-RL9GR0pUG5Kc8BUWLNDm2T5OpYwSX15r98I0IkgmRQTXuELq/OynH8xtMTMvTJFjXbMWFVTKtYkTaYQsuAwQlQ==} + '@babel/plugin-proposal-decorators@7.27.1': + resolution: {integrity: sha512-DTxe4LBPrtFdsWzgpmbBKevg3e9PBy+dXRt19kSbucbZvL2uqtdqwwpluL1jfxYE0wIDTFp1nTy/q6gNLsxXrg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-proposal-export-default-from@7.24.7': - resolution: {integrity: sha512-CcmFwUJ3tKhLjPdt4NP+SHMshebytF8ZTYOv5ZDpkzq2sin80Wb5vJrGt8fhPrORQCfoSa0LAxC/DW+GAC5+Hw==} + '@babel/plugin-proposal-export-default-from@7.27.1': + resolution: {integrity: sha512-hjlsMBl1aJc5lp8MoCDEZCiYzlgdRAShOjAfRw6X+GlpLpUPU7c3XNLsKFZbQk/1cRzBlJ7CXg3xJAJMrFa1Uw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1224,8 +1229,14 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-decorators@7.24.7': - resolution: {integrity: sha512-Ui4uLJJrRV1lb38zg1yYTmRKmiZLiftDEvZN2iq3kd9kUFU+PttmzTbAFC2ucRk/XJmtek6G23gPsuZbhrT8fQ==} + '@babel/plugin-syntax-class-static-block@7.14.5': + resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-decorators@7.27.1': + resolution: {integrity: sha512-YMq8Z87Lhl8EGkmb0MwYkt36QnxC+fzCgrl66ereamPlYToRpIk5nUjKUY3QKLWq8mwUB1BgbeXcTJhZOCDg5A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1235,8 +1246,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-export-default-from@7.24.7': - resolution: {integrity: sha512-bTPz4/635WQ9WhwsyPdxUJDVpsi/X9BMmy/8Rf/UAlOO4jSql4CxUCjWI5PiM+jG+c4LVPTScoTw80geFj9+Bw==} + '@babel/plugin-syntax-export-default-from@7.27.1': + resolution: {integrity: sha512-eBC/3KSekshx19+N40MzjWqJd7KTEdOoLesAfa4IDFI8eRz5a47i5Oszus6zG/cwIXN63YhgLOMSSNJx49sENg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1246,26 +1257,20 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-flow@7.24.7': - resolution: {integrity: sha512-9G8GYT/dxn/D1IIKOUBmGX0mnmj46mGH9NnZyJLwtCpgh5f7D2VbuKodb+2s9m1Yavh1s7ASQN8lf0eqrb1LTw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-flow@7.26.0': - resolution: {integrity: sha512-B+O2DnPc0iG+YXFqOxv2WNuNU97ToWjOomUQ78DouOENWUaM5sVrmet9mcomUGQFwpJd//gvUagXBSdzO1fRKg==} + '@babel/plugin-syntax-flow@7.27.1': + resolution: {integrity: sha512-p9OkPbZ5G7UT1MofwYFigGebnrzGJacoBSQM0/6bi/PUMVE+qlWDD/OalvQKbwgQzU6dl0xAv6r4X7Jme0RYxA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-import-assertions@7.26.0': - resolution: {integrity: sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==} + '@babel/plugin-syntax-import-assertions@7.27.1': + resolution: {integrity: sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-import-attributes@7.26.0': - resolution: {integrity: sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==} + '@babel/plugin-syntax-import-attributes@7.27.1': + resolution: {integrity: sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1280,14 +1285,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-jsx@7.24.7': - resolution: {integrity: sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-jsx@7.25.9': - resolution: {integrity: sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==} + '@babel/plugin-syntax-jsx@7.27.1': + resolution: {integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1322,20 +1321,20 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-top-level-await@7.14.5': - resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + '@babel/plugin-syntax-private-property-in-object@7.14.5': + resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-typescript@7.24.7': - resolution: {integrity: sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA==} + '@babel/plugin-syntax-top-level-await@7.14.5': + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-typescript@7.25.9': - resolution: {integrity: sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==} + '@babel/plugin-syntax-typescript@7.27.1': + resolution: {integrity: sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1346,380 +1345,368 @@ packages: peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-transform-arrow-functions@7.25.9': - resolution: {integrity: sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==} + '@babel/plugin-transform-arrow-functions@7.27.1': + resolution: {integrity: sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-async-generator-functions@7.25.9': - resolution: {integrity: sha512-RXV6QAzTBbhDMO9fWwOmwwTuYaiPbggWQ9INdZqAYeSHyG7FzQ+nOZaUUjNwKv9pV3aE4WFqFm1Hnbci5tBCAw==} + '@babel/plugin-transform-async-generator-functions@7.27.1': + resolution: {integrity: sha512-eST9RrwlpaoJBDHShc+DS2SG4ATTi2MYNb4OxYkf3n+7eb49LWpnS+HSpVfW4x927qQwgk8A2hGNVaajAEw0EA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-async-to-generator@7.25.9': - resolution: {integrity: sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==} + '@babel/plugin-transform-async-to-generator@7.27.1': + resolution: {integrity: sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-block-scoped-functions@7.25.9': - resolution: {integrity: sha512-toHc9fzab0ZfenFpsyYinOX0J/5dgJVA2fm64xPewu7CoYHWEivIWKxkK2rMi4r3yQqLnVmheMXRdG+k239CgA==} + '@babel/plugin-transform-block-scoped-functions@7.27.1': + resolution: {integrity: sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-block-scoping@7.25.9': - resolution: {integrity: sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg==} + '@babel/plugin-transform-block-scoping@7.27.5': + resolution: {integrity: sha512-JF6uE2s67f0y2RZcm2kpAUEbD50vH62TyWVebxwHAlbSdM49VqPz8t4a1uIjp4NIOIZ4xzLfjY5emt/RCyC7TQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-class-properties@7.25.9': - resolution: {integrity: sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==} + '@babel/plugin-transform-class-properties@7.27.1': + resolution: {integrity: sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-class-static-block@7.26.0': - resolution: {integrity: sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==} + '@babel/plugin-transform-class-static-block@7.27.1': + resolution: {integrity: sha512-s734HmYU78MVzZ++joYM+NkJusItbdRcbm+AGRgJCt3iA+yux0QpD9cBVdz3tKyrjVYWRl7j0mHSmv4lhV0aoA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.12.0 - '@babel/plugin-transform-classes@7.25.9': - resolution: {integrity: sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==} + '@babel/plugin-transform-classes@7.27.1': + resolution: {integrity: sha512-7iLhfFAubmpeJe/Wo2TVuDrykh/zlWXLzPNdL0Jqn/Xu8R3QQ8h9ff8FQoISZOsw74/HFqFI7NX63HN7QFIHKA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-computed-properties@7.25.9': - resolution: {integrity: sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==} + '@babel/plugin-transform-computed-properties@7.27.1': + resolution: {integrity: sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-destructuring@7.25.9': - resolution: {integrity: sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==} + '@babel/plugin-transform-destructuring@7.27.3': + resolution: {integrity: sha512-s4Jrok82JpiaIprtY2nHsYmrThKvvwgHwjgd7UMiYhZaN0asdXNLr0y+NjTfkA7SyQE5i2Fb7eawUOZmLvyqOA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-dotall-regex@7.25.9': - resolution: {integrity: sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==} + '@babel/plugin-transform-dotall-regex@7.27.1': + resolution: {integrity: sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-duplicate-keys@7.25.9': - resolution: {integrity: sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==} + '@babel/plugin-transform-duplicate-keys@7.27.1': + resolution: {integrity: sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.9': - resolution: {integrity: sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==} + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1': + resolution: {integrity: sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-transform-dynamic-import@7.25.9': - resolution: {integrity: sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-exponentiation-operator@7.26.3': - resolution: {integrity: sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ==} + '@babel/plugin-transform-dynamic-import@7.27.1': + resolution: {integrity: sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-export-namespace-from@7.25.9': - resolution: {integrity: sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==} + '@babel/plugin-transform-exponentiation-operator@7.27.1': + resolution: {integrity: sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-flow-strip-types@7.24.7': - resolution: {integrity: sha512-cjRKJ7FobOH2eakx7Ja+KpJRj8+y+/SiB3ooYm/n2UJfxu0oEaOoxOinitkJcPqv9KxS0kxTGPUaR7L2XcXDXA==} + '@babel/plugin-transform-export-namespace-from@7.27.1': + resolution: {integrity: sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-flow-strip-types@7.26.5': - resolution: {integrity: sha512-eGK26RsbIkYUns3Y8qKl362juDDYK+wEdPGHGrhzUl6CewZFo55VZ7hg+CyMFU4dd5QQakBN86nBMpRsFpRvbQ==} + '@babel/plugin-transform-flow-strip-types@7.27.1': + resolution: {integrity: sha512-G5eDKsu50udECw7DL2AcsysXiQyB7Nfg521t2OAJ4tbfTJ27doHLeF/vlI1NZGlLdbb/v+ibvtL1YBQqYOwJGg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-for-of@7.25.9': - resolution: {integrity: sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A==} + '@babel/plugin-transform-for-of@7.27.1': + resolution: {integrity: sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-function-name@7.25.9': - resolution: {integrity: sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==} + '@babel/plugin-transform-function-name@7.27.1': + resolution: {integrity: sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-json-strings@7.25.9': - resolution: {integrity: sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==} + '@babel/plugin-transform-json-strings@7.27.1': + resolution: {integrity: sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-literals@7.25.9': - resolution: {integrity: sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==} + '@babel/plugin-transform-literals@7.27.1': + resolution: {integrity: sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-logical-assignment-operators@7.25.9': - resolution: {integrity: sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==} + '@babel/plugin-transform-logical-assignment-operators@7.27.1': + resolution: {integrity: sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-member-expression-literals@7.25.9': - resolution: {integrity: sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==} + '@babel/plugin-transform-member-expression-literals@7.27.1': + resolution: {integrity: sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-amd@7.25.9': - resolution: {integrity: sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==} + '@babel/plugin-transform-modules-amd@7.27.1': + resolution: {integrity: sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-commonjs@7.26.3': - resolution: {integrity: sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==} + '@babel/plugin-transform-modules-commonjs@7.27.1': + resolution: {integrity: sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-systemjs@7.25.9': - resolution: {integrity: sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==} + '@babel/plugin-transform-modules-systemjs@7.27.1': + resolution: {integrity: sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-umd@7.25.9': - resolution: {integrity: sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==} + '@babel/plugin-transform-modules-umd@7.27.1': + resolution: {integrity: sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-named-capturing-groups-regex@7.25.9': - resolution: {integrity: sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==} + '@babel/plugin-transform-named-capturing-groups-regex@7.27.1': + resolution: {integrity: sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-transform-new-target@7.25.9': - resolution: {integrity: sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==} + '@babel/plugin-transform-new-target@7.27.1': + resolution: {integrity: sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-nullish-coalescing-operator@7.25.9': - resolution: {integrity: sha512-ENfftpLZw5EItALAD4WsY/KUWvhUlZndm5GC7G3evUsVeSJB6p0pBeLQUnRnBCBx7zV0RKQjR9kCuwrsIrjWog==} + '@babel/plugin-transform-nullish-coalescing-operator@7.27.1': + resolution: {integrity: sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-numeric-separator@7.25.9': - resolution: {integrity: sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==} + '@babel/plugin-transform-numeric-separator@7.27.1': + resolution: {integrity: sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-object-rest-spread@7.25.9': - resolution: {integrity: sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==} + '@babel/plugin-transform-object-rest-spread@7.27.3': + resolution: {integrity: sha512-7ZZtznF9g4l2JCImCo5LNKFHB5eXnN39lLtLY5Tg+VkR0jwOt7TBciMckuiQIOIW7L5tkQOCh3bVGYeXgMx52Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-object-super@7.25.9': - resolution: {integrity: sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==} + '@babel/plugin-transform-object-super@7.27.1': + resolution: {integrity: sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-optional-catch-binding@7.25.9': - resolution: {integrity: sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==} + '@babel/plugin-transform-optional-catch-binding@7.27.1': + resolution: {integrity: sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-optional-chaining@7.25.9': - resolution: {integrity: sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==} + '@babel/plugin-transform-optional-chaining@7.27.1': + resolution: {integrity: sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-parameters@7.25.9': - resolution: {integrity: sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==} + '@babel/plugin-transform-parameters@7.27.1': + resolution: {integrity: sha512-018KRk76HWKeZ5l4oTj2zPpSh+NbGdt0st5S6x0pga6HgrjBOJb24mMDHorFopOOd6YHkLgOZ+zaCjZGPO4aKg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-private-methods@7.25.9': - resolution: {integrity: sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==} + '@babel/plugin-transform-private-methods@7.27.1': + resolution: {integrity: sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-private-property-in-object@7.25.9': - resolution: {integrity: sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==} + '@babel/plugin-transform-private-property-in-object@7.27.1': + resolution: {integrity: sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-property-literals@7.25.9': - resolution: {integrity: sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==} + '@babel/plugin-transform-property-literals@7.27.1': + resolution: {integrity: sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-display-name@7.24.7': - resolution: {integrity: sha512-H/Snz9PFxKsS1JLI4dJLtnJgCJRoo0AUm3chP6NYr+9En1JMKloheEiLIhlp5MDVznWo+H3AAC1Mc8lmUEpsgg==} + '@babel/plugin-transform-react-display-name@7.27.1': + resolution: {integrity: sha512-p9+Vl3yuHPmkirRrg021XiP+EETmPMQTLr6Ayjj85RLNEbb3Eya/4VI0vAdzQG9SEAl2Lnt7fy5lZyMzjYoZQQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx-development@7.24.7': - resolution: {integrity: sha512-QG9EnzoGn+Qar7rxuW+ZOsbWOt56FvvI93xInqsZDC5fsekx1AlIO4KIJ5M+D0p0SqSH156EpmZyXq630B8OlQ==} + '@babel/plugin-transform-react-jsx-development@7.27.1': + resolution: {integrity: sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx-self@7.24.7': - resolution: {integrity: sha512-fOPQYbGSgH0HUp4UJO4sMBFjY6DuWq+2i8rixyUMb3CdGixs/gccURvYOAhajBdKDoGajFr3mUq5rH3phtkGzw==} + '@babel/plugin-transform-react-jsx-self@7.27.1': + resolution: {integrity: sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx-source@7.24.7': - resolution: {integrity: sha512-J2z+MWzZHVOemyLweMqngXrgGC42jQ//R0KdxqkIz/OrbVIIlhFI3WigZ5fO+nwFvBlncr4MGapd8vTyc7RPNQ==} + '@babel/plugin-transform-react-jsx-source@7.27.1': + resolution: {integrity: sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx@7.25.9': - resolution: {integrity: sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw==} + '@babel/plugin-transform-react-jsx@7.27.1': + resolution: {integrity: sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-pure-annotations@7.24.7': - resolution: {integrity: sha512-PLgBVk3fzbmEjBJ/u8kFzOqS9tUeDjiaWud/rRym/yjCo/M9cASPlnrd2ZmmZpQT40fOOrvR8jh+n8jikrOhNA==} + '@babel/plugin-transform-react-pure-annotations@7.27.1': + resolution: {integrity: sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-regenerator@7.25.9': - resolution: {integrity: sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg==} + '@babel/plugin-transform-regenerator@7.27.5': + resolution: {integrity: sha512-uhB8yHerfe3MWnuLAhEbeQ4afVoqv8BQsPqrTv7e/jZ9y00kJL6l9a/f4OWaKxotmjzewfEyXE1vgDJenkQ2/Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-regexp-modifiers@7.26.0': - resolution: {integrity: sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==} + '@babel/plugin-transform-regexp-modifiers@7.27.1': + resolution: {integrity: sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-transform-reserved-words@7.25.9': - resolution: {integrity: sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-runtime@7.24.7': - resolution: {integrity: sha512-YqXjrk4C+a1kZjewqt+Mmu2UuV1s07y8kqcUf4qYLnoqemhR4gRQikhdAhSVJioMjVTu6Mo6pAbaypEA3jY6fw==} + '@babel/plugin-transform-reserved-words@7.27.1': + resolution: {integrity: sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-shorthand-properties@7.25.9': - resolution: {integrity: sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==} + '@babel/plugin-transform-runtime@7.27.4': + resolution: {integrity: sha512-D68nR5zxU64EUzV8i7T3R5XP0Xhrou/amNnddsRQssx6GrTLdZl1rLxyjtVZBd+v/NVX4AbTPOB5aU8thAZV1A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-spread@7.25.9': - resolution: {integrity: sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==} + '@babel/plugin-transform-shorthand-properties@7.27.1': + resolution: {integrity: sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-sticky-regex@7.25.9': - resolution: {integrity: sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==} + '@babel/plugin-transform-spread@7.27.1': + resolution: {integrity: sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-template-literals@7.25.9': - resolution: {integrity: sha512-o97AE4syN71M/lxrCtQByzphAdlYluKPDBzDVzMmfCobUjjhAryZV0AIpRPrxN0eAkxXO6ZLEScmt+PNhj2OTw==} + '@babel/plugin-transform-sticky-regex@7.27.1': + resolution: {integrity: sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-typeof-symbol@7.25.9': - resolution: {integrity: sha512-v61XqUMiueJROUv66BVIOi0Fv/CUuZuZMl5NkRoCVxLAnMexZ0A3kMe7vvZ0nulxMuMp0Mk6S5hNh48yki08ZA==} + '@babel/plugin-transform-template-literals@7.27.1': + resolution: {integrity: sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-typescript@7.24.7': - resolution: {integrity: sha512-iLD3UNkgx2n/HrjBesVbYX6j0yqn/sJktvbtKKgcaLIQ4bTTQ8obAypc1VpyHPD2y4Phh9zHOaAt8e/L14wCpw==} + '@babel/plugin-transform-typeof-symbol@7.27.1': + resolution: {integrity: sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-typescript@7.26.8': - resolution: {integrity: sha512-bME5J9AC8ChwA7aEPJ6zym3w7aObZULHhbNLU0bKUhKsAkylkzUdq+0kdymh9rzi8nlNFl2bmldFBCKNJBUpuw==} + '@babel/plugin-transform-typescript@7.27.1': + resolution: {integrity: sha512-Q5sT5+O4QUebHdbwKedFBEwRLb02zJ7r4A5Gg2hUoLuU3FjdMcyqcywqUrLCaDsFCxzokf7u9kuy7qz51YUuAg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-escapes@7.25.9': - resolution: {integrity: sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==} + '@babel/plugin-transform-unicode-escapes@7.27.1': + resolution: {integrity: sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-property-regex@7.25.9': - resolution: {integrity: sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==} + '@babel/plugin-transform-unicode-property-regex@7.27.1': + resolution: {integrity: sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-regex@7.25.9': - resolution: {integrity: sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==} + '@babel/plugin-transform-unicode-regex@7.27.1': + resolution: {integrity: sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-sets-regex@7.25.9': - resolution: {integrity: sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==} + '@babel/plugin-transform-unicode-sets-regex@7.27.1': + resolution: {integrity: sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/preset-env@7.26.0': - resolution: {integrity: sha512-H84Fxq0CQJNdPFT2DrfnylZ3cf5K43rGfWK4LJGPpjKHiZlk0/RzwEus3PDDZZg+/Er7lCA03MVacueUuXdzfw==} + '@babel/preset-env@7.27.2': + resolution: {integrity: sha512-Ma4zSuYSlGNRlCLO+EAzLnCmJK2vdstgv+n7aUP+/IKZrOfWHOJVdSJtuub8RzHTj3ahD37k5OKJWvzf16TQyQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/preset-flow@7.24.7': - resolution: {integrity: sha512-NL3Lo0NorCU607zU3NwRyJbpaB6E3t0xtd3LfAQKDfkeX4/ggcDXvkmkW42QWT5owUeW/jAe4hn+2qvkV1IbfQ==} + '@babel/preset-flow@7.27.1': + resolution: {integrity: sha512-ez3a2it5Fn6P54W8QkbfIyyIbxlXvcxyWHHvno1Wg0Ej5eiJY5hBb8ExttoIOJJk7V2dZE6prP7iby5q2aQ0Lg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1729,42 +1716,38 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 - '@babel/preset-react@7.24.7': - resolution: {integrity: sha512-AAH4lEkpmzFWrGVlHaxJB7RLH21uPQ9+He+eFLWHmF9IuFQVugz8eAsamaW0DXRrTfco5zj1wWtpdcXJUOfsag==} + '@babel/preset-react@7.27.1': + resolution: {integrity: sha512-oJHWh2gLhU9dW9HHr42q0cI0/iHHXTLGe39qvpAZZzagHy0MzYLCnCVV0symeRvzmjHyVU7mw2K06E6u/JwbhA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/preset-typescript@7.24.7': - resolution: {integrity: sha512-SyXRe3OdWwIwalxDg5UtJnJQO+YPcTfwiIY2B0Xlddh9o7jpWLvv8X1RthIeDOxQ+O1ML5BLPCONToObyVQVuQ==} + '@babel/preset-typescript@7.27.1': + resolution: {integrity: sha512-l7WfQfX0WK4M0v2RudjuQK4u99BS6yLHYEmdtVPP7lKV013zr9DygFuWNlnbvQ9LR+LS0Egz/XAvGx5U9MX0fQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/register@7.24.6': - resolution: {integrity: sha512-WSuFCc2wCqMeXkz/i3yfAAsxwWflEgbVkZzivgAmXl/MxrXeoYFZOOPllbC8R8WTF7u61wSRQtDVZ1879cdu6w==} + '@babel/register@7.27.1': + resolution: {integrity: sha512-K13lQpoV54LATKkzBpBAEu1GGSIRzxR9f4IN4V8DCDgiUMo2UDGagEZr3lPeVNJPLkWUi5JE4hCHKneVTwQlYQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/runtime@7.24.7': - resolution: {integrity: sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw==} - engines: {node: '>=6.9.0'} - - '@babel/runtime@7.26.10': - resolution: {integrity: sha512-2WJMeRQPHKSPemqk/awGrAiuFfzBmOIPXKizAsVhWH9YJqLZ0H+HS4c8loHGgW6utJ3E/ejXQUsiGaQy2NZ9Fw==} + '@babel/runtime@7.27.6': + resolution: {integrity: sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==} engines: {node: '>=6.9.0'} - '@babel/template@7.25.9': - resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==} + '@babel/template@7.27.2': + resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.26.4': - resolution: {integrity: sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==} + '@babel/traverse@7.27.4': + resolution: {integrity: sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA==} engines: {node: '>=6.9.0'} - '@babel/types@7.26.3': - resolution: {integrity: sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==} + '@babel/types@7.27.6': + resolution: {integrity: sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==} engines: {node: '>=6.9.0'} '@bcoe/v8-coverage@0.2.3': @@ -1823,78 +1806,79 @@ packages: cpu: [x64] os: [win32] - '@bufbuild/protobuf@2.2.3': - resolution: {integrity: sha512-tFQoXHJdkEOSwj5tRIZSPNUuXK3RaR7T1nUrPgbYX1pUbvqqaaZAsfo+NXBPsz5rZMSKVFrgK1WL8Q/MSLvprg==} - - '@bufbuild/protobuf@2.2.5': - resolution: {integrity: sha512-/g5EzJifw5GF8aren8wZ/G5oMuPoGeS6MQD3ca8ddcvdXR5UELUfdTZITCGNhNXynY/AYl3Z4plmxdj/tRl/hQ==} + '@bufbuild/protobuf@2.5.2': + resolution: {integrity: sha512-foZ7qr0IsUBjzWIq+SuBLfdQCpJ1j8cTuNNT4owngTHoN5KsJb8L9t65fzz7SCeSWzescoOil/0ldqiL041ABg==} - '@changesets/apply-release-plan@7.0.3': - resolution: {integrity: sha512-klL6LCdmfbEe9oyfLxnidIf/stFXmrbFO/3gT5LU5pcyoZytzJe4gWpTBx3BPmyNPl16dZ1xrkcW7b98e3tYkA==} + '@changesets/apply-release-plan@7.0.12': + resolution: {integrity: sha512-EaET7As5CeuhTzvXTQCRZeBUcisoYPDDcXvgTE/2jmmypKp0RC7LxKj/yzqeh/1qFTZI7oDGFcL1PHRuQuketQ==} - '@changesets/assemble-release-plan@6.0.2': - resolution: {integrity: sha512-n9/Tdq+ze+iUtjmq0mZO3pEhJTKkku9hUxtUadW30jlN7kONqJG3O6ALeXrmc6gsi/nvoCuKjqEJ68Hk8RbMTQ==} + '@changesets/assemble-release-plan@6.0.8': + resolution: {integrity: sha512-y8+8LvZCkKJdbUlpXFuqcavpzJR80PN0OIfn8HZdwK7Sh6MgLXm4hKY5vu6/NDoKp8lAlM4ERZCqRMLxP4m+MQ==} - '@changesets/changelog-git@0.2.0': - resolution: {integrity: sha512-bHOx97iFI4OClIT35Lok3sJAwM31VbUM++gnMBV16fdbtBhgYu4dxsphBF/0AZZsyAHMrnM0yFcj5gZM1py6uQ==} + '@changesets/changelog-git@0.2.1': + resolution: {integrity: sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q==} - '@changesets/cli@2.27.5': - resolution: {integrity: sha512-UVppOvzCjjylBenFcwcZNG5IaZ8jsIaEVraV/pbXgukYNb0Oqa0d8UWb0LkYzA1Bf1HmUrOfccFcRLheRuA7pA==} + '@changesets/cli@2.29.4': + resolution: {integrity: sha512-VW30x9oiFp/un/80+5jLeWgEU6Btj8IqOgI+X/zAYu4usVOWXjPIK5jSSlt5jsCU7/6Z7AxEkarxBxGUqkAmNg==} hasBin: true - '@changesets/config@3.0.1': - resolution: {integrity: sha512-nCr8pOemUjvGJ8aUu8TYVjqnUL+++bFOQHBVmtNbLvKzIDkN/uiP/Z4RKmr7NNaiujIURHySDEGFPftR4GbTUA==} + '@changesets/config@3.1.1': + resolution: {integrity: sha512-bd+3Ap2TKXxljCggI0mKPfzCQKeV/TU4yO2h2C6vAihIo8tzseAn2e7klSuiyYYXvgu53zMN1OeYMIQkaQoWnA==} '@changesets/errors@0.2.0': resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==} - '@changesets/get-dependents-graph@2.1.0': - resolution: {integrity: sha512-QOt6pQq9RVXKGHPVvyKimJDYJumx7p4DO5MO9AhRJYgAPgv0emhNqAqqysSVKHBm4sxKlGN4S1zXOIb5yCFuhQ==} + '@changesets/get-dependents-graph@2.1.3': + resolution: {integrity: sha512-gphr+v0mv2I3Oxt19VdWRRUxq3sseyUpX9DaHpTUmLj92Y10AGy+XOtV+kbM6L/fDcpx7/ISDFK6T8A/P3lOdQ==} - '@changesets/get-release-plan@4.0.2': - resolution: {integrity: sha512-rOalz7nMuMV2vyeP7KBeAhqEB7FM2GFPO5RQSoOoUKKH9L6wW3QyPA2K+/rG9kBrWl2HckPVES73/AuwPvbH3w==} + '@changesets/get-release-plan@4.0.12': + resolution: {integrity: sha512-KukdEgaafnyGryUwpHG2kZ7xJquOmWWWk5mmoeQaSvZTWH1DC5D/Sw6ClgGFYtQnOMSQhgoEbDxAbpIIayKH1g==} '@changesets/get-version-range-type@0.4.0': resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==} - '@changesets/git@3.0.0': - resolution: {integrity: sha512-vvhnZDHe2eiBNRFHEgMiGd2CT+164dfYyrJDhwwxTVD/OW0FUD6G7+4DIx1dNwkwjHyzisxGAU96q0sVNBns0w==} + '@changesets/git@3.0.4': + resolution: {integrity: sha512-BXANzRFkX+XcC1q/d27NKvlJ1yf7PSAgi8JG6dt8EfbHFHi4neau7mufcSca5zRhwOL8j9s6EqsxmT+s+/E6Sw==} - '@changesets/logger@0.1.0': - resolution: {integrity: sha512-pBrJm4CQm9VqFVwWnSqKEfsS2ESnwqwH+xR7jETxIErZcfd1u2zBSqrHbRHR7xjhSgep9x2PSKFKY//FAshA3g==} + '@changesets/logger@0.1.1': + resolution: {integrity: sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==} - '@changesets/parse@0.4.0': - resolution: {integrity: sha512-TS/9KG2CdGXS27S+QxbZXgr8uPsP4yNJYb4BC2/NeFUj80Rni3TeD2qwWmabymxmrLo7JEsytXH1FbpKTbvivw==} + '@changesets/parse@0.4.1': + resolution: {integrity: sha512-iwksMs5Bf/wUItfcg+OXrEpravm5rEd9Bf4oyIPL4kVTmJQ7PNDSd6MDYkpSJR1pn7tz/k8Zf2DhTCqX08Ou+Q==} - '@changesets/pre@2.0.0': - resolution: {integrity: sha512-HLTNYX/A4jZxc+Sq8D1AMBsv+1qD6rmmJtjsCJa/9MSRybdxh0mjbTvE6JYZQ/ZiQ0mMlDOlGPXTm9KLTU3jyw==} + '@changesets/pre@2.0.2': + resolution: {integrity: sha512-HaL/gEyFVvkf9KFg6484wR9s0qjAXlZ8qWPDkTyKF6+zqjBe/I2mygg3MbpZ++hdi0ToqNUF8cjj7fBy0dg8Ug==} - '@changesets/read@0.6.0': - resolution: {integrity: sha512-ZypqX8+/im1Fm98K4YcZtmLKgjs1kDQ5zHpc2U1qdtNBmZZfo/IBiG162RoP0CUF05tvp2y4IspH11PLnPxuuw==} + '@changesets/read@0.6.5': + resolution: {integrity: sha512-UPzNGhsSjHD3Veb0xO/MwvasGe8eMyNrR/sT9gR8Q3DhOQZirgKhhXv/8hVsI0QpPjR004Z9iFxoJU6in3uGMg==} - '@changesets/should-skip-package@0.1.0': - resolution: {integrity: sha512-FxG6Mhjw7yFStlSM7Z0Gmg3RiyQ98d/9VpQAZ3Fzr59dCOM9G6ZdYbjiSAt0XtFr9JR5U2tBaJWPjrkGGc618g==} + '@changesets/should-skip-package@0.1.2': + resolution: {integrity: sha512-qAK/WrqWLNCP22UDdBTMPH5f41elVDlsNyat180A33dWxuUDyNpg6fPi/FyTZwRriVjg0L8gnjJn2F9XAoF0qw==} '@changesets/types@4.1.0': resolution: {integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==} - '@changesets/types@6.0.0': - resolution: {integrity: sha512-b1UkfNulgKoWfqyHtzKS5fOZYSJO+77adgL7DLRDr+/7jhChN+QcHnbjiQVOz/U+Ts3PGNySq7diAItzDgugfQ==} + '@changesets/types@6.1.0': + resolution: {integrity: sha512-rKQcJ+o1nKNgeoYRHKOS07tAMNd3YSN0uHaJOZYjBAgxfV7TUE7JE+z4BzZdQwb5hKaYbayKN5KrYV7ODb2rAA==} - '@changesets/write@0.3.1': - resolution: {integrity: sha512-SyGtMXzH3qFqlHKcvFY2eX+6b0NGiFcNav8AFsYwy5l8hejOeoeTDemu5Yjmke2V5jpzY+pBvM0vCCQ3gdZpfw==} + '@changesets/write@0.4.0': + resolution: {integrity: sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==} - '@cheqd/sdk@5.2.1': - resolution: {integrity: sha512-R6lpEEF0fTpDr4yebT/WUIs7AUgvVbR/V3RMGudcq2nVRv248fD2zpcJroKOpUKsoTUCa9Fw5PkWz01VvdmUEw==} + '@cheqd/sdk@5.3.1': + resolution: {integrity: sha512-4iwB8Ct6A2jlZw3qx7cPi34JcRsGnb+Mw3dzsAJY+83Fv2aC7ndO3YbUwouPK02scObq/fK5jbV6Dh35M6iMAg==} engines: {node: '>=20.0.0'} '@cheqd/ts-proto@2.4.1': resolution: {integrity: sha512-tT9MvXjk+GmJXWjFKIMwhXWuStjdhECSBSrx8uyt1cJKVBtFpRBrFLEomA7XIclmfwL6z74YmhM7lEtf5Bn8vg==} engines: {node: '>=20'} - '@cheqd/ts-proto@4.0.2': - resolution: {integrity: sha512-8wFc+PDRwd5XO/ep3JyYBoav6BuOFba2a5ifFmbmBQO35sFaptsGEH7y9mh46V6+NFtI+F914avRrtWCFGf1Jw==} - engines: {node: '>=20.0.0'} + '@cheqd/ts-proto@2.5.0': + resolution: {integrity: sha512-3KqyvcruFxvkz+p6LnSCyUnqBJ2bJeOnIDkaYoAMcmGcSNKti3VECOKGdjjEO3rG/0/gAR9bhEHu9j1mUKSFqA==} + engines: {node: '>=20'} + + '@cheqd/ts-proto@4.1.1': + resolution: {integrity: sha512-iaz1sSlyTVT6u82vbIDuTk3ytiN31CQEc62xWfKeH/XaJE8RZQXYsjbtk5sIoXKJ63pb65XoHLY7JVOsqmRhFA==} + engines: {node: '>=22.0.0'} '@confio/ics23@0.6.8': resolution: {integrity: sha512-wB6uo+3A50m0sW/EWcU64xpV/8wShZ6bMTa7pF8eYsTrSkQA7oLUIJcs/wb8g4y2Oyq701BaGiO6n/ak5WXO1w==} @@ -1973,6 +1957,10 @@ packages: resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} + '@cto.af/wtf8@0.0.2': + resolution: {integrity: sha512-ATm4UQiKrdm5GnU6BvIwUDN+LDEtt23zuzKFpnfDT59ULAd0aMYm/nSFzbSO02garLcXumRC13PzNfa7BsfvSg==} + engines: {node: '>=20'} + '@digitalbazaar/bitstring@3.1.0': resolution: {integrity: sha512-Cii+Sl++qaexOvv3vchhgZFfSmtHPNIPzGegaq4ffPnflVXFu+V2qrJ17aL2+gfLxrlC/zazZFuAltyKTPq7eg==} engines: {node: '>=16'} @@ -2050,146 +2038,152 @@ packages: resolution: {integrity: sha512-TZgLoi00Jc9uv3b6jStH+G8+bCqpHIqFw9DYODz+fVjNh197ksvcYqSndUDHa2oi0HCcK+soI8j4ba3Sa4Pl4w==} engines: {node: '>=12'} - '@esbuild/aix-ppc64@0.23.1': - resolution: {integrity: sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==} + '@esbuild/aix-ppc64@0.25.5': + resolution: {integrity: sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.23.1': - resolution: {integrity: sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==} + '@esbuild/android-arm64@0.25.5': + resolution: {integrity: sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.23.1': - resolution: {integrity: sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==} + '@esbuild/android-arm@0.25.5': + resolution: {integrity: sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.23.1': - resolution: {integrity: sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==} + '@esbuild/android-x64@0.25.5': + resolution: {integrity: sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.23.1': - resolution: {integrity: sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==} + '@esbuild/darwin-arm64@0.25.5': + resolution: {integrity: sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.23.1': - resolution: {integrity: sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==} + '@esbuild/darwin-x64@0.25.5': + resolution: {integrity: sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.23.1': - resolution: {integrity: sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==} + '@esbuild/freebsd-arm64@0.25.5': + resolution: {integrity: sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.23.1': - resolution: {integrity: sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==} + '@esbuild/freebsd-x64@0.25.5': + resolution: {integrity: sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.23.1': - resolution: {integrity: sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==} + '@esbuild/linux-arm64@0.25.5': + resolution: {integrity: sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.23.1': - resolution: {integrity: sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==} + '@esbuild/linux-arm@0.25.5': + resolution: {integrity: sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.23.1': - resolution: {integrity: sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==} + '@esbuild/linux-ia32@0.25.5': + resolution: {integrity: sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.23.1': - resolution: {integrity: sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==} + '@esbuild/linux-loong64@0.25.5': + resolution: {integrity: sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.23.1': - resolution: {integrity: sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==} + '@esbuild/linux-mips64el@0.25.5': + resolution: {integrity: sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.23.1': - resolution: {integrity: sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==} + '@esbuild/linux-ppc64@0.25.5': + resolution: {integrity: sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.23.1': - resolution: {integrity: sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==} + '@esbuild/linux-riscv64@0.25.5': + resolution: {integrity: sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.23.1': - resolution: {integrity: sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==} + '@esbuild/linux-s390x@0.25.5': + resolution: {integrity: sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.23.1': - resolution: {integrity: sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==} + '@esbuild/linux-x64@0.25.5': + resolution: {integrity: sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-x64@0.23.1': - resolution: {integrity: sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==} + '@esbuild/netbsd-arm64@0.25.5': + resolution: {integrity: sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.5': + resolution: {integrity: sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.23.1': - resolution: {integrity: sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==} + '@esbuild/openbsd-arm64@0.25.5': + resolution: {integrity: sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.23.1': - resolution: {integrity: sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==} + '@esbuild/openbsd-x64@0.25.5': + resolution: {integrity: sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/sunos-x64@0.23.1': - resolution: {integrity: sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==} + '@esbuild/sunos-x64@0.25.5': + resolution: {integrity: sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.23.1': - resolution: {integrity: sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==} + '@esbuild/win32-arm64@0.25.5': + resolution: {integrity: sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.23.1': - resolution: {integrity: sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==} + '@esbuild/win32-ia32@0.25.5': + resolution: {integrity: sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.23.1': - resolution: {integrity: sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==} + '@esbuild/win32-x64@0.25.5': + resolution: {integrity: sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==} engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -2248,9 +2242,9 @@ packages: '@ethersproject/web@5.8.0': resolution: {integrity: sha512-j7+Ksi/9KfGviws6Qtf9Q7KCqRhpwrYKQPs+JBA/rKVFF/yaWLHJEH3zfVP2plVu+eys0d2DlFmhoQJayFewcw==} - '@expo/bunyan@4.0.0': - resolution: {integrity: sha512-Ydf4LidRB/EBI+YrB+cVLqIseiRfjUI/AeHBgjGMtq3GroraDu81OV7zqophRgupngoL3iS3JUMDMnxO7g39qA==} - engines: {'0': node >=0.10.0} + '@expo/bunyan@4.0.1': + resolution: {integrity: sha512-+Lla7nYSiHZirgK+U/uYzsLv/X+HaJienbD5AKX1UQZHYfWaP+9uuQluRB4GrEVWF0GZ7vEVp/jzaOT9k/SQlg==} + engines: {node: '>=0.10.0'} '@expo/cli@0.18.29': resolution: {integrity: sha512-X810C48Ss+67RdZU39YEO1khNYo1RmjouRV+vVe0QhMoTe8R6OA3t+XYEdwaNbJ5p/DJN7szfHfNmX2glpC7xg==} @@ -2262,14 +2256,14 @@ packages: '@expo/config-plugins@8.0.8': resolution: {integrity: sha512-Fvu6IO13EUw0R9WeqxUO37FkM62YJBNcZb9DyJAOgMz7Ez/vaKQGEjKt9cwT+Q6uirtCATMgaq6VWAW7YW8xXw==} - '@expo/config-types@51.0.1': - resolution: {integrity: sha512-5JuzUFobFImrUgnq93LeucP44ZMxq8WMXmCtIUf3ZC3mJSwjvvHJBMO2fS/sIlmgvvQk9eq4VnX06/7tgDFMSg==} + '@expo/config-types@51.0.3': + resolution: {integrity: sha512-hMfuq++b8VySb+m9uNNrlpbvGxYc8OcFCUX9yTmi9tlx6A4k8SDabWFBgmnr4ao3wEArvWrtUQIfQCVtPRdpKA==} '@expo/config@9.0.3': resolution: {integrity: sha512-eOTNM8eOC8gZNHgenySRlc/lwmYY1NOgvjwA8LHuvPT7/eUwD93zrxu3lPD1Cc/P6C/2BcVdfH4hf0tLmDxnsg==} - '@expo/devcert@1.1.2': - resolution: {integrity: sha512-FyWghLu7rUaZEZSTLt/XNRukm0c9GFfwP0iFaswoDWpV6alvVg+zRAfCLdIVQEz1SVcQ3zo1hMZFDrnKGvkCuQ==} + '@expo/devcert@1.2.0': + resolution: {integrity: sha512-Uilcv3xGELD5t/b0eM4cxBFEKQRIivB3v7i+VhWLV/gL98aw810unLKKJbGAxAIhY6Ipyz8ChWibFsKFXYwstA==} '@expo/env@0.3.0': resolution: {integrity: sha512-OtB9XVHWaXidLbHvrVDeeXa09yvTl3+IQN884sO6PhIi2/StXfgSH/9zC7IvzrDB8kW3EBJ1PPLuCUJ2hxAT7Q==} @@ -2280,15 +2274,18 @@ packages: '@expo/json-file@8.3.3': resolution: {integrity: sha512-eZ5dld9AD0PrVRiIWpRkm5aIoWBw3kAyd8VkuWEy92sEthBKDDDHAnK2a0dw0Eil6j7rK7lS/Qaq/Zzngv2h5A==} + '@expo/json-file@9.1.4': + resolution: {integrity: sha512-7Bv86X27fPERGhw8aJEZvRcH9sk+9BenDnEmrI3ZpywKodYSBgc8lX9Y32faNVQ/p0YbDK9zdJ0BfAKNAOyi0A==} + '@expo/metro-config@0.18.11': resolution: {integrity: sha512-/uOq55VbSf9yMbUO1BudkUM2SsGW1c5hr9BnhIqYqcsFv0Jp5D3DtJ4rljDKaUeNLbwr6m7pqIrkSMq5NrYf4Q==} - '@expo/osascript@2.1.3': - resolution: {integrity: sha512-aOEkhPzDsaAfolSswObGiYW0Pf0ROfR9J2NBRLQACdQ6uJlyAMiPF45DVEVknAU9juKh0y8ZyvC9LXqLEJYohA==} + '@expo/osascript@2.2.4': + resolution: {integrity: sha512-Q+Oyj+1pdRiHHpev9YjqfMZzByFH8UhKvSszxa0acTveijjDhQgWrq4e9T/cchBHi0GWZpGczWyiyJkk1wM1dg==} engines: {node: '>=12'} - '@expo/package-manager@1.5.2': - resolution: {integrity: sha512-IuA9XtGBilce0q8cyxtWINqbzMB1Fia0Yrug/O53HNuRSwQguV/iqjV68bsa4z8mYerePhcFgtvISWLAlNEbUA==} + '@expo/package-manager@1.8.4': + resolution: {integrity: sha512-8H8tLga/NS3iS7QaX/NneRPqbObnHvVCfMCo0ShudreOFmvmgqhYjRlkZTRstSyFqefai8ONaT4VmnLHneRYYg==} '@expo/plist@0.1.3': resolution: {integrity: sha512-GW/7hVlAylYg1tUrEASclw1MMk9FP4ZwyFAY/SUTJIhPDQHtfOlXREyWV3hhrHdX/K+pS73GNgdfT6E/e+kBbg==} @@ -2309,11 +2306,18 @@ packages: resolution: {integrity: sha512-QdWi16+CHB9JYP7gma19OVVg0BFkvU8zNj9GjWorYI8Iv8FUxjOCcYRuAmX4s/h91e4e7BPsskc8cSrZYho9Ew==} engines: {node: '>=12'} - '@expo/vector-icons@14.0.2': - resolution: {integrity: sha512-70LpmXQu4xa8cMxjp1fydgRPsalefnHaXLzIwaHMEzcZhnyjw2acZz8azRrZOslPVAWlxItOa2Dd7WtD/kI+CA==} + '@expo/sudo-prompt@9.3.2': + resolution: {integrity: sha512-HHQigo3rQWKMDzYDLkubN5WQOYXJJE2eNqIQC2axC2iO3mHdwnIR7FgZVvHWtBwAdzBgAP0ECp8KqS8TiMKvgw==} + + '@expo/vector-icons@14.1.0': + resolution: {integrity: sha512-7T09UE9h8QDTsUeMGymB4i+iqvtEeaO5VvUjryFB4tugDTG/bkzViWA74hm5pfjjDEhYMXWaX112mcvhccmIwQ==} + peerDependencies: + expo-font: '*' + react: '*' + react-native: '*' - '@expo/xcpretty@4.3.1': - resolution: {integrity: sha512-sqXgo1SCv+j4VtYEwl/bukuOIBrVgx6euIoCat3Iyx5oeoXwEA2USCoeL0IPubflMxncA2INkqJ/Wr3NGrSgzw==} + '@expo/xcpretty@4.3.2': + resolution: {integrity: sha512-ReZxZ8pdnoI3tP/dNnJdnmAk7uLT4FjsKDGW7YeDdvdOMz2XCQSmSCM9IWlrXuWtMF9zeSB6WJtEhCQ41gQOfw==} hasBin: true '@graphql-typed-document-node/core@3.2.0': @@ -2339,8 +2343,8 @@ packages: '@hapi/topo@5.1.0': resolution: {integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==} - '@hashgraph/cryptography@1.7.4': - resolution: {integrity: sha512-aYPfukqLCOoEzmilTrOSDWoJjZnzfcc84tKqrBqFbiduZLIoT+TY4Y3AA1Vdsun9dlWmRnOx8L4qIzPVlKPQhw==} + '@hashgraph/cryptography@1.8.0': + resolution: {integrity: sha512-tkBbGd8zU2dNCwlxCX47cS+VhRosh8mEbFfjvjzjcuW2KxdVsdV6GshyVtXeFxHMijo5kAcxd2CoubhCreNdaQ==} engines: {node: '>=12.0.0'} peerDependencies: expo-crypto: '*' @@ -2348,27 +2352,33 @@ packages: expo-crypto: optional: true - '@hashgraph/proto@2.18.5': - resolution: {integrity: sha512-LifEGGhvkqF49PYVP0xkcnCh8fP43q/+JkGPdZkwKglw1wFAJkPHZtQmGZSjmDpl2gbJiRyzvzJ1Q9MJ1VBA4Q==} + '@hashgraph/proto@2.19.0': + resolution: {integrity: sha512-ghlkyPb8JJx9ACGVna84vOtMqQkisBZ+EGeQe+FT+ci7qlhdf/ecRGvMw/uanSE5yviOFBqJeH0c2SzVIqpydQ==} engines: {node: '>=10.0.0'} - '@hashgraph/sdk@2.65.1': - resolution: {integrity: sha512-x/BhO+b6lRs8LOSjG4AJD4ed2N7Po56ZDQiye5FmKFuGQ8Q3fHFngMh8qsiCt6nwHBLpcIl1ZBTNNWcxQQKBaA==} + '@hashgraph/sdk@2.66.0': + resolution: {integrity: sha512-A5dCSxb7pzYhgd7zhkOJ7lJRwg29MEcfkq0B/Nqb5j2Swdee6v+DCse7xkB978dmHnfrG6UM64LZX0qMWw8Uiw==} engines: {node: '>=18.0.0'} peerDependencies: bn.js: ^5.2.1 '@hiero-did-sdk-js/anoncreds@0.0.1': - resolution: {integrity: sha1-EtllnyN8MSx9lhkokaM7l7rIris=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk-js/anoncreds/-/@hiero-did-sdk-js/anoncreds-0.0.1.tgz} + resolution: {integrity: sha1-utLHS/EFt+g6Dr6/ji293NG/rxI=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk-js/anoncreds/-/@hiero-did-sdk-js/anoncreds-0.0.1.tgz} + + '@hiero-did-sdk-js/client@0.0.1': + resolution: {integrity: sha1-/oGgr/tiFidqMYdCFaFGHaIa8s0=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk-js/client/-/@hiero-did-sdk-js/client-0.0.1.tgz} '@hiero-did-sdk-js/crypto@0.0.1': - resolution: {integrity: sha1-7myNI6ac/MXIhFvvimqNOjDRI3g=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk-js/crypto/-/@hiero-did-sdk-js/crypto-0.0.1.tgz} + resolution: {integrity: sha1-boXa93x8ubg3r87M75kulcK7HWI=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk-js/crypto/-/@hiero-did-sdk-js/crypto-0.0.1.tgz} + + '@hiero-did-sdk-js/did@0.0.1': + resolution: {integrity: sha1-kTySdu/6/RJOdOTUnMvIHiDfb1E=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk-js/did/-/@hiero-did-sdk-js/did-0.0.1.tgz} '@hiero-did-sdk-js/hcs@0.0.1': - resolution: {integrity: sha1-y425LHxX+szRkBI2w1k+PKB48MI=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk-js/hcs/-/@hiero-did-sdk-js/hcs-0.0.1.tgz} + resolution: {integrity: sha1-/uBmj1cfxYgU+8TJPiajk7y3fNM=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk-js/hcs/-/@hiero-did-sdk-js/hcs-0.0.1.tgz} '@hiero-did-sdk-js/zstd@0.0.1': - resolution: {integrity: sha1-HX7HgYFjcb7pB5tIDHQ/IXXiMfw=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk-js/zstd/-/@hiero-did-sdk-js/zstd-0.0.1.tgz} + resolution: {integrity: sha1-CNd96vi2XFIyLgcJCjLMd1SjPZE=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk-js/zstd/-/@hiero-did-sdk-js/zstd-0.0.1.tgz} '@hyperledger/anoncreds-nodejs@0.3.1': resolution: {integrity: sha512-/oWmWgcOPqjAtd2+dKASPYL84Qd7sAFyCBfEKM7PAgVbObaZUZc0kqA7hkEz/qyiqUvcP/JwKTc1v4zVZi6BTg==} @@ -2444,6 +2454,10 @@ packages: resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/pattern@30.0.0': + resolution: {integrity: sha512-k+TpEThzLVXMkbdxf8KHjZ83Wl+G54ytVJoDIGWwS96Ql4xyASRjc6SU1hs5jHVql+hpyK9G8N7WuFhLpGHRpQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/reporters@29.7.0': resolution: {integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -2457,6 +2471,10 @@ packages: resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/schemas@30.0.0': + resolution: {integrity: sha512-NID2VRyaEkevCRz6badhfqYwri/RvMbiHY81rk3AkK/LaiB0LSxi1RdVZ7MpZdTjNugtZeGfpL0mLs9Kp3MrQw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/source-map@29.6.3': resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -2473,6 +2491,10 @@ packages: resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/transform@30.0.0': + resolution: {integrity: sha512-8xhpsCGYJsUjqpJOgLyMkeOSSlhqggFZEWAnZquBsvATtueoEs7CkMRxOUmJliF3E5x+mXmZ7gEEsHank029Og==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/types@24.9.0': resolution: {integrity: sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==} engines: {node: '>= 6'} @@ -2489,8 +2511,12 @@ packages: resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - '@jridgewell/gen-mapping@0.3.5': - resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + '@jest/types@30.0.0': + resolution: {integrity: sha512-1Nox8mAL52PKPfEnUQWBvKU/bp8FTT6AiDu76bFDEJj/qsRFSAVSldfCH3XYMqialti2zHXKvD5gN0AaHc0yKA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jridgewell/gen-mapping@0.3.8': + resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} engines: {node: '>=6.0.0'} '@jridgewell/resolve-uri@3.1.2': @@ -2504,8 +2530,8 @@ packages: '@jridgewell/source-map@0.3.6': resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} - '@jridgewell/sourcemap-codec@1.4.15': - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} @@ -2524,8 +2550,8 @@ packages: '@js-sdsl/ordered-map@4.4.2': resolution: {integrity: sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==} - '@koa/bodyparser@5.1.1': - resolution: {integrity: sha512-ZBF49xqNVxnmJ+8iXegq+fXPQm9RSX8giNl/aXS5rW1VpNct92wnFbGR/47vfoRJVLARGQ4HVL4WaQ0u8IJVoA==} + '@koa/bodyparser@5.1.2': + resolution: {integrity: sha512-eGJm9/66iUX+LUH03Cz0e94unbSKrmSPCick4MO5UorAAomcjC5Kl+SkoZ6CSyPew3neMYjj7n+djnlGYBSJAg==} engines: {node: '>= 16'} peerDependencies: koa: ^2.14.1 @@ -2548,27 +2574,27 @@ packages: resolution: {integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==} hasBin: true - '@mswjs/interceptors@0.37.5': - resolution: {integrity: sha512-AAwRb5vXFcY4L+FvZ7LZusDuZ0vEe0Zm8ohn1FM6/X7A3bj4mqmkAcGRWuvC2JwSygNwHAAmMnAI73vPHeqsHA==} + '@mswjs/interceptors@0.38.7': + resolution: {integrity: sha512-Jkb27iSn7JPdkqlTqKfhncFfnEZsIJVYxsFbUSWEkxdIPdsyngrhoDBk0/BGD2FQcRH99vlRrkHpNTyKqI+0/w==} engines: {node: '>=18'} '@multiformats/base-x@4.0.1': resolution: {integrity: sha512-eMk0b9ReBbV23xXU693TAIrLyeO5iTgBZGSJfpqriG8UkYvr/hC9u9pyMlAakDNHWmbhMZCDs6KQO0jzKD8OTw==} - '@noble/ciphers@1.2.1': - resolution: {integrity: sha512-rONPWMC7PeExE077uLE4oqWrZ1IvAfz3oH9LibVAcVCopJiA9R62uavnbEzdkVmJYI6M6Zgkbeb07+tWjlq2XA==} + '@noble/ciphers@1.3.0': + resolution: {integrity: sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==} engines: {node: ^14.21.3 || >=16} - '@noble/curves@1.8.1': - resolution: {integrity: sha512-warwspo+UYUPep0Q+vtdVB4Ugn8GGQj8iyB3gnRWsztmUHTI3S1nhdiWNsPUGL0vud7JlRRk1XEu7Lq1KGTnMQ==} + '@noble/curves@1.9.2': + resolution: {integrity: sha512-HxngEd2XUcg9xi20JkwlLCtYwfoFw4JGkuZpT+WlsPD4gB/cxkvTD8fSsoAnphGZhFdZYKeQIPCuFlWPm1uE0g==} engines: {node: ^14.21.3 || >=16} '@noble/hashes@1.6.1': resolution: {integrity: sha512-pq5D8h10hHBjyqX+cfBm0i8JUXJ0UhczFc4r74zbuT9XgewFo2E3J1cOaGtdZynILNmQ685YWGzGE1Zv6io50w==} engines: {node: ^14.21.3 || >=16} - '@noble/hashes@1.7.1': - resolution: {integrity: sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ==} + '@noble/hashes@1.8.0': + resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} engines: {node: ^14.21.3 || >=16} '@nodelib/fs.scandir@2.1.5': @@ -2608,45 +2634,42 @@ packages: '@openid4vc/utils@0.3.0-alpha-20250602121005': resolution: {integrity: sha512-68lU8pqqGrqIjhb+/y+UjYFgbzluljIhTAEan5LyW0IKOMO0slFHfEzjn85Cv8bN1En/SuNT+U/McX/krlSSwg==} - '@openwallet-foundation/askar-nodejs@0.3.1': - resolution: {integrity: sha512-m3L8KEPC+qgA3MAFssMtjSqJiAQtrawZEWPmW6eiB7OPjZvkKjodMhx/cuUV5YTl4eQlSix2EY4vXMzk4vt+cQ==} + '@openwallet-foundation/askar-nodejs@0.3.2': + resolution: {integrity: sha512-kHZaPl32azKzqT/+ksRqGXNs9lxTrhbuWVuILS1HNGXA+A5vSINRA8WwDHk2KGZ9WP7jhszbPx804cfRKrrBPA==} engines: {node: '>= 18'} - '@openwallet-foundation/askar-shared@0.3.1': - resolution: {integrity: sha512-KpkVuLHnKkJ7nPYZ/6PJ8b9gq+elC6Mhg8UiG+wLOKchVi6Vbv/nOsAdKK9j1/CCZ3DzvfTbhV+KRk6YNXmIsA==} + '@openwallet-foundation/askar-shared@0.3.2': + resolution: {integrity: sha512-WQSHM5+5Vy1QMUpUTj0DpwFKYdciNcksWsft/iD6Ff+AdDERKo5Mjv/4JSIZIzXUEyq7kqqNbejl4a3TDGeU3A==} + + '@paralleldrive/cuid2@2.2.2': + resolution: {integrity: sha512-ZOBkgDwEdoYVlSeRbYYXs0S9MejQofiVYoTbKzy/6GQa39/q5tQU2IX46+shYnUkpEl3wc+J6wRlar7r2EK2xA==} - '@peculiar/asn1-cms@2.3.13': - resolution: {integrity: sha512-joqu8A7KR2G85oLPq+vB+NFr2ro7Ls4ol13Zcse/giPSzUNN0n2k3v8kMpf6QdGUhI13e5SzQYN8AKP8sJ8v4w==} + '@peculiar/asn1-cms@2.3.15': + resolution: {integrity: sha512-B+DoudF+TCrxoJSTjjcY8Mmu+lbv8e7pXGWrhNp2/EGJp9EEcpzjBCar7puU57sGifyzaRVM03oD5L7t7PghQg==} - '@peculiar/asn1-csr@2.3.13': - resolution: {integrity: sha512-+JtFsOUWCw4zDpxp1LbeTYBnZLlGVOWmHHEhoFdjM5yn4wCn+JiYQ8mghOi36M2f6TPQ17PmhNL6/JfNh7/jCA==} + '@peculiar/asn1-csr@2.3.15': + resolution: {integrity: sha512-caxAOrvw2hUZpxzhz8Kp8iBYKsHbGXZPl2KYRMIPvAfFateRebS3136+orUpcVwHRmpXWX2kzpb6COlIrqCumA==} - '@peculiar/asn1-ecc@2.3.14': - resolution: {integrity: sha512-zWPyI7QZto6rnLv6zPniTqbGaLh6zBpJyI46r1yS/bVHJXT2amdMHCRRnbV5yst2H8+ppXG6uXu/M6lKakiQ8w==} + '@peculiar/asn1-ecc@2.3.15': + resolution: {integrity: sha512-/HtR91dvgog7z/WhCVdxZJ/jitJuIu8iTqiyWVgRE9Ac5imt2sT/E4obqIVGKQw7PIy+X6i8lVBoT6wC73XUgA==} - '@peculiar/asn1-pfx@2.3.13': - resolution: {integrity: sha512-fypYxjn16BW+5XbFoY11Rm8LhZf6euqX/C7BTYpqVvLem1GvRl7A+Ro1bO/UPwJL0z+1mbvXEnkG0YOwbwz2LA==} + '@peculiar/asn1-pfx@2.3.15': + resolution: {integrity: sha512-E3kzQe3J2xV9DP6SJS4X6/N1e4cYa2xOAK46VtvpaRk8jlheNri8v0rBezKFVPB1rz/jW8npO+u1xOvpATFMWg==} - '@peculiar/asn1-pkcs8@2.3.13': - resolution: {integrity: sha512-VP3PQzbeSSjPjKET5K37pxyf2qCdM0dz3DJ56ZCsol3FqAXGekb4sDcpoL9uTLGxAh975WcdvUms9UcdZTuGyQ==} + '@peculiar/asn1-pkcs8@2.3.15': + resolution: {integrity: sha512-/PuQj2BIAw1/v76DV1LUOA6YOqh/UvptKLJHtec/DQwruXOCFlUo7k6llegn8N5BTeZTWMwz5EXruBw0Q10TMg==} - '@peculiar/asn1-pkcs9@2.3.13': - resolution: {integrity: sha512-rIwQXmHpTo/dgPiWqUgby8Fnq6p1xTJbRMxCiMCk833kQCeZrC5lbSKg6NDnJTnX2kC6IbXBB9yCS2C73U2gJg==} + '@peculiar/asn1-pkcs9@2.3.15': + resolution: {integrity: sha512-yiZo/1EGvU1KiQUrbcnaPGWc0C7ElMMskWn7+kHsCFm+/9fU0+V1D/3a5oG0Jpy96iaXggQpA9tzdhnYDgjyFg==} '@peculiar/asn1-rsa@2.3.15': resolution: {integrity: sha512-p6hsanvPhexRtYSOHihLvUUgrJ8y0FtOM97N5UEpC+VifFYyZa0iZ5cXjTkZoDwxJ/TTJ1IJo3HVTB2JJTpXvg==} - '@peculiar/asn1-schema@2.3.13': - resolution: {integrity: sha512-3Xq3a01WkHRZL8X04Zsfg//mGaA21xlL4tlVn4v2xGT0JStiztATRkMwa5b+f/HXmY2smsiLXYK46Gwgzvfg3g==} - '@peculiar/asn1-schema@2.3.15': resolution: {integrity: sha512-QPeD8UA8axQREpgR5UTAfu2mqQmm97oUqahDtNdBcfj3qAnoXzFdQW+aNf/tD2WVXF8Fhmftxoj0eMIT++gX2w==} - '@peculiar/asn1-x509-attr@2.3.13': - resolution: {integrity: sha512-WpEos6CcnUzJ6o2Qb68Z7Dz5rSjRGv/DtXITCNBtjZIRWRV12yFVci76SVfOX8sisL61QWMhpLKQibrG8pi2Pw==} - - '@peculiar/asn1-x509@2.3.13': - resolution: {integrity: sha512-PfeLQl2skXmxX2/AFFCVaWU8U6FKW1Db43mgBhShCOFS1bVxqtvusq1hVjfuEcuSQGedrLdCSvTgabluwN/M9A==} + '@peculiar/asn1-x509-attr@2.3.15': + resolution: {integrity: sha512-TWJVJhqc+IS4MTEML3l6W1b0sMowVqdsnI4dnojg96LvTuP8dga9f76fjP07MUuss60uSyT2ckoti/2qHXA10A==} '@peculiar/asn1-x509@2.3.15': resolution: {integrity: sha512-0dK5xqTqSLaxv1FHXIcd4Q/BZNuopg+u1l23hT9rOmQ1g4dNtw0g/RnEi+TboB0gOwGtrWn269v27cMgchFIIg==} @@ -2659,8 +2682,8 @@ packages: resolution: {integrity: sha512-BRs5XUAwiyCDQMsVA9IDvDa7UBR9gAvPHgugOeGng3YN6vJ9JYonyDc0lNczErgtCWtucjR5N7VtaonboD/ezg==} engines: {node: '>=10.12.0'} - '@peculiar/x509@1.12.3': - resolution: {integrity: sha512-+Mzq+W7cNEKfkNZzyLl6A6ffqc3r21HGZUezgfKxpZrkORfOqgRXnS80Zu0IV6a9Ue9QBJeKD7kN0iWfc3bhRQ==} + '@peculiar/x509@1.12.4': + resolution: {integrity: sha512-4bWU48fN53nt3W683CrEVcUIus7WQlBq/EMVFx7K+FvQTOWJ5RmfJvTLVOfwDjAyxs7jVPbgUGBdqEDlLy1t9Q==} '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} @@ -2734,16 +2757,16 @@ packages: engines: {node: '>=14'} hasBin: true - '@react-native/assets-registry@0.78.1': - resolution: {integrity: sha512-SegfYQFuut05EQIQIVB/6QMGaxJ29jEtPmzFWJdIp/yc2mmhIq7MfWRjwOe6qbONzIdp6Ca8p835hiGiAGyeKQ==} + '@react-native/assets-registry@0.78.2': + resolution: {integrity: sha512-VHqQqjj1rnh2KQeS3yx4IfFSxIIIDi1jR4yUeC438Q6srwxDohR4W0UkXuSIz0imhlems5eS7yZTjdgSpWHRUQ==} engines: {node: '>=18'} '@react-native/babel-plugin-codegen@0.74.87': resolution: {integrity: sha512-+vJYpMnENFrwtgvDfUj+CtVJRJuUnzAUYT0/Pb68Sq9RfcZ5xdcCuUgyf7JO+akW2VTBoJY427wkcxU30qrWWw==} engines: {node: '>=18'} - '@react-native/babel-plugin-codegen@0.78.1': - resolution: {integrity: sha512-rD0tnct/yPEtoOc8eeFHIf8ZJJJEzLkmqLs8HZWSkt3w9VYWngqLXZxiDGqv0ngXjunAlC/Hpq+ULMVOvOnByw==} + '@react-native/babel-plugin-codegen@0.78.2': + resolution: {integrity: sha512-0MnQOhIaOdWbQ3Dx3dz0MBbG+1ggBiyUL+Y+xHAeSDSaiRATT8DIsrSloeJU0A+2p5TxF8ITJyJ6KEQkMyB/Zw==} engines: {node: '>=18'} '@react-native/babel-preset@0.74.87': @@ -2752,8 +2775,8 @@ packages: peerDependencies: '@babel/core': '*' - '@react-native/babel-preset@0.78.1': - resolution: {integrity: sha512-yTVcHmEdNQH4Ju7lhvbiQaGxBpMcalgkBy/IvHowXKk/ex3nY1PolF16/mBG1BrefcUA/rtJpqTtk2Ii+7T/Lw==} + '@react-native/babel-preset@0.78.2': + resolution: {integrity: sha512-VGOLhztQY/0vktMXrBr01HUN/iBSdkKBRiiZYfrLqx9fB2ql55gZb/6X9lzItjVyYoOc2jyHXSX8yoSfDcWDZg==} engines: {node: '>=18'} peerDependencies: '@babel/core': '*' @@ -2764,14 +2787,14 @@ packages: peerDependencies: '@babel/preset-env': ^7.1.6 - '@react-native/codegen@0.78.1': - resolution: {integrity: sha512-kGG5qAM9JdFtxzUwe7c6CyJbsU2PnaTrtCHA2dF8VEiNX1K3yd9yKPzfkxA7HPvmHoAn3ga1941O79BStWcM3A==} + '@react-native/codegen@0.78.2': + resolution: {integrity: sha512-4r3/W1h22/GAmAMuMRMJWsw/9JGUEDAnSbYNya7zID1XSvizLoA5Yn8Qv+phrRwwsl0eZLxOqONh/nzXJcvpyg==} engines: {node: '>=18'} peerDependencies: '@babel/preset-env': ^7.1.6 - '@react-native/community-cli-plugin@0.78.1': - resolution: {integrity: sha512-S6vF4oWpFqThpt/dBLrqLQw5ED2M1kg5mVtiL6ZqpoYIg+/e0vg7LZ8EXNbcdMDH4obRnm2xbOd+qlC7mOzNBg==} + '@react-native/community-cli-plugin@0.78.2': + resolution: {integrity: sha512-xqEnpqxvBlm02mRY58L0NBjF25MTHmbaeA2qBx5VtheH/pXL6MHUbtwB1Q2dJrg9XcK0Np1i9h7N5h9gFwA2Mg==} engines: {node: '>=18'} peerDependencies: '@react-native-community/cli': '*' @@ -2783,28 +2806,28 @@ packages: resolution: {integrity: sha512-gUIhhpsYLUTYWlWw4vGztyHaX/kNlgVspSvKe2XaPA7o3jYKUoNLc3Ov7u70u/MBWfKdcEffWq44eSe3j3s5JQ==} engines: {node: '>=18'} - '@react-native/debugger-frontend@0.78.1': - resolution: {integrity: sha512-xev/B++QLxSDpEBWsc74GyCuq9XOHYTBwcGSpsuhOJDUha6WZIbEEvZe3LpVW+OiFso4oGIdnVSQntwippZdWw==} + '@react-native/debugger-frontend@0.78.2': + resolution: {integrity: sha512-qNJT679OU/cdAKmZxfBFjqTG+ZC5i/4sLyvbcQjFFypunGSOaWl3mMQFQQdCBIQN+DFDPVSUXTPZQK1uI2j/ow==} engines: {node: '>=18'} '@react-native/dev-middleware@0.74.85': resolution: {integrity: sha512-BRmgCK5vnMmHaKRO+h8PKJmHHH3E6JFuerrcfE3wG2eZ1bcSr+QTu8DAlpxsDWvJvHpCi8tRJGauxd+Ssj/c7w==} engines: {node: '>=18'} - '@react-native/dev-middleware@0.78.1': - resolution: {integrity: sha512-l8p7/dXa1vWPOdj0iuACkex8lgbLpYyPZ3QXGkocMcpl0bQ24K7hf3Bj02tfptP5PAm16b2RuEi04sjIGHUzzg==} + '@react-native/dev-middleware@0.78.2': + resolution: {integrity: sha512-/u0pGiWVgvx09cYNO4/Okj8v1ZNt4K941pQJPhdwg5AHYuggVHNJjROukXJzZiElYFcJhMfOuxwksiIyx/GAkA==} engines: {node: '>=18'} - '@react-native/gradle-plugin@0.78.1': - resolution: {integrity: sha512-v8GJU+8DzQDWO3iuTFI1nbuQ/kzuqbXv07VVtSIMLbdofHzuuQT14DGBacBkrIDKBDTVaBGAc/baDNsyxCghng==} + '@react-native/gradle-plugin@0.78.2': + resolution: {integrity: sha512-LHgmdrbyK9fcBDdxtn2GLOoDAE+aFHtDHgu6vUZ5CSCi9CMd5Krq8IWAmWjeq+BQr+D1rwSXDAHtOrfJ6qOolA==} engines: {node: '>=18'} - '@react-native/js-polyfills@0.78.1': - resolution: {integrity: sha512-Ogcv4QOA1o3IyErrf/i4cDnP+nfNcIfGTgw6iNQyAPry1xjPOz4ziajskLpWG/3ADeneIZuyZppKB4A28rZSvg==} + '@react-native/js-polyfills@0.78.2': + resolution: {integrity: sha512-b7eCPAs3uogdDeTvOTrU6i8DTTsHyjyp48R5pVakJIREhEx+SkUnlVk11PYjbCKGYjYgN939Tb5b1QWNtdrPIQ==} engines: {node: '>=18'} - '@react-native/metro-babel-transformer@0.78.1': - resolution: {integrity: sha512-jQWf69D+QTMvSZSWLR+cr3VUF16rGB6sbD+bItD8Czdfn3hajzfMoHJTkVFP7991cjK5sIVekNiQIObou8JSQw==} + '@react-native/metro-babel-transformer@0.78.2': + resolution: {integrity: sha512-H4614LjcbrG+lUtg+ysMX5RnovY8AwrWj4rH8re6ErfhPFwLQXV0LIrl/fgFpq07Vjc5e3ZXzuKuMJF6l7eeTQ==} engines: {node: '>=18'} peerDependencies: '@babel/core': '*' @@ -2812,11 +2835,11 @@ packages: '@react-native/normalize-colors@0.74.85': resolution: {integrity: sha512-pcE4i0X7y3hsAE0SpIl7t6dUc0B0NZLd1yv7ssm4FrLhWG+CGyIq4eFDXpmPU1XHmL5PPySxTAjEMiwv6tAmOw==} - '@react-native/normalize-colors@0.78.1': - resolution: {integrity: sha512-h4wARnY4iBFgigN1NjnaKFtcegWwQyE9+CEBVG4nHmwMtr8lZBmc7ZKIM6hUc6lxqY/ugHg48aSQSynss7mJUg==} + '@react-native/normalize-colors@0.78.2': + resolution: {integrity: sha512-CA/3ynRO6/g1LDbqU8ewrv0js/1lU4+j04L7qz6btXbLTDk1UkF+AfpGRJGbIVY9UmFBJ7l1AOmzwutrWb3Txw==} - '@react-native/virtualized-lists@0.78.1': - resolution: {integrity: sha512-v0jqDNMFXpnRnSlkDVvwNxXgPhifzzTFlxTSnHj9erKJsKpE26gSU5qB4hmJkEsscLG/ygdJ1c88aqinSh/wRA==} + '@react-native/virtualized-lists@0.78.2': + resolution: {integrity: sha512-y/wVRUz1ImR2hKKUXFroTdSBiL0Dd+oudzqcGKp/M8Ybrw9MQ0m2QCXxtyONtDn8qkEGceqllwTCKq5WQwJcew==} engines: {node: '>=18'} peerDependencies: '@types/react': ^19.0.0 @@ -2830,9 +2853,6 @@ packages: resolution: {integrity: sha512-lzD84av1ZQhYUS+jsGqJiCMaJO2dn9u+RTT9n9q6D3SaKVwWqv+7AoRKqBu19bkwyE+iFRl1ymr40QS90jVFYg==} engines: {node: '>=14.15'} - '@scure/base@1.2.1': - resolution: {integrity: sha512-DGmGtC8Tt63J5GfHgfl5CuAXh96VF/LD8K9Hr/Gv0J2lAoRGlPOMpqMpMbCTOoOJMZCk2Xt+DskdDyn6dEFdzQ==} - '@scure/base@1.2.6': resolution: {integrity: sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg==} @@ -2891,6 +2911,9 @@ packages: '@sinclair/typebox@0.27.8': resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + '@sinclair/typebox@0.34.33': + resolution: {integrity: sha512-5HAV9exOMcXRUxo+9iYB5n09XxzCXnfy4VTNW4xnDv+FgjzAGY989C28BIdljKqmF+ZltUwujE3aossvcVtq6g==} + '@sindresorhus/is@5.6.0': resolution: {integrity: sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==} engines: {node: '>=14.16'} @@ -2958,35 +2981,35 @@ packages: resolution: {integrity: sha512-1eU2K9EgOcV4qc9jcP6G72xxZxEm5PfeI5H55l08W95b4oRJaqhmlWRc4xZAm6IVSKhVNxMi66V67hCzzuMTAg==} '@swiss-digital-assets-institute/core@0.3.0': - resolution: {integrity: sha1-HFqrSOZ1eNl1aHTx0e/k53tMSP0=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@swiss-digital-assets-institute/core/-/@swiss-digital-assets-institute/core-0.3.0.tgz} + resolution: {integrity: sha1-gOPw8bFqDrlOMYYXPtIq7ixEH+A=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@swiss-digital-assets-institute/core/-/@swiss-digital-assets-institute/core-0.3.0.tgz} engines: {node: '>=20'} '@swiss-digital-assets-institute/lifecycle@0.3.0': - resolution: {integrity: sha1-/yTpyVQllHnj7LthP4MvHI1s9Dc=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@swiss-digital-assets-institute/lifecycle/-/@swiss-digital-assets-institute/lifecycle-0.3.0.tgz} + resolution: {integrity: sha1-AbSEJqtRLA4v383Cqx8O+7q1xw4=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@swiss-digital-assets-institute/lifecycle/-/@swiss-digital-assets-institute/lifecycle-0.3.0.tgz} engines: {node: '>=20'} '@swiss-digital-assets-institute/messages@0.3.0': - resolution: {integrity: sha1-KDpJdqqjOD7g4ZZjYhF+0EeRj2E=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@swiss-digital-assets-institute/messages/-/@swiss-digital-assets-institute/messages-0.3.0.tgz} + resolution: {integrity: sha1-eHjiIB8vQQbmF25rD26QrpUL99k=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@swiss-digital-assets-institute/messages/-/@swiss-digital-assets-institute/messages-0.3.0.tgz} engines: {node: '>=20'} '@swiss-digital-assets-institute/publisher-internal@0.3.0': - resolution: {integrity: sha1-/3A4eN6tdAGVhWtBxfThxawKl9Y=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@swiss-digital-assets-institute/publisher-internal/-/@swiss-digital-assets-institute/publisher-internal-0.3.0.tgz} + resolution: {integrity: sha1-uG3qRyyAruu9oN4/vAHsBYKtMcg=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@swiss-digital-assets-institute/publisher-internal/-/@swiss-digital-assets-institute/publisher-internal-0.3.0.tgz} engines: {node: '>=20'} '@swiss-digital-assets-institute/registrar@0.3.0': - resolution: {integrity: sha1-EtnZszht1lEXDI4p/+reQk3wCdw=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@swiss-digital-assets-institute/registrar/-/@swiss-digital-assets-institute/registrar-0.3.0.tgz} + resolution: {integrity: sha1-ebwxVxUl+FBtL9QUimD5Jwqmex8=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@swiss-digital-assets-institute/registrar/-/@swiss-digital-assets-institute/registrar-0.3.0.tgz} engines: {node: '>=20'} '@swiss-digital-assets-institute/resolver@0.3.0': - resolution: {integrity: sha1-6PsOUXpYAYT2U4ac/OFQU6WU2iQ=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@swiss-digital-assets-institute/resolver/-/@swiss-digital-assets-institute/resolver-0.3.0.tgz} + resolution: {integrity: sha1-GzqTCKsp458bctefaOjKR1q8nBs=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@swiss-digital-assets-institute/resolver/-/@swiss-digital-assets-institute/resolver-0.3.0.tgz} engines: {node: '>=20'} '@swiss-digital-assets-institute/signer-internal@0.3.0': - resolution: {integrity: sha1-hXAulacwLyf6D2zPdXv1d2m7+Ek=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@swiss-digital-assets-institute/signer-internal/-/@swiss-digital-assets-institute/signer-internal-0.3.0.tgz} + resolution: {integrity: sha1-7ry2rpuYAg6HqY20MJo5WOmeols=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@swiss-digital-assets-institute/signer-internal/-/@swiss-digital-assets-institute/signer-internal-0.3.0.tgz} engines: {node: '>=20'} '@swiss-digital-assets-institute/verifier-internal@0.3.0': - resolution: {integrity: sha1-bUpg621K6rPreN8td50kvOQk2OU=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@swiss-digital-assets-institute/verifier-internal/-/@swiss-digital-assets-institute/verifier-internal-0.3.0.tgz} + resolution: {integrity: sha1-af+OrAYbryxmifpMXEdJdvrJN80=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@swiss-digital-assets-institute/verifier-internal/-/@swiss-digital-assets-institute/verifier-internal-0.3.0.tgz} engines: {node: '>=20'} '@szmarczak/http-timer@5.0.1': @@ -3018,44 +3041,44 @@ packages: '@types/babel__core@7.20.5': resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} - '@types/babel__generator@7.6.8': - resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} + '@types/babel__generator@7.27.0': + resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} '@types/babel__template@7.4.4': resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} - '@types/babel__traverse@7.20.6': - resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} + '@types/babel__traverse@7.20.7': + resolution: {integrity: sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==} - '@types/body-parser@1.19.5': - resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} + '@types/body-parser@1.19.6': + resolution: {integrity: sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==} '@types/connect@3.4.38': resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - '@types/content-disposition@0.5.8': - resolution: {integrity: sha512-QVSSvno3dE0MgO76pJhmv4Qyi/j0Yk9pBp0Y7TJ2Tlj+KCgJWY6qX7nnxCOLkZ3VYRSIk1WTxCvwUSdx6CCLdg==} + '@types/content-disposition@0.5.9': + resolution: {integrity: sha512-8uYXI3Gw35MhiVYhG3s295oihrxRyytcRHjSjqnqZVDDy/xcGBRny7+Xj1Wgfhv5QzRtN2hB2dVRBUX9XW3UcQ==} '@types/cookiejar@2.1.5': resolution: {integrity: sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q==} - '@types/cookies@0.9.0': - resolution: {integrity: sha512-40Zk8qR147RABiQ7NQnBzWzDcjKzNrntB5BAmeGCb2p/MIyOE+4BVvc17wumsUqUw00bJYqoXFHYygQnEFh4/Q==} + '@types/cookies@0.9.1': + resolution: {integrity: sha512-E/DPgzifH4sM1UMadJMWd6mO2jOd4g1Ejwzx8/uRCDpJis1IrlyQEcGAYEomtAqRYmD5ORbNXMeI9U0RiVGZbg==} - '@types/cors@2.8.17': - resolution: {integrity: sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==} + '@types/cors@2.8.19': + resolution: {integrity: sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==} '@types/events@3.0.3': resolution: {integrity: sha512-trOc4AAUThEz9hapPtSd7wf5tiQKvTtu5b371UxXdTuqzIh0ArcRspRP0i0Viu+LXstIQ1z96t1nsPxT9ol01g==} - '@types/express-serve-static-core@4.19.3': - resolution: {integrity: sha512-KOzM7MhcBFlmnlr/fzISFF5vGWVSvN6fTd4T+ExOt08bA/dA5kpSzY52nMsI1KDFmUREpJelPYyuslLRSjjgCg==} + '@types/express-serve-static-core@4.19.6': + resolution: {integrity: sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==} - '@types/express@4.17.21': - resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} + '@types/express@4.17.23': + resolution: {integrity: sha512-Crp6WY9aTYP3qPi2wGDo9iUe/rceX01UMhnF1jmwDcKCFM6cx7YhGP/Mpr3y9AASpfHixIG0E6azCcL5OcDHsQ==} - '@types/figlet@1.5.8': - resolution: {integrity: sha512-G22AUvy4Tl95XLE7jmUM8s8mKcoz+Hr+Xm9W90gJsppJq9f9tHvOGkrpn4gRX0q/cLtBdNkWtWCKDg2UDZoZvQ==} + '@types/figlet@1.7.0': + resolution: {integrity: sha512-KwrT7p/8Eo3Op/HBSIwGXOsTZKYiM9NpWRBJ5sVjWP/SmlS+oxxRvJht/FNAtliJvja44N3ul1yATgohnVBV0Q==} '@types/graceful-fs@4.1.9': resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} @@ -3066,11 +3089,11 @@ packages: '@types/http-cache-semantics@4.0.4': resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} - '@types/http-errors@2.0.4': - resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} + '@types/http-errors@2.0.5': + resolution: {integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==} - '@types/inquirer@8.2.10': - resolution: {integrity: sha512-IdD5NmHyVjWM8SHWo/kPBgtzXatwPkfwzyP3fN1jF2g9BWt5WO+8hL2F4o2GKIYsU40PpqeevuUWvkS/roXJkA==} + '@types/inquirer@8.2.11': + resolution: {integrity: sha512-15UboTvxb9SOaPG7CcXZ9dkv8lNqfiAwuh/5WxJDLjmElBt9tbx1/FDsEnJddUBKvN4mlPKvr8FyO1rAmBanzg==} '@types/istanbul-lib-coverage@2.0.6': resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} @@ -3084,8 +3107,8 @@ packages: '@types/istanbul-reports@3.0.4': resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} - '@types/jest@29.5.12': - resolution: {integrity: sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==} + '@types/jest@29.5.14': + resolution: {integrity: sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==} '@types/keygrip@1.0.6': resolution: {integrity: sha512-lZuNAY9xeJt7Bx4t4dx0rYCDqGPW8RXhQZK1td7d4H6E9zYbLoOtjBvfwdTKpsyxQI/2jv+armjX/RW+ZNpXOQ==} @@ -3099,8 +3122,8 @@ packages: '@types/long@4.0.2': resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==} - '@types/luxon@3.4.2': - resolution: {integrity: sha512-TifLZlFudklWlMBfhubvgqTXRzLDI5pCbGa4P8a3wPyUQSW+1xQ5eDsreP9DWHX3tjq1ke96uYG/nwundroWcA==} + '@types/luxon@3.6.2': + resolution: {integrity: sha512-R/BdP7OxEMc44l2Ex5lSXHoIXTB2JLNa3y2QISIbr58U/YcsffyQrYW//hZSdrfxrjRZj3GcUoxMPGdO8gSYuw==} '@types/methods@1.1.4': resolution: {integrity: sha512-ymXWVrDiCxTBE3+RIrrP533E70eA+9qu7zdWoHuOmGujkYtzf4HQF96b8nwHLqhuf4ykX61IGRIB38CC6/sImQ==} @@ -3108,11 +3131,8 @@ packages: '@types/mime@1.3.5': resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} - '@types/minimist@1.2.5': - resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} - - '@types/multer@1.4.11': - resolution: {integrity: sha512-svK240gr6LVWvv3YGyhLlA+6LRRWA4mnGIU7RcNmgjBYFl6665wcXrRfxGp5tEPVHUNm5FMcmq7too9bxCwX/w==} + '@types/multer@1.4.13': + resolution: {integrity: sha512-bhhdtPw7JqCiEfC9Jimx5LqX9BDIPJEh2q/fQ4bqbBPtyEZYr3cvF22NwG0DmPZNYA0CAf2CnqDB4KIGGpJcaw==} '@types/node-forge@1.3.11': resolution: {integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==} @@ -3120,17 +3140,14 @@ packages: '@types/node@18.18.8': resolution: {integrity: sha512-OLGBaaK5V3VRBS1bAkMVP2/W9B+H8meUfl866OrMNQqt7wDgdpWPp5o6gmIc9pB+lIQHSq4ZL8ypeH1vPxcPaQ==} - '@types/normalize-package-data@2.4.4': - resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} - '@types/object-inspect@1.13.0': resolution: {integrity: sha512-lwGTVESDDV+XsQ1pH4UifpJ1f7OtXzQ6QBOX2Afq2bM/T3oOt8hF6exJMjjIjtEWeAN2YAo25J7HxWh97CCz9w==} '@types/oidc-provider@8.8.1': resolution: {integrity: sha512-Yi/OJ7s0CFJ1AWAQrY2EO/zkV9uppLtiGAzrA07lBDveUOvxtYh7GflnHFXcgufVaPxVAjdykizjTYTMNVhdJw==} - '@types/qs@6.9.15': - resolution: {integrity: sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==} + '@types/qs@6.14.0': + resolution: {integrity: sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==} '@types/range-parser@1.2.7': resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} @@ -3147,14 +3164,11 @@ packages: '@types/secp256k1@4.0.6': resolution: {integrity: sha512-hHxJU6PAEUn0TP4S/ZOzuTUvJWuZ6eIKeNKb5RBpODvSl6hp1Wrw4s7ATY50rklRCScUDpHzVA/DQdSjJ3UoYQ==} - '@types/semver@7.5.8': - resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} + '@types/send@0.17.5': + resolution: {integrity: sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==} - '@types/send@0.17.4': - resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} - - '@types/serve-static@1.15.7': - resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==} + '@types/serve-static@1.15.8': + resolution: {integrity: sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg==} '@types/stack-utils@2.0.3': resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} @@ -3162,8 +3176,8 @@ packages: '@types/superagent@8.1.9': resolution: {integrity: sha512-pTVjI73witn+9ILmoJdajHGW2jkSaOzhiFYF1Rd3EQ94kymLqB9PjD9ISg7WaALC7+dCHT0FGe9T2LktLq/3GQ==} - '@types/supertest@6.0.2': - resolution: {integrity: sha512-137ypx2lk/wTQbW6An6safu9hXmajAifU/s7szAHLN/FeIm5w7yR0Wkl9fdJMRSHwOn4HLAI0DaB2TOORuhPDg==} + '@types/supertest@6.0.3': + resolution: {integrity: sha512-8WzXq62EXFhJ7QsH3Ocb/iKQ/Ty9ZVWnVzoTKc9tyyFRRF3a74Tk2+TLFgaFFw364Ere+npzHKEJ6ga2LzIL7w==} '@types/through@0.0.33': resolution: {integrity: sha512-HsJ+z3QuETzP3cswwtzt2vEIiHBk/dCcHGhbmG5X3ecnwFD/lPrMpliGXxSCg03L9AhrdwA4Oz/qfspkDW+xGQ==} @@ -3171,14 +3185,14 @@ packages: '@types/uuid@9.0.8': resolution: {integrity: sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==} - '@types/validator@13.12.0': - resolution: {integrity: sha512-nH45Lk7oPIJ1RVOF6JgFI6Dy0QpHEzq4QecZhvguxYPDwT8c93prCMqAtiIttm39voZ+DDR+qkNnMpJmMBRqag==} + '@types/validator@13.15.1': + resolution: {integrity: sha512-9gG6ogYcoI2mCMLdcO0NYI0AYrbxIjv0MDmy/5Ywo6CpWWrqYayc+mmgxRsCgtcGJm9BSbXkMsmxGah1iGHAAQ==} '@types/varint@6.0.3': resolution: {integrity: sha512-DHukoGWdJ2aYkveZJTB2rN2lp6m7APzVsoJQ7j/qy1fQxyamJTPD5xQzCMoJ2Qtgn0mE3wWeNOpbTyBFvF+dyA==} - '@types/ws@8.5.10': - resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==} + '@types/ws@8.18.1': + resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} '@types/yargs-parser@21.0.3': resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} @@ -3192,8 +3206,11 @@ packages: '@types/yargs@16.0.9': resolution: {integrity: sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==} - '@types/yargs@17.0.32': - resolution: {integrity: sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==} + '@types/yargs@17.0.33': + resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==} + + '@ungap/structured-clone@1.3.0': + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} '@unimodules/core@7.1.2': resolution: {integrity: sha512-lY+e2TAFuebD3vshHMIRqru3X4+k7Xkba4Wa7QsDBd+ex4c4N2dHAO61E2SrGD9+TRBD8w/o7mzK6ljbqRnbyg==} @@ -3236,12 +3253,12 @@ packages: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} engines: {node: '>= 0.6'} - acorn-walk@8.3.3: - resolution: {integrity: sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==} + acorn-walk@8.3.4: + resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} engines: {node: '>=0.4.0'} - acorn@8.12.0: - resolution: {integrity: sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==} + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} engines: {node: '>=0.4.0'} hasBin: true @@ -3261,8 +3278,8 @@ packages: ajv: optional: true - ajv@8.16.0: - resolution: {integrity: sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==} + ajv@8.17.1: + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} anser@1.4.10: resolution: {integrity: sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==} @@ -3286,8 +3303,8 @@ packages: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - ansi-regex@6.0.1: - resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + ansi-regex@6.1.0: + resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} engines: {node: '>=12'} ansi-styles@3.2.1: @@ -3319,9 +3336,6 @@ packages: append-field@1.0.0: resolution: {integrity: sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==} - application-config-path@0.1.1: - resolution: {integrity: sha512-zy9cHePtMP0YhwG+CfHm0bgwdnga2X3gZexpdCwEj//dpb+TKajtiC8REEUJUSq6Ab4f9cgNy2l8ObXzCXFkEw==} - aproba@2.0.0: resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} @@ -3342,8 +3356,8 @@ packages: argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - array-buffer-byte-length@1.0.1: - resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} + array-buffer-byte-length@1.0.2: + resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} engines: {node: '>= 0.4'} array-flatten@1.1.1: @@ -3356,28 +3370,16 @@ packages: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} - array.prototype.flat@1.3.2: - resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} - engines: {node: '>= 0.4'} - - arraybuffer.prototype.slice@1.0.3: - resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} + arraybuffer.prototype.slice@1.0.4: + resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} engines: {node: '>= 0.4'} - arrify@1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} - engines: {node: '>=0.10.0'} - asap@2.0.6: resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} asmcrypto.js@0.22.0: resolution: {integrity: sha512-usgMoyXjMbx/ZPdzTSXExhMPur2FTdz/Vo5PVx2gIaBcdAAJNOFlsdgqveM8Cff7W0v+xrf9BwjOV26JSAF9qA==} - asn1js@3.0.5: - resolution: {integrity: sha512-FVnvrKJwpt9LP2lAMl8qZswRNm3T4q9CON+bxldk2iwk3FFpuwhx2FfinyitizWHsVYyaY+y5JzDR0rCMV5yTQ==} - engines: {node: '>=12.0.0'} - asn1js@3.0.6: resolution: {integrity: sha512-UOCGPYbl0tv8+006qks/dTgV9ajs97X2p0FAbyS2iyCRrmLSRolDaHdp+v/CLgnzHc3fVB+CwYiUmei7ndFcgA==} engines: {node: '>=12.0.0'} @@ -3394,14 +3396,18 @@ packages: resolution: {integrity: sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==} engines: {node: '>=4'} + async-function@1.0.0: + resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} + engines: {node: '>= 0.4'} + async-limiter@1.0.1: resolution: {integrity: sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==} async-mutex@0.4.1: resolution: {integrity: sha512-WfoBo4E/TbCX1G95XTjbWTE3X2XLG0m1Xbv2cwOtuPdyH9CZvnaA5nCt1ucjaKEgW2A5IF71hxrRhr83Je5xjA==} - async@3.2.5: - resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==} + async@3.2.6: + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} @@ -3421,8 +3427,8 @@ packages: axios@0.21.4: resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==} - axios@1.7.9: - resolution: {integrity: sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==} + axios@1.9.0: + resolution: {integrity: sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==} b64-lite@1.4.0: resolution: {integrity: sha512-aHe97M7DXt+dkpa8fHlCcm1CnskAHrJqEfMI0KN7dwqlzml/aUe1AGt6lk51HzrSfVD67xOso84sOpr+0wIe2w==} @@ -3441,34 +3447,48 @@ packages: peerDependencies: '@babel/core': ^7.8.0 + babel-jest@30.0.0: + resolution: {integrity: sha512-JQ0DhdFjODbSawDf0026uZuwaqfKkQzk+9mwWkq2XkKFIaMhFVOxlVmbFCOnnC76jATdxrff3IiUAvOAJec6tw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + peerDependencies: + '@babel/core': ^7.11.0 + babel-plugin-istanbul@6.1.1: resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} engines: {node: '>=8'} + babel-plugin-istanbul@7.0.0: + resolution: {integrity: sha512-C5OzENSx/A+gt7t4VH1I2XsflxyPUmXRFPKBxt33xncdOmq7oROVM3bZv9Ysjjkv8OJYDMa+tKuKMvqU/H3xdw==} + engines: {node: '>=12'} + babel-plugin-jest-hoist@29.6.3: resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - babel-plugin-polyfill-corejs2@0.4.11: - resolution: {integrity: sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==} + babel-plugin-jest-hoist@30.0.0: + resolution: {integrity: sha512-DSRm+US/FCB4xPDD6Rnslb6PAF9Bej1DZ+1u4aTiqJnk7ZX12eHsnDiIOqjGvITCq+u6wLqUhgS+faCNbVY8+g==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + babel-plugin-polyfill-corejs2@0.4.13: + resolution: {integrity: sha512-3sX/eOms8kd3q2KZ6DAhKPc0dgm525Gqq5NtWKZ7QYYZEv57OQ54KtblzJzH1lQF/eQxO8KjWGIK9IPUJNus5g==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - babel-plugin-polyfill-corejs3@0.10.6: - resolution: {integrity: sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==} + babel-plugin-polyfill-corejs3@0.11.1: + resolution: {integrity: sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - babel-plugin-polyfill-regenerator@0.6.2: - resolution: {integrity: sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==} + babel-plugin-polyfill-regenerator@0.6.4: + resolution: {integrity: sha512-7gD3pRadPrbjhjLyxebmx/WrFYcuSjZ0XbdUujQMZ/fcE9oeewk2U/7PCvez84UeuK3oSjmPZ0Ch0dlupQvGzw==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - babel-plugin-react-compiler@0.0.0-experimental-fe484b5-20240912: - resolution: {integrity: sha512-iGtEbwQeiLXba8o8ESTjogmQ8rTP6xHi+w3JIxR8HmKAb+SYZ3cljRhpOEsrxZIXuk3L9w9o98BJFIcxaVyFag==} + babel-plugin-react-compiler@0.0.0-experimental-592953e-20240517: + resolution: {integrity: sha512-OjG1SVaeQZaJrqkMFJatg8W/MTow8Ak5rx2SI0ETQBO1XvOk/XZGMbltNCPdFJLKghBYoBjC+Y3Ap/Xr7B01mA==} - babel-plugin-react-native-web@0.19.12: - resolution: {integrity: sha512-eYZ4+P6jNcB37lObWIg0pUbi7+3PKoU1Oie2j0C8UF3cXyXoR74tO2NBjI/FORb2LJyItJZEAmjU5pSaJYEL1w==} + babel-plugin-react-native-web@0.19.13: + resolution: {integrity: sha512-4hHoto6xaN23LCyZgL9LJZc3olmAxd7b6jDzlZnKXAh4rRAbZRKNBJoOOdp46OBqgy+K0t0guTj5/mhA8inymQ==} babel-plugin-syntax-hermes-parser@0.25.1: resolution: {integrity: sha512-IVNpGzboFLfXZUAwkLFcI/bnqVbwky0jP3eBno4HKtqvQJAHBLdgxiG6lQ4to0+Q/YCN3PO0od5NZwIKyY4REQ==} @@ -3479,13 +3499,13 @@ packages: babel-plugin-transform-flow-enums@0.0.2: resolution: {integrity: sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ==} - babel-preset-current-node-syntax@1.0.1: - resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} + babel-preset-current-node-syntax@1.1.0: + resolution: {integrity: sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==} peerDependencies: '@babel/core': ^7.0.0 - babel-preset-expo@11.0.14: - resolution: {integrity: sha512-4BVYR0Sc2sSNxYTiE/OLSnPiOp+weFNy8eV+hX3aD6YAIbBnw+VubKRWqJV/sOJauzOLz0SgYAYyFciYMqizRA==} + babel-preset-expo@11.0.15: + resolution: {integrity: sha512-rgiMTYwqIPULaO7iZdqyL7aAff9QLOX6OWUtLZBlOrOTreGY1yHah/5+l8MvI6NVc/8Zj5LY4Y5uMSnJIuzTLw==} babel-preset-fbjs@3.4.0: resolution: {integrity: sha512-9ywCsCvo1ojrw0b+XYk7aFvTH6D9064t0RIL1rtMf3nsa02Xw41MS7sZw216Im35xj/UY0PDBQsa1brUDDF1Ow==} @@ -3498,6 +3518,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0 + babel-preset-jest@30.0.0: + resolution: {integrity: sha512-hgEuu/W7gk8QOWUA9+m3Zk+WpGvKc1Egp6rFQEfYxEoM9Fk/q8nuTXNL65OkhwGrTApauEGgakOoWVXj+UfhKw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + peerDependencies: + '@babel/core': ^7.11.0 + balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -3534,17 +3560,17 @@ packages: resolution: {integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==} engines: {node: '>=0.6'} - bignumber.js@9.1.2: - resolution: {integrity: sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==} + bignumber.js@9.3.0: + resolution: {integrity: sha512-EM7aMFTXbptt/wZdMlBv2t8IViwQL+h6SLHosp8Yf0dqJMTnY6iL32opnAB6kAdL0SZPuvcAzFr31o0c/R3/RA==} bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} - bn.js@4.12.0: - resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==} + bn.js@4.12.2: + resolution: {integrity: sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==} - bn.js@5.2.1: - resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} + bn.js@5.2.2: + resolution: {integrity: sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==} body-parser@1.20.3: resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==} @@ -3579,14 +3605,11 @@ packages: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} - breakword@1.0.6: - resolution: {integrity: sha512-yjxDAYyK/pBvws9H4xKYpLDpYKEH6CzrBPAuXq3x18I+c/2MkVtT3qAr7Oloi6Dss9qNhPVueAAVU1CSeNDIXw==} - brorand@1.1.0: resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} - browserslist@4.24.2: - resolution: {integrity: sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==} + browserslist@4.25.0: + resolution: {integrity: sha512-PJ8gYKeS5e/whHBh8xrwYK+dAvEj7JXtz6uTucnMRB8OiGTsKccFekoRrjajPBHV8oOY+2tI4uxeceSimKwMFA==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -3622,16 +3645,12 @@ packages: resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} engines: {node: '>=10.16.0'} - bytes@3.0.0: - resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==} - engines: {node: '>= 0.8'} - bytes@3.1.2: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} - cacache@18.0.3: - resolution: {integrity: sha512-qXCd4rh6I07cnDqh8V48/94Tc/WSfj+o3Gn6NZ0aZovS255bUx8O13uKxRFd2eWG0xgsco7+YItQNPaa5E85hg==} + cacache@18.0.4: + resolution: {integrity: sha512-B+L5iIa9mgcjLbliir2th36yEwPftrzteHYujzsx3dFP/31GCHcIeS8f5MGd80odLOjaOvSpU3EEAmRQptkxLQ==} engines: {node: ^16.14.0 || >=18.0.0} cache-content-type@1.0.1: @@ -3650,8 +3669,8 @@ packages: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} - call-bind@1.0.7: - resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} + call-bind@1.0.8: + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} engines: {node: '>= 0.4'} call-bound@1.0.4: @@ -3674,10 +3693,6 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - camelcase-keys@6.2.2: - resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} - engines: {node: '>=8'} - camelcase@5.3.1: resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} engines: {node: '>=6'} @@ -3686,18 +3701,19 @@ packages: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} - caniuse-lite@1.0.30001687: - resolution: {integrity: sha512-0S/FDhf4ZiqrTUiQ39dKeUjYRjkv7lOZU1Dgif2rIqrTzX/1wV2hfKu9TOm1IHkdSijfLswxTFzl/cvir+SLSQ==} + caniuse-lite@1.0.30001721: + resolution: {integrity: sha512-cOuvmUVtKrtEaoKiO0rSc29jcjwMwX5tOHDy4MgVFEWiUXj4uBMJkwI8MDySkgXidpMiHUcviogAvFi4pA2hDQ==} canonicalize@1.0.8: resolution: {integrity: sha512-0CNTVCLZggSh7bc5VkX5WWPWO+cyZbNd07IHIsSXLia/eAq+r836hgk+8BKoEh7949Mda87VUOitx5OddVj64A==} - canonicalize@2.0.0: - resolution: {integrity: sha512-ulDEYPv7asdKvqahuAY35c1selLdzDwHqugK92hfkzvlDCwXRRelDkR+Er33md/PtnpqHemgkuDPanZ4fiYZ8w==} + canonicalize@2.1.0: + resolution: {integrity: sha512-F705O3xrsUtgt98j7leetNhTWPe+5S72rlL5O4jA1pKqBVQ/dT1O1D6PFxmSXvc0SUOinWS57DKx0I3CHrXJHQ==} + hasBin: true - cbor2@1.12.0: - resolution: {integrity: sha512-3Cco8XQhi27DogSp9Ri6LYNZLi/TBY/JVnDe+mj06NkBjW/ZYOtekaEU4wZ4xcRMNrFkDv8KNtOAqHyDfz3lYg==} - engines: {node: '>=18.7'} + cbor2@2.0.1: + resolution: {integrity: sha512-9bE8+tueGxONyxpttNKkAKKcGVtAPeoSJ64AjVTTjEuBOuRaeeP76EN9BbmQqkz1ZeTP0QPvksNBKwvEutIUzQ==} + engines: {node: '>=20'} chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} @@ -3743,8 +3759,12 @@ packages: resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} engines: {node: '>=8'} - cjs-module-lexer@1.3.1: - resolution: {integrity: sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==} + ci-info@4.2.0: + resolution: {integrity: sha512-cYY9mypksY8NRqgDB1XD1RiJL338v/551niynFTGkZOO2LHuB2OmOYxDIe/ttN9AHwrqdum1360G3ald0W9kCg==} + engines: {node: '>=8'} + + cjs-module-lexer@1.4.3: + resolution: {integrity: sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==} class-transformer@0.5.1: resolution: {integrity: sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw==} @@ -3880,8 +3900,8 @@ packages: resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} engines: {node: '>= 0.6'} - compression@1.7.4: - resolution: {integrity: sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==} + compression@1.8.0: + resolution: {integrity: sha512-k6WLKfunuqCYD3t6AsuPGvQWaKwuLLh2/xHNcX4qE+vIfDNXpSqnrhwA7O53R7WVQUnt8dVAIW+YHr7xTgOgGA==} engines: {node: '>= 0.8.0'} concat-map@0.0.1: @@ -3923,8 +3943,8 @@ packages: resolution: {integrity: sha512-TG2hpqe4ELx54QER/S3HQ9SRVnQnGBtKUz5bLQWtYAQ+o6GpgMs6sYUvaiJjVxb+UXwhRhAEP3m7LbsIZ77Hmw==} engines: {node: '>= 0.8'} - core-js-compat@3.39.0: - resolution: {integrity: sha512-VgEUx3VwlExr5no0tXlBt+silBvhTryPwCXRI2Id1PN8WTKu7MreethvddqOubrYxkFdv/RnYrqlv1sFNAUelw==} + core-js-compat@3.43.0: + resolution: {integrity: sha512-2GML2ZsCc5LR7hZYz4AXmjQw8zuy2T//2QntwdnpuYI7jteT6GVYJL7F6C2C57R7gSYrcqVW3lAALefdbhBLDA==} core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} @@ -3954,21 +3974,18 @@ packages: credentials-context@2.0.0: resolution: {integrity: sha512-/mFKax6FK26KjgV2KW2D4YqKgoJ5DVJpNt87X2Jc9IxT2HBMy7nEIlc+n7pEi+YFFe721XqrvZPd+jbyyBjsvQ==} - cross-fetch@3.1.8: - resolution: {integrity: sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==} - - cross-fetch@4.0.0: - resolution: {integrity: sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==} + cross-fetch@3.2.0: + resolution: {integrity: sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==} - cross-spawn@5.1.0: - resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} + cross-fetch@4.1.0: + resolution: {integrity: sha512-uKm5PU+MHTootlWEY+mZ4vvXoCn4fLQxT9dSc1sXVMSFkINTJVN8cAQROpwcKm8bJ/c7rgZVIBWzH5T78sNZZw==} - cross-spawn@6.0.5: - resolution: {integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==} + cross-spawn@6.0.6: + resolution: {integrity: sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==} engines: {node: '>=4.8'} - cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} crypt@0.0.2: @@ -3993,19 +4010,6 @@ packages: resolution: {integrity: sha512-VxBKmeNcqQdiUQUW2Tzq0t377b54N2bMtXO/qiLa+6eRRmmC4qT3D4OnTGoT/U6O9aklQ/jTwbOtRMTTY8G0Ig==} deprecated: This package is no longer supported. It's now a built-in Node module. If you've depended on crypto, you should switch to the one that's built-in. - csv-generate@3.4.3: - resolution: {integrity: sha512-w/T+rqR0vwvHqWs/1ZyMDWtHHSJaN06klRqJXBEpDJaM/+dZkso0OKh1VcuuYvK3XM53KysVNq8Ko/epCK8wOw==} - - csv-parse@4.16.3: - resolution: {integrity: sha512-cO1I/zmz4w2dcKHVvpCr7JVRu8/FymG5OEpmvsZYlccYolPBLoVGKUHgNoc4ZGkFeFlWGEDmMyBM+TTqRdW/wg==} - - csv-stringify@5.6.5: - resolution: {integrity: sha512-PjiQ659aQ+fUTQqSrd1XEDnOr52jh30RBurfzkscaE2tPaFsDH5wOAHJiw8XAHphRknCwMUE9KRayc4K/NbO8A==} - - csv@5.5.3: - resolution: {integrity: sha512-QTaY0XjjhTQOdguARF0lGKm5/mEq9PD9/VhZZegHDIBq2tQwgNpHc3dneD4mGo2iJs+fTKv5Bp0fZ+BRuY3Z0g==} - engines: {node: '>= 0.1.90'} - d@1.0.2: resolution: {integrity: sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==} engines: {node: '>=0.12'} @@ -4021,26 +4025,26 @@ packages: resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} engines: {node: '>= 12'} - data-view-buffer@1.0.1: - resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} + data-view-buffer@1.0.2: + resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} engines: {node: '>= 0.4'} - data-view-byte-length@1.0.1: - resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} + data-view-byte-length@1.0.2: + resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} engines: {node: '>= 0.4'} - data-view-byte-offset@1.0.0: - resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} + data-view-byte-offset@1.0.1: + resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} engines: {node: '>= 0.4'} dateformat@4.6.3: resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==} - dayjs@1.11.11: - resolution: {integrity: sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg==} + dayjs@1.11.13: + resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} - dcql@0.2.20: - resolution: {integrity: sha512-r45vIFfjFcBLWWs2n2MVgVNJne0Rp0FezUD7lPWZ8LFtG/xJdwtGDwRoHp1XqOIFpqJcY1nn1/KW2BxjmDfKBA==} + dcql@0.2.22: + resolution: {integrity: sha512-4CfuUoJ1/dfj4aOMwCGF3HEHsPpRUyALbst5Dx3qcNkIXNFpVqebKVYd58X9/ZlKN/wWJxPS34S7uQ0fcbzS5A==} debug@2.6.9: resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} @@ -4058,8 +4062,8 @@ packages: supports-color: optional: true - debug@4.4.0: - resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + debug@4.4.1: + resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -4067,10 +4071,6 @@ packages: supports-color: optional: true - decamelize-keys@1.1.1: - resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} - engines: {node: '>=0.10.0'} - decamelize@1.2.0: resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} engines: {node: '>=0.10.0'} @@ -4083,8 +4083,8 @@ packages: resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} engines: {node: '>=10'} - dedent@1.5.3: - resolution: {integrity: sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==} + dedent@1.6.0: + resolution: {integrity: sha512-F1Z+5UCFpmQUzJa11agbyPVMbpgT/qA3/SKyJ1jyBgm7dUcUEa8v9JwDkerSQXfakBwFljIxhOJqGkjUwZ9FSA==} peerDependencies: babel-plugin-macros: ^3.1.0 peerDependenciesMeta: @@ -4171,8 +4171,8 @@ packages: engines: {node: '>=0.10'} hasBin: true - detect-libc@2.0.3: - resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} + detect-libc@2.0.4: + resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==} engines: {node: '>=8'} detect-newline@3.1.0: @@ -4182,8 +4182,8 @@ packages: dezalgo@1.0.4: resolution: {integrity: sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==} - did-jwt@8.0.9: - resolution: {integrity: sha512-Tc2wdkGwAyqiL1oYZvdIJ4k/LcrUpJIcXEQNb/yyegY9/CPeeXEbwsgg8BDAaoYdaDFknyFolLZb+Sp9uU1U5w==} + did-jwt@8.0.17: + resolution: {integrity: sha512-qWPog796seH8CzvNShvqvs6YeCRVAYWmKzcPtirnhvH6wjiFvhquztJZwr5E9VHnTosW6V7bclWzrp7/HGJbSw==} did-resolver@4.1.0: resolution: {integrity: sha512-S6fWHvCXkZg2IhS4RcVHxwuyVejPR7c+a4Go0xbQ9ps5kILa8viiYQgrM4gfTyeTjJ0ekgJH9gk/BawTpmkbZA==} @@ -4200,12 +4200,12 @@ packages: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} - dotenv-expand@11.0.6: - resolution: {integrity: sha512-8NHi73otpWsZGBSZwwknTXS5pqMOrk9+Ssrna8xCaxkzEpU9OTf9R5ArQGVw03//Zmk9MOwLPng9WwndvpAJ5g==} + dotenv-expand@11.0.7: + resolution: {integrity: sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==} engines: {node: '>=12'} - dotenv@16.4.5: - resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} + dotenv@16.4.7: + resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} engines: {node: '>=12'} dunder-proto@1.0.1: @@ -4227,8 +4227,13 @@ packages: ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - electron-to-chromium@1.5.71: - resolution: {integrity: sha512-dB68l59BI75W1BUGVTAEJy45CEVuEGy9qPVVQ8pnHyHMn36PLPPoE1mjLH+lo9rKulO3HC2OhbACI/8tCqJBcA==} + ejs@3.1.10: + resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} + engines: {node: '>=0.10.0'} + hasBin: true + + electron-to-chromium@1.5.166: + resolution: {integrity: sha512-QPWqHL0BglzPYyJJ1zSSmwFFL6MFXhbACOCcsCdUMCkzPdS9/OIBVxg516X/Ado2qwAq8k0nJJ7phQPCqiaFAw==} elliptic@6.6.1: resolution: {integrity: sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==} @@ -4262,14 +4267,11 @@ packages: resolution: {integrity: sha512-ObFo8v4rQJAE59M69QzwloxPZtd33TpYEIjtKD1rrFDcM1Gd7IkDxEBU+HriziN6HSHQnBJi8Dmy+JWkav5HKA==} engines: {node: '>=8'} - envinfo@7.13.0: - resolution: {integrity: sha512-cvcaMr7KqXVh4nyzGTVqTum+gAiL265x5jUWQIDLq//zOGbW+gSW/C+OWLleY/rs9Qole6AZLMXPbtIFQbqu+Q==} + envinfo@7.14.0: + resolution: {integrity: sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg==} engines: {node: '>=4'} hasBin: true - eol@0.9.1: - resolution: {integrity: sha512-Ds/TEoZjwggRoz/Q2O7SE3i4Jm66mqTDfmdHdq/7DKVk3bro9Q8h6WdXKdPqFLMoqxrDK5SVRzHVPOS6uuGtrg==} - error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} @@ -4280,12 +4282,8 @@ packages: resolution: {integrity: sha512-rcOwbfvP1WTViVoUjcfZicVzjhjTuhSMntHh6mW3IrEiyE6mJyXvsToJUJGlGlw/2xU9P5whlWNGlIDVeCiT4A==} engines: {node: '>= 0.8'} - es-abstract@1.23.3: - resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} - engines: {node: '>= 0.4'} - - es-define-property@1.0.0: - resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} + es-abstract@1.24.0: + resolution: {integrity: sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==} engines: {node: '>= 0.4'} es-define-property@1.0.1: @@ -4296,23 +4294,16 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - es-object-atoms@1.0.0: - resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} - engines: {node: '>= 0.4'} - es-object-atoms@1.1.1: resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} engines: {node: '>= 0.4'} - es-set-tostringtag@2.0.3: - resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} engines: {node: '>= 0.4'} - es-shim-unscopables@1.0.2: - resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} - - es-to-primitive@1.2.1: - resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + es-to-primitive@1.3.0: + resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} engines: {node: '>= 0.4'} es5-ext@0.10.64: @@ -4326,8 +4317,8 @@ packages: resolution: {integrity: sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==} engines: {node: '>=0.12'} - esbuild@0.23.1: - resolution: {integrity: sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==} + esbuild@0.25.5: + resolution: {integrity: sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==} engines: {node: '>=18'} hasBin: true @@ -4429,8 +4420,8 @@ packages: peerDependencies: expo: '*' - expo-font@12.0.9: - resolution: {integrity: sha512-seTCyf0tbgkAnp3ZI9ZfK9QVtURQUgFnuj+GuJ5TSnN0XsOtVe1s2RxTvmMgkfuvfkzcjJ69gyRpsZS1cC8hjw==} + expo-font@12.0.10: + resolution: {integrity: sha512-Q1i2NuYri3jy32zdnBaHHCya1wH1yMAsI+3CCmj9zlQzlhsS9Bdwcj2W3c5eU5FvH2hsNQy4O+O1NnM6o/pDaQ==} peerDependencies: expo: '*' @@ -4486,8 +4477,8 @@ packages: fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} fast-json-stable-stringify@2.1.0: @@ -4506,12 +4497,15 @@ packages: fast-text-encoding@1.0.6: resolution: {integrity: sha512-VhXlQgj9ioXCqGstD37E/HBeqEGV/qOD/kmbVG8h5xKBYvM1L3lR1Zn4555cQ8GkYbJa8aJSipLPndE1k6zK2w==} - fast-xml-parser@4.4.0: - resolution: {integrity: sha512-kLY3jFlwIYwBNDojclKsNAC12sfD6NwW74QB2CoNGPvtVxjliYehVunB3HYyNi+n4Tt1dAcgwYvmKF/Z18flqg==} + fast-uri@3.0.6: + resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==} + + fast-xml-parser@4.5.3: + resolution: {integrity: sha512-RKihhV+SHsIUGXObeVy9AXiBbFwkVk7Syp8XgwN5U3JV416+Gwp/GO9i0JYKmikykgz/UHRrrV4ROuZEo/T0ig==} hasBin: true - fastq@1.17.1: - resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + fastq@1.19.1: + resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} fb-watchman@2.0.2: resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} @@ -4544,8 +4538,8 @@ packages: fflate@0.8.2: resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} - figlet@1.7.0: - resolution: {integrity: sha512-gO8l3wvqo0V7wEFLXPbkX83b7MVjRrk1oRLfYlZXol8nEpb/ON9pcKLI4qpBv5YtOTfrINtqb7b40iYY2FTWFg==} + figlet@1.8.1: + resolution: {integrity: sha512-kEC3Sme+YvA8Hkibv0NR1oClGcWia0VB2fC1SlMy027cwe795Xx40Xiv/nw/iFAwQLupymWh+uhAAErn/7hwPg==} engines: {node: '>= 0.4.0'} hasBin: true @@ -4557,10 +4551,13 @@ packages: resolution: {integrity: sha512-/yFHK0aGjFEgDJjEKP0pWCplsPFPhwyfwevf/pVxiN0tmE4L9LmwWxWukdJSHdoCli4VgQLehjJtwQBnqmsKcw==} engines: {node: '>=10'} - file-type@20.4.1: - resolution: {integrity: sha512-hw9gNZXUfZ02Jo0uafWLaFVPter5/k2rfcrjFJJHX/77xtSDOfJuEFb6oKlFV86FLP1SuyHMW1PSk0U9M5tKkQ==} + file-type@20.5.0: + resolution: {integrity: sha512-BfHZtG/l9iMm4Ecianu7P8HRD2tBHLtjXinm4X62XBOYzi7CYA7jyqfJzOvXHqzVrVPYqBo2/GvbARMaaJkKVg==} engines: {node: '>=18'} + filelist@1.0.4: + resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} + fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} @@ -4593,9 +4590,6 @@ packages: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} - find-yarn-workspace-root2@1.2.16: - resolution: {integrity: sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==} - find-yarn-workspace-root@2.0.0: resolution: {integrity: sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==} @@ -4605,12 +4599,12 @@ packages: flow-enums-runtime@0.0.6: resolution: {integrity: sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw==} - flow-parser@0.185.2: - resolution: {integrity: sha512-2hJ5ACYeJCzNtiVULov6pljKOLygy0zddoqSI1fFetM+XRPpRshFdGEijtqlamA1XwyZ+7rhryI6FQFzvtLWUQ==} + flow-parser@0.273.0: + resolution: {integrity: sha512-KHe9AJfT0Zn0TpQ2daDFBpwaE0zqjWWiWLOANxzo/U6Xar5fRpU3Lucnk8iMVNitxo9inz2OmSnger70qHmsLw==} engines: {node: '>=0.4.0'} - follow-redirects@1.15.6: - resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} + follow-redirects@1.15.9: + resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} engines: {node: '>=4.0'} peerDependencies: debug: '*' @@ -4621,11 +4615,12 @@ packages: fontfaceobserver@2.3.0: resolution: {integrity: sha512-6FPvD/IVyT4ZlNe7Wcn5Fb/4ChigpucKYSvD6a+0iMoLn2inpo711eyIcKjmDtE5XNcgAkSH9uN/nfAeZzHEfg==} - for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + for-each@0.3.5: + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} - foreground-child@3.2.1: - resolution: {integrity: sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==} + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} forge-light@1.1.4: @@ -4636,12 +4631,12 @@ packages: resolution: {integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==} engines: {node: '>= 14.17'} - form-data@3.0.1: - resolution: {integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==} + form-data@3.0.3: + resolution: {integrity: sha512-q5YBMeWy6E2Un0nMGWMgI65MAKtaylxfNJGJxpGh45YDciZB4epbWpaAfImil6CPAPTYB4sh0URQNDRIZG5F2w==} engines: {node: '>= 6'} - form-data@4.0.0: - resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + form-data@4.0.3: + resolution: {integrity: sha512-qsITQPfmvMOSAdeyZ+12I1c+CKSstAFAwu+97zrnWAbIr5u8wfsExUzCesVLC8NgHuRUqNN4Zy6UPWUTRGslcA==} engines: {node: '>= 6'} format-util@1.0.5: @@ -4651,8 +4646,9 @@ packages: resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} engines: {node: '>=12.20.0'} - formidable@3.5.2: - resolution: {integrity: sha512-Jqc1btCy3QzRbJaICGwKcBfGWuLADRerLzDqi2NwSt/UkXLsHJw2TVResiaoBufHVHy9aSgClOHCeJsSsFLTbg==} + formidable@3.5.4: + resolution: {integrity: sha512-YikH+7CUTOtP44ZTnUhR7Ic2UASBPOqmaRkRKxRbywPTe5VxF7RRCck4af9wutiZ/QKM5nME9Bie2fFaPz5Gug==} + engines: {node: '>=14.0.0'} forwarded@0.2.0: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} @@ -4704,8 +4700,8 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - function.prototype.name@1.1.6: - resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} + function.prototype.name@1.1.8: + resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} engines: {node: '>= 0.4'} functions-have-names@1.2.3: @@ -4724,10 +4720,6 @@ packages: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - get-intrinsic@1.2.4: - resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} - engines: {node: '>= 0.4'} - get-intrinsic@1.3.0: resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} engines: {node: '>= 0.4'} @@ -4736,10 +4728,6 @@ packages: resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} engines: {node: '>=8.0.0'} - get-port@3.2.0: - resolution: {integrity: sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==} - engines: {node: '>=4'} - get-proto@1.0.1: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} @@ -4752,15 +4740,15 @@ packages: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} - get-symbol-description@1.0.2: - resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} + get-symbol-description@1.1.0: + resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} engines: {node: '>= 0.4'} get-symbol-from-current-process-h@1.0.2: resolution: {integrity: sha512-syloC6fsCt62ELLrr1VKBM1ggOpMdetX9hTrdW77UQdcApPHLmf7CI7OKcN1c9kYuNxKcDe4iJ4FY9sX3aw2xw==} - get-tsconfig@4.7.5: - resolution: {integrity: sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw==} + get-tsconfig@4.10.1: + resolution: {integrity: sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==} get-uv-event-loop-napi-h@1.0.6: resolution: {integrity: sha512-t5c9VNR84nRoF+eLiz6wFrEp1SE2Acg0wS+Ysa2zF0eROes+LzOfuTaVHxGy8AbS8rq7FHEJzjnCZo1BupwdJg==} @@ -4776,15 +4764,10 @@ packages: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} - glob@10.4.2: - resolution: {integrity: sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w==} - engines: {node: '>=16 || 14 >=14.18'} + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} hasBin: true - glob@6.0.4: - resolution: {integrity: sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A==} - deprecated: Glob versions prior to v9 are no longer supported - glob@7.1.6: resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==} deprecated: Glob versions prior to v9 are no longer supported @@ -4809,9 +4792,6 @@ packages: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} - gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} - gopd@1.2.0: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} @@ -4823,9 +4803,6 @@ packages: graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - grapheme-splitter@1.0.4: - resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} - graphql-tag@2.12.6: resolution: {integrity: sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg==} engines: {node: '>=10'} @@ -4836,12 +4813,9 @@ packages: resolution: {integrity: sha512-5gghUc24tP9HRznNpV2+FIoq3xKkj5dTQqf4v0CpdPbFVwFkWoxOM+o+2OC9ZSvjEMTjfmG9QT+gcvggTwW1zw==} engines: {node: '>= 10.x'} - hard-rejection@2.1.0: - resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} - engines: {node: '>=6'} - - has-bigints@1.0.2: - resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + has-bigints@1.1.0: + resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} + engines: {node: '>= 0.4'} has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} @@ -4854,12 +4828,8 @@ packages: has-property-descriptors@1.0.2: resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} - has-proto@1.0.3: - resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} - engines: {node: '>= 0.4'} - - has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + has-proto@1.2.0: + resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} engines: {node: '>= 0.4'} has-symbols@1.1.0: @@ -4905,20 +4875,17 @@ packages: resolution: {integrity: sha512-cnN7bQUm65UWOy6cbGcCcZ3rpwW8Q/j4OP5aWRhEry4Z2t2aR1cjrbp0BS+KiBN0smvP1caBgAuxutvyvJILzQ==} engines: {node: '>=8'} - hexoid@2.0.0: - resolution: {integrity: sha512-qlspKUK7IlSQv2o+5I7yhUd7TxlOG2Vr5LTa3ve2XSNVKAL/n/u/7KLvKmFNimomDIKvZFXWHv0T12mv7rT8Aw==} - engines: {node: '>=8'} - hmac-drbg@1.0.1: resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} - hosted-git-info@2.8.9: - resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} - hosted-git-info@3.0.8: resolution: {integrity: sha512-aXpmwoOhRBrw6X3j0h5RloK4x1OzsxMPyxqIHyNfSe2pypkVTZFpEiRoSipPEPlMrh0HW/XsjkJ5WgnCirpNUw==} engines: {node: '>=10'} + hosted-git-info@7.0.2: + resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==} + engines: {node: ^16.14.0 || >=18.0.0} + html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} @@ -4926,8 +4893,8 @@ packages: resolution: {integrity: sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==} engines: {node: '>= 0.8'} - http-cache-semantics@4.1.1: - resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + http-cache-semantics@4.2.0: + resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} http-errors@1.8.1: resolution: {integrity: sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==} @@ -4945,8 +4912,9 @@ packages: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} - human-id@1.0.2: - resolution: {integrity: sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==} + human-id@4.1.1: + resolution: {integrity: sha512-3gKm/gCSUipeLsRYZbbdA1BD83lBoWUkZ7G9VFrhWPAU76KwYo5KR8V28bpoPm/ygy0x5/GCbpRQdY7VLYCoIg==} + hasBin: true human-signals@2.1.0: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} @@ -4963,8 +4931,8 @@ packages: ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - ignore@5.3.1: - resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} image-size@0.6.3: @@ -4972,8 +4940,8 @@ packages: engines: {node: '>=4.0'} hasBin: true - image-size@1.2.0: - resolution: {integrity: sha512-4S8fwbO6w3GeCVN6OPtA9I5IGKkcDMPcKndtUlpJuCwu7JLjtj7JZpwqLuyY2nrmQT3AWsCJLSKPsc2mPBSl3w==} + image-size@1.2.1: + resolution: {integrity: sha512-rH+46sQJ2dlwfjfhCyNx5thzrv+dtmBIhPHk0zgRUukHzZ/kRueTJXoYYsclBaKcSMBWuGbOFXtioLpzTb5euw==} engines: {node: '>=16.x'} hasBin: true @@ -4981,8 +4949,8 @@ packages: resolution: {integrity: sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==} engines: {node: '>=4'} - import-local@3.1.0: - resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} + import-local@3.2.0: + resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==} engines: {node: '>=8'} hasBin: true @@ -5016,8 +4984,8 @@ packages: resolution: {integrity: sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==} engines: {node: '>=6'} - internal-slot@1.0.7: - resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} + internal-slot@1.1.0: + resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} engines: {node: '>= 0.4'} invariant@2.2.4: @@ -5035,26 +5003,27 @@ packages: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} - ipaddr.js@2.2.0: - resolution: {integrity: sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==} - engines: {node: '>= 10'} - is-arguments@1.2.0: resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==} engines: {node: '>= 0.4'} - is-array-buffer@3.0.4: - resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} + is-array-buffer@3.0.5: + resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} engines: {node: '>= 0.4'} is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - is-bigint@1.0.4: - resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + is-async-function@2.1.1: + resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} + engines: {node: '>= 0.4'} + + is-bigint@1.1.0: + resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} + engines: {node: '>= 0.4'} - is-boolean-object@1.1.2: - resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + is-boolean-object@1.2.2: + resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} engines: {node: '>= 0.4'} is-buffer@1.1.6: @@ -5064,15 +5033,16 @@ packages: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} - is-core-module@2.13.1: - resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} - is-data-view@1.0.1: - resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} + is-data-view@1.0.2: + resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} engines: {node: '>= 0.4'} - is-date-object@1.0.5: - resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + is-date-object@1.1.0: + resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} engines: {node: '>= 0.4'} is-directory@0.3.1: @@ -5092,6 +5062,10 @@ packages: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} + is-finalizationregistry@1.1.1: + resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} + engines: {node: '>= 0.4'} + is-fullwidth-code-point@2.0.0: resolution: {integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==} engines: {node: '>=4'} @@ -5104,8 +5078,8 @@ packages: resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} engines: {node: '>=6'} - is-generator-function@1.0.10: - resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} + is-generator-function@1.1.0: + resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} engines: {node: '>= 0.4'} is-glob@2.0.1: @@ -5124,6 +5098,10 @@ packages: resolution: {integrity: sha512-aZMG0T3F34mTg4eTdszcGXx54oiZ4NtHSft3hWNJMGJXUUqdIj3cOZuHcU0nCWWcY3jd7yRe/3AEm3vSNTpBGQ==} engines: {node: '>=0.10.0'} + is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} + is-negative-zero@2.0.3: resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} engines: {node: '>= 0.4'} @@ -5131,8 +5109,8 @@ packages: is-node-process@1.2.0: resolution: {integrity: sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==} - is-number-object@1.0.7: - resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + is-number-object@1.1.1: + resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} engines: {node: '>= 0.4'} is-number@7.0.0: @@ -5147,20 +5125,20 @@ packages: resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} engines: {node: '>=8'} - is-plain-obj@1.1.0: - resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} - engines: {node: '>=0.10.0'} - is-plain-object@2.0.4: resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} engines: {node: '>=0.10.0'} - is-regex@1.1.4: - resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} engines: {node: '>= 0.4'} - is-shared-array-buffer@1.0.3: - resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} + is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} + + is-shared-array-buffer@1.0.4: + resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} engines: {node: '>= 0.4'} is-stream@1.1.0: @@ -5171,20 +5149,20 @@ packages: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} - is-string@1.0.7: - resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + is-string@1.1.1: + resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} engines: {node: '>= 0.4'} is-subdir@1.2.0: resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} engines: {node: '>=4'} - is-symbol@1.0.4: - resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + is-symbol@1.1.1: + resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} engines: {node: '>= 0.4'} - is-typed-array@1.1.13: - resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} + is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} engines: {node: '>= 0.4'} is-unicode-supported@0.1.0: @@ -5195,8 +5173,17 @@ packages: resolution: {integrity: sha512-+kwPrVDu9Ms03L90Qaml+79+6DZHqHyRoANI6IsZJ/g8frhnfchDOBCa0RbQ6/kdHt5CS5OeIEyrYznNuVN+8A==} engines: {node: '>=0.10.0'} - is-weakref@1.0.2: - resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} + + is-weakref@1.1.1: + resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} + engines: {node: '>= 0.4'} + + is-weakset@2.0.4: + resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} + engines: {node: '>= 0.4'} is-windows@1.0.2: resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} @@ -5243,8 +5230,8 @@ packages: resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} engines: {node: '>=8'} - istanbul-lib-instrument@6.0.2: - resolution: {integrity: sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw==} + istanbul-lib-instrument@6.0.3: + resolution: {integrity: sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==} engines: {node: '>=10'} istanbul-lib-report@3.0.1: @@ -5259,9 +5246,13 @@ packages: resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} engines: {node: '>=8'} - jackspeak@3.4.0: - resolution: {integrity: sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==} - engines: {node: '>=14'} + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + jake@10.9.2: + resolution: {integrity: sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==} + engines: {node: '>=10'} + hasBin: true jest-changed-files@29.7.0: resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==} @@ -5321,6 +5312,10 @@ packages: resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-haste-map@30.0.0: + resolution: {integrity: sha512-p4bXAhXTawTsADgQgTpbymdLaTyPW1xWNu1oIGG7/N3LIAbZVkH2JMJqS8/IUcnGR8Kc7WFE+vWbJvsqGCWZXw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-leak-detector@29.7.0: resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -5354,6 +5349,10 @@ packages: resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-regex-util@30.0.0: + resolution: {integrity: sha512-rT84010qRu/5OOU7a9TeidC2Tp3Qgt9Sty4pOZ/VSDuEmRupIjKZAb53gU3jr4ooMlhwScrgC9UixJxWzVu9oQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-resolve-dependencies@29.7.0: resolution: {integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -5386,6 +5385,10 @@ packages: resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-util@30.0.0: + resolution: {integrity: sha512-fhNBBM9uSUbd4Lzsf8l/kcAdaHD/4SgoI48en3HXcBEMwKwoleKFMZ6cYEYs21SB779PRuRCyNLmymApAm8tZw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-validate@26.6.2: resolution: {integrity: sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ==} engines: {node: '>= 10.14.2'} @@ -5406,6 +5409,10 @@ packages: resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-worker@30.0.0: + resolution: {integrity: sha512-VZvxfWIybIvwK8N/Bsfe43LfQgd/rD0c4h5nLUx78CAqPxIQcW2qDjsVAC53iUR8yxzFIeCFFvWOh8en8hGzdg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest@29.7.0: resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -5419,14 +5426,14 @@ packages: jimp-compact@0.16.1: resolution: {integrity: sha512-dZ6Ra7u1G8c4Letq/B5EzAxj4tLFHL+cGtdpR+PVm4yzPDj+lCk+AbivWt1eOM+ikzkowtyV7qSqX6qr3t71Ww==} - joi@17.13.1: - resolution: {integrity: sha512-vaBlIKCyo4FCUtCm7Eu4QZd/q02bWcxfUO6YSXAZOWF6gzcLBeba8kwotUdYJjDLW8Cz8RywsSOqiNJZW0mNvg==} + joi@17.13.3: + resolution: {integrity: sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==} join-component@1.1.0: resolution: {integrity: sha512-bF7vcQxbODoGK1imE2P9GS9aw4zD0Sd+Hni68IMZLj7zRnquH7dXUmMw9hDI5S/Jzt7q+IyTXN0rSg2GI0IKhQ==} - jose@5.9.6: - resolution: {integrity: sha512-AMlnetc9+CV9asI19zHmrgS/WYsWUwCn2R7RzlbJWD7F9eWYUTGyBmU9o6PxngtLGOiDGPRu+Uc4fhKzbpteZQ==} + jose@5.10.0: + resolution: {integrity: sha512-s+3Al/p9g32Iq+oqXxkW//7jk2Vig6FF1CFqzVXoTUXt2qz89YWbL+OwS17NFYEvxC35n0FKeGO2LGYSxeM2Gg==} joycon@3.1.1: resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} @@ -5458,8 +5465,8 @@ packages: peerDependencies: '@babel/preset-env': ^7.1.6 - jscodeshift@17.2.0: - resolution: {integrity: sha512-ZQeKdRmrUhk3vmESbWCUch6BQIngO6Sx6mgLJsR8QD9kqY0xyN9J8Vzkee4tULjekBnV9SiKf9m8ybNURh9s+g==} + jscodeshift@17.3.0: + resolution: {integrity: sha512-LjFrGOIORqXBU+jwfC9nbkjmQfFldtMIoS6d9z2LG/lkmyNXsJAySPT+2SWXJEoE68/bCWcxKpXH37npftgmow==} engines: {node: '>=16'} hasBin: true peerDependencies: @@ -5517,12 +5524,12 @@ packages: jsonfile@6.1.0: resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} - jsonld-signatures@11.2.1: - resolution: {integrity: sha512-RNaHTEeRrX0jWeidPCwxMq/E/Ze94zFyEZz/v267ObbCHQlXhPO7GtkY6N5PSHQfQhZPXa8NlMBg5LiDF4dNbA==} - engines: {node: '>=14'} + jsonld-signatures@11.5.0: + resolution: {integrity: sha512-Kdto+e8uvY/5u3HYkmAbpy52bplWX9uqS8fmqdCv6oxnCFwCTM0hMt6r4rWqlhw5/aHoCHJIRxwYb4QKGC69Jw==} + engines: {node: '>=18'} - jsonld@8.3.2: - resolution: {integrity: sha512-MwBbq95szLwt8eVQ1Bcfwmgju/Y5P2GdtlHE2ncyfuYjIdEhluUVyj1eudacf1mOkWIoS9GpDBTECqhmq7EOaA==} + jsonld@8.3.3: + resolution: {integrity: sha512-9YcilrF+dLfg9NTEof/mJLMtbdX1RJ8dbWtJgE00cMOIohb1lIyJl710vFiTaiHTl6ZYODJuBd32xFvUhmv3kg==} engines: {node: '>=14'} jwt-decode@3.1.2: @@ -5547,10 +5554,6 @@ packages: resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} engines: {node: '>=6'} - kleur@4.1.5: - resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} - engines: {node: '>=6'} - koa-compose@4.1.0: resolution: {integrity: sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==} @@ -5558,8 +5561,8 @@ packages: resolution: {integrity: sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA==} engines: {node: '>= 10'} - koa@2.16.0: - resolution: {integrity: sha512-Afhqq0Vq3W7C+/rW6IqHVBDLzqObwZ07JaUNUEF8yCQ6afiyFE3RAy+i7V0E46XOWlH7vPWn/x0vsZwNy6PWxw==} + koa@2.16.1: + resolution: {integrity: sha512-umfX9d3iuSxTQP4pnzLOz0HKnPg0FaUUIKcye2lOiz3KPu1Y3M3xlz76dISdFPQs37P9eJz1wUpcTS6KDPn9fA==} engines: {node: ^4.8.4 || ^6.10.1 || ^7.10.1 || >= 8.1.4} ky-universal@0.11.0: @@ -5598,8 +5601,8 @@ packages: resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} engines: {node: '>= 0.8.0'} - libphonenumber-js@1.11.3: - resolution: {integrity: sha512-RU0CTsLCu2v6VEzdP+W6UU2n5+jEpMDRkGxUeBgsAJgre3vKgm17eApISH9OQY4G0jZYJVIc8qXmz6CJFueAFg==} + libphonenumber-js@1.12.9: + resolution: {integrity: sha512-VWwAdNeJgN7jFOD+wN4qx83DTPMVPPAUyx9/TUkBXKLiNkuWWk6anV0439tgdtwaJDrEdqkvdN22iA6J4bUCZg==} libsodium-sumo@0.7.15: resolution: {integrity: sha512-5tPmqPmq8T8Nikpm1Nqj0hBHvsLFCXvdhBFV7SGOitQPZAA6jso8XoL0r4L7vmfKXr486fiQInvErHtEvizFMw==} @@ -5607,11 +5610,11 @@ packages: libsodium-wrappers-sumo@0.7.15: resolution: {integrity: sha512-aSWY8wKDZh5TC7rMvEdTHoyppVq/1dTSAeAR7H6pzd6QRT3vQWcT5pGwCotLcpPEOLXX6VvqihSPkpEhYAjANA==} - libsodium-wrappers@0.7.13: - resolution: {integrity: sha512-kasvDsEi/r1fMzKouIDv7B8I6vNmknXwGiYodErGuESoFTohGSKZplFtVxZqHaoQ217AynyIFgnOVRitpHs0Qw==} + libsodium-wrappers@0.7.15: + resolution: {integrity: sha512-E4anqJQwcfiC6+Yrl01C1m8p99wEhLmJSs0VQqST66SbQXXBoaJY0pF4BNjRYa/sOQAxx6lXAaAFIlx+15tXJQ==} - libsodium@0.7.13: - resolution: {integrity: sha512-mK8ju0fnrKXXfleL53vtp9xiPq5hKM0zbDQtcxQIsSmxNgSxqCj6R7Hl9PkrNe2j29T4yoDaF7DJLK9/i5iWUw==} + libsodium@0.7.15: + resolution: {integrity: sha512-sZwRknt/tUpE2AwzHq3jEyUU5uvIZHtSssktXq7owd++3CSgn8RGrv6UZJJBpP7+iBghBqe7Z06/2M31rI2NKw==} lighthouse-logger@1.4.2: resolution: {integrity: sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==} @@ -5671,10 +5674,6 @@ packages: lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - load-yaml-file@0.2.0: - resolution: {integrity: sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==} - engines: {node: '>=6'} - locate-path@3.0.0: resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} engines: {node: '>=6'} @@ -5729,11 +5728,8 @@ packages: long@4.0.0: resolution: {integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==} - long@5.2.3: - resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==} - - long@5.3.1: - resolution: {integrity: sha512-ka87Jz3gcx/I7Hal94xaN2tZEOPoUOEVftkQqZx2EeQRN7LGdfLlI3FvZ+7WDplm+vK2Urx9ULrvSowtdCieng==} + long@5.3.2: + resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==} loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} @@ -5743,12 +5739,8 @@ packages: resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - lru-cache@10.2.2: - resolution: {integrity: sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==} - engines: {node: 14 || >=16.14} - - lru-cache@4.1.5: - resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} @@ -5760,8 +5752,8 @@ packages: lru_map@0.4.1: resolution: {integrity: sha512-I+lBvqMMFfqaV8CJCISjI3wbjmwVu/VyOoU7+qtu9d7ioW5klMgsTTiUOUp+DJvfTTzKXoPbyC6YfgkNcyPSOg==} - luxon@3.5.0: - resolution: {integrity: sha512-rh+Zjr6DNfUYR3bPwJEnuwDdqMbxZW7LOQfUN4B54+Cl+0o5zaU9RJ6bcidfDtC1cWCZXQ+nvX8bf6bAji37QQ==} + luxon@3.6.1: + resolution: {integrity: sha512-tJLxrKJhO2ukZ5z0gyjY1zPh3Rh88Ej9P7jNrZiHMUXHae1yvI2imgOZtL1TO8TW6biMMKfTtAOoEJANgtWBMQ==} engines: {node: '>=12'} make-dir@2.1.0: @@ -5782,16 +5774,8 @@ packages: makeerror@1.0.12: resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} - map-obj@1.0.1: - resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} - engines: {node: '>=0.10.0'} - - map-obj@4.3.0: - resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} - engines: {node: '>=8'} - - marky@1.2.5: - resolution: {integrity: sha512-q9JtQJKjpsVxCRVgQ+WapguSbKC3SQ5HEzFGPAJMStgh3QjCawp00UKv3MTTAArTmGmmPUvllHZoNbZ3gs0I+Q==} + marky@1.3.0: + resolution: {integrity: sha512-ocnPZQLNpvbedwTy9kNrQEsknEfgvcLMvOtz3sFeWApDq1MXH1TqkCIx58xlpESsfwQOnuBO9beyQuNGzVvuhQ==} math-intrinsics@1.1.0: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} @@ -5821,10 +5805,6 @@ packages: memory-cache@0.2.0: resolution: {integrity: sha512-OcjA+jzjOYzKmKS6IQVALHLVz+rNTMPoJvCztFaZxwG14wtAW7VRZjwTQu06vKCYOxh4jVnik7ya0SXTB0W+xA==} - meow@6.1.1: - resolution: {integrity: sha512-3YffViIt2QWgTy6Pale5QpopX/IvU3LPL03jOTqp6pGj3VjesdO/U8CuHMKpnQr4shCNCM5fd5XFFvIIl6JBHg==} - engines: {node: '>=8'} - merge-descriptors@1.0.3: resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} @@ -5842,43 +5822,43 @@ packages: metro-babel-transformer@0.73.10: resolution: {integrity: sha512-Yv2myTSnpzt/lTyurLvqYbBkytvUJcLHN8XD3t7W6rGiLTQPzmf1zypHQLphvcAXtCWBOXFtH7KLOSi2/qMg+A==} - metro-babel-transformer@0.81.4: - resolution: {integrity: sha512-WW0yswWrW+eTVK9sYD+b1HwWOiUlZlUoomiw9TIOk0C+dh2V90Wttn/8g62kYi0Y4i+cJfISerB2LbV4nuRGTA==} + metro-babel-transformer@0.81.5: + resolution: {integrity: sha512-oKCQuajU5srm+ZdDcFg86pG/U8hkSjBlkyFjz380SZ4TTIiI5F+OQB830i53D8hmqmcosa4wR/pnKv8y4Q3dLw==} engines: {node: '>=18.18'} metro-cache-key@0.73.10: resolution: {integrity: sha512-JMVDl/EREDiUW//cIcUzRjKSwE2AFxVWk47cFBer+KA4ohXIG2CQPEquT56hOw1Y1s6gKNxxs1OlAOEsubrFjw==} - metro-cache-key@0.81.4: - resolution: {integrity: sha512-3SaWQybvf1ivasjBegIxzVKLJzOpcz+KsnGwXFOYADQq0VN4cnM7tT+u2jkOhk6yJiiO1WIjl68hqyMOQJRRLg==} + metro-cache-key@0.81.5: + resolution: {integrity: sha512-lGWnGVm1UwO8faRZ+LXQUesZSmP1LOg14OVR+KNPBip8kbMECbQJ8c10nGesw28uQT7AE0lwQThZPXlxDyCLKQ==} engines: {node: '>=18.18'} metro-cache@0.73.10: resolution: {integrity: sha512-wPGlQZpdVlM404m7MxJqJ+hTReDr5epvfPbt2LerUAHY9RN99w61FeeAe25BMZBwgUgDtAsfGlJ51MBHg8MAqw==} - metro-cache@0.81.4: - resolution: {integrity: sha512-sxCPH3gowDxazSaZZrwdNPEpnxR8UeXDnvPjBF9+5btDBNN2DpWvDAXPvrohkYkFImhc0LajS2V7eOXvu9PnvQ==} + metro-cache@0.81.5: + resolution: {integrity: sha512-wOsXuEgmZMZ5DMPoz1pEDerjJ11AuMy9JifH4yNW7NmWS0ghCRqvDxk13LsElzLshey8C+my/tmXauXZ3OqZgg==} engines: {node: '>=18.18'} metro-config@0.73.10: resolution: {integrity: sha512-wIlybd1Z9I8K2KcStTiJxTB7OK529dxFgogNpKCTU/3DxkgAASqSkgXnZP6kVyqjh5EOWAKFe5U6IPic7kXDdQ==} - metro-config@0.81.4: - resolution: {integrity: sha512-QnhMy3bRiuimCTy7oi5Ug60javrSa3lPh0gpMAspQZHY9h6y86jwHtZPLtlj8hdWQESIlrbeL8inMSF6qI/i9Q==} + metro-config@0.81.5: + resolution: {integrity: sha512-oDRAzUvj6RNRxratFdcVAqtAsg+T3qcKrGdqGZFUdwzlFJdHGR9Z413sW583uD2ynsuOjA2QB6US8FdwiBdNKg==} engines: {node: '>=18.18'} metro-core@0.73.10: resolution: {integrity: sha512-5uYkajIxKyL6W45iz/ftNnYPe1l92CvF2QJeon1CHsMXkEiOJxEjo41l+iSnO/YodBGrmMCyupSO4wOQGUc0lw==} - metro-core@0.81.4: - resolution: {integrity: sha512-GdL4IgmgJhrMA/rTy2lRqXKeXfC77Rg+uvhUEkbhyfj/oz7PrdSgvIFzziapjdHwk1XYq0KyFh/CcVm8ZawG6A==} + metro-core@0.81.5: + resolution: {integrity: sha512-+2R0c8ByfV2N7CH5wpdIajCWa8escUFd8TukfoXyBq/vb6yTCsznoA25FhNXJ+MC/cz1L447Zj3vdUfCXIZBwg==} engines: {node: '>=18.18'} metro-file-map@0.73.10: resolution: {integrity: sha512-XOMWAybeaXyD6zmVZPnoCCL2oO3rp4ta76oUlqWP0skBzhFxVtkE/UtDwApEMUY361JeBBago647gnKiARs+1g==} - metro-file-map@0.81.4: - resolution: {integrity: sha512-qUIBzkiqOi3qEuscu4cJ83OYQ4hVzjON19FAySWqYys9GKCmxlKa7LkmwqdpBso6lQl+JXZ7nCacX90w5wQvPA==} + metro-file-map@0.81.5: + resolution: {integrity: sha512-mW1PKyiO3qZvjeeVjj1brhkmIotObA3/9jdbY1fQQYvEWM6Ml7bN/oJCRDGn2+bJRlG+J8pwyJ+DgdrM4BsKyg==} engines: {node: '>=18.18'} metro-hermes-compiler@0.73.10: @@ -5891,8 +5871,8 @@ packages: metro-minify-terser@0.73.10: resolution: {integrity: sha512-uG7TSKQ/i0p9kM1qXrwbmY3v+6BrMItsOcEXcSP8Z+68bb+t9HeVK0T/hIfUu1v1PEnonhkhfzVsaP8QyTd5lQ==} - metro-minify-terser@0.81.4: - resolution: {integrity: sha512-oVvq/AGvqmbhuijJDZZ9npeWzaVyeBwQKtdlnjcQ9fH7nR15RiBr5y2zTdgTEdynqOIb1Kc16l8CQIUSzOWVFA==} + metro-minify-terser@0.81.5: + resolution: {integrity: sha512-/mn4AxjANnsSS3/Bb+zA1G5yIS5xygbbz/OuPaJYs0CPcZCaWt66D+65j4Ft/nJkffUxcwE9mk4ubpkl3rjgtw==} engines: {node: '>=18.18'} metro-minify-uglify@0.73.10: @@ -5911,22 +5891,22 @@ packages: metro-resolver@0.73.10: resolution: {integrity: sha512-HeXbs+0wjakaaVQ5BI7eT7uqxlZTc9rnyw6cdBWWMgUWB++KpoI0Ge7Hi6eQAOoVAzXC3m26mPFYLejpzTWjng==} - metro-resolver@0.81.4: - resolution: {integrity: sha512-Ng7G2mXjSExMeRzj6GC19G6IJ0mfIbOLgjArsMWJgtt9ViZiluCwgWsMW9juBC5NSwjJxUMK2x6pC5NIMFLiHA==} + metro-resolver@0.81.5: + resolution: {integrity: sha512-6BX8Nq3g3go3FxcyXkVbWe7IgctjDTk6D9flq+P201DfHHQ28J+DWFpVelFcrNTn4tIfbP/Bw7u/0g2BGmeXfQ==} engines: {node: '>=18.18'} metro-runtime@0.73.10: resolution: {integrity: sha512-EpVKm4eN0Fgx2PEWpJ5NiMArV8zVoOin866jIIvzFLpmkZz1UEqgjf2JAfUJnjgv3fjSV3JqeGG2vZCaGQBTow==} - metro-runtime@0.81.4: - resolution: {integrity: sha512-fBoRgqkF69CwyPtBNxlDi5ha26Zc8f85n2THXYoh13Jn/Bkg8KIDCdKPp/A1BbSeNnkH/++H2EIIfnmaff4uRg==} + metro-runtime@0.81.5: + resolution: {integrity: sha512-M/Gf71ictUKP9+77dV/y8XlAWg7xl76uhU7ggYFUwEdOHHWPG6gLBr1iiK0BmTjPFH8yRo/xyqMli4s3oGorPQ==} engines: {node: '>=18.18'} metro-source-map@0.73.10: resolution: {integrity: sha512-NAGv14701p/YaFZ76KzyPkacBw/QlEJF1f8elfs23N1tC33YyKLDKvPAzFJiYqjdcFvuuuDCA8JCXd2TgLxNPw==} - metro-source-map@0.81.4: - resolution: {integrity: sha512-IOwVQ7mLqoqvsL70RZtl1EyE3f9jp43kVsAsb/B/zoWmu0/k4mwEhGLTxmjdXRkLJqPqPrh7WmFChAEf9trW4Q==} + metro-source-map@0.81.5: + resolution: {integrity: sha512-Jz+CjvCKLNbJZYJTBeN3Kq9kIJf6b61MoLBdaOQZJ5Ajhw6Pf95Nn21XwA8BwfUYgajsi6IXsp/dTZsYJbN00Q==} engines: {node: '>=18.18'} metro-symbolicate@0.73.10: @@ -5934,42 +5914,46 @@ packages: engines: {node: '>=8.3'} hasBin: true - metro-symbolicate@0.81.4: - resolution: {integrity: sha512-rWxTmYVN6/BOSaMDUHT8HgCuRf6acd0AjHkenYlHpmgxg7dqdnAG1hLq999q2XpW5rX+cMamZD5W5Ez2LqGaag==} + metro-symbolicate@0.81.5: + resolution: {integrity: sha512-X3HV3n3D6FuTE11UWFICqHbFMdTavfO48nXsSpnNGFkUZBexffu0Xd+fYKp+DJLNaQr3S+lAs8q9CgtDTlRRuA==} engines: {node: '>=18.18'} hasBin: true metro-transform-plugins@0.73.10: resolution: {integrity: sha512-D4AgD3Vsrac+4YksaPmxs/0ocT67bvwTkFSIgWWeDvWwIG0U1iHzTS9f8Bvb4PITnXryDoFtjI6OWF7uOpGxpA==} - metro-transform-plugins@0.81.4: - resolution: {integrity: sha512-nlP069nDXm4v28vbll4QLApAlvVtlB66rP6h+ml8Q/CCQCPBXu2JLaoxUmkIOJQjLhMRUcgTyQHq+TXWJhydOQ==} + metro-transform-plugins@0.81.5: + resolution: {integrity: sha512-MmHhVx/1dJC94FN7m3oHgv5uOjKH8EX8pBeu1pnPMxbJrx6ZuIejO0k84zTSaQTZ8RxX1wqwzWBpXAWPjEX8mA==} engines: {node: '>=18.18'} metro-transform-worker@0.73.10: resolution: {integrity: sha512-IySvVubudFxahxOljWtP0QIMMpgUrCP0bW16cz2Enof0PdumwmR7uU3dTbNq6S+XTzuMHR+076aIe4VhPAWsIQ==} - metro-transform-worker@0.81.4: - resolution: {integrity: sha512-lKAeRZ8EUMtx2cA/Y4KvICr9bIr5SE03iK3lm+l9wyn2lkjLUuPjYVep159inLeDqC6AtSubsA8MZLziP7c03g==} + metro-transform-worker@0.81.5: + resolution: {integrity: sha512-lUFyWVHa7lZFRSLJEv+m4jH8WrR5gU7VIjUlg4XmxQfV8ngY4V10ARKynLhMYPeQGl7Qvf+Ayg0eCZ272YZ4Mg==} engines: {node: '>=18.18'} metro@0.73.10: resolution: {integrity: sha512-J2gBhNHFtc/Z48ysF0B/bfTwUwaRDLjNv7egfhQCc+934dpXcjJG2KZFeuybF+CvA9vo4QUi56G2U+RSAJ5tsA==} hasBin: true - metro@0.81.4: - resolution: {integrity: sha512-78f0aBNPuwXW7GFnSc+Y0vZhbuQorXxdgqQfvSRqcSizqwg9cwF27I05h47tL8AzQcizS1JZncvq4xf5u/Qykw==} + metro@0.81.5: + resolution: {integrity: sha512-YpFF0DDDpDVygeca2mAn7K0+us+XKmiGk4rIYMz/CRdjFoCGqAei/IQSpV0UrGfQbToSugpMQeQJveaWSH88Hg==} engines: {node: '>=18.18'} hasBin: true - micromatch@4.0.7: - resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} mime-db@1.52.0: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} + mime-db@1.54.0: + resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} + engines: {node: '>= 0.6'} + mime-types@2.1.35: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} @@ -6000,10 +5984,6 @@ packages: resolution: {integrity: sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - min-indent@1.0.1: - resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} - engines: {node: '>=4'} - minimalistic-assert@1.0.1: resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} @@ -6013,18 +5993,18 @@ packages: minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + minimatch@8.0.4: resolution: {integrity: sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==} engines: {node: '>=16 || 14 >=14.17'} - minimatch@9.0.4: - resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} - minimist-options@4.1.0: - resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} - engines: {node: '>= 6'} - minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} @@ -6060,14 +6040,10 @@ packages: resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} engines: {node: '>= 8'} - minizlib@3.0.1: - resolution: {integrity: sha512-umcy022ILvb5/3Djuu8LWeqUa8D68JaBzlttKeMWen48SjabqS3iY5w/vzeMzMUNhLDifyhbOwKDSznB1vvrwg==} + minizlib@3.0.2: + resolution: {integrity: sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==} engines: {node: '>= 18'} - mixme@0.5.10: - resolution: {integrity: sha512-5H76ANWinB1H3twpJ6JY8uvAtpmFvHNArpilJAjXRKXSDDLPIMoZArw5SH0q9z+lLs8IrMw7Q2VWpWimFKFT1Q==} - engines: {node: '>= 8.0.0'} - mkdirp-classic@0.5.3: resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} @@ -6085,6 +6061,10 @@ packages: engines: {node: '>=10'} hasBin: true + mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + ms@2.0.0: resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} @@ -6094,17 +6074,18 @@ packages: msrcrypto@1.5.8: resolution: {integrity: sha512-ujZ0TRuozHKKm6eGbKHfXef7f+esIhEckmThVnz7RNyiOJd7a6MXj2JGBoL9cnPDW+JMG16MoTUh5X+XXjI66Q==} - multer@1.4.5-lts.1: - resolution: {integrity: sha512-ywPWvcDMeH+z9gQq5qYHCCy+ethsk4goepZ45GLD63fOu0YcNecQxi64nDs3qluZB+murG3/D4dJ7+dGctcCQQ==} + multer@1.4.5-lts.2: + resolution: {integrity: sha512-VzGiVigcG9zUAoCNU+xShztrlr1auZOlurXynNvO9GiWD1/mTBbUljOKY+qMeazBqXgRnjzeEgJI/wyjJUHg9A==} engines: {node: '>= 6.0.0'} + deprecated: Multer 1.x is impacted by a number of vulnerabilities, which have been patched in 2.x. You should upgrade to the latest 2.x version. multibase@4.0.6: resolution: {integrity: sha512-x23pDe5+svdLz/k5JPGCVdfn7Q5mZVMBETiC+ORfO+sor9Sgs0smJzAjfTbM5tckeCqnaUuMYoz+k3RXMmJClQ==} engines: {node: '>=12.0.0', npm: '>=6.0.0'} deprecated: This module has been superseded by the multiformats module - multiformats@13.3.2: - resolution: {integrity: sha512-qbB0CQDt3QKfiAzZ5ZYjLFOs+zW43vA4uyM8g27PeEuXZybUOFyjrVdP93HPBHMoglibwfkdVwbzfUq8qGcH6g==} + multiformats@13.3.7: + resolution: {integrity: sha512-meL9DERHj+fFVWoOX9fXqfcYcSpUfSYJPcFvDPKrxitICbwAoWR+Ut4j5NO9zAT917HUHLQmqzQbAsGNHlDcxQ==} multiformats@9.9.0: resolution: {integrity: sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==} @@ -6112,20 +6093,16 @@ packages: mute-stream@0.0.8: resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} - mv@2.1.1: - resolution: {integrity: sha512-at/ZndSy3xEGJ8i0ygALh8ru9qy7gWW1cmkaqBN29JmMlIvM//MEO9y1sk/avxuwnPcfhkejkLsuPxH81BrkSg==} - engines: {node: '>=0.8.0'} - mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} - nanoid@3.3.7: - resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - nanoid@5.0.9: - resolution: {integrity: sha512-Aooyr6MXU6HpvvWXKoVoXwKMs/KyVakWwg7xQfv5/S/RIgJMy0Ifa45H9qqYy7pTCszrHzP21Uk4PZq2HpEM8Q==} + nanoid@5.1.5: + resolution: {integrity: sha512-Ir/+ZpE9fDsNH0hQ3C68uyThDXzYcim2EqcZ8zn8Chtt1iylPT9xXJB0kPCnqzgcEGikO9RxSrh63MsmVCU7Fw==} engines: {node: ^18 || >=20} hasBin: true @@ -6135,14 +6112,14 @@ packages: natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - ncp@2.0.0: - resolution: {integrity: sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA==} - hasBin: true - negotiator@0.6.3: resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} engines: {node: '>= 0.6'} + negotiator@0.6.4: + resolution: {integrity: sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==} + engines: {node: '>= 0.6'} + neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} @@ -6159,9 +6136,9 @@ packages: resolution: {integrity: sha512-WDD0bdg9mbq6F4mRxEYcPWwfA1vxd0mrvKOyxI7Xj/atfRHVeutzuWByG//jfm4uPzp0y4Kj051EORCBSQMycw==} engines: {node: '>=12.0.0'} - nock@14.0.0-beta.19: - resolution: {integrity: sha512-xqWQQZ/Hv01tj5uL7BE4j752hhB2MHP7aaEcTp/iDT1EHsh3TYZOIx4HHFL81yRc8KFx4pqb2P2OtuxKShKhjw==} - engines: {node: '>= 18'} + nock@14.0.5: + resolution: {integrity: sha512-R49fALR9caB6vxuSWUIaK2eBYeTloZQUFBZ4rHO+TbhMGQHtwnhdqKLYki+o+8qMgLvoBYWrp/2KzGPhxL4S6w==} + engines: {node: '>=18.20.0 <20 || >=20.12.1'} node-abi@3.75.0: resolution: {integrity: sha512-OhYaY5sDsIka7H7AtijtI9jwGYLyl29eQn/W623DiN/MIv5sUqc4g7BIDThX+gb7di9f6xK02nkp8sdfFWZLTg==} @@ -6206,15 +6183,15 @@ packages: resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} engines: {node: '>= 6.13.0'} - node-gyp-build@4.8.1: - resolution: {integrity: sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==} + node-gyp-build@4.8.4: + resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} hasBin: true node-int64@0.4.0: resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} - node-releases@2.0.18: - resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} + node-releases@2.0.19: + resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} node-stream-zip@1.15.0: resolution: {integrity: sha512-LN4fydt9TqhZhThkZIVQnF9cwjU3qmUH9h78Mx/K7d3VvfRqqwthLwJEUOEL0QPZ0XQmNN7be5Ggit5+4dq3Bw==} @@ -6225,17 +6202,18 @@ packages: engines: {node: '>=6'} hasBin: true - normalize-package-data@2.5.0: - resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} - normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} - normalize-url@8.0.1: - resolution: {integrity: sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==} + normalize-url@8.0.2: + resolution: {integrity: sha512-Ee/R3SyN4BuynXcnTaekmaVdbDAEiNrHqjQIA37mHU8G9pf7aaAD4ZX3XjBLo6rsdcxA/gtkcNYZLt30ACgynw==} engines: {node: '>=14.16'} + npm-package-arg@11.0.3: + resolution: {integrity: sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==} + engines: {node: ^16.14.0 || >=18.0.0} + npm-package-arg@7.0.0: resolution: {integrity: sha512-xXxr8y5U0kl8dVkz2oK7yZjPBvqM2fwaO5l3Yg13p03v8+E3qQcD0JNhHzjL1vyGgxcKkD0cco+NLR72iuPk3g==} @@ -6257,8 +6235,8 @@ packages: ob1@0.73.10: resolution: {integrity: sha512-aO6EYC+QRRCkZxVJhCWhLKgVjhNuD6Gu1riGjxrIm89CqLsmKgxzYDDEsktmKsoDeRdWGQM5EdMzXDl5xcVfsw==} - ob1@0.81.4: - resolution: {integrity: sha512-EZLYM8hfPraC2SYOR5EWLFAPV5e6g+p83m2Jth9bzCpFxP1NDQJYXdmXRB2bfbaWQSmm6NkIQlbzk7uU5lLfgg==} + ob1@0.81.5: + resolution: {integrity: sha512-iNpbeXPLmaiT9I5g16gFFFjsF3sGxLpYG2EGP3dfFB4z+l9X60mp/yRzStHhMtuNt8qmf7Ww80nOPQHngHhnIQ==} engines: {node: '>=18.18'} object-assign@4.1.1: @@ -6269,22 +6247,23 @@ packages: resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} engines: {node: '>= 6'} - object-inspect@1.13.1: - resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} object-keys@1.1.1: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} engines: {node: '>= 0.4'} - object.assign@4.1.5: - resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} + object.assign@4.1.7: + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} engines: {node: '>= 0.4'} oidc-provider@8.8.1: resolution: {integrity: sha512-qVChpayTwojUREJxLkFofUSK8kiSRIdzPrVSsoGibqRHl/YO60ege94OZS8vh7zaK+zxcG/Gu8UMaYB5ulohCQ==} - oidc-token-hash@5.0.3: - resolution: {integrity: sha512-IF4PcGgzAr6XXSff26Sk/+P4KZFJVuHAJZj3wgO3vX2bMdNVp/QXTP3P7CEm9V1IdG8lDLY3HhiqpsE/nOwpPw==} + oidc-token-hash@5.1.0: + resolution: {integrity: sha512-y0W+X7Ppo7oZX6eovsRkuzcSM40Bicg2JEJkDJ4irIt1wsYAP5MLSNv+QAogO8xivMffw/9OvV3um1pxXgt1uA==} engines: {node: ^10.13.0 || >=12.0.0} on-exit-leak-free@2.1.2: @@ -6359,6 +6338,10 @@ packages: outvariant@1.4.3: resolution: {integrity: sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==} + own-keys@1.0.1: + resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} + engines: {node: '>= 0.4'} + p-cancelable@3.0.0: resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==} engines: {node: '>=12.20'} @@ -6403,8 +6386,11 @@ packages: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} - package-json-from-dist@1.0.0: - resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==} + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + package-manager-detector@0.2.11: + resolution: {integrity: sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==} pako@2.1.0: resolution: {integrity: sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==} @@ -6425,9 +6411,6 @@ packages: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} - password-prompt@1.1.3: - resolution: {integrity: sha512-HkrjG2aJlvF0t2BMH0e2LB/EHf3Lcq3fNMzy4GYHcQblAvOl+QQji1Lx7WRBMqpVK8p+KR7bCg7oqAMXtdgqyw==} - path-exists@3.0.0: resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} engines: {node: '>=4'} @@ -6469,10 +6452,6 @@ packages: resolution: {integrity: sha512-ZI3LnwUv5nOGbQzD9c2iDG6toheuXSZP5esSHBjopsXH4dg19soufvpUGA3uohi5anFtGb2lhAVdHzH6R/Evvg==} engines: {node: '>=8'} - peek-readable@7.0.0: - resolution: {integrity: sha512-nri2TO5JE3/mRryik9LlHFT53cgHfRK0Lt0BAZQXku/AW3E6XLt2GaY8siWi7dvW/m1z0ecn+J+bpDa9ZN3IsQ==} - engines: {node: '>=18'} - picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -6484,6 +6463,10 @@ packages: resolution: {integrity: sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==} engines: {node: '>=10'} + picomatch@4.0.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} + pify@4.0.1: resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} engines: {node: '>=6'} @@ -6502,8 +6485,8 @@ packages: resolution: {integrity: sha512-vnMCM6xZTb1WDmLvtG2lE/2p+t9hDEIvTWJsu6FejkE62vB7gDhvzrpFR4Cw2to+9JNQxVnkAKVPA1KPB98vWg==} hasBin: true - pirates@4.0.6: - resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + pirates@4.0.7: + resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} engines: {node: '>= 6'} pkg-dir@3.0.0: @@ -6522,12 +6505,12 @@ packages: resolution: {integrity: sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==} engines: {node: '>=4.0.0'} - possible-typed-array-names@1.0.0: - resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} + possible-typed-array-names@1.1.0: + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} engines: {node: '>= 0.4'} - postcss@8.4.38: - resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} + postcss@8.4.49: + resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==} engines: {node: ^10 || ^12 || >=14} prebuild-install@7.1.3: @@ -6535,10 +6518,6 @@ packages: engines: {node: '>=10'} hasBin: true - preferred-pm@3.1.3: - resolution: {integrity: sha512-MkXsENfftWSRpzCzImcp4FRsCc3y1opwB73CfCNWyzMqArju2CrlMHlqB7VexKiPEOjGMbttv1r9fSCn5S610w==} - engines: {node: '>=10'} - prelude-ls@1.1.2: resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} engines: {node: '>= 0.8.0'} @@ -6564,6 +6543,10 @@ packages: resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + proc-log@4.2.0: + resolution: {integrity: sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} @@ -6588,9 +6571,6 @@ packages: resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} engines: {node: '>= 6'} - prop-types@15.8.1: - resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} - propagate@2.0.1: resolution: {integrity: sha512-vGrhOavPSTz4QVNuBNdcNXePNdNMaO1xj9yBeH1ScQPjk/rhg9sSlCXPhMkFuaNNW/syTvYqsnbIJxMBfRbbag==} engines: {node: '>= 8'} @@ -6603,8 +6583,8 @@ packages: resolution: {integrity: sha512-gGXRSXvxQ7UiPgfw8gevrfRWcTlSbOFg+p/N+JVJEK5VhueL2miT6qTymqAmjr1Q5WbOCyJbyrk6JfWKwlFn6A==} engines: {node: '>=12.0.0'} - protobufjs@7.4.0: - resolution: {integrity: sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw==} + protobufjs@7.5.3: + resolution: {integrity: sha512-sildjKwVqOI2kmFDiXQ6aEB0fjYTafpEvIBs8tOR8qI4spuL9OPROLVu2qZqi/xgCfsHIwVqlaF8JBjWFHnKbw==} engines: {node: '>=12.0.0'} proxy-addr@2.0.7: @@ -6614,11 +6594,8 @@ packages: proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - pseudomap@1.0.2: - resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} - - pump@3.0.0: - resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + pump@3.0.2: + resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==} punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} @@ -6627,9 +6604,6 @@ packages: pure-rand@6.1.0: resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==} - pvtsutils@1.3.5: - resolution: {integrity: sha512-ARvb14YB9Nm2Xi6nBq1ZX6dAM0FsJnuk+31aUp4TrcZEdKUlSqOqsxJHUPJDNE3qiIp+iUPEIeR6Je/tgV7zsA==} - pvtsutils@1.3.6: resolution: {integrity: sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==} @@ -6641,14 +6615,17 @@ packages: resolution: {integrity: sha512-Uu7ii+FQy4Qf82G4xu7ShHhjhGahEpCWc3x8UavY3CTcWV+ufmmCtwkr7ZKsX42jdL0kr1B5FKUeqJvAn51jzQ==} hasBin: true - qs@6.12.1: - resolution: {integrity: sha512-zWmv4RSuB9r2mYQw3zxQuHWeU+42aKi1wWig/j4ele4ygELZ7PEO6MM7rim9oAQH2A5MWfsAVf/jPvTPgCbvUQ==} - engines: {node: '>=0.6'} - qs@6.13.0: resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} engines: {node: '>=0.6'} + qs@6.14.0: + resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} + engines: {node: '>=0.6'} + + quansync@0.2.10: + resolution: {integrity: sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A==} + query-string@7.1.3: resolution: {integrity: sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==} engines: {node: '>=6'} @@ -6662,16 +6639,12 @@ packages: quick-format-unescaped@4.0.4: resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} - quick-lru@4.0.1: - resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} - engines: {node: '>=8'} - quick-lru@5.1.1: resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} engines: {node: '>=10'} - quick-lru@7.0.0: - resolution: {integrity: sha512-MX8gB7cVYTrYcFfAnfLlhRd0+Toyl8yX8uBx1MrX7K0jegiz9TumwOK27ldXrgDlHRdVi+MqU9Ssw6dr4BNreg==} + quick-lru@7.0.1: + resolution: {integrity: sha512-kLjThirJMkWKutUKbZ8ViqFc09tDQhlbQo2MNuVeLWbRauqYP96Sm6nzlQ24F0HFjUNZ4i9+AgldJ9H6DZXi7g==} engines: {node: '>=18'} range-parser@1.2.1: @@ -6694,8 +6667,12 @@ packages: resolution: {integrity: sha512-fUeWjrkOO0t1rg7B2fdyDTvngj+9RlUyL92vOdiB7c0FPguWVsniIMjEtHH+meLBO9rzkUlUzBVXgWrjI8P9LA==} engines: {node: '>=12'} - react-devtools-core@6.1.1: - resolution: {integrity: sha512-TFo1MEnkqE6hzAbaztnyR5uLTMoz6wnEWwWBsCUzNt+sVXJycuRJdDqvL078M4/h65BI/YO5XWTaxZDWVsW0fw==} + rdf-canonize@4.0.1: + resolution: {integrity: sha512-B5ynHt4sasbUafzrvYI2GFARgeFcD8Sx9yXPbg7gEyT2EH76rlCv84kyO6tnxzVbxUN/uJDbK1S/MXh+DsnuTA==} + engines: {node: '>=18'} + + react-devtools-core@6.1.2: + resolution: {integrity: sha512-ldFwzufLletzCikNJVYaxlxMLu7swJ3T2VrGfzXlMsVhZhPDKXA38DEROidaYZVgMAmQnIjymrmqto5pyfrwPA==} react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} @@ -6740,8 +6717,8 @@ packages: react: '*' react-native: '*' - react-native@0.78.1: - resolution: {integrity: sha512-3CK/xxX02GeeVFyrXbsHvREZFVaXwHW43Km/EdYITn5G32cccWTGaqY9QdPddEBLw5O3BPip3LHbR1SywE0cpA==} + react-native@0.78.2: + resolution: {integrity: sha512-UilZ8sP9amHCz7TTMWMJ71JeYcMzEdgCJaqTfoB1hC/nYMXq6xqSFxKWCDhf7sR7nz3FKxS4t338t42AMDDkww==} engines: {node: '>=18'} hasBin: true peerDependencies: @@ -6763,14 +6740,6 @@ packages: resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} engines: {node: '>=0.10.0'} - read-pkg-up@7.0.1: - resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} - engines: {node: '>=8'} - - read-pkg@5.2.0: - resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} - engines: {node: '>=8'} - read-yaml-file@1.1.0: resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} engines: {node: '>=6'} @@ -6786,8 +6755,8 @@ packages: resolution: {integrity: sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - readable-web-to-node-stream@3.0.2: - resolution: {integrity: sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==} + readable-web-to-node-stream@3.0.4: + resolution: {integrity: sha512-9nX56alTf5bwXQ3ZDipHJhusu9NTQJ/CVPtb/XHAJCXihZeitfJvIRS4GqQ/mfIoOE3IelHMrpayVrosdHBuLw==} engines: {node: '>=8'} readline@1.3.0: @@ -6808,10 +6777,6 @@ packages: resolution: {integrity: sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==} engines: {node: '>= 4'} - redent@3.0.0: - resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} - engines: {node: '>=8'} - redis-errors@1.2.0: resolution: {integrity: sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==} engines: {node: '>=4'} @@ -6832,6 +6797,10 @@ packages: reflect-metadata@0.2.2: resolution: {integrity: sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==} + reflect.getprototypeof@1.0.10: + resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} + engines: {node: '>= 0.4'} + regenerate-unicode-properties@10.2.0: resolution: {integrity: sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==} engines: {node: '>=4'} @@ -6842,14 +6811,8 @@ packages: regenerator-runtime@0.13.11: resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} - regenerator-runtime@0.14.1: - resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - - regenerator-transform@0.15.2: - resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} - - regexp.prototype.flags@1.5.2: - resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} + regexp.prototype.flags@1.5.4: + resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} engines: {node: '>= 0.4'} regexpu-core@6.2.0: @@ -6899,12 +6862,16 @@ packages: resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - resolve.exports@2.0.2: - resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==} + resolve-workspace-root@2.0.0: + resolution: {integrity: sha512-IsaBUZETJD5WsI11Wt8PKHwaIe45or6pwNc8yflvLJ4DWtImK9kuLoH5kUva/2Mmx/RdIyr4aONNSa2v9LTJsw==} + + resolve.exports@2.0.3: + resolution: {integrity: sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==} engines: {node: '>=10'} - resolve@1.22.8: - resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + resolve@1.22.10: + resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} + engines: {node: '>= 0.4'} hasBin: true resolve@1.7.1: @@ -6922,8 +6889,8 @@ packages: resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} engines: {node: '>=8'} - reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} rfc4648@1.5.4: @@ -6934,21 +6901,11 @@ packages: deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true - rimraf@2.4.5: - resolution: {integrity: sha512-J5xnxTyqaiw06JjMftq7L9ouA448dw/E7dKghkP9WpKNuwmARNNg+Gk8/u5ryb9N/Yo2+z3MCwuqFK/+qPOPfQ==} - deprecated: Rimraf versions prior to v4 are no longer supported - hasBin: true - rimraf@2.6.3: resolution: {integrity: sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==} deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true - rimraf@2.7.1: - resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} - deprecated: Rimraf versions prior to v4 are no longer supported - hasBin: true - rimraf@3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} deprecated: Rimraf versions prior to v4 are no longer supported @@ -6959,10 +6916,6 @@ packages: engines: {node: '>=14'} hasBin: true - rimraf@5.0.10: - resolution: {integrity: sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==} - hasBin: true - run-async@2.4.1: resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} engines: {node: '>=0.12.0'} @@ -6970,11 +6923,11 @@ packages: run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - rxjs@7.8.1: - resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + rxjs@7.8.2: + resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} - safe-array-concat@1.1.2: - resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} + safe-array-concat@1.1.3: + resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} engines: {node: '>=0.4'} safe-buffer@5.1.2: @@ -6983,11 +6936,12 @@ packages: safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - safe-json-stringify@1.2.0: - resolution: {integrity: sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg==} + safe-push-apply@1.0.0: + resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} + engines: {node: '>= 0.4'} - safe-regex-test@1.0.3: - resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} + safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} engines: {node: '>= 0.4'} safe-stable-stringify@2.5.0: @@ -7022,8 +6976,8 @@ packages: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - semver@7.6.2: - resolution: {integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==} + semver@7.7.2: + resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} engines: {node: '>=10'} hasBin: true @@ -7058,6 +7012,10 @@ packages: resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} engines: {node: '>= 0.4'} + set-proto@1.0.0: + resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} + engines: {node: '>= 0.4'} + setimmediate@1.0.5: resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} @@ -7084,11 +7042,24 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - shell-quote@1.8.1: - resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} + shell-quote@1.8.3: + resolution: {integrity: sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==} + engines: {node: '>= 0.4'} + + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} - side-channel@1.0.6: - resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} engines: {node: '>= 0.4'} signal-exit@3.0.7: @@ -7122,16 +7093,11 @@ packages: resolution: {integrity: sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==} engines: {node: '>=8.0.0'} - smartwrap@2.0.2: - resolution: {integrity: sha512-vCsKNQxb7PnCNd2wY1WClWifAc2lwqsG8OaswpJkVJsvMGcnEntdTCDajZCkk93Ay1U3t/9puJmb525Rg5MZBA==} - engines: {node: '>=6'} - hasBin: true - sonic-boom@4.2.0: resolution: {integrity: sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww==} - source-map-js@1.2.0: - resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} source-map-support@0.5.13: @@ -7155,20 +7121,8 @@ packages: spark-md5@3.0.2: resolution: {integrity: sha512-wcFzz9cDfbuqe0FZzfi2or1sgyIrsDwmPwfZC4hiNidPdPINjeUwNfv5kldczoEAcjl9Y1L3SM7Uz2PUEQzxQw==} - spawndamnit@2.0.0: - resolution: {integrity: sha512-j4JKEcncSjFlqIwU5L/rp2N5SIPsdxaRsIv678+TZxZ0SRDJTm8JrxJMjE/XuiEZNEir3S8l0Fa3Ke339WI4qA==} - - spdx-correct@3.2.0: - resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} - - spdx-exceptions@2.5.0: - resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} - - spdx-expression-parse@3.0.1: - resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} - - spdx-license-ids@3.0.18: - resolution: {integrity: sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ==} + spawndamnit@3.0.1: + resolution: {integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==} split-on-first@1.1.0: resolution: {integrity: sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==} @@ -7178,9 +7132,6 @@ packages: resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} engines: {node: '>= 10.x'} - split@1.0.1: - resolution: {integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==} - sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} @@ -7195,8 +7146,8 @@ packages: stackframe@1.3.4: resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==} - stacktrace-parser@0.1.10: - resolution: {integrity: sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==} + stacktrace-parser@0.1.11: + resolution: {integrity: sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg==} engines: {node: '>=6'} standard-as-callback@2.1.0: @@ -7213,6 +7164,10 @@ packages: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} + stop-iteration-iterator@1.1.0: + resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} + engines: {node: '>= 0.4'} + str2buf@1.3.0: resolution: {integrity: sha512-xIBmHIUHYZDP4HyoXGHYNVmxlXLXDrtFHYT0eV6IOdEj3VO9ccaF1Ejl9Oq8iFjITllpT8FhaXb4KsNmw+3EuA==} @@ -7220,9 +7175,6 @@ packages: resolution: {integrity: sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==} engines: {node: '>= 0.10.0'} - stream-transform@2.1.3: - resolution: {integrity: sha512-9GHUiM5hMiCi6Y03jD2ARC1ettBXkQBoQAe7nJsPknnI0ow10aXjTnew8QtYQmLjzn974BnmWEAJgCY6ZP1DeQ==} - streamsearch@1.1.0: resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} engines: {node: '>=10.0.0'} @@ -7246,12 +7198,13 @@ packages: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} - string.prototype.trim@1.2.9: - resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} + string.prototype.trim@1.2.10: + resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} engines: {node: '>= 0.4'} - string.prototype.trimend@1.0.8: - resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} + string.prototype.trimend@1.0.9: + resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} + engines: {node: '>= 0.4'} string.prototype.trimstart@1.0.8: resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} @@ -7291,10 +7244,6 @@ packages: resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} engines: {node: '>=6'} - strip-indent@3.0.0: - resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} - engines: {node: '>=8'} - strip-json-comments@2.0.1: resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} engines: {node: '>=0.10.0'} @@ -7303,11 +7252,11 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} - strnum@1.0.5: - resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==} + strnum@1.1.2: + resolution: {integrity: sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==} - strtok3@10.2.2: - resolution: {integrity: sha512-Xt18+h4s7Z8xyZ0tmBoRmzxcop97R4BAh+dXouUDCYn+Em+1P3qpkUfI5ueWLT8ynC5hZ+q4iPEmGG1urvQGBg==} + strtok3@10.3.1: + resolution: {integrity: sha512-3JWEZM6mfix/GCJBBUrkA8p2Id2pBkyTkVCJKto55w080QBKZ+8R171fGrbiSp+yMO/u6F8/yUh7K4V9K+YCnw==} engines: {node: '>=18'} strtok3@6.3.0: @@ -7322,24 +7271,16 @@ packages: engines: {node: '>=8'} hasBin: true - sudo-prompt@8.2.5: - resolution: {integrity: sha512-rlBo3HU/1zAJUrkY6jNxDOC9eVYliG6nS4JA8u8KAshITd07tafMc/Br7xQwCSseXwJ2iCcHCE8SNWX3q8Z+kw==} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - - sudo-prompt@9.1.1: - resolution: {integrity: sha512-es33J1g2HjMpyAhz8lOR+ICmXXAqTuKbuXuUWLhOLew20oN9oUCgCJx615U/v7aioZg7IX5lIh9x34vwneu4pA==} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - sudo-prompt@9.2.1: resolution: {integrity: sha512-Mu7R0g4ig9TUuGSxJavny5Rv0egCEtpZRNMrZaYS1vxkiIxGiGUwoezU3LazIQ+KE04hTrTfNPgxU5gzi7F5Pw==} deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - superagent@9.0.2: - resolution: {integrity: sha512-xuW7dzkUpcJq7QnhOsnNUgtYp3xRwpt2F7abdRYIpCsAt0hhUqia0EdxyXZQQpNmGtsCzYHryaKSV3q3GJnq7w==} + superagent@10.2.1: + resolution: {integrity: sha512-O+PCv11lgTNJUzy49teNAWLjBZfc+A1enOwTpLlH6/rsvKcTwcdTT8m9azGkVqM7HBl5jpyZ7KTPhHweokBcdg==} engines: {node: '>=14.18.0'} - supertest@7.0.0: - resolution: {integrity: sha512-qlsr7fIC0lSddmA3tzojvzubYxvlGtzumcdHgPwbFWMISQwL22MhM2Y3LNt+6w9Yyx7559VW5ab70dgphm8qQA==} + supertest@7.1.1: + resolution: {integrity: sha512-aI59HBTlG9e2wTjxGJV+DygfNLgnWbGdZxiA/sgrnNNikIW8lbDvCtF6RnhZoJ82nU7qv7ZLjrvWqCEm52fAmw==} engines: {node: '>=14.18.0'} supports-color@5.5.0: @@ -7413,8 +7354,8 @@ packages: resolution: {integrity: sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==} engines: {node: '>=8'} - terser@5.31.1: - resolution: {integrity: sha512-37upzU1+viGvuFtBo9NPufCb9dwM0+l9hMxYyWfBA+fbwrPqNJAhbZ6W47bBFnZHKHTUBnMvi87434qq+qnxOg==} + terser@5.42.0: + resolution: {integrity: sha512-UYCvU9YQW2f/Vwl+P0GfhxJxbUGLwd+5QrrGgLajzWAtC/23AX0vcise32kkP7Eu0Wu9VlzzHAXkLObgjQfFlQ==} engines: {node: '>=10'} hasBin: true @@ -7477,14 +7418,10 @@ packages: tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - traverse@0.6.9: - resolution: {integrity: sha512-7bBrcF+/LQzSgFmT0X5YclVqQxtv7TDJ1f8Wj7ibBu/U6BMLeOpUxuZjV7rMc44UtKxlnMFigdhFAIszSX1DMg==} + traverse@0.6.11: + resolution: {integrity: sha512-vxXDZg8/+p3gblxB6BhhG5yWVn1kGRlaL8O78UDXc3wRnPizB5g83dcvWV1jpDMIPnjZjOFuxlMmE82XJ4407w==} engines: {node: '>= 0.4'} - trim-newlines@3.0.1: - resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} - engines: {node: '>=8'} - trim-right@1.0.1: resolution: {integrity: sha512-WZGXGstmCWgeevgTL54hrCuw1dyMQIzWy7ZfqRJfSmJZBwklI15egmQytFP6bPidmw3M8d5yEowl1niq4vmqZw==} engines: {node: '>=0.10.0'} @@ -7492,8 +7429,8 @@ packages: ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - ts-jest@29.1.5: - resolution: {integrity: sha512-UuClSYxM7byvvYfyWdFI+/2UxMmwNyJb0NPkZPQE2hew3RurV7l7zURgOHAd/1I1ZdPpe3GUsXNXAcN8TFKSIg==} + ts-jest@29.3.4: + resolution: {integrity: sha512-Iqbrm8IXOmV+ggWHOTEbjwyCf2xZlUMv5npExksXohL+tk8va4Fjhb+X2+Rt9NBmgO7bJ8WpnMLOwih/DnMlFA==} engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -7544,20 +7481,15 @@ packages: resolution: {integrity: sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==} engines: {node: '>=0.6.x'} - tsx@4.19.2: - resolution: {integrity: sha512-pOUl6Vo2LUq/bSa8S5q7b91cgNSjctn9ugq/+Mvow99qW6x/UZYwzxy/3NmqoT66eHYfCVvFvACC58UBPFf28g==} + tsx@4.19.4: + resolution: {integrity: sha512-gK5GVzDkJK1SI1zwHf32Mqxf2tSJkNx+eYcNly5+nHvWqXUJYUkWBQtKauoESz3ymezAI++ZwT855x5p5eop+Q==} engines: {node: '>=18.0.0'} hasBin: true - tsyringe@4.8.0: - resolution: {integrity: sha512-YB1FG+axdxADa3ncEtRnQCFq/M0lALGLxSZeVNbTU8NqhOVc51nnv2CISTcvc1kyv6EGPtXVr0v6lWeDxiijOA==} + tsyringe@4.10.0: + resolution: {integrity: sha512-axr3IdNuVIxnaK5XGEUFTu3YmAQ6lllgrvqfEoR16g/HGnYY/6We4oWENtAnzK6/LpJ2ur9PAb80RBt7/U4ugw==} engines: {node: '>= 6.0.0'} - tty-table@4.2.3: - resolution: {integrity: sha512-Fs15mu0vGzCrj8fmJNP7Ynxt5J7praPXqFN0leZeZBXJwkMxv9cb2D454k1ltrtUSJbZ4yH4e0CynsHLxmUfFA==} - engines: {node: '>=8.0.0'} - hasBin: true - tunnel-agent@0.6.0: resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} @@ -7572,10 +7504,6 @@ packages: resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} engines: {node: '>=4'} - type-fest@0.13.1: - resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} - engines: {node: '>=10'} - type-fest@0.16.0: resolution: {integrity: sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==} engines: {node: '>=10'} @@ -7592,17 +7520,13 @@ packages: resolution: {integrity: sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==} engines: {node: '>=6'} - type-fest@0.6.0: - resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} - engines: {node: '>=8'} - type-fest@0.7.1: resolution: {integrity: sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==} engines: {node: '>=8'} - type-fest@0.8.1: - resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} - engines: {node: '>=8'} + type-fest@4.41.0: + resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} + engines: {node: '>=16'} type-is@1.6.18: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} @@ -7611,24 +7535,24 @@ packages: type@2.7.3: resolution: {integrity: sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==} - typed-array-buffer@1.0.2: - resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} + typed-array-buffer@1.0.3: + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} engines: {node: '>= 0.4'} - typed-array-byte-length@1.0.1: - resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} + typed-array-byte-length@1.0.3: + resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} engines: {node: '>= 0.4'} - typed-array-byte-offset@1.0.2: - resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} + typed-array-byte-offset@1.0.4: + resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} engines: {node: '>= 0.4'} - typed-array-length@1.0.6: - resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} + typed-array-length@1.0.7: + resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} engines: {node: '>= 0.4'} - typedarray.prototype.slice@1.0.3: - resolution: {integrity: sha512-8WbVAQAUlENo1q3c3zZYuy5k9VzBQvp8AX9WOtbvyWlLM1v5JaSRmjubLjzHF4JFtptjH/5c/i95yaElvcjC0A==} + typedarray.prototype.slice@1.0.5: + resolution: {integrity: sha512-q7QNVDGTdl702bVFiI5eY4l/HkgCM6at9KhcFbgUAzezHFbOVy4+0O/lCjsABEQwbZPravVfBIiBVGo89yzHFg==} engines: {node: '>= 0.4'} typedarray@0.0.6: @@ -7639,8 +7563,9 @@ packages: engines: {node: '>=14.17'} hasBin: true - ua-parser-js@1.0.38: - resolution: {integrity: sha512-Aq5ppTOfvrCMgAPneW1HfWj66Xi7XL+/mIy996R1/CLS/rcyJQm6QZdsKrUeivDFQ+Oc9Wyuwor8Ze8peEoUoQ==} + ua-parser-js@1.0.40: + resolution: {integrity: sha512-z6PJ8Lml+v3ichVojCiB8toQJBuwR42ySM4ezjXIqXK3M0HczmKQ3LF4rhU55PfD99KEEXQG6yb7iOMyvYuHew==} + hasBin: true uglify-es@3.3.9: resolution: {integrity: sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==} @@ -7658,26 +7583,27 @@ packages: uint8arrays@5.1.0: resolution: {integrity: sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==} - unbox-primitive@1.0.2: - resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + unbox-primitive@1.1.0: + resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} + engines: {node: '>= 0.4'} undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - undici@6.21.0: - resolution: {integrity: sha512-BUgJXc752Kou3oOIuU1i+yZZypyZRqNPW0vqoMPl8VaoalSfeR0D8/t4iAS3yirs79SSMTxTag+ZC86uswv+Cw==} + undici@6.21.3: + resolution: {integrity: sha512-gBLkYIlEnSp8pFbT64yFgGE6UIB9tAkhukC23PmMDCe5Nd+cRqKxSjw5y54MK2AZMgZfJWMaNE4nYUHgi1XEOw==} engines: {node: '>=18.17'} - unicode-canonical-property-names-ecmascript@2.0.0: - resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} + unicode-canonical-property-names-ecmascript@2.0.1: + resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==} engines: {node: '>=4'} unicode-match-property-ecmascript@2.0.0: resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} engines: {node: '>=4'} - unicode-match-property-value-ecmascript@2.1.0: - resolution: {integrity: sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==} + unicode-match-property-value-ecmascript@2.2.0: + resolution: {integrity: sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==} engines: {node: '>=4'} unicode-property-aliases-ecmascript@2.1.0: @@ -7716,15 +7642,12 @@ packages: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} - update-browserslist-db@1.1.1: - resolution: {integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==} + update-browserslist-db@1.1.3: + resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' - uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - url-join@4.0.0: resolution: {integrity: sha512-EGXjXJZhIHiQMK2pQukuFcL303nskqIRzWvPvV5O8miOfwoUb9G+a/Cld60kUyeaybEI94wvVClT10DtfeAExA==} @@ -7764,8 +7687,8 @@ packages: v8-compile-cache-lib@3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} - v8-to-istanbul@9.2.0: - resolution: {integrity: sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==} + v8-to-istanbul@9.3.0: + resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} engines: {node: '>=10.12.0'} valibot@1.0.0-beta.8: @@ -7779,14 +7702,15 @@ packages: valid-url@1.0.9: resolution: {integrity: sha512-QQDsV8OnSf5Uc30CKSwG9lnhMPe6exHtTXLRYX8uMwKENy640pU+2BgBL0LRbDh/eYRahNCS7aewCx0wf3NYVA==} - validate-npm-package-license@3.0.4: - resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} - validate-npm-package-name@3.0.0: resolution: {integrity: sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw==} - validator@13.12.0: - resolution: {integrity: sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg==} + validate-npm-package-name@5.0.1: + resolution: {integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + validator@13.15.15: + resolution: {integrity: sha512-BgWVbCI72aIQy937xbawcs+hrVaN/CZ2UwutgaJ36hGqRrLNM+f5LUT/YPRbo8IV/ASeFzXszezV+y2+rq3l8A==} engines: {node: '>= 0.10'} varint@6.0.0: @@ -7805,15 +7729,15 @@ packages: wcwidth@1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} - web-did-resolver@2.0.27: - resolution: {integrity: sha512-YxQlNdeYBXLhVpMW62+TPlc6sSOiWyBYq7DNvY6FXmXOD9g0zLeShpq2uCKFFQV/WlSrBi/yebK/W5lMTDxMUQ==} + web-did-resolver@2.0.30: + resolution: {integrity: sha512-lsv0T+y/zD1bEVkcNfcppk4hQXBlqqoXfYcRG4183Yv53FkY29HNPGErwkNI/AG+lxxsUIR77JqS6pn9uHw/Vw==} web-streams-polyfill@3.3.3: resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} engines: {node: '>= 8'} - webcrypto-core@1.8.0: - resolution: {integrity: sha512-kR1UQNH8MD42CYuLzvibfakG5Ew5seG85dMMoAM/1LqvckxaF6pUiidLuraIu4V+YCIFabYecUZAW0TuxAoaqw==} + webcrypto-core@1.8.1: + resolution: {integrity: sha512-P+x1MvlNCXlKbLSOY4cYrdreqPG5hbzkmawbcXLKN/mf6DZW0SdNNkZ+sjwsqVkI4A4Ko2sPZmkZtCKY58w83A==} webcrypto-shim@0.1.7: resolution: {integrity: sha512-JAvAQR5mRNRxZW2jKigWMjCMkjSdmP5cColRP1U/pTg69VgHXEi1orv5vVpJ55Zc5MIaPc1aaurzd9pjv2bveg==} @@ -7835,18 +7759,23 @@ packages: whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - which-boxed-primitive@1.0.2: - resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + which-boxed-primitive@1.1.1: + resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} + engines: {node: '>= 0.4'} + + which-builtin-type@1.2.1: + resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} + engines: {node: '>= 0.4'} + + which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} which-module@2.0.1: resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} - which-pm@2.0.0: - resolution: {integrity: sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w==} - engines: {node: '>=8.15'} - - which-typed-array@1.1.15: - resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} + which-typed-array@1.1.19: + resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} engines: {node: '>= 0.4'} which@1.3.1: @@ -7917,8 +7846,8 @@ packages: utf-8-validate: optional: true - ws@8.17.1: - resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} + ws@8.18.2: + resolution: {integrity: sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -7963,9 +7892,6 @@ packages: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} - yallist@2.1.2: - resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} - yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} @@ -8010,8 +7936,8 @@ packages: peerDependencies: zod: ^3.18.0 - zod@3.24.2: - resolution: {integrity: sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==} + zod@3.25.57: + resolution: {integrity: sha512-6tgzLuwVST5oLUxXTmBqoinKMd3JeesgbgseXeFasKKj8Q1FCZrHnbqJOyiEvr4cVAlbug+CgIsmJ8cl/pU5FA==} zstd-napi@0.0.10: resolution: {integrity: sha512-pwnG+auSiIrD2BNSIpPEUtcRSK33cfYmKo3sJPTohFiPqPci9F4SIRPR7gGeI45Maj4nFoyyxzT2YDxVXIIgzQ==} @@ -8022,36 +7948,36 @@ snapshots: '@2060.io/ffi-napi@4.0.9(patch_hash=6ujtm5ladmp54sbez4f5d2uhca)': dependencies: '@2060.io/ref-napi': 3.0.6 - debug: 4.4.0 + debug: 4.4.1 get-uv-event-loop-napi-h: 1.0.6 node-addon-api: 3.2.1 - node-gyp-build: 4.8.1 + node-gyp-build: 4.8.4 ref-struct-di: 1.1.1 transitivePeerDependencies: - supports-color '@2060.io/ref-napi@3.0.6': dependencies: - debug: 4.4.0 + debug: 4.4.1 get-symbol-from-current-process-h: 1.0.2 node-addon-api: 3.2.1 - node-gyp-build: 4.8.1 + node-gyp-build: 4.8.4 transitivePeerDependencies: - supports-color '@ampproject/remapping@2.3.0': dependencies: - '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/gen-mapping': 0.3.8 '@jridgewell/trace-mapping': 0.3.25 - '@animo-id/expo-secure-environment@0.1.1(expo@51.0.29(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0)))(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1))(react@18.3.1)': + '@animo-id/expo-secure-environment@0.1.1(expo@51.0.29(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1))(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': dependencies: - '@peculiar/asn1-ecc': 2.3.14 - '@peculiar/asn1-schema': 2.3.13 - '@peculiar/asn1-x509': 2.3.13 - expo: 51.0.29(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0)) + '@peculiar/asn1-ecc': 2.3.15 + '@peculiar/asn1-schema': 2.3.15 + '@peculiar/asn1-x509': 2.3.15 + expo: 51.0.29(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) react: 18.3.1 - react-native: 0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1) + react-native: 0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1) '@animo-id/mdoc@0.5.2': dependencies: @@ -8066,10 +7992,10 @@ snapshots: '@sd-jwt/types': 0.7.2 '@sphereon/pex-models': 2.3.2 '@sphereon/ssi-types': 0.33.0 - ajv: 8.16.0 - ajv-formats: 2.1.1(ajv@8.16.0) + ajv: 8.17.1 + ajv-formats: 2.1.1(ajv@8.17.1) jwt-decode: 3.1.2 - nanoid: 3.3.7 + nanoid: 3.3.11 uint8arrays: 3.1.1 transitivePeerDependencies: - supports-color @@ -8082,30 +8008,30 @@ snapshots: '@babel/code-frame@7.10.4': dependencies: - '@babel/highlight': 7.24.7 + '@babel/highlight': 7.25.9 - '@babel/code-frame@7.26.2': + '@babel/code-frame@7.27.1': dependencies: - '@babel/helper-validator-identifier': 7.25.9 + '@babel/helper-validator-identifier': 7.27.1 js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/compat-data@7.26.3': {} + '@babel/compat-data@7.27.5': {} - '@babel/core@7.26.0': + '@babel/core@7.27.4': dependencies: '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.26.2 - '@babel/generator': 7.26.3 - '@babel/helper-compilation-targets': 7.25.9 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) - '@babel/helpers': 7.26.0 - '@babel/parser': 7.26.3 - '@babel/template': 7.25.9 - '@babel/traverse': 7.26.4 - '@babel/types': 7.26.3 + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.27.5 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.4) + '@babel/helpers': 7.27.6 + '@babel/parser': 7.27.5 + '@babel/template': 7.27.2 + '@babel/traverse': 7.27.4 + '@babel/types': 7.27.6 convert-source-map: 2.0.0 - debug: 4.4.0 + debug: 4.4.1 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -8114,953 +8040,923 @@ snapshots: '@babel/generator@7.2.0': dependencies: - '@babel/types': 7.26.3 + '@babel/types': 7.27.6 jsesc: 2.5.2 lodash: 4.17.21 source-map: 0.5.7 trim-right: 1.0.1 - '@babel/generator@7.26.3': + '@babel/generator@7.27.5': dependencies: - '@babel/parser': 7.26.3 - '@babel/types': 7.26.3 - '@jridgewell/gen-mapping': 0.3.5 + '@babel/parser': 7.27.5 + '@babel/types': 7.27.6 + '@jridgewell/gen-mapping': 0.3.8 '@jridgewell/trace-mapping': 0.3.25 - jsesc: 3.0.2 + jsesc: 3.1.0 - '@babel/helper-annotate-as-pure@7.25.9': + '@babel/helper-annotate-as-pure@7.27.3': dependencies: - '@babel/types': 7.26.3 + '@babel/types': 7.27.6 - '@babel/helper-compilation-targets@7.25.9': + '@babel/helper-compilation-targets@7.27.2': dependencies: - '@babel/compat-data': 7.26.3 - '@babel/helper-validator-option': 7.25.9 - browserslist: 4.24.2 + '@babel/compat-data': 7.27.5 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.25.0 lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-create-class-features-plugin@7.25.9(@babel/core@7.26.0)': + '@babel/helper-create-class-features-plugin@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-member-expression-to-functions': 7.25.9 - '@babel/helper-optimise-call-expression': 7.25.9 - '@babel/helper-replace-supers': 7.25.9(@babel/core@7.26.0) - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 - '@babel/traverse': 7.26.4 + '@babel/core': 7.27.4 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-member-expression-to-functions': 7.27.1 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.27.4) + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/traverse': 7.27.4 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/helper-create-regexp-features-plugin@7.26.3(@babel/core@7.26.0)': + '@babel/helper-create-regexp-features-plugin@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/core': 7.27.4 + '@babel/helper-annotate-as-pure': 7.27.3 regexpu-core: 6.2.0 semver: 6.3.1 - '@babel/helper-define-polyfill-provider@0.6.2(@babel/core@7.26.0)': + '@babel/helper-define-polyfill-provider@0.6.4(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-compilation-targets': 7.25.9 - '@babel/helper-plugin-utils': 7.25.9 - debug: 4.4.0 + '@babel/core': 7.27.4 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + debug: 4.4.1 lodash.debounce: 4.0.8 - resolve: 1.22.8 + resolve: 1.22.10 transitivePeerDependencies: - supports-color '@babel/helper-environment-visitor@7.24.7': dependencies: - '@babel/types': 7.26.3 + '@babel/types': 7.27.6 - '@babel/helper-member-expression-to-functions@7.25.9': + '@babel/helper-member-expression-to-functions@7.27.1': dependencies: - '@babel/traverse': 7.26.4 - '@babel/types': 7.26.3 + '@babel/traverse': 7.27.4 + '@babel/types': 7.27.6 transitivePeerDependencies: - supports-color - '@babel/helper-module-imports@7.25.9': + '@babel/helper-module-imports@7.27.1': dependencies: - '@babel/traverse': 7.26.4 - '@babel/types': 7.26.3 + '@babel/traverse': 7.27.4 + '@babel/types': 7.27.6 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.0)': + '@babel/helper-module-transforms@7.27.3(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-module-imports': 7.25.9 - '@babel/helper-validator-identifier': 7.25.9 - '@babel/traverse': 7.26.4 + '@babel/core': 7.27.4 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.27.4 transitivePeerDependencies: - supports-color - '@babel/helper-optimise-call-expression@7.25.9': + '@babel/helper-optimise-call-expression@7.27.1': dependencies: - '@babel/types': 7.26.3 - - '@babel/helper-plugin-utils@7.25.9': {} + '@babel/types': 7.27.6 - '@babel/helper-plugin-utils@7.26.5': {} + '@babel/helper-plugin-utils@7.27.1': {} - '@babel/helper-remap-async-to-generator@7.25.9(@babel/core@7.26.0)': + '@babel/helper-remap-async-to-generator@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-wrap-function': 7.25.9 - '@babel/traverse': 7.26.4 + '@babel/core': 7.27.4 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-wrap-function': 7.27.1 + '@babel/traverse': 7.27.4 transitivePeerDependencies: - supports-color - '@babel/helper-replace-supers@7.25.9(@babel/core@7.26.0)': + '@babel/helper-replace-supers@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-member-expression-to-functions': 7.25.9 - '@babel/helper-optimise-call-expression': 7.25.9 - '@babel/traverse': 7.26.4 + '@babel/core': 7.27.4 + '@babel/helper-member-expression-to-functions': 7.27.1 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/traverse': 7.27.4 transitivePeerDependencies: - supports-color - '@babel/helper-skip-transparent-expression-wrappers@7.25.9': + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': dependencies: - '@babel/traverse': 7.26.4 - '@babel/types': 7.26.3 + '@babel/traverse': 7.27.4 + '@babel/types': 7.27.6 transitivePeerDependencies: - supports-color - '@babel/helper-string-parser@7.25.9': {} + '@babel/helper-string-parser@7.27.1': {} - '@babel/helper-validator-identifier@7.25.9': {} + '@babel/helper-validator-identifier@7.27.1': {} - '@babel/helper-validator-option@7.25.9': {} + '@babel/helper-validator-option@7.27.1': {} - '@babel/helper-wrap-function@7.25.9': + '@babel/helper-wrap-function@7.27.1': dependencies: - '@babel/template': 7.25.9 - '@babel/traverse': 7.26.4 - '@babel/types': 7.26.3 + '@babel/template': 7.27.2 + '@babel/traverse': 7.27.4 + '@babel/types': 7.27.6 transitivePeerDependencies: - supports-color - '@babel/helpers@7.26.0': + '@babel/helpers@7.27.6': dependencies: - '@babel/template': 7.25.9 - '@babel/types': 7.26.3 + '@babel/template': 7.27.2 + '@babel/types': 7.27.6 - '@babel/highlight@7.24.7': + '@babel/highlight@7.25.9': dependencies: - '@babel/helper-validator-identifier': 7.25.9 + '@babel/helper-validator-identifier': 7.27.1 chalk: 2.4.2 js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/parser@7.26.3': + '@babel/parser@7.27.5': dependencies: - '@babel/types': 7.26.3 + '@babel/types': 7.27.6 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 - '@babel/traverse': 7.26.4 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/traverse': 7.27.4 transitivePeerDependencies: - supports-color - '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 - '@babel/plugin-transform-optional-chaining': 7.25.9(@babel/core@7.26.0) + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.27.4) transitivePeerDependencies: - supports-color - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 - '@babel/traverse': 7.26.4 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/traverse': 7.27.4 transitivePeerDependencies: - supports-color - '@babel/plugin-proposal-async-generator-functions@7.20.7(@babel/core@7.26.0)': + '@babel/plugin-proposal-async-generator-functions@7.20.7(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 + '@babel/core': 7.27.4 '@babel/helper-environment-visitor': 7.24.7 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.27.4) transitivePeerDependencies: - supports-color - '@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.26.0)': + '@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-proposal-decorators@7.24.7(@babel/core@7.26.0)': + '@babel/plugin-proposal-decorators@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) - '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-syntax-decorators': 7.24.7(@babel/core@7.26.0) + '@babel/core': 7.27.4 + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-decorators': 7.27.1(@babel/core@7.27.4) transitivePeerDependencies: - supports-color - '@babel/plugin-proposal-export-default-from@7.24.7(@babel/core@7.26.0)': + '@babel/plugin-proposal-export-default-from@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-syntax-export-default-from': 7.24.7(@babel/core@7.26.0) + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-proposal-export-namespace-from@7.18.9(@babel/core@7.26.0)': + '@babel/plugin-proposal-export-namespace-from@7.18.9(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.26.0) + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.27.4) - '@babel/plugin-proposal-logical-assignment-operators@7.20.7(@babel/core@7.26.0)': + '@babel/plugin-proposal-logical-assignment-operators@7.20.7(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.26.0) + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.27.4) - '@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.26.0)': + '@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.26.0) + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.27.4) - '@babel/plugin-proposal-numeric-separator@7.18.6(@babel/core@7.26.0)': + '@babel/plugin-proposal-numeric-separator@7.18.6(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.26.0) + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.27.4) - '@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.26.0)': + '@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.27.4)': dependencies: - '@babel/compat-data': 7.26.3 - '@babel/core': 7.26.0 - '@babel/helper-compilation-targets': 7.25.9 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.26.0) - '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.26.0) + '@babel/compat-data': 7.27.5 + '@babel/core': 7.27.4 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.27.4) + '@babel/plugin-transform-parameters': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-proposal-optional-catch-binding@7.18.6(@babel/core@7.26.0)': + '@babel/plugin-proposal-optional-catch-binding@7.18.6(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.26.0) + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.27.4) - '@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.26.0)': + '@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.26.0) + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.27.4) transitivePeerDependencies: - supports-color - '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.26.0)': + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 + '@babel/core': 7.27.4 - '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.26.0)': + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.26.0)': + '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.26.0)': + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-decorators@7.24.7(@babel/core@7.26.0)': + '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.26.0)': + '@babel/plugin-syntax-decorators@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-export-default-from@7.24.7(@babel/core@7.26.0)': + '@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.26.0)': + '@babel/plugin-syntax-export-default-from@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.0)': + '@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-flow@7.26.0(@babel/core@7.26.0)': + '@babel/plugin-syntax-flow@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-import-assertions@7.26.0(@babel/core@7.26.0)': + '@babel/plugin-syntax-import-assertions@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-import-attributes@7.26.0(@babel/core@7.26.0)': + '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.26.0)': + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.26.0)': + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-jsx@7.24.7(@babel/core@7.26.0)': + '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.26.0)': + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.26.0)': + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.26.0)': + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.26.0)': + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.26.0)': + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.26.0)': + '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.26.0)': + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-typescript@7.24.7(@babel/core@7.26.0)': + '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-typescript@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.26.0)': + '@babel/plugin-transform-arrow-functions@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.0) - '@babel/helper-plugin-utils': 7.25.9 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-arrow-functions@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-transform-async-generator-functions@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 - - '@babel/plugin-transform-async-generator-functions@7.25.9(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 - '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.26.0) - '@babel/traverse': 7.26.4 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.27.4) + '@babel/traverse': 7.27.4 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-async-to-generator@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-transform-async-to-generator@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-module-imports': 7.25.9 - '@babel/helper-plugin-utils': 7.25.9 - '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.26.0) + '@babel/core': 7.27.4 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.27.4) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-block-scoped-functions@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-transform-block-scoped-functions@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-block-scoping@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-transform-block-scoping@7.27.5(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-class-properties@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-transform-class-properties@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) - '@babel/helper-plugin-utils': 7.25.9 + '@babel/core': 7.27.4 + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-class-static-block@7.26.0(@babel/core@7.26.0)': + '@babel/plugin-transform-class-static-block@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) - '@babel/helper-plugin-utils': 7.25.9 + '@babel/core': 7.27.4 + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-classes@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-transform-classes@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-compilation-targets': 7.25.9 - '@babel/helper-plugin-utils': 7.25.9 - '@babel/helper-replace-supers': 7.25.9(@babel/core@7.26.0) - '@babel/traverse': 7.26.4 + '@babel/core': 7.27.4 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.27.4) + '@babel/traverse': 7.27.4 globals: 11.12.0 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-computed-properties@7.25.9(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 - '@babel/template': 7.25.9 - - '@babel/plugin-transform-destructuring@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-transform-computed-properties@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/template': 7.27.2 - '@babel/plugin-transform-dotall-regex@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-transform-destructuring@7.27.3(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.0) - '@babel/helper-plugin-utils': 7.25.9 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-duplicate-keys@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-transform-dotall-regex@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/core': 7.27.4 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-transform-duplicate-keys@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.0) - '@babel/helper-plugin-utils': 7.25.9 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-dynamic-import@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/core': 7.27.4 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-exponentiation-operator@7.26.3(@babel/core@7.26.0)': + '@babel/plugin-transform-dynamic-import@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-export-namespace-from@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-transform-exponentiation-operator@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-flow-strip-types@7.24.7(@babel/core@7.26.0)': + '@babel/plugin-transform-export-namespace-from@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-syntax-flow': 7.24.7(@babel/core@7.26.0) + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-flow-strip-types@7.26.5(@babel/core@7.26.0)': + '@babel/plugin-transform-flow-strip-types@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-syntax-flow': 7.26.0(@babel/core@7.26.0) + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-flow': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-for-of@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-transform-for-of@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-function-name@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-transform-function-name@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-compilation-targets': 7.25.9 - '@babel/helper-plugin-utils': 7.25.9 - '@babel/traverse': 7.26.4 + '@babel/core': 7.27.4 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/traverse': 7.27.4 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-json-strings@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-transform-json-strings@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-literals@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-transform-literals@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-logical-assignment-operators@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-transform-logical-assignment-operators@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-member-expression-literals@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-transform-member-expression-literals@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-modules-amd@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-transform-modules-amd@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) - '@babel/helper-plugin-utils': 7.25.9 + '@babel/core': 7.27.4 + '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.4) + '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-commonjs@7.26.3(@babel/core@7.26.0)': + '@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) - '@babel/helper-plugin-utils': 7.25.9 + '@babel/core': 7.27.4 + '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.4) + '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-systemjs@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-transform-modules-systemjs@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) - '@babel/helper-plugin-utils': 7.25.9 - '@babel/helper-validator-identifier': 7.25.9 - '@babel/traverse': 7.26.4 + '@babel/core': 7.27.4 + '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.4) + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.27.4 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-umd@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-transform-modules-umd@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) - '@babel/helper-plugin-utils': 7.25.9 + '@babel/core': 7.27.4 + '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.4) + '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-named-capturing-groups-regex@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-transform-named-capturing-groups-regex@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.0) - '@babel/helper-plugin-utils': 7.25.9 + '@babel/core': 7.27.4 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-new-target@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-transform-new-target@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-nullish-coalescing-operator@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-transform-nullish-coalescing-operator@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-numeric-separator@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-transform-numeric-separator@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-object-rest-spread@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-transform-object-rest-spread@7.27.3(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-compilation-targets': 7.25.9 - '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.26.0) + '@babel/core': 7.27.4 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-destructuring': 7.27.3(@babel/core@7.27.4) + '@babel/plugin-transform-parameters': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-object-super@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-transform-object-super@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 - '@babel/helper-replace-supers': 7.25.9(@babel/core@7.26.0) + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.27.4) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-optional-catch-binding@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-transform-optional-catch-binding@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-optional-chaining@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-transform-optional-chaining@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-parameters@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-transform-parameters@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-private-methods@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-transform-private-methods@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) - '@babel/helper-plugin-utils': 7.25.9 + '@babel/core': 7.27.4 + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-private-property-in-object@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-transform-private-property-in-object@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) - '@babel/helper-plugin-utils': 7.25.9 + '@babel/core': 7.27.4 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-property-literals@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-transform-property-literals@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-react-display-name@7.24.7(@babel/core@7.26.0)': + '@babel/plugin-transform-react-display-name@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-react-jsx-development@7.24.7(@babel/core@7.26.0)': + '@babel/plugin-transform-react-jsx-development@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/plugin-transform-react-jsx': 7.25.9(@babel/core@7.26.0) + '@babel/core': 7.27.4 + '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.27.4) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-react-jsx-self@7.24.7(@babel/core@7.26.0)': + '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-react-jsx-source@7.24.7(@babel/core@7.26.0)': + '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-transform-react-jsx@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-module-imports': 7.25.9 - '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.0) - '@babel/types': 7.26.3 + '@babel/core': 7.27.4 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.27.4) + '@babel/types': 7.27.6 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-react-pure-annotations@7.24.7(@babel/core@7.26.0)': + '@babel/plugin-transform-react-pure-annotations@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-regenerator@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-transform-regenerator@7.27.5(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 - regenerator-transform: 0.15.2 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-regexp-modifiers@7.26.0(@babel/core@7.26.0)': + '@babel/plugin-transform-regexp-modifiers@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.0) - '@babel/helper-plugin-utils': 7.25.9 + '@babel/core': 7.27.4 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-reserved-words@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-transform-reserved-words@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-runtime@7.24.7(@babel/core@7.26.0)': + '@babel/plugin-transform-runtime@7.27.4(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-module-imports': 7.25.9 - '@babel/helper-plugin-utils': 7.25.9 - babel-plugin-polyfill-corejs2: 0.4.11(@babel/core@7.26.0) - babel-plugin-polyfill-corejs3: 0.10.6(@babel/core@7.26.0) - babel-plugin-polyfill-regenerator: 0.6.2(@babel/core@7.26.0) + '@babel/core': 7.27.4 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + babel-plugin-polyfill-corejs2: 0.4.13(@babel/core@7.27.4) + babel-plugin-polyfill-corejs3: 0.11.1(@babel/core@7.27.4) + babel-plugin-polyfill-regenerator: 0.6.4(@babel/core@7.27.4) semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-shorthand-properties@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-transform-shorthand-properties@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-spread@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-transform-spread@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-sticky-regex@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-transform-sticky-regex@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-template-literals@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-transform-template-literals@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-typeof-symbol@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-transform-typeof-symbol@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-typescript@7.24.7(@babel/core@7.26.0)': + '@babel/plugin-transform-typescript@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) - '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-syntax-typescript': 7.24.7(@babel/core@7.26.0) + '@babel/core': 7.27.4 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.27.4) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-typescript@7.26.8(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 - '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.26.0) - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-unicode-escapes@7.25.9(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 - - '@babel/plugin-transform-unicode-property-regex@7.25.9(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.0) - '@babel/helper-plugin-utils': 7.25.9 - - '@babel/plugin-transform-unicode-regex@7.25.9(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.0) - '@babel/helper-plugin-utils': 7.25.9 - - '@babel/plugin-transform-unicode-sets-regex@7.25.9(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.0) - '@babel/helper-plugin-utils': 7.25.9 - - '@babel/preset-env@7.26.0(@babel/core@7.26.0)': - dependencies: - '@babel/compat-data': 7.26.3 - '@babel/core': 7.26.0 - '@babel/helper-compilation-targets': 7.25.9 - '@babel/helper-plugin-utils': 7.25.9 - '@babel/helper-validator-option': 7.25.9 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.26.0) - '@babel/plugin-syntax-import-assertions': 7.26.0(@babel/core@7.26.0) - '@babel/plugin-syntax-import-attributes': 7.26.0(@babel/core@7.26.0) - '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.26.0) - '@babel/plugin-transform-arrow-functions': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-async-generator-functions': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-async-to-generator': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-block-scoped-functions': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-block-scoping': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-class-properties': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-class-static-block': 7.26.0(@babel/core@7.26.0) - '@babel/plugin-transform-classes': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-computed-properties': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-destructuring': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-dotall-regex': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-duplicate-keys': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-dynamic-import': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-exponentiation-operator': 7.26.3(@babel/core@7.26.0) - '@babel/plugin-transform-export-namespace-from': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-for-of': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-function-name': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-json-strings': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-literals': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-logical-assignment-operators': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-member-expression-literals': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-modules-amd': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-modules-commonjs': 7.26.3(@babel/core@7.26.0) - '@babel/plugin-transform-modules-systemjs': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-modules-umd': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-named-capturing-groups-regex': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-new-target': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-nullish-coalescing-operator': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-numeric-separator': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-object-rest-spread': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-object-super': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-optional-catch-binding': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-optional-chaining': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-private-methods': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-private-property-in-object': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-property-literals': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-regenerator': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-regexp-modifiers': 7.26.0(@babel/core@7.26.0) - '@babel/plugin-transform-reserved-words': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-shorthand-properties': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-spread': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-sticky-regex': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-template-literals': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-typeof-symbol': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-unicode-escapes': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-unicode-property-regex': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-unicode-regex': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-unicode-sets-regex': 7.25.9(@babel/core@7.26.0) - '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.26.0) - babel-plugin-polyfill-corejs2: 0.4.11(@babel/core@7.26.0) - babel-plugin-polyfill-corejs3: 0.10.6(@babel/core@7.26.0) - babel-plugin-polyfill-regenerator: 0.6.2(@babel/core@7.26.0) - core-js-compat: 3.39.0 + '@babel/plugin-transform-unicode-escapes@7.27.1(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-unicode-property-regex@7.27.1(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-unicode-regex@7.27.1(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-unicode-sets-regex@7.27.1(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/preset-env@7.27.2(@babel/core@7.27.4)': + dependencies: + '@babel/compat-data': 7.27.5 + '@babel/core': 7.27.4 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-option': 7.27.1 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.27.4) + '@babel/plugin-syntax-import-assertions': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.27.4) + '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-async-generator-functions': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-async-to-generator': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-block-scoped-functions': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-block-scoping': 7.27.5(@babel/core@7.27.4) + '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-class-static-block': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-classes': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-computed-properties': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-destructuring': 7.27.3(@babel/core@7.27.4) + '@babel/plugin-transform-dotall-regex': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-duplicate-keys': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-dynamic-import': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-exponentiation-operator': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-export-namespace-from': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-function-name': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-json-strings': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-literals': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-logical-assignment-operators': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-member-expression-literals': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-modules-amd': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-modules-systemjs': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-modules-umd': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-named-capturing-groups-regex': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-new-target': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-nullish-coalescing-operator': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-numeric-separator': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-object-rest-spread': 7.27.3(@babel/core@7.27.4) + '@babel/plugin-transform-object-super': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-optional-catch-binding': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-parameters': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-private-methods': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-private-property-in-object': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-property-literals': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-regenerator': 7.27.5(@babel/core@7.27.4) + '@babel/plugin-transform-regexp-modifiers': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-reserved-words': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-spread': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-sticky-regex': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-typeof-symbol': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-unicode-escapes': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-unicode-property-regex': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-unicode-sets-regex': 7.27.1(@babel/core@7.27.4) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.27.4) + babel-plugin-polyfill-corejs2: 0.4.13(@babel/core@7.27.4) + babel-plugin-polyfill-corejs3: 0.11.1(@babel/core@7.27.4) + babel-plugin-polyfill-regenerator: 0.6.4(@babel/core@7.27.4) + core-js-compat: 3.43.0 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/preset-flow@7.24.7(@babel/core@7.26.0)': + '@babel/preset-flow@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 - '@babel/helper-validator-option': 7.25.9 - '@babel/plugin-transform-flow-strip-types': 7.24.7(@babel/core@7.26.0) + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-option': 7.27.1 + '@babel/plugin-transform-flow-strip-types': 7.27.1(@babel/core@7.27.4) - '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.26.0)': + '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 - '@babel/types': 7.26.3 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/types': 7.27.6 esutils: 2.0.3 - '@babel/preset-react@7.24.7(@babel/core@7.26.0)': + '@babel/preset-react@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-validator-option': 7.25.9 - '@babel/plugin-transform-react-display-name': 7.24.7(@babel/core@7.26.0) - '@babel/plugin-transform-react-jsx': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-react-jsx-development': 7.24.7(@babel/core@7.26.0) - '@babel/plugin-transform-react-pure-annotations': 7.24.7(@babel/core@7.26.0) + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-option': 7.27.1 + '@babel/plugin-transform-react-display-name': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-react-jsx-development': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-react-pure-annotations': 7.27.1(@babel/core@7.27.4) transitivePeerDependencies: - supports-color - '@babel/preset-typescript@7.24.7(@babel/core@7.26.0)': + '@babel/preset-typescript@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 - '@babel/helper-validator-option': 7.25.9 - '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.26.0) - '@babel/plugin-transform-modules-commonjs': 7.26.3(@babel/core@7.26.0) - '@babel/plugin-transform-typescript': 7.24.7(@babel/core@7.26.0) + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-option': 7.27.1 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-typescript': 7.27.1(@babel/core@7.27.4) transitivePeerDependencies: - supports-color - '@babel/register@7.24.6(@babel/core@7.26.0)': + '@babel/register@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.0 + '@babel/core': 7.27.4 clone-deep: 4.0.1 find-cache-dir: 2.1.0 make-dir: 2.1.0 - pirates: 4.0.6 + pirates: 4.0.7 source-map-support: 0.5.21 - '@babel/runtime@7.24.7': - dependencies: - regenerator-runtime: 0.14.1 - - '@babel/runtime@7.26.10': - dependencies: - regenerator-runtime: 0.14.1 + '@babel/runtime@7.27.6': {} - '@babel/template@7.25.9': + '@babel/template@7.27.2': dependencies: - '@babel/code-frame': 7.26.2 - '@babel/parser': 7.26.3 - '@babel/types': 7.26.3 + '@babel/code-frame': 7.27.1 + '@babel/parser': 7.27.5 + '@babel/types': 7.27.6 - '@babel/traverse@7.26.4': + '@babel/traverse@7.27.4': dependencies: - '@babel/code-frame': 7.26.2 - '@babel/generator': 7.26.3 - '@babel/parser': 7.26.3 - '@babel/template': 7.25.9 - '@babel/types': 7.26.3 - debug: 4.4.0 + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.27.5 + '@babel/parser': 7.27.5 + '@babel/template': 7.27.2 + '@babel/types': 7.27.6 + debug: 4.4.1 globals: 11.12.0 transitivePeerDependencies: - supports-color - '@babel/types@7.26.3': + '@babel/types@7.27.6': dependencies: - '@babel/helper-string-parser': 7.25.9 - '@babel/helper-validator-identifier': 7.25.9 + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 '@bcoe/v8-coverage@0.2.3': {} @@ -9099,18 +8995,15 @@ snapshots: '@biomejs/cli-win32-x64@1.9.4': optional: true - '@bufbuild/protobuf@2.2.3': {} - - '@bufbuild/protobuf@2.2.5': {} + '@bufbuild/protobuf@2.5.2': {} - '@changesets/apply-release-plan@7.0.3': + '@changesets/apply-release-plan@7.0.12': dependencies: - '@babel/runtime': 7.24.7 - '@changesets/config': 3.0.1 + '@changesets/config': 3.1.1 '@changesets/get-version-range-type': 0.4.0 - '@changesets/git': 3.0.0 - '@changesets/should-skip-package': 0.1.0 - '@changesets/types': 6.0.0 + '@changesets/git': 3.0.4 + '@changesets/should-skip-package': 0.1.2 + '@changesets/types': 6.1.0 '@manypkg/get-packages': 1.1.3 detect-indent: 6.1.0 fs-extra: 7.0.1 @@ -9118,152 +9011,138 @@ snapshots: outdent: 0.5.0 prettier: 2.8.8 resolve-from: 5.0.0 - semver: 7.6.2 + semver: 7.7.2 - '@changesets/assemble-release-plan@6.0.2': + '@changesets/assemble-release-plan@6.0.8': dependencies: - '@babel/runtime': 7.24.7 '@changesets/errors': 0.2.0 - '@changesets/get-dependents-graph': 2.1.0 - '@changesets/should-skip-package': 0.1.0 - '@changesets/types': 6.0.0 + '@changesets/get-dependents-graph': 2.1.3 + '@changesets/should-skip-package': 0.1.2 + '@changesets/types': 6.1.0 '@manypkg/get-packages': 1.1.3 - semver: 7.6.2 + semver: 7.7.2 - '@changesets/changelog-git@0.2.0': + '@changesets/changelog-git@0.2.1': dependencies: - '@changesets/types': 6.0.0 + '@changesets/types': 6.1.0 - '@changesets/cli@2.27.5': + '@changesets/cli@2.29.4': dependencies: - '@babel/runtime': 7.24.7 - '@changesets/apply-release-plan': 7.0.3 - '@changesets/assemble-release-plan': 6.0.2 - '@changesets/changelog-git': 0.2.0 - '@changesets/config': 3.0.1 + '@changesets/apply-release-plan': 7.0.12 + '@changesets/assemble-release-plan': 6.0.8 + '@changesets/changelog-git': 0.2.1 + '@changesets/config': 3.1.1 '@changesets/errors': 0.2.0 - '@changesets/get-dependents-graph': 2.1.0 - '@changesets/get-release-plan': 4.0.2 - '@changesets/git': 3.0.0 - '@changesets/logger': 0.1.0 - '@changesets/pre': 2.0.0 - '@changesets/read': 0.6.0 - '@changesets/should-skip-package': 0.1.0 - '@changesets/types': 6.0.0 - '@changesets/write': 0.3.1 + '@changesets/get-dependents-graph': 2.1.3 + '@changesets/get-release-plan': 4.0.12 + '@changesets/git': 3.0.4 + '@changesets/logger': 0.1.1 + '@changesets/pre': 2.0.2 + '@changesets/read': 0.6.5 + '@changesets/should-skip-package': 0.1.2 + '@changesets/types': 6.1.0 + '@changesets/write': 0.4.0 '@manypkg/get-packages': 1.1.3 - '@types/semver': 7.5.8 ansi-colors: 4.1.3 - chalk: 2.4.2 ci-info: 3.9.0 enquirer: 2.4.1 external-editor: 3.1.0 fs-extra: 7.0.1 - human-id: 1.0.2 - meow: 6.1.1 - outdent: 0.5.0 + mri: 1.2.0 p-limit: 2.3.0 - preferred-pm: 3.1.3 + package-manager-detector: 0.2.11 + picocolors: 1.1.1 resolve-from: 5.0.0 - semver: 7.6.2 - spawndamnit: 2.0.0 + semver: 7.7.2 + spawndamnit: 3.0.1 term-size: 2.2.1 - tty-table: 4.2.3 - '@changesets/config@3.0.1': + '@changesets/config@3.1.1': dependencies: '@changesets/errors': 0.2.0 - '@changesets/get-dependents-graph': 2.1.0 - '@changesets/logger': 0.1.0 - '@changesets/types': 6.0.0 + '@changesets/get-dependents-graph': 2.1.3 + '@changesets/logger': 0.1.1 + '@changesets/types': 6.1.0 '@manypkg/get-packages': 1.1.3 fs-extra: 7.0.1 - micromatch: 4.0.7 + micromatch: 4.0.8 '@changesets/errors@0.2.0': dependencies: extendable-error: 0.1.7 - '@changesets/get-dependents-graph@2.1.0': + '@changesets/get-dependents-graph@2.1.3': dependencies: - '@changesets/types': 6.0.0 + '@changesets/types': 6.1.0 '@manypkg/get-packages': 1.1.3 - chalk: 2.4.2 - fs-extra: 7.0.1 - semver: 7.6.2 + picocolors: 1.1.1 + semver: 7.7.2 - '@changesets/get-release-plan@4.0.2': + '@changesets/get-release-plan@4.0.12': dependencies: - '@babel/runtime': 7.24.7 - '@changesets/assemble-release-plan': 6.0.2 - '@changesets/config': 3.0.1 - '@changesets/pre': 2.0.0 - '@changesets/read': 0.6.0 - '@changesets/types': 6.0.0 + '@changesets/assemble-release-plan': 6.0.8 + '@changesets/config': 3.1.1 + '@changesets/pre': 2.0.2 + '@changesets/read': 0.6.5 + '@changesets/types': 6.1.0 '@manypkg/get-packages': 1.1.3 '@changesets/get-version-range-type@0.4.0': {} - '@changesets/git@3.0.0': + '@changesets/git@3.0.4': dependencies: - '@babel/runtime': 7.24.7 '@changesets/errors': 0.2.0 - '@changesets/types': 6.0.0 '@manypkg/get-packages': 1.1.3 is-subdir: 1.2.0 - micromatch: 4.0.7 - spawndamnit: 2.0.0 + micromatch: 4.0.8 + spawndamnit: 3.0.1 - '@changesets/logger@0.1.0': + '@changesets/logger@0.1.1': dependencies: - chalk: 2.4.2 + picocolors: 1.1.1 - '@changesets/parse@0.4.0': + '@changesets/parse@0.4.1': dependencies: - '@changesets/types': 6.0.0 + '@changesets/types': 6.1.0 js-yaml: 3.14.1 - '@changesets/pre@2.0.0': + '@changesets/pre@2.0.2': dependencies: - '@babel/runtime': 7.24.7 '@changesets/errors': 0.2.0 - '@changesets/types': 6.0.0 + '@changesets/types': 6.1.0 '@manypkg/get-packages': 1.1.3 fs-extra: 7.0.1 - '@changesets/read@0.6.0': + '@changesets/read@0.6.5': dependencies: - '@babel/runtime': 7.24.7 - '@changesets/git': 3.0.0 - '@changesets/logger': 0.1.0 - '@changesets/parse': 0.4.0 - '@changesets/types': 6.0.0 - chalk: 2.4.2 + '@changesets/git': 3.0.4 + '@changesets/logger': 0.1.1 + '@changesets/parse': 0.4.1 + '@changesets/types': 6.1.0 fs-extra: 7.0.1 p-filter: 2.1.0 + picocolors: 1.1.1 - '@changesets/should-skip-package@0.1.0': + '@changesets/should-skip-package@0.1.2': dependencies: - '@babel/runtime': 7.24.7 - '@changesets/types': 6.0.0 + '@changesets/types': 6.1.0 '@manypkg/get-packages': 1.1.3 '@changesets/types@4.1.0': {} - '@changesets/types@6.0.0': {} + '@changesets/types@6.1.0': {} - '@changesets/write@0.3.1': + '@changesets/write@0.4.0': dependencies: - '@babel/runtime': 7.24.7 - '@changesets/types': 6.0.0 + '@changesets/types': 6.1.0 fs-extra: 7.0.1 - human-id: 1.0.2 + human-id: 4.1.1 prettier: 2.8.8 - '@cheqd/sdk@5.2.1': + '@cheqd/sdk@5.3.1': dependencies: - '@cheqd/ts-proto': 4.0.2 - '@cheqd/ts-proto-cjs': '@cheqd/ts-proto@2.4.1' + '@cheqd/ts-proto': 4.1.1 + '@cheqd/ts-proto-cjs': '@cheqd/ts-proto@2.5.0' '@cosmjs/amino': 0.33.1 '@cosmjs/amino-cjs': '@cosmjs/amino@0.30.1' '@cosmjs/crypto': 0.33.1 @@ -9286,16 +9165,16 @@ snapshots: '@types/secp256k1-cjs': '@types/secp256k1@4.0.6' cosmjs-types: 0.9.0 cosmjs-types-cjs: cosmjs-types@0.7.2 - did-jwt: 8.0.9 - did-jwt-cjs: did-jwt@8.0.9 + did-jwt: 8.0.17 + did-jwt-cjs: did-jwt@8.0.17 did-resolver: 4.1.0 did-resolver-cjs: did-resolver@4.1.0 exponential-backoff: 3.1.2 exponential-backoff-cjs: exponential-backoff@3.1.2 - file-type: 20.4.1 + file-type: 20.5.0 file-type-cjs: file-type@16.5.4 long-cjs: long@4.0.0 - multiformats: 13.3.2 + multiformats: 13.3.7 multiformats-cjs: multiformats@9.9.0 secp256k1: 5.0.1 secp256k1-cjs: secp256k1@5.0.1 @@ -9311,19 +9190,25 @@ snapshots: '@cheqd/ts-proto@2.4.1': dependencies: - '@bufbuild/protobuf': 2.2.3 - long: 5.2.3 - protobufjs: 7.4.0 + '@bufbuild/protobuf': 2.5.2 + long: 5.3.2 + protobufjs: 7.5.3 + + '@cheqd/ts-proto@2.5.0': + dependencies: + '@bufbuild/protobuf': 2.5.2 + long: 5.3.2 + protobufjs: 7.5.3 - '@cheqd/ts-proto@4.0.2': + '@cheqd/ts-proto@4.1.1': dependencies: - '@bufbuild/protobuf': 2.2.5 - long: 5.3.1 - protobufjs: 7.4.0 + '@bufbuild/protobuf': 2.5.2 + long: 5.3.2 + protobufjs: 7.5.3 '@confio/ics23@0.6.8': dependencies: - '@noble/hashes': 1.7.1 + '@noble/hashes': 1.8.0 protobufjs: 6.11.4 '@cosmjs/amino@0.30.1': @@ -9345,18 +9230,18 @@ snapshots: '@cosmjs/encoding': 0.30.1 '@cosmjs/math': 0.30.1 '@cosmjs/utils': 0.30.1 - '@noble/hashes': 1.6.1 - bn.js: 5.2.1 + '@noble/hashes': 1.8.0 + bn.js: 5.2.2 elliptic: 6.6.1 - libsodium-wrappers: 0.7.13 + libsodium-wrappers: 0.7.15 '@cosmjs/crypto@0.33.1': dependencies: '@cosmjs/encoding': 0.33.1 '@cosmjs/math': 0.33.1 '@cosmjs/utils': 0.33.1 - '@noble/hashes': 1.7.1 - bn.js: 5.2.1 + '@noble/hashes': 1.8.0 + bn.js: 5.2.2 elliptic: 6.6.1 libsodium-wrappers-sumo: 0.7.15 @@ -9384,11 +9269,11 @@ snapshots: '@cosmjs/math@0.30.1': dependencies: - bn.js: 5.2.1 + bn.js: 5.2.2 '@cosmjs/math@0.33.1': dependencies: - bn.js: 5.2.1 + bn.js: 5.2.2 '@cosmjs/proto-signing@0.30.1': dependencies: @@ -9497,7 +9382,7 @@ snapshots: '@cosmjs/socket': 0.33.1 '@cosmjs/stream': 0.33.1 '@cosmjs/utils': 0.33.1 - axios: 1.7.9 + axios: 1.9.0 readonly-date: 1.0.0 xstream: 11.14.0 transitivePeerDependencies: @@ -9509,10 +9394,10 @@ snapshots: '@cosmjs/utils@0.33.1': {} - '@craftzdog/react-native-buffer@6.1.0(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1))(react@18.3.1)': + '@craftzdog/react-native-buffer@6.1.0(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': dependencies: ieee754: 1.2.1 - react-native-quick-base64: 2.2.0(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1))(react@18.3.1) + react-native-quick-base64: 2.2.0(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) transitivePeerDependencies: - react - react-native @@ -9521,6 +9406,8 @@ snapshots: dependencies: '@jridgewell/trace-mapping': 0.3.9 + '@cto.af/wtf8@0.0.2': {} + '@digitalbazaar/bitstring@3.1.0': dependencies: base64url-universal: 2.0.0 @@ -9530,7 +9417,7 @@ snapshots: dependencies: ky: 0.33.3 ky-universal: 0.11.0(ky@0.33.3)(web-streams-polyfill@3.3.3) - undici: 6.21.0 + undici: 6.21.3 transitivePeerDependencies: - web-streams-polyfill @@ -9550,8 +9437,8 @@ snapshots: '@digitalbazaar/vc@5.0.0(web-streams-polyfill@3.3.3)': dependencies: credentials-context: 2.0.0 - jsonld: 8.3.2(web-streams-polyfill@3.3.3) - jsonld-signatures: 11.2.1(web-streams-polyfill@3.3.3) + jsonld: 8.3.3(web-streams-polyfill@3.3.3) + jsonld-signatures: 11.5.0(web-streams-polyfill@3.3.3) transitivePeerDependencies: - web-streams-polyfill @@ -9566,11 +9453,11 @@ snapshots: '@digitalcredentials/base64url-universal': 2.0.6 pako: 2.1.0 - '@digitalcredentials/ed25519-signature-2020@3.0.2(expo@51.0.29(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0)))(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1))(web-streams-polyfill@3.3.3)': + '@digitalcredentials/ed25519-signature-2020@3.0.2(expo@51.0.29(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1))(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(web-streams-polyfill@3.3.3)': dependencies: '@digitalcredentials/base58-universal': 1.0.1 '@digitalcredentials/ed25519-verification-key-2020': 3.2.2 - '@digitalcredentials/jsonld-signatures': 9.4.0(expo@51.0.29(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0)))(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1))(web-streams-polyfill@3.3.3) + '@digitalcredentials/jsonld-signatures': 9.4.0(expo@51.0.29(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1))(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(web-streams-polyfill@3.3.3) ed25519-signature-2018-context: 1.1.0 ed25519-signature-2020-context: 1.1.0 transitivePeerDependencies: @@ -9594,12 +9481,12 @@ snapshots: - domexception - web-streams-polyfill - '@digitalcredentials/jsonld-signatures@9.4.0(expo@51.0.29(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0)))(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1))(web-streams-polyfill@3.3.3)': + '@digitalcredentials/jsonld-signatures@9.4.0(expo@51.0.29(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1))(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(web-streams-polyfill@3.3.3)': dependencies: '@digitalbazaar/security-context': 1.0.1 - '@digitalcredentials/jsonld': 6.0.0(expo@51.0.29(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0)))(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1))(web-streams-polyfill@3.3.3) + '@digitalcredentials/jsonld': 6.0.0(expo@51.0.29(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1))(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(web-streams-polyfill@3.3.3) fast-text-encoding: 1.0.6 - isomorphic-webcrypto: 2.3.8(expo@51.0.29(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0)))(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1)) + isomorphic-webcrypto: 2.3.8(expo@51.0.29(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1))(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) serialize-error: 8.1.0 transitivePeerDependencies: - domexception @@ -9607,10 +9494,10 @@ snapshots: - react-native - web-streams-polyfill - '@digitalcredentials/jsonld@5.2.2(expo@51.0.29(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0)))(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1))(web-streams-polyfill@3.3.3)': + '@digitalcredentials/jsonld@5.2.2(expo@51.0.29(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1))(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(web-streams-polyfill@3.3.3)': dependencies: '@digitalcredentials/http-client': 1.2.2(web-streams-polyfill@3.3.3) - '@digitalcredentials/rdf-canonize': 1.0.0(expo@51.0.29(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0)))(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1)) + '@digitalcredentials/rdf-canonize': 1.0.0(expo@51.0.29(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1))(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) canonicalize: 1.0.8 lru-cache: 6.0.0 transitivePeerDependencies: @@ -9619,10 +9506,10 @@ snapshots: - react-native - web-streams-polyfill - '@digitalcredentials/jsonld@6.0.0(expo@51.0.29(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0)))(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1))(web-streams-polyfill@3.3.3)': + '@digitalcredentials/jsonld@6.0.0(expo@51.0.29(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1))(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(web-streams-polyfill@3.3.3)': dependencies: '@digitalcredentials/http-client': 1.2.2(web-streams-polyfill@3.3.3) - '@digitalcredentials/rdf-canonize': 1.0.0(expo@51.0.29(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0)))(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1)) + '@digitalcredentials/rdf-canonize': 1.0.0(expo@51.0.29(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1))(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) canonicalize: 1.0.8 lru-cache: 6.0.0 transitivePeerDependencies: @@ -9633,19 +9520,19 @@ snapshots: '@digitalcredentials/open-badges-context@2.1.0': {} - '@digitalcredentials/rdf-canonize@1.0.0(expo@51.0.29(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0)))(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1))': + '@digitalcredentials/rdf-canonize@1.0.0(expo@51.0.29(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1))(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': dependencies: fast-text-encoding: 1.0.6 - isomorphic-webcrypto: 2.3.8(expo@51.0.29(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0)))(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1)) + isomorphic-webcrypto: 2.3.8(expo@51.0.29(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1))(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) transitivePeerDependencies: - expo - react-native - '@digitalcredentials/vc-status-list@5.0.2(expo@51.0.29(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0)))(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1))(web-streams-polyfill@3.3.3)': + '@digitalcredentials/vc-status-list@5.0.2(expo@51.0.29(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1))(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(web-streams-polyfill@3.3.3)': dependencies: '@digitalbazaar/vc-status-list-context': 3.1.1 '@digitalcredentials/bitstring': 2.0.1 - '@digitalcredentials/vc': 4.2.0(expo@51.0.29(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0)))(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1))(web-streams-polyfill@3.3.3) + '@digitalcredentials/vc': 4.2.0(expo@51.0.29(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1))(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(web-streams-polyfill@3.3.3) credentials-context: 2.0.0 transitivePeerDependencies: - domexception @@ -9653,10 +9540,10 @@ snapshots: - react-native - web-streams-polyfill - '@digitalcredentials/vc@4.2.0(expo@51.0.29(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0)))(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1))(web-streams-polyfill@3.3.3)': + '@digitalcredentials/vc@4.2.0(expo@51.0.29(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1))(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(web-streams-polyfill@3.3.3)': dependencies: - '@digitalcredentials/jsonld': 5.2.2(expo@51.0.29(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0)))(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1))(web-streams-polyfill@3.3.3) - '@digitalcredentials/jsonld-signatures': 9.4.0(expo@51.0.29(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0)))(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1))(web-streams-polyfill@3.3.3) + '@digitalcredentials/jsonld': 5.2.2(expo@51.0.29(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1))(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(web-streams-polyfill@3.3.3) + '@digitalcredentials/jsonld-signatures': 9.4.0(expo@51.0.29(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1))(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(web-streams-polyfill@3.3.3) credentials-context: 2.0.0 transitivePeerDependencies: - domexception @@ -9664,14 +9551,14 @@ snapshots: - react-native - web-streams-polyfill - '@digitalcredentials/vc@6.0.1(expo@51.0.29(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0)))(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1))(web-streams-polyfill@3.3.3)': + '@digitalcredentials/vc@6.0.1(expo@51.0.29(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1))(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(web-streams-polyfill@3.3.3)': dependencies: '@digitalbazaar/vc-status-list': 7.1.0(web-streams-polyfill@3.3.3) - '@digitalcredentials/ed25519-signature-2020': 3.0.2(expo@51.0.29(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0)))(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1))(web-streams-polyfill@3.3.3) - '@digitalcredentials/jsonld': 6.0.0(expo@51.0.29(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0)))(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1))(web-streams-polyfill@3.3.3) - '@digitalcredentials/jsonld-signatures': 9.4.0(expo@51.0.29(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0)))(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1))(web-streams-polyfill@3.3.3) + '@digitalcredentials/ed25519-signature-2020': 3.0.2(expo@51.0.29(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1))(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(web-streams-polyfill@3.3.3) + '@digitalcredentials/jsonld': 6.0.0(expo@51.0.29(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1))(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(web-streams-polyfill@3.3.3) + '@digitalcredentials/jsonld-signatures': 9.4.0(expo@51.0.29(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1))(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(web-streams-polyfill@3.3.3) '@digitalcredentials/open-badges-context': 2.1.0 - '@digitalcredentials/vc-status-list': 5.0.2(expo@51.0.29(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0)))(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1))(web-streams-polyfill@3.3.3) + '@digitalcredentials/vc-status-list': 5.0.2(expo@51.0.29(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1))(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(web-streams-polyfill@3.3.3) credentials-context: 2.0.0 fix-esm: 1.0.1 transitivePeerDependencies: @@ -9681,76 +9568,79 @@ snapshots: - supports-color - web-streams-polyfill - '@esbuild/aix-ppc64@0.23.1': + '@esbuild/aix-ppc64@0.25.5': + optional: true + + '@esbuild/android-arm64@0.25.5': optional: true - '@esbuild/android-arm64@0.23.1': + '@esbuild/android-arm@0.25.5': optional: true - '@esbuild/android-arm@0.23.1': + '@esbuild/android-x64@0.25.5': optional: true - '@esbuild/android-x64@0.23.1': + '@esbuild/darwin-arm64@0.25.5': optional: true - '@esbuild/darwin-arm64@0.23.1': + '@esbuild/darwin-x64@0.25.5': optional: true - '@esbuild/darwin-x64@0.23.1': + '@esbuild/freebsd-arm64@0.25.5': optional: true - '@esbuild/freebsd-arm64@0.23.1': + '@esbuild/freebsd-x64@0.25.5': optional: true - '@esbuild/freebsd-x64@0.23.1': + '@esbuild/linux-arm64@0.25.5': optional: true - '@esbuild/linux-arm64@0.23.1': + '@esbuild/linux-arm@0.25.5': optional: true - '@esbuild/linux-arm@0.23.1': + '@esbuild/linux-ia32@0.25.5': optional: true - '@esbuild/linux-ia32@0.23.1': + '@esbuild/linux-loong64@0.25.5': optional: true - '@esbuild/linux-loong64@0.23.1': + '@esbuild/linux-mips64el@0.25.5': optional: true - '@esbuild/linux-mips64el@0.23.1': + '@esbuild/linux-ppc64@0.25.5': optional: true - '@esbuild/linux-ppc64@0.23.1': + '@esbuild/linux-riscv64@0.25.5': optional: true - '@esbuild/linux-riscv64@0.23.1': + '@esbuild/linux-s390x@0.25.5': optional: true - '@esbuild/linux-s390x@0.23.1': + '@esbuild/linux-x64@0.25.5': optional: true - '@esbuild/linux-x64@0.23.1': + '@esbuild/netbsd-arm64@0.25.5': optional: true - '@esbuild/netbsd-x64@0.23.1': + '@esbuild/netbsd-x64@0.25.5': optional: true - '@esbuild/openbsd-arm64@0.23.1': + '@esbuild/openbsd-arm64@0.25.5': optional: true - '@esbuild/openbsd-x64@0.23.1': + '@esbuild/openbsd-x64@0.25.5': optional: true - '@esbuild/sunos-x64@0.23.1': + '@esbuild/sunos-x64@0.25.5': optional: true - '@esbuild/win32-arm64@0.23.1': + '@esbuild/win32-arm64@0.25.5': optional: true - '@esbuild/win32-ia32@0.23.1': + '@esbuild/win32-ia32@0.25.5': optional: true - '@esbuild/win32-x64@0.23.1': + '@esbuild/win32-x64@0.25.5': optional: true '@ethersproject/abi@5.8.0': @@ -9799,7 +9689,7 @@ snapshots: dependencies: '@ethersproject/bytes': 5.8.0 '@ethersproject/logger': 5.8.0 - bn.js: 5.2.1 + bn.js: 5.2.2 '@ethersproject/bytes@5.8.0': dependencies: @@ -9846,7 +9736,7 @@ snapshots: '@ethersproject/bytes': 5.8.0 '@ethersproject/logger': 5.8.0 '@ethersproject/properties': 5.8.0 - bn.js: 5.2.1 + bn.js: 5.2.2 elliptic: 6.6.1 hash.js: 1.1.7 @@ -9876,31 +9766,28 @@ snapshots: '@ethersproject/properties': 5.8.0 '@ethersproject/strings': 5.8.0 - '@expo/bunyan@4.0.0': + '@expo/bunyan@4.0.1': dependencies: uuid: 8.3.2 - optionalDependencies: - mv: 2.1.1 - safe-json-stringify: 1.2.0 '@expo/cli@0.18.29(expo-modules-autolinking@1.11.2)': dependencies: - '@babel/runtime': 7.26.10 + '@babel/runtime': 7.27.6 '@expo/code-signing-certificates': 0.0.5 '@expo/config': 9.0.3 '@expo/config-plugins': 8.0.8 - '@expo/devcert': 1.1.2 + '@expo/devcert': 1.2.0 '@expo/env': 0.3.0 '@expo/image-utils': 0.5.1 '@expo/json-file': 8.3.3 '@expo/metro-config': 0.18.11 - '@expo/osascript': 2.1.3 - '@expo/package-manager': 1.5.2 + '@expo/osascript': 2.2.4 + '@expo/package-manager': 1.8.4 '@expo/plist': 0.1.3 '@expo/prebuild-config': 7.0.8(expo-modules-autolinking@1.11.2) '@expo/rudder-sdk-node': 1.1.1 '@expo/spawn-async': 1.7.2 - '@expo/xcpretty': 4.3.1 + '@expo/xcpretty': 4.3.2 '@react-native/dev-middleware': 0.74.85 '@urql/core': 2.3.6(graphql@15.8.0) '@urql/exchange-retry': 0.3.0(graphql@15.8.0) @@ -9909,15 +9796,15 @@ snapshots: better-opn: 3.0.2 bplist-creator: 0.0.7 bplist-parser: 0.3.2 - cacache: 18.0.3 + cacache: 18.0.4 chalk: 4.1.2 ci-info: 3.9.0 connect: 3.7.0 - debug: 4.4.0 + debug: 4.4.1 env-editor: 0.4.2 - fast-glob: 3.3.2 + fast-glob: 3.3.3 find-yarn-workspace-root: 2.0.0 - form-data: 3.0.1 + form-data: 3.0.3 freeport-async: 2.0.0 fs-extra: 8.1.0 getenv: 1.0.0 @@ -9945,14 +9832,14 @@ snapshots: qrcode-terminal: 0.11.0 require-from-string: 2.0.2 requireg: 0.2.2 - resolve: 1.22.8 + resolve: 1.22.10 resolve-from: 5.0.0 - resolve.exports: 2.0.2 - semver: 7.6.2 + resolve.exports: 2.0.3 + semver: 7.7.2 send: 0.18.0 slugify: 1.6.6 source-map-support: 0.5.21 - stacktrace-parser: 0.1.10 + stacktrace-parser: 0.1.11 structured-headers: 0.4.1 tar: 6.2.1 temp-dir: 2.0.0 @@ -9961,7 +9848,7 @@ snapshots: text-table: 0.2.0 url-join: 4.0.0 wrap-ansi: 7.0.0 - ws: 8.17.1 + ws: 8.18.2 transitivePeerDependencies: - bufferutil - encoding @@ -9976,17 +9863,17 @@ snapshots: '@expo/config-plugins@8.0.8': dependencies: - '@expo/config-types': 51.0.1 + '@expo/config-types': 51.0.3 '@expo/json-file': 8.3.3 '@expo/plist': 0.1.3 '@expo/sdk-runtime-versions': 1.0.0 chalk: 4.1.2 - debug: 4.4.0 + debug: 4.4.1 find-up: 5.0.0 getenv: 1.0.0 glob: 7.1.6 resolve-from: 5.0.0 - semver: 7.6.2 + semver: 7.7.2 slash: 3.0.0 slugify: 1.6.6 xcode: 3.0.1 @@ -9994,48 +9881,38 @@ snapshots: transitivePeerDependencies: - supports-color - '@expo/config-types@51.0.1': {} + '@expo/config-types@51.0.3': {} '@expo/config@9.0.3': dependencies: '@babel/code-frame': 7.10.4 '@expo/config-plugins': 8.0.8 - '@expo/config-types': 51.0.1 + '@expo/config-types': 51.0.3 '@expo/json-file': 8.3.3 getenv: 1.0.0 glob: 7.1.6 require-from-string: 2.0.2 resolve-from: 5.0.0 - semver: 7.6.2 + semver: 7.7.2 slugify: 1.6.6 sucrase: 3.34.0 transitivePeerDependencies: - supports-color - '@expo/devcert@1.1.2': + '@expo/devcert@1.2.0': dependencies: - application-config-path: 0.1.1 - command-exists: 1.2.9 + '@expo/sudo-prompt': 9.3.2 debug: 3.2.7 - eol: 0.9.1 - get-port: 3.2.0 - glob: 7.2.3 - lodash: 4.17.21 - mkdirp: 0.5.6 - password-prompt: 1.1.3 - rimraf: 2.7.1 - sudo-prompt: 8.2.5 - tmp: 0.0.33 - tslib: 2.8.1 + glob: 10.4.5 transitivePeerDependencies: - supports-color '@expo/env@0.3.0': dependencies: chalk: 4.1.2 - debug: 4.4.0 - dotenv: 16.4.5 - dotenv-expand: 11.0.6 + debug: 4.4.1 + dotenv: 16.4.7 + dotenv-expand: 11.0.7 getenv: 1.0.0 transitivePeerDependencies: - supports-color @@ -10050,7 +9927,7 @@ snapshots: node-fetch: 2.7.0 parse-png: 2.1.0 resolve-from: 5.0.0 - semver: 7.6.2 + semver: 7.7.2 tempy: 0.3.0 transitivePeerDependencies: - encoding @@ -10061,48 +9938,47 @@ snapshots: json5: 2.2.3 write-file-atomic: 2.4.3 + '@expo/json-file@9.1.4': + dependencies: + '@babel/code-frame': 7.10.4 + json5: 2.2.3 + '@expo/metro-config@0.18.11': dependencies: - '@babel/core': 7.26.0 - '@babel/generator': 7.26.3 - '@babel/parser': 7.26.3 - '@babel/types': 7.26.3 + '@babel/core': 7.27.4 + '@babel/generator': 7.27.5 + '@babel/parser': 7.27.5 + '@babel/types': 7.27.6 '@expo/config': 9.0.3 '@expo/env': 0.3.0 '@expo/json-file': 8.3.3 '@expo/spawn-async': 1.7.2 chalk: 4.1.2 - debug: 4.4.0 + debug: 4.4.1 find-yarn-workspace-root: 2.0.0 fs-extra: 9.1.0 getenv: 1.0.0 glob: 7.2.3 jsc-safe-url: 0.2.4 lightningcss: 1.19.0 - postcss: 8.4.38 + postcss: 8.4.49 resolve-from: 5.0.0 transitivePeerDependencies: - supports-color - '@expo/osascript@2.1.3': + '@expo/osascript@2.2.4': dependencies: '@expo/spawn-async': 1.7.2 exec-async: 2.2.0 - '@expo/package-manager@1.5.2': + '@expo/package-manager@1.8.4': dependencies: - '@expo/json-file': 8.3.3 + '@expo/json-file': 9.1.4 '@expo/spawn-async': 1.7.2 - ansi-regex: 5.0.1 chalk: 4.1.2 - find-up: 5.0.0 - find-yarn-workspace-root: 2.0.0 - js-yaml: 3.14.1 - micromatch: 4.0.7 - npm-package-arg: 7.0.0 + npm-package-arg: 11.0.3 ora: 3.4.0 - split: 1.0.1 - sudo-prompt: 9.1.1 + resolve-workspace-root: 2.0.0 '@expo/plist@0.1.3': dependencies: @@ -10114,15 +9990,15 @@ snapshots: dependencies: '@expo/config': 9.0.3 '@expo/config-plugins': 8.0.8 - '@expo/config-types': 51.0.1 + '@expo/config-types': 51.0.3 '@expo/image-utils': 0.5.1 '@expo/json-file': 8.3.3 '@react-native/normalize-colors': 0.74.85 - debug: 4.4.0 + debug: 4.4.1 expo-modules-autolinking: 1.11.2 fs-extra: 9.1.0 resolve-from: 5.0.0 - semver: 7.6.2 + semver: 7.7.2 xml2js: 0.6.0 transitivePeerDependencies: - encoding @@ -10130,7 +10006,7 @@ snapshots: '@expo/rudder-sdk-node@1.1.1': dependencies: - '@expo/bunyan': 4.0.0 + '@expo/bunyan': 4.0.1 '@segment/loosely-validate-event': 2.0.0 fetch-retry: 4.1.1 md5: 2.3.0 @@ -10144,13 +10020,17 @@ snapshots: '@expo/spawn-async@1.7.2': dependencies: - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 + + '@expo/sudo-prompt@9.3.2': {} - '@expo/vector-icons@14.0.2': + '@expo/vector-icons@14.1.0(expo-font@12.0.10(expo@51.0.29(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)))(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': dependencies: - prop-types: 15.8.1 + expo-font: 12.0.10(expo@51.0.29(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)) + react: 18.3.1 + react-native: 0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1) - '@expo/xcpretty@4.3.1': + '@expo/xcpretty@4.3.2': dependencies: '@babel/code-frame': 7.10.4 chalk: 4.1.2 @@ -10169,8 +10049,8 @@ snapshots: '@grpc/proto-loader@0.7.15': dependencies: lodash.camelcase: 4.3.0 - long: 5.3.1 - protobufjs: 7.4.0 + long: 5.3.2 + protobufjs: 7.2.5 yargs: 17.7.2 '@hapi/bourne@3.0.0': {} @@ -10183,42 +10063,42 @@ snapshots: '@hapi/hoek': 9.3.0 optional: true - '@hashgraph/cryptography@1.7.4(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1))': + '@hashgraph/cryptography@1.8.0(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': dependencies: - '@noble/curves': 1.8.1 + '@noble/curves': 1.9.2 asn1js: 3.0.6 - bignumber.js: 9.1.2 - bn.js: 5.2.1 + bignumber.js: 9.3.0 + bn.js: 5.2.2 buffer: 6.0.3 crypto-js: 4.2.0 forge-light: 1.1.4 js-base64: 3.7.7 - react-native-get-random-values: 1.11.0(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1)) + react-native-get-random-values: 1.11.0(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) spark-md5: 3.0.2 tweetnacl: 1.0.3 utf8: 3.0.0 transitivePeerDependencies: - react-native - '@hashgraph/proto@2.18.5': + '@hashgraph/proto@2.19.0': dependencies: - long: 5.3.1 + long: 5.3.2 protobufjs: 7.2.5 - '@hashgraph/sdk@2.65.1(bn.js@5.2.1)(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1))': + '@hashgraph/sdk@2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': dependencies: '@ethersproject/abi': 5.8.0 '@ethersproject/bignumber': 5.8.0 '@ethersproject/bytes': 5.8.0 '@ethersproject/rlp': 5.8.0 '@grpc/grpc-js': 1.13.4 - '@hashgraph/cryptography': 1.7.4(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1)) - '@hashgraph/proto': 2.18.5 - bignumber.js: 9.1.2 - bn.js: 5.2.1 + '@hashgraph/cryptography': 1.8.0(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hashgraph/proto': 2.19.0 + bignumber.js: 9.3.0 + bn.js: 5.2.2 crypto-js: 4.2.0 js-base64: 3.7.7 - long: 5.3.1 + long: 5.3.2 pino: 9.7.0 pino-pretty: 13.0.0 protobufjs: 7.2.5 @@ -10228,39 +10108,62 @@ snapshots: - expo-crypto - react-native - '@hiero-did-sdk-js/anoncreds@0.0.1(bn.js@5.2.1)(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1))(react@18.3.1)': + '@hiero-did-sdk-js/anoncreds@0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': dependencies: - '@hiero-did-sdk-js/hcs': 0.0.1(bn.js@5.2.1)(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1))(react@18.3.1) - '@hiero-did-sdk-js/zstd': 0.0.1(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1))(react@18.3.1) + '@hiero-did-sdk-js/hcs': 0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) + '@hiero-did-sdk-js/zstd': 0.0.1(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) transitivePeerDependencies: - bn.js - expo-crypto - react - react-native - '@hiero-did-sdk-js/crypto@0.0.1(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1))(react@18.3.1)': + '@hiero-did-sdk-js/client@0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': + dependencies: + '@hashgraph/sdk': 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + transitivePeerDependencies: + - bn.js + - expo-crypto + - react-native + + '@hiero-did-sdk-js/crypto@0.0.1(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': dependencies: crypto: 1.0.1 crypto-js: 4.2.0 - react-native-quick-crypto: 0.7.14(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1))(react@18.3.1) + react-native-quick-crypto: 0.7.14(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) + transitivePeerDependencies: + - react + - react-native + + '@hiero-did-sdk-js/did@0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': + dependencies: + '@hashgraph/sdk': 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk-js/client': 0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk-js/hcs': 0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) + '@swiss-digital-assets-institute/core': 0.3.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@swiss-digital-assets-institute/registrar': 0.3.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@swiss-digital-assets-institute/resolver': 0.3.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) transitivePeerDependencies: + - bn.js + - expo-crypto - react - react-native - '@hiero-did-sdk-js/hcs@0.0.1(bn.js@5.2.1)(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1))(react@18.3.1)': + '@hiero-did-sdk-js/hcs@0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': dependencies: - '@hashgraph/sdk': 2.65.1(bn.js@5.2.1)(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1)) - '@hiero-did-sdk-js/crypto': 0.0.1(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1))(react@18.3.1) - '@hiero-did-sdk-js/zstd': 0.0.1(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1))(react@18.3.1) + '@hashgraph/sdk': 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk-js/client': 0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk-js/crypto': 0.0.1(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) + '@hiero-did-sdk-js/zstd': 0.0.1(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) transitivePeerDependencies: - bn.js - expo-crypto - react - react-native - '@hiero-did-sdk-js/zstd@0.0.1(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1))(react@18.3.1)': + '@hiero-did-sdk-js/zstd@0.0.1(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': dependencies: - react-native-zstd: 1.1.0(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1))(react@18.3.1) + react-native-zstd: 1.1.0(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) zstd-napi: 0.0.10 transitivePeerDependencies: - react @@ -10356,7 +10259,7 @@ snapshots: jest-util: 29.7.0 jest-validate: 29.7.0 jest-watcher: 29.7.0 - micromatch: 4.0.7 + micromatch: 4.0.8 pretty-format: 29.7.0 slash: 3.0.0 strip-ansi: 6.0.1 @@ -10405,6 +10308,11 @@ snapshots: transitivePeerDependencies: - supports-color + '@jest/pattern@30.0.0': + dependencies: + '@types/node': 18.18.8 + jest-regex-util: 30.0.0 + '@jest/reporters@29.7.0': dependencies: '@bcoe/v8-coverage': 0.2.3 @@ -10420,7 +10328,7 @@ snapshots: glob: 7.2.3 graceful-fs: 4.2.11 istanbul-lib-coverage: 3.2.2 - istanbul-lib-instrument: 6.0.2 + istanbul-lib-instrument: 6.0.3 istanbul-lib-report: 3.0.1 istanbul-lib-source-maps: 4.0.1 istanbul-reports: 3.1.7 @@ -10430,7 +10338,7 @@ snapshots: slash: 3.0.0 string-length: 4.0.2 strip-ansi: 6.0.1 - v8-to-istanbul: 9.2.0 + v8-to-istanbul: 9.3.0 transitivePeerDependencies: - supports-color @@ -10438,6 +10346,10 @@ snapshots: dependencies: '@sinclair/typebox': 0.27.8 + '@jest/schemas@30.0.0': + dependencies: + '@sinclair/typebox': 0.34.33 + '@jest/source-map@29.6.3': dependencies: '@jridgewell/trace-mapping': 0.3.25 @@ -10460,7 +10372,7 @@ snapshots: '@jest/transform@29.7.0': dependencies: - '@babel/core': 7.26.0 + '@babel/core': 7.27.4 '@jest/types': 29.6.3 '@jridgewell/trace-mapping': 0.3.25 babel-plugin-istanbul: 6.1.1 @@ -10471,13 +10383,33 @@ snapshots: jest-haste-map: 29.7.0 jest-regex-util: 29.6.3 jest-util: 29.7.0 - micromatch: 4.0.7 - pirates: 4.0.6 + micromatch: 4.0.8 + pirates: 4.0.7 slash: 3.0.0 write-file-atomic: 4.0.2 transitivePeerDependencies: - supports-color + '@jest/transform@30.0.0': + dependencies: + '@babel/core': 7.27.4 + '@jest/types': 30.0.0 + '@jridgewell/trace-mapping': 0.3.25 + babel-plugin-istanbul: 7.0.0 + chalk: 4.1.2 + convert-source-map: 2.0.0 + fast-json-stable-stringify: 2.1.0 + graceful-fs: 4.2.11 + jest-haste-map: 30.0.0 + jest-regex-util: 30.0.0 + jest-util: 30.0.0 + micromatch: 4.0.8 + pirates: 4.0.7 + slash: 3.0.0 + write-file-atomic: 5.0.1 + transitivePeerDependencies: + - supports-color + '@jest/types@24.9.0': dependencies: '@types/istanbul-lib-coverage': 2.0.6 @@ -10508,13 +10440,23 @@ snapshots: '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 '@types/node': 18.18.8 - '@types/yargs': 17.0.32 + '@types/yargs': 17.0.33 + chalk: 4.1.2 + + '@jest/types@30.0.0': + dependencies: + '@jest/pattern': 30.0.0 + '@jest/schemas': 30.0.0 + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 3.0.4 + '@types/node': 18.18.8 + '@types/yargs': 17.0.33 chalk: 4.1.2 - '@jridgewell/gen-mapping@0.3.5': + '@jridgewell/gen-mapping@0.3.8': dependencies: '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/sourcemap-codec': 1.5.0 '@jridgewell/trace-mapping': 0.3.25 '@jridgewell/resolve-uri@3.1.2': {} @@ -10523,20 +10465,20 @@ snapshots: '@jridgewell/source-map@0.3.6': dependencies: - '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/gen-mapping': 0.3.8 '@jridgewell/trace-mapping': 0.3.25 - '@jridgewell/sourcemap-codec@1.4.15': {} + '@jridgewell/sourcemap-codec@1.5.0': {} '@jridgewell/trace-mapping@0.3.25': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/sourcemap-codec': 1.5.0 '@jridgewell/trace-mapping@0.3.9': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/sourcemap-codec': 1.5.0 '@js-joda/core@5.6.3': {} @@ -10546,10 +10488,10 @@ snapshots: '@js-sdsl/ordered-map@4.4.2': {} - '@koa/bodyparser@5.1.1(koa@2.16.0)': + '@koa/bodyparser@5.1.2(koa@2.16.1)': dependencies: co-body: 6.2.0 - koa: 2.16.0 + koa: 2.16.1 lodash.merge: 4.6.2 type-is: 1.6.18 @@ -10565,14 +10507,14 @@ snapshots: '@manypkg/find-root@1.1.0': dependencies: - '@babel/runtime': 7.24.7 + '@babel/runtime': 7.27.6 '@types/node': 18.18.8 find-up: 4.1.0 fs-extra: 8.1.0 '@manypkg/get-packages@1.1.3': dependencies: - '@babel/runtime': 7.24.7 + '@babel/runtime': 7.27.6 '@changesets/types': 4.1.0 '@manypkg/find-root': 1.1.0 fs-extra: 8.1.0 @@ -10581,20 +10523,20 @@ snapshots: '@mapbox/node-pre-gyp@1.0.11': dependencies: - detect-libc: 2.0.3 + detect-libc: 2.0.4 https-proxy-agent: 5.0.1 make-dir: 3.1.0 node-fetch: 2.7.0 nopt: 5.0.0 npmlog: 5.0.1 rimraf: 3.0.2 - semver: 7.6.2 + semver: 7.7.2 tar: 6.2.1 transitivePeerDependencies: - encoding - supports-color - '@mswjs/interceptors@0.37.5': + '@mswjs/interceptors@0.38.7': dependencies: '@open-draft/deferred-promise': 2.2.0 '@open-draft/logger': 0.3.0 @@ -10605,15 +10547,15 @@ snapshots: '@multiformats/base-x@4.0.1': {} - '@noble/ciphers@1.2.1': {} + '@noble/ciphers@1.3.0': {} - '@noble/curves@1.8.1': + '@noble/curves@1.9.2': dependencies: - '@noble/hashes': 1.7.1 + '@noble/hashes': 1.8.0 '@noble/hashes@1.6.1': {} - '@noble/hashes@1.7.1': {} + '@noble/hashes@1.8.0': {} '@nodelib/fs.scandir@2.1.5': dependencies: @@ -10625,11 +10567,11 @@ snapshots: '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 - fastq: 1.17.1 + fastq: 1.19.1 '@npmcli/fs@3.1.1': dependencies: - semver: 7.6.2 + semver: 7.7.2 '@open-draft/deferred-promise@2.2.0': {} @@ -10643,128 +10585,117 @@ snapshots: '@openid4vc/oauth2@0.3.0-alpha-20250602121005': dependencies: '@openid4vc/utils': 0.3.0-alpha-20250602121005 - zod: 3.24.2 + zod: 3.25.57 '@openid4vc/openid4vci@0.3.0-alpha-20250602121005': dependencies: '@openid4vc/oauth2': 0.3.0-alpha-20250602121005 '@openid4vc/utils': 0.3.0-alpha-20250602121005 - zod: 3.24.2 + zod: 3.25.57 '@openid4vc/openid4vp@0.3.0-alpha-20250602121005': dependencies: '@openid4vc/oauth2': 0.3.0-alpha-20250602121005 '@openid4vc/utils': 0.3.0-alpha-20250602121005 - zod: 3.24.2 + zod: 3.25.57 '@openid4vc/utils@0.3.0-alpha-20250602121005': dependencies: buffer: 6.0.3 - zod: 3.24.2 + zod: 3.25.57 - '@openwallet-foundation/askar-nodejs@0.3.1': + '@openwallet-foundation/askar-nodejs@0.3.2': dependencies: '@2060.io/ffi-napi': 4.0.9(patch_hash=6ujtm5ladmp54sbez4f5d2uhca) '@2060.io/ref-napi': 3.0.6 - '@mapbox/node-pre-gyp': 1.0.11 - '@openwallet-foundation/askar-shared': 0.3.1 + '@openwallet-foundation/askar-shared': 0.3.2 ref-array-di: 1.2.2 ref-struct-di: 1.1.1 transitivePeerDependencies: - - encoding - supports-color - '@openwallet-foundation/askar-shared@0.3.1': + '@openwallet-foundation/askar-shared@0.3.2': dependencies: buffer: 6.0.3 + tar: 7.4.3 - '@peculiar/asn1-cms@2.3.13': + '@paralleldrive/cuid2@2.2.2': dependencies: - '@peculiar/asn1-schema': 2.3.13 - '@peculiar/asn1-x509': 2.3.13 - '@peculiar/asn1-x509-attr': 2.3.13 - asn1js: 3.0.5 - tslib: 2.8.1 + '@noble/hashes': 1.8.0 - '@peculiar/asn1-csr@2.3.13': + '@peculiar/asn1-cms@2.3.15': dependencies: - '@peculiar/asn1-schema': 2.3.13 - '@peculiar/asn1-x509': 2.3.13 - asn1js: 3.0.5 + '@peculiar/asn1-schema': 2.3.15 + '@peculiar/asn1-x509': 2.3.15 + '@peculiar/asn1-x509-attr': 2.3.15 + asn1js: 3.0.6 tslib: 2.8.1 - '@peculiar/asn1-ecc@2.3.14': + '@peculiar/asn1-csr@2.3.15': dependencies: - '@peculiar/asn1-schema': 2.3.13 - '@peculiar/asn1-x509': 2.3.13 - asn1js: 3.0.5 + '@peculiar/asn1-schema': 2.3.15 + '@peculiar/asn1-x509': 2.3.15 + asn1js: 3.0.6 tslib: 2.8.1 - '@peculiar/asn1-pfx@2.3.13': + '@peculiar/asn1-ecc@2.3.15': dependencies: - '@peculiar/asn1-cms': 2.3.13 - '@peculiar/asn1-pkcs8': 2.3.13 - '@peculiar/asn1-rsa': 2.3.15 - '@peculiar/asn1-schema': 2.3.13 - asn1js: 3.0.5 + '@peculiar/asn1-schema': 2.3.15 + '@peculiar/asn1-x509': 2.3.15 + asn1js: 3.0.6 tslib: 2.8.1 - '@peculiar/asn1-pkcs8@2.3.13': + '@peculiar/asn1-pfx@2.3.15': dependencies: - '@peculiar/asn1-schema': 2.3.13 - '@peculiar/asn1-x509': 2.3.13 - asn1js: 3.0.5 + '@peculiar/asn1-cms': 2.3.15 + '@peculiar/asn1-pkcs8': 2.3.15 + '@peculiar/asn1-rsa': 2.3.15 + '@peculiar/asn1-schema': 2.3.15 + asn1js: 3.0.6 tslib: 2.8.1 - '@peculiar/asn1-pkcs9@2.3.13': + '@peculiar/asn1-pkcs8@2.3.15': dependencies: - '@peculiar/asn1-cms': 2.3.13 - '@peculiar/asn1-pfx': 2.3.13 - '@peculiar/asn1-pkcs8': 2.3.13 - '@peculiar/asn1-schema': 2.3.13 - '@peculiar/asn1-x509': 2.3.13 - '@peculiar/asn1-x509-attr': 2.3.13 - asn1js: 3.0.5 + '@peculiar/asn1-schema': 2.3.15 + '@peculiar/asn1-x509': 2.3.15 + asn1js: 3.0.6 tslib: 2.8.1 - '@peculiar/asn1-rsa@2.3.15': + '@peculiar/asn1-pkcs9@2.3.15': dependencies: + '@peculiar/asn1-cms': 2.3.15 + '@peculiar/asn1-pfx': 2.3.15 + '@peculiar/asn1-pkcs8': 2.3.15 '@peculiar/asn1-schema': 2.3.15 '@peculiar/asn1-x509': 2.3.15 - asn1js: 3.0.5 + '@peculiar/asn1-x509-attr': 2.3.15 + asn1js: 3.0.6 tslib: 2.8.1 - '@peculiar/asn1-schema@2.3.13': + '@peculiar/asn1-rsa@2.3.15': dependencies: - asn1js: 3.0.5 - pvtsutils: 1.3.5 + '@peculiar/asn1-schema': 2.3.15 + '@peculiar/asn1-x509': 2.3.15 + asn1js: 3.0.6 tslib: 2.8.1 '@peculiar/asn1-schema@2.3.15': dependencies: - asn1js: 3.0.5 + asn1js: 3.0.6 pvtsutils: 1.3.6 tslib: 2.8.1 - '@peculiar/asn1-x509-attr@2.3.13': - dependencies: - '@peculiar/asn1-schema': 2.3.13 - '@peculiar/asn1-x509': 2.3.13 - asn1js: 3.0.5 - tslib: 2.8.1 - - '@peculiar/asn1-x509@2.3.13': + '@peculiar/asn1-x509-attr@2.3.15': dependencies: - '@peculiar/asn1-schema': 2.3.13 - asn1js: 3.0.5 - ipaddr.js: 2.2.0 - pvtsutils: 1.3.5 + '@peculiar/asn1-schema': 2.3.15 + '@peculiar/asn1-x509': 2.3.15 + asn1js: 3.0.6 tslib: 2.8.1 '@peculiar/asn1-x509@2.3.15': dependencies: '@peculiar/asn1-schema': 2.3.15 - asn1js: 3.0.5 + asn1js: 3.0.6 pvtsutils: 1.3.6 tslib: 2.8.1 @@ -10774,25 +10705,25 @@ snapshots: '@peculiar/webcrypto@1.5.0': dependencies: - '@peculiar/asn1-schema': 2.3.13 + '@peculiar/asn1-schema': 2.3.15 '@peculiar/json-schema': 1.1.12 - pvtsutils: 1.3.5 + pvtsutils: 1.3.6 tslib: 2.8.1 - webcrypto-core: 1.8.0 + webcrypto-core: 1.8.1 - '@peculiar/x509@1.12.3': + '@peculiar/x509@1.12.4': dependencies: - '@peculiar/asn1-cms': 2.3.13 - '@peculiar/asn1-csr': 2.3.13 - '@peculiar/asn1-ecc': 2.3.14 - '@peculiar/asn1-pkcs9': 2.3.13 + '@peculiar/asn1-cms': 2.3.15 + '@peculiar/asn1-csr': 2.3.15 + '@peculiar/asn1-ecc': 2.3.15 + '@peculiar/asn1-pkcs9': 2.3.15 '@peculiar/asn1-rsa': 2.3.15 - '@peculiar/asn1-schema': 2.3.13 - '@peculiar/asn1-x509': 2.3.13 - pvtsutils: 1.3.5 + '@peculiar/asn1-schema': 2.3.15 + '@peculiar/asn1-x509': 2.3.15 + pvtsutils: 1.3.6 reflect-metadata: 0.2.2 tslib: 2.8.1 - tsyringe: 4.8.0 + tsyringe: 4.10.0 '@pkgjs/parseargs@0.11.0': optional: true @@ -10837,7 +10768,7 @@ snapshots: cosmiconfig: 5.2.1 deepmerge: 3.3.0 glob: 7.2.3 - joi: 17.13.1 + joi: 17.13.3 transitivePeerDependencies: - encoding optional: true @@ -10856,7 +10787,7 @@ snapshots: '@react-native-community/cli-tools': 10.1.1 chalk: 4.1.2 command-exists: 1.2.9 - envinfo: 7.13.0 + envinfo: 7.14.0 execa: 1.0.0 hermes-profile-transformer: 0.0.6 node-stream-zip: 1.15.0 @@ -10896,14 +10827,14 @@ snapshots: '@react-native-community/cli-tools': 10.1.1 chalk: 4.1.2 execa: 1.0.0 - fast-xml-parser: 4.4.0 + fast-xml-parser: 4.5.3 glob: 7.2.3 ora: 5.4.1 transitivePeerDependencies: - encoding optional: true - '@react-native-community/cli-plugin-metro@10.2.3(@babel/core@7.26.0)': + '@react-native-community/cli-plugin-metro@10.2.3(@babel/core@7.27.4)': dependencies: '@react-native-community/cli-server-api': 10.1.1 '@react-native-community/cli-tools': 10.1.1 @@ -10912,7 +10843,7 @@ snapshots: metro: 0.73.10 metro-config: 0.73.10 metro-core: 0.73.10 - metro-react-native-babel-transformer: 0.73.10(@babel/core@7.26.0) + metro-react-native-babel-transformer: 0.73.10(@babel/core@7.27.4) metro-resolver: 0.73.10 metro-runtime: 0.73.10 readline: 1.3.0 @@ -10928,7 +10859,7 @@ snapshots: dependencies: '@react-native-community/cli-debugger-ui': 10.0.0 '@react-native-community/cli-tools': 10.1.1 - compression: 1.7.4 + compression: 1.8.0 connect: 3.7.0 errorhandler: 1.5.1 nocache: 3.0.4 @@ -10952,24 +10883,24 @@ snapshots: open: 6.4.0 ora: 5.4.1 semver: 6.3.1 - shell-quote: 1.8.1 + shell-quote: 1.8.3 transitivePeerDependencies: - encoding optional: true '@react-native-community/cli-types@10.0.0': dependencies: - joi: 17.13.1 + joi: 17.13.3 optional: true - '@react-native-community/cli@10.2.7(@babel/core@7.26.0)': + '@react-native-community/cli@10.2.7(@babel/core@7.27.4)': dependencies: '@react-native-community/cli-clean': 10.1.1 '@react-native-community/cli-config': 10.1.1 '@react-native-community/cli-debugger-ui': 10.0.0 '@react-native-community/cli-doctor': 10.2.7 '@react-native-community/cli-hermes': 10.2.7 - '@react-native-community/cli-plugin-metro': 10.2.3(@babel/core@7.26.0) + '@react-native-community/cli-plugin-metro': 10.2.3(@babel/core@7.27.4) '@react-native-community/cli-server-api': 10.1.1 '@react-native-community/cli-tools': 10.1.1 '@react-native-community/cli-types': 10.0.0 @@ -10989,163 +10920,163 @@ snapshots: - utf-8-validate optional: true - '@react-native/assets-registry@0.78.1': {} + '@react-native/assets-registry@0.78.2': {} - '@react-native/babel-plugin-codegen@0.74.87(@babel/preset-env@7.26.0(@babel/core@7.26.0))': + '@react-native/babel-plugin-codegen@0.74.87(@babel/preset-env@7.27.2(@babel/core@7.27.4))': dependencies: - '@react-native/codegen': 0.74.87(@babel/preset-env@7.26.0(@babel/core@7.26.0)) + '@react-native/codegen': 0.74.87(@babel/preset-env@7.27.2(@babel/core@7.27.4)) transitivePeerDependencies: - '@babel/preset-env' - supports-color - '@react-native/babel-plugin-codegen@0.78.1(@babel/preset-env@7.26.0(@babel/core@7.26.0))': + '@react-native/babel-plugin-codegen@0.78.2(@babel/preset-env@7.27.2(@babel/core@7.27.4))': dependencies: - '@babel/traverse': 7.26.4 - '@react-native/codegen': 0.78.1(@babel/preset-env@7.26.0(@babel/core@7.26.0)) + '@babel/traverse': 7.27.4 + '@react-native/codegen': 0.78.2(@babel/preset-env@7.27.2(@babel/core@7.27.4)) transitivePeerDependencies: - '@babel/preset-env' - supports-color - '@react-native/babel-preset@0.74.87(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))': - dependencies: - '@babel/core': 7.26.0 - '@babel/plugin-proposal-async-generator-functions': 7.20.7(@babel/core@7.26.0) - '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.26.0) - '@babel/plugin-proposal-export-default-from': 7.24.7(@babel/core@7.26.0) - '@babel/plugin-proposal-logical-assignment-operators': 7.20.7(@babel/core@7.26.0) - '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.26.0) - '@babel/plugin-proposal-numeric-separator': 7.18.6(@babel/core@7.26.0) - '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.26.0) - '@babel/plugin-proposal-optional-catch-binding': 7.18.6(@babel/core@7.26.0) - '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.26.0) - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.26.0) - '@babel/plugin-syntax-export-default-from': 7.24.7(@babel/core@7.26.0) - '@babel/plugin-syntax-flow': 7.26.0(@babel/core@7.26.0) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.26.0) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.26.0) - '@babel/plugin-transform-arrow-functions': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-async-to-generator': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-block-scoping': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-classes': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-computed-properties': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-destructuring': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-flow-strip-types': 7.26.5(@babel/core@7.26.0) - '@babel/plugin-transform-function-name': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-literals': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-modules-commonjs': 7.26.3(@babel/core@7.26.0) - '@babel/plugin-transform-named-capturing-groups-regex': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-private-methods': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-private-property-in-object': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-react-display-name': 7.24.7(@babel/core@7.26.0) - '@babel/plugin-transform-react-jsx': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-react-jsx-self': 7.24.7(@babel/core@7.26.0) - '@babel/plugin-transform-react-jsx-source': 7.24.7(@babel/core@7.26.0) - '@babel/plugin-transform-runtime': 7.24.7(@babel/core@7.26.0) - '@babel/plugin-transform-shorthand-properties': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-spread': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-sticky-regex': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-typescript': 7.26.8(@babel/core@7.26.0) - '@babel/plugin-transform-unicode-regex': 7.25.9(@babel/core@7.26.0) - '@babel/template': 7.25.9 - '@react-native/babel-plugin-codegen': 0.74.87(@babel/preset-env@7.26.0(@babel/core@7.26.0)) - babel-plugin-transform-flow-enums: 0.0.2(@babel/core@7.26.0) + '@react-native/babel-preset@0.74.87(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))': + dependencies: + '@babel/core': 7.27.4 + '@babel/plugin-proposal-async-generator-functions': 7.20.7(@babel/core@7.27.4) + '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.27.4) + '@babel/plugin-proposal-export-default-from': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-proposal-logical-assignment-operators': 7.20.7(@babel/core@7.27.4) + '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.27.4) + '@babel/plugin-proposal-numeric-separator': 7.18.6(@babel/core@7.27.4) + '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.27.4) + '@babel/plugin-proposal-optional-catch-binding': 7.18.6(@babel/core@7.27.4) + '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.27.4) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.27.4) + '@babel/plugin-syntax-export-default-from': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-syntax-flow': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.27.4) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.27.4) + '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-async-to-generator': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-block-scoping': 7.27.5(@babel/core@7.27.4) + '@babel/plugin-transform-classes': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-computed-properties': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-destructuring': 7.27.3(@babel/core@7.27.4) + '@babel/plugin-transform-flow-strip-types': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-function-name': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-literals': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-named-capturing-groups-regex': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-parameters': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-private-methods': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-private-property-in-object': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-react-display-name': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-runtime': 7.27.4(@babel/core@7.27.4) + '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-spread': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-sticky-regex': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-typescript': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.27.4) + '@babel/template': 7.27.2 + '@react-native/babel-plugin-codegen': 0.74.87(@babel/preset-env@7.27.2(@babel/core@7.27.4)) + babel-plugin-transform-flow-enums: 0.0.2(@babel/core@7.27.4) react-refresh: 0.14.2 transitivePeerDependencies: - '@babel/preset-env' - supports-color - '@react-native/babel-preset@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))': - dependencies: - '@babel/core': 7.26.0 - '@babel/plugin-proposal-export-default-from': 7.24.7(@babel/core@7.26.0) - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.26.0) - '@babel/plugin-syntax-export-default-from': 7.24.7(@babel/core@7.26.0) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.26.0) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.26.0) - '@babel/plugin-transform-arrow-functions': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-async-generator-functions': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-async-to-generator': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-block-scoping': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-class-properties': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-classes': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-computed-properties': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-destructuring': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-flow-strip-types': 7.26.5(@babel/core@7.26.0) - '@babel/plugin-transform-for-of': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-function-name': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-literals': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-logical-assignment-operators': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-modules-commonjs': 7.26.3(@babel/core@7.26.0) - '@babel/plugin-transform-named-capturing-groups-regex': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-nullish-coalescing-operator': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-numeric-separator': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-object-rest-spread': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-optional-catch-binding': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-optional-chaining': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-private-methods': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-private-property-in-object': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-react-display-name': 7.24.7(@babel/core@7.26.0) - '@babel/plugin-transform-react-jsx': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-react-jsx-self': 7.24.7(@babel/core@7.26.0) - '@babel/plugin-transform-react-jsx-source': 7.24.7(@babel/core@7.26.0) - '@babel/plugin-transform-regenerator': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-runtime': 7.24.7(@babel/core@7.26.0) - '@babel/plugin-transform-shorthand-properties': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-spread': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-sticky-regex': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-typescript': 7.26.8(@babel/core@7.26.0) - '@babel/plugin-transform-unicode-regex': 7.25.9(@babel/core@7.26.0) - '@babel/template': 7.25.9 - '@react-native/babel-plugin-codegen': 0.78.1(@babel/preset-env@7.26.0(@babel/core@7.26.0)) + '@react-native/babel-preset@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))': + dependencies: + '@babel/core': 7.27.4 + '@babel/plugin-proposal-export-default-from': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.27.4) + '@babel/plugin-syntax-export-default-from': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.27.4) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.27.4) + '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-async-generator-functions': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-async-to-generator': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-block-scoping': 7.27.5(@babel/core@7.27.4) + '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-classes': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-computed-properties': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-destructuring': 7.27.3(@babel/core@7.27.4) + '@babel/plugin-transform-flow-strip-types': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-function-name': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-literals': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-logical-assignment-operators': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-named-capturing-groups-regex': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-nullish-coalescing-operator': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-numeric-separator': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-object-rest-spread': 7.27.3(@babel/core@7.27.4) + '@babel/plugin-transform-optional-catch-binding': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-parameters': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-private-methods': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-private-property-in-object': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-react-display-name': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-regenerator': 7.27.5(@babel/core@7.27.4) + '@babel/plugin-transform-runtime': 7.27.4(@babel/core@7.27.4) + '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-spread': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-sticky-regex': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-typescript': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.27.4) + '@babel/template': 7.27.2 + '@react-native/babel-plugin-codegen': 0.78.2(@babel/preset-env@7.27.2(@babel/core@7.27.4)) babel-plugin-syntax-hermes-parser: 0.25.1 - babel-plugin-transform-flow-enums: 0.0.2(@babel/core@7.26.0) + babel-plugin-transform-flow-enums: 0.0.2(@babel/core@7.27.4) react-refresh: 0.14.2 transitivePeerDependencies: - '@babel/preset-env' - supports-color - '@react-native/codegen@0.74.87(@babel/preset-env@7.26.0(@babel/core@7.26.0))': + '@react-native/codegen@0.74.87(@babel/preset-env@7.27.2(@babel/core@7.27.4))': dependencies: - '@babel/parser': 7.26.3 - '@babel/preset-env': 7.26.0(@babel/core@7.26.0) + '@babel/parser': 7.27.5 + '@babel/preset-env': 7.27.2(@babel/core@7.27.4) glob: 7.2.3 hermes-parser: 0.19.1 invariant: 2.2.4 - jscodeshift: 0.14.0(@babel/preset-env@7.26.0(@babel/core@7.26.0)) + jscodeshift: 0.14.0(@babel/preset-env@7.27.2(@babel/core@7.27.4)) mkdirp: 0.5.6 nullthrows: 1.1.1 transitivePeerDependencies: - supports-color - '@react-native/codegen@0.78.1(@babel/preset-env@7.26.0(@babel/core@7.26.0))': + '@react-native/codegen@0.78.2(@babel/preset-env@7.27.2(@babel/core@7.27.4))': dependencies: - '@babel/parser': 7.26.3 - '@babel/preset-env': 7.26.0(@babel/core@7.26.0) + '@babel/parser': 7.27.5 + '@babel/preset-env': 7.27.2(@babel/core@7.27.4) glob: 7.2.3 hermes-parser: 0.25.1 invariant: 2.2.4 - jscodeshift: 17.2.0(@babel/preset-env@7.26.0(@babel/core@7.26.0)) + jscodeshift: 17.3.0(@babel/preset-env@7.27.2(@babel/core@7.27.4)) nullthrows: 1.1.1 yargs: 17.7.2 transitivePeerDependencies: - supports-color - '@react-native/community-cli-plugin@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))': + '@react-native/community-cli-plugin@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))': dependencies: - '@react-native/dev-middleware': 0.78.1 - '@react-native/metro-babel-transformer': 0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0)) + '@react-native/dev-middleware': 0.78.2 + '@react-native/metro-babel-transformer': 0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4)) chalk: 4.1.2 debug: 2.6.9 invariant: 2.2.4 - metro: 0.81.4 - metro-config: 0.81.4 - metro-core: 0.81.4 + metro: 0.81.5 + metro-config: 0.81.5 + metro-core: 0.81.5 readline: 1.3.0 - semver: 7.6.2 + semver: 7.7.2 optionalDependencies: - '@react-native-community/cli': 10.2.7(@babel/core@7.26.0) + '@react-native-community/cli': 10.2.7(@babel/core@7.27.4) transitivePeerDependencies: - '@babel/core' - '@babel/preset-env' @@ -11155,7 +11086,7 @@ snapshots: '@react-native/debugger-frontend@0.74.85': {} - '@react-native/debugger-frontend@0.78.1': {} + '@react-native/debugger-frontend@0.78.2': {} '@react-native/dev-middleware@0.74.85': dependencies: @@ -11178,10 +11109,10 @@ snapshots: - supports-color - utf-8-validate - '@react-native/dev-middleware@0.78.1': + '@react-native/dev-middleware@0.78.2': dependencies: '@isaacs/ttlcache': 1.4.1 - '@react-native/debugger-frontend': 0.78.1 + '@react-native/debugger-frontend': 0.78.2 chrome-launcher: 0.15.2 chromium-edge-launcher: 0.2.0 connect: 3.7.0 @@ -11197,14 +11128,14 @@ snapshots: - supports-color - utf-8-validate - '@react-native/gradle-plugin@0.78.1': {} + '@react-native/gradle-plugin@0.78.2': {} - '@react-native/js-polyfills@0.78.1': {} + '@react-native/js-polyfills@0.78.2': {} - '@react-native/metro-babel-transformer@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))': + '@react-native/metro-babel-transformer@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))': dependencies: - '@babel/core': 7.26.0 - '@react-native/babel-preset': 0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0)) + '@babel/core': 7.27.4 + '@react-native/babel-preset': 0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4)) hermes-parser: 0.25.1 nullthrows: 1.1.1 transitivePeerDependencies: @@ -11213,14 +11144,14 @@ snapshots: '@react-native/normalize-colors@0.74.85': {} - '@react-native/normalize-colors@0.78.1': {} + '@react-native/normalize-colors@0.78.2': {} - '@react-native/virtualized-lists@0.78.1(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1))(react@18.3.1)': + '@react-native/virtualized-lists@0.78.2(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': dependencies: invariant: 2.2.4 nullthrows: 1.1.1 react: 18.3.1 - react-native: 0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1) + react-native: 0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1) '@rnx-kit/chromium-edge-launcher@1.0.0': dependencies: @@ -11233,8 +11164,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@scure/base@1.2.1': {} - '@scure/base@1.2.6': {} '@sd-jwt/core@0.7.2': @@ -11304,6 +11233,8 @@ snapshots: '@sinclair/typebox@0.27.8': {} + '@sinclair/typebox@0.34.33': {} + '@sindresorhus/is@5.6.0': {} '@sinonjs/commons@3.0.1': @@ -11329,7 +11260,7 @@ snapshots: '@noble/hashes': 1.6.1 '@sd-jwt/decode': 0.9.2 '@sphereon/kmp-mdoc-core': 0.2.0-SNAPSHOT.26 - debug: 4.4.0 + debug: 4.4.1 events: 3.3.0 jwt-decode: 4.0.0 uint8arrays: 3.1.1 @@ -11390,82 +11321,82 @@ snapshots: '@stablelib/wipe@2.0.1': {} - '@swiss-digital-assets-institute/core@0.3.0(bn.js@5.2.1)(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1))': + '@swiss-digital-assets-institute/core@0.3.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': dependencies: - '@hashgraph/sdk': 2.65.1(bn.js@5.2.1)(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1)) + '@hashgraph/sdk': 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) '@scure/base': 1.2.6 - cbor2: 1.12.0 + cbor2: 2.0.1 transitivePeerDependencies: - bn.js - expo-crypto - react-native - '@swiss-digital-assets-institute/lifecycle@0.3.0(bn.js@5.2.1)(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1))': + '@swiss-digital-assets-institute/lifecycle@0.3.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': dependencies: - '@swiss-digital-assets-institute/core': 0.3.0(bn.js@5.2.1)(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1)) + '@swiss-digital-assets-institute/core': 0.3.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) transitivePeerDependencies: - bn.js - expo-crypto - react-native - '@swiss-digital-assets-institute/messages@0.3.0(bn.js@5.2.1)(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1))': + '@swiss-digital-assets-institute/messages@0.3.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': dependencies: - '@hashgraph/sdk': 2.65.1(bn.js@5.2.1)(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1)) - '@swiss-digital-assets-institute/core': 0.3.0(bn.js@5.2.1)(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1)) - '@swiss-digital-assets-institute/lifecycle': 0.3.0(bn.js@5.2.1)(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1)) - '@swiss-digital-assets-institute/resolver': 0.3.0(bn.js@5.2.1)(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1)) + '@hashgraph/sdk': 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@swiss-digital-assets-institute/core': 0.3.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@swiss-digital-assets-institute/lifecycle': 0.3.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@swiss-digital-assets-institute/resolver': 0.3.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) transitivePeerDependencies: - bn.js - expo-crypto - react-native - '@swiss-digital-assets-institute/publisher-internal@0.3.0(bn.js@5.2.1)(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1))': + '@swiss-digital-assets-institute/publisher-internal@0.3.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': dependencies: - '@hashgraph/sdk': 2.65.1(bn.js@5.2.1)(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1)) - '@swiss-digital-assets-institute/core': 0.3.0(bn.js@5.2.1)(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1)) + '@hashgraph/sdk': 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@swiss-digital-assets-institute/core': 0.3.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) transitivePeerDependencies: - bn.js - expo-crypto - react-native - '@swiss-digital-assets-institute/registrar@0.3.0(bn.js@5.2.1)(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1))': + '@swiss-digital-assets-institute/registrar@0.3.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': dependencies: - '@hashgraph/sdk': 2.65.1(bn.js@5.2.1)(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1)) - '@swiss-digital-assets-institute/core': 0.3.0(bn.js@5.2.1)(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1)) - '@swiss-digital-assets-institute/lifecycle': 0.3.0(bn.js@5.2.1)(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1)) - '@swiss-digital-assets-institute/messages': 0.3.0(bn.js@5.2.1)(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1)) - '@swiss-digital-assets-institute/publisher-internal': 0.3.0(bn.js@5.2.1)(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1)) - '@swiss-digital-assets-institute/resolver': 0.3.0(bn.js@5.2.1)(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1)) - '@swiss-digital-assets-institute/signer-internal': 0.3.0(bn.js@5.2.1)(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1)) - '@swiss-digital-assets-institute/verifier-internal': 0.3.0(bn.js@5.2.1)(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1)) + '@hashgraph/sdk': 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@swiss-digital-assets-institute/core': 0.3.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@swiss-digital-assets-institute/lifecycle': 0.3.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@swiss-digital-assets-institute/messages': 0.3.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@swiss-digital-assets-institute/publisher-internal': 0.3.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@swiss-digital-assets-institute/resolver': 0.3.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@swiss-digital-assets-institute/signer-internal': 0.3.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@swiss-digital-assets-institute/verifier-internal': 0.3.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) transitivePeerDependencies: - bn.js - expo-crypto - react-native - '@swiss-digital-assets-institute/resolver@0.3.0(bn.js@5.2.1)(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1))': + '@swiss-digital-assets-institute/resolver@0.3.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': dependencies: - '@hashgraph/sdk': 2.65.1(bn.js@5.2.1)(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1)) - '@swiss-digital-assets-institute/core': 0.3.0(bn.js@5.2.1)(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1)) - '@swiss-digital-assets-institute/verifier-internal': 0.3.0(bn.js@5.2.1)(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1)) + '@hashgraph/sdk': 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@swiss-digital-assets-institute/core': 0.3.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@swiss-digital-assets-institute/verifier-internal': 0.3.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) transitivePeerDependencies: - bn.js - expo-crypto - react-native - '@swiss-digital-assets-institute/signer-internal@0.3.0(bn.js@5.2.1)(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1))': + '@swiss-digital-assets-institute/signer-internal@0.3.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': dependencies: - '@hashgraph/sdk': 2.65.1(bn.js@5.2.1)(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1)) - '@swiss-digital-assets-institute/core': 0.3.0(bn.js@5.2.1)(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1)) + '@hashgraph/sdk': 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@swiss-digital-assets-institute/core': 0.3.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) transitivePeerDependencies: - bn.js - expo-crypto - react-native - '@swiss-digital-assets-institute/verifier-internal@0.3.0(bn.js@5.2.1)(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1))': + '@swiss-digital-assets-institute/verifier-internal@0.3.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': dependencies: - '@hashgraph/sdk': 2.65.1(bn.js@5.2.1)(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1)) - '@swiss-digital-assets-institute/core': 0.3.0(bn.js@5.2.1)(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1)) + '@hashgraph/sdk': 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@swiss-digital-assets-institute/core': 0.3.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) transitivePeerDependencies: - bn.js - expo-crypto @@ -11477,7 +11408,7 @@ snapshots: '@tokenizer/inflate@0.2.7': dependencies: - debug: 4.4.0 + debug: 4.4.1 fflate: 0.8.2 token-types: 6.0.0 transitivePeerDependencies: @@ -11499,26 +11430,26 @@ snapshots: '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.26.3 - '@babel/types': 7.26.3 - '@types/babel__generator': 7.6.8 + '@babel/parser': 7.27.5 + '@babel/types': 7.27.6 + '@types/babel__generator': 7.27.0 '@types/babel__template': 7.4.4 - '@types/babel__traverse': 7.20.6 + '@types/babel__traverse': 7.20.7 - '@types/babel__generator@7.6.8': + '@types/babel__generator@7.27.0': dependencies: - '@babel/types': 7.26.3 + '@babel/types': 7.27.6 '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.26.3 - '@babel/types': 7.26.3 + '@babel/parser': 7.27.5 + '@babel/types': 7.27.6 - '@types/babel__traverse@7.20.6': + '@types/babel__traverse@7.20.7': dependencies: - '@babel/types': 7.26.3 + '@babel/types': 7.27.6 - '@types/body-parser@1.19.5': + '@types/body-parser@1.19.6': dependencies: '@types/connect': 3.4.38 '@types/node': 18.18.8 @@ -11527,38 +11458,38 @@ snapshots: dependencies: '@types/node': 18.18.8 - '@types/content-disposition@0.5.8': {} + '@types/content-disposition@0.5.9': {} '@types/cookiejar@2.1.5': {} - '@types/cookies@0.9.0': + '@types/cookies@0.9.1': dependencies: '@types/connect': 3.4.38 - '@types/express': 4.17.21 + '@types/express': 4.17.23 '@types/keygrip': 1.0.6 '@types/node': 18.18.8 - '@types/cors@2.8.17': + '@types/cors@2.8.19': dependencies: '@types/node': 18.18.8 '@types/events@3.0.3': {} - '@types/express-serve-static-core@4.19.3': + '@types/express-serve-static-core@4.19.6': dependencies: '@types/node': 18.18.8 - '@types/qs': 6.9.15 + '@types/qs': 6.14.0 '@types/range-parser': 1.2.7 - '@types/send': 0.17.4 + '@types/send': 0.17.5 - '@types/express@4.17.21': + '@types/express@4.17.23': dependencies: - '@types/body-parser': 1.19.5 - '@types/express-serve-static-core': 4.19.3 - '@types/qs': 6.9.15 - '@types/serve-static': 1.15.7 + '@types/body-parser': 1.19.6 + '@types/express-serve-static-core': 4.19.6 + '@types/qs': 6.14.0 + '@types/serve-static': 1.15.8 - '@types/figlet@1.5.8': {} + '@types/figlet@1.7.0': {} '@types/graceful-fs@4.1.9': dependencies: @@ -11568,12 +11499,12 @@ snapshots: '@types/http-cache-semantics@4.0.4': {} - '@types/http-errors@2.0.4': {} + '@types/http-errors@2.0.5': {} - '@types/inquirer@8.2.10': + '@types/inquirer@8.2.11': dependencies: '@types/through': 0.0.33 - rxjs: 7.8.1 + rxjs: 7.8.2 '@types/istanbul-lib-coverage@2.0.6': {} @@ -11590,7 +11521,7 @@ snapshots: dependencies: '@types/istanbul-lib-report': 3.0.3 - '@types/jest@29.5.12': + '@types/jest@29.5.14': dependencies: expect: 29.7.0 pretty-format: 29.7.0 @@ -11604,27 +11535,25 @@ snapshots: '@types/koa@2.15.0': dependencies: '@types/accepts': 1.3.7 - '@types/content-disposition': 0.5.8 - '@types/cookies': 0.9.0 + '@types/content-disposition': 0.5.9 + '@types/cookies': 0.9.1 '@types/http-assert': 1.5.6 - '@types/http-errors': 2.0.4 + '@types/http-errors': 2.0.5 '@types/keygrip': 1.0.6 '@types/koa-compose': 3.2.8 '@types/node': 18.18.8 '@types/long@4.0.2': {} - '@types/luxon@3.4.2': {} + '@types/luxon@3.6.2': {} '@types/methods@1.1.4': {} '@types/mime@1.3.5': {} - '@types/minimist@1.2.5': {} - - '@types/multer@1.4.11': + '@types/multer@1.4.13': dependencies: - '@types/express': 4.17.21 + '@types/express': 4.17.23 '@types/node-forge@1.3.11': dependencies: @@ -11634,8 +11563,6 @@ snapshots: dependencies: undici-types: 5.26.5 - '@types/normalize-package-data@2.4.4': {} - '@types/object-inspect@1.13.0': {} '@types/oidc-provider@8.8.1': @@ -11644,7 +11571,7 @@ snapshots: '@types/koa': 2.15.0 '@types/node': 18.18.8 - '@types/qs@6.9.15': {} + '@types/qs@6.14.0': {} '@types/range-parser@1.2.7': {} @@ -11664,18 +11591,16 @@ snapshots: dependencies: '@types/node': 18.18.8 - '@types/semver@7.5.8': {} - - '@types/send@0.17.4': + '@types/send@0.17.5': dependencies: '@types/mime': 1.3.5 '@types/node': 18.18.8 - '@types/serve-static@1.15.7': + '@types/serve-static@1.15.8': dependencies: - '@types/http-errors': 2.0.4 + '@types/http-errors': 2.0.5 '@types/node': 18.18.8 - '@types/send': 0.17.4 + '@types/send': 0.17.5 '@types/stack-utils@2.0.3': {} @@ -11684,9 +11609,9 @@ snapshots: '@types/cookiejar': 2.1.5 '@types/methods': 1.1.4 '@types/node': 18.18.8 - form-data: 4.0.0 + form-data: 4.0.3 - '@types/supertest@6.0.2': + '@types/supertest@6.0.3': dependencies: '@types/methods': 1.1.4 '@types/superagent': 8.1.9 @@ -11697,13 +11622,13 @@ snapshots: '@types/uuid@9.0.8': {} - '@types/validator@13.12.0': {} + '@types/validator@13.15.1': {} '@types/varint@6.0.3': dependencies: '@types/node': 18.18.8 - '@types/ws@8.5.10': + '@types/ws@8.18.1': dependencies: '@types/node': 18.18.8 @@ -11723,10 +11648,12 @@ snapshots: '@types/yargs-parser': 21.0.3 optional: true - '@types/yargs@17.0.32': + '@types/yargs@17.0.33': dependencies: '@types/yargs-parser': 21.0.3 + '@ungap/structured-clone@1.3.0': {} + '@unimodules/core@7.1.2': dependencies: compare-versions: 3.6.0 @@ -11768,15 +11695,15 @@ snapshots: mime-types: 2.1.35 negotiator: 0.6.3 - acorn-walk@8.3.3: + acorn-walk@8.3.4: dependencies: - acorn: 8.12.0 + acorn: 8.15.0 - acorn@8.12.0: {} + acorn@8.15.0: {} agent-base@6.0.2: dependencies: - debug: 4.4.0 + debug: 4.4.1 transitivePeerDependencies: - supports-color @@ -11785,16 +11712,16 @@ snapshots: clean-stack: 2.2.0 indent-string: 4.0.0 - ajv-formats@2.1.1(ajv@8.16.0): + ajv-formats@2.1.1(ajv@8.17.1): optionalDependencies: - ajv: 8.16.0 + ajv: 8.17.1 - ajv@8.16.0: + ajv@8.17.1: dependencies: fast-deep-equal: 3.1.3 + fast-uri: 3.0.6 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 - uri-js: 4.4.1 anser@1.4.10: {} @@ -11815,7 +11742,7 @@ snapshots: ansi-regex@5.0.1: {} - ansi-regex@6.0.1: {} + ansi-regex@6.1.0: {} ansi-styles@3.2.1: dependencies: @@ -11841,8 +11768,6 @@ snapshots: append-field@1.0.0: {} - application-config-path@0.1.1: {} - aproba@2.0.0: {} are-we-there-yet@2.0.0: @@ -11860,10 +11785,10 @@ snapshots: argparse@2.0.1: {} - array-buffer-byte-length@1.0.1: + array-buffer-byte-length@1.0.2: dependencies: - call-bind: 1.0.7 - is-array-buffer: 3.0.4 + call-bound: 1.0.4 + is-array-buffer: 3.0.5 array-flatten@1.1.1: {} @@ -11876,36 +11801,20 @@ snapshots: array-union@2.1.0: {} - array.prototype.flat@1.3.2: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-shim-unscopables: 1.0.2 - - arraybuffer.prototype.slice@1.0.3: + arraybuffer.prototype.slice@1.0.4: dependencies: - array-buffer-byte-length: 1.0.1 - call-bind: 1.0.7 + array-buffer-byte-length: 1.0.2 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.24.0 es-errors: 1.3.0 - get-intrinsic: 1.2.4 - is-array-buffer: 3.0.4 - is-shared-array-buffer: 1.0.3 - - arrify@1.0.1: {} + get-intrinsic: 1.3.0 + is-array-buffer: 3.0.5 asap@2.0.6: {} asmcrypto.js@0.22.0: {} - asn1js@3.0.5: - dependencies: - pvtsutils: 1.3.5 - pvutils: 1.1.3 - tslib: 2.8.1 - asn1js@3.0.6: dependencies: pvtsutils: 1.3.6 @@ -11923,14 +11832,15 @@ snapshots: astral-regex@1.0.0: optional: true + async-function@1.0.0: {} + async-limiter@1.0.1: {} async-mutex@0.4.1: dependencies: tslib: 2.8.1 - async@3.2.5: - optional: true + async@3.2.6: {} asynckit@0.4.0: {} @@ -11940,18 +11850,18 @@ snapshots: available-typed-arrays@1.0.7: dependencies: - possible-typed-array-names: 1.0.0 + possible-typed-array-names: 1.1.0 axios@0.21.4: dependencies: - follow-redirects: 1.15.6 + follow-redirects: 1.15.9 transitivePeerDependencies: - debug - axios@1.7.9: + axios@1.9.0: dependencies: - follow-redirects: 1.15.6 - form-data: 4.0.0 + follow-redirects: 1.15.9 + form-data: 4.0.3 proxy-from-env: 1.1.0 transitivePeerDependencies: - debug @@ -11964,75 +11874,104 @@ snapshots: dependencies: b64-lite: 1.4.0 - babel-core@7.0.0-bridge.0(@babel/core@7.26.0): + babel-core@7.0.0-bridge.0(@babel/core@7.27.4): dependencies: - '@babel/core': 7.26.0 + '@babel/core': 7.27.4 - babel-jest@29.7.0(@babel/core@7.26.0): + babel-jest@29.7.0(@babel/core@7.27.4): dependencies: - '@babel/core': 7.26.0 + '@babel/core': 7.27.4 '@jest/transform': 29.7.0 '@types/babel__core': 7.20.5 babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 29.6.3(@babel/core@7.26.0) + babel-preset-jest: 29.6.3(@babel/core@7.27.4) chalk: 4.1.2 graceful-fs: 4.2.11 slash: 3.0.0 transitivePeerDependencies: - supports-color - babel-plugin-istanbul@6.1.1: + babel-jest@30.0.0(@babel/core@7.27.4): dependencies: - '@babel/helper-plugin-utils': 7.25.9 - '@istanbuljs/load-nyc-config': 1.1.0 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-instrument: 5.2.1 - test-exclude: 6.0.0 - transitivePeerDependencies: - - supports-color + '@babel/core': 7.27.4 + '@jest/transform': 30.0.0 + '@types/babel__core': 7.20.5 + babel-plugin-istanbul: 7.0.0 + babel-preset-jest: 30.0.0(@babel/core@7.27.4) + chalk: 4.1.2 + graceful-fs: 4.2.11 + slash: 3.0.0 + transitivePeerDependencies: + - supports-color + + babel-plugin-istanbul@6.1.1: + dependencies: + '@babel/helper-plugin-utils': 7.27.1 + '@istanbuljs/load-nyc-config': 1.1.0 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-instrument: 5.2.1 + test-exclude: 6.0.0 + transitivePeerDependencies: + - supports-color + + babel-plugin-istanbul@7.0.0: + dependencies: + '@babel/helper-plugin-utils': 7.27.1 + '@istanbuljs/load-nyc-config': 1.1.0 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-instrument: 6.0.3 + test-exclude: 6.0.0 + transitivePeerDependencies: + - supports-color babel-plugin-jest-hoist@29.6.3: dependencies: - '@babel/template': 7.25.9 - '@babel/types': 7.26.3 + '@babel/template': 7.27.2 + '@babel/types': 7.27.6 + '@types/babel__core': 7.20.5 + '@types/babel__traverse': 7.20.7 + + babel-plugin-jest-hoist@30.0.0: + dependencies: + '@babel/template': 7.27.2 + '@babel/types': 7.27.6 '@types/babel__core': 7.20.5 - '@types/babel__traverse': 7.20.6 - babel-plugin-polyfill-corejs2@0.4.11(@babel/core@7.26.0): + babel-plugin-polyfill-corejs2@0.4.13(@babel/core@7.27.4): dependencies: - '@babel/compat-data': 7.26.3 - '@babel/core': 7.26.0 - '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.26.0) + '@babel/compat-data': 7.27.5 + '@babel/core': 7.27.4 + '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.27.4) semver: 6.3.1 transitivePeerDependencies: - supports-color - babel-plugin-polyfill-corejs3@0.10.6(@babel/core@7.26.0): + babel-plugin-polyfill-corejs3@0.11.1(@babel/core@7.27.4): dependencies: - '@babel/core': 7.26.0 - '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.26.0) - core-js-compat: 3.39.0 + '@babel/core': 7.27.4 + '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.27.4) + core-js-compat: 3.43.0 transitivePeerDependencies: - supports-color - babel-plugin-polyfill-regenerator@0.6.2(@babel/core@7.26.0): + babel-plugin-polyfill-regenerator@0.6.4(@babel/core@7.27.4): dependencies: - '@babel/core': 7.26.0 - '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.26.0) + '@babel/core': 7.27.4 + '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.27.4) transitivePeerDependencies: - supports-color - babel-plugin-react-compiler@0.0.0-experimental-fe484b5-20240912: + babel-plugin-react-compiler@0.0.0-experimental-592953e-20240517: dependencies: '@babel/generator': 7.2.0 - '@babel/types': 7.26.3 + '@babel/types': 7.27.6 chalk: 4.1.2 invariant: 2.2.4 pretty-format: 24.9.0 - zod: 3.24.2 - zod-validation-error: 2.1.0(zod@3.24.2) + zod: 3.25.57 + zod-validation-error: 2.1.0(zod@3.25.57) - babel-plugin-react-native-web@0.19.12: {} + babel-plugin-react-native-web@0.19.13: {} babel-plugin-syntax-hermes-parser@0.25.1: dependencies: @@ -12041,84 +11980,93 @@ snapshots: babel-plugin-syntax-trailing-function-commas@7.0.0-beta.0: optional: true - babel-plugin-transform-flow-enums@0.0.2(@babel/core@7.26.0): + babel-plugin-transform-flow-enums@0.0.2(@babel/core@7.27.4): dependencies: - '@babel/plugin-syntax-flow': 7.24.7(@babel/core@7.26.0) + '@babel/plugin-syntax-flow': 7.27.1(@babel/core@7.27.4) transitivePeerDependencies: - '@babel/core' - babel-preset-current-node-syntax@1.0.1(@babel/core@7.26.0): - dependencies: - '@babel/core': 7.26.0 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.26.0) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.26.0) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.26.0) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.26.0) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.26.0) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.26.0) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.26.0) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.26.0) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.26.0) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.26.0) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.26.0) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.26.0) - - babel-preset-expo@11.0.14(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0)): - dependencies: - '@babel/plugin-proposal-decorators': 7.24.7(@babel/core@7.26.0) - '@babel/plugin-transform-export-namespace-from': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-object-rest-spread': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.26.0) - '@babel/preset-react': 7.24.7(@babel/core@7.26.0) - '@babel/preset-typescript': 7.24.7(@babel/core@7.26.0) - '@react-native/babel-preset': 0.74.87(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0)) - babel-plugin-react-compiler: 0.0.0-experimental-fe484b5-20240912 - babel-plugin-react-native-web: 0.19.12 + babel-preset-current-node-syntax@1.1.0(@babel/core@7.27.4): + dependencies: + '@babel/core': 7.27.4 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.27.4) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.27.4) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.27.4) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.27.4) + '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.27.4) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.27.4) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.27.4) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.27.4) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.27.4) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.27.4) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.27.4) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.27.4) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.27.4) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.27.4) + + babel-preset-expo@11.0.15(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4)): + dependencies: + '@babel/plugin-proposal-decorators': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-export-namespace-from': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-object-rest-spread': 7.27.3(@babel/core@7.27.4) + '@babel/plugin-transform-parameters': 7.27.1(@babel/core@7.27.4) + '@babel/preset-react': 7.27.1(@babel/core@7.27.4) + '@babel/preset-typescript': 7.27.1(@babel/core@7.27.4) + '@react-native/babel-preset': 0.74.87(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4)) + babel-plugin-react-compiler: 0.0.0-experimental-592953e-20240517 + babel-plugin-react-native-web: 0.19.13 react-refresh: 0.14.2 transitivePeerDependencies: - '@babel/core' - '@babel/preset-env' - supports-color - babel-preset-fbjs@3.4.0(@babel/core@7.26.0): - dependencies: - '@babel/core': 7.26.0 - '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.26.0) - '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.26.0) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.26.0) - '@babel/plugin-syntax-flow': 7.26.0(@babel/core@7.26.0) - '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.26.0) - '@babel/plugin-transform-arrow-functions': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-block-scoped-functions': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-block-scoping': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-classes': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-computed-properties': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-destructuring': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-flow-strip-types': 7.26.5(@babel/core@7.26.0) - '@babel/plugin-transform-for-of': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-function-name': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-literals': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-member-expression-literals': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-modules-commonjs': 7.26.3(@babel/core@7.26.0) - '@babel/plugin-transform-object-super': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-property-literals': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-react-display-name': 7.24.7(@babel/core@7.26.0) - '@babel/plugin-transform-react-jsx': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-shorthand-properties': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-spread': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-template-literals': 7.25.9(@babel/core@7.26.0) + babel-preset-fbjs@3.4.0(@babel/core@7.27.4): + dependencies: + '@babel/core': 7.27.4 + '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.27.4) + '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.27.4) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.27.4) + '@babel/plugin-syntax-flow': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.27.4) + '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-block-scoped-functions': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-block-scoping': 7.27.5(@babel/core@7.27.4) + '@babel/plugin-transform-classes': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-computed-properties': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-destructuring': 7.27.3(@babel/core@7.27.4) + '@babel/plugin-transform-flow-strip-types': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-function-name': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-literals': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-member-expression-literals': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-object-super': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-parameters': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-property-literals': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-react-display-name': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-spread': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.27.4) babel-plugin-syntax-trailing-function-commas: 7.0.0-beta.0 transitivePeerDependencies: - supports-color optional: true - babel-preset-jest@29.6.3(@babel/core@7.26.0): + babel-preset-jest@29.6.3(@babel/core@7.27.4): dependencies: - '@babel/core': 7.26.0 + '@babel/core': 7.27.4 babel-plugin-jest-hoist: 29.6.3 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.26.0) + babel-preset-current-node-syntax: 1.1.0(@babel/core@7.27.4) + + babel-preset-jest@30.0.0(@babel/core@7.27.4): + dependencies: + '@babel/core': 7.27.4 + babel-plugin-jest-hoist: 30.0.0 + babel-preset-current-node-syntax: 1.1.0(@babel/core@7.27.4) balanced-match@1.0.2: {} @@ -12148,7 +12096,7 @@ snapshots: big-integer@1.6.52: {} - bignumber.js@9.1.2: {} + bignumber.js@9.3.0: {} bl@4.1.0: dependencies: @@ -12156,9 +12104,9 @@ snapshots: inherits: 2.0.4 readable-stream: 3.6.2 - bn.js@4.12.0: {} + bn.js@4.12.2: {} - bn.js@5.2.1: {} + bn.js@5.2.2: {} body-parser@1.20.3: dependencies: @@ -12179,7 +12127,7 @@ snapshots: borc@3.0.0: dependencies: - bignumber.js: 9.1.2 + bignumber.js: 9.3.0 buffer: 6.0.3 commander: 2.20.3 ieee754: 1.2.1 @@ -12216,18 +12164,14 @@ snapshots: dependencies: fill-range: 7.1.1 - breakword@1.0.6: - dependencies: - wcwidth: 1.0.1 - brorand@1.1.0: {} - browserslist@4.24.2: + browserslist@4.25.0: dependencies: - caniuse-lite: 1.0.30001687 - electron-to-chromium: 1.5.71 - node-releases: 2.0.18 - update-browserslist-db: 1.1.1(browserslist@4.24.2) + caniuse-lite: 1.0.30001721 + electron-to-chromium: 1.5.166 + node-releases: 2.0.19 + update-browserslist-db: 1.1.3(browserslist@4.25.0) bs-logger@0.2.6: dependencies: @@ -12264,17 +12208,14 @@ snapshots: dependencies: streamsearch: 1.1.0 - bytes@3.0.0: - optional: true - bytes@3.1.2: {} - cacache@18.0.3: + cacache@18.0.4: dependencies: '@npmcli/fs': 3.1.1 fs-minipass: 3.0.3 - glob: 10.4.2 - lru-cache: 10.2.2 + glob: 10.4.5 + lru-cache: 10.4.3 minipass: 7.1.2 minipass-collect: 2.0.1 minipass-flush: 1.0.5 @@ -12295,10 +12236,10 @@ snapshots: dependencies: '@types/http-cache-semantics': 4.0.4 get-stream: 6.0.1 - http-cache-semantics: 4.1.1 + http-cache-semantics: 4.2.0 keyv: 4.5.4 mimic-response: 4.0.0 - normalize-url: 8.0.1 + normalize-url: 8.0.2 responselike: 3.0.0 call-bind-apply-helpers@1.0.2: @@ -12306,12 +12247,11 @@ snapshots: es-errors: 1.3.0 function-bind: 1.1.2 - call-bind@1.0.7: + call-bind@1.0.8: dependencies: - es-define-property: 1.0.0 - es-errors: 1.3.0 - function-bind: 1.1.2 - get-intrinsic: 1.2.4 + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + get-intrinsic: 1.3.0 set-function-length: 1.2.2 call-bound@1.0.4: @@ -12331,23 +12271,19 @@ snapshots: callsites@3.1.0: {} - camelcase-keys@6.2.2: - dependencies: - camelcase: 5.3.1 - map-obj: 4.3.0 - quick-lru: 4.0.1 - camelcase@5.3.1: {} camelcase@6.3.0: {} - caniuse-lite@1.0.30001687: {} + caniuse-lite@1.0.30001721: {} canonicalize@1.0.8: {} - canonicalize@2.0.0: {} + canonicalize@2.1.0: {} - cbor2@1.12.0: {} + cbor2@2.0.1: + dependencies: + '@cto.af/wtf8': 0.0.2 chalk@2.4.2: dependencies: @@ -12396,15 +12332,17 @@ snapshots: ci-info@3.9.0: {} - cjs-module-lexer@1.3.1: {} + ci-info@4.2.0: {} + + cjs-module-lexer@1.4.3: {} class-transformer@0.5.1: {} class-validator@0.14.1: dependencies: - '@types/validator': 13.12.0 - libphonenumber-js: 1.11.3 - validator: 13.12.0 + '@types/validator': 13.15.1 + libphonenumber-js: 1.12.9 + validator: 13.15.15 clean-stack@2.2.0: {} @@ -12427,6 +12365,7 @@ snapshots: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 6.2.0 + optional: true cliui@8.0.1: dependencies: @@ -12450,7 +12389,7 @@ snapshots: dependencies: '@hapi/bourne': 3.0.0 inflation: 2.1.0 - qs: 6.12.1 + qs: 6.14.0 raw-body: 2.5.2 type-is: 1.6.18 @@ -12481,7 +12420,8 @@ snapshots: dependencies: delayed-stream: 1.0.0 - command-exists@1.2.9: {} + command-exists@1.2.9: + optional: true commander@12.1.0: {} @@ -12510,17 +12450,17 @@ snapshots: compressible@2.0.18: dependencies: - mime-db: 1.52.0 + mime-db: 1.54.0 optional: true - compression@1.7.4: + compression@1.8.0: dependencies: - accepts: 1.3.8 - bytes: 3.0.0 + bytes: 3.1.2 compressible: 2.0.18 debug: 2.6.9 + negotiator: 0.6.4 on-headers: 1.0.2 - safe-buffer: 5.1.2 + safe-buffer: 5.2.1 vary: 1.1.2 transitivePeerDependencies: - supports-color @@ -12565,9 +12505,9 @@ snapshots: depd: 2.0.0 keygrip: 1.1.0 - core-js-compat@3.39.0: + core-js-compat@3.43.0: dependencies: - browserslist: 4.24.2 + browserslist: 4.25.0 core-util-is@1.0.3: {} @@ -12609,25 +12549,19 @@ snapshots: credentials-context@2.0.0: {} - cross-fetch@3.1.8: + cross-fetch@3.2.0: dependencies: node-fetch: 2.7.0 transitivePeerDependencies: - encoding - cross-fetch@4.0.0: + cross-fetch@4.1.0: dependencies: node-fetch: 2.7.0 transitivePeerDependencies: - encoding - cross-spawn@5.1.0: - dependencies: - lru-cache: 4.1.5 - shebang-command: 1.2.0 - which: 1.3.1 - - cross-spawn@6.0.5: + cross-spawn@6.0.6: dependencies: nice-try: 1.0.5 path-key: 2.0.1 @@ -12635,7 +12569,7 @@ snapshots: shebang-command: 1.2.0 which: 1.3.1 - cross-spawn@7.0.3: + cross-spawn@7.0.6: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 @@ -12653,19 +12587,6 @@ snapshots: crypto@1.0.1: {} - csv-generate@3.4.3: {} - - csv-parse@4.16.3: {} - - csv-stringify@5.6.5: {} - - csv@5.5.3: - dependencies: - csv-generate: 3.4.3 - csv-parse: 4.16.3 - csv-stringify: 5.6.5 - stream-transform: 2.1.3 - d@1.0.2: dependencies: es5-ext: 0.10.64 @@ -12677,30 +12598,30 @@ snapshots: data-uri-to-buffer@4.0.1: {} - data-view-buffer@1.0.1: + data-view-buffer@1.0.2: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.4 es-errors: 1.3.0 - is-data-view: 1.0.1 + is-data-view: 1.0.2 - data-view-byte-length@1.0.1: + data-view-byte-length@1.0.2: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.4 es-errors: 1.3.0 - is-data-view: 1.0.1 + is-data-view: 1.0.2 - data-view-byte-offset@1.0.0: + data-view-byte-offset@1.0.1: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.4 es-errors: 1.3.0 - is-data-view: 1.0.1 + is-data-view: 1.0.2 dateformat@4.6.3: {} - dayjs@1.11.11: + dayjs@1.11.13: optional: true - dcql@0.2.20(typescript@5.5.4): + dcql@0.2.22(typescript@5.5.4): dependencies: valibot: 1.0.0-beta.8(typescript@5.5.4) transitivePeerDependencies: @@ -12714,16 +12635,12 @@ snapshots: dependencies: ms: 2.1.3 - debug@4.4.0: + debug@4.4.1: dependencies: ms: 2.1.3 - decamelize-keys@1.1.1: - dependencies: - decamelize: 1.2.0 - map-obj: 1.0.1 - - decamelize@1.2.0: {} + decamelize@1.2.0: + optional: true decode-uri-component@0.2.2: {} @@ -12731,7 +12648,7 @@ snapshots: dependencies: mimic-response: 3.1.0 - dedent@1.5.3: {} + dedent@1.6.0: {} deep-equal@1.0.1: {} @@ -12757,9 +12674,9 @@ snapshots: define-data-property@1.1.4: dependencies: - es-define-property: 1.0.0 + es-define-property: 1.0.1 es-errors: 1.3.0 - gopd: 1.0.1 + gopd: 1.2.0 define-lazy-prop@2.0.0: {} @@ -12799,7 +12716,7 @@ snapshots: detect-libc@1.0.3: {} - detect-libc@2.0.3: {} + detect-libc@2.0.4: {} detect-newline@3.1.0: {} @@ -12808,13 +12725,13 @@ snapshots: asap: 2.0.6 wrappy: 1.0.2 - did-jwt@8.0.9: + did-jwt@8.0.17: dependencies: - '@noble/ciphers': 1.2.1 - '@noble/curves': 1.8.1 - '@noble/hashes': 1.7.1 - '@scure/base': 1.2.1 - canonicalize: 2.0.0 + '@noble/ciphers': 1.3.0 + '@noble/curves': 1.9.2 + '@noble/hashes': 1.8.0 + '@scure/base': 1.2.6 + canonicalize: 2.1.0 did-resolver: 4.1.0 multibase: 4.0.6 multiformats: 9.9.0 @@ -12830,11 +12747,11 @@ snapshots: dependencies: path-type: 4.0.0 - dotenv-expand@11.0.6: + dotenv-expand@11.0.7: dependencies: - dotenv: 16.4.5 + dotenv: 16.4.7 - dotenv@16.4.5: {} + dotenv@16.4.7: {} dunder-proto@1.0.1: dependencies: @@ -12852,11 +12769,15 @@ snapshots: ee-first@1.1.1: {} - electron-to-chromium@1.5.71: {} + ejs@3.1.10: + dependencies: + jake: 10.9.2 + + electron-to-chromium@1.5.166: {} elliptic@6.6.1: dependencies: - bn.js: 4.12.0 + bn.js: 4.12.2 brorand: 1.1.0 hash.js: 1.1.7 hmac-drbg: 1.0.1 @@ -12885,11 +12806,9 @@ snapshots: env-editor@0.4.2: {} - envinfo@7.13.0: + envinfo@7.14.0: optional: true - eol@0.9.1: {} - error-ex@1.3.2: dependencies: is-arrayish: 0.2.1 @@ -12904,86 +12823,83 @@ snapshots: escape-html: 1.0.3 optional: true - es-abstract@1.23.3: + es-abstract@1.24.0: dependencies: - array-buffer-byte-length: 1.0.1 - arraybuffer.prototype.slice: 1.0.3 + array-buffer-byte-length: 1.0.2 + arraybuffer.prototype.slice: 1.0.4 available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - data-view-buffer: 1.0.1 - data-view-byte-length: 1.0.1 - data-view-byte-offset: 1.0.0 - es-define-property: 1.0.0 + call-bind: 1.0.8 + call-bound: 1.0.4 + data-view-buffer: 1.0.2 + data-view-byte-length: 1.0.2 + data-view-byte-offset: 1.0.1 + es-define-property: 1.0.1 es-errors: 1.3.0 - es-object-atoms: 1.0.0 - es-set-tostringtag: 2.0.3 - es-to-primitive: 1.2.1 - function.prototype.name: 1.1.6 - get-intrinsic: 1.2.4 - get-symbol-description: 1.0.2 + es-object-atoms: 1.1.1 + es-set-tostringtag: 2.1.0 + es-to-primitive: 1.3.0 + function.prototype.name: 1.1.8 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + get-symbol-description: 1.1.0 globalthis: 1.0.4 - gopd: 1.0.1 + gopd: 1.2.0 has-property-descriptors: 1.0.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 + has-proto: 1.2.0 + has-symbols: 1.1.0 hasown: 2.0.2 - internal-slot: 1.0.7 - is-array-buffer: 3.0.4 + internal-slot: 1.1.0 + is-array-buffer: 3.0.5 is-callable: 1.2.7 - is-data-view: 1.0.1 + is-data-view: 1.0.2 is-negative-zero: 2.0.3 - is-regex: 1.1.4 - is-shared-array-buffer: 1.0.3 - is-string: 1.0.7 - is-typed-array: 1.1.13 - is-weakref: 1.0.2 - object-inspect: 1.13.1 + is-regex: 1.2.1 + is-set: 2.0.3 + is-shared-array-buffer: 1.0.4 + is-string: 1.1.1 + is-typed-array: 1.1.15 + is-weakref: 1.1.1 + math-intrinsics: 1.1.0 + object-inspect: 1.13.4 object-keys: 1.1.1 - object.assign: 4.1.5 - regexp.prototype.flags: 1.5.2 - safe-array-concat: 1.1.2 - safe-regex-test: 1.0.3 - string.prototype.trim: 1.2.9 - string.prototype.trimend: 1.0.8 + object.assign: 4.1.7 + own-keys: 1.0.1 + regexp.prototype.flags: 1.5.4 + safe-array-concat: 1.1.3 + safe-push-apply: 1.0.0 + safe-regex-test: 1.1.0 + set-proto: 1.0.0 + stop-iteration-iterator: 1.1.0 + string.prototype.trim: 1.2.10 + string.prototype.trimend: 1.0.9 string.prototype.trimstart: 1.0.8 - typed-array-buffer: 1.0.2 - typed-array-byte-length: 1.0.1 - typed-array-byte-offset: 1.0.2 - typed-array-length: 1.0.6 - unbox-primitive: 1.0.2 - which-typed-array: 1.1.15 - - es-define-property@1.0.0: - dependencies: - get-intrinsic: 1.2.4 + typed-array-buffer: 1.0.3 + typed-array-byte-length: 1.0.3 + typed-array-byte-offset: 1.0.4 + typed-array-length: 1.0.7 + unbox-primitive: 1.1.0 + which-typed-array: 1.1.19 es-define-property@1.0.1: {} es-errors@1.3.0: {} - es-object-atoms@1.0.0: - dependencies: - es-errors: 1.3.0 - es-object-atoms@1.1.1: dependencies: es-errors: 1.3.0 - es-set-tostringtag@2.0.3: + es-set-tostringtag@2.1.0: dependencies: - get-intrinsic: 1.2.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 has-tostringtag: 1.0.2 hasown: 2.0.2 - es-shim-unscopables@1.0.2: - dependencies: - hasown: 2.0.2 - - es-to-primitive@1.2.1: + es-to-primitive@1.3.0: dependencies: is-callable: 1.2.7 - is-date-object: 1.0.5 - is-symbol: 1.0.4 + is-date-object: 1.1.0 + is-symbol: 1.1.1 es5-ext@0.10.64: dependencies: @@ -13003,32 +12919,33 @@ snapshots: d: 1.0.2 ext: 1.7.0 - esbuild@0.23.1: + esbuild@0.25.5: optionalDependencies: - '@esbuild/aix-ppc64': 0.23.1 - '@esbuild/android-arm': 0.23.1 - '@esbuild/android-arm64': 0.23.1 - '@esbuild/android-x64': 0.23.1 - '@esbuild/darwin-arm64': 0.23.1 - '@esbuild/darwin-x64': 0.23.1 - '@esbuild/freebsd-arm64': 0.23.1 - '@esbuild/freebsd-x64': 0.23.1 - '@esbuild/linux-arm': 0.23.1 - '@esbuild/linux-arm64': 0.23.1 - '@esbuild/linux-ia32': 0.23.1 - '@esbuild/linux-loong64': 0.23.1 - '@esbuild/linux-mips64el': 0.23.1 - '@esbuild/linux-ppc64': 0.23.1 - '@esbuild/linux-riscv64': 0.23.1 - '@esbuild/linux-s390x': 0.23.1 - '@esbuild/linux-x64': 0.23.1 - '@esbuild/netbsd-x64': 0.23.1 - '@esbuild/openbsd-arm64': 0.23.1 - '@esbuild/openbsd-x64': 0.23.1 - '@esbuild/sunos-x64': 0.23.1 - '@esbuild/win32-arm64': 0.23.1 - '@esbuild/win32-ia32': 0.23.1 - '@esbuild/win32-x64': 0.23.1 + '@esbuild/aix-ppc64': 0.25.5 + '@esbuild/android-arm': 0.25.5 + '@esbuild/android-arm64': 0.25.5 + '@esbuild/android-x64': 0.25.5 + '@esbuild/darwin-arm64': 0.25.5 + '@esbuild/darwin-x64': 0.25.5 + '@esbuild/freebsd-arm64': 0.25.5 + '@esbuild/freebsd-x64': 0.25.5 + '@esbuild/linux-arm': 0.25.5 + '@esbuild/linux-arm64': 0.25.5 + '@esbuild/linux-ia32': 0.25.5 + '@esbuild/linux-loong64': 0.25.5 + '@esbuild/linux-mips64el': 0.25.5 + '@esbuild/linux-ppc64': 0.25.5 + '@esbuild/linux-riscv64': 0.25.5 + '@esbuild/linux-s390x': 0.25.5 + '@esbuild/linux-x64': 0.25.5 + '@esbuild/netbsd-arm64': 0.25.5 + '@esbuild/netbsd-x64': 0.25.5 + '@esbuild/openbsd-arm64': 0.25.5 + '@esbuild/openbsd-x64': 0.25.5 + '@esbuild/sunos-x64': 0.25.5 + '@esbuild/win32-arm64': 0.25.5 + '@esbuild/win32-ia32': 0.25.5 + '@esbuild/win32-x64': 0.25.5 escalade@3.2.0: {} @@ -13079,7 +12996,7 @@ snapshots: execa@1.0.0: dependencies: - cross-spawn: 6.0.5 + cross-spawn: 6.0.6 get-stream: 4.1.0 is-stream: 1.1.0 npm-run-path: 2.0.2 @@ -13089,7 +13006,7 @@ snapshots: execa@5.1.1: dependencies: - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 get-stream: 6.0.1 human-signals: 2.1.0 is-stream: 2.0.1 @@ -13111,41 +13028,41 @@ snapshots: jest-message-util: 29.7.0 jest-util: 29.7.0 - expo-asset@10.0.10(expo@51.0.29(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))): + expo-asset@10.0.10(expo@51.0.29(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)): dependencies: - expo: 51.0.29(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0)) - expo-constants: 16.0.2(expo@51.0.29(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))) + expo: 51.0.29(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) + expo-constants: 16.0.2(expo@51.0.29(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)) invariant: 2.2.4 md5-file: 3.2.3 transitivePeerDependencies: - supports-color - expo-constants@16.0.2(expo@51.0.29(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))): + expo-constants@16.0.2(expo@51.0.29(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)): dependencies: '@expo/config': 9.0.3 '@expo/env': 0.3.0 - expo: 51.0.29(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0)) + expo: 51.0.29(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) transitivePeerDependencies: - supports-color - expo-file-system@17.0.1(expo@51.0.29(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))): + expo-file-system@17.0.1(expo@51.0.29(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)): dependencies: - expo: 51.0.29(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0)) + expo: 51.0.29(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) - expo-font@12.0.9(expo@51.0.29(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))): + expo-font@12.0.10(expo@51.0.29(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)): dependencies: - expo: 51.0.29(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0)) + expo: 51.0.29(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) fontfaceobserver: 2.3.0 - expo-keep-awake@13.0.2(expo@51.0.29(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))): + expo-keep-awake@13.0.2(expo@51.0.29(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)): dependencies: - expo: 51.0.29(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0)) + expo: 51.0.29(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) expo-modules-autolinking@0.0.3: dependencies: chalk: 4.1.2 commander: 7.2.0 - fast-glob: 3.3.2 + fast-glob: 3.3.3 find-up: 5.0.0 fs-extra: 9.1.0 optional: true @@ -13154,7 +13071,7 @@ snapshots: dependencies: chalk: 4.1.2 commander: 7.2.0 - fast-glob: 3.3.2 + fast-glob: 3.3.3 find-up: 5.0.0 fs-extra: 9.1.0 require-from-string: 2.0.2 @@ -13164,25 +13081,25 @@ snapshots: dependencies: invariant: 2.2.4 - expo-random@14.0.1(expo@51.0.29(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))): + expo-random@14.0.1(expo@51.0.29(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)): dependencies: base64-js: 1.5.1 - expo: 51.0.29(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0)) + expo: 51.0.29(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) optional: true - expo@51.0.29(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0)): + expo@51.0.29(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1): dependencies: - '@babel/runtime': 7.26.10 + '@babel/runtime': 7.27.6 '@expo/cli': 0.18.29(expo-modules-autolinking@1.11.2) '@expo/config': 9.0.3 '@expo/config-plugins': 8.0.8 '@expo/metro-config': 0.18.11 - '@expo/vector-icons': 14.0.2 - babel-preset-expo: 11.0.14(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0)) - expo-asset: 10.0.10(expo@51.0.29(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))) - expo-file-system: 17.0.1(expo@51.0.29(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))) - expo-font: 12.0.9(expo@51.0.29(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))) - expo-keep-awake: 13.0.2(expo@51.0.29(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))) + '@expo/vector-icons': 14.1.0(expo-font@12.0.10(expo@51.0.29(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)))(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) + babel-preset-expo: 11.0.15(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4)) + expo-asset: 10.0.10(expo@51.0.29(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)) + expo-file-system: 17.0.1(expo@51.0.29(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)) + expo-font: 12.0.10(expo@51.0.29(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)) + expo-keep-awake: 13.0.2(expo@51.0.29(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)) expo-modules-autolinking: 1.11.2 expo-modules-core: 1.12.21 fbemitter: 3.0.0 @@ -13192,6 +13109,8 @@ snapshots: - '@babel/preset-env' - bufferutil - encoding + - react + - react-native - supports-color - utf-8-validate @@ -13251,13 +13170,13 @@ snapshots: fast-deep-equal@3.1.3: {} - fast-glob@3.3.2: + fast-glob@3.3.3: dependencies: '@nodelib/fs.stat': 2.0.5 '@nodelib/fs.walk': 1.2.8 glob-parent: 5.1.2 merge2: 1.4.1 - micromatch: 4.0.7 + micromatch: 4.0.8 fast-json-stable-stringify@2.1.0: {} @@ -13269,14 +13188,16 @@ snapshots: fast-text-encoding@1.0.6: {} - fast-xml-parser@4.4.0: + fast-uri@3.0.6: {} + + fast-xml-parser@4.5.3: dependencies: - strnum: 1.0.5 + strnum: 1.1.2 optional: true - fastq@1.17.1: + fastq@1.19.1: dependencies: - reusify: 1.0.4 + reusify: 1.1.0 fb-watchman@2.0.2: dependencies: @@ -13292,13 +13213,13 @@ snapshots: fbjs@3.0.5: dependencies: - cross-fetch: 3.1.8 + cross-fetch: 3.2.0 fbjs-css-vars: 1.0.2 loose-envify: 1.4.0 object-assign: 4.1.1 promise: 7.3.1 setimmediate: 1.0.5 - ua-parser-js: 1.0.38 + ua-parser-js: 1.0.40 transitivePeerDependencies: - encoding @@ -13313,7 +13234,7 @@ snapshots: fflate@0.8.2: {} - figlet@1.7.0: {} + figlet@1.8.1: {} figures@3.2.0: dependencies: @@ -13321,19 +13242,23 @@ snapshots: file-type@16.5.4: dependencies: - readable-web-to-node-stream: 3.0.2 + readable-web-to-node-stream: 3.0.4 strtok3: 6.3.0 token-types: 4.2.1 - file-type@20.4.1: + file-type@20.5.0: dependencies: '@tokenizer/inflate': 0.2.7 - strtok3: 10.2.2 + strtok3: 10.3.1 token-types: 6.0.0 uint8array-extras: 1.4.0 transitivePeerDependencies: - supports-color + filelist@1.0.4: + dependencies: + minimatch: 5.1.6 + fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 @@ -13384,54 +13309,52 @@ snapshots: locate-path: 6.0.0 path-exists: 4.0.0 - find-yarn-workspace-root2@1.2.16: - dependencies: - micromatch: 4.0.7 - pkg-dir: 4.2.0 - find-yarn-workspace-root@2.0.0: dependencies: - micromatch: 4.0.7 + micromatch: 4.0.8 fix-esm@1.0.1: dependencies: - '@babel/core': 7.26.0 - '@babel/plugin-proposal-export-namespace-from': 7.18.9(@babel/core@7.26.0) - '@babel/plugin-transform-modules-commonjs': 7.26.3(@babel/core@7.26.0) + '@babel/core': 7.27.4 + '@babel/plugin-proposal-export-namespace-from': 7.18.9(@babel/core@7.27.4) + '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.27.4) transitivePeerDependencies: - supports-color flow-enums-runtime@0.0.6: {} - flow-parser@0.185.2: {} + flow-parser@0.273.0: {} - follow-redirects@1.15.6: {} + follow-redirects@1.15.9: {} fontfaceobserver@2.3.0: {} - for-each@0.3.3: + for-each@0.3.5: dependencies: is-callable: 1.2.7 - foreground-child@3.2.1: + foreground-child@3.3.1: dependencies: - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 signal-exit: 4.1.0 forge-light@1.1.4: {} form-data-encoder@2.1.4: {} - form-data@3.0.1: + form-data@3.0.3: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 mime-types: 2.1.35 - form-data@4.0.0: + form-data@4.0.3: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.2 mime-types: 2.1.35 format-util@1.0.5: {} @@ -13440,10 +13363,10 @@ snapshots: dependencies: fetch-blob: 3.2.0 - formidable@3.5.2: + formidable@3.5.4: dependencies: + '@paralleldrive/cuid2': 2.2.2 dezalgo: 1.0.4 - hexoid: 2.0.0 once: 1.4.0 forwarded@0.2.0: {} @@ -13495,12 +13418,14 @@ snapshots: function-bind@1.1.2: {} - function.prototype.name@1.1.6: + function.prototype.name@1.1.8: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.23.3 functions-have-names: 1.2.3 + hasown: 2.0.2 + is-callable: 1.2.7 functions-have-names@1.2.3: {} @@ -13520,14 +13445,6 @@ snapshots: get-caller-file@2.0.5: {} - get-intrinsic@1.2.4: - dependencies: - es-errors: 1.3.0 - function-bind: 1.1.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 - hasown: 2.0.2 - get-intrinsic@1.3.0: dependencies: call-bind-apply-helpers: 1.0.2 @@ -13543,8 +13460,6 @@ snapshots: get-package-type@0.1.0: {} - get-port@3.2.0: {} - get-proto@1.0.1: dependencies: dunder-proto: 1.0.1 @@ -13552,19 +13467,19 @@ snapshots: get-stream@4.1.0: dependencies: - pump: 3.0.0 + pump: 3.0.2 get-stream@6.0.1: {} - get-symbol-description@1.0.2: + get-symbol-description@1.1.0: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.4 es-errors: 1.3.0 - get-intrinsic: 1.2.4 + get-intrinsic: 1.3.0 get-symbol-from-current-process-h@1.0.2: {} - get-tsconfig@4.7.5: + get-tsconfig@4.10.1: dependencies: resolve-pkg-maps: 1.0.0 @@ -13580,24 +13495,15 @@ snapshots: dependencies: is-glob: 4.0.3 - glob@10.4.2: + glob@10.4.5: dependencies: - foreground-child: 3.2.1 - jackspeak: 3.4.0 - minimatch: 9.0.4 + foreground-child: 3.3.1 + jackspeak: 3.4.3 + minimatch: 9.0.5 minipass: 7.1.2 - package-json-from-dist: 1.0.0 + package-json-from-dist: 1.0.1 path-scurry: 1.11.1 - glob@6.0.4: - dependencies: - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - optional: true - glob@7.1.6: dependencies: fs.realpath: 1.0.0 @@ -13628,21 +13534,17 @@ snapshots: globalthis@1.0.4: dependencies: define-properties: 1.2.1 - gopd: 1.0.1 + gopd: 1.2.0 globby@11.1.0: dependencies: array-union: 2.1.0 dir-glob: 3.0.1 - fast-glob: 3.3.2 - ignore: 5.3.1 + fast-glob: 3.3.3 + ignore: 5.3.2 merge2: 1.4.1 slash: 3.0.0 - gopd@1.0.1: - dependencies: - get-intrinsic: 1.2.4 - gopd@1.2.0: {} got@13.0.0: @@ -13661,8 +13563,6 @@ snapshots: graceful-fs@4.2.11: {} - grapheme-splitter@1.0.4: {} - graphql-tag@2.12.6(graphql@15.8.0): dependencies: graphql: 15.8.0 @@ -13670,9 +13570,7 @@ snapshots: graphql@15.8.0: {} - hard-rejection@2.1.0: {} - - has-bigints@1.0.2: {} + has-bigints@1.1.0: {} has-flag@3.0.0: {} @@ -13680,17 +13578,17 @@ snapshots: has-property-descriptors@1.0.2: dependencies: - es-define-property: 1.0.0 - - has-proto@1.0.3: {} + es-define-property: 1.0.1 - has-symbols@1.0.3: {} + has-proto@1.2.0: + dependencies: + dunder-proto: 1.0.1 has-symbols@1.1.0: {} has-tostringtag@1.0.2: dependencies: - has-symbols: 1.0.3 + has-symbols: 1.1.0 has-unicode@2.0.1: {} @@ -13730,20 +13628,20 @@ snapshots: source-map: 0.7.4 optional: true - hexoid@2.0.0: {} - hmac-drbg@1.0.1: dependencies: hash.js: 1.1.7 minimalistic-assert: 1.0.1 minimalistic-crypto-utils: 1.0.1 - hosted-git-info@2.8.9: {} - hosted-git-info@3.0.8: dependencies: lru-cache: 6.0.0 + hosted-git-info@7.0.2: + dependencies: + lru-cache: 10.4.3 + html-escaper@2.0.2: {} http-assert@1.5.0: @@ -13751,7 +13649,7 @@ snapshots: deep-equal: 1.0.1 http-errors: 1.8.1 - http-cache-semantics@4.1.1: {} + http-cache-semantics@4.2.0: {} http-errors@1.8.1: dependencies: @@ -13777,11 +13675,11 @@ snapshots: https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 - debug: 4.4.0 + debug: 4.4.1 transitivePeerDependencies: - supports-color - human-id@1.0.2: {} + human-id@4.1.1: {} human-signals@2.1.0: {} @@ -13795,12 +13693,12 @@ snapshots: ieee754@1.2.1: {} - ignore@5.3.1: {} + ignore@5.3.2: {} image-size@0.6.3: optional: true - image-size@1.2.0: + image-size@1.2.1: dependencies: queue: 6.0.2 @@ -13809,7 +13707,7 @@ snapshots: caller-path: 2.0.0 resolve-from: 3.0.0 - import-local@3.1.0: + import-local@3.2.0: dependencies: pkg-dir: 4.2.0 resolve-cwd: 3.0.0 @@ -13841,7 +13739,7 @@ snapshots: mute-stream: 0.0.8 ora: 5.4.1 run-async: 2.4.1 - rxjs: 7.8.1 + rxjs: 7.8.2 string-width: 4.2.3 strip-ansi: 6.0.1 through: 2.3.8 @@ -13852,11 +13750,11 @@ snapshots: default-gateway: 4.2.0 ipaddr.js: 1.9.1 - internal-slot@1.0.7: + internal-slot@1.1.0: dependencies: es-errors: 1.3.0 hasown: 2.0.2 - side-channel: 1.0.6 + side-channel: 1.1.0 invariant@2.2.4: dependencies: @@ -13866,7 +13764,7 @@ snapshots: dependencies: '@ioredis/commands': 1.2.0 cluster-key-slot: 1.1.2 - debug: 4.4.0 + debug: 4.4.1 denque: 2.1.0 lodash.defaults: 4.2.0 lodash.isarguments: 3.1.0 @@ -13880,43 +13778,53 @@ snapshots: ipaddr.js@1.9.1: {} - ipaddr.js@2.2.0: {} - is-arguments@1.2.0: dependencies: call-bound: 1.0.4 has-tostringtag: 1.0.2 - is-array-buffer@3.0.4: + is-array-buffer@3.0.5: dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 + call-bind: 1.0.8 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 is-arrayish@0.2.1: {} - is-bigint@1.0.4: + is-async-function@2.1.1: dependencies: - has-bigints: 1.0.2 + async-function: 1.0.0 + call-bound: 1.0.4 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-bigint@1.1.0: + dependencies: + has-bigints: 1.1.0 - is-boolean-object@1.1.2: + is-boolean-object@1.2.2: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.4 has-tostringtag: 1.0.2 is-buffer@1.1.6: {} is-callable@1.2.7: {} - is-core-module@2.13.1: + is-core-module@2.16.1: dependencies: hasown: 2.0.2 - is-data-view@1.0.1: + is-data-view@1.0.2: dependencies: - is-typed-array: 1.1.13 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + is-typed-array: 1.1.15 - is-date-object@1.0.5: + is-date-object@1.1.0: dependencies: + call-bound: 1.0.4 has-tostringtag: 1.0.2 is-directory@0.3.1: {} @@ -13927,6 +13835,10 @@ snapshots: is-extglob@2.1.1: {} + is-finalizationregistry@1.1.1: + dependencies: + call-bound: 1.0.4 + is-fullwidth-code-point@2.0.0: optional: true @@ -13934,9 +13846,12 @@ snapshots: is-generator-fn@2.1.0: {} - is-generator-function@1.0.10: + is-generator-function@1.1.0: dependencies: + call-bound: 1.0.4 + get-proto: 1.0.1 has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 is-glob@2.0.1: dependencies: @@ -13952,12 +13867,15 @@ snapshots: dependencies: is-glob: 2.0.1 + is-map@2.0.3: {} + is-negative-zero@2.0.3: {} is-node-process@1.2.0: {} - is-number-object@1.0.7: + is-number-object@1.1.1: dependencies: + call-bound: 1.0.4 has-tostringtag: 1.0.2 is-number@7.0.0: {} @@ -13966,40 +13884,45 @@ snapshots: is-path-inside@3.0.3: {} - is-plain-obj@1.1.0: {} - is-plain-object@2.0.4: dependencies: isobject: 3.0.1 - is-regex@1.1.4: + is-regex@1.2.1: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.4 + gopd: 1.2.0 has-tostringtag: 1.0.2 + hasown: 2.0.2 + + is-set@2.0.3: {} - is-shared-array-buffer@1.0.3: + is-shared-array-buffer@1.0.4: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.4 is-stream@1.1.0: {} is-stream@2.0.1: {} - is-string@1.0.7: + is-string@1.1.1: dependencies: + call-bound: 1.0.4 has-tostringtag: 1.0.2 is-subdir@1.2.0: dependencies: better-path-resolve: 1.0.0 - is-symbol@1.0.4: + is-symbol@1.1.1: dependencies: - has-symbols: 1.0.3 + call-bound: 1.0.4 + has-symbols: 1.1.0 + safe-regex-test: 1.1.0 - is-typed-array@1.1.13: + is-typed-array@1.1.15: dependencies: - which-typed-array: 1.1.15 + which-typed-array: 1.1.19 is-unicode-supported@0.1.0: {} @@ -14007,9 +13930,16 @@ snapshots: dependencies: is-invalid-path: 0.1.0 - is-weakref@1.0.2: + is-weakmap@2.0.2: {} + + is-weakref@1.1.1: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.4 + + is-weakset@2.0.4: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 is-windows@1.0.2: {} @@ -14030,7 +13960,7 @@ snapshots: isobject@3.0.1: {} - isomorphic-webcrypto@2.3.8(expo@51.0.29(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0)))(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1)): + isomorphic-webcrypto@2.3.8(expo@51.0.29(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1))(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)): dependencies: '@peculiar/webcrypto': 1.5.0 asmcrypto.js: 0.22.0 @@ -14042,8 +13972,8 @@ snapshots: optionalDependencies: '@unimodules/core': 7.1.2 '@unimodules/react-native-adapter': 6.3.9 - expo-random: 14.0.1(expo@51.0.29(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))) - react-native-securerandom: 0.1.1(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1)) + expo-random: 14.0.1(expo@51.0.29(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)) + react-native-securerandom: 0.1.1(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) transitivePeerDependencies: - expo - react-native @@ -14056,21 +13986,21 @@ snapshots: istanbul-lib-instrument@5.2.1: dependencies: - '@babel/core': 7.26.0 - '@babel/parser': 7.26.3 + '@babel/core': 7.27.4 + '@babel/parser': 7.27.5 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 6.3.1 transitivePeerDependencies: - supports-color - istanbul-lib-instrument@6.0.2: + istanbul-lib-instrument@6.0.3: dependencies: - '@babel/core': 7.26.0 - '@babel/parser': 7.26.3 + '@babel/core': 7.27.4 + '@babel/parser': 7.27.5 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 - semver: 7.6.2 + semver: 7.7.2 transitivePeerDependencies: - supports-color @@ -14082,7 +14012,7 @@ snapshots: istanbul-lib-source-maps@4.0.1: dependencies: - debug: 4.4.0 + debug: 4.4.1 istanbul-lib-coverage: 3.2.2 source-map: 0.6.1 transitivePeerDependencies: @@ -14093,12 +14023,19 @@ snapshots: html-escaper: 2.0.2 istanbul-lib-report: 3.0.1 - jackspeak@3.4.0: + jackspeak@3.4.3: dependencies: '@isaacs/cliui': 8.0.2 optionalDependencies: '@pkgjs/parseargs': 0.11.0 + jake@10.9.2: + dependencies: + async: 3.2.6 + chalk: 4.1.2 + filelist: 1.0.4 + minimatch: 3.1.2 + jest-changed-files@29.7.0: dependencies: execa: 5.1.1 @@ -14114,7 +14051,7 @@ snapshots: '@types/node': 18.18.8 chalk: 4.1.2 co: 4.6.0 - dedent: 1.5.3 + dedent: 1.6.0 is-generator-fn: 2.1.0 jest-each: 29.7.0 jest-matcher-utils: 29.7.0 @@ -14139,7 +14076,7 @@ snapshots: chalk: 4.1.2 create-jest: 29.7.0(@types/node@18.18.8)(ts-node@10.9.2(@types/node@18.18.8)(typescript@5.5.4)) exit: 0.1.2 - import-local: 3.1.0 + import-local: 3.2.0 jest-config: 29.7.0(@types/node@18.18.8)(ts-node@10.9.2(@types/node@18.18.8)(typescript@5.5.4)) jest-util: 29.7.0 jest-validate: 29.7.0 @@ -14152,10 +14089,10 @@ snapshots: jest-config@29.7.0(@types/node@18.18.8)(ts-node@10.9.2(@types/node@18.18.8)(typescript@5.5.4)): dependencies: - '@babel/core': 7.26.0 + '@babel/core': 7.27.4 '@jest/test-sequencer': 29.7.0 '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.26.0) + babel-jest: 29.7.0(@babel/core@7.27.4) chalk: 4.1.2 ci-info: 3.9.0 deepmerge: 4.3.1 @@ -14169,7 +14106,7 @@ snapshots: jest-runner: 29.7.0 jest-util: 29.7.0 jest-validate: 29.7.0 - micromatch: 4.0.7 + micromatch: 4.0.8 parse-json: 5.2.0 pretty-format: 29.7.0 slash: 3.0.0 @@ -14225,7 +14162,22 @@ snapshots: jest-regex-util: 29.6.3 jest-util: 29.7.0 jest-worker: 29.7.0 - micromatch: 4.0.7 + micromatch: 4.0.8 + walker: 1.0.8 + optionalDependencies: + fsevents: 2.3.3 + + jest-haste-map@30.0.0: + dependencies: + '@jest/types': 30.0.0 + '@types/node': 18.18.8 + anymatch: 3.1.3 + fb-watchman: 2.0.2 + graceful-fs: 4.2.11 + jest-regex-util: 30.0.0 + jest-util: 30.0.0 + jest-worker: 30.0.0 + micromatch: 4.0.8 walker: 1.0.8 optionalDependencies: fsevents: 2.3.3 @@ -14244,12 +14196,12 @@ snapshots: jest-message-util@29.7.0: dependencies: - '@babel/code-frame': 7.26.2 + '@babel/code-frame': 7.27.1 '@jest/types': 29.6.3 '@types/stack-utils': 2.0.3 chalk: 4.1.2 graceful-fs: 4.2.11 - micromatch: 4.0.7 + micromatch: 4.0.8 pretty-format: 29.7.0 slash: 3.0.0 stack-utils: 2.0.6 @@ -14269,6 +14221,8 @@ snapshots: jest-regex-util@29.6.3: {} + jest-regex-util@30.0.0: {} + jest-resolve-dependencies@29.7.0: dependencies: jest-regex-util: 29.6.3 @@ -14284,8 +14238,8 @@ snapshots: jest-pnp-resolver: 1.2.3(jest-resolve@29.7.0) jest-util: 29.7.0 jest-validate: 29.7.0 - resolve: 1.22.8 - resolve.exports: 2.0.2 + resolve: 1.22.10 + resolve.exports: 2.0.3 slash: 3.0.0 jest-runner@29.7.0: @@ -14325,7 +14279,7 @@ snapshots: '@jest/types': 29.6.3 '@types/node': 18.18.8 chalk: 4.1.2 - cjs-module-lexer: 1.3.1 + cjs-module-lexer: 1.4.3 collect-v8-coverage: 1.0.2 glob: 7.2.3 graceful-fs: 4.2.11 @@ -14349,15 +14303,15 @@ snapshots: jest-snapshot@29.7.0: dependencies: - '@babel/core': 7.26.0 - '@babel/generator': 7.26.3 - '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.26.0) - '@babel/plugin-syntax-typescript': 7.24.7(@babel/core@7.26.0) - '@babel/types': 7.26.3 + '@babel/core': 7.27.4 + '@babel/generator': 7.27.5 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.27.4) + '@babel/types': 7.27.6 '@jest/expect-utils': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.26.0) + babel-preset-current-node-syntax: 1.1.0(@babel/core@7.27.4) chalk: 4.1.2 expect: 29.7.0 graceful-fs: 4.2.11 @@ -14368,7 +14322,7 @@ snapshots: jest-util: 29.7.0 natural-compare: 1.4.0 pretty-format: 29.7.0 - semver: 7.6.2 + semver: 7.7.2 transitivePeerDependencies: - supports-color @@ -14391,6 +14345,15 @@ snapshots: graceful-fs: 4.2.11 picomatch: 2.3.1 + jest-util@30.0.0: + dependencies: + '@jest/types': 30.0.0 + '@types/node': 18.18.8 + chalk: 4.1.2 + ci-info: 4.2.0 + graceful-fs: 4.2.11 + picomatch: 4.0.2 + jest-validate@26.6.2: dependencies: '@jest/types': 26.6.2 @@ -14435,11 +14398,19 @@ snapshots: merge-stream: 2.0.0 supports-color: 8.1.1 + jest-worker@30.0.0: + dependencies: + '@types/node': 18.18.8 + '@ungap/structured-clone': 1.3.0 + jest-util: 30.0.0 + merge-stream: 2.0.0 + supports-color: 8.1.1 + jest@29.7.0(@types/node@18.18.8)(ts-node@10.9.2(@types/node@18.18.8)(typescript@5.5.4)): dependencies: '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@18.18.8)(typescript@5.5.4)) '@jest/types': 29.6.3 - import-local: 3.1.0 + import-local: 3.2.0 jest-cli: 29.7.0(@types/node@18.18.8)(ts-node@10.9.2(@types/node@18.18.8)(typescript@5.5.4)) transitivePeerDependencies: - '@types/node' @@ -14449,7 +14420,7 @@ snapshots: jimp-compact@0.16.1: {} - joi@17.13.1: + joi@17.13.3: dependencies: '@hapi/hoek': 9.3.0 '@hapi/topo': 5.1.0 @@ -14460,7 +14431,7 @@ snapshots: join-component@1.1.0: {} - jose@5.9.6: {} + jose@5.10.0: {} joycon@3.1.1: {} @@ -14481,23 +14452,23 @@ snapshots: jsc-safe-url@0.2.4: {} - jscodeshift@0.14.0(@babel/preset-env@7.26.0(@babel/core@7.26.0)): - dependencies: - '@babel/core': 7.26.0 - '@babel/parser': 7.26.3 - '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.26.0) - '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.26.0) - '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.26.0) - '@babel/plugin-transform-modules-commonjs': 7.26.3(@babel/core@7.26.0) - '@babel/preset-env': 7.26.0(@babel/core@7.26.0) - '@babel/preset-flow': 7.24.7(@babel/core@7.26.0) - '@babel/preset-typescript': 7.24.7(@babel/core@7.26.0) - '@babel/register': 7.24.6(@babel/core@7.26.0) - babel-core: 7.0.0-bridge.0(@babel/core@7.26.0) + jscodeshift@0.14.0(@babel/preset-env@7.27.2(@babel/core@7.27.4)): + dependencies: + '@babel/core': 7.27.4 + '@babel/parser': 7.27.5 + '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.27.4) + '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.27.4) + '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.27.4) + '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.27.4) + '@babel/preset-env': 7.27.2(@babel/core@7.27.4) + '@babel/preset-flow': 7.27.1(@babel/core@7.27.4) + '@babel/preset-typescript': 7.27.1(@babel/core@7.27.4) + '@babel/register': 7.27.1(@babel/core@7.27.4) + babel-core: 7.0.0-bridge.0(@babel/core@7.27.4) chalk: 4.1.2 - flow-parser: 0.185.2 + flow-parser: 0.273.0 graceful-fs: 4.2.11 - micromatch: 4.0.7 + micromatch: 4.0.8 neo-async: 2.6.2 node-dir: 0.1.17 recast: 0.21.5 @@ -14506,28 +14477,28 @@ snapshots: transitivePeerDependencies: - supports-color - jscodeshift@17.2.0(@babel/preset-env@7.26.0(@babel/core@7.26.0)): - dependencies: - '@babel/core': 7.26.0 - '@babel/parser': 7.26.3 - '@babel/plugin-transform-class-properties': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-modules-commonjs': 7.26.3(@babel/core@7.26.0) - '@babel/plugin-transform-nullish-coalescing-operator': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-optional-chaining': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-private-methods': 7.25.9(@babel/core@7.26.0) - '@babel/preset-flow': 7.24.7(@babel/core@7.26.0) - '@babel/preset-typescript': 7.24.7(@babel/core@7.26.0) - '@babel/register': 7.24.6(@babel/core@7.26.0) - flow-parser: 0.185.2 + jscodeshift@17.3.0(@babel/preset-env@7.27.2(@babel/core@7.27.4)): + dependencies: + '@babel/core': 7.27.4 + '@babel/parser': 7.27.5 + '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-nullish-coalescing-operator': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-private-methods': 7.27.1(@babel/core@7.27.4) + '@babel/preset-flow': 7.27.1(@babel/core@7.27.4) + '@babel/preset-typescript': 7.27.1(@babel/core@7.27.4) + '@babel/register': 7.27.1(@babel/core@7.27.4) + flow-parser: 0.273.0 graceful-fs: 4.2.11 - micromatch: 4.0.7 + micromatch: 4.0.8 neo-async: 2.6.2 picocolors: 1.1.1 recast: 0.23.11 tmp: 0.2.3 write-file-atomic: 5.0.1 optionalDependencies: - '@babel/preset-env': 7.26.0(@babel/core@7.26.0) + '@babel/preset-env': 7.27.2(@babel/core@7.27.4) transitivePeerDependencies: - supports-color @@ -14551,7 +14522,7 @@ snapshots: lodash: 4.17.21 md5: 2.2.1 memory-cache: 0.2.0 - traverse: 0.6.9 + traverse: 0.6.11 valid-url: 1.0.9 json-schema-traverse@1.0.0: {} @@ -14574,15 +14545,16 @@ snapshots: optionalDependencies: graceful-fs: 4.2.11 - jsonld-signatures@11.2.1(web-streams-polyfill@3.3.3): + jsonld-signatures@11.5.0(web-streams-polyfill@3.3.3): dependencies: '@digitalbazaar/security-context': 1.0.1 - jsonld: 8.3.2(web-streams-polyfill@3.3.3) + jsonld: 8.3.3(web-streams-polyfill@3.3.3) + rdf-canonize: 4.0.1 serialize-error: 8.1.0 transitivePeerDependencies: - web-streams-polyfill - jsonld@8.3.2(web-streams-polyfill@3.3.3): + jsonld@8.3.3(web-streams-polyfill@3.3.3): dependencies: '@digitalbazaar/http-client': 3.4.1(web-streams-polyfill@3.3.3) canonicalize: 1.0.8 @@ -14607,8 +14579,6 @@ snapshots: kleur@3.0.3: {} - kleur@4.1.5: {} - koa-compose@4.1.0: {} koa-convert@2.0.0: @@ -14616,14 +14586,14 @@ snapshots: co: 4.6.0 koa-compose: 4.1.0 - koa@2.16.0: + koa@2.16.1: dependencies: accepts: 1.3.8 cache-content-type: 1.0.1 content-disposition: 0.5.4 content-type: 1.0.5 cookies: 0.9.1 - debug: 4.4.0 + debug: 4.4.1 delegates: 1.0.0 depd: 2.0.0 destroy: 1.2.0 @@ -14632,7 +14602,7 @@ snapshots: fresh: 0.5.2 http-assert: 1.5.0 http-errors: 1.8.1 - is-generator-function: 1.0.10 + is-generator-function: 1.1.0 koa-compose: 4.1.0 koa-convert: 2.0.0 on-finished: 2.4.1 @@ -14673,7 +14643,7 @@ snapshots: prelude-ls: 1.1.2 type-check: 0.3.2 - libphonenumber-js@1.11.3: {} + libphonenumber-js@1.12.9: {} libsodium-sumo@0.7.15: {} @@ -14681,16 +14651,16 @@ snapshots: dependencies: libsodium-sumo: 0.7.15 - libsodium-wrappers@0.7.13: + libsodium-wrappers@0.7.15: dependencies: - libsodium: 0.7.13 + libsodium: 0.7.15 - libsodium@0.7.13: {} + libsodium@0.7.15: {} lighthouse-logger@1.4.2: dependencies: debug: 2.6.9 - marky: 1.2.5 + marky: 1.3.0 transitivePeerDependencies: - supports-color @@ -14733,13 +14703,6 @@ snapshots: lines-and-columns@1.2.4: {} - load-yaml-file@0.2.0: - dependencies: - graceful-fs: 4.2.11 - js-yaml: 3.14.1 - pify: 4.0.1 - strip-bom: 3.0.0 - locate-path@3.0.0: dependencies: p-locate: 3.0.0 @@ -14783,15 +14746,13 @@ snapshots: logkitty@0.7.1: dependencies: ansi-fragments: 0.2.1 - dayjs: 1.11.11 + dayjs: 1.11.13 yargs: 15.4.1 optional: true long@4.0.0: {} - long@5.2.3: {} - - long@5.3.1: {} + long@5.3.2: {} loose-envify@1.4.0: dependencies: @@ -14799,12 +14760,7 @@ snapshots: lowercase-keys@3.0.0: {} - lru-cache@10.2.2: {} - - lru-cache@4.1.5: - dependencies: - pseudomap: 1.0.2 - yallist: 2.1.2 + lru-cache@10.4.3: {} lru-cache@5.1.1: dependencies: @@ -14816,7 +14772,7 @@ snapshots: lru_map@0.4.1: {} - luxon@3.5.0: {} + luxon@3.6.1: {} make-dir@2.1.0: dependencies: @@ -14829,7 +14785,7 @@ snapshots: make-dir@4.0.0: dependencies: - semver: 7.6.2 + semver: 7.7.2 make-error@1.3.6: {} @@ -14837,11 +14793,7 @@ snapshots: dependencies: tmpl: 1.0.5 - map-obj@1.0.1: {} - - map-obj@4.3.0: {} - - marky@1.2.5: {} + marky@1.3.0: {} math-intrinsics@1.1.0: {} @@ -14869,20 +14821,6 @@ snapshots: memory-cache@0.2.0: {} - meow@6.1.1: - dependencies: - '@types/minimist': 1.2.5 - camelcase-keys: 6.2.2 - decamelize-keys: 1.1.1 - hard-rejection: 2.1.0 - minimist-options: 4.1.0 - normalize-package-data: 2.5.0 - read-pkg-up: 7.0.1 - redent: 3.0.0 - trim-newlines: 3.0.1 - type-fest: 0.13.1 - yargs-parser: 18.1.3 - merge-descriptors@1.0.3: {} merge-stream@2.0.0: {} @@ -14893,7 +14831,7 @@ snapshots: metro-babel-transformer@0.73.10: dependencies: - '@babel/core': 7.26.0 + '@babel/core': 7.27.4 hermes-parser: 0.8.0 metro-source-map: 0.73.10 nullthrows: 1.1.1 @@ -14901,9 +14839,9 @@ snapshots: - supports-color optional: true - metro-babel-transformer@0.81.4: + metro-babel-transformer@0.81.5: dependencies: - '@babel/core': 7.26.0 + '@babel/core': 7.27.4 flow-enums-runtime: 0.0.6 hermes-parser: 0.25.1 nullthrows: 1.1.1 @@ -14913,7 +14851,7 @@ snapshots: metro-cache-key@0.73.10: optional: true - metro-cache-key@0.81.4: + metro-cache-key@0.81.5: dependencies: flow-enums-runtime: 0.0.6 @@ -14923,11 +14861,11 @@ snapshots: rimraf: 3.0.2 optional: true - metro-cache@0.81.4: + metro-cache@0.81.5: dependencies: exponential-backoff: 3.1.2 flow-enums-runtime: 0.0.6 - metro-core: 0.81.4 + metro-core: 0.81.5 metro-config@0.73.10: dependencies: @@ -14944,16 +14882,16 @@ snapshots: - utf-8-validate optional: true - metro-config@0.81.4: + metro-config@0.81.5: dependencies: connect: 3.7.0 cosmiconfig: 5.2.1 flow-enums-runtime: 0.0.6 jest-validate: 29.7.0 - metro: 0.81.4 - metro-cache: 0.81.4 - metro-core: 0.81.4 - metro-runtime: 0.81.4 + metro: 0.81.5 + metro-cache: 0.81.5 + metro-core: 0.81.5 + metro-runtime: 0.81.5 transitivePeerDependencies: - bufferutil - supports-color @@ -14965,11 +14903,11 @@ snapshots: metro-resolver: 0.73.10 optional: true - metro-core@0.81.4: + metro-core@0.81.5: dependencies: flow-enums-runtime: 0.0.6 lodash.throttle: 4.1.1 - metro-resolver: 0.81.4 + metro-resolver: 0.81.5 metro-file-map@0.73.10: dependencies: @@ -14983,7 +14921,7 @@ snapshots: jest-serializer: 27.5.1 jest-util: 27.5.1 jest-worker: 27.5.1 - micromatch: 4.0.7 + micromatch: 4.0.8 nullthrows: 1.1.1 walker: 1.0.8 optionalDependencies: @@ -14992,7 +14930,7 @@ snapshots: - supports-color optional: true - metro-file-map@0.81.4: + metro-file-map@0.81.5: dependencies: debug: 2.6.9 fb-watchman: 2.0.2 @@ -15000,7 +14938,7 @@ snapshots: graceful-fs: 4.2.11 invariant: 2.2.4 jest-worker: 29.7.0 - micromatch: 4.0.7 + micromatch: 4.0.8 nullthrows: 1.1.1 walker: 1.0.8 transitivePeerDependencies: @@ -15023,70 +14961,70 @@ snapshots: metro-minify-terser@0.73.10: dependencies: - terser: 5.31.1 + terser: 5.42.0 optional: true - metro-minify-terser@0.81.4: + metro-minify-terser@0.81.5: dependencies: flow-enums-runtime: 0.0.6 - terser: 5.31.1 + terser: 5.42.0 metro-minify-uglify@0.73.10: dependencies: uglify-es: 3.3.9 optional: true - metro-react-native-babel-preset@0.73.10(@babel/core@7.26.0): - dependencies: - '@babel/core': 7.26.0 - '@babel/plugin-proposal-async-generator-functions': 7.20.7(@babel/core@7.26.0) - '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.26.0) - '@babel/plugin-proposal-export-default-from': 7.24.7(@babel/core@7.26.0) - '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.26.0) - '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.26.0) - '@babel/plugin-proposal-optional-catch-binding': 7.18.6(@babel/core@7.26.0) - '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.26.0) - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.26.0) - '@babel/plugin-syntax-export-default-from': 7.24.7(@babel/core@7.26.0) - '@babel/plugin-syntax-flow': 7.26.0(@babel/core@7.26.0) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.26.0) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.26.0) - '@babel/plugin-transform-arrow-functions': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-async-to-generator': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-block-scoping': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-classes': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-computed-properties': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-destructuring': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-flow-strip-types': 7.26.5(@babel/core@7.26.0) - '@babel/plugin-transform-function-name': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-literals': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-modules-commonjs': 7.26.3(@babel/core@7.26.0) - '@babel/plugin-transform-named-capturing-groups-regex': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-react-display-name': 7.24.7(@babel/core@7.26.0) - '@babel/plugin-transform-react-jsx': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-react-jsx-self': 7.24.7(@babel/core@7.26.0) - '@babel/plugin-transform-react-jsx-source': 7.24.7(@babel/core@7.26.0) - '@babel/plugin-transform-runtime': 7.24.7(@babel/core@7.26.0) - '@babel/plugin-transform-shorthand-properties': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-spread': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-sticky-regex': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-template-literals': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-typescript': 7.26.8(@babel/core@7.26.0) - '@babel/plugin-transform-unicode-regex': 7.25.9(@babel/core@7.26.0) - '@babel/template': 7.25.9 + metro-react-native-babel-preset@0.73.10(@babel/core@7.27.4): + dependencies: + '@babel/core': 7.27.4 + '@babel/plugin-proposal-async-generator-functions': 7.20.7(@babel/core@7.27.4) + '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.27.4) + '@babel/plugin-proposal-export-default-from': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.27.4) + '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.27.4) + '@babel/plugin-proposal-optional-catch-binding': 7.18.6(@babel/core@7.27.4) + '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.27.4) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.27.4) + '@babel/plugin-syntax-export-default-from': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-syntax-flow': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.27.4) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.27.4) + '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-async-to-generator': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-block-scoping': 7.27.5(@babel/core@7.27.4) + '@babel/plugin-transform-classes': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-computed-properties': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-destructuring': 7.27.3(@babel/core@7.27.4) + '@babel/plugin-transform-flow-strip-types': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-function-name': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-literals': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-named-capturing-groups-regex': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-parameters': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-react-display-name': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-runtime': 7.27.4(@babel/core@7.27.4) + '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-spread': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-sticky-regex': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-typescript': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.27.4) + '@babel/template': 7.27.2 react-refresh: 0.4.3 transitivePeerDependencies: - supports-color optional: true - metro-react-native-babel-transformer@0.73.10(@babel/core@7.26.0): + metro-react-native-babel-transformer@0.73.10(@babel/core@7.27.4): dependencies: - '@babel/core': 7.26.0 - babel-preset-fbjs: 3.4.0(@babel/core@7.26.0) + '@babel/core': 7.27.4 + babel-preset-fbjs: 3.4.0(@babel/core@7.27.4) hermes-parser: 0.8.0 metro-babel-transformer: 0.73.10 - metro-react-native-babel-preset: 0.73.10(@babel/core@7.26.0) + metro-react-native-babel-preset: 0.73.10(@babel/core@7.27.4) metro-source-map: 0.73.10 nullthrows: 1.1.1 transitivePeerDependencies: @@ -15098,25 +15036,25 @@ snapshots: absolute-path: 0.0.0 optional: true - metro-resolver@0.81.4: + metro-resolver@0.81.5: dependencies: flow-enums-runtime: 0.0.6 metro-runtime@0.73.10: dependencies: - '@babel/runtime': 7.26.10 + '@babel/runtime': 7.27.6 react-refresh: 0.4.3 optional: true - metro-runtime@0.81.4: + metro-runtime@0.81.5: dependencies: - '@babel/runtime': 7.26.10 + '@babel/runtime': 7.27.6 flow-enums-runtime: 0.0.6 metro-source-map@0.73.10: dependencies: - '@babel/traverse': 7.26.4 - '@babel/types': 7.26.3 + '@babel/traverse': 7.27.4 + '@babel/types': 7.27.6 invariant: 2.2.4 metro-symbolicate: 0.73.10 nullthrows: 1.1.1 @@ -15127,16 +15065,16 @@ snapshots: - supports-color optional: true - metro-source-map@0.81.4: + metro-source-map@0.81.5: dependencies: - '@babel/traverse': 7.26.4 - '@babel/traverse--for-generate-function-map': '@babel/traverse@7.26.4' - '@babel/types': 7.26.3 + '@babel/traverse': 7.27.4 + '@babel/traverse--for-generate-function-map': '@babel/traverse@7.27.4' + '@babel/types': 7.27.6 flow-enums-runtime: 0.0.6 invariant: 2.2.4 - metro-symbolicate: 0.81.4 + metro-symbolicate: 0.81.5 nullthrows: 1.1.1 - ob1: 0.81.4 + ob1: 0.81.5 source-map: 0.5.7 vlq: 1.0.1 transitivePeerDependencies: @@ -15154,11 +15092,11 @@ snapshots: - supports-color optional: true - metro-symbolicate@0.81.4: + metro-symbolicate@0.81.5: dependencies: flow-enums-runtime: 0.0.6 invariant: 2.2.4 - metro-source-map: 0.81.4 + metro-source-map: 0.81.5 nullthrows: 1.1.1 source-map: 0.5.7 vlq: 1.0.1 @@ -15167,21 +15105,21 @@ snapshots: metro-transform-plugins@0.73.10: dependencies: - '@babel/core': 7.26.0 - '@babel/generator': 7.26.3 - '@babel/template': 7.25.9 - '@babel/traverse': 7.26.4 + '@babel/core': 7.27.4 + '@babel/generator': 7.27.5 + '@babel/template': 7.27.2 + '@babel/traverse': 7.27.4 nullthrows: 1.1.1 transitivePeerDependencies: - supports-color optional: true - metro-transform-plugins@0.81.4: + metro-transform-plugins@0.81.5: dependencies: - '@babel/core': 7.26.0 - '@babel/generator': 7.26.3 - '@babel/template': 7.25.9 - '@babel/traverse': 7.26.4 + '@babel/core': 7.27.4 + '@babel/generator': 7.27.5 + '@babel/template': 7.27.2 + '@babel/traverse': 7.27.4 flow-enums-runtime: 0.0.6 nullthrows: 1.1.1 transitivePeerDependencies: @@ -15189,11 +15127,11 @@ snapshots: metro-transform-worker@0.73.10: dependencies: - '@babel/core': 7.26.0 - '@babel/generator': 7.26.3 - '@babel/parser': 7.26.3 - '@babel/types': 7.26.3 - babel-preset-fbjs: 3.4.0(@babel/core@7.26.0) + '@babel/core': 7.27.4 + '@babel/generator': 7.27.5 + '@babel/parser': 7.27.5 + '@babel/types': 7.27.6 + babel-preset-fbjs: 3.4.0(@babel/core@7.27.4) metro: 0.73.10 metro-babel-transformer: 0.73.10 metro-cache: 0.73.10 @@ -15209,20 +15147,20 @@ snapshots: - utf-8-validate optional: true - metro-transform-worker@0.81.4: + metro-transform-worker@0.81.5: dependencies: - '@babel/core': 7.26.0 - '@babel/generator': 7.26.3 - '@babel/parser': 7.26.3 - '@babel/types': 7.26.3 + '@babel/core': 7.27.4 + '@babel/generator': 7.27.5 + '@babel/parser': 7.27.5 + '@babel/types': 7.27.6 flow-enums-runtime: 0.0.6 - metro: 0.81.4 - metro-babel-transformer: 0.81.4 - metro-cache: 0.81.4 - metro-cache-key: 0.81.4 - metro-minify-terser: 0.81.4 - metro-source-map: 0.81.4 - metro-transform-plugins: 0.81.4 + metro: 0.81.5 + metro-babel-transformer: 0.81.5 + metro-cache: 0.81.5 + metro-cache-key: 0.81.5 + metro-minify-terser: 0.81.5 + metro-source-map: 0.81.5 + metro-transform-plugins: 0.81.5 nullthrows: 1.1.1 transitivePeerDependencies: - bufferutil @@ -15231,16 +15169,16 @@ snapshots: metro@0.73.10: dependencies: - '@babel/code-frame': 7.26.2 - '@babel/core': 7.26.0 - '@babel/generator': 7.26.3 - '@babel/parser': 7.26.3 - '@babel/template': 7.25.9 - '@babel/traverse': 7.26.4 - '@babel/types': 7.26.3 + '@babel/code-frame': 7.27.1 + '@babel/core': 7.27.4 + '@babel/generator': 7.27.5 + '@babel/parser': 7.27.5 + '@babel/template': 7.27.2 + '@babel/traverse': 7.27.4 + '@babel/types': 7.27.6 absolute-path: 0.0.0 accepts: 1.3.8 - async: 3.2.5 + async: 3.2.6 chalk: 4.1.2 ci-info: 2.0.0 connect: 3.7.0 @@ -15264,7 +15202,7 @@ snapshots: metro-inspector-proxy: 0.73.10 metro-minify-terser: 0.73.10 metro-minify-uglify: 0.73.10 - metro-react-native-babel-preset: 0.73.10(@babel/core@7.26.0) + metro-react-native-babel-preset: 0.73.10(@babel/core@7.27.4) metro-resolver: 0.73.10 metro-runtime: 0.73.10 metro-source-map: 0.73.10 @@ -15289,15 +15227,15 @@ snapshots: - utf-8-validate optional: true - metro@0.81.4: + metro@0.81.5: dependencies: - '@babel/code-frame': 7.26.2 - '@babel/core': 7.26.0 - '@babel/generator': 7.26.3 - '@babel/parser': 7.26.3 - '@babel/template': 7.25.9 - '@babel/traverse': 7.26.4 - '@babel/types': 7.26.3 + '@babel/code-frame': 7.27.1 + '@babel/core': 7.27.4 + '@babel/generator': 7.27.5 + '@babel/parser': 7.27.5 + '@babel/template': 7.27.2 + '@babel/traverse': 7.27.4 + '@babel/types': 7.27.6 accepts: 1.3.8 chalk: 4.1.2 ci-info: 2.0.0 @@ -15307,23 +15245,23 @@ snapshots: flow-enums-runtime: 0.0.6 graceful-fs: 4.2.11 hermes-parser: 0.25.1 - image-size: 1.2.0 + image-size: 1.2.1 invariant: 2.2.4 jest-worker: 29.7.0 jsc-safe-url: 0.2.4 lodash.throttle: 4.1.1 - metro-babel-transformer: 0.81.4 - metro-cache: 0.81.4 - metro-cache-key: 0.81.4 - metro-config: 0.81.4 - metro-core: 0.81.4 - metro-file-map: 0.81.4 - metro-resolver: 0.81.4 - metro-runtime: 0.81.4 - metro-source-map: 0.81.4 - metro-symbolicate: 0.81.4 - metro-transform-plugins: 0.81.4 - metro-transform-worker: 0.81.4 + metro-babel-transformer: 0.81.5 + metro-cache: 0.81.5 + metro-cache-key: 0.81.5 + metro-config: 0.81.5 + metro-core: 0.81.5 + metro-file-map: 0.81.5 + metro-resolver: 0.81.5 + metro-runtime: 0.81.5 + metro-source-map: 0.81.5 + metro-symbolicate: 0.81.5 + metro-transform-plugins: 0.81.5 + metro-transform-worker: 0.81.5 mime-types: 2.1.35 nullthrows: 1.1.1 serialize-error: 2.1.0 @@ -15336,13 +15274,16 @@ snapshots: - supports-color - utf-8-validate - micromatch@4.0.7: + micromatch@4.0.8: dependencies: braces: 3.0.3 picomatch: 2.3.1 mime-db@1.52.0: {} + mime-db@1.54.0: + optional: true + mime-types@2.1.35: dependencies: mime-db: 1.52.0 @@ -15359,8 +15300,6 @@ snapshots: mimic-response@4.0.0: {} - min-indent@1.0.1: {} - minimalistic-assert@1.0.1: {} minimalistic-crypto-utils@1.0.1: {} @@ -15369,19 +15308,17 @@ snapshots: dependencies: brace-expansion: 1.1.11 - minimatch@8.0.4: + minimatch@5.1.6: dependencies: brace-expansion: 2.0.1 - minimatch@9.0.4: + minimatch@8.0.4: dependencies: brace-expansion: 2.0.1 - minimist-options@4.1.0: + minimatch@9.0.5: dependencies: - arrify: 1.0.1 - is-plain-obj: 1.1.0 - kind-of: 6.0.3 + brace-expansion: 2.0.1 minimist@1.2.8: {} @@ -15412,12 +15349,9 @@ snapshots: minipass: 3.3.6 yallist: 4.0.0 - minizlib@3.0.1: + minizlib@3.0.2: dependencies: minipass: 7.1.2 - rimraf: 5.0.10 - - mixme@0.5.10: {} mkdirp-classic@0.5.3: {} @@ -15429,13 +15363,15 @@ snapshots: mkdirp@3.0.1: {} + mri@1.2.0: {} + ms@2.0.0: {} ms@2.1.3: {} msrcrypto@1.5.8: {} - multer@1.4.5-lts.1: + multer@1.4.5-lts.2: dependencies: append-field: 1.0.0 busboy: 1.6.0 @@ -15449,38 +15385,31 @@ snapshots: dependencies: '@multiformats/base-x': 4.0.1 - multiformats@13.3.2: {} + multiformats@13.3.7: {} multiformats@9.9.0: {} mute-stream@0.0.8: {} - mv@2.1.1: - dependencies: - mkdirp: 0.5.6 - ncp: 2.0.0 - rimraf: 2.4.5 - optional: true - mz@2.7.0: dependencies: any-promise: 1.3.0 object-assign: 4.1.1 thenify-all: 1.6.0 - nanoid@3.3.7: {} + nanoid@3.3.11: {} - nanoid@5.0.9: {} + nanoid@5.1.5: {} napi-build-utils@2.0.0: {} natural-compare@1.4.0: {} - ncp@2.0.0: - optional: true - negotiator@0.6.3: {} + negotiator@0.6.4: + optional: true + neo-async@2.6.2: {} nested-error-stacks@2.0.1: {} @@ -15492,15 +15421,15 @@ snapshots: nocache@3.0.4: optional: true - nock@14.0.0-beta.19: + nock@14.0.5: dependencies: - '@mswjs/interceptors': 0.37.5 + '@mswjs/interceptors': 0.38.7 json-stringify-safe: 5.0.1 propagate: 2.0.1 node-abi@3.75.0: dependencies: - semver: 7.6.2 + semver: 7.7.2 node-addon-api@3.2.1: {} @@ -15533,11 +15462,11 @@ snapshots: node-forge@1.3.1: {} - node-gyp-build@4.8.1: {} + node-gyp-build@4.8.4: {} node-int64@0.4.0: {} - node-releases@2.0.18: {} + node-releases@2.0.19: {} node-stream-zip@1.15.0: optional: true @@ -15546,16 +15475,16 @@ snapshots: dependencies: abbrev: 1.1.1 - normalize-package-data@2.5.0: - dependencies: - hosted-git-info: 2.8.9 - resolve: 1.22.8 - semver: 5.7.2 - validate-npm-package-license: 3.0.4 - normalize-path@3.0.0: {} - normalize-url@8.0.1: {} + normalize-url@8.0.2: {} + + npm-package-arg@11.0.3: + dependencies: + hosted-git-info: 7.0.2 + proc-log: 4.2.0 + semver: 7.7.2 + validate-npm-package-name: 5.0.1 npm-package-arg@7.0.0: dependencies: @@ -15584,7 +15513,7 @@ snapshots: ob1@0.73.10: optional: true - ob1@0.81.4: + ob1@0.81.5: dependencies: flow-enums-runtime: 0.0.6 @@ -15592,36 +15521,38 @@ snapshots: object-hash@3.0.0: {} - object-inspect@1.13.1: {} + object-inspect@1.13.4: {} object-keys@1.1.1: {} - object.assign@4.1.5: + object.assign@4.1.7: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 define-properties: 1.2.1 - has-symbols: 1.0.3 + es-object-atoms: 1.1.1 + has-symbols: 1.1.0 object-keys: 1.1.1 oidc-provider@8.8.1: dependencies: '@koa/cors': 5.0.0 '@koa/router': 13.1.0 - debug: 4.4.0 + debug: 4.4.1 eta: 3.5.0 got: 13.0.0 - jose: 5.9.6 + jose: 5.10.0 jsesc: 3.1.0 - koa: 2.16.0 - nanoid: 5.0.9 + koa: 2.16.1 + nanoid: 5.1.5 object-hash: 3.0.0 - oidc-token-hash: 5.0.3 - quick-lru: 7.0.0 + oidc-token-hash: 5.1.0 + quick-lru: 7.0.1 raw-body: 3.0.0 transitivePeerDependencies: - supports-color - oidc-token-hash@5.0.3: {} + oidc-token-hash@5.1.0: {} on-exit-leak-free@2.1.2: {} @@ -15709,6 +15640,12 @@ snapshots: outvariant@1.4.3: {} + own-keys@1.0.1: + dependencies: + get-intrinsic: 1.3.0 + object-keys: 1.1.1 + safe-push-apply: 1.0.0 + p-cancelable@3.0.0: {} p-filter@2.1.0: @@ -15745,7 +15682,11 @@ snapshots: p-try@2.2.0: {} - package-json-from-dist@1.0.0: {} + package-json-from-dist@1.0.1: {} + + package-manager-detector@0.2.11: + dependencies: + quansync: 0.2.10 pako@2.1.0: {} @@ -15756,7 +15697,7 @@ snapshots: parse-json@5.2.0: dependencies: - '@babel/code-frame': 7.26.2 + '@babel/code-frame': 7.27.1 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -15767,11 +15708,6 @@ snapshots: parseurl@1.3.3: {} - password-prompt@1.1.3: - dependencies: - ansi-escapes: 4.3.2 - cross-spawn: 7.0.3 - path-exists@3.0.0: {} path-exists@4.0.0: {} @@ -15786,7 +15722,7 @@ snapshots: path-scurry@1.11.1: dependencies: - lru-cache: 10.2.2 + lru-cache: 10.4.3 minipass: 7.1.2 path-to-regexp@0.1.12: {} @@ -15797,14 +15733,14 @@ snapshots: peek-readable@4.1.0: {} - peek-readable@7.0.0: {} - picocolors@1.1.1: {} picomatch@2.3.1: {} picomatch@3.0.1: {} + picomatch@4.0.2: {} + pify@4.0.1: {} pino-abstract-transport@2.0.0: @@ -15822,7 +15758,7 @@ snapshots: minimist: 1.2.8 on-exit-leak-free: 2.1.2 pino-abstract-transport: 2.0.0 - pump: 3.0.0 + pump: 3.0.2 secure-json-parse: 2.7.0 sonic-boom: 4.2.0 strip-json-comments: 3.1.1 @@ -15843,7 +15779,7 @@ snapshots: sonic-boom: 4.2.0 thread-stream: 3.1.0 - pirates@4.0.6: {} + pirates@4.0.7: {} pkg-dir@3.0.0: dependencies: @@ -15861,36 +15797,29 @@ snapshots: pngjs@3.4.0: {} - possible-typed-array-names@1.0.0: {} + possible-typed-array-names@1.1.0: {} - postcss@8.4.38: + postcss@8.4.49: dependencies: - nanoid: 3.3.7 + nanoid: 3.3.11 picocolors: 1.1.1 - source-map-js: 1.2.0 + source-map-js: 1.2.1 prebuild-install@7.1.3: dependencies: - detect-libc: 2.0.3 + detect-libc: 2.0.4 expand-template: 2.0.3 github-from-package: 0.0.0 minimist: 1.2.8 mkdirp-classic: 0.5.3 napi-build-utils: 2.0.0 node-abi: 3.75.0 - pump: 3.0.0 + pump: 3.0.2 rc: 1.2.8 simple-get: 4.0.1 tar-fs: 2.1.3 tunnel-agent: 0.6.0 - preferred-pm@3.1.3: - dependencies: - find-up: 5.0.0 - find-yarn-workspace-root2: 1.2.16 - path-exists: 4.0.0 - which-pm: 2.0.0 - prelude-ls@1.1.2: {} prettier@2.8.8: {} @@ -15918,6 +15847,8 @@ snapshots: ansi-styles: 5.2.0 react-is: 18.3.1 + proc-log@4.2.0: {} + process-nextick-args@2.0.1: {} process-warning@5.0.0: {} @@ -15939,12 +15870,6 @@ snapshots: kleur: 3.0.3 sisteransi: 1.0.5 - prop-types@15.8.1: - dependencies: - loose-envify: 1.4.0 - object-assign: 4.1.1 - react-is: 16.13.1 - propagate@2.0.1: {} protobufjs@6.11.4: @@ -15976,9 +15901,9 @@ snapshots: '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 '@types/node': 18.18.8 - long: 5.3.1 + long: 5.3.2 - protobufjs@7.4.0: + protobufjs@7.5.3: dependencies: '@protobufjs/aspromise': 1.1.2 '@protobufjs/base64': 1.1.2 @@ -15991,7 +15916,7 @@ snapshots: '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 '@types/node': 18.18.8 - long: 5.2.3 + long: 5.3.2 proxy-addr@2.0.7: dependencies: @@ -16000,9 +15925,7 @@ snapshots: proxy-from-env@1.1.0: {} - pseudomap@1.0.2: {} - - pump@3.0.0: + pump@3.0.2: dependencies: end-of-stream: 1.4.4 once: 1.4.0 @@ -16011,10 +15934,6 @@ snapshots: pure-rand@6.1.0: {} - pvtsutils@1.3.5: - dependencies: - tslib: 2.8.1 - pvtsutils@1.3.6: dependencies: tslib: 2.8.1 @@ -16023,13 +15942,15 @@ snapshots: qrcode-terminal@0.11.0: {} - qs@6.12.1: + qs@6.13.0: dependencies: - side-channel: 1.0.6 + side-channel: 1.1.0 - qs@6.13.0: + qs@6.14.0: dependencies: - side-channel: 1.0.6 + side-channel: 1.1.0 + + quansync@0.2.10: {} query-string@7.1.3: dependencies: @@ -16046,11 +15967,9 @@ snapshots: quick-format-unescaped@4.0.4: {} - quick-lru@4.0.1: {} - quick-lru@5.1.1: {} - quick-lru@7.0.0: {} + quick-lru@7.0.1: {} range-parser@1.2.1: {} @@ -16079,9 +15998,13 @@ snapshots: dependencies: setimmediate: 1.0.5 - react-devtools-core@6.1.1: + rdf-canonize@4.0.1: + dependencies: + setimmediate: 1.0.5 + + react-devtools-core@6.1.2: dependencies: - shell-quote: 1.8.1 + shell-quote: 1.8.3 ws: 7.5.10 transitivePeerDependencies: - bufferutil @@ -16094,25 +16017,25 @@ snapshots: react-is@18.3.1: {} - react-native-fs@2.20.0(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1)): + react-native-fs@2.20.0(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)): dependencies: base-64: 0.1.0 - react-native: 0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1) + react-native: 0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1) utf8: 3.0.0 - react-native-get-random-values@1.11.0(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1)): + react-native-get-random-values@1.11.0(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)): dependencies: fast-base64-decode: 1.0.0 - react-native: 0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1) + react-native: 0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1) - react-native-quick-base64@2.2.0(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1))(react@18.3.1): + react-native-quick-base64@2.2.0(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1): dependencies: react: 18.3.1 - react-native: 0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1) + react-native: 0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1) - react-native-quick-crypto@0.7.14(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1))(react@18.3.1): + react-native-quick-crypto@0.7.14(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1): dependencies: - '@craftzdog/react-native-buffer': 6.1.0(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1))(react@18.3.1) + '@craftzdog/react-native-buffer': 6.1.0(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) events: 3.3.0 readable-stream: 4.7.0 string_decoder: 1.3.0 @@ -16121,31 +16044,31 @@ snapshots: - react - react-native - react-native-securerandom@0.1.1(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1)): + react-native-securerandom@0.1.1(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)): dependencies: base64-js: 1.5.1 - react-native: 0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1) + react-native: 0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1) optional: true - react-native-zstd@1.1.0(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1))(react@18.3.1): + react-native-zstd@1.1.0(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1): dependencies: react: 18.3.1 - react-native: 0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1) + react-native: 0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1) - react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1): + react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1): dependencies: '@jest/create-cache-key-function': 29.7.0 - '@react-native/assets-registry': 0.78.1 - '@react-native/codegen': 0.78.1(@babel/preset-env@7.26.0(@babel/core@7.26.0)) - '@react-native/community-cli-plugin': 0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0)) - '@react-native/gradle-plugin': 0.78.1 - '@react-native/js-polyfills': 0.78.1 - '@react-native/normalize-colors': 0.78.1 - '@react-native/virtualized-lists': 0.78.1(react-native@0.78.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli@10.2.7(@babel/core@7.26.0))(react@18.3.1))(react@18.3.1) + '@react-native/assets-registry': 0.78.2 + '@react-native/codegen': 0.78.2(@babel/preset-env@7.27.2(@babel/core@7.27.4)) + '@react-native/community-cli-plugin': 0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4)) + '@react-native/gradle-plugin': 0.78.2 + '@react-native/js-polyfills': 0.78.2 + '@react-native/normalize-colors': 0.78.2 + '@react-native/virtualized-lists': 0.78.2(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) abort-controller: 3.0.0 anser: 1.4.10 ansi-regex: 5.0.1 - babel-jest: 29.7.0(@babel/core@7.26.0) + babel-jest: 29.7.0(@babel/core@7.27.4) babel-plugin-syntax-hermes-parser: 0.25.1 base64-js: 1.5.1 chalk: 4.1.2 @@ -16156,18 +16079,18 @@ snapshots: invariant: 2.2.4 jest-environment-node: 29.7.0 memoize-one: 5.2.1 - metro-runtime: 0.81.4 - metro-source-map: 0.81.4 + metro-runtime: 0.81.5 + metro-source-map: 0.81.5 nullthrows: 1.1.1 pretty-format: 29.7.0 promise: 8.3.0 react: 18.3.1 - react-devtools-core: 6.1.1 + react-devtools-core: 6.1.2 react-refresh: 0.14.2 regenerator-runtime: 0.13.11 scheduler: 0.25.0 - semver: 7.6.2 - stacktrace-parser: 0.1.10 + semver: 7.7.2 + stacktrace-parser: 0.1.11 whatwg-fetch: 3.6.20 ws: 6.2.3 yargs: 17.7.2 @@ -16188,19 +16111,6 @@ snapshots: dependencies: loose-envify: 1.4.0 - read-pkg-up@7.0.1: - dependencies: - find-up: 4.1.0 - read-pkg: 5.2.0 - type-fest: 0.8.1 - - read-pkg@5.2.0: - dependencies: - '@types/normalize-package-data': 2.4.4 - normalize-package-data: 2.5.0 - parse-json: 5.2.0 - type-fest: 0.6.0 - read-yaml-file@1.1.0: dependencies: graceful-fs: 4.2.11 @@ -16232,9 +16142,9 @@ snapshots: process: 0.11.10 string_decoder: 1.3.0 - readable-web-to-node-stream@3.0.2: + readable-web-to-node-stream@3.0.4: dependencies: - readable-stream: 3.6.2 + readable-stream: 4.7.0 readline@1.3.0: {} @@ -16257,11 +16167,6 @@ snapshots: tiny-invariant: 1.3.3 tslib: 2.8.1 - redent@3.0.0: - dependencies: - indent-string: 4.0.0 - strip-indent: 3.0.0 - redis-errors@1.2.0: {} redis-parser@3.0.0: @@ -16285,6 +16190,17 @@ snapshots: reflect-metadata@0.2.2: {} + reflect.getprototypeof@1.0.10: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + which-builtin-type: 1.2.1 + regenerate-unicode-properties@10.2.0: dependencies: regenerate: 1.4.2 @@ -16293,17 +16209,13 @@ snapshots: regenerator-runtime@0.13.11: {} - regenerator-runtime@0.14.1: {} - - regenerator-transform@0.15.2: + regexp.prototype.flags@1.5.4: dependencies: - '@babel/runtime': 7.24.7 - - regexp.prototype.flags@1.5.2: - dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 es-errors: 1.3.0 + get-proto: 1.0.1 + gopd: 1.2.0 set-function-name: 2.0.2 regexpu-core@6.2.0: @@ -16313,7 +16225,7 @@ snapshots: regjsgen: 0.8.0 regjsparser: 0.12.0 unicode-match-property-ecmascript: 2.0.0 - unicode-match-property-value-ecmascript: 2.1.0 + unicode-match-property-value-ecmascript: 2.2.0 regjsgen@0.8.0: {} @@ -16327,7 +16239,8 @@ snapshots: require-from-string@2.0.2: {} - require-main-filename@2.0.0: {} + require-main-filename@2.0.0: + optional: true requireg@0.2.2: dependencies: @@ -16347,11 +16260,13 @@ snapshots: resolve-pkg-maps@1.0.0: {} - resolve.exports@2.0.2: {} + resolve-workspace-root@2.0.0: {} - resolve@1.22.8: + resolve.exports@2.0.3: {} + + resolve@1.22.10: dependencies: - is-core-module: 2.13.1 + is-core-module: 2.16.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 @@ -16373,26 +16288,17 @@ snapshots: onetime: 5.1.2 signal-exit: 3.0.7 - reusify@1.0.4: {} + reusify@1.1.0: {} rfc4648@1.5.4: {} rimraf@2.2.8: optional: true - rimraf@2.4.5: - dependencies: - glob: 6.0.4 - optional: true - rimraf@2.6.3: dependencies: glob: 7.2.3 - rimraf@2.7.1: - dependencies: - glob: 7.2.3 - rimraf@3.0.2: dependencies: glob: 7.2.3 @@ -16401,39 +16307,38 @@ snapshots: dependencies: glob: 9.3.5 - rimraf@5.0.10: - dependencies: - glob: 10.4.2 - run-async@2.4.1: {} run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 - rxjs@7.8.1: + rxjs@7.8.2: dependencies: tslib: 2.8.1 - safe-array-concat@1.1.2: + safe-array-concat@1.1.3: dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 - has-symbols: 1.0.3 + call-bind: 1.0.8 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + has-symbols: 1.1.0 isarray: 2.0.5 safe-buffer@5.1.2: {} safe-buffer@5.2.1: {} - safe-json-stringify@1.2.0: - optional: true + safe-push-apply@1.0.0: + dependencies: + es-errors: 1.3.0 + isarray: 2.0.5 - safe-regex-test@1.0.3: + safe-regex-test@1.1.0: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.4 es-errors: 1.3.0 - is-regex: 1.1.4 + is-regex: 1.2.1 safe-stable-stringify@2.5.0: {} @@ -16447,7 +16352,7 @@ snapshots: dependencies: elliptic: 6.6.1 node-addon-api: 5.1.0 - node-gyp-build: 4.8.1 + node-gyp-build: 4.8.4 secure-json-parse@2.7.0: {} @@ -16460,7 +16365,7 @@ snapshots: semver@6.3.1: {} - semver@7.6.2: {} + semver@7.7.2: {} send@0.18.0: dependencies: @@ -16520,8 +16425,8 @@ snapshots: define-data-property: 1.1.4 es-errors: 1.3.0 function-bind: 1.1.2 - get-intrinsic: 1.2.4 - gopd: 1.0.1 + get-intrinsic: 1.3.0 + gopd: 1.2.0 has-property-descriptors: 1.0.2 set-function-name@2.0.2: @@ -16531,6 +16436,12 @@ snapshots: functions-have-names: 1.2.3 has-property-descriptors: 1.0.2 + set-proto@1.0.0: + dependencies: + dunder-proto: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + setimmediate@1.0.5: {} setprototypeof@1.2.0: {} @@ -16551,14 +16462,35 @@ snapshots: shebang-regex@3.0.0: {} - shell-quote@1.8.1: {} + shell-quote@1.8.3: {} + + side-channel-list@1.0.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 - side-channel@1.0.6: + side-channel@1.1.0: dependencies: - call-bind: 1.0.7 es-errors: 1.3.0 - get-intrinsic: 1.2.4 - object-inspect: 1.13.1 + object-inspect: 1.13.4 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 signal-exit@3.0.7: {} @@ -16591,20 +16523,11 @@ snapshots: slugify@1.6.6: {} - smartwrap@2.0.2: - dependencies: - array.prototype.flat: 1.3.2 - breakword: 1.0.6 - grapheme-splitter: 1.0.4 - strip-ansi: 6.0.1 - wcwidth: 1.0.1 - yargs: 15.4.1 - sonic-boom@4.2.0: dependencies: atomic-sleep: 1.0.0 - source-map-js@1.2.0: {} + source-map-js@1.2.1: {} source-map-support@0.5.13: dependencies: @@ -16625,33 +16548,15 @@ snapshots: spark-md5@3.0.2: {} - spawndamnit@2.0.0: + spawndamnit@3.0.1: dependencies: - cross-spawn: 5.1.0 - signal-exit: 3.0.7 - - spdx-correct@3.2.0: - dependencies: - spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.18 - - spdx-exceptions@2.5.0: {} - - spdx-expression-parse@3.0.1: - dependencies: - spdx-exceptions: 2.5.0 - spdx-license-ids: 3.0.18 - - spdx-license-ids@3.0.18: {} + cross-spawn: 7.0.6 + signal-exit: 4.1.0 split-on-first@1.1.0: {} split2@4.2.0: {} - split@1.0.1: - dependencies: - through: 2.3.8 - sprintf-js@1.0.3: {} ssri@10.0.6: @@ -16664,7 +16569,7 @@ snapshots: stackframe@1.3.4: {} - stacktrace-parser@0.1.10: + stacktrace-parser@0.1.11: dependencies: type-fest: 0.7.1 @@ -16678,14 +16583,15 @@ snapshots: statuses@2.0.1: {} + stop-iteration-iterator@1.1.0: + dependencies: + es-errors: 1.3.0 + internal-slot: 1.1.0 + str2buf@1.3.0: {} stream-buffers@2.2.0: {} - stream-transform@2.1.3: - dependencies: - mixme: 0.5.10 - streamsearch@1.1.0: {} strict-event-emitter@0.5.1: {} @@ -16709,24 +16615,28 @@ snapshots: emoji-regex: 9.2.2 strip-ansi: 7.1.0 - string.prototype.trim@1.2.9: + string.prototype.trim@1.2.10: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 + define-data-property: 1.1.4 define-properties: 1.2.1 - es-abstract: 1.23.3 - es-object-atoms: 1.0.0 + es-abstract: 1.24.0 + es-object-atoms: 1.1.1 + has-property-descriptors: 1.0.2 - string.prototype.trimend@1.0.8: + string.prototype.trimend@1.0.9: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 define-properties: 1.2.1 - es-object-atoms: 1.0.0 + es-object-atoms: 1.1.1 string.prototype.trimstart@1.0.8: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-object-atoms: 1.0.0 + es-object-atoms: 1.1.1 string_decoder@1.1.1: dependencies: @@ -16746,7 +16656,7 @@ snapshots: strip-ansi@7.1.0: dependencies: - ansi-regex: 6.0.1 + ansi-regex: 6.1.0 strip-bom@3.0.0: {} @@ -16756,21 +16666,16 @@ snapshots: strip-final-newline@2.0.0: {} - strip-indent@3.0.0: - dependencies: - min-indent: 1.0.1 - strip-json-comments@2.0.1: {} strip-json-comments@3.1.1: {} - strnum@1.0.5: + strnum@1.1.2: optional: true - strtok3@10.2.2: + strtok3@10.3.1: dependencies: '@tokenizer/token': 0.3.0 - peek-readable: 7.0.0 strtok3@6.3.0: dependencies: @@ -16781,39 +16686,35 @@ snapshots: sucrase@3.34.0: dependencies: - '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/gen-mapping': 0.3.8 commander: 4.1.1 glob: 7.1.6 lines-and-columns: 1.2.4 mz: 2.7.0 - pirates: 4.0.6 + pirates: 4.0.7 ts-interface-checker: 0.1.13 - sudo-prompt@8.2.5: {} - - sudo-prompt@9.1.1: {} - sudo-prompt@9.2.1: optional: true - superagent@9.0.2: + superagent@10.2.1: dependencies: component-emitter: 1.3.1 cookiejar: 2.1.4 - debug: 4.4.0 + debug: 4.4.1 fast-safe-stringify: 2.1.1 - form-data: 4.0.0 - formidable: 3.5.2 + form-data: 4.0.3 + formidable: 3.5.4 methods: 1.1.2 mime: 2.6.0 - qs: 6.12.1 + qs: 6.14.0 transitivePeerDependencies: - supports-color - supertest@7.0.0: + supertest@7.1.1: dependencies: methods: 1.1.2 - superagent: 9.0.2 + superagent: 10.2.1 transitivePeerDependencies: - supports-color @@ -16842,7 +16743,7 @@ snapshots: dependencies: chownr: 1.1.4 mkdirp-classic: 0.5.3 - pump: 3.0.0 + pump: 3.0.2 tar-stream: 2.2.0 tar-stream@2.2.0: @@ -16867,7 +16768,7 @@ snapshots: '@isaacs/fs-minipass': 4.0.1 chownr: 3.0.0 minipass: 7.1.2 - minizlib: 3.0.1 + minizlib: 3.0.2 mkdirp: 3.0.1 yallist: 5.0.0 @@ -16906,10 +16807,10 @@ snapshots: ansi-escapes: 4.3.2 supports-hyperlinks: 2.3.0 - terser@5.31.1: + terser@5.42.0: dependencies: '@jridgewell/source-map': 0.3.6 - acorn: 8.12.0 + acorn: 8.15.0 commander: 2.20.3 source-map-support: 0.5.21 @@ -16971,35 +16872,35 @@ snapshots: tr46@0.0.3: {} - traverse@0.6.9: + traverse@0.6.11: dependencies: gopd: 1.2.0 - typedarray.prototype.slice: 1.0.3 - which-typed-array: 1.1.15 - - trim-newlines@3.0.1: {} + typedarray.prototype.slice: 1.0.5 + which-typed-array: 1.1.19 trim-right@1.0.1: {} ts-interface-checker@0.1.13: {} - ts-jest@29.1.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@18.18.8)(ts-node@10.9.2(@types/node@18.18.8)(typescript@5.5.4)))(typescript@5.5.4): + ts-jest@29.3.4(@babel/core@7.27.4)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@30.0.0(@babel/core@7.27.4))(jest@29.7.0(@types/node@18.18.8)(ts-node@10.9.2(@types/node@18.18.8)(typescript@5.5.4)))(typescript@5.5.4): dependencies: bs-logger: 0.2.6 + ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 jest: 29.7.0(@types/node@18.18.8)(ts-node@10.9.2(@types/node@18.18.8)(typescript@5.5.4)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 make-error: 1.3.6 - semver: 7.6.2 + semver: 7.7.2 + type-fest: 4.41.0 typescript: 5.5.4 yargs-parser: 21.1.1 optionalDependencies: - '@babel/core': 7.26.0 + '@babel/core': 7.27.4 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.26.0) + babel-jest: 30.0.0(@babel/core@7.27.4) ts-node@10.9.2(@types/node@18.18.8)(typescript@5.5.4): dependencies: @@ -17009,8 +16910,8 @@ snapshots: '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 '@types/node': 18.18.8 - acorn: 8.12.0 - acorn-walk: 8.3.3 + acorn: 8.15.0 + acorn-walk: 8.3.4 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 @@ -17027,27 +16928,17 @@ snapshots: tsscmp@1.0.6: {} - tsx@4.19.2: + tsx@4.19.4: dependencies: - esbuild: 0.23.1 - get-tsconfig: 4.7.5 + esbuild: 0.25.5 + get-tsconfig: 4.10.1 optionalDependencies: fsevents: 2.3.3 - tsyringe@4.8.0: + tsyringe@4.10.0: dependencies: tslib: 1.14.1 - tty-table@4.2.3: - dependencies: - chalk: 4.1.2 - csv: 5.5.3 - kleur: 4.1.5 - smartwrap: 2.0.2 - strip-ansi: 6.0.1 - wcwidth: 1.0.1 - yargs: 17.7.2 - tunnel-agent@0.6.0: dependencies: safe-buffer: 5.2.1 @@ -17060,8 +16951,6 @@ snapshots: type-detect@4.0.8: {} - type-fest@0.13.1: {} - type-fest@0.16.0: {} type-fest@0.20.2: {} @@ -17070,11 +16959,9 @@ snapshots: type-fest@0.3.1: {} - type-fest@0.6.0: {} - type-fest@0.7.1: {} - type-fest@0.8.1: {} + type-fest@4.41.0: {} type-is@1.6.18: dependencies: @@ -17083,52 +16970,55 @@ snapshots: type@2.7.3: {} - typed-array-buffer@1.0.2: + typed-array-buffer@1.0.3: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.4 es-errors: 1.3.0 - is-typed-array: 1.1.13 + is-typed-array: 1.1.15 - typed-array-byte-length@1.0.1: + typed-array-byte-length@1.0.3: dependencies: - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 - is-typed-array: 1.1.13 + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 - typed-array-byte-offset@1.0.2: + typed-array-byte-offset@1.0.4: dependencies: available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 - is-typed-array: 1.1.13 + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + reflect.getprototypeof: 1.0.10 - typed-array-length@1.0.6: + typed-array-length@1.0.7: dependencies: - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 - is-typed-array: 1.1.13 - possible-typed-array-names: 1.0.0 + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + is-typed-array: 1.1.15 + possible-typed-array-names: 1.1.0 + reflect.getprototypeof: 1.0.10 - typedarray.prototype.slice@1.0.3: + typedarray.prototype.slice@1.0.5: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.24.0 es-errors: 1.3.0 - typed-array-buffer: 1.0.2 - typed-array-byte-offset: 1.0.2 + get-proto: 1.0.1 + math-intrinsics: 1.1.0 + typed-array-buffer: 1.0.3 + typed-array-byte-offset: 1.0.4 typedarray@0.0.6: {} typescript@5.5.4: {} - ua-parser-js@1.0.38: {} + ua-parser-js@1.0.40: {} uglify-es@3.3.9: dependencies: @@ -17144,27 +17034,27 @@ snapshots: uint8arrays@5.1.0: dependencies: - multiformats: 13.3.2 + multiformats: 13.3.7 - unbox-primitive@1.0.2: + unbox-primitive@1.1.0: dependencies: - call-bind: 1.0.7 - has-bigints: 1.0.2 - has-symbols: 1.0.3 - which-boxed-primitive: 1.0.2 + call-bound: 1.0.4 + has-bigints: 1.1.0 + has-symbols: 1.1.0 + which-boxed-primitive: 1.1.1 undici-types@5.26.5: {} - undici@6.21.0: {} + undici@6.21.3: {} - unicode-canonical-property-names-ecmascript@2.0.0: {} + unicode-canonical-property-names-ecmascript@2.0.1: {} unicode-match-property-ecmascript@2.0.0: dependencies: - unicode-canonical-property-names-ecmascript: 2.0.0 + unicode-canonical-property-names-ecmascript: 2.0.1 unicode-property-aliases-ecmascript: 2.1.0 - unicode-match-property-value-ecmascript@2.1.0: {} + unicode-match-property-value-ecmascript@2.2.0: {} unicode-property-aliases-ecmascript@2.1.0: {} @@ -17192,16 +17082,12 @@ snapshots: unpipe@1.0.0: {} - update-browserslist-db@1.1.1(browserslist@4.24.2): + update-browserslist-db@1.1.3(browserslist@4.25.0): dependencies: - browserslist: 4.24.2 + browserslist: 4.25.0 escalade: 3.2.0 picocolors: 1.1.1 - uri-js@4.4.1: - dependencies: - punycode: 2.3.1 - url-join@4.0.0: {} utf8@3.0.0: {} @@ -17212,9 +17098,9 @@ snapshots: dependencies: inherits: 2.0.4 is-arguments: 1.2.0 - is-generator-function: 1.0.10 - is-typed-array: 1.1.13 - which-typed-array: 1.1.15 + is-generator-function: 1.1.0 + is-typed-array: 1.1.15 + which-typed-array: 1.1.19 utils-merge@1.0.1: {} @@ -17230,7 +17116,7 @@ snapshots: v8-compile-cache-lib@3.0.1: {} - v8-to-istanbul@9.2.0: + v8-to-istanbul@9.3.0: dependencies: '@jridgewell/trace-mapping': 0.3.25 '@types/istanbul-lib-coverage': 2.0.6 @@ -17242,16 +17128,13 @@ snapshots: valid-url@1.0.9: {} - validate-npm-package-license@3.0.4: - dependencies: - spdx-correct: 3.2.0 - spdx-expression-parse: 3.0.1 - validate-npm-package-name@3.0.0: dependencies: builtins: 1.0.3 - validator@13.12.0: {} + validate-npm-package-name@5.0.1: {} + + validator@13.15.15: {} varint@6.0.0: {} @@ -17267,21 +17150,21 @@ snapshots: dependencies: defaults: 1.0.4 - web-did-resolver@2.0.27: + web-did-resolver@2.0.30: dependencies: - cross-fetch: 4.0.0 + cross-fetch: 4.1.0 did-resolver: 4.1.0 transitivePeerDependencies: - encoding web-streams-polyfill@3.3.3: {} - webcrypto-core@1.8.0: + webcrypto-core@1.8.1: dependencies: - '@peculiar/asn1-schema': 2.3.13 + '@peculiar/asn1-schema': 2.3.15 '@peculiar/json-schema': 1.1.12 - asn1js: 3.0.5 - pvtsutils: 1.3.5 + asn1js: 3.0.6 + pvtsutils: 1.3.6 tslib: 2.8.1 webcrypto-shim@0.1.7: {} @@ -17303,27 +17186,48 @@ snapshots: tr46: 0.0.3 webidl-conversions: 3.0.1 - which-boxed-primitive@1.0.2: + which-boxed-primitive@1.1.1: dependencies: - is-bigint: 1.0.4 - is-boolean-object: 1.1.2 - is-number-object: 1.0.7 - is-string: 1.0.7 - is-symbol: 1.0.4 + is-bigint: 1.1.0 + is-boolean-object: 1.2.2 + is-number-object: 1.1.1 + is-string: 1.1.1 + is-symbol: 1.1.1 - which-module@2.0.1: {} + which-builtin-type@1.2.1: + dependencies: + call-bound: 1.0.4 + function.prototype.name: 1.1.8 + has-tostringtag: 1.0.2 + is-async-function: 2.1.1 + is-date-object: 1.1.0 + is-finalizationregistry: 1.1.1 + is-generator-function: 1.1.0 + is-regex: 1.2.1 + is-weakref: 1.1.1 + isarray: 2.0.5 + which-boxed-primitive: 1.1.1 + which-collection: 1.0.2 + which-typed-array: 1.1.19 - which-pm@2.0.0: + which-collection@1.0.2: dependencies: - load-yaml-file: 0.2.0 - path-exists: 4.0.0 + is-map: 2.0.3 + is-set: 2.0.3 + is-weakmap: 2.0.2 + is-weakset: 2.0.4 + + which-module@2.0.1: + optional: true - which-typed-array@1.1.15: + which-typed-array@1.1.19: dependencies: available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 + call-bind: 1.0.8 + call-bound: 1.0.4 + for-each: 0.3.5 + get-proto: 1.0.1 + gopd: 1.2.0 has-tostringtag: 1.0.2 which@1.3.1: @@ -17384,7 +17288,7 @@ snapshots: ws@7.5.10: {} - ws@8.17.1: {} + ws@8.18.2: {} xcode@3.0.1: dependencies: @@ -17409,12 +17313,11 @@ snapshots: xtend@4.0.2: {} - y18n@4.0.3: {} + y18n@4.0.3: + optional: true y18n@5.0.8: {} - yallist@2.1.2: {} - yallist@3.1.1: {} yallist@4.0.0: {} @@ -17425,6 +17328,7 @@ snapshots: dependencies: camelcase: 5.3.1 decamelize: 1.2.0 + optional: true yargs-parser@21.1.1: {} @@ -17441,6 +17345,7 @@ snapshots: which-module: 2.0.1 y18n: 4.0.3 yargs-parser: 18.1.3 + optional: true yargs@17.7.2: dependencies: @@ -17458,11 +17363,11 @@ snapshots: yocto-queue@0.1.0: {} - zod-validation-error@2.1.0(zod@3.24.2): + zod-validation-error@2.1.0(zod@3.25.57): dependencies: - zod: 3.24.2 + zod: 3.25.57 - zod@3.24.2: {} + zod@3.25.57: {} zstd-napi@0.0.10: dependencies: diff --git a/samples/extension-module/package.json b/samples/extension-module/package.json index d48503c652..d615107fe7 100644 --- a/samples/extension-module/package.json +++ b/samples/extension-module/package.json @@ -13,18 +13,18 @@ "responder": "ts-node responder.ts" }, "devDependencies": { - "ts-node": "^10.9.2", - "@types/express": "^4.17.13", - "@types/uuid": "^9.0.1", - "@types/ws": "^8.5.4" + "@types/express": "^4.17.23", + "@types/uuid": "^9.0.8", + "@types/ws": "^8.18.1", + "ts-node": "^10.9.2" }, "dependencies": { + "@credo-ts/askar": "workspace:*", "@credo-ts/core": "workspace:*", "@credo-ts/didcomm": "workspace:*", "@credo-ts/node": "workspace:*", - "@credo-ts/askar": "workspace:*", + "@openwallet-foundation/askar-nodejs": "^0.3.2", "class-validator": "0.14.1", - "rxjs": "^7.8.0", - "@openwallet-foundation/askar-nodejs": "^0.3.1" + "rxjs": "^7.8.2" } } diff --git a/samples/tails/package.json b/samples/tails/package.json index e916f02368..bca78a23ca 100644 --- a/samples/tails/package.json +++ b/samples/tails/package.json @@ -17,11 +17,11 @@ "dependencies": { "@credo-ts/anoncreds": "workspace:*", "@credo-ts/core": "workspace:*", - "@types/express": "^4.17.13", - "@types/multer": "^1.4.7", - "@types/uuid": "^9.0.1", - "@types/ws": "^8.5.4", - "form-data": "^4.0.0", - "multer": "^1.4.5-lts.1" + "@types/express": "^4.17.23", + "@types/multer": "^1.4.13", + "@types/uuid": "^9.0.8", + "@types/ws": "^8.18.1", + "form-data": "^4.0.3", + "multer": "1.4.5-lts.2" } } From 42db196de8a80485e73616cb926effab00c01fe3 Mon Sep 17 00:00:00 2001 From: "andrey.kononov" Date: Wed, 11 Jun 2025 19:24:17 +0300 Subject: [PATCH 03/89] Debug and fix Did registrar/resolver Debug and tests --- babel.config.json | 12 - jest.config.base.ts | 3 +- package.json | 5 +- .../services/tails/BasicTailsFileService.ts | 2 +- packages/hedera/jest.config.ts | 13 +- packages/hedera/package.json | 2 +- packages/hedera/src/HederaModule.ts | 2 +- packages/hedera/src/HederaModuleConfig.ts | 10 +- .../src/anoncreds/HederaAnonCredsRegistry.ts | 2 +- .../hedera/src/dids/HederaDidRegistrar.ts | 3 +- packages/hedera/src/dids/HederaDidResolver.ts | 4 +- packages/hedera/src/index.ts | 1 - .../hedera/src/ledger/HederaLedgerService.ts | 15 +- packages/hedera/src/ledger/index.ts | 2 - .../tests/HederaAnoncredsRegistry.e2e.test.ts | 2 +- packages/hedera/tests/HederaDid.e2e.test.ts | 22 +- .../hedera/tests/HederaW3cFlow.e2e.test.ts | 7 +- .../tests/utils/InMemoryTailsFileService.ts | 2 +- packages/hedera/tests/utils/hederaModule.ts | 2 +- pnpm-lock.yaml | 379 ++++++------------ 20 files changed, 172 insertions(+), 318 deletions(-) delete mode 100644 babel.config.json delete mode 100644 packages/hedera/src/ledger/index.ts diff --git a/babel.config.json b/babel.config.json deleted file mode 100644 index 72009cef1f..0000000000 --- a/babel.config.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "presets": [ - [ - "@babel/preset-env", - { - "targets": { - "node": "current" - } - } - ] - ] -} diff --git a/jest.config.base.ts b/jest.config.base.ts index d339bf9769..79f2467b61 100644 --- a/jest.config.base.ts +++ b/jest.config.base.ts @@ -15,8 +15,7 @@ const config: Config.InitialOptions = { { isolatedModules: true, }, - ], - '^.+\\.[t|j]sx?$': 'babel-jest', + ] }, } diff --git a/package.json b/package.json index 9431135970..82f09e7f2e 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,6 @@ "@types/uuid": "^9.0.8", "@types/varint": "^6.0.3", "@types/ws": "^8.18.1", - "babel-jest": "^30.0.0", "cors": "^2.8.5", "express": "^4.21.2", "jest": "^29.7.0", @@ -81,7 +80,9 @@ "es5-ext", "esbuild", "protobufjs", - "zstd-napi" + "zstd-napi", + "cbor-extract", + "secp256k1" ] } } diff --git a/packages/anoncreds/src/services/tails/BasicTailsFileService.ts b/packages/anoncreds/src/services/tails/BasicTailsFileService.ts index fe79190761..b76b738ca7 100644 --- a/packages/anoncreds/src/services/tails/BasicTailsFileService.ts +++ b/packages/anoncreds/src/services/tails/BasicTailsFileService.ts @@ -75,7 +75,7 @@ export class BasicTailsFileService implements TailsFileService { } protected async getTailsFilePath(agentContext: AgentContext, tailsHash: string) { - return `${await this.getTailsBasePath(agentContext)}/${tailsHash}` + return `${await this.getTailsBasePath(agentContext)}/${tailsHash}`.replace(/\\/g, '/') } protected async tailsFileExists(agentContext: AgentContext, tailsHash: string): Promise { diff --git a/packages/hedera/jest.config.ts b/packages/hedera/jest.config.ts index 4926b00d2f..b594a3aaf4 100644 --- a/packages/hedera/jest.config.ts +++ b/packages/hedera/jest.config.ts @@ -7,18 +7,7 @@ import packageJson from './package.json' const config: Config.InitialOptions = { ...base, testTimeout: 1200000, - displayName: packageJson.name, - transform: { - '^.+\\.ts$': 'ts-jest', - '^.+\\.(t|j)s?$': 'babel-jest', - }, - transformIgnorePatterns: ['../../node_modules/.pnpm/(?!(cbor2)/)'], - extensionsToTreatAsEsm: ['.ts'], - moduleFileExtensions: ['ts', 'js', 'json', 'node'], - globals: { - Uint8Array: Uint8Array, - ArrayBuffer: ArrayBuffer, - } + displayName: packageJson.name } export default config diff --git a/packages/hedera/package.json b/packages/hedera/package.json index b5dc0023c0..cf641ca229 100644 --- a/packages/hedera/package.json +++ b/packages/hedera/package.json @@ -25,7 +25,7 @@ "@credo-ts/anoncreds": "workspace:*", "@credo-ts/core": "workspace:*", "@hiero-did-sdk-js/anoncreds": "npm:@hiero-did-sdk-js/anoncreds@0.0.1", - "@hiero-did-sdk-js/did": "npm:@hiero-did-sdk-js/did@0.0.1" + "@hiero-did-sdk-js/did": "npm:@hiero-did-sdk-js/did@0.0.3" }, "devDependencies": { "@credo-ts/node": "workspace:*", diff --git a/packages/hedera/src/HederaModule.ts b/packages/hedera/src/HederaModule.ts index d23a2db144..773791a366 100644 --- a/packages/hedera/src/HederaModule.ts +++ b/packages/hedera/src/HederaModule.ts @@ -3,7 +3,7 @@ import { DependencyManager, Module } from '@credo-ts/core' import { AgentConfig, Buffer } from '@credo-ts/core' import { HederaModuleConfig, HederaModuleConfigOptions } from './HederaModuleConfig' -import { HederaLedgerService } from './ledger' +import {HederaLedgerService} from "./ledger/HederaLedgerService"; export class HederaModule implements Module { public readonly config: HederaModuleConfig diff --git a/packages/hedera/src/HederaModuleConfig.ts b/packages/hedera/src/HederaModuleConfig.ts index 5fe22428ef..e4a87d6188 100644 --- a/packages/hedera/src/HederaModuleConfig.ts +++ b/packages/hedera/src/HederaModuleConfig.ts @@ -1,15 +1,11 @@ import { HederaAnoncredsRegistryConfiguration } from '@hiero-did-sdk-js/anoncreds' -export type HederaModuleConfigOptions = HederaAnoncredsRegistryConfiguration +export interface HederaModuleConfigOptions extends HederaAnoncredsRegistryConfiguration {} export class HederaModuleConfig { - private readonly _options: HederaModuleConfigOptions + public readonly options: HederaModuleConfigOptions public constructor(options: HederaModuleConfigOptions) { - this._options = options - } - - get options(): HederaModuleConfigOptions { - return this._options + this.options = options } } diff --git a/packages/hedera/src/anoncreds/HederaAnonCredsRegistry.ts b/packages/hedera/src/anoncreds/HederaAnonCredsRegistry.ts index c7ccfa9d7a..76ae86ecba 100644 --- a/packages/hedera/src/anoncreds/HederaAnonCredsRegistry.ts +++ b/packages/hedera/src/anoncreds/HederaAnonCredsRegistry.ts @@ -14,7 +14,7 @@ import type { RegisterSchemaReturn, } from '@credo-ts/anoncreds' import type { AgentContext } from '@credo-ts/core' -import { HederaLedgerService } from '../ledger' +import {HederaLedgerService} from "../ledger/HederaLedgerService"; export class HederaAnonCredsRegistry implements AnonCredsRegistry { public readonly methodName = 'hedera' diff --git a/packages/hedera/src/dids/HederaDidRegistrar.ts b/packages/hedera/src/dids/HederaDidRegistrar.ts index 1b8dce017e..e1a21a6c97 100644 --- a/packages/hedera/src/dids/HederaDidRegistrar.ts +++ b/packages/hedera/src/dids/HederaDidRegistrar.ts @@ -13,7 +13,7 @@ import { DidUpdateOptions, DidUpdateResult, } from '@credo-ts/core' -import { HederaLedgerService } from '../ledger' +import {HederaLedgerService} from "../ledger/HederaLedgerService"; export class HederaDidRegistrar implements DidRegistrar { public readonly supportedMethods = ['hedera'] @@ -31,6 +31,7 @@ export class HederaDidRegistrar implements DidRegistrar { ...didDocument, service: didDocument.service?.map((s) => new DidDocumentService(s)), }) + await didRepository.save( agentContext, new DidRecord({ diff --git a/packages/hedera/src/dids/HederaDidResolver.ts b/packages/hedera/src/dids/HederaDidResolver.ts index 5fe2100cb6..2bf1d2533d 100644 --- a/packages/hedera/src/dids/HederaDidResolver.ts +++ b/packages/hedera/src/dids/HederaDidResolver.ts @@ -7,7 +7,7 @@ import { JsonTransformer, type ParsedDid, } from '@credo-ts/core' -import { HederaLedgerService } from '../ledger' +import {HederaLedgerService} from "../ledger/HederaLedgerService"; export class HederaDidResolver implements DidResolver { public readonly supportedMethods = ['hedera'] @@ -24,7 +24,7 @@ export class HederaDidResolver implements DidResolver { const hederaLedgerService = agentContext.dependencyManager.resolve(HederaLedgerService) const sdk = hederaLedgerService.getHederaDidSdk(agentContext) - const resolveDidResult = await sdk.resolveDid(did, 'did+json') + const resolveDidResult = await sdk.resolveDid(did) const updatedContextDidJson = { ...resolveDidResult, diff --git a/packages/hedera/src/index.ts b/packages/hedera/src/index.ts index 06098167ff..b552a6b0f9 100644 --- a/packages/hedera/src/index.ts +++ b/packages/hedera/src/index.ts @@ -3,6 +3,5 @@ export * from './dids' // AnonCreds export * from './anoncreds' -export * from './ledger' export * from './HederaModule' export * from './HederaModuleConfig' diff --git a/packages/hedera/src/ledger/HederaLedgerService.ts b/packages/hedera/src/ledger/HederaLedgerService.ts index d0fd7ad6e6..fd4ec364d6 100644 --- a/packages/hedera/src/ledger/HederaLedgerService.ts +++ b/packages/hedera/src/ledger/HederaLedgerService.ts @@ -1,22 +1,21 @@ import { type AgentContext, injectable } from '@credo-ts/core' import { HederaAnoncredsRegistry } from '@hiero-did-sdk-js/anoncreds' import { HederaDidService } from '@hiero-did-sdk-js/did' -import { HederaLedgerServiceCache, HederaModuleConfig } from '../.' +import { HederaModuleConfig } from '../HederaModuleConfig' +import { HederaLedgerServiceCache } from './HederaLedgerServiceCache' @injectable() export class HederaLedgerService { - private readonly config: HederaModuleConfig - - public constructor(config: HederaModuleConfig) { - this.config = config + public constructor(private readonly hederaModuleConfig: HederaModuleConfig) { + console.log('HederaLedgerService', hederaModuleConfig) } public getHederaAnonCredsSdk(agentContext: AgentContext): HederaAnoncredsRegistry { - const cache = this.config.options.cache ?? new HederaLedgerServiceCache(agentContext) - return new HederaAnoncredsRegistry({ ...this.config.options, cache }) + const cache = this.hederaModuleConfig.options.cache ?? new HederaLedgerServiceCache(agentContext) + return new HederaAnoncredsRegistry({ ...this.hederaModuleConfig.options, cache }) } public getHederaDidSdk(_agentContext: AgentContext): HederaDidService { - return new HederaDidService({ ...this.config.options }) + return new HederaDidService({ ...this.hederaModuleConfig.options }) } } diff --git a/packages/hedera/src/ledger/index.ts b/packages/hedera/src/ledger/index.ts deleted file mode 100644 index 77cb4eedf3..0000000000 --- a/packages/hedera/src/ledger/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { HederaLedgerService } from './HederaLedgerService' -export { HederaLedgerServiceCache } from './HederaLedgerServiceCache' diff --git a/packages/hedera/tests/HederaAnoncredsRegistry.e2e.test.ts b/packages/hedera/tests/HederaAnoncredsRegistry.e2e.test.ts index 6dd33b1026..0524f6c2b0 100644 --- a/packages/hedera/tests/HederaAnoncredsRegistry.e2e.test.ts +++ b/packages/hedera/tests/HederaAnoncredsRegistry.e2e.test.ts @@ -9,7 +9,7 @@ describe('Hedera AnonCreds support', () => { let agent: Agent let did: string - const logger = new ConsoleLogger(LogLevel.error) + const logger = new ConsoleLogger(LogLevel.debug) const cache = new testCache() beforeAll(async () => { diff --git a/packages/hedera/tests/HederaDid.e2e.test.ts b/packages/hedera/tests/HederaDid.e2e.test.ts index c57b737f5d..c7856cf3d8 100644 --- a/packages/hedera/tests/HederaDid.e2e.test.ts +++ b/packages/hedera/tests/HederaDid.e2e.test.ts @@ -3,32 +3,36 @@ import { getHederaAgent, waitTimeout } from './utils' const logger = new ConsoleLogger(LogLevel.error) -const did = 'did:hedera:testnet:zGdjMu1hPkjbJXSPPp6RgTptnpYYM9uEkPeNbPhSkXTon_0.0.5139753' +//const did = 'did:hedera:testnet:zGdjMu1hPkjbJXSPPp6RgTptnpYYM9uEkPeNbPhSkXTon_0.0.5139753' describe('Hedera Module did resolver', () => { - let aliceAgent: Agent + let agent: Agent beforeAll(async () => { - const aliceAgent = getHederaAgent({ + agent = getHederaAgent({ logger, label: 'alice', }) - await aliceAgent.initialize() + await agent.initialize() }) afterAll(async () => { // Wait for messages to flush out await waitTimeout(1000) - if (aliceAgent) { - await aliceAgent.shutdown() + if (agent) { + await agent.shutdown() } }) describe('HederaDidResolver', () => { - it('should resolve a hedera did when valid did is passed', async () => { - const resolvedDIDDoc = await aliceAgent.dids.resolve(did) - expect(resolvedDIDDoc).toBeDefined() + it('should creaste and resolve a hedera did', async () => { + const didResult = await agent.dids.create({method: 'hedera'}) + await waitTimeout(2000) + const resolvedDIDDoc = await agent.dids.resolve(didResult.didState.did ?? '') + expect(resolvedDIDDoc.didDocument?.id).toEqual(didResult.didState.did) }) }) }) + + diff --git a/packages/hedera/tests/HederaW3cFlow.e2e.test.ts b/packages/hedera/tests/HederaW3cFlow.e2e.test.ts index 811d7ce713..1c4da8a8c8 100644 --- a/packages/hedera/tests/HederaW3cFlow.e2e.test.ts +++ b/packages/hedera/tests/HederaW3cFlow.e2e.test.ts @@ -14,7 +14,6 @@ import { vcLibraries, } from '@credo-ts/core' -import { LinkedDataProof } from '@credo-ts/core/build/modules/vc/data-integrity/models/LinkedDataProof' import { W3C_FIXTURES } from './fixtures' import { getHederaAgent, waitTimeout } from './utils' @@ -101,10 +100,10 @@ describe('Hedera Module did resolver', () => { expect(vc).toBeInstanceOf(W3cJsonLdVerifiableCredential) expect(vc.issuer).toEqual(issuerDid) expect(Array.isArray(vc.proof)).toBe(false) - expect(vc.proof).toBeInstanceOf(LinkedDataProof) + //expect(vc.proof).toBeInstanceOf(LinkedDataProof) - vc.proof = vc.proof as LinkedDataProof - expect(vc.proof.verificationMethod).toEqual(verificationMethod) + //vc.proof = vc.proof as any//LinkedDataProof + expect((vc.proof as any).verificationMethod).toEqual(verificationMethod) }) it('should throw because of verificationMethod does not belong to this wallet', async () => { diff --git a/packages/hedera/tests/utils/InMemoryTailsFileService.ts b/packages/hedera/tests/utils/InMemoryTailsFileService.ts index de7a81b73b..952d4e51ea 100644 --- a/packages/hedera/tests/utils/InMemoryTailsFileService.ts +++ b/packages/hedera/tests/utils/InMemoryTailsFileService.ts @@ -17,7 +17,7 @@ export class InMemoryTailsFileService extends BasicTailsFileService { this.tailsFilePaths[options.revocationRegistryDefinition.value.tailsHash] = options.revocationRegistryDefinition.value.tailsLocation - return { tailsFileUrl: options.revocationRegistryDefinition.value.tailsHash } + return { tailsFileUrl: options.revocationRegistryDefinition.value.tailsLocation.replace(/\\/g, '/') } } public async getTailsFile( diff --git a/packages/hedera/tests/utils/hederaModule.ts b/packages/hedera/tests/utils/hederaModule.ts index 46e956d469..bcc649cd99 100644 --- a/packages/hedera/tests/utils/hederaModule.ts +++ b/packages/hedera/tests/utils/hederaModule.ts @@ -43,7 +43,6 @@ export const getHederaAgent = (props: { modules = { ...modules, askar: new AskarModule({ askar, store: { id: label, key: label } }), - hedera: new HederaModule(getHederaModuleConfig(props)), anoncreds: new AnonCredsModule({ anoncreds, registries: [new HederaAnonCredsRegistry()], @@ -53,6 +52,7 @@ export const getHederaAgent = (props: { resolvers: [new HederaDidResolver()], registrars: [new HederaDidRegistrar()], }), + hedera: new HederaModule(getHederaModuleConfig(props)), } if (cache) { modules = { ...modules, cache: new CacheModule({ cache }) } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ab047182fe..79a0e215b5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -59,9 +59,6 @@ importers: '@types/ws': specifier: ^8.18.1 version: 8.18.1 - babel-jest: - specifier: ^30.0.0 - version: 30.0.0(@babel/core@7.27.4) cors: specifier: ^2.8.5 version: 2.8.5 @@ -85,7 +82,7 @@ importers: version: 7.1.1 ts-jest: specifier: ^29.3.4 - version: 29.3.4(@babel/core@7.27.4)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@30.0.0(@babel/core@7.27.4))(jest@29.7.0(@types/node@18.18.8)(ts-node@10.9.2(@types/node@18.18.8)(typescript@5.5.4)))(typescript@5.5.4) + version: 29.3.4(@babel/core@7.27.4)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.27.4))(jest@29.7.0(@types/node@18.18.8)(ts-node@10.9.2(@types/node@18.18.8)(typescript@5.5.4)))(typescript@5.5.4) ts-node: specifier: ^10.9.2 version: 10.9.2(@types/node@18.18.8)(typescript@5.5.4) @@ -618,8 +615,8 @@ importers: specifier: npm:@hiero-did-sdk-js/anoncreds@0.0.1 version: 0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) '@hiero-did-sdk-js/did': - specifier: npm:@hiero-did-sdk-js/did@0.0.1 - version: 0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) + specifier: npm:@hiero-did-sdk-js/did@0.0.3 + version: 0.0.3(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) devDependencies: '@credo-ts/node': specifier: workspace:* @@ -1809,6 +1806,36 @@ packages: '@bufbuild/protobuf@2.5.2': resolution: {integrity: sha512-foZ7qr0IsUBjzWIq+SuBLfdQCpJ1j8cTuNNT4owngTHoN5KsJb8L9t65fzz7SCeSWzescoOil/0ldqiL041ABg==} + '@cbor-extract/cbor-extract-darwin-arm64@2.2.0': + resolution: {integrity: sha512-P7swiOAdF7aSi0H+tHtHtr6zrpF3aAq/W9FXx5HektRvLTM2O89xCyXF3pk7pLc7QpaY7AoaE8UowVf9QBdh3w==} + cpu: [arm64] + os: [darwin] + + '@cbor-extract/cbor-extract-darwin-x64@2.2.0': + resolution: {integrity: sha512-1liF6fgowph0JxBbYnAS7ZlqNYLf000Qnj4KjqPNW4GViKrEql2MgZnAsExhY9LSy8dnvA4C0qHEBgPrll0z0w==} + cpu: [x64] + os: [darwin] + + '@cbor-extract/cbor-extract-linux-arm64@2.2.0': + resolution: {integrity: sha512-rQvhNmDuhjTVXSPFLolmQ47/ydGOFXtbR7+wgkSY0bdOxCFept1hvg59uiLPT2fVDuJFuEy16EImo5tE2x3RsQ==} + cpu: [arm64] + os: [linux] + + '@cbor-extract/cbor-extract-linux-arm@2.2.0': + resolution: {integrity: sha512-QeBcBXk964zOytiedMPQNZr7sg0TNavZeuUCD6ON4vEOU/25+pLhNN6EDIKJ9VLTKaZ7K7EaAriyYQ1NQ05s/Q==} + cpu: [arm] + os: [linux] + + '@cbor-extract/cbor-extract-linux-x64@2.2.0': + resolution: {integrity: sha512-cWLAWtT3kNLHSvP4RKDzSTX9o0wvQEEAj4SKvhWuOVZxiDAeQazr9A+PSiRILK1VYMLeDml89ohxCnUNQNQNCw==} + cpu: [x64] + os: [linux] + + '@cbor-extract/cbor-extract-win32-x64@2.2.0': + resolution: {integrity: sha512-l2M+Z8DO2vbvADOBNLbbh9y5ST1RY5sqkWOg/58GkUPBYou/cuNZ68SGQ644f1CvZ8kcOxyZtw06+dxWHIoN/w==} + cpu: [x64] + os: [win32] + '@changesets/apply-release-plan@7.0.12': resolution: {integrity: sha512-EaET7As5CeuhTzvXTQCRZeBUcisoYPDDcXvgTE/2jmmypKp0RC7LxKj/yzqeh/1qFTZI7oDGFcL1PHRuQuketQ==} @@ -1957,10 +1984,6 @@ packages: resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} - '@cto.af/wtf8@0.0.2': - resolution: {integrity: sha512-ATm4UQiKrdm5GnU6BvIwUDN+LDEtt23zuzKFpnfDT59ULAd0aMYm/nSFzbSO02garLcXumRC13PzNfa7BsfvSg==} - engines: {node: '>=20'} - '@digitalbazaar/bitstring@3.1.0': resolution: {integrity: sha512-Cii+Sl++qaexOvv3vchhgZFfSmtHPNIPzGegaq4ffPnflVXFu+V2qrJ17aL2+gfLxrlC/zazZFuAltyKTPq7eg==} engines: {node: '>=16'} @@ -2371,8 +2394,8 @@ packages: '@hiero-did-sdk-js/crypto@0.0.1': resolution: {integrity: sha1-boXa93x8ubg3r87M75kulcK7HWI=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk-js/crypto/-/@hiero-did-sdk-js/crypto-0.0.1.tgz} - '@hiero-did-sdk-js/did@0.0.1': - resolution: {integrity: sha1-kTySdu/6/RJOdOTUnMvIHiDfb1E=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk-js/did/-/@hiero-did-sdk-js/did-0.0.1.tgz} + '@hiero-did-sdk-js/did@0.0.3': + resolution: {integrity: sha1-nGv0l/2JjkG9E9e020diF8E6scM=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk-js/did/-/@hiero-did-sdk-js/did-0.0.3.tgz} '@hiero-did-sdk-js/hcs@0.0.1': resolution: {integrity: sha1-/uBmj1cfxYgU+8TJPiajk7y3fNM=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk-js/hcs/-/@hiero-did-sdk-js/hcs-0.0.1.tgz} @@ -2454,10 +2477,6 @@ packages: resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - '@jest/pattern@30.0.0': - resolution: {integrity: sha512-k+TpEThzLVXMkbdxf8KHjZ83Wl+G54ytVJoDIGWwS96Ql4xyASRjc6SU1hs5jHVql+hpyK9G8N7WuFhLpGHRpQ==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/reporters@29.7.0': resolution: {integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -2471,10 +2490,6 @@ packages: resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - '@jest/schemas@30.0.0': - resolution: {integrity: sha512-NID2VRyaEkevCRz6badhfqYwri/RvMbiHY81rk3AkK/LaiB0LSxi1RdVZ7MpZdTjNugtZeGfpL0mLs9Kp3MrQw==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/source-map@29.6.3': resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -2491,10 +2506,6 @@ packages: resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - '@jest/transform@30.0.0': - resolution: {integrity: sha512-8xhpsCGYJsUjqpJOgLyMkeOSSlhqggFZEWAnZquBsvATtueoEs7CkMRxOUmJliF3E5x+mXmZ7gEEsHank029Og==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/types@24.9.0': resolution: {integrity: sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==} engines: {node: '>= 6'} @@ -2511,10 +2522,6 @@ packages: resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - '@jest/types@30.0.0': - resolution: {integrity: sha512-1Nox8mAL52PKPfEnUQWBvKU/bp8FTT6AiDu76bFDEJj/qsRFSAVSldfCH3XYMqialti2zHXKvD5gN0AaHc0yKA==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jridgewell/gen-mapping@0.3.8': resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} engines: {node: '>=6.0.0'} @@ -2911,9 +2918,6 @@ packages: '@sinclair/typebox@0.27.8': resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} - '@sinclair/typebox@0.34.33': - resolution: {integrity: sha512-5HAV9exOMcXRUxo+9iYB5n09XxzCXnfy4VTNW4xnDv+FgjzAGY989C28BIdljKqmF+ZltUwujE3aossvcVtq6g==} - '@sindresorhus/is@5.6.0': resolution: {integrity: sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==} engines: {node: '>=14.16'} @@ -2980,36 +2984,36 @@ packages: '@stablelib/wipe@2.0.1': resolution: {integrity: sha512-1eU2K9EgOcV4qc9jcP6G72xxZxEm5PfeI5H55l08W95b4oRJaqhmlWRc4xZAm6IVSKhVNxMi66V67hCzzuMTAg==} - '@swiss-digital-assets-institute/core@0.3.0': - resolution: {integrity: sha1-gOPw8bFqDrlOMYYXPtIq7ixEH+A=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@swiss-digital-assets-institute/core/-/@swiss-digital-assets-institute/core-0.3.0.tgz} + '@swiss-digital-assets-institute/core@0.3.9': + resolution: {integrity: sha1-oAQYm8vkIXhg7bdB5JdSBJWwPBw=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@swiss-digital-assets-institute/core/-/@swiss-digital-assets-institute/core-0.3.9.tgz} engines: {node: '>=20'} - '@swiss-digital-assets-institute/lifecycle@0.3.0': - resolution: {integrity: sha1-AbSEJqtRLA4v383Cqx8O+7q1xw4=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@swiss-digital-assets-institute/lifecycle/-/@swiss-digital-assets-institute/lifecycle-0.3.0.tgz} + '@swiss-digital-assets-institute/lifecycle@0.3.9': + resolution: {integrity: sha1-CiUKkupWQeDX9I9yz+0EAbZLRGk=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@swiss-digital-assets-institute/lifecycle/-/@swiss-digital-assets-institute/lifecycle-0.3.9.tgz} engines: {node: '>=20'} - '@swiss-digital-assets-institute/messages@0.3.0': - resolution: {integrity: sha1-eHjiIB8vQQbmF25rD26QrpUL99k=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@swiss-digital-assets-institute/messages/-/@swiss-digital-assets-institute/messages-0.3.0.tgz} + '@swiss-digital-assets-institute/messages@0.3.9': + resolution: {integrity: sha1-CdfXbRGaLiJ9QkXMP6JdQ7I5UNk=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@swiss-digital-assets-institute/messages/-/@swiss-digital-assets-institute/messages-0.3.9.tgz} engines: {node: '>=20'} - '@swiss-digital-assets-institute/publisher-internal@0.3.0': - resolution: {integrity: sha1-uG3qRyyAruu9oN4/vAHsBYKtMcg=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@swiss-digital-assets-institute/publisher-internal/-/@swiss-digital-assets-institute/publisher-internal-0.3.0.tgz} + '@swiss-digital-assets-institute/publisher-internal@0.3.9': + resolution: {integrity: sha1-/9Q7FseGF8bIwOAMyJ7TFqKv3tQ=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@swiss-digital-assets-institute/publisher-internal/-/@swiss-digital-assets-institute/publisher-internal-0.3.9.tgz} engines: {node: '>=20'} - '@swiss-digital-assets-institute/registrar@0.3.0': - resolution: {integrity: sha1-ebwxVxUl+FBtL9QUimD5Jwqmex8=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@swiss-digital-assets-institute/registrar/-/@swiss-digital-assets-institute/registrar-0.3.0.tgz} + '@swiss-digital-assets-institute/registrar@0.3.9': + resolution: {integrity: sha1-1Ek6jpY0jxuA7tk1fytBa4eXSvc=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@swiss-digital-assets-institute/registrar/-/@swiss-digital-assets-institute/registrar-0.3.9.tgz} engines: {node: '>=20'} - '@swiss-digital-assets-institute/resolver@0.3.0': - resolution: {integrity: sha1-GzqTCKsp458bctefaOjKR1q8nBs=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@swiss-digital-assets-institute/resolver/-/@swiss-digital-assets-institute/resolver-0.3.0.tgz} + '@swiss-digital-assets-institute/resolver@0.3.9': + resolution: {integrity: sha1-9s+WUtLhQ3GP1GTNMAE1Z0dTpyY=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@swiss-digital-assets-institute/resolver/-/@swiss-digital-assets-institute/resolver-0.3.9.tgz} engines: {node: '>=20'} - '@swiss-digital-assets-institute/signer-internal@0.3.0': - resolution: {integrity: sha1-7ry2rpuYAg6HqY20MJo5WOmeols=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@swiss-digital-assets-institute/signer-internal/-/@swiss-digital-assets-institute/signer-internal-0.3.0.tgz} + '@swiss-digital-assets-institute/signer-internal@0.3.9': + resolution: {integrity: sha1-hf6iW5Bu8sJ5w6tcWJLKB/rGlcw=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@swiss-digital-assets-institute/signer-internal/-/@swiss-digital-assets-institute/signer-internal-0.3.9.tgz} engines: {node: '>=20'} - '@swiss-digital-assets-institute/verifier-internal@0.3.0': - resolution: {integrity: sha1-af+OrAYbryxmifpMXEdJdvrJN80=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@swiss-digital-assets-institute/verifier-internal/-/@swiss-digital-assets-institute/verifier-internal-0.3.0.tgz} + '@swiss-digital-assets-institute/verifier-internal@0.3.9': + resolution: {integrity: sha1-s1bnScN6erWEjCNXSOSozS52WPE=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@swiss-digital-assets-institute/verifier-internal/-/@swiss-digital-assets-institute/verifier-internal-0.3.9.tgz} engines: {node: '>=20'} '@szmarczak/http-timer@5.0.1': @@ -3209,9 +3213,6 @@ packages: '@types/yargs@17.0.33': resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==} - '@ungap/structured-clone@1.3.0': - resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} - '@unimodules/core@7.1.2': resolution: {integrity: sha512-lY+e2TAFuebD3vshHMIRqru3X4+k7Xkba4Wa7QsDBd+ex4c4N2dHAO61E2SrGD9+TRBD8w/o7mzK6ljbqRnbyg==} deprecated: 'replaced by the ''expo'' package, learn more: https://blog.expo.dev/whats-new-in-expo-modules-infrastructure-7a7cdda81ebc' @@ -3447,28 +3448,14 @@ packages: peerDependencies: '@babel/core': ^7.8.0 - babel-jest@30.0.0: - resolution: {integrity: sha512-JQ0DhdFjODbSawDf0026uZuwaqfKkQzk+9mwWkq2XkKFIaMhFVOxlVmbFCOnnC76jATdxrff3IiUAvOAJec6tw==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - peerDependencies: - '@babel/core': ^7.11.0 - babel-plugin-istanbul@6.1.1: resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} engines: {node: '>=8'} - babel-plugin-istanbul@7.0.0: - resolution: {integrity: sha512-C5OzENSx/A+gt7t4VH1I2XsflxyPUmXRFPKBxt33xncdOmq7oROVM3bZv9Ysjjkv8OJYDMa+tKuKMvqU/H3xdw==} - engines: {node: '>=12'} - babel-plugin-jest-hoist@29.6.3: resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - babel-plugin-jest-hoist@30.0.0: - resolution: {integrity: sha512-DSRm+US/FCB4xPDD6Rnslb6PAF9Bej1DZ+1u4aTiqJnk7ZX12eHsnDiIOqjGvITCq+u6wLqUhgS+faCNbVY8+g==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - babel-plugin-polyfill-corejs2@0.4.13: resolution: {integrity: sha512-3sX/eOms8kd3q2KZ6DAhKPc0dgm525Gqq5NtWKZ7QYYZEv57OQ54KtblzJzH1lQF/eQxO8KjWGIK9IPUJNus5g==} peerDependencies: @@ -3518,12 +3505,6 @@ packages: peerDependencies: '@babel/core': ^7.0.0 - babel-preset-jest@30.0.0: - resolution: {integrity: sha512-hgEuu/W7gk8QOWUA9+m3Zk+WpGvKc1Egp6rFQEfYxEoM9Fk/q8nuTXNL65OkhwGrTApauEGgakOoWVXj+UfhKw==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - peerDependencies: - '@babel/core': ^7.11.0 - balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -3711,9 +3692,12 @@ packages: resolution: {integrity: sha512-F705O3xrsUtgt98j7leetNhTWPe+5S72rlL5O4jA1pKqBVQ/dT1O1D6PFxmSXvc0SUOinWS57DKx0I3CHrXJHQ==} hasBin: true - cbor2@2.0.1: - resolution: {integrity: sha512-9bE8+tueGxONyxpttNKkAKKcGVtAPeoSJ64AjVTTjEuBOuRaeeP76EN9BbmQqkz1ZeTP0QPvksNBKwvEutIUzQ==} - engines: {node: '>=20'} + cbor-extract@2.2.0: + resolution: {integrity: sha512-Ig1zM66BjLfTXpNgKpvBePq271BPOvu8MR0Jl080yG7Jsl+wAZunfrwiwA+9ruzm/WEdIV5QF/bjDZTqyAIVHA==} + hasBin: true + + cbor-x@1.6.0: + resolution: {integrity: sha512-0kareyRwHSkL6ws5VXHEf8uY1liitysCVJjlmhaLG+IXLqhSaOO+t63coaso7yjwEzWZzLy8fJo06gZDVQM9Qg==} chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} @@ -3759,10 +3743,6 @@ packages: resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} engines: {node: '>=8'} - ci-info@4.2.0: - resolution: {integrity: sha512-cYY9mypksY8NRqgDB1XD1RiJL338v/551niynFTGkZOO2LHuB2OmOYxDIe/ttN9AHwrqdum1360G3ald0W9kCg==} - engines: {node: '>=8'} - cjs-module-lexer@1.4.3: resolution: {integrity: sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==} @@ -5312,10 +5292,6 @@ packages: resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-haste-map@30.0.0: - resolution: {integrity: sha512-p4bXAhXTawTsADgQgTpbymdLaTyPW1xWNu1oIGG7/N3LIAbZVkH2JMJqS8/IUcnGR8Kc7WFE+vWbJvsqGCWZXw==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-leak-detector@29.7.0: resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -5349,10 +5325,6 @@ packages: resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-regex-util@30.0.0: - resolution: {integrity: sha512-rT84010qRu/5OOU7a9TeidC2Tp3Qgt9Sty4pOZ/VSDuEmRupIjKZAb53gU3jr4ooMlhwScrgC9UixJxWzVu9oQ==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-resolve-dependencies@29.7.0: resolution: {integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -5385,10 +5357,6 @@ packages: resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-util@30.0.0: - resolution: {integrity: sha512-fhNBBM9uSUbd4Lzsf8l/kcAdaHD/4SgoI48en3HXcBEMwKwoleKFMZ6cYEYs21SB779PRuRCyNLmymApAm8tZw==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-validate@26.6.2: resolution: {integrity: sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ==} engines: {node: '>= 10.14.2'} @@ -5409,10 +5377,6 @@ packages: resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-worker@30.0.0: - resolution: {integrity: sha512-VZvxfWIybIvwK8N/Bsfe43LfQgd/rD0c4h5nLUx78CAqPxIQcW2qDjsVAC53iUR8yxzFIeCFFvWOh8en8hGzdg==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest@29.7.0: resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -6183,6 +6147,10 @@ packages: resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} engines: {node: '>= 6.13.0'} + node-gyp-build-optional-packages@5.1.1: + resolution: {integrity: sha512-+P72GAjVAbTxjjwUmwjVrqrdZROD4nf8KgpBoDxqXXTiYZZt/ud60dE5yvCSr9lRO8e8yv6kgJIC0K0PfZFVQw==} + hasBin: true + node-gyp-build@4.8.4: resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} hasBin: true @@ -6463,10 +6431,6 @@ packages: resolution: {integrity: sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==} engines: {node: '>=10'} - picomatch@4.0.2: - resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} - engines: {node: '>=12'} - pify@4.0.1: resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} engines: {node: '>=6'} @@ -8997,6 +8961,24 @@ snapshots: '@bufbuild/protobuf@2.5.2': {} + '@cbor-extract/cbor-extract-darwin-arm64@2.2.0': + optional: true + + '@cbor-extract/cbor-extract-darwin-x64@2.2.0': + optional: true + + '@cbor-extract/cbor-extract-linux-arm64@2.2.0': + optional: true + + '@cbor-extract/cbor-extract-linux-arm@2.2.0': + optional: true + + '@cbor-extract/cbor-extract-linux-x64@2.2.0': + optional: true + + '@cbor-extract/cbor-extract-win32-x64@2.2.0': + optional: true + '@changesets/apply-release-plan@7.0.12': dependencies: '@changesets/config': 3.1.1 @@ -9406,8 +9388,6 @@ snapshots: dependencies: '@jridgewell/trace-mapping': 0.3.9 - '@cto.af/wtf8@0.0.2': {} - '@digitalbazaar/bitstring@3.1.0': dependencies: base64url-universal: 2.0.0 @@ -10050,7 +10030,7 @@ snapshots: dependencies: lodash.camelcase: 4.3.0 long: 5.3.2 - protobufjs: 7.2.5 + protobufjs: 7.5.3 yargs: 17.7.2 '@hapi/bourne@3.0.0': {} @@ -10135,14 +10115,14 @@ snapshots: - react - react-native - '@hiero-did-sdk-js/did@0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': + '@hiero-did-sdk-js/did@0.0.3(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': dependencies: '@hashgraph/sdk': 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) '@hiero-did-sdk-js/client': 0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) '@hiero-did-sdk-js/hcs': 0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) - '@swiss-digital-assets-institute/core': 0.3.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@swiss-digital-assets-institute/registrar': 0.3.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@swiss-digital-assets-institute/resolver': 0.3.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@swiss-digital-assets-institute/core': 0.3.9(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@swiss-digital-assets-institute/registrar': 0.3.9(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@swiss-digital-assets-institute/resolver': 0.3.9(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) transitivePeerDependencies: - bn.js - expo-crypto @@ -10308,11 +10288,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@jest/pattern@30.0.0': - dependencies: - '@types/node': 18.18.8 - jest-regex-util: 30.0.0 - '@jest/reporters@29.7.0': dependencies: '@bcoe/v8-coverage': 0.2.3 @@ -10346,10 +10321,6 @@ snapshots: dependencies: '@sinclair/typebox': 0.27.8 - '@jest/schemas@30.0.0': - dependencies: - '@sinclair/typebox': 0.34.33 - '@jest/source-map@29.6.3': dependencies: '@jridgewell/trace-mapping': 0.3.25 @@ -10390,26 +10361,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@jest/transform@30.0.0': - dependencies: - '@babel/core': 7.27.4 - '@jest/types': 30.0.0 - '@jridgewell/trace-mapping': 0.3.25 - babel-plugin-istanbul: 7.0.0 - chalk: 4.1.2 - convert-source-map: 2.0.0 - fast-json-stable-stringify: 2.1.0 - graceful-fs: 4.2.11 - jest-haste-map: 30.0.0 - jest-regex-util: 30.0.0 - jest-util: 30.0.0 - micromatch: 4.0.8 - pirates: 4.0.7 - slash: 3.0.0 - write-file-atomic: 5.0.1 - transitivePeerDependencies: - - supports-color - '@jest/types@24.9.0': dependencies: '@types/istanbul-lib-coverage': 2.0.6 @@ -10443,16 +10394,6 @@ snapshots: '@types/yargs': 17.0.33 chalk: 4.1.2 - '@jest/types@30.0.0': - dependencies: - '@jest/pattern': 30.0.0 - '@jest/schemas': 30.0.0 - '@types/istanbul-lib-coverage': 2.0.6 - '@types/istanbul-reports': 3.0.4 - '@types/node': 18.18.8 - '@types/yargs': 17.0.33 - chalk: 4.1.2 - '@jridgewell/gen-mapping@0.3.8': dependencies: '@jridgewell/set-array': 1.2.1 @@ -11233,8 +11174,6 @@ snapshots: '@sinclair/typebox@0.27.8': {} - '@sinclair/typebox@0.34.33': {} - '@sindresorhus/is@5.6.0': {} '@sinonjs/commons@3.0.1': @@ -11321,82 +11260,82 @@ snapshots: '@stablelib/wipe@2.0.1': {} - '@swiss-digital-assets-institute/core@0.3.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': + '@swiss-digital-assets-institute/core@0.3.9(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': dependencies: '@hashgraph/sdk': 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) '@scure/base': 1.2.6 - cbor2: 2.0.1 + cbor-x: 1.6.0 transitivePeerDependencies: - bn.js - expo-crypto - react-native - '@swiss-digital-assets-institute/lifecycle@0.3.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': + '@swiss-digital-assets-institute/lifecycle@0.3.9(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': dependencies: - '@swiss-digital-assets-institute/core': 0.3.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@swiss-digital-assets-institute/core': 0.3.9(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) transitivePeerDependencies: - bn.js - expo-crypto - react-native - '@swiss-digital-assets-institute/messages@0.3.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': + '@swiss-digital-assets-institute/messages@0.3.9(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': dependencies: '@hashgraph/sdk': 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@swiss-digital-assets-institute/core': 0.3.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@swiss-digital-assets-institute/lifecycle': 0.3.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@swiss-digital-assets-institute/resolver': 0.3.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@swiss-digital-assets-institute/core': 0.3.9(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@swiss-digital-assets-institute/lifecycle': 0.3.9(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@swiss-digital-assets-institute/resolver': 0.3.9(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) transitivePeerDependencies: - bn.js - expo-crypto - react-native - '@swiss-digital-assets-institute/publisher-internal@0.3.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': + '@swiss-digital-assets-institute/publisher-internal@0.3.9(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': dependencies: '@hashgraph/sdk': 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@swiss-digital-assets-institute/core': 0.3.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@swiss-digital-assets-institute/core': 0.3.9(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) transitivePeerDependencies: - bn.js - expo-crypto - react-native - '@swiss-digital-assets-institute/registrar@0.3.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': + '@swiss-digital-assets-institute/registrar@0.3.9(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': dependencies: '@hashgraph/sdk': 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@swiss-digital-assets-institute/core': 0.3.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@swiss-digital-assets-institute/lifecycle': 0.3.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@swiss-digital-assets-institute/messages': 0.3.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@swiss-digital-assets-institute/publisher-internal': 0.3.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@swiss-digital-assets-institute/resolver': 0.3.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@swiss-digital-assets-institute/signer-internal': 0.3.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@swiss-digital-assets-institute/verifier-internal': 0.3.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@swiss-digital-assets-institute/core': 0.3.9(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@swiss-digital-assets-institute/lifecycle': 0.3.9(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@swiss-digital-assets-institute/messages': 0.3.9(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@swiss-digital-assets-institute/publisher-internal': 0.3.9(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@swiss-digital-assets-institute/resolver': 0.3.9(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@swiss-digital-assets-institute/signer-internal': 0.3.9(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@swiss-digital-assets-institute/verifier-internal': 0.3.9(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) transitivePeerDependencies: - bn.js - expo-crypto - react-native - '@swiss-digital-assets-institute/resolver@0.3.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': + '@swiss-digital-assets-institute/resolver@0.3.9(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': dependencies: '@hashgraph/sdk': 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@swiss-digital-assets-institute/core': 0.3.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@swiss-digital-assets-institute/verifier-internal': 0.3.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@swiss-digital-assets-institute/core': 0.3.9(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@swiss-digital-assets-institute/verifier-internal': 0.3.9(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) transitivePeerDependencies: - bn.js - expo-crypto - react-native - '@swiss-digital-assets-institute/signer-internal@0.3.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': + '@swiss-digital-assets-institute/signer-internal@0.3.9(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': dependencies: '@hashgraph/sdk': 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@swiss-digital-assets-institute/core': 0.3.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@swiss-digital-assets-institute/core': 0.3.9(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) transitivePeerDependencies: - bn.js - expo-crypto - react-native - '@swiss-digital-assets-institute/verifier-internal@0.3.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': + '@swiss-digital-assets-institute/verifier-internal@0.3.9(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': dependencies: '@hashgraph/sdk': 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@swiss-digital-assets-institute/core': 0.3.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@swiss-digital-assets-institute/core': 0.3.9(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) transitivePeerDependencies: - bn.js - expo-crypto @@ -11652,8 +11591,6 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 - '@ungap/structured-clone@1.3.0': {} - '@unimodules/core@7.1.2': dependencies: compare-versions: 3.6.0 @@ -11891,19 +11828,6 @@ snapshots: transitivePeerDependencies: - supports-color - babel-jest@30.0.0(@babel/core@7.27.4): - dependencies: - '@babel/core': 7.27.4 - '@jest/transform': 30.0.0 - '@types/babel__core': 7.20.5 - babel-plugin-istanbul: 7.0.0 - babel-preset-jest: 30.0.0(@babel/core@7.27.4) - chalk: 4.1.2 - graceful-fs: 4.2.11 - slash: 3.0.0 - transitivePeerDependencies: - - supports-color - babel-plugin-istanbul@6.1.1: dependencies: '@babel/helper-plugin-utils': 7.27.1 @@ -11914,16 +11838,6 @@ snapshots: transitivePeerDependencies: - supports-color - babel-plugin-istanbul@7.0.0: - dependencies: - '@babel/helper-plugin-utils': 7.27.1 - '@istanbuljs/load-nyc-config': 1.1.0 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-instrument: 6.0.3 - test-exclude: 6.0.0 - transitivePeerDependencies: - - supports-color - babel-plugin-jest-hoist@29.6.3: dependencies: '@babel/template': 7.27.2 @@ -11931,12 +11845,6 @@ snapshots: '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.20.7 - babel-plugin-jest-hoist@30.0.0: - dependencies: - '@babel/template': 7.27.2 - '@babel/types': 7.27.6 - '@types/babel__core': 7.20.5 - babel-plugin-polyfill-corejs2@0.4.13(@babel/core@7.27.4): dependencies: '@babel/compat-data': 7.27.5 @@ -12062,12 +11970,6 @@ snapshots: babel-plugin-jest-hoist: 29.6.3 babel-preset-current-node-syntax: 1.1.0(@babel/core@7.27.4) - babel-preset-jest@30.0.0(@babel/core@7.27.4): - dependencies: - '@babel/core': 7.27.4 - babel-plugin-jest-hoist: 30.0.0 - babel-preset-current-node-syntax: 1.1.0(@babel/core@7.27.4) - balanced-match@1.0.2: {} base-64@0.1.0: {} @@ -12281,9 +12183,21 @@ snapshots: canonicalize@2.1.0: {} - cbor2@2.0.1: + cbor-extract@2.2.0: dependencies: - '@cto.af/wtf8': 0.0.2 + node-gyp-build-optional-packages: 5.1.1 + optionalDependencies: + '@cbor-extract/cbor-extract-darwin-arm64': 2.2.0 + '@cbor-extract/cbor-extract-darwin-x64': 2.2.0 + '@cbor-extract/cbor-extract-linux-arm': 2.2.0 + '@cbor-extract/cbor-extract-linux-arm64': 2.2.0 + '@cbor-extract/cbor-extract-linux-x64': 2.2.0 + '@cbor-extract/cbor-extract-win32-x64': 2.2.0 + optional: true + + cbor-x@1.6.0: + optionalDependencies: + cbor-extract: 2.2.0 chalk@2.4.2: dependencies: @@ -12332,8 +12246,6 @@ snapshots: ci-info@3.9.0: {} - ci-info@4.2.0: {} - cjs-module-lexer@1.4.3: {} class-transformer@0.5.1: {} @@ -14167,21 +14079,6 @@ snapshots: optionalDependencies: fsevents: 2.3.3 - jest-haste-map@30.0.0: - dependencies: - '@jest/types': 30.0.0 - '@types/node': 18.18.8 - anymatch: 3.1.3 - fb-watchman: 2.0.2 - graceful-fs: 4.2.11 - jest-regex-util: 30.0.0 - jest-util: 30.0.0 - jest-worker: 30.0.0 - micromatch: 4.0.8 - walker: 1.0.8 - optionalDependencies: - fsevents: 2.3.3 - jest-leak-detector@29.7.0: dependencies: jest-get-type: 29.6.3 @@ -14221,8 +14118,6 @@ snapshots: jest-regex-util@29.6.3: {} - jest-regex-util@30.0.0: {} - jest-resolve-dependencies@29.7.0: dependencies: jest-regex-util: 29.6.3 @@ -14345,15 +14240,6 @@ snapshots: graceful-fs: 4.2.11 picomatch: 2.3.1 - jest-util@30.0.0: - dependencies: - '@jest/types': 30.0.0 - '@types/node': 18.18.8 - chalk: 4.1.2 - ci-info: 4.2.0 - graceful-fs: 4.2.11 - picomatch: 4.0.2 - jest-validate@26.6.2: dependencies: '@jest/types': 26.6.2 @@ -14398,14 +14284,6 @@ snapshots: merge-stream: 2.0.0 supports-color: 8.1.1 - jest-worker@30.0.0: - dependencies: - '@types/node': 18.18.8 - '@ungap/structured-clone': 1.3.0 - jest-util: 30.0.0 - merge-stream: 2.0.0 - supports-color: 8.1.1 - jest@29.7.0(@types/node@18.18.8)(ts-node@10.9.2(@types/node@18.18.8)(typescript@5.5.4)): dependencies: '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@18.18.8)(typescript@5.5.4)) @@ -15462,6 +15340,11 @@ snapshots: node-forge@1.3.1: {} + node-gyp-build-optional-packages@5.1.1: + dependencies: + detect-libc: 2.0.4 + optional: true + node-gyp-build@4.8.4: {} node-int64@0.4.0: {} @@ -15739,8 +15622,6 @@ snapshots: picomatch@3.0.1: {} - picomatch@4.0.2: {} - pify@4.0.1: {} pino-abstract-transport@2.0.0: @@ -16882,7 +16763,7 @@ snapshots: ts-interface-checker@0.1.13: {} - ts-jest@29.3.4(@babel/core@7.27.4)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@30.0.0(@babel/core@7.27.4))(jest@29.7.0(@types/node@18.18.8)(ts-node@10.9.2(@types/node@18.18.8)(typescript@5.5.4)))(typescript@5.5.4): + ts-jest@29.3.4(@babel/core@7.27.4)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.27.4))(jest@29.7.0(@types/node@18.18.8)(ts-node@10.9.2(@types/node@18.18.8)(typescript@5.5.4)))(typescript@5.5.4): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 @@ -16900,7 +16781,7 @@ snapshots: '@babel/core': 7.27.4 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - babel-jest: 30.0.0(@babel/core@7.27.4) + babel-jest: 29.7.0(@babel/core@7.27.4) ts-node@10.9.2(@types/node@18.18.8)(typescript@5.5.4): dependencies: From 2499b0e8372c18c47c3210f8b5217902b336f160 Mon Sep 17 00:00:00 2001 From: "andrey.kononov" Date: Mon, 16 Jun 2025 22:37:04 +0300 Subject: [PATCH 04/89] Fix revocation status list issues for CredoTS --- packages/hedera/package.json | 2 +- .../tests/HederaAnoncredsRegistry.e2e.test.ts | 6 +- .../hedera/tests/HederaW3cFlow.e2e.test.ts | 19 +++++- packages/hedera/tests/utils/hederaModule.ts | 4 +- packages/hedera/tests/utils/index.ts | 2 +- .../tests/utils/testTailsFileService.ts | 62 +++++++++++++++++++ pnpm-lock.yaml | 10 +-- 7 files changed, 91 insertions(+), 14 deletions(-) create mode 100644 packages/hedera/tests/utils/testTailsFileService.ts diff --git a/packages/hedera/package.json b/packages/hedera/package.json index cf641ca229..c5813b281b 100644 --- a/packages/hedera/package.json +++ b/packages/hedera/package.json @@ -24,7 +24,7 @@ "dependencies": { "@credo-ts/anoncreds": "workspace:*", "@credo-ts/core": "workspace:*", - "@hiero-did-sdk-js/anoncreds": "npm:@hiero-did-sdk-js/anoncreds@0.0.1", + "@hiero-did-sdk-js/anoncreds": "npm:@hiero-did-sdk-js/anoncreds@0.0.5", "@hiero-did-sdk-js/did": "npm:@hiero-did-sdk-js/did@0.0.3" }, "devDependencies": { diff --git a/packages/hedera/tests/HederaAnoncredsRegistry.e2e.test.ts b/packages/hedera/tests/HederaAnoncredsRegistry.e2e.test.ts index 0524f6c2b0..bad119056b 100644 --- a/packages/hedera/tests/HederaAnoncredsRegistry.e2e.test.ts +++ b/packages/hedera/tests/HederaAnoncredsRegistry.e2e.test.ts @@ -123,7 +123,7 @@ describe('Hedera AnonCreds support', () => { // Resolve the revocation status list const revocationStatusListResponse = await agent.modules.anoncreds.getRevocationStatusList( revocationRegistryDefinitionId, - Date.now() + Date.now() / 1000 ) logger.debug('revocationStatusListResponse', [revocationStatusListResponse]) @@ -152,7 +152,7 @@ describe('Hedera AnonCreds support', () => { // Resolve the revocation status list const revokeRevocationStatusListResponse = await agent.modules.anoncreds.getRevocationStatusList( revocationRegistryDefinitionId, - Date.now() + Date.now() / 1000 ) logger.debug('revokeRevocationStatusListResponse', [revokeRevocationStatusListResponse]) expect(revokeRevocationStatusListResponse?.revocationStatusList?.revRegDefId).toEqual( @@ -182,7 +182,7 @@ describe('Hedera AnonCreds support', () => { // Resolve the revocation status list const issueRevocationStatusListResponse = await agent.modules.anoncreds.getRevocationStatusList( revocationRegistryDefinitionId, - Date.now() + Date.now() / 1000 ) logger.debug('issueRevocationStatusListResponse', [issueRevocationStatusListResponse]) expect(issueRevocationStatusListResponse?.revocationStatusList?.revRegDefId).toEqual( diff --git a/packages/hedera/tests/HederaW3cFlow.e2e.test.ts b/packages/hedera/tests/HederaW3cFlow.e2e.test.ts index 1c4da8a8c8..af17c4481f 100644 --- a/packages/hedera/tests/HederaW3cFlow.e2e.test.ts +++ b/packages/hedera/tests/HederaW3cFlow.e2e.test.ts @@ -22,9 +22,11 @@ const { purposes } = jsonldSignatures const logger = new ConsoleLogger(LogLevel.error) -// const did = 'did:hedera:testnet:zQDui45JN8tAZyc8aNcgcDp26wPJgVyQnw1wupqaqexKGWgsuMVfgzKmGfyg8fWPt_0.0.5139447' +//let did: string +//const did = 'did:hedera:testnet:zQDui45JN8tAZyc8aNcgcDp26wPJgVyQnw1wupqaqexKGWgsuMVfgzKmGfyg8fWPt_0.0.5139447' const did = 'did:hedera:testnet:zGdjMu1hPkjbJXSPPp6RgTptnpYYM9uEkPeNbPhSkXTon_0.0.5139753' -// const seed = '11011000010000111011001100010100' + +const seed = '11011000010000111011001100010100' // const holderSeed = '00000000000000000000000000holder' describe('Hedera Module did resolver', () => { @@ -45,6 +47,19 @@ describe('Hedera Module did resolver', () => { label: 'faber', }) await faberAgent.initialize() + + // // Making the test did + // const didRegistrarResult = await faberAgent.dids.create({ + // method: 'hedera', + // secret: { + // seed, + // }, + // }) + // if (!didRegistrarResult.didState?.didDocument?.id) throw new Error('DidRegistrarError') + // + // did = didRegistrarResult.didState.didDocument.id + + }) afterAll(async () => { diff --git a/packages/hedera/tests/utils/hederaModule.ts b/packages/hedera/tests/utils/hederaModule.ts index bcc649cd99..11e482f202 100644 --- a/packages/hedera/tests/utils/hederaModule.ts +++ b/packages/hedera/tests/utils/hederaModule.ts @@ -11,7 +11,7 @@ import { import { agentDependencies } from '@credo-ts/node' import { anoncreds } from '@hyperledger/anoncreds-nodejs' import { askar } from '@openwallet-foundation/askar-nodejs' -import { InMemoryTailsFileService } from './InMemoryTailsFileService' +import { TestTailsFileService } from './testTailsFileService' export const getHederaModuleConfig = (props: { operatorId?: string; operatorKey?: string }) => { const operatorId = props.operatorId ?? process.env.HEDERA_TEST_OPERATOR_ID ?? '' @@ -46,7 +46,7 @@ export const getHederaAgent = (props: { anoncreds: new AnonCredsModule({ anoncreds, registries: [new HederaAnonCredsRegistry()], - tailsFileService: new InMemoryTailsFileService(), + tailsFileService: new TestTailsFileService(), }), dids: new DidsModule({ resolvers: [new HederaDidResolver()], diff --git a/packages/hedera/tests/utils/index.ts b/packages/hedera/tests/utils/index.ts index 1f91d5d2d7..10254fc074 100644 --- a/packages/hedera/tests/utils/index.ts +++ b/packages/hedera/tests/utils/index.ts @@ -1,3 +1,3 @@ export * from './hederaModule' -export * from './InMemoryTailsFileService' +export * from './testTailsFileService' export * from './utils' diff --git a/packages/hedera/tests/utils/testTailsFileService.ts b/packages/hedera/tests/utils/testTailsFileService.ts new file mode 100644 index 0000000000..679567045d --- /dev/null +++ b/packages/hedera/tests/utils/testTailsFileService.ts @@ -0,0 +1,62 @@ +import type { AnonCredsRevocationRegistryDefinition } from '@credo-ts/anoncreds' +import type { AgentContext, FileSystem } from '@credo-ts/core' + +import { InjectionSymbols } from '@credo-ts/core' + +import { BasicTailsFileService } from '@credo-ts/anoncreds' + +export class TestTailsFileService extends BasicTailsFileService { + private tailsFilePaths: Record = {} + + public async uploadTailsFile( + _agentContext: AgentContext, + options: { + revocationRegistryDefinition: AnonCredsRevocationRegistryDefinition + } + ) { + this.tailsFilePaths[options.revocationRegistryDefinition.value.tailsHash] = + options.revocationRegistryDefinition.value.tailsLocation + + return { + tailsFileUrl: options.revocationRegistryDefinition.value.tailsLocation + } + // tailsFileUrl: options.revocationRegistryDefinition.value.tailsLocation.replace(/\\/g, '/') + } + + public async getTailsFile( + agentContext: AgentContext, + options: { + revocationRegistryDefinition: AnonCredsRevocationRegistryDefinition + } + ) { + const { revocationRegistryDefinition } = options + const { tailsLocation, tailsHash } = revocationRegistryDefinition.value + + try { + agentContext.config.logger.debug( + `Checking to see if tails file for URL ${revocationRegistryDefinition.value.tailsLocation} has been stored in the FileSystem` + ) + + // hash is used as file identifier + const tailsExists = await this.tailsFileExists(agentContext, tailsHash) + const tailsFilePath = await this.getTailsFilePath(agentContext, tailsHash) + agentContext.config.logger.debug( + `Tails file for ${tailsLocation} ${tailsExists ? 'is stored' : 'is not stored'} at ${tailsFilePath}` + ) + + if (!tailsExists) { + agentContext.config.logger.debug(`Retrieving tails file from URL ${tailsLocation}`) + const fileSystem = agentContext.dependencyManager.resolve(InjectionSymbols.FileSystem) + await fileSystem.downloadToFile(tailsLocation, tailsFilePath) + agentContext.config.logger.debug(`Saved tails file to FileSystem at path ${tailsFilePath}`) + } + + return { tailsFilePath } + } catch (error) { + agentContext.config.logger.error(`Error while retrieving tails file from URL ${tailsLocation}`, { + error, + }) + throw error + } + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 79a0e215b5..7717def23a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -612,8 +612,8 @@ importers: specifier: workspace:* version: link:../core '@hiero-did-sdk-js/anoncreds': - specifier: npm:@hiero-did-sdk-js/anoncreds@0.0.1 - version: 0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) + specifier: npm:@hiero-did-sdk-js/anoncreds@0.0.5 + version: 0.0.5(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) '@hiero-did-sdk-js/did': specifier: npm:@hiero-did-sdk-js/did@0.0.3 version: 0.0.3(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) @@ -2385,8 +2385,8 @@ packages: peerDependencies: bn.js: ^5.2.1 - '@hiero-did-sdk-js/anoncreds@0.0.1': - resolution: {integrity: sha1-utLHS/EFt+g6Dr6/ji293NG/rxI=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk-js/anoncreds/-/@hiero-did-sdk-js/anoncreds-0.0.1.tgz} + '@hiero-did-sdk-js/anoncreds@0.0.5': + resolution: {integrity: sha1-ImYF1ykjItS9wP9g0ktASEV4Ikw=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk-js/anoncreds/-/@hiero-did-sdk-js/anoncreds-0.0.5.tgz} '@hiero-did-sdk-js/client@0.0.1': resolution: {integrity: sha1-/oGgr/tiFidqMYdCFaFGHaIa8s0=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk-js/client/-/@hiero-did-sdk-js/client-0.0.1.tgz} @@ -10088,7 +10088,7 @@ snapshots: - expo-crypto - react-native - '@hiero-did-sdk-js/anoncreds@0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': + '@hiero-did-sdk-js/anoncreds@0.0.5(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': dependencies: '@hiero-did-sdk-js/hcs': 0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) '@hiero-did-sdk-js/zstd': 0.0.1(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) From 568d41dfbf065fd54925ede417a4714a30bd5572 Mon Sep 17 00:00:00 2001 From: "andrey.kononov" Date: Tue, 17 Jun 2025 18:21:46 +0300 Subject: [PATCH 05/89] Use the new @hiero-did-sdk-js/* --- packages/hedera/package.json | 5 ++- .../src/ledger/HederaLedgerServiceCache.ts | 17 ++++--- pnpm-lock.yaml | 45 ++++++++++++------- 3 files changed, 43 insertions(+), 24 deletions(-) diff --git a/packages/hedera/package.json b/packages/hedera/package.json index c5813b281b..b8e05cd779 100644 --- a/packages/hedera/package.json +++ b/packages/hedera/package.json @@ -24,8 +24,9 @@ "dependencies": { "@credo-ts/anoncreds": "workspace:*", "@credo-ts/core": "workspace:*", - "@hiero-did-sdk-js/anoncreds": "npm:@hiero-did-sdk-js/anoncreds@0.0.5", - "@hiero-did-sdk-js/did": "npm:@hiero-did-sdk-js/did@0.0.3" + "@hiero-did-sdk-js/anoncreds": "npm:@hiero-did-sdk-js/anoncreds@0.0.6", + "@hiero-did-sdk-js/did": "npm:@hiero-did-sdk-js/did@0.0.4", + "@hiero-did-sdk-js/core": "npm:@hiero-did-sdk-js/core@0.0.1" }, "devDependencies": { "@credo-ts/node": "workspace:*", diff --git a/packages/hedera/src/ledger/HederaLedgerServiceCache.ts b/packages/hedera/src/ledger/HederaLedgerServiceCache.ts index 2fd6f326c8..ee77b02886 100644 --- a/packages/hedera/src/ledger/HederaLedgerServiceCache.ts +++ b/packages/hedera/src/ledger/HederaLedgerServiceCache.ts @@ -1,4 +1,5 @@ import { AgentContext, CacheModuleConfig, CredoError } from '@credo-ts/core' +import {Cache} from "@hiero-did-sdk-js/core"; export interface CredoCache { get(agentContext: AgentContext, key: string): Promise @@ -6,13 +7,7 @@ export interface CredoCache { remove(agentContext: AgentContext, key: string): Promise } -interface SdkCache { - get(key: string): Promise - set(key: string, value: CacheValue, expiresInSeconds?: number): Promise - remove(key: string): Promise -} - -export class HederaLedgerServiceCache implements SdkCache { +export class HederaLedgerServiceCache implements Cache { private readonly credoCache: CredoCache constructor(private readonly agentContext: AgentContext) { @@ -39,4 +34,12 @@ export class HederaLedgerServiceCache implements SdkCache { } await this.credoCache.remove(this.agentContext, key) } + + cleanup(): Promise { + throw new Error('Method not implemented.'); + } + + cleanupExpired(): Promise { + throw new Error('Method not implemented.'); + } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7717def23a..949c546f2f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -612,11 +612,14 @@ importers: specifier: workspace:* version: link:../core '@hiero-did-sdk-js/anoncreds': - specifier: npm:@hiero-did-sdk-js/anoncreds@0.0.5 - version: 0.0.5(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) + specifier: npm:@hiero-did-sdk-js/anoncreds@0.0.6 + version: 0.0.6(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) + '@hiero-did-sdk-js/core': + specifier: npm:@hiero-did-sdk-js/core@0.0.1 + version: 0.0.1 '@hiero-did-sdk-js/did': - specifier: npm:@hiero-did-sdk-js/did@0.0.3 - version: 0.0.3(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) + specifier: npm:@hiero-did-sdk-js/did@0.0.4 + version: 0.0.4(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) devDependencies: '@credo-ts/node': specifier: workspace:* @@ -2385,20 +2388,26 @@ packages: peerDependencies: bn.js: ^5.2.1 - '@hiero-did-sdk-js/anoncreds@0.0.5': - resolution: {integrity: sha1-ImYF1ykjItS9wP9g0ktASEV4Ikw=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk-js/anoncreds/-/@hiero-did-sdk-js/anoncreds-0.0.5.tgz} + '@hiero-did-sdk-js/anoncreds@0.0.6': + resolution: {integrity: sha1-LuwKoh9Cc6v7PIqyIQ39oai042c=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk-js/anoncreds/-/@hiero-did-sdk-js/anoncreds-0.0.6.tgz} + + '@hiero-did-sdk-js/cache@0.0.1': + resolution: {integrity: sha1-31zSNubUR6fhwq9EA2XuBPN3yS4=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk-js/cache/-/@hiero-did-sdk-js/cache-0.0.1.tgz} '@hiero-did-sdk-js/client@0.0.1': resolution: {integrity: sha1-/oGgr/tiFidqMYdCFaFGHaIa8s0=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk-js/client/-/@hiero-did-sdk-js/client-0.0.1.tgz} + '@hiero-did-sdk-js/core@0.0.1': + resolution: {integrity: sha1-Fnt+yGBWcjXk1BR6/qG7pwwF0no=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk-js/core/-/@hiero-did-sdk-js/core-0.0.1.tgz} + '@hiero-did-sdk-js/crypto@0.0.1': resolution: {integrity: sha1-boXa93x8ubg3r87M75kulcK7HWI=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk-js/crypto/-/@hiero-did-sdk-js/crypto-0.0.1.tgz} - '@hiero-did-sdk-js/did@0.0.3': - resolution: {integrity: sha1-nGv0l/2JjkG9E9e020diF8E6scM=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk-js/did/-/@hiero-did-sdk-js/did-0.0.3.tgz} + '@hiero-did-sdk-js/did@0.0.4': + resolution: {integrity: sha1-Fdqx1OmzOMO4VVkrqpubLsu7tiU=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk-js/did/-/@hiero-did-sdk-js/did-0.0.4.tgz} - '@hiero-did-sdk-js/hcs@0.0.1': - resolution: {integrity: sha1-/uBmj1cfxYgU+8TJPiajk7y3fNM=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk-js/hcs/-/@hiero-did-sdk-js/hcs-0.0.1.tgz} + '@hiero-did-sdk-js/hcs@0.0.2': + resolution: {integrity: sha1-agCGmMRUExHQY2wF4g2gyPJVoY4=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk-js/hcs/-/@hiero-did-sdk-js/hcs-0.0.2.tgz} '@hiero-did-sdk-js/zstd@0.0.1': resolution: {integrity: sha1-CNd96vi2XFIyLgcJCjLMd1SjPZE=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk-js/zstd/-/@hiero-did-sdk-js/zstd-0.0.1.tgz} @@ -10088,9 +10097,9 @@ snapshots: - expo-crypto - react-native - '@hiero-did-sdk-js/anoncreds@0.0.5(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': + '@hiero-did-sdk-js/anoncreds@0.0.6(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': dependencies: - '@hiero-did-sdk-js/hcs': 0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) + '@hiero-did-sdk-js/hcs': 0.0.2(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) '@hiero-did-sdk-js/zstd': 0.0.1(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) transitivePeerDependencies: - bn.js @@ -10098,6 +10107,8 @@ snapshots: - react - react-native + '@hiero-did-sdk-js/cache@0.0.1': {} + '@hiero-did-sdk-js/client@0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': dependencies: '@hashgraph/sdk': 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) @@ -10106,6 +10117,8 @@ snapshots: - expo-crypto - react-native + '@hiero-did-sdk-js/core@0.0.1': {} + '@hiero-did-sdk-js/crypto@0.0.1(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': dependencies: crypto: 1.0.1 @@ -10115,11 +10128,11 @@ snapshots: - react - react-native - '@hiero-did-sdk-js/did@0.0.3(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': + '@hiero-did-sdk-js/did@0.0.4(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': dependencies: '@hashgraph/sdk': 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) '@hiero-did-sdk-js/client': 0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk-js/hcs': 0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) + '@hiero-did-sdk-js/hcs': 0.0.2(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) '@swiss-digital-assets-institute/core': 0.3.9(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) '@swiss-digital-assets-institute/registrar': 0.3.9(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) '@swiss-digital-assets-institute/resolver': 0.3.9(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) @@ -10129,10 +10142,12 @@ snapshots: - react - react-native - '@hiero-did-sdk-js/hcs@0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': + '@hiero-did-sdk-js/hcs@0.0.2(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': dependencies: '@hashgraph/sdk': 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk-js/cache': 0.0.1 '@hiero-did-sdk-js/client': 0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk-js/core': 0.0.1 '@hiero-did-sdk-js/crypto': 0.0.1(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) '@hiero-did-sdk-js/zstd': 0.0.1(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) transitivePeerDependencies: From 0f4dd6cc969d23d857db57523b5eec86354f4a13 Mon Sep 17 00:00:00 2001 From: "andrey.kononov" Date: Wed, 18 Jun 2025 13:01:13 +0300 Subject: [PATCH 06/89] Biome fixes --- packages/hedera/jest.config.ts | 2 +- packages/hedera/package.json | 2 +- packages/hedera/src/HederaModule.ts | 2 +- .../src/anoncreds/HederaAnonCredsRegistry.ts | 2 +- .../hedera/src/dids/HederaDidRegistrar.ts | 2 +- packages/hedera/src/dids/HederaDidResolver.ts | 2 +- .../hedera/src/ledger/HederaLedgerService.ts | 4 +-- .../src/ledger/HederaLedgerServiceCache.ts | 6 ++-- packages/hedera/tests/HederaDid.e2e.test.ts | 4 +-- .../hedera/tests/HederaW3cFlow.e2e.test.ts | 4 +-- .../tests/utils/testTailsFileService.ts | 2 +- pnpm-lock.yaml | 29 +++++++++++++++---- 12 files changed, 36 insertions(+), 25 deletions(-) diff --git a/packages/hedera/jest.config.ts b/packages/hedera/jest.config.ts index b594a3aaf4..9192efbeeb 100644 --- a/packages/hedera/jest.config.ts +++ b/packages/hedera/jest.config.ts @@ -7,7 +7,7 @@ import packageJson from './package.json' const config: Config.InitialOptions = { ...base, testTimeout: 1200000, - displayName: packageJson.name + displayName: packageJson.name, } export default config diff --git a/packages/hedera/package.json b/packages/hedera/package.json index b8e05cd779..12e6d10bd5 100644 --- a/packages/hedera/package.json +++ b/packages/hedera/package.json @@ -24,7 +24,7 @@ "dependencies": { "@credo-ts/anoncreds": "workspace:*", "@credo-ts/core": "workspace:*", - "@hiero-did-sdk-js/anoncreds": "npm:@hiero-did-sdk-js/anoncreds@0.0.6", + "@hiero-did-sdk-js/anoncreds": "npm:@hiero-did-sdk-js/anoncreds@0.0.7", "@hiero-did-sdk-js/did": "npm:@hiero-did-sdk-js/did@0.0.4", "@hiero-did-sdk-js/core": "npm:@hiero-did-sdk-js/core@0.0.1" }, diff --git a/packages/hedera/src/HederaModule.ts b/packages/hedera/src/HederaModule.ts index 773791a366..c3ce218400 100644 --- a/packages/hedera/src/HederaModule.ts +++ b/packages/hedera/src/HederaModule.ts @@ -3,7 +3,7 @@ import { DependencyManager, Module } from '@credo-ts/core' import { AgentConfig, Buffer } from '@credo-ts/core' import { HederaModuleConfig, HederaModuleConfigOptions } from './HederaModuleConfig' -import {HederaLedgerService} from "./ledger/HederaLedgerService"; +import { HederaLedgerService } from './ledger/HederaLedgerService' export class HederaModule implements Module { public readonly config: HederaModuleConfig diff --git a/packages/hedera/src/anoncreds/HederaAnonCredsRegistry.ts b/packages/hedera/src/anoncreds/HederaAnonCredsRegistry.ts index 76ae86ecba..669508d2b9 100644 --- a/packages/hedera/src/anoncreds/HederaAnonCredsRegistry.ts +++ b/packages/hedera/src/anoncreds/HederaAnonCredsRegistry.ts @@ -14,7 +14,7 @@ import type { RegisterSchemaReturn, } from '@credo-ts/anoncreds' import type { AgentContext } from '@credo-ts/core' -import {HederaLedgerService} from "../ledger/HederaLedgerService"; +import { HederaLedgerService } from '../ledger/HederaLedgerService' export class HederaAnonCredsRegistry implements AnonCredsRegistry { public readonly methodName = 'hedera' diff --git a/packages/hedera/src/dids/HederaDidRegistrar.ts b/packages/hedera/src/dids/HederaDidRegistrar.ts index e1a21a6c97..fc4d179c95 100644 --- a/packages/hedera/src/dids/HederaDidRegistrar.ts +++ b/packages/hedera/src/dids/HederaDidRegistrar.ts @@ -13,7 +13,7 @@ import { DidUpdateOptions, DidUpdateResult, } from '@credo-ts/core' -import {HederaLedgerService} from "../ledger/HederaLedgerService"; +import { HederaLedgerService } from '../ledger/HederaLedgerService' export class HederaDidRegistrar implements DidRegistrar { public readonly supportedMethods = ['hedera'] diff --git a/packages/hedera/src/dids/HederaDidResolver.ts b/packages/hedera/src/dids/HederaDidResolver.ts index 2bf1d2533d..7a231f6f81 100644 --- a/packages/hedera/src/dids/HederaDidResolver.ts +++ b/packages/hedera/src/dids/HederaDidResolver.ts @@ -7,7 +7,7 @@ import { JsonTransformer, type ParsedDid, } from '@credo-ts/core' -import {HederaLedgerService} from "../ledger/HederaLedgerService"; +import { HederaLedgerService } from '../ledger/HederaLedgerService' export class HederaDidResolver implements DidResolver { public readonly supportedMethods = ['hedera'] diff --git a/packages/hedera/src/ledger/HederaLedgerService.ts b/packages/hedera/src/ledger/HederaLedgerService.ts index fd4ec364d6..b8e3150ce1 100644 --- a/packages/hedera/src/ledger/HederaLedgerService.ts +++ b/packages/hedera/src/ledger/HederaLedgerService.ts @@ -6,9 +6,7 @@ import { HederaLedgerServiceCache } from './HederaLedgerServiceCache' @injectable() export class HederaLedgerService { - public constructor(private readonly hederaModuleConfig: HederaModuleConfig) { - console.log('HederaLedgerService', hederaModuleConfig) - } + public constructor(private readonly hederaModuleConfig: HederaModuleConfig) {} public getHederaAnonCredsSdk(agentContext: AgentContext): HederaAnoncredsRegistry { const cache = this.hederaModuleConfig.options.cache ?? new HederaLedgerServiceCache(agentContext) diff --git a/packages/hedera/src/ledger/HederaLedgerServiceCache.ts b/packages/hedera/src/ledger/HederaLedgerServiceCache.ts index ee77b02886..ff4e8fbb35 100644 --- a/packages/hedera/src/ledger/HederaLedgerServiceCache.ts +++ b/packages/hedera/src/ledger/HederaLedgerServiceCache.ts @@ -1,5 +1,5 @@ import { AgentContext, CacheModuleConfig, CredoError } from '@credo-ts/core' -import {Cache} from "@hiero-did-sdk-js/core"; +import { Cache } from '@hiero-did-sdk-js/core' export interface CredoCache { get(agentContext: AgentContext, key: string): Promise @@ -36,10 +36,10 @@ export class HederaLedgerServiceCache implements Cache { } cleanup(): Promise { - throw new Error('Method not implemented.'); + throw new Error('Method not implemented.') } cleanupExpired(): Promise { - throw new Error('Method not implemented.'); + throw new Error('Method not implemented.') } } diff --git a/packages/hedera/tests/HederaDid.e2e.test.ts b/packages/hedera/tests/HederaDid.e2e.test.ts index c7856cf3d8..597c61bf70 100644 --- a/packages/hedera/tests/HederaDid.e2e.test.ts +++ b/packages/hedera/tests/HederaDid.e2e.test.ts @@ -27,12 +27,10 @@ describe('Hedera Module did resolver', () => { describe('HederaDidResolver', () => { it('should creaste and resolve a hedera did', async () => { - const didResult = await agent.dids.create({method: 'hedera'}) + const didResult = await agent.dids.create({ method: 'hedera' }) await waitTimeout(2000) const resolvedDIDDoc = await agent.dids.resolve(didResult.didState.did ?? '') expect(resolvedDIDDoc.didDocument?.id).toEqual(didResult.didState.did) }) }) }) - - diff --git a/packages/hedera/tests/HederaW3cFlow.e2e.test.ts b/packages/hedera/tests/HederaW3cFlow.e2e.test.ts index af17c4481f..e4e217b2cf 100644 --- a/packages/hedera/tests/HederaW3cFlow.e2e.test.ts +++ b/packages/hedera/tests/HederaW3cFlow.e2e.test.ts @@ -26,7 +26,7 @@ const logger = new ConsoleLogger(LogLevel.error) //const did = 'did:hedera:testnet:zQDui45JN8tAZyc8aNcgcDp26wPJgVyQnw1wupqaqexKGWgsuMVfgzKmGfyg8fWPt_0.0.5139447' const did = 'did:hedera:testnet:zGdjMu1hPkjbJXSPPp6RgTptnpYYM9uEkPeNbPhSkXTon_0.0.5139753' -const seed = '11011000010000111011001100010100' +const _seed = '11011000010000111011001100010100' // const holderSeed = '00000000000000000000000000holder' describe('Hedera Module did resolver', () => { @@ -58,8 +58,6 @@ describe('Hedera Module did resolver', () => { // if (!didRegistrarResult.didState?.didDocument?.id) throw new Error('DidRegistrarError') // // did = didRegistrarResult.didState.didDocument.id - - }) afterAll(async () => { diff --git a/packages/hedera/tests/utils/testTailsFileService.ts b/packages/hedera/tests/utils/testTailsFileService.ts index 679567045d..ee3672de6a 100644 --- a/packages/hedera/tests/utils/testTailsFileService.ts +++ b/packages/hedera/tests/utils/testTailsFileService.ts @@ -18,7 +18,7 @@ export class TestTailsFileService extends BasicTailsFileService { options.revocationRegistryDefinition.value.tailsLocation return { - tailsFileUrl: options.revocationRegistryDefinition.value.tailsLocation + tailsFileUrl: options.revocationRegistryDefinition.value.tailsLocation, } // tailsFileUrl: options.revocationRegistryDefinition.value.tailsLocation.replace(/\\/g, '/') } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 949c546f2f..d4c7a52cbf 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -612,8 +612,8 @@ importers: specifier: workspace:* version: link:../core '@hiero-did-sdk-js/anoncreds': - specifier: npm:@hiero-did-sdk-js/anoncreds@0.0.6 - version: 0.0.6(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) + specifier: npm:@hiero-did-sdk-js/anoncreds@0.0.7 + version: 0.0.7(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) '@hiero-did-sdk-js/core': specifier: npm:@hiero-did-sdk-js/core@0.0.1 version: 0.0.1 @@ -2388,8 +2388,8 @@ packages: peerDependencies: bn.js: ^5.2.1 - '@hiero-did-sdk-js/anoncreds@0.0.6': - resolution: {integrity: sha1-LuwKoh9Cc6v7PIqyIQ39oai042c=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk-js/anoncreds/-/@hiero-did-sdk-js/anoncreds-0.0.6.tgz} + '@hiero-did-sdk-js/anoncreds@0.0.7': + resolution: {integrity: sha1-+WpUCRjrfYOUfH2pXE0hE4SQTgs=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk-js/anoncreds/-/@hiero-did-sdk-js/anoncreds-0.0.7.tgz} '@hiero-did-sdk-js/cache@0.0.1': resolution: {integrity: sha1-31zSNubUR6fhwq9EA2XuBPN3yS4=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk-js/cache/-/@hiero-did-sdk-js/cache-0.0.1.tgz} @@ -2409,6 +2409,9 @@ packages: '@hiero-did-sdk-js/hcs@0.0.2': resolution: {integrity: sha1-agCGmMRUExHQY2wF4g2gyPJVoY4=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk-js/hcs/-/@hiero-did-sdk-js/hcs-0.0.2.tgz} + '@hiero-did-sdk-js/hcs@0.0.3': + resolution: {integrity: sha1-9dUfNxCc5XFAM6I2GfBjHTIvjEQ=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk-js/hcs/-/@hiero-did-sdk-js/hcs-0.0.3.tgz} + '@hiero-did-sdk-js/zstd@0.0.1': resolution: {integrity: sha1-CNd96vi2XFIyLgcJCjLMd1SjPZE=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk-js/zstd/-/@hiero-did-sdk-js/zstd-0.0.1.tgz} @@ -10097,9 +10100,9 @@ snapshots: - expo-crypto - react-native - '@hiero-did-sdk-js/anoncreds@0.0.6(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': + '@hiero-did-sdk-js/anoncreds@0.0.7(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': dependencies: - '@hiero-did-sdk-js/hcs': 0.0.2(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) + '@hiero-did-sdk-js/hcs': 0.0.3(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) '@hiero-did-sdk-js/zstd': 0.0.1(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) transitivePeerDependencies: - bn.js @@ -10156,6 +10159,20 @@ snapshots: - react - react-native + '@hiero-did-sdk-js/hcs@0.0.3(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': + dependencies: + '@hashgraph/sdk': 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk-js/cache': 0.0.1 + '@hiero-did-sdk-js/client': 0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk-js/core': 0.0.1 + '@hiero-did-sdk-js/crypto': 0.0.1(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) + '@hiero-did-sdk-js/zstd': 0.0.1(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) + transitivePeerDependencies: + - bn.js + - expo-crypto + - react + - react-native + '@hiero-did-sdk-js/zstd@0.0.1(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': dependencies: react-native-zstd: 1.1.0(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) From b26903e30871be3bd027e18efabaf55bb49ce636 Mon Sep 17 00:00:00 2001 From: "andrey.kononov" Date: Thu, 19 Jun 2025 22:24:50 +0300 Subject: [PATCH 07/89] Implement HederaLedgerService methods the new hiero-did-sdk using Implement DidRegistar methods Implement DidResolver method --- jest.config.base.ts | 2 +- package.json | 7 +- packages/action-menu/package.json | 4 +- packages/anoncreds/package.json | 4 +- packages/askar/package.json | 4 +- packages/cheqd/package.json | 4 +- packages/core/package.json | 4 +- packages/didcomm/package.json | 4 +- packages/drpc/package.json | 4 +- packages/hedera/package.json | 10 +- packages/hedera/src/HederaModuleConfig.ts | 2 +- .../src/anoncreds/HederaAnonCredsRegistry.ts | 40 +-- .../CredoCache.ts} | 8 +- .../hedera/src/dids/HederaDidRegistrar.ts | 165 +++++++-- packages/hedera/src/dids/HederaDidResolver.ts | 33 +- .../hedera/src/ledger/HederaLedgerService.ts | 161 ++++++++- .../indy-sdk-to-askar-migration/package.json | 4 +- packages/indy-vdr/package.json | 4 +- packages/node/package.json | 4 +- packages/openid4vc/package.json | 4 +- packages/question-answer/package.json | 4 +- packages/react-native/package.json | 4 +- packages/redis-cache/package.json | 4 +- packages/tenants/package.json | 4 +- pnpm-lock.yaml | 329 +++++++++--------- 25 files changed, 520 insertions(+), 297 deletions(-) rename packages/hedera/src/{ledger/HederaLedgerServiceCache.ts => cache/CredoCache.ts} (88%) diff --git a/jest.config.base.ts b/jest.config.base.ts index 79f2467b61..43b6b40302 100644 --- a/jest.config.base.ts +++ b/jest.config.base.ts @@ -15,7 +15,7 @@ const config: Config.InitialOptions = { { isolatedModules: true, }, - ] + ], }, } diff --git a/package.json b/package.json index 82f09e7f2e..29267b97c0 100644 --- a/package.json +++ b/package.json @@ -2,12 +2,7 @@ "name": "credo-ts", "private": true, "license": "Apache-2.0", - "workspaces": [ - "packages/*", - "demo", - "demo-openid", - "samples/*" - ], + "workspaces": ["packages/*", "demo", "demo-openid", "samples/*"], "packageManager": "pnpm@9.15.3+sha512.1f79bc245a66eb0b07c5d4d83131240774642caaa86ef7d0434ab47c0d16f66b04e21e0c086eb61e62c77efc4d7f7ec071afad3796af64892fae66509173893a", "repository": { "url": "https://github.com/openwallet-foundation/credo-ts", diff --git a/packages/action-menu/package.json b/packages/action-menu/package.json index 97ccd8bac5..81c9d659b2 100644 --- a/packages/action-menu/package.json +++ b/packages/action-menu/package.json @@ -3,9 +3,7 @@ "main": "src/index", "types": "src/index", "version": "0.5.13", - "files": [ - "build" - ], + "files": ["build"], "license": "Apache-2.0", "publishConfig": { "main": "build/index", diff --git a/packages/anoncreds/package.json b/packages/anoncreds/package.json index d1a1411961..9d3bc0d6e0 100644 --- a/packages/anoncreds/package.json +++ b/packages/anoncreds/package.json @@ -3,9 +3,7 @@ "main": "src/index", "types": "src/index", "version": "0.5.13", - "files": [ - "build" - ], + "files": ["build"], "license": "Apache-2.0", "publishConfig": { "main": "build/index", diff --git a/packages/askar/package.json b/packages/askar/package.json index 68e5cc4245..2545d7bc12 100644 --- a/packages/askar/package.json +++ b/packages/askar/package.json @@ -3,9 +3,7 @@ "main": "src/index", "types": "src/index", "version": "0.5.13", - "files": [ - "build" - ], + "files": ["build"], "license": "Apache-2.0", "publishConfig": { "main": "build/index", diff --git a/packages/cheqd/package.json b/packages/cheqd/package.json index 9fc8f5cf06..cb22efa3bb 100644 --- a/packages/cheqd/package.json +++ b/packages/cheqd/package.json @@ -3,9 +3,7 @@ "main": "src/index", "types": "src/index", "version": "0.5.13", - "files": [ - "build" - ], + "files": ["build"], "license": "Apache-2.0", "publishConfig": { "main": "build/index", diff --git a/packages/core/package.json b/packages/core/package.json index 6afd159c23..9eb6a82d4d 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -3,9 +3,7 @@ "main": "src/index", "types": "src/index", "version": "0.5.13", - "files": [ - "build" - ], + "files": ["build"], "license": "Apache-2.0", "publishConfig": { "main": "build/index", diff --git a/packages/didcomm/package.json b/packages/didcomm/package.json index 0a716f9954..876d56b588 100644 --- a/packages/didcomm/package.json +++ b/packages/didcomm/package.json @@ -3,9 +3,7 @@ "main": "src/index", "types": "src/index", "version": "0.5.13", - "files": [ - "build" - ], + "files": ["build"], "license": "Apache-2.0", "publishConfig": { "main": "build/index", diff --git a/packages/drpc/package.json b/packages/drpc/package.json index 13dd1b830b..65fca1b26d 100644 --- a/packages/drpc/package.json +++ b/packages/drpc/package.json @@ -3,9 +3,7 @@ "main": "src/index", "types": "src/index", "version": "0.5.13", - "files": [ - "build" - ], + "files": ["build"], "license": "Apache-2.0", "publishConfig": { "main": "build/index", diff --git a/packages/hedera/package.json b/packages/hedera/package.json index 12e6d10bd5..96f73169d3 100644 --- a/packages/hedera/package.json +++ b/packages/hedera/package.json @@ -22,11 +22,15 @@ "test": "jest" }, "dependencies": { + "@hashgraph/sdk": "^2.66.0", "@credo-ts/anoncreds": "workspace:*", "@credo-ts/core": "workspace:*", - "@hiero-did-sdk-js/anoncreds": "npm:@hiero-did-sdk-js/anoncreds@0.0.7", - "@hiero-did-sdk-js/did": "npm:@hiero-did-sdk-js/did@0.0.4", - "@hiero-did-sdk-js/core": "npm:@hiero-did-sdk-js/core@0.0.1" + "@hiero-did-sdk/anoncreds": "npm:@hiero-did-sdk/anoncreds@0.0.3", + "@hiero-did-sdk/registrar": "npm:@hiero-did-sdk/registrar@0.0.1", + "@hiero-did-sdk/resolver": "npm:@hiero-did-sdk/resolver@0.0.5", + "@hiero-did-sdk/core": "npm:@hiero-did-sdk/core@0.0.1", + "@hiero-did-sdk/client": "npm:@hiero-did-sdk/client@0.0.1", + "@hiero-did-sdk/hcs": "npm:@hiero-did-sdk/hcs@0.0.3" }, "devDependencies": { "@credo-ts/node": "workspace:*", diff --git a/packages/hedera/src/HederaModuleConfig.ts b/packages/hedera/src/HederaModuleConfig.ts index e4a87d6188..4b5aa6fab5 100644 --- a/packages/hedera/src/HederaModuleConfig.ts +++ b/packages/hedera/src/HederaModuleConfig.ts @@ -1,4 +1,4 @@ -import { HederaAnoncredsRegistryConfiguration } from '@hiero-did-sdk-js/anoncreds' +import { HederaAnoncredsRegistryConfiguration } from '@hiero-did-sdk/anoncreds' export interface HederaModuleConfigOptions extends HederaAnoncredsRegistryConfiguration {} diff --git a/packages/hedera/src/anoncreds/HederaAnonCredsRegistry.ts b/packages/hedera/src/anoncreds/HederaAnonCredsRegistry.ts index 669508d2b9..36c2d6f1ef 100644 --- a/packages/hedera/src/anoncreds/HederaAnonCredsRegistry.ts +++ b/packages/hedera/src/anoncreds/HederaAnonCredsRegistry.ts @@ -25,10 +25,9 @@ export class HederaAnonCredsRegistry implements AnonCredsRegistry { options: RegisterSchemaOptions ): Promise { try { - const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) - const sdk = ledgerService.getHederaAnonCredsSdk(agentContext) agentContext.config.logger.trace('Submitting register schema request to ledger') - return await sdk.registerSchema(options) + const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) + return await ledgerService.registerSchema(agentContext, options) } catch (error) { agentContext.config.logger.debug(`Error registering schema for did '${options.schema.issuerId}'`, { error, @@ -49,10 +48,9 @@ export class HederaAnonCredsRegistry implements AnonCredsRegistry { public async getSchema(agentContext: AgentContext, schemaId: string): Promise { try { - const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) - const sdk = ledgerService.getHederaAnonCredsSdk(agentContext) agentContext.config.logger.trace(`Submitting get schema request for schema '${schemaId}' to ledger`) - return await sdk.getSchema(schemaId) + const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) + return await ledgerService.getSchema(agentContext, schemaId) } catch (error) { agentContext.config.logger.error(`Error retrieving schema '${schemaId}'`, { error, @@ -74,10 +72,9 @@ export class HederaAnonCredsRegistry implements AnonCredsRegistry { options: RegisterCredentialDefinitionOptions ): Promise { try { - const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) - const sdk = ledgerService.getHederaAnonCredsSdk(agentContext) agentContext.config.logger.trace('Submitting register credential definition request to ledger') - return await sdk.registerCredentialDefinition(options) + const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) + return await ledgerService.registerCredentialDefinition(agentContext, options) } catch (error) { agentContext.config.logger.error( `Error registering credential definition for did '${options.credentialDefinition.issuerId}'`, @@ -104,12 +101,11 @@ export class HederaAnonCredsRegistry implements AnonCredsRegistry { credentialDefinitionId: string ): Promise { try { - const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) - const sdk = ledgerService.getHederaAnonCredsSdk(agentContext) agentContext.config.logger.trace( `Submitting get credential definition request for '${credentialDefinitionId}' to ledger` ) - return await sdk.getCredentialDefinition(credentialDefinitionId) + const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) + return await ledgerService.getCredentialDefinition(agentContext, credentialDefinitionId) } catch (error) { agentContext.config.logger.error(`Error retrieving credential definition '${credentialDefinitionId}'`, { error, @@ -131,12 +127,11 @@ export class HederaAnonCredsRegistry implements AnonCredsRegistry { options: RegisterRevocationRegistryDefinitionOptions ): Promise { try { - const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) - const sdk = ledgerService.getHederaAnonCredsSdk(agentContext) agentContext.config.logger.trace( `Submitting register revocation registry definition request for '${options.revocationRegistryDefinition.credDefId}' to ledger` ) - return await sdk.registerRevocationRegistryDefinition(options) + const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) + return await ledgerService.registerRevocationRegistryDefinition(agentContext, options) } catch (error) { agentContext.config.logger.error( `Error registering revocation registry definition for did '${options.revocationRegistryDefinition.issuerId}'`, @@ -163,12 +158,11 @@ export class HederaAnonCredsRegistry implements AnonCredsRegistry { revocationRegistryDefinitionId: string ): Promise { try { - const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) - const sdk = ledgerService.getHederaAnonCredsSdk(agentContext) agentContext.config.logger.trace( `Submitting get revocation registry definition request for '${revocationRegistryDefinitionId}' to ledger` ) - return await sdk.getRevocationRegistryDefinition(revocationRegistryDefinitionId) + const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) + return await ledgerService.getRevocationRegistryDefinition(agentContext, revocationRegistryDefinitionId) } catch (error) { agentContext.config.logger.error( `Error retrieving revocation registry definition '${revocationRegistryDefinitionId}'`, @@ -193,12 +187,11 @@ export class HederaAnonCredsRegistry implements AnonCredsRegistry { options: RegisterRevocationStatusListOptions ): Promise { try { - const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) - const sdk = ledgerService.getHederaAnonCredsSdk(agentContext) agentContext.config.logger.trace( `Submitting register revocation status list request for '${options.revocationStatusList.revRegDefId}' to ledger` ) - return await sdk.registerRevocationStatusList(options) + const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) + return await ledgerService.registerRevocationStatusList(agentContext, options) } catch (error) { agentContext.config.logger.error( `Error registering revocation status list for did '${options.revocationStatusList.issuerId}'`, @@ -226,12 +219,11 @@ export class HederaAnonCredsRegistry implements AnonCredsRegistry { timestamp: number ): Promise { try { - const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) - const sdk = ledgerService.getHederaAnonCredsSdk(agentContext) agentContext.config.logger.trace( `Submitting get revocation status request for '${revocationRegistryId}' to ledger` ) - return await sdk.getRevocationStatusList(revocationRegistryId, timestamp) + const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) + return await ledgerService.getRevocationStatusList(agentContext, revocationRegistryId, timestamp) } catch (error) { agentContext.config.logger.error(`Error retrieving revocation registry status list '${revocationRegistryId}'`, { error, diff --git a/packages/hedera/src/ledger/HederaLedgerServiceCache.ts b/packages/hedera/src/cache/CredoCache.ts similarity index 88% rename from packages/hedera/src/ledger/HederaLedgerServiceCache.ts rename to packages/hedera/src/cache/CredoCache.ts index ff4e8fbb35..f851268d0b 100644 --- a/packages/hedera/src/ledger/HederaLedgerServiceCache.ts +++ b/packages/hedera/src/cache/CredoCache.ts @@ -1,14 +1,14 @@ import { AgentContext, CacheModuleConfig, CredoError } from '@credo-ts/core' -import { Cache } from '@hiero-did-sdk-js/core' +import { Cache } from '@hiero-did-sdk/core' -export interface CredoCache { +export interface ICredoCache { get(agentContext: AgentContext, key: string): Promise set(agentContext: AgentContext, key: string, value: CacheValue, expiresInSeconds?: number): Promise remove(agentContext: AgentContext, key: string): Promise } -export class HederaLedgerServiceCache implements Cache { - private readonly credoCache: CredoCache +export class CredoCache implements Cache { + private readonly credoCache: ICredoCache constructor(private readonly agentContext: AgentContext) { this.credoCache = agentContext.dependencyManager.resolve(CacheModuleConfig).cache diff --git a/packages/hedera/src/dids/HederaDidRegistrar.ts b/packages/hedera/src/dids/HederaDidRegistrar.ts index fc4d179c95..627ee46f38 100644 --- a/packages/hedera/src/dids/HederaDidRegistrar.ts +++ b/packages/hedera/src/dids/HederaDidRegistrar.ts @@ -12,26 +12,59 @@ import { DidRepository, DidUpdateOptions, DidUpdateResult, + JsonTransformer, } from '@credo-ts/core' import { HederaLedgerService } from '../ledger/HederaLedgerService' +import { PrivateKey } from '@hashgraph/sdk' +import { HederaNetwork } from '@hiero-did-sdk/client' + +export interface HederaDidCreateOptions extends DidCreateOptions { + method: 'hedera' + did?: string + didDocument?: DidDocument + secret?: { + privateKey?: string | PrivateKey | undefined + } + options?: { + network?: HederaNetwork | string + } +} + +export interface HederaDidUpdateOptions extends DidUpdateOptions { + did: string + secret?: { + privateKey?: string | PrivateKey | undefined + } +} + +export interface HederaDidDeactivateOptions extends DidDeactivateOptions { + did: string + secret?: { + privateKey?: string | PrivateKey | undefined + } +} + export class HederaDidRegistrar implements DidRegistrar { public readonly supportedMethods = ['hedera'] - async create(agentContext: AgentContext, _options: DidCreateOptions): Promise { + async create(agentContext: AgentContext, options: HederaDidCreateOptions): Promise { try { + agentContext.config.logger.trace('Try to create the did document to ledger') + const didRepository = agentContext.dependencyManager.resolve(DidRepository) - const hederaLedgerService = agentContext.dependencyManager.resolve(HederaLedgerService) - const sdk = hederaLedgerService.getHederaDidSdk(agentContext) + const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) - const { did, didDocument } = await sdk.createDid({}) + // Create did + const { did, didDocument } = await ledgerService.createDid(agentContext, { + networkName: options.options?.network, + }) // Save the did so we know we created it and can issue with it const credoDidDocument = new DidDocument({ ...didDocument, service: didDocument.service?.map((s) => new DidDocumentService(s)), }) - await didRepository.save( agentContext, new DidRecord({ @@ -51,7 +84,9 @@ export class HederaDidRegistrar implements DidRegistrar { }, } } catch (error) { - agentContext.config.logger.error(`Error registering DID : ${error}`) + agentContext.config.logger.debug('Error creating of the did ', { + error, + }) return { didDocumentMetadata: {}, didRegistrationMetadata: {}, @@ -63,22 +98,110 @@ export class HederaDidRegistrar implements DidRegistrar { } } - update(_agentContext: AgentContext, _options: DidUpdateOptions): Promise { - throw new Error('Method not implemented.') + async update(agentContext: AgentContext, options: HederaDidUpdateOptions): Promise { + const didRepository = agentContext.dependencyManager.resolve(DidRepository) + const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) + + try { + const { did } = options + const { didDocument, didDocumentMetadata } = await ledgerService.resolveDid(agentContext, did) + const didRecord = await didRepository.findCreatedDid(agentContext, did) + if (!didDocument || didDocumentMetadata.deactivated || !didRecord) { + return { + didDocumentMetadata: {}, + didRegistrationMetadata: {}, + didState: { + state: 'failed', + reason: 'Did not found', + }, + } + } + + const { didDocument: updatedDidDocument } = await ledgerService.updateDid(agentContext, { + did, + updates: { + operation: , + // id: options., + // property: 'verificationMethod', + // publicKeyMultibase: 'z6MkkFf6yboMwr1LQVAHqatuGYD9foRe7L2wPkEn1A7LyoQb', + }, + privateKey: options.secret?.privateKey, + }) + + didRecord.didDocument = JsonTransformer.fromJSON(updatedDidDocument, DidDocument) + await didRepository.update(agentContext, didRecord) + + return { + didDocumentMetadata: {}, + didRegistrationMetadata: {}, + didState: { + state: 'finished', + did, + didDocument: didRecord.didDocument, + }, + } + } catch (error) { + agentContext.config.logger.error('Error updating DID', error) + return { + didDocumentMetadata: {}, + didRegistrationMetadata: {}, + didState: { + state: 'failed', + reason: `Unable update DID: ${error.message}`, + }, + } + } } - deactivate(_agentContext: AgentContext, _options: DidDeactivateOptions): Promise { - throw new Error('Method not implemented.') + async deactivate(agentContext: AgentContext, options: HederaDidDeactivateOptions): Promise { + const didRepository = agentContext.dependencyManager.resolve(DidRepository) + const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) + + const did = options.did + + try { + const { didDocument, didDocumentMetadata } = await ledgerService.resolveDid(agentContext, did) + + const didRecord = await didRepository.findCreatedDid(agentContext, did) + + if (!didDocument || didDocumentMetadata.deactivated || !didRecord) { + return { + didDocumentMetadata, + didRegistrationMetadata: {}, + didState: { + state: 'failed', + reason: 'Did not found', + }, + } + } + + const { didDocument: deactivatedDidDocument } = await ledgerService.deactivateDid(agentContext, { + did: options.did, + privateKey: options.secret?.privateKey, + }) + + didRecord.didDocument = JsonTransformer.fromJSON(deactivatedDidDocument, DidDocument) + await didRepository.update(agentContext, didRecord) + + return { + didDocumentMetadata: {}, + didRegistrationMetadata: {}, + didState: { + state: 'finished', + did, + didDocument: didRecord.didDocument, + }, + } + } catch (error) { + agentContext.config.logger.error('Error deactivating DID', error) + return { + didDocumentMetadata: {}, + didRegistrationMetadata: {}, + didState: { + state: 'failed', + reason: `Unable deactivating DID: ${error.message}`, + }, + } + } } } -// -// export type SeedString = string -// -// export interface HederaDidCreateOptions extends DidCreateOptions { -// method: 'hedera' -// did?: never -// secret: { -// network: HederaNetwork -// seed: string -// } -// } diff --git a/packages/hedera/src/dids/HederaDidResolver.ts b/packages/hedera/src/dids/HederaDidResolver.ts index 7a231f6f81..3dc00f4e6a 100644 --- a/packages/hedera/src/dids/HederaDidResolver.ts +++ b/packages/hedera/src/dids/HederaDidResolver.ts @@ -21,26 +21,27 @@ export class HederaDidResolver implements DidResolver { _didResolutionOptions: DidResolutionOptions ): Promise { try { - const hederaLedgerService = agentContext.dependencyManager.resolve(HederaLedgerService) - const sdk = hederaLedgerService.getHederaDidSdk(agentContext) - - const resolveDidResult = await sdk.resolveDid(did) - - const updatedContextDidJson = { - ...resolveDidResult, - '@context': ['https://www.w3.org/ns/did/v1', 'https://w3id.org/security/suites/ed25519-2018/v1'], - } - - const didDocument = JsonTransformer.fromJSON(updatedContextDidJson, DidDocument) - + agentContext.config.logger.trace('Try to resolve a did document from ledger') + const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) + const resolveDidResult = await ledgerService.resolveDid(agentContext, did) + // const updatedContextDidJson = { + // ...resolveDidResult.didDocument, + // '@context': ['https://www.w3.org/ns/did/v1', 'https://w3id.org/security/suites/ed25519-2018/v1'], + // } + const didDocument = JsonTransformer.fromJSON(resolveDidResult.didDocument, DidDocument) return { didDocument, - didDocumentMetadata: {}, - didResolutionMetadata: { - contentType: 'application/did+json', - }, + didDocumentMetadata: resolveDidResult.didDocumentMetadata, + didResolutionMetadata: resolveDidResult.didResolutionMetadata, + // { + // contentType: 'application/did+json', + // }, } } catch (error) { + agentContext.config.logger.debug('Error resolving the did', { + error, + did, + }) return { didDocument: null, didDocumentMetadata: {}, diff --git a/packages/hedera/src/ledger/HederaLedgerService.ts b/packages/hedera/src/ledger/HederaLedgerService.ts index b8e3150ce1..fba3693935 100644 --- a/packages/hedera/src/ledger/HederaLedgerService.ts +++ b/packages/hedera/src/ledger/HederaLedgerService.ts @@ -1,19 +1,162 @@ +import type { + GetCredentialDefinitionReturn, + GetRevocationRegistryDefinitionReturn, + GetRevocationStatusListReturn, + GetSchemaReturn, + RegisterCredentialDefinitionOptions, + RegisterCredentialDefinitionReturn, + RegisterRevocationRegistryDefinitionOptions, + RegisterRevocationRegistryDefinitionReturn, + RegisterRevocationStatusListOptions, + RegisterRevocationStatusListReturn, + RegisterSchemaOptions, + RegisterSchemaReturn, +} from '@credo-ts/anoncreds' import { type AgentContext, injectable } from '@credo-ts/core' -import { HederaAnoncredsRegistry } from '@hiero-did-sdk-js/anoncreds' -import { HederaDidService } from '@hiero-did-sdk-js/did' +import { Client } from '@hashgraph/sdk' +import { HederaAnoncredsRegistry } from '@hiero-did-sdk/anoncreds' +import { HederaClientService, NetworkName } from '@hiero-did-sdk/client' +import { DIDResolution } from '@hiero-did-sdk/core' +import { + CreateDIDResult, + DeactivateDIDOptions, + DeactivateDIDResult, + UpdateDIDOptions, + UpdateDIDResult, + createDID, + deactivateDID, + updateDID, +} from '@hiero-did-sdk/registrar' +import { TopicReaderHederaHcs, parseDID, resolveDID } from '@hiero-did-sdk/resolver' import { HederaModuleConfig } from '../HederaModuleConfig' -import { HederaLedgerServiceCache } from './HederaLedgerServiceCache' +import { CredoCache } from '../cache/CredoCache' @injectable() export class HederaLedgerService { - public constructor(private readonly hederaModuleConfig: HederaModuleConfig) {} + private readonly clientService: HederaClientService - public getHederaAnonCredsSdk(agentContext: AgentContext): HederaAnoncredsRegistry { - const cache = this.hederaModuleConfig.options.cache ?? new HederaLedgerServiceCache(agentContext) - return new HederaAnoncredsRegistry({ ...this.hederaModuleConfig.options, cache }) + public constructor(private readonly config: HederaModuleConfig) { + this.clientService = new HederaClientService(config.options) } - public getHederaDidSdk(_agentContext: AgentContext): HederaDidService { - return new HederaDidService({ ...this.hederaModuleConfig.options }) + /* Dids */ + + public async resolveDid(agentContext: AgentContext, did: string): Promise { + const topicReader = this.getHederaHcsTopicReader(agentContext) + return await resolveDID(did, 'application/ld+json;profile="https://w3id.org/did-resolution"', { topicReader }) + } + + public async createDid(agentContext: AgentContext, props?: NetworkName): Promise { + return this.clientService.withClient({ ...(props ?? {}) }, async (client: Client) => { + const topicReader = this.getHederaHcsTopicReader(agentContext) + return await createDID( + { + waitForDIDVisibility: false, + topicReader, + }, + { client } + ) + }) + } + + public async updateDid(agentContext: AgentContext, props: UpdateDIDOptions): Promise { + const { network: networkName } = parseDID(props.did) + return this.clientService.withClient({ networkName }, async (client: Client) => { + const topicReader = this.getHederaHcsTopicReader(agentContext) + return await updateDID( + { + ...props, + waitForDIDVisibility: false, + topicReader, + }, + { client } + ) + }) + } + + public async deactivateDid(agentContext: AgentContext, props: DeactivateDIDOptions): Promise { + const { network: networkName } = parseDID(props.did) + return this.clientService.withClient({ networkName }, async (client: Client) => { + const topicReader = this.getHederaHcsTopicReader(agentContext) + return await deactivateDID( + { + ...props, + waitForDIDVisibility: false, + topicReader, + }, + { client } + ) + }) + } + + /* Anoncreds*/ + + async getSchema(agentContext: AgentContext, schemaId: string): Promise { + const sdk = this.getHederaAnonCredsSdk(agentContext) + return await sdk.getSchema(schemaId) + } + + async registerSchema(agentContext: AgentContext, options: RegisterSchemaOptions): Promise { + const sdk = this.getHederaAnonCredsSdk(agentContext) + return await sdk.registerSchema(options) + } + + async getCredentialDefinition( + agentContext: AgentContext, + credentialDefinitionId: string + ): Promise { + const sdk = this.getHederaAnonCredsSdk(agentContext) + return await sdk.getCredentialDefinition(credentialDefinitionId) + } + + async registerCredentialDefinition( + agentContext: AgentContext, + options: RegisterCredentialDefinitionOptions + ): Promise { + const sdk = this.getHederaAnonCredsSdk(agentContext) + return await sdk.registerCredentialDefinition(options) + } + + async getRevocationRegistryDefinition( + agentContext: AgentContext, + revocationRegistryDefinitionId: string + ): Promise { + const sdk = this.getHederaAnonCredsSdk(agentContext) + return await sdk.getRevocationRegistryDefinition(revocationRegistryDefinitionId) + } + + async registerRevocationRegistryDefinition( + agentContext: AgentContext, + options: RegisterRevocationRegistryDefinitionOptions + ): Promise { + const sdk = this.getHederaAnonCredsSdk(agentContext) + return await sdk.registerRevocationRegistryDefinition(options) + } + + async getRevocationStatusList( + agentContext: AgentContext, + revocationRegistryId: string, + timestamp: number + ): Promise { + const sdk = this.getHederaAnonCredsSdk(agentContext) + return await sdk.getRevocationStatusList(revocationRegistryId, timestamp) + } + + async registerRevocationStatusList( + agentContext: AgentContext, + options: RegisterRevocationStatusListOptions + ): Promise { + const sdk = this.getHederaAnonCredsSdk(agentContext) + return await sdk.registerRevocationStatusList(options) + } + + private getHederaHcsTopicReader(agentContext: AgentContext): TopicReaderHederaHcs { + const cache = this.config.options.cache ?? new CredoCache(agentContext) + return new TopicReaderHederaHcs({ ...this.config.options, cache }) + } + + private getHederaAnonCredsSdk(agentContext: AgentContext): HederaAnoncredsRegistry { + const cache = this.config.options.cache ?? new CredoCache(agentContext) + return new HederaAnoncredsRegistry({ ...this.config.options, cache }) } } diff --git a/packages/indy-sdk-to-askar-migration/package.json b/packages/indy-sdk-to-askar-migration/package.json index 7a7c831f8a..b26d1a3ed1 100644 --- a/packages/indy-sdk-to-askar-migration/package.json +++ b/packages/indy-sdk-to-askar-migration/package.json @@ -3,9 +3,7 @@ "main": "src/index", "types": "src/index", "version": "0.5.13", - "files": [ - "build" - ], + "files": ["build"], "license": "Apache-2.0", "publishConfig": { "main": "build/index", diff --git a/packages/indy-vdr/package.json b/packages/indy-vdr/package.json index cd75e09e53..b22862aafc 100644 --- a/packages/indy-vdr/package.json +++ b/packages/indy-vdr/package.json @@ -3,9 +3,7 @@ "main": "src/index", "types": "src/index", "version": "0.5.13", - "files": [ - "build" - ], + "files": ["build"], "license": "Apache-2.0", "publishConfig": { "main": "build/index", diff --git a/packages/node/package.json b/packages/node/package.json index d47101d520..5a044c0312 100644 --- a/packages/node/package.json +++ b/packages/node/package.json @@ -3,9 +3,7 @@ "main": "src/index", "types": "src/index", "version": "0.5.13", - "files": [ - "build" - ], + "files": ["build"], "license": "Apache-2.0", "publishConfig": { "main": "build/index", diff --git a/packages/openid4vc/package.json b/packages/openid4vc/package.json index 5ddb7d2c18..ad727fdbb8 100644 --- a/packages/openid4vc/package.json +++ b/packages/openid4vc/package.json @@ -3,9 +3,7 @@ "main": "src/index", "types": "src/index", "version": "0.5.13", - "files": [ - "build" - ], + "files": ["build"], "license": "Apache-2.0", "publishConfig": { "main": "build/index", diff --git a/packages/question-answer/package.json b/packages/question-answer/package.json index aa63e3f3d5..4f79bb3862 100644 --- a/packages/question-answer/package.json +++ b/packages/question-answer/package.json @@ -3,9 +3,7 @@ "main": "src/index", "types": "src/index", "version": "0.5.13", - "files": [ - "build" - ], + "files": ["build"], "license": "Apache-2.0", "publishConfig": { "main": "build/index", diff --git a/packages/react-native/package.json b/packages/react-native/package.json index f5fb16fa49..3e63e19c33 100644 --- a/packages/react-native/package.json +++ b/packages/react-native/package.json @@ -3,9 +3,7 @@ "main": "src/index", "types": "src/index", "version": "0.5.13", - "files": [ - "build" - ], + "files": ["build"], "license": "Apache-2.0", "publishConfig": { "main": "build/index", diff --git a/packages/redis-cache/package.json b/packages/redis-cache/package.json index b9e3abd4e2..f6f013826b 100644 --- a/packages/redis-cache/package.json +++ b/packages/redis-cache/package.json @@ -3,9 +3,7 @@ "main": "src/index", "types": "src/index", "version": "0.5.13", - "files": [ - "build" - ], + "files": ["build"], "license": "Apache-2.0", "publishConfig": { "main": "build/index", diff --git a/packages/tenants/package.json b/packages/tenants/package.json index 322c24fe46..f526f55301 100644 --- a/packages/tenants/package.json +++ b/packages/tenants/package.json @@ -3,9 +3,7 @@ "main": "src/index", "types": "src/index", "version": "0.5.13", - "files": [ - "build" - ], + "files": ["build"], "license": "Apache-2.0", "publishConfig": { "main": "build/index", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d4c7a52cbf..e85056579a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -611,15 +611,27 @@ importers: '@credo-ts/core': specifier: workspace:* version: link:../core - '@hiero-did-sdk-js/anoncreds': - specifier: npm:@hiero-did-sdk-js/anoncreds@0.0.7 - version: 0.0.7(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) - '@hiero-did-sdk-js/core': - specifier: npm:@hiero-did-sdk-js/core@0.0.1 - version: 0.0.1 - '@hiero-did-sdk-js/did': - specifier: npm:@hiero-did-sdk-js/did@0.0.4 - version: 0.0.4(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) + '@hashgraph/sdk': + specifier: ^2.66.0 + version: 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/anoncreds': + specifier: npm:@hiero-did-sdk/anoncreds@0.0.3 + version: 0.0.3(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) + '@hiero-did-sdk/client': + specifier: npm:@hiero-did-sdk/client@0.0.1 + version: 0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/core': + specifier: npm:@hiero-did-sdk/core@0.0.1 + version: 0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/hcs': + specifier: npm:@hiero-did-sdk/hcs@0.0.3 + version: 0.0.3(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) + '@hiero-did-sdk/registrar': + specifier: npm:@hiero-did-sdk/registrar@0.0.1 + version: 0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/resolver': + specifier: npm:@hiero-did-sdk/resolver@0.0.5 + version: 0.0.5(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) devDependencies: '@credo-ts/node': specifier: workspace:* @@ -2388,32 +2400,59 @@ packages: peerDependencies: bn.js: ^5.2.1 - '@hiero-did-sdk-js/anoncreds@0.0.7': - resolution: {integrity: sha1-+WpUCRjrfYOUfH2pXE0hE4SQTgs=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk-js/anoncreds/-/@hiero-did-sdk-js/anoncreds-0.0.7.tgz} + '@hiero-did-sdk/anoncreds@0.0.3': + resolution: {integrity: sha1-pVsqP5XHeZ9w17XJRCkIWKA5dd4=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/anoncreds/-/@hiero-did-sdk/anoncreds-0.0.3.tgz} - '@hiero-did-sdk-js/cache@0.0.1': - resolution: {integrity: sha1-31zSNubUR6fhwq9EA2XuBPN3yS4=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk-js/cache/-/@hiero-did-sdk-js/cache-0.0.1.tgz} + '@hiero-did-sdk/cache@0.0.1': + resolution: {integrity: sha1-Bhzb7sOU4q8eMzLkHv7foHCcc8M=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/cache/-/@hiero-did-sdk/cache-0.0.1.tgz} - '@hiero-did-sdk-js/client@0.0.1': - resolution: {integrity: sha1-/oGgr/tiFidqMYdCFaFGHaIa8s0=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk-js/client/-/@hiero-did-sdk-js/client-0.0.1.tgz} + '@hiero-did-sdk/client@0.0.1': + resolution: {integrity: sha1-ONxxJr5ab4ReLsPjGGktf95slAU=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/client/-/@hiero-did-sdk/client-0.0.1.tgz} - '@hiero-did-sdk-js/core@0.0.1': - resolution: {integrity: sha1-Fnt+yGBWcjXk1BR6/qG7pwwF0no=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk-js/core/-/@hiero-did-sdk-js/core-0.0.1.tgz} + '@hiero-did-sdk/core@0.0.1': + resolution: {integrity: sha1-ng7T9mbOTVEkyGyV8CcUtTiRL/Q=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/core/-/@hiero-did-sdk/core-0.0.1.tgz} + engines: {node: '>=20'} + + '@hiero-did-sdk/crypto@0.0.1': + resolution: {integrity: sha1-oea8mNR4It44mUFz8hH9+7CtVv8=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/crypto/-/@hiero-did-sdk/crypto-0.0.1.tgz} + + '@hiero-did-sdk/hcs@0.0.3': + resolution: {integrity: sha1-HvXry7u33YR9HTgn2QBfA894wHk=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/hcs/-/@hiero-did-sdk/hcs-0.0.3.tgz} + + '@hiero-did-sdk/lifecycle@0.0.1': + resolution: {integrity: sha1-Wr9teNFTaBKQWTxg4+ciDkmKmTw=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/lifecycle/-/@hiero-did-sdk/lifecycle-0.0.1.tgz} + engines: {node: '>=20'} + + '@hiero-did-sdk/messages@0.0.1': + resolution: {integrity: sha1-V/utYJ7aN7gsXQXvUaWw4bnSS9s=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/messages/-/@hiero-did-sdk/messages-0.0.1.tgz} + engines: {node: '>=20'} + + '@hiero-did-sdk/publisher-internal@0.0.1': + resolution: {integrity: sha1-ljb+sGgZZ9+LNPjqCD5/L/e/9qQ=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/publisher-internal/-/@hiero-did-sdk/publisher-internal-0.0.1.tgz} + engines: {node: '>=20'} - '@hiero-did-sdk-js/crypto@0.0.1': - resolution: {integrity: sha1-boXa93x8ubg3r87M75kulcK7HWI=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk-js/crypto/-/@hiero-did-sdk-js/crypto-0.0.1.tgz} + '@hiero-did-sdk/registrar@0.0.1': + resolution: {integrity: sha1-q26HV0rQbw6F0dGhZll6H8rIc34=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/registrar/-/@hiero-did-sdk/registrar-0.0.1.tgz} + engines: {node: '>=20'} - '@hiero-did-sdk-js/did@0.0.4': - resolution: {integrity: sha1-Fdqx1OmzOMO4VVkrqpubLsu7tiU=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk-js/did/-/@hiero-did-sdk-js/did-0.0.4.tgz} + '@hiero-did-sdk/resolver@0.0.1': + resolution: {integrity: sha1-wnraBME9Nh2ZndgtpIpsJAiV/L8=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/resolver/-/@hiero-did-sdk/resolver-0.0.1.tgz} + engines: {node: '>=20'} - '@hiero-did-sdk-js/hcs@0.0.2': - resolution: {integrity: sha1-agCGmMRUExHQY2wF4g2gyPJVoY4=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk-js/hcs/-/@hiero-did-sdk-js/hcs-0.0.2.tgz} + '@hiero-did-sdk/resolver@0.0.5': + resolution: {integrity: sha1-CgF42+upJbwpnP+KQZPnKWkLobY=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/resolver/-/@hiero-did-sdk/resolver-0.0.5.tgz} + engines: {node: '>=20'} - '@hiero-did-sdk-js/hcs@0.0.3': - resolution: {integrity: sha1-9dUfNxCc5XFAM6I2GfBjHTIvjEQ=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk-js/hcs/-/@hiero-did-sdk-js/hcs-0.0.3.tgz} + '@hiero-did-sdk/signer-internal@0.0.1': + resolution: {integrity: sha1-VRle2ZFCsdlB4VX4pzmC6Fi6OXg=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/signer-internal/-/@hiero-did-sdk/signer-internal-0.0.1.tgz} + engines: {node: '>=20'} - '@hiero-did-sdk-js/zstd@0.0.1': - resolution: {integrity: sha1-CNd96vi2XFIyLgcJCjLMd1SjPZE=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk-js/zstd/-/@hiero-did-sdk-js/zstd-0.0.1.tgz} + '@hiero-did-sdk/verifier-internal@0.0.1': + resolution: {integrity: sha1-OIOfKsgdl0nu6qjsk5dSZg4WcqQ=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/verifier-internal/-/@hiero-did-sdk/verifier-internal-0.0.1.tgz} + engines: {node: '>=20'} + + '@hiero-did-sdk/zstd@0.0.1': + resolution: {integrity: sha1-cIIzM5iK9GDHLmBUmci61XBLAUk=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/zstd/-/@hiero-did-sdk/zstd-0.0.1.tgz} '@hyperledger/anoncreds-nodejs@0.3.1': resolution: {integrity: sha512-/oWmWgcOPqjAtd2+dKASPYL84Qd7sAFyCBfEKM7PAgVbObaZUZc0kqA7hkEz/qyiqUvcP/JwKTc1v4zVZi6BTg==} @@ -2996,38 +3035,6 @@ packages: '@stablelib/wipe@2.0.1': resolution: {integrity: sha512-1eU2K9EgOcV4qc9jcP6G72xxZxEm5PfeI5H55l08W95b4oRJaqhmlWRc4xZAm6IVSKhVNxMi66V67hCzzuMTAg==} - '@swiss-digital-assets-institute/core@0.3.9': - resolution: {integrity: sha1-oAQYm8vkIXhg7bdB5JdSBJWwPBw=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@swiss-digital-assets-institute/core/-/@swiss-digital-assets-institute/core-0.3.9.tgz} - engines: {node: '>=20'} - - '@swiss-digital-assets-institute/lifecycle@0.3.9': - resolution: {integrity: sha1-CiUKkupWQeDX9I9yz+0EAbZLRGk=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@swiss-digital-assets-institute/lifecycle/-/@swiss-digital-assets-institute/lifecycle-0.3.9.tgz} - engines: {node: '>=20'} - - '@swiss-digital-assets-institute/messages@0.3.9': - resolution: {integrity: sha1-CdfXbRGaLiJ9QkXMP6JdQ7I5UNk=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@swiss-digital-assets-institute/messages/-/@swiss-digital-assets-institute/messages-0.3.9.tgz} - engines: {node: '>=20'} - - '@swiss-digital-assets-institute/publisher-internal@0.3.9': - resolution: {integrity: sha1-/9Q7FseGF8bIwOAMyJ7TFqKv3tQ=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@swiss-digital-assets-institute/publisher-internal/-/@swiss-digital-assets-institute/publisher-internal-0.3.9.tgz} - engines: {node: '>=20'} - - '@swiss-digital-assets-institute/registrar@0.3.9': - resolution: {integrity: sha1-1Ek6jpY0jxuA7tk1fytBa4eXSvc=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@swiss-digital-assets-institute/registrar/-/@swiss-digital-assets-institute/registrar-0.3.9.tgz} - engines: {node: '>=20'} - - '@swiss-digital-assets-institute/resolver@0.3.9': - resolution: {integrity: sha1-9s+WUtLhQ3GP1GTNMAE1Z0dTpyY=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@swiss-digital-assets-institute/resolver/-/@swiss-digital-assets-institute/resolver-0.3.9.tgz} - engines: {node: '>=20'} - - '@swiss-digital-assets-institute/signer-internal@0.3.9': - resolution: {integrity: sha1-hf6iW5Bu8sJ5w6tcWJLKB/rGlcw=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@swiss-digital-assets-institute/signer-internal/-/@swiss-digital-assets-institute/signer-internal-0.3.9.tgz} - engines: {node: '>=20'} - - '@swiss-digital-assets-institute/verifier-internal@0.3.9': - resolution: {integrity: sha1-s1bnScN6erWEjCNXSOSozS52WPE=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@swiss-digital-assets-institute/verifier-internal/-/@swiss-digital-assets-institute/verifier-internal-0.3.9.tgz} - engines: {node: '>=20'} - '@szmarczak/http-timer@5.0.1': resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} engines: {node: '>=14.16'} @@ -10100,19 +10107,25 @@ snapshots: - expo-crypto - react-native - '@hiero-did-sdk-js/anoncreds@0.0.7(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': + '@hiero-did-sdk/anoncreds@0.0.3(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': dependencies: - '@hiero-did-sdk-js/hcs': 0.0.3(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) - '@hiero-did-sdk-js/zstd': 0.0.1(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) + '@hiero-did-sdk/hcs': 0.0.3(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) + '@hiero-did-sdk/zstd': 0.0.1(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) transitivePeerDependencies: - bn.js - expo-crypto - react - react-native - '@hiero-did-sdk-js/cache@0.0.1': {} + '@hiero-did-sdk/cache@0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': + dependencies: + '@hiero-did-sdk/core': 0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + transitivePeerDependencies: + - bn.js + - expo-crypto + - react-native - '@hiero-did-sdk-js/client@0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': + '@hiero-did-sdk/client@0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': dependencies: '@hashgraph/sdk': 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) transitivePeerDependencies: @@ -10120,9 +10133,17 @@ snapshots: - expo-crypto - react-native - '@hiero-did-sdk-js/core@0.0.1': {} + '@hiero-did-sdk/core@0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': + dependencies: + '@hashgraph/sdk': 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@scure/base': 1.2.6 + cbor-x: 1.6.0 + transitivePeerDependencies: + - bn.js + - expo-crypto + - react-native - '@hiero-did-sdk-js/crypto@0.0.1(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': + '@hiero-did-sdk/crypto@0.0.1(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': dependencies: crypto: 1.0.1 crypto-js: 4.2.0 @@ -10131,49 +10152,104 @@ snapshots: - react - react-native - '@hiero-did-sdk-js/did@0.0.4(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': + '@hiero-did-sdk/hcs@0.0.3(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': dependencies: '@hashgraph/sdk': 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk-js/client': 0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk-js/hcs': 0.0.2(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) - '@swiss-digital-assets-institute/core': 0.3.9(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@swiss-digital-assets-institute/registrar': 0.3.9(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@swiss-digital-assets-institute/resolver': 0.3.9(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/cache': 0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/client': 0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/core': 0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/crypto': 0.0.1(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) + '@hiero-did-sdk/zstd': 0.0.1(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) transitivePeerDependencies: - bn.js - expo-crypto - react - react-native - '@hiero-did-sdk-js/hcs@0.0.2(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': + '@hiero-did-sdk/lifecycle@0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': + dependencies: + '@hiero-did-sdk/core': 0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + transitivePeerDependencies: + - bn.js + - expo-crypto + - react-native + + '@hiero-did-sdk/messages@0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': dependencies: '@hashgraph/sdk': 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk-js/cache': 0.0.1 - '@hiero-did-sdk-js/client': 0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk-js/core': 0.0.1 - '@hiero-did-sdk-js/crypto': 0.0.1(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) - '@hiero-did-sdk-js/zstd': 0.0.1(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) + '@hiero-did-sdk/core': 0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/lifecycle': 0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/resolver': 0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + transitivePeerDependencies: + - bn.js + - expo-crypto + - react-native + + '@hiero-did-sdk/publisher-internal@0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': + dependencies: + '@hashgraph/sdk': 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/core': 0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + transitivePeerDependencies: + - bn.js + - expo-crypto + - react-native + + '@hiero-did-sdk/registrar@0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': + dependencies: + '@hashgraph/sdk': 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/core': 0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/lifecycle': 0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/messages': 0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/publisher-internal': 0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/resolver': 0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/signer-internal': 0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/verifier-internal': 0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + transitivePeerDependencies: + - bn.js + - expo-crypto + - react-native + + '@hiero-did-sdk/resolver@0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': + dependencies: + '@hashgraph/sdk': 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/core': 0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/verifier-internal': 0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) transitivePeerDependencies: - bn.js - expo-crypto - - react - react-native - '@hiero-did-sdk-js/hcs@0.0.3(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': + '@hiero-did-sdk/resolver@0.0.5(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': dependencies: '@hashgraph/sdk': 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk-js/cache': 0.0.1 - '@hiero-did-sdk-js/client': 0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk-js/core': 0.0.1 - '@hiero-did-sdk-js/crypto': 0.0.1(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) - '@hiero-did-sdk-js/zstd': 0.0.1(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) + '@hiero-did-sdk/core': 0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/hcs': 0.0.3(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) + '@hiero-did-sdk/verifier-internal': 0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) transitivePeerDependencies: - bn.js - expo-crypto - react - react-native - '@hiero-did-sdk-js/zstd@0.0.1(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': + '@hiero-did-sdk/signer-internal@0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': + dependencies: + '@hashgraph/sdk': 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/core': 0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + transitivePeerDependencies: + - bn.js + - expo-crypto + - react-native + + '@hiero-did-sdk/verifier-internal@0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': + dependencies: + '@hashgraph/sdk': 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/core': 0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + transitivePeerDependencies: + - bn.js + - expo-crypto + - react-native + + '@hiero-did-sdk/zstd@0.0.1(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': dependencies: react-native-zstd: 1.1.0(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) zstd-napi: 0.0.10 @@ -11292,87 +11368,6 @@ snapshots: '@stablelib/wipe@2.0.1': {} - '@swiss-digital-assets-institute/core@0.3.9(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': - dependencies: - '@hashgraph/sdk': 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@scure/base': 1.2.6 - cbor-x: 1.6.0 - transitivePeerDependencies: - - bn.js - - expo-crypto - - react-native - - '@swiss-digital-assets-institute/lifecycle@0.3.9(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': - dependencies: - '@swiss-digital-assets-institute/core': 0.3.9(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - transitivePeerDependencies: - - bn.js - - expo-crypto - - react-native - - '@swiss-digital-assets-institute/messages@0.3.9(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': - dependencies: - '@hashgraph/sdk': 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@swiss-digital-assets-institute/core': 0.3.9(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@swiss-digital-assets-institute/lifecycle': 0.3.9(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@swiss-digital-assets-institute/resolver': 0.3.9(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - transitivePeerDependencies: - - bn.js - - expo-crypto - - react-native - - '@swiss-digital-assets-institute/publisher-internal@0.3.9(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': - dependencies: - '@hashgraph/sdk': 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@swiss-digital-assets-institute/core': 0.3.9(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - transitivePeerDependencies: - - bn.js - - expo-crypto - - react-native - - '@swiss-digital-assets-institute/registrar@0.3.9(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': - dependencies: - '@hashgraph/sdk': 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@swiss-digital-assets-institute/core': 0.3.9(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@swiss-digital-assets-institute/lifecycle': 0.3.9(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@swiss-digital-assets-institute/messages': 0.3.9(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@swiss-digital-assets-institute/publisher-internal': 0.3.9(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@swiss-digital-assets-institute/resolver': 0.3.9(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@swiss-digital-assets-institute/signer-internal': 0.3.9(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@swiss-digital-assets-institute/verifier-internal': 0.3.9(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - transitivePeerDependencies: - - bn.js - - expo-crypto - - react-native - - '@swiss-digital-assets-institute/resolver@0.3.9(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': - dependencies: - '@hashgraph/sdk': 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@swiss-digital-assets-institute/core': 0.3.9(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@swiss-digital-assets-institute/verifier-internal': 0.3.9(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - transitivePeerDependencies: - - bn.js - - expo-crypto - - react-native - - '@swiss-digital-assets-institute/signer-internal@0.3.9(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': - dependencies: - '@hashgraph/sdk': 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@swiss-digital-assets-institute/core': 0.3.9(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - transitivePeerDependencies: - - bn.js - - expo-crypto - - react-native - - '@swiss-digital-assets-institute/verifier-internal@0.3.9(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': - dependencies: - '@hashgraph/sdk': 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@swiss-digital-assets-institute/core': 0.3.9(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - transitivePeerDependencies: - - bn.js - - expo-crypto - - react-native - '@szmarczak/http-timer@5.0.1': dependencies: defer-to-connect: 2.0.1 From 9de97b99e89c20a241170ec176f0198bb48d1960 Mon Sep 17 00:00:00 2001 From: "andrey.kononov" Date: Fri, 20 Jun 2025 15:39:12 +0300 Subject: [PATCH 08/89] Restore changes --- demo-openid/package.json | 18 +++---- demo/package.json | 14 +++--- package.json | 41 ++++++++------- packages/action-menu/package.json | 8 +-- packages/anoncreds/package.json | 8 +-- .../services/tails/BasicTailsFileService.ts | 2 +- packages/askar/package.json | 18 +++---- packages/cheqd/package.json | 10 ++-- packages/core/package.json | 50 +++++++++---------- packages/didcomm/package.json | 14 +++--- packages/drpc/package.json | 6 +-- .../indy-sdk-to-askar-migration/package.json | 8 +-- packages/indy-vdr/package.json | 12 ++--- packages/node/package.json | 16 +++--- packages/openid4vc/package.json | 18 +++---- packages/question-answer/package.json | 8 +-- packages/react-native/package.json | 12 ++--- packages/redis-cache/package.json | 4 +- packages/tenants/package.json | 8 +-- samples/extension-module/package.json | 14 +++--- samples/tails/package.json | 12 ++--- 21 files changed, 150 insertions(+), 151 deletions(-) diff --git a/demo-openid/package.json b/demo-openid/package.json index 15dbd3a003..8d940615fa 100644 --- a/demo-openid/package.json +++ b/demo-openid/package.json @@ -18,11 +18,11 @@ "dependencies": { "@hyperledger/anoncreds-nodejs": "^0.3.1", "@hyperledger/indy-vdr-nodejs": "^0.2.2", - "@koa/bodyparser": "^5.1.2", - "@openwallet-foundation/askar-nodejs": "^0.3.2", + "@koa/bodyparser": "^5.1.1", + "@openwallet-foundation/askar-nodejs": "^0.3.1", "express": "^4.21.2", - "inquirer": "^8.2.6", - "jose": "^5.10.0", + "inquirer": "^8.2.5", + "jose": "^5.3.0", "oidc-provider": "^8.8.1" }, "devDependencies": { @@ -30,13 +30,13 @@ "@credo-ts/core": "workspace:*", "@credo-ts/node": "workspace:*", "@credo-ts/openid4vc": "workspace:*", - "@types/express": "^4.17.23", - "@types/figlet": "^1.7.0", - "@types/inquirer": "^8.2.11", + "@types/express": "^4.17.21", + "@types/figlet": "^1.5.4", + "@types/inquirer": "^8.2.6", "@types/oidc-provider": "^8.8.1", "clear": "^0.1.0", - "figlet": "^1.8.1", + "figlet": "^1.5.2", "ts-node": "^10.9.2", - "tsx": "^4.19.4" + "tsx": "^4.11.0" } } diff --git a/demo/package.json b/demo/package.json index 6187494141..ca59b27157 100644 --- a/demo/package.json +++ b/demo/package.json @@ -13,24 +13,24 @@ "faber": "ts-node src/FaberInquirer.ts" }, "dependencies": { - "@hyperledger/anoncreds-nodejs": "^0.3.1", "@hyperledger/indy-vdr-nodejs": "^0.2.2", - "@openwallet-foundation/askar-nodejs": "^0.3.2", - "inquirer": "^8.2.6" + "@hyperledger/anoncreds-nodejs": "^0.3.1", + "@openwallet-foundation/askar-nodejs": "^0.3.1", + "inquirer": "^8.2.5" }, "devDependencies": { "@credo-ts/anoncreds": "workspace:*", "@credo-ts/askar": "workspace:*", - "@credo-ts/cheqd": "workspace:*", "@credo-ts/core": "workspace:*", "@credo-ts/didcomm": "workspace:*", "@credo-ts/hedera": "workspace:*", "@credo-ts/indy-vdr": "workspace:*", + "@credo-ts/cheqd": "workspace:*", "@credo-ts/node": "workspace:*", - "@types/figlet": "^1.7.0", - "@types/inquirer": "^8.2.11", + "@types/figlet": "^1.5.4", + "@types/inquirer": "^8.2.6", "clear": "^0.1.0", - "figlet": "^1.8.1", + "figlet": "^1.5.2", "ts-node": "^10.9.2" } } diff --git a/package.json b/package.json index 29267b97c0..6204195035 100644 --- a/package.json +++ b/package.json @@ -25,33 +25,32 @@ "changeset-version": "pnpm changeset version && pnpm style:fix" }, "devDependencies": { - "@babel/core": "^7.27.4", - "@babel/preset-env": "^7.27.2", + "@babel/core": "^7.25.8", + "@babel/preset-env": "^7.25.8", "@biomejs/biome": "^1.9.4", - "@changesets/cli": "^2.29.4", + "@changesets/cli": "^2.27.5", + "@openwallet-foundation/askar-nodejs": "^0.3.1", "@jest/types": "^29.6.3", - "@openwallet-foundation/askar-nodejs": "^0.3.2", - "@types/cors": "^2.8.19", - "@types/express": "^4.17.23", - "@types/jest": "^29.5.14", - "@types/node": "18.18.8", - "@types/supertest": "^6.0.3", - "@types/uuid": "^9.0.8", - "@types/varint": "^6.0.3", - "@types/ws": "^8.18.1", + "@types/cors": "^2.8.10", + "@types/express": "^4.17.21", + "@types/jest": "^29.5.12", + "@types/node": "^18.18.8", + "@types/supertest": "^6.0.2", + "@types/uuid": "^9.0.1", + "@types/varint": "^6.0.0", + "@types/ws": "^8.5.4", "cors": "^2.8.5", "express": "^4.21.2", "jest": "^29.7.0", - "nock": "^14.0.5", - "rimraf": "^4.4.1", - "rxjs": "^7.8.2", - "supertest": "^7.1.1", - "ts-jest": "^29.3.4", + "nock": "^14.0.0-beta.19", + "rxjs": "^7.8.0", + "supertest": "^7.0.0", + "ts-jest": "^29.1.2", "ts-node": "^10.9.2", - "tsyringe": "^4.10.0", - "typescript": "~5.5.4", - "undici": "^6.21.3", - "ws": "^8.18.2" + "tsyringe": "^4.8.0", + "typescript": "~5.5.2", + "undici": "^6.20.1", + "ws": "^8.13.0" }, "resolutions": { "@types/node": "18.18.8", diff --git a/packages/action-menu/package.json b/packages/action-menu/package.json index 81c9d659b2..67e4ea3502 100644 --- a/packages/action-menu/package.json +++ b/packages/action-menu/package.json @@ -28,11 +28,11 @@ "@credo-ts/didcomm": "workspace:*", "class-transformer": "0.5.1", "class-validator": "0.14.1", - "rxjs": "^7.8.2" + "rxjs": "^7.8.0" }, "devDependencies": { - "reflect-metadata": "^0.1.14", - "rimraf": "^4.4.1", - "typescript": "~5.5.4" + "reflect-metadata": "^0.1.13", + "rimraf": "^4.4.0", + "typescript": "~5.5.2" } } diff --git a/packages/anoncreds/package.json b/packages/anoncreds/package.json index 9d3bc0d6e0..c47e990c95 100644 --- a/packages/anoncreds/package.json +++ b/packages/anoncreds/package.json @@ -30,15 +30,15 @@ "@sphereon/pex-models": "^2.3.2", "class-transformer": "0.5.1", "class-validator": "0.14.1", - "reflect-metadata": "^0.1.14" + "reflect-metadata": "^0.1.13" }, "devDependencies": { "@credo-ts/node": "workspace:*", "@hyperledger/anoncreds-nodejs": "^0.3.1", "@hyperledger/anoncreds-shared": "^0.3.1", - "rimraf": "^4.4.1", - "rxjs": "^7.8.2", - "typescript": "~5.5.4" + "rimraf": "^4.4.0", + "rxjs": "^7.8.0", + "typescript": "~5.5.2" }, "peerDependencies": { "@hyperledger/anoncreds-shared": "^0.3.1" diff --git a/packages/anoncreds/src/services/tails/BasicTailsFileService.ts b/packages/anoncreds/src/services/tails/BasicTailsFileService.ts index b76b738ca7..fe79190761 100644 --- a/packages/anoncreds/src/services/tails/BasicTailsFileService.ts +++ b/packages/anoncreds/src/services/tails/BasicTailsFileService.ts @@ -75,7 +75,7 @@ export class BasicTailsFileService implements TailsFileService { } protected async getTailsFilePath(agentContext: AgentContext, tailsHash: string) { - return `${await this.getTailsBasePath(agentContext)}/${tailsHash}`.replace(/\\/g, '/') + return `${await this.getTailsBasePath(agentContext)}/${tailsHash}` } protected async tailsFileExists(agentContext: AgentContext, tailsHash: string): Promise { diff --git a/packages/askar/package.json b/packages/askar/package.json index 2545d7bc12..5615d82318 100644 --- a/packages/askar/package.json +++ b/packages/askar/package.json @@ -27,18 +27,18 @@ "@credo-ts/core": "workspace:*", "class-transformer": "0.5.1", "class-validator": "0.14.1", - "rxjs": "^7.8.2", - "tsyringe": "^4.10.0" + "rxjs": "^7.8.0", + "tsyringe": "^4.8.0" }, "devDependencies": { "@credo-ts/tenants": "workspace:*", - "@openwallet-foundation/askar-nodejs": "^0.3.2", - "@openwallet-foundation/askar-shared": "^0.3.2", - "@types/ref-array-di": "^1.2.8", - "@types/ref-struct-di": "^1.1.12", - "reflect-metadata": "^0.1.14", - "rimraf": "^4.4.1", - "typescript": "~5.5.4" + "@openwallet-foundation/askar-nodejs": "^0.3.1", + "@openwallet-foundation/askar-shared": "^0.3.1", + "@types/ref-array-di": "^1.2.6", + "@types/ref-struct-di": "^1.1.10", + "reflect-metadata": "^0.1.13", + "rimraf": "^4.4.0", + "typescript": "~5.5.2" }, "peerDependencies": { "@openwallet-foundation/askar-shared": "^0.3.1" diff --git a/packages/cheqd/package.json b/packages/cheqd/package.json index cb22efa3bb..c52c014d78 100644 --- a/packages/cheqd/package.json +++ b/packages/cheqd/package.json @@ -24,7 +24,7 @@ "test": "jest" }, "dependencies": { - "@cheqd/sdk": "^5.3.1", + "@cheqd/sdk": "^5.2.1", "@cheqd/ts-proto": "~2.4.1", "@cosmjs/crypto": "~0.30.1", "@cosmjs/proto-signing": "~0.30.1", @@ -34,11 +34,11 @@ "@stablelib/ed25519": "^1.0.3", "class-transformer": "^0.5.1", "class-validator": "0.14.1", - "rxjs": "^7.8.2", - "tsyringe": "^4.10.0" + "rxjs": "^7.8.0", + "tsyringe": "^4.8.0" }, "devDependencies": { - "rimraf": "^4.4.1", - "typescript": "~5.5.4" + "rimraf": "^4.0.7", + "typescript": "~5.5.2" } } diff --git a/packages/core/package.json b/packages/core/package.json index 9eb6a82d4d..ffa8965023 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -31,13 +31,13 @@ "@digitalcredentials/jsonld-signatures": "^9.4.0", "@digitalcredentials/vc": "^6.0.1", "@multiformats/base-x": "^4.0.1", - "@noble/curves": "^1.9.2", - "@noble/hashes": "^1.8.0", - "@peculiar/asn1-ecc": "^2.3.15", + "@noble/curves": "^1.8.1", + "@noble/hashes": "^1.7.1", + "@peculiar/asn1-ecc": "^2.3.14", "@peculiar/asn1-rsa": "^2.3.15", - "@peculiar/asn1-schema": "^2.3.15", - "@peculiar/asn1-x509": "^2.3.15", - "@peculiar/x509": "^1.12.4", + "@peculiar/asn1-schema": "^2.3.13", + "@peculiar/asn1-x509": "^2.3.13", + "@peculiar/x509": "^1.12.1", "@sd-jwt/core": "^0.7.2", "@sd-jwt/decode": "^0.7.2", "@sd-jwt/jwt-status-list": "^0.7.2", @@ -47,35 +47,35 @@ "@sd-jwt/utils": "^0.7.2", "@sphereon/pex-models": "^2.3.2", "@sphereon/ssi-types": "0.33.0", - "@stablelib/ed25519": "^1.0.3", - "@types/ws": "^8.18.1", + "@stablelib/ed25519": "^1.0.2", + "@types/ws": "^8.5.4", "borc": "^3.0.0", "buffer": "^6.0.3", "class-transformer": "0.5.1", "class-validator": "0.14.1", - "dcql": "^0.2.22", + "dcql": "^0.2.20", "did-resolver": "^4.1.0", "ec-compression": "0.0.1-alpha.12", "lru_map": "^0.4.1", "make-error": "^1.3.6", - "object-inspect": "^1.13.4", - "reflect-metadata": "^0.1.14", - "rxjs": "^7.8.2", - "tsyringe": "^4.10.0", - "uuid": "^9.0.1", + "object-inspect": "^1.10.3", + "reflect-metadata": "^0.1.13", + "rxjs": "^7.8.0", + "tsyringe": "^4.8.0", + "uuid": "^9.0.0", "varint": "^6.0.0", - "web-did-resolver": "^2.0.30", - "webcrypto-core": "^1.8.1", - "zod": "^3.25.57" + "web-did-resolver": "^2.0.21", + "webcrypto-core": "^1.8.0", + "zod": "^3.24.2" }, "devDependencies": { - "@types/events": "^3.0.3", - "@types/object-inspect": "^1.13.0", - "@types/uuid": "^9.0.8", - "@types/varint": "^6.0.3", - "nock": "^14.0.5", - "rimraf": "^4.4.1", - "tslog": "^4.9.3", - "typescript": "~5.5.4" + "@types/events": "^3.0.0", + "@types/object-inspect": "^1.8.0", + "@types/uuid": "^9.0.1", + "@types/varint": "^6.0.0", + "nock": "^14.0.0-beta.19", + "rimraf": "^4.4.0", + "tslog": "^4.8.2", + "typescript": "~5.5.2" } } diff --git a/packages/didcomm/package.json b/packages/didcomm/package.json index 876d56b588..f9df10c143 100644 --- a/packages/didcomm/package.json +++ b/packages/didcomm/package.json @@ -27,16 +27,16 @@ "@credo-ts/core": "workspace:*", "class-transformer": "0.5.1", "class-validator": "0.14.1", - "luxon": "^3.6.1", - "query-string": "^7.1.3", - "rxjs": "^7.8.2" + "luxon": "^3.5.0", + "query-string": "^7.0.1", + "rxjs": "^7.8.0" }, "devDependencies": { "@animo-id/pex": "^6.1.0", "@sphereon/pex-models": "^2.3.2", - "@types/luxon": "^3.6.2", - "reflect-metadata": "^0.1.14", - "rimraf": "^4.4.1", - "typescript": "~5.5.4" + "@types/luxon": "^3.2.0", + "reflect-metadata": "^0.1.13", + "rimraf": "^4.4.0", + "typescript": "~5.5.2" } } diff --git a/packages/drpc/package.json b/packages/drpc/package.json index 65fca1b26d..e8a947cf1b 100644 --- a/packages/drpc/package.json +++ b/packages/drpc/package.json @@ -31,8 +31,8 @@ }, "devDependencies": { "@credo-ts/node": "workspace:*", - "reflect-metadata": "^0.1.14", - "rimraf": "^4.4.1", - "typescript": "~5.5.4" + "reflect-metadata": "^0.1.13", + "rimraf": "^4.4.0", + "typescript": "~5.5.2" } } diff --git a/packages/indy-sdk-to-askar-migration/package.json b/packages/indy-sdk-to-askar-migration/package.json index b26d1a3ed1..ad9d893599 100644 --- a/packages/indy-sdk-to-askar-migration/package.json +++ b/packages/indy-sdk-to-askar-migration/package.json @@ -30,10 +30,10 @@ "@credo-ts/node": "workspace:*" }, "devDependencies": { - "@openwallet-foundation/askar-nodejs": "^0.3.2", - "@openwallet-foundation/askar-shared": "^0.3.2", - "rimraf": "^4.4.1", - "typescript": "~5.5.4" + "@openwallet-foundation/askar-nodejs": "^0.3.1", + "@openwallet-foundation/askar-shared": "^0.3.1", + "rimraf": "^4.4.0", + "typescript": "~5.5.2" }, "peerDependencies": { "@openwallet-foundation/askar-shared": "^0.3.1" diff --git a/packages/indy-vdr/package.json b/packages/indy-vdr/package.json index b22862aafc..7bcd971a75 100644 --- a/packages/indy-vdr/package.json +++ b/packages/indy-vdr/package.json @@ -30,12 +30,12 @@ "devDependencies": { "@hyperledger/indy-vdr-nodejs": "^0.2.2", "@hyperledger/indy-vdr-shared": "^0.2.2", - "@stablelib/ed25519": "^1.0.3", - "@types/ref-array-di": "^1.2.8", - "@types/ref-struct-di": "^1.1.12", - "rimraf": "^4.4.1", - "rxjs": "^7.8.2", - "typescript": "~5.5.4" + "@stablelib/ed25519": "^1.0.2", + "@types/ref-array-di": "^1.2.6", + "@types/ref-struct-di": "^1.1.10", + "rimraf": "^4.4.0", + "rxjs": "^7.8.0", + "typescript": "~5.5.2" }, "peerDependencies": { "@hyperledger/indy-vdr-shared": "^0.2.2" diff --git a/packages/node/package.json b/packages/node/package.json index 5a044c0312..a18fec913b 100644 --- a/packages/node/package.json +++ b/packages/node/package.json @@ -28,16 +28,16 @@ "@2060.io/ref-napi": "^3.0.6", "@credo-ts/core": "workspace:*", "@credo-ts/didcomm": "workspace:*", - "@types/express": "^4.17.23", + "@types/express": "^4.17.21", "express": "^4.21.2", - "rxjs": "^7.8.2", - "ws": "^8.18.2" + "rxjs": "^7.8.0", + "ws": "^8.13.0" }, "devDependencies": { - "@types/node": "18.18.8", - "@types/ws": "^8.18.1", - "nock": "^14.0.5", - "rimraf": "^4.4.1", - "typescript": "~5.5.4" + "@types/node": "^18.18.8", + "@types/ws": "^8.5.4", + "nock": "^14.0.0-beta.19", + "rimraf": "^4.4.0", + "typescript": "~5.5.2" } } diff --git a/packages/openid4vc/package.json b/packages/openid4vc/package.json index ad727fdbb8..7e2e45d699 100644 --- a/packages/openid4vc/package.json +++ b/packages/openid4vc/package.json @@ -25,20 +25,20 @@ }, "dependencies": { "@credo-ts/core": "workspace:*", - "@openid4vc/oauth2": "0.3.0-alpha-20250602121005", + "class-transformer": "^0.5.1", + "rxjs": "^7.8.0", + "zod": "^3.24.2", "@openid4vc/openid4vci": "0.3.0-alpha-20250602121005", + "@openid4vc/oauth2": "0.3.0-alpha-20250602121005", "@openid4vc/openid4vp": "0.3.0-alpha-20250602121005", - "@openid4vc/utils": "0.3.0-alpha-20250602121005", - "class-transformer": "^0.5.1", - "rxjs": "^7.8.2", - "zod": "^3.25.57" + "@openid4vc/utils": "0.3.0-alpha-20250602121005" }, "devDependencies": { "@credo-ts/tenants": "workspace:*", - "@types/express": "^4.17.23", + "@types/express": "^4.17.21", "express": "^4.21.2", - "nock": "^14.0.5", - "rimraf": "^4.4.1", - "typescript": "~5.5.4" + "nock": "^14.0.0-beta.19", + "rimraf": "^4.4.0", + "typescript": "~5.5.2" } } diff --git a/packages/question-answer/package.json b/packages/question-answer/package.json index 4f79bb3862..42af19a64a 100644 --- a/packages/question-answer/package.json +++ b/packages/question-answer/package.json @@ -28,12 +28,12 @@ "@credo-ts/didcomm": "workspace:*", "class-transformer": "0.5.1", "class-validator": "0.14.1", - "rxjs": "^7.8.2" + "rxjs": "^7.8.0" }, "devDependencies": { "@credo-ts/node": "workspace:*", - "reflect-metadata": "^0.1.14", - "rimraf": "^4.4.1", - "typescript": "~5.5.4" + "reflect-metadata": "^0.1.13", + "rimraf": "^4.4.0", + "typescript": "~5.5.2" } } diff --git a/packages/react-native/package.json b/packages/react-native/package.json index 3e63e19c33..1d7b63dd2e 100644 --- a/packages/react-native/package.json +++ b/packages/react-native/package.json @@ -29,17 +29,17 @@ "events": "^3.3.0" }, "devDependencies": { - "react-native": "^0.78.2", + "react-native": "^0.78.1", "react-native-fs": "^2.20.0", - "react-native-get-random-values": "^1.11.0", - "rimraf": "^4.4.1", - "typescript": "~5.5.4" + "react-native-get-random-values": "^1.8.0", + "rimraf": "^4.4.0", + "typescript": "~5.5.2" }, "peerDependencies": { - "@animo-id/expo-secure-environment": "^0.1.1", "react-native": ">=0.71.4", "react-native-fs": "^2.20.0", - "react-native-get-random-values": "^1.8.0" + "react-native-get-random-values": "^1.8.0", + "@animo-id/expo-secure-environment": "^0.1.1" }, "peerDependenciesMeta": { "@animo-id/expo-secure-environment": { diff --git a/packages/redis-cache/package.json b/packages/redis-cache/package.json index f6f013826b..e56e1a722c 100644 --- a/packages/redis-cache/package.json +++ b/packages/redis-cache/package.json @@ -28,7 +28,7 @@ "ioredis": "^5.6.1" }, "devDependencies": { - "rimraf": "^4.4.1", - "typescript": "~5.5.4" + "rimraf": "^4.4.0", + "typescript": "~5.5.2" } } diff --git a/packages/tenants/package.json b/packages/tenants/package.json index f526f55301..144baf83b8 100644 --- a/packages/tenants/package.json +++ b/packages/tenants/package.json @@ -26,12 +26,12 @@ "dependencies": { "@credo-ts/core": "workspace:*", "@credo-ts/didcomm": "workspace:*", - "async-mutex": "^0.4.1" + "async-mutex": "^0.4.0" }, "devDependencies": { "@credo-ts/node": "workspace:*", - "reflect-metadata": "^0.1.14", - "rimraf": "^4.4.1", - "typescript": "~5.5.4" + "reflect-metadata": "^0.1.13", + "rimraf": "^4.4.0", + "typescript": "~5.5.2" } } diff --git a/samples/extension-module/package.json b/samples/extension-module/package.json index d615107fe7..d48503c652 100644 --- a/samples/extension-module/package.json +++ b/samples/extension-module/package.json @@ -13,18 +13,18 @@ "responder": "ts-node responder.ts" }, "devDependencies": { - "@types/express": "^4.17.23", - "@types/uuid": "^9.0.8", - "@types/ws": "^8.18.1", - "ts-node": "^10.9.2" + "ts-node": "^10.9.2", + "@types/express": "^4.17.13", + "@types/uuid": "^9.0.1", + "@types/ws": "^8.5.4" }, "dependencies": { - "@credo-ts/askar": "workspace:*", "@credo-ts/core": "workspace:*", "@credo-ts/didcomm": "workspace:*", "@credo-ts/node": "workspace:*", - "@openwallet-foundation/askar-nodejs": "^0.3.2", + "@credo-ts/askar": "workspace:*", "class-validator": "0.14.1", - "rxjs": "^7.8.2" + "rxjs": "^7.8.0", + "@openwallet-foundation/askar-nodejs": "^0.3.1" } } diff --git a/samples/tails/package.json b/samples/tails/package.json index bca78a23ca..e916f02368 100644 --- a/samples/tails/package.json +++ b/samples/tails/package.json @@ -17,11 +17,11 @@ "dependencies": { "@credo-ts/anoncreds": "workspace:*", "@credo-ts/core": "workspace:*", - "@types/express": "^4.17.23", - "@types/multer": "^1.4.13", - "@types/uuid": "^9.0.8", - "@types/ws": "^8.18.1", - "form-data": "^4.0.3", - "multer": "1.4.5-lts.2" + "@types/express": "^4.17.13", + "@types/multer": "^1.4.7", + "@types/uuid": "^9.0.1", + "@types/ws": "^8.5.4", + "form-data": "^4.0.0", + "multer": "^1.4.5-lts.1" } } From 41129130ad948fb3c23cbfa7b89e95b6f019f377 Mon Sep 17 00:00:00 2001 From: "andrey.kononov" Date: Fri, 20 Jun 2025 20:01:54 +0300 Subject: [PATCH 09/89] Fix issues --- package.json | 6 +- packages/cheqd/package.json | 2 +- packages/hedera/package.json | 15 +- .../hedera/src/dids/HederaDidRegistrar.ts | 208 ++++----- packages/hedera/src/dids/HederaDidResolver.ts | 1 + .../hedera/src/ledger/HederaLedgerService.ts | 60 +-- packages/hedera/tests/HederaDid.e2e.test.ts | 2 - .../tests/HederaDidResolver.e2e.test.ts | 67 +++ pnpm-lock.yaml | 419 +++++++++--------- 9 files changed, 434 insertions(+), 346 deletions(-) create mode 100644 packages/hedera/tests/HederaDidResolver.e2e.test.ts diff --git a/package.json b/package.json index 6204195035..c063ec7838 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,7 @@ "@jest/types": "^29.6.3", "@types/cors": "^2.8.10", "@types/express": "^4.17.21", - "@types/jest": "^29.5.12", + "@types/jest": "^29.5.14", "@types/node": "^18.18.8", "@types/supertest": "^6.0.2", "@types/uuid": "^9.0.1", @@ -44,8 +44,8 @@ "jest": "^29.7.0", "nock": "^14.0.0-beta.19", "rxjs": "^7.8.0", - "supertest": "^7.0.0", - "ts-jest": "^29.1.2", + "supertest": "^7.1.1", + "ts-jest": "^29.3.4", "ts-node": "^10.9.2", "tsyringe": "^4.8.0", "typescript": "~5.5.2", diff --git a/packages/cheqd/package.json b/packages/cheqd/package.json index c52c014d78..97d62e05eb 100644 --- a/packages/cheqd/package.json +++ b/packages/cheqd/package.json @@ -24,7 +24,7 @@ "test": "jest" }, "dependencies": { - "@cheqd/sdk": "^5.2.1", + "@cheqd/sdk": "5.2.1", "@cheqd/ts-proto": "~2.4.1", "@cosmjs/crypto": "~0.30.1", "@cosmjs/proto-signing": "~0.30.1", diff --git a/packages/hedera/package.json b/packages/hedera/package.json index 96f73169d3..bc0976a97f 100644 --- a/packages/hedera/package.json +++ b/packages/hedera/package.json @@ -25,15 +25,16 @@ "@hashgraph/sdk": "^2.66.0", "@credo-ts/anoncreds": "workspace:*", "@credo-ts/core": "workspace:*", - "@hiero-did-sdk/anoncreds": "npm:@hiero-did-sdk/anoncreds@0.0.3", - "@hiero-did-sdk/registrar": "npm:@hiero-did-sdk/registrar@0.0.1", - "@hiero-did-sdk/resolver": "npm:@hiero-did-sdk/resolver@0.0.5", - "@hiero-did-sdk/core": "npm:@hiero-did-sdk/core@0.0.1", - "@hiero-did-sdk/client": "npm:@hiero-did-sdk/client@0.0.1", - "@hiero-did-sdk/hcs": "npm:@hiero-did-sdk/hcs@0.0.3" + "@hiero-did-sdk/anoncreds": "npm:@hiero-did-sdk/anoncreds@0.0.5", + "@hiero-did-sdk/registrar": "npm:@hiero-did-sdk/registrar@0.0.3", + "@hiero-did-sdk/resolver": "npm:@hiero-did-sdk/resolver@0.0.7", + "@hiero-did-sdk/core": "npm:@hiero-did-sdk/core@0.0.2", + "@hiero-did-sdk/client": "npm:@hiero-did-sdk/client@0.0.3", + "@hiero-did-sdk/hcs": "npm:@hiero-did-sdk/hcs@0.0.5" }, "devDependencies": { "@credo-ts/node": "workspace:*", - "@hyperledger/anoncreds-nodejs": "^0.3.1" + "@hyperledger/anoncreds-nodejs": "^0.3.1", + "rimraf": "^4.4.0" } } diff --git a/packages/hedera/src/dids/HederaDidRegistrar.ts b/packages/hedera/src/dids/HederaDidRegistrar.ts index 627ee46f38..8ab46d86de 100644 --- a/packages/hedera/src/dids/HederaDidRegistrar.ts +++ b/packages/hedera/src/dids/HederaDidRegistrar.ts @@ -56,9 +56,7 @@ export class HederaDidRegistrar implements DidRegistrar { const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) // Create did - const { did, didDocument } = await ledgerService.createDid(agentContext, { - networkName: options.options?.network, - }) + const { did, didDocument } = await ledgerService.createDid(agentContext, options.options?.network) // Save the did so we know we created it and can issue with it const credoDidDocument = new DidDocument({ @@ -99,109 +97,111 @@ export class HederaDidRegistrar implements DidRegistrar { } async update(agentContext: AgentContext, options: HederaDidUpdateOptions): Promise { - const didRepository = agentContext.dependencyManager.resolve(DidRepository) - const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) - - try { - const { did } = options - const { didDocument, didDocumentMetadata } = await ledgerService.resolveDid(agentContext, did) - const didRecord = await didRepository.findCreatedDid(agentContext, did) - if (!didDocument || didDocumentMetadata.deactivated || !didRecord) { - return { - didDocumentMetadata: {}, - didRegistrationMetadata: {}, - didState: { - state: 'failed', - reason: 'Did not found', - }, - } - } - - const { didDocument: updatedDidDocument } = await ledgerService.updateDid(agentContext, { - did, - updates: { - operation: , - // id: options., - // property: 'verificationMethod', - // publicKeyMultibase: 'z6MkkFf6yboMwr1LQVAHqatuGYD9foRe7L2wPkEn1A7LyoQb', - }, - privateKey: options.secret?.privateKey, - }) - - didRecord.didDocument = JsonTransformer.fromJSON(updatedDidDocument, DidDocument) - await didRepository.update(agentContext, didRecord) - - return { - didDocumentMetadata: {}, - didRegistrationMetadata: {}, - didState: { - state: 'finished', - did, - didDocument: didRecord.didDocument, - }, - } - } catch (error) { - agentContext.config.logger.error('Error updating DID', error) - return { - didDocumentMetadata: {}, - didRegistrationMetadata: {}, - didState: { - state: 'failed', - reason: `Unable update DID: ${error.message}`, - }, - } - } + throw new Error('Method not implemented.') + // const didRepository = agentContext.dependencyManager.resolve(DidRepository) + // const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) + // + // try { + // const { did } = options + // const { didDocument, didDocumentMetadata } = await ledgerService.resolveDid(agentContext, did) + // const didRecord = await didRepository.findCreatedDid(agentContext, did) + // if (!didDocument || didDocumentMetadata.deactivated || !didRecord) { + // return { + // didDocumentMetadata: {}, + // didRegistrationMetadata: {}, + // didState: { + // state: 'failed', + // reason: 'Did not found', + // }, + // } + // } + // + // const { didDocument: updatedDidDocument } = await ledgerService.updateDid(agentContext, { + // did, + // updates: { + // operation: , + // // id: options., + // // property: 'verificationMethod', + // // publicKeyMultibase: 'z6MkkFf6yboMwr1LQVAHqatuGYD9foRe7L2wPkEn1A7LyoQb', + // }, + // privateKey: options.secret?.privateKey, + // }) + // + // didRecord.didDocument = JsonTransformer.fromJSON(updatedDidDocument, DidDocument) + // await didRepository.update(agentContext, didRecord) + // + // return { + // didDocumentMetadata: {}, + // didRegistrationMetadata: {}, + // didState: { + // state: 'finished', + // did, + // didDocument: didRecord.didDocument, + // }, + // } + // } catch (error) { + // agentContext.config.logger.error('Error updating DID', error) + // return { + // didDocumentMetadata: {}, + // didRegistrationMetadata: {}, + // didState: { + // state: 'failed', + // reason: `Unable update DID: ${error.message}`, + // }, + // } + // } } async deactivate(agentContext: AgentContext, options: HederaDidDeactivateOptions): Promise { - const didRepository = agentContext.dependencyManager.resolve(DidRepository) - const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) - - const did = options.did - - try { - const { didDocument, didDocumentMetadata } = await ledgerService.resolveDid(agentContext, did) - - const didRecord = await didRepository.findCreatedDid(agentContext, did) - - if (!didDocument || didDocumentMetadata.deactivated || !didRecord) { - return { - didDocumentMetadata, - didRegistrationMetadata: {}, - didState: { - state: 'failed', - reason: 'Did not found', - }, - } - } - - const { didDocument: deactivatedDidDocument } = await ledgerService.deactivateDid(agentContext, { - did: options.did, - privateKey: options.secret?.privateKey, - }) - - didRecord.didDocument = JsonTransformer.fromJSON(deactivatedDidDocument, DidDocument) - await didRepository.update(agentContext, didRecord) - - return { - didDocumentMetadata: {}, - didRegistrationMetadata: {}, - didState: { - state: 'finished', - did, - didDocument: didRecord.didDocument, - }, - } - } catch (error) { - agentContext.config.logger.error('Error deactivating DID', error) - return { - didDocumentMetadata: {}, - didRegistrationMetadata: {}, - didState: { - state: 'failed', - reason: `Unable deactivating DID: ${error.message}`, - }, - } - } + throw new Error('Method not implemented.') + // const didRepository = agentContext.dependencyManager.resolve(DidRepository) + // const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) + // + // const did = options.did + // + // try { + // const { didDocument, didDocumentMetadata } = await ledgerService.resolveDid(agentContext, did) + // + // const didRecord = await didRepository.findCreatedDid(agentContext, did) + // + // if (!didDocument || didDocumentMetadata.deactivated || !didRecord) { + // return { + // didDocumentMetadata, + // didRegistrationMetadata: {}, + // didState: { + // state: 'failed', + // reason: 'Did not found', + // }, + // } + // } + // + // const { didDocument: deactivatedDidDocument } = await ledgerService.deactivateDid(agentContext, { + // did: options.did, + // privateKey: options.secret?.privateKey, + // }) + // + // didRecord.didDocument = JsonTransformer.fromJSON(deactivatedDidDocument, DidDocument) + // await didRepository.update(agentContext, didRecord) + // + // return { + // didDocumentMetadata: {}, + // didRegistrationMetadata: {}, + // didState: { + // state: 'finished', + // did, + // didDocument: didRecord.didDocument, + // }, + // } + // } catch (error) { + // agentContext.config.logger.error('Error deactivating DID', error) + // return { + // didDocumentMetadata: {}, + // didRegistrationMetadata: {}, + // didState: { + // state: 'failed', + // reason: `Unable deactivating DID: ${error.message}`, + // }, + // } + // } } } diff --git a/packages/hedera/src/dids/HederaDidResolver.ts b/packages/hedera/src/dids/HederaDidResolver.ts index 3dc00f4e6a..5e4bd1194f 100644 --- a/packages/hedera/src/dids/HederaDidResolver.ts +++ b/packages/hedera/src/dids/HederaDidResolver.ts @@ -20,6 +20,7 @@ export class HederaDidResolver implements DidResolver { _parsed: ParsedDid, _didResolutionOptions: DidResolutionOptions ): Promise { + try { agentContext.config.logger.trace('Try to resolve a did document from ledger') const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) diff --git a/packages/hedera/src/ledger/HederaLedgerService.ts b/packages/hedera/src/ledger/HederaLedgerService.ts index fba3693935..6cca1c1d8c 100644 --- a/packages/hedera/src/ledger/HederaLedgerService.ts +++ b/packages/hedera/src/ledger/HederaLedgerService.ts @@ -1,3 +1,5 @@ +import {HederaAnoncredsRegistry} from "@hiero-did-sdk/anoncreds"; +import {HederaClientService} from "@hiero-did-sdk/client"; import type { GetCredentialDefinitionReturn, GetRevocationRegistryDefinitionReturn, @@ -13,9 +15,6 @@ import type { RegisterSchemaReturn, } from '@credo-ts/anoncreds' import { type AgentContext, injectable } from '@credo-ts/core' -import { Client } from '@hashgraph/sdk' -import { HederaAnoncredsRegistry } from '@hiero-did-sdk/anoncreds' -import { HederaClientService, NetworkName } from '@hiero-did-sdk/client' import { DIDResolution } from '@hiero-did-sdk/core' import { CreateDIDResult, @@ -30,6 +29,7 @@ import { import { TopicReaderHederaHcs, parseDID, resolveDID } from '@hiero-did-sdk/resolver' import { HederaModuleConfig } from '../HederaModuleConfig' import { CredoCache } from '../cache/CredoCache' +import {Client} from "@hashgraph/sdk"; @injectable() export class HederaLedgerService { @@ -46,8 +46,8 @@ export class HederaLedgerService { return await resolveDID(did, 'application/ld+json;profile="https://w3id.org/did-resolution"', { topicReader }) } - public async createDid(agentContext: AgentContext, props?: NetworkName): Promise { - return this.clientService.withClient({ ...(props ?? {}) }, async (client: Client) => { + public async createDid(agentContext: AgentContext, network?: string): Promise { + return this.clientService.withClient({ networkName: network }, async (client: Client) => { const topicReader = this.getHederaHcsTopicReader(agentContext) return await createDID( { @@ -60,33 +60,35 @@ export class HederaLedgerService { } public async updateDid(agentContext: AgentContext, props: UpdateDIDOptions): Promise { - const { network: networkName } = parseDID(props.did) - return this.clientService.withClient({ networkName }, async (client: Client) => { - const topicReader = this.getHederaHcsTopicReader(agentContext) - return await updateDID( - { - ...props, - waitForDIDVisibility: false, - topicReader, - }, - { client } - ) - }) + throw new Error('Method not implemented.') + // const { network: networkName } = parseDID(props.did) + // return this.clientService.withClient({ networkName }, async (client: Client) => { + // const topicReader = this.getHederaHcsTopicReader(agentContext) + // return await updateDID( + // { + // ...props, + // waitForDIDVisibility: false, + // topicReader, + // }, + // { client } + // ) + // }) } public async deactivateDid(agentContext: AgentContext, props: DeactivateDIDOptions): Promise { - const { network: networkName } = parseDID(props.did) - return this.clientService.withClient({ networkName }, async (client: Client) => { - const topicReader = this.getHederaHcsTopicReader(agentContext) - return await deactivateDID( - { - ...props, - waitForDIDVisibility: false, - topicReader, - }, - { client } - ) - }) + throw new Error('Method not implemented.') + // const { network: networkName } = parseDID(props.did) + // return this.clientService.withClient({ networkName }, async (client: Client) => { + // const topicReader = this.getHederaHcsTopicReader(agentContext) + // return await deactivateDID( + // { + // ...props, + // waitForDIDVisibility: false, + // topicReader, + // }, + // { client } + // ) + // }) } /* Anoncreds*/ diff --git a/packages/hedera/tests/HederaDid.e2e.test.ts b/packages/hedera/tests/HederaDid.e2e.test.ts index 597c61bf70..aa3a19946d 100644 --- a/packages/hedera/tests/HederaDid.e2e.test.ts +++ b/packages/hedera/tests/HederaDid.e2e.test.ts @@ -3,8 +3,6 @@ import { getHederaAgent, waitTimeout } from './utils' const logger = new ConsoleLogger(LogLevel.error) -//const did = 'did:hedera:testnet:zGdjMu1hPkjbJXSPPp6RgTptnpYYM9uEkPeNbPhSkXTon_0.0.5139753' - describe('Hedera Module did resolver', () => { let agent: Agent diff --git a/packages/hedera/tests/HederaDidResolver.e2e.test.ts b/packages/hedera/tests/HederaDidResolver.e2e.test.ts new file mode 100644 index 0000000000..bd9768e82c --- /dev/null +++ b/packages/hedera/tests/HederaDidResolver.e2e.test.ts @@ -0,0 +1,67 @@ +import { Agent, ConsoleLogger, JsonTransformer, LogLevel } from '@credo-ts/core' +import { HederaDidRegistrar } from '../src/dids' +import { HederaDidCreateOptions } from '../src/dids/HederaDidRegistrar' +import {getHederaAgent, waitTimeout} from './utils' + +describe('Hedera DID resolver', () => { + const logger = new ConsoleLogger(LogLevel.error) + + let agent: Agent + let did: string + + beforeAll(async () => { + agent = getHederaAgent({ + logger, + label: 'alice', + }) + await agent.initialize() + + const _didRegistrar = agent.dependencyManager.resolve(HederaDidRegistrar) + + const didResult = await agent.dids.create({ method: 'hedera' }) + + await waitTimeout(3000) + + if (!didResult.didState.did) { + throw new Error('No DID created') + } + did = didResult.didState.did + }) + + afterAll(async () => { + await agent.shutdown() + }) + + it('should resolve a did:cheqd did from local testnet', async () => { + const resolveResult = await agent.dids.resolve(did) + expect(JsonTransformer.toJSON(resolveResult)).toMatchObject({ + didDocument: { + '@context': ['https://www.w3.org/ns/did/v1', 'https://w3id.org/security/suites/jws-2020/v1'], + id: did, + controller: [did], + verificationMethod: [ + { + controller: did, + id: `${did}#key-1`, + publicKeyJwk: { + kty: 'OKP', + crv: 'Ed25519', + x: expect.any(String), + }, + type: 'JsonWebKey2020', + }, + ], + authentication: [`${did}#key-1`], + }, + didDocumentMetadata: { + created: expect.any(String), + updated: undefined, + deactivated: false, + versionId: expect.any(String), + nextVersionId: '', + }, + didResolutionMetadata: {}, + }) + }) + +}) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e85056579a..a0d7940849 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -18,28 +18,28 @@ importers: .: devDependencies: '@babel/core': - specifier: ^7.27.4 + specifier: ^7.25.8 version: 7.27.4 '@babel/preset-env': - specifier: ^7.27.2 + specifier: ^7.25.8 version: 7.27.2(@babel/core@7.27.4) '@biomejs/biome': specifier: ^1.9.4 version: 1.9.4 '@changesets/cli': - specifier: ^2.29.4 + specifier: ^2.27.5 version: 2.29.4 '@jest/types': specifier: ^29.6.3 version: 29.6.3 '@openwallet-foundation/askar-nodejs': - specifier: ^0.3.2 + specifier: ^0.3.1 version: 0.3.2 '@types/cors': - specifier: ^2.8.19 + specifier: ^2.8.10 version: 2.8.19 '@types/express': - specifier: ^4.17.23 + specifier: ^4.17.21 version: 4.17.23 '@types/jest': specifier: ^29.5.14 @@ -48,16 +48,16 @@ importers: specifier: 18.18.8 version: 18.18.8 '@types/supertest': - specifier: ^6.0.3 + specifier: ^6.0.2 version: 6.0.3 '@types/uuid': - specifier: ^9.0.8 + specifier: ^9.0.1 version: 9.0.8 '@types/varint': - specifier: ^6.0.3 + specifier: ^6.0.0 version: 6.0.3 '@types/ws': - specifier: ^8.18.1 + specifier: ^8.5.4 version: 8.18.1 cors: specifier: ^2.8.5 @@ -69,13 +69,10 @@ importers: specifier: ^29.7.0 version: 29.7.0(@types/node@18.18.8)(ts-node@10.9.2(@types/node@18.18.8)(typescript@5.5.4)) nock: - specifier: ^14.0.5 + specifier: ^14.0.0-beta.19 version: 14.0.5 - rimraf: - specifier: ^4.4.1 - version: 4.4.1 rxjs: - specifier: ^7.8.2 + specifier: ^7.8.0 version: 7.8.2 supertest: specifier: ^7.1.1 @@ -87,16 +84,16 @@ importers: specifier: ^10.9.2 version: 10.9.2(@types/node@18.18.8)(typescript@5.5.4) tsyringe: - specifier: ^4.10.0 + specifier: ^4.8.0 version: 4.10.0 typescript: - specifier: ~5.5.4 + specifier: ~5.5.2 version: 5.5.4 undici: specifier: ^6.20.1 version: 6.21.3 ws: - specifier: ^8.18.2 + specifier: ^8.13.0 version: 8.18.2 demo: @@ -108,10 +105,10 @@ importers: specifier: ^0.2.2 version: 0.2.2 '@openwallet-foundation/askar-nodejs': - specifier: ^0.3.2 + specifier: ^0.3.1 version: 0.3.2 inquirer: - specifier: ^8.2.6 + specifier: ^8.2.5 version: 8.2.6 devDependencies: '@credo-ts/anoncreds': @@ -139,16 +136,16 @@ importers: specifier: workspace:* version: link:../packages/node '@types/figlet': - specifier: ^1.7.0 + specifier: ^1.5.4 version: 1.7.0 '@types/inquirer': - specifier: ^8.2.11 + specifier: ^8.2.6 version: 8.2.11 clear: specifier: ^0.1.0 version: 0.1.0 figlet: - specifier: ^1.8.1 + specifier: ^1.5.2 version: 1.8.1 ts-node: specifier: ^10.9.2 @@ -163,19 +160,19 @@ importers: specifier: ^0.2.2 version: 0.2.2 '@koa/bodyparser': - specifier: ^5.1.2 + specifier: ^5.1.1 version: 5.1.2(koa@2.16.1) '@openwallet-foundation/askar-nodejs': - specifier: ^0.3.2 + specifier: ^0.3.1 version: 0.3.2 express: specifier: ^4.21.2 version: 4.21.2 inquirer: - specifier: ^8.2.6 + specifier: ^8.2.5 version: 8.2.6 jose: - specifier: ^5.10.0 + specifier: ^5.3.0 version: 5.10.0 oidc-provider: specifier: ^8.8.1 @@ -194,13 +191,13 @@ importers: specifier: workspace:* version: link:../packages/openid4vc '@types/express': - specifier: ^4.17.23 + specifier: ^4.17.21 version: 4.17.23 '@types/figlet': - specifier: ^1.7.0 + specifier: ^1.5.4 version: 1.7.0 '@types/inquirer': - specifier: ^8.2.11 + specifier: ^8.2.6 version: 8.2.11 '@types/oidc-provider': specifier: ^8.8.1 @@ -209,13 +206,13 @@ importers: specifier: ^0.1.0 version: 0.1.0 figlet: - specifier: ^1.8.1 + specifier: ^1.5.2 version: 1.8.1 ts-node: specifier: ^10.9.2 version: 10.9.2(@types/node@18.18.8)(typescript@5.5.4) tsx: - specifier: ^4.19.4 + specifier: ^4.11.0 version: 4.19.4 packages/action-menu: @@ -233,17 +230,17 @@ importers: specifier: 0.14.1 version: 0.14.1 rxjs: - specifier: ^7.8.2 + specifier: ^7.8.0 version: 7.8.2 devDependencies: reflect-metadata: - specifier: ^0.1.14 + specifier: ^0.1.13 version: 0.1.14 rimraf: - specifier: ^4.4.1 + specifier: ^4.4.0 version: 4.4.1 typescript: - specifier: ~5.5.4 + specifier: ~5.5.2 version: 5.5.4 packages/anoncreds: @@ -267,7 +264,7 @@ importers: specifier: 0.14.1 version: 0.14.1 reflect-metadata: - specifier: ^0.1.14 + specifier: ^0.1.13 version: 0.1.14 devDependencies: '@credo-ts/node': @@ -280,13 +277,13 @@ importers: specifier: ^0.3.1 version: 0.3.1 rimraf: - specifier: ^4.4.1 + specifier: ^4.4.0 version: 4.4.1 rxjs: - specifier: ^7.8.2 + specifier: ^7.8.0 version: 7.8.2 typescript: - specifier: ~5.5.4 + specifier: ~5.5.2 version: 5.5.4 packages/askar: @@ -301,42 +298,42 @@ importers: specifier: 0.14.1 version: 0.14.1 rxjs: - specifier: ^7.8.2 + specifier: ^7.8.0 version: 7.8.2 tsyringe: - specifier: ^4.10.0 + specifier: ^4.8.0 version: 4.10.0 devDependencies: '@credo-ts/tenants': specifier: workspace:* version: link:../tenants '@openwallet-foundation/askar-nodejs': - specifier: ^0.3.2 + specifier: ^0.3.1 version: 0.3.2 '@openwallet-foundation/askar-shared': - specifier: ^0.3.2 + specifier: ^0.3.1 version: 0.3.2 '@types/ref-array-di': - specifier: ^1.2.8 + specifier: ^1.2.6 version: 1.2.8 '@types/ref-struct-di': - specifier: ^1.1.12 + specifier: ^1.1.10 version: 1.1.12 reflect-metadata: - specifier: ^0.1.14 + specifier: ^0.1.13 version: 0.1.14 rimraf: - specifier: ^4.4.1 + specifier: ^4.4.0 version: 4.4.1 typescript: - specifier: ~5.5.4 + specifier: ~5.5.2 version: 5.5.4 packages/cheqd: dependencies: '@cheqd/sdk': - specifier: ^5.3.1 - version: 5.3.1 + specifier: 5.2.1 + version: 5.2.1 '@cheqd/ts-proto': specifier: ~2.4.1 version: 2.4.1 @@ -365,17 +362,17 @@ importers: specifier: 0.14.1 version: 0.14.1 rxjs: - specifier: ^7.8.2 + specifier: ^7.8.0 version: 7.8.2 tsyringe: - specifier: ^4.10.0 + specifier: ^4.8.0 version: 4.10.0 devDependencies: rimraf: - specifier: ^4.4.1 + specifier: ^4.0.7 version: 4.4.1 typescript: - specifier: ~5.5.4 + specifier: ~5.5.2 version: 5.5.4 packages/core: @@ -402,25 +399,25 @@ importers: specifier: ^4.0.1 version: 4.0.1 '@noble/curves': - specifier: ^1.9.2 + specifier: ^1.8.1 version: 1.9.2 '@noble/hashes': - specifier: ^1.8.0 + specifier: ^1.7.1 version: 1.8.0 '@peculiar/asn1-ecc': - specifier: ^2.3.15 + specifier: ^2.3.14 version: 2.3.15 '@peculiar/asn1-rsa': specifier: ^2.3.15 version: 2.3.15 '@peculiar/asn1-schema': - specifier: ^2.3.15 + specifier: ^2.3.13 version: 2.3.15 '@peculiar/asn1-x509': - specifier: ^2.3.15 + specifier: ^2.3.13 version: 2.3.15 '@peculiar/x509': - specifier: ^1.12.4 + specifier: ^1.12.1 version: 1.12.4 '@sd-jwt/core': specifier: ^0.7.2 @@ -450,10 +447,10 @@ importers: specifier: 0.33.0 version: 0.33.0 '@stablelib/ed25519': - specifier: ^1.0.3 + specifier: ^1.0.2 version: 1.0.3 '@types/ws': - specifier: ^8.18.1 + specifier: ^8.5.4 version: 8.18.1 borc: specifier: ^3.0.0 @@ -468,7 +465,7 @@ importers: specifier: 0.14.1 version: 0.14.1 dcql: - specifier: ^0.2.22 + specifier: ^0.2.20 version: 0.2.22(typescript@5.5.4) did-resolver: specifier: ^4.1.0 @@ -483,56 +480,56 @@ importers: specifier: ^1.3.6 version: 1.3.6 object-inspect: - specifier: ^1.13.4 + specifier: ^1.10.3 version: 1.13.4 reflect-metadata: - specifier: ^0.1.14 + specifier: ^0.1.13 version: 0.1.14 rxjs: - specifier: ^7.8.2 + specifier: ^7.8.0 version: 7.8.2 tsyringe: - specifier: ^4.10.0 + specifier: ^4.8.0 version: 4.10.0 uuid: - specifier: ^9.0.1 + specifier: ^9.0.0 version: 9.0.1 varint: specifier: ^6.0.0 version: 6.0.0 web-did-resolver: - specifier: ^2.0.30 + specifier: ^2.0.21 version: 2.0.30 webcrypto-core: - specifier: ^1.8.1 + specifier: ^1.8.0 version: 1.8.1 zod: - specifier: ^3.25.57 + specifier: ^3.24.2 version: 3.25.57 devDependencies: '@types/events': - specifier: ^3.0.3 + specifier: ^3.0.0 version: 3.0.3 '@types/object-inspect': - specifier: ^1.13.0 + specifier: ^1.8.0 version: 1.13.0 '@types/uuid': - specifier: ^9.0.8 + specifier: ^9.0.1 version: 9.0.8 '@types/varint': - specifier: ^6.0.3 + specifier: ^6.0.0 version: 6.0.3 nock: - specifier: ^14.0.5 + specifier: ^14.0.0-beta.19 version: 14.0.5 rimraf: - specifier: ^4.4.1 + specifier: ^4.4.0 version: 4.4.1 tslog: - specifier: ^4.9.3 + specifier: ^4.8.2 version: 4.9.3 typescript: - specifier: ~5.5.4 + specifier: ~5.5.2 version: 5.5.4 packages/didcomm: @@ -547,13 +544,13 @@ importers: specifier: 0.14.1 version: 0.14.1 luxon: - specifier: ^3.6.1 + specifier: ^3.5.0 version: 3.6.1 query-string: - specifier: ^7.1.3 + specifier: ^7.0.1 version: 7.1.3 rxjs: - specifier: ^7.8.2 + specifier: ^7.8.0 version: 7.8.2 devDependencies: '@animo-id/pex': @@ -563,16 +560,16 @@ importers: specifier: ^2.3.2 version: 2.3.2 '@types/luxon': - specifier: ^3.6.2 + specifier: ^3.2.0 version: 3.6.2 reflect-metadata: - specifier: ^0.1.14 + specifier: ^0.1.13 version: 0.1.14 rimraf: - specifier: ^4.4.1 + specifier: ^4.4.0 version: 4.4.1 typescript: - specifier: ~5.5.4 + specifier: ~5.5.2 version: 5.5.4 packages/drpc: @@ -594,13 +591,13 @@ importers: specifier: workspace:* version: link:../node reflect-metadata: - specifier: ^0.1.14 + specifier: ^0.1.13 version: 0.1.14 rimraf: - specifier: ^4.4.1 + specifier: ^4.4.0 version: 4.4.1 typescript: - specifier: ~5.5.4 + specifier: ~5.5.2 version: 5.5.4 packages/hedera: @@ -615,23 +612,23 @@ importers: specifier: ^2.66.0 version: 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) '@hiero-did-sdk/anoncreds': - specifier: npm:@hiero-did-sdk/anoncreds@0.0.3 - version: 0.0.3(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) + specifier: npm:@hiero-did-sdk/anoncreds@0.0.5 + version: 0.0.5(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) '@hiero-did-sdk/client': - specifier: npm:@hiero-did-sdk/client@0.0.1 - version: 0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + specifier: npm:@hiero-did-sdk/client@0.0.3 + version: 0.0.3(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) '@hiero-did-sdk/core': - specifier: npm:@hiero-did-sdk/core@0.0.1 - version: 0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + specifier: npm:@hiero-did-sdk/core@0.0.2 + version: 0.0.2(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) '@hiero-did-sdk/hcs': - specifier: npm:@hiero-did-sdk/hcs@0.0.3 - version: 0.0.3(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) + specifier: npm:@hiero-did-sdk/hcs@0.0.5 + version: 0.0.5(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) '@hiero-did-sdk/registrar': - specifier: npm:@hiero-did-sdk/registrar@0.0.1 - version: 0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + specifier: npm:@hiero-did-sdk/registrar@0.0.3 + version: 0.0.3(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) '@hiero-did-sdk/resolver': - specifier: npm:@hiero-did-sdk/resolver@0.0.5 - version: 0.0.5(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) + specifier: npm:@hiero-did-sdk/resolver@0.0.7 + version: 0.0.7(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) devDependencies: '@credo-ts/node': specifier: workspace:* @@ -639,6 +636,9 @@ importers: '@hyperledger/anoncreds-nodejs': specifier: ^0.3.1 version: 0.3.1 + rimraf: + specifier: ^4.4.0 + version: 4.4.1 packages/indy-sdk-to-askar-migration: dependencies: @@ -656,16 +656,16 @@ importers: version: link:../node devDependencies: '@openwallet-foundation/askar-nodejs': - specifier: ^0.3.2 + specifier: ^0.3.1 version: 0.3.2 '@openwallet-foundation/askar-shared': - specifier: ^0.3.2 + specifier: ^0.3.1 version: 0.3.2 rimraf: - specifier: ^4.4.1 + specifier: ^4.4.0 version: 4.4.1 typescript: - specifier: ~5.5.4 + specifier: ~5.5.2 version: 5.5.4 packages/indy-vdr: @@ -684,22 +684,22 @@ importers: specifier: ^0.2.2 version: 0.2.2 '@stablelib/ed25519': - specifier: ^1.0.3 + specifier: ^1.0.2 version: 1.0.3 '@types/ref-array-di': - specifier: ^1.2.8 + specifier: ^1.2.6 version: 1.2.8 '@types/ref-struct-di': - specifier: ^1.1.12 + specifier: ^1.1.10 version: 1.1.12 rimraf: - specifier: ^4.4.1 + specifier: ^4.4.0 version: 4.4.1 rxjs: - specifier: ^7.8.2 + specifier: ^7.8.0 version: 7.8.2 typescript: - specifier: ~5.5.4 + specifier: ~5.5.2 version: 5.5.4 packages/node: @@ -717,32 +717,32 @@ importers: specifier: workspace:* version: link:../didcomm '@types/express': - specifier: ^4.17.23 + specifier: ^4.17.21 version: 4.17.23 express: specifier: ^4.21.2 version: 4.21.2 rxjs: - specifier: ^7.8.2 + specifier: ^7.8.0 version: 7.8.2 ws: - specifier: ^8.18.2 + specifier: ^8.13.0 version: 8.18.2 devDependencies: '@types/node': specifier: 18.18.8 version: 18.18.8 '@types/ws': - specifier: ^8.18.1 + specifier: ^8.5.4 version: 8.18.1 nock: - specifier: ^14.0.5 + specifier: ^14.0.0-beta.19 version: 14.0.5 rimraf: - specifier: ^4.4.1 + specifier: ^4.4.0 version: 4.4.1 typescript: - specifier: ~5.5.4 + specifier: ~5.5.2 version: 5.5.4 packages/openid4vc: @@ -766,29 +766,29 @@ importers: specifier: ^0.5.1 version: 0.5.1 rxjs: - specifier: ^7.8.2 + specifier: ^7.8.0 version: 7.8.2 zod: - specifier: ^3.25.57 + specifier: ^3.24.2 version: 3.25.57 devDependencies: '@credo-ts/tenants': specifier: workspace:* version: link:../tenants '@types/express': - specifier: ^4.17.23 + specifier: ^4.17.21 version: 4.17.23 express: specifier: ^4.21.2 version: 4.21.2 nock: - specifier: ^14.0.5 + specifier: ^14.0.0-beta.19 version: 14.0.5 rimraf: - specifier: ^4.4.1 + specifier: ^4.4.0 version: 4.4.1 typescript: - specifier: ~5.5.4 + specifier: ~5.5.2 version: 5.5.4 packages/question-answer: @@ -806,20 +806,20 @@ importers: specifier: 0.14.1 version: 0.14.1 rxjs: - specifier: ^7.8.2 + specifier: ^7.8.0 version: 7.8.2 devDependencies: '@credo-ts/node': specifier: workspace:* version: link:../node reflect-metadata: - specifier: ^0.1.14 + specifier: ^0.1.13 version: 0.1.14 rimraf: - specifier: ^4.4.1 + specifier: ^4.4.0 version: 4.4.1 typescript: - specifier: ~5.5.4 + specifier: ~5.5.2 version: 5.5.4 packages/react-native: @@ -838,19 +838,19 @@ importers: version: 3.3.0 devDependencies: react-native: - specifier: ^0.78.2 + specifier: ^0.78.1 version: 0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1) react-native-fs: specifier: ^2.20.0 version: 2.20.0(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) react-native-get-random-values: - specifier: ^1.11.0 + specifier: ^1.8.0 version: 1.11.0(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) rimraf: - specifier: ^4.4.1 + specifier: ^4.4.0 version: 4.4.1 typescript: - specifier: ~5.5.4 + specifier: ~5.5.2 version: 5.5.4 packages/redis-cache: @@ -863,10 +863,10 @@ importers: version: 5.6.1 devDependencies: rimraf: - specifier: ^4.4.1 + specifier: ^4.4.0 version: 4.4.1 typescript: - specifier: ~5.5.4 + specifier: ~5.5.2 version: 5.5.4 packages/tenants: @@ -878,20 +878,20 @@ importers: specifier: workspace:* version: link:../didcomm async-mutex: - specifier: ^0.4.1 + specifier: ^0.4.0 version: 0.4.1 devDependencies: '@credo-ts/node': specifier: workspace:* version: link:../node reflect-metadata: - specifier: ^0.1.14 + specifier: ^0.1.13 version: 0.1.14 rimraf: - specifier: ^4.4.1 + specifier: ^4.4.0 version: 4.4.1 typescript: - specifier: ~5.5.4 + specifier: ~5.5.2 version: 5.5.4 samples/extension-module: @@ -909,23 +909,23 @@ importers: specifier: workspace:* version: link:../../packages/node '@openwallet-foundation/askar-nodejs': - specifier: ^0.3.2 + specifier: ^0.3.1 version: 0.3.2 class-validator: specifier: 0.14.1 version: 0.14.1 rxjs: - specifier: ^7.8.2 + specifier: ^7.8.0 version: 7.8.2 devDependencies: '@types/express': - specifier: ^4.17.23 + specifier: ^4.17.13 version: 4.17.23 '@types/uuid': - specifier: ^9.0.8 + specifier: ^9.0.1 version: 9.0.8 '@types/ws': - specifier: ^8.18.1 + specifier: ^8.5.4 version: 8.18.1 ts-node: specifier: ^10.9.2 @@ -940,22 +940,22 @@ importers: specifier: workspace:* version: link:../../packages/core '@types/express': - specifier: ^4.17.23 + specifier: ^4.17.13 version: 4.17.23 '@types/multer': - specifier: ^1.4.13 + specifier: ^1.4.7 version: 1.4.13 '@types/uuid': - specifier: ^9.0.8 + specifier: ^9.0.1 version: 9.0.8 '@types/ws': - specifier: ^8.18.1 + specifier: ^8.5.4 version: 8.18.1 form-data: - specifier: ^4.0.3 + specifier: ^4.0.0 version: 4.0.3 multer: - specifier: 1.4.5-lts.2 + specifier: ^1.4.5-lts.1 version: 1.4.5-lts.2 devDependencies: ts-node: @@ -1906,18 +1906,14 @@ packages: '@changesets/write@0.4.0': resolution: {integrity: sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==} - '@cheqd/sdk@5.3.1': - resolution: {integrity: sha512-4iwB8Ct6A2jlZw3qx7cPi34JcRsGnb+Mw3dzsAJY+83Fv2aC7ndO3YbUwouPK02scObq/fK5jbV6Dh35M6iMAg==} + '@cheqd/sdk@5.2.1': + resolution: {integrity: sha512-R6lpEEF0fTpDr4yebT/WUIs7AUgvVbR/V3RMGudcq2nVRv248fD2zpcJroKOpUKsoTUCa9Fw5PkWz01VvdmUEw==} engines: {node: '>=20.0.0'} '@cheqd/ts-proto@2.4.1': resolution: {integrity: sha512-tT9MvXjk+GmJXWjFKIMwhXWuStjdhECSBSrx8uyt1cJKVBtFpRBrFLEomA7XIclmfwL6z74YmhM7lEtf5Bn8vg==} engines: {node: '>=20'} - '@cheqd/ts-proto@2.5.0': - resolution: {integrity: sha512-3KqyvcruFxvkz+p6LnSCyUnqBJ2bJeOnIDkaYoAMcmGcSNKti3VECOKGdjjEO3rG/0/gAR9bhEHu9j1mUKSFqA==} - engines: {node: '>=20'} - '@cheqd/ts-proto@4.1.1': resolution: {integrity: sha512-iaz1sSlyTVT6u82vbIDuTk3ytiN31CQEc62xWfKeH/XaJE8RZQXYsjbtk5sIoXKJ63pb65XoHLY7JVOsqmRhFA==} engines: {node: '>=22.0.0'} @@ -2400,24 +2396,32 @@ packages: peerDependencies: bn.js: ^5.2.1 - '@hiero-did-sdk/anoncreds@0.0.3': - resolution: {integrity: sha1-pVsqP5XHeZ9w17XJRCkIWKA5dd4=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/anoncreds/-/@hiero-did-sdk/anoncreds-0.0.3.tgz} + '@hiero-did-sdk/anoncreds@0.0.5': + resolution: {integrity: sha1-2wM2uEtD9o5uN/rzzifDwYQfAa8=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/anoncreds/-/@hiero-did-sdk/anoncreds-0.0.5.tgz} - '@hiero-did-sdk/cache@0.0.1': - resolution: {integrity: sha1-Bhzb7sOU4q8eMzLkHv7foHCcc8M=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/cache/-/@hiero-did-sdk/cache-0.0.1.tgz} + '@hiero-did-sdk/cache@0.0.2': + resolution: {integrity: sha1-jffSjrPyflFrvAJEuJW+ncxFcUY=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/cache/-/@hiero-did-sdk/cache-0.0.2.tgz} - '@hiero-did-sdk/client@0.0.1': - resolution: {integrity: sha1-ONxxJr5ab4ReLsPjGGktf95slAU=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/client/-/@hiero-did-sdk/client-0.0.1.tgz} + '@hiero-did-sdk/client@0.0.3': + resolution: {integrity: sha1-pFwODG9IEbVc9GMkfrC3TroiSbA=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/client/-/@hiero-did-sdk/client-0.0.3.tgz} '@hiero-did-sdk/core@0.0.1': resolution: {integrity: sha1-ng7T9mbOTVEkyGyV8CcUtTiRL/Q=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/core/-/@hiero-did-sdk/core-0.0.1.tgz} engines: {node: '>=20'} - '@hiero-did-sdk/crypto@0.0.1': - resolution: {integrity: sha1-oea8mNR4It44mUFz8hH9+7CtVv8=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/crypto/-/@hiero-did-sdk/crypto-0.0.1.tgz} + '@hiero-did-sdk/core@0.0.2': + resolution: {integrity: sha1-1/QjEyGk0ASFA+2WkyqrGu7lmL4=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/core/-/@hiero-did-sdk/core-0.0.2.tgz} + engines: {node: '>=20'} - '@hiero-did-sdk/hcs@0.0.3': - resolution: {integrity: sha1-HvXry7u33YR9HTgn2QBfA894wHk=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/hcs/-/@hiero-did-sdk/hcs-0.0.3.tgz} + '@hiero-did-sdk/core@0.0.4': + resolution: {integrity: sha1-CBjHJmObZbG1MVRNos1QkLOnPNE=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/core/-/@hiero-did-sdk/core-0.0.4.tgz} + engines: {node: '>=20'} + + '@hiero-did-sdk/crypto@0.0.2': + resolution: {integrity: sha1-FXqF4hJhZl2l28snZrFu5wRucZ0=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/crypto/-/@hiero-did-sdk/crypto-0.0.2.tgz} + + '@hiero-did-sdk/hcs@0.0.5': + resolution: {integrity: sha1-GAwjKLcSl/zGku2NCrIseiLdFwA=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/hcs/-/@hiero-did-sdk/hcs-0.0.5.tgz} '@hiero-did-sdk/lifecycle@0.0.1': resolution: {integrity: sha1-Wr9teNFTaBKQWTxg4+ciDkmKmTw=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/lifecycle/-/@hiero-did-sdk/lifecycle-0.0.1.tgz} @@ -2431,16 +2435,16 @@ packages: resolution: {integrity: sha1-ljb+sGgZZ9+LNPjqCD5/L/e/9qQ=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/publisher-internal/-/@hiero-did-sdk/publisher-internal-0.0.1.tgz} engines: {node: '>=20'} - '@hiero-did-sdk/registrar@0.0.1': - resolution: {integrity: sha1-q26HV0rQbw6F0dGhZll6H8rIc34=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/registrar/-/@hiero-did-sdk/registrar-0.0.1.tgz} + '@hiero-did-sdk/registrar@0.0.3': + resolution: {integrity: sha1-v2Rk8H8kle/DINeOUrqNhQ3quV8=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/registrar/-/@hiero-did-sdk/registrar-0.0.3.tgz} engines: {node: '>=20'} '@hiero-did-sdk/resolver@0.0.1': resolution: {integrity: sha1-wnraBME9Nh2ZndgtpIpsJAiV/L8=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/resolver/-/@hiero-did-sdk/resolver-0.0.1.tgz} engines: {node: '>=20'} - '@hiero-did-sdk/resolver@0.0.5': - resolution: {integrity: sha1-CgF42+upJbwpnP+KQZPnKWkLobY=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/resolver/-/@hiero-did-sdk/resolver-0.0.5.tgz} + '@hiero-did-sdk/resolver@0.0.7': + resolution: {integrity: sha1-AMoLzBMbtN95c4lTe0m5TjVn8T8=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/resolver/-/@hiero-did-sdk/resolver-0.0.7.tgz} engines: {node: '>=20'} '@hiero-did-sdk/signer-internal@0.0.1': @@ -2451,8 +2455,8 @@ packages: resolution: {integrity: sha1-OIOfKsgdl0nu6qjsk5dSZg4WcqQ=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/verifier-internal/-/@hiero-did-sdk/verifier-internal-0.0.1.tgz} engines: {node: '>=20'} - '@hiero-did-sdk/zstd@0.0.1': - resolution: {integrity: sha1-cIIzM5iK9GDHLmBUmci61XBLAUk=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/zstd/-/@hiero-did-sdk/zstd-0.0.1.tgz} + '@hiero-did-sdk/zstd@0.0.2': + resolution: {integrity: sha1-QS6ZLrfamatPUNoIAxyV8Kaq6wk=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/zstd/-/@hiero-did-sdk/zstd-0.0.2.tgz} '@hyperledger/anoncreds-nodejs@0.3.1': resolution: {integrity: sha512-/oWmWgcOPqjAtd2+dKASPYL84Qd7sAFyCBfEKM7PAgVbObaZUZc0kqA7hkEz/qyiqUvcP/JwKTc1v4zVZi6BTg==} @@ -9140,10 +9144,10 @@ snapshots: human-id: 4.1.1 prettier: 2.8.8 - '@cheqd/sdk@5.3.1': + '@cheqd/sdk@5.2.1': dependencies: '@cheqd/ts-proto': 4.1.1 - '@cheqd/ts-proto-cjs': '@cheqd/ts-proto@2.5.0' + '@cheqd/ts-proto-cjs': '@cheqd/ts-proto@2.4.1' '@cosmjs/amino': 0.33.1 '@cosmjs/amino-cjs': '@cosmjs/amino@0.30.1' '@cosmjs/crypto': 0.33.1 @@ -9195,12 +9199,6 @@ snapshots: long: 5.3.2 protobufjs: 7.5.3 - '@cheqd/ts-proto@2.5.0': - dependencies: - '@bufbuild/protobuf': 2.5.2 - long: 5.3.2 - protobufjs: 7.5.3 - '@cheqd/ts-proto@4.1.1': dependencies: '@bufbuild/protobuf': 2.5.2 @@ -10107,25 +10105,25 @@ snapshots: - expo-crypto - react-native - '@hiero-did-sdk/anoncreds@0.0.3(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': + '@hiero-did-sdk/anoncreds@0.0.5(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': dependencies: - '@hiero-did-sdk/hcs': 0.0.3(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) - '@hiero-did-sdk/zstd': 0.0.1(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) + '@hiero-did-sdk/hcs': 0.0.5(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) + '@hiero-did-sdk/zstd': 0.0.2(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) transitivePeerDependencies: - bn.js - expo-crypto - react - react-native - '@hiero-did-sdk/cache@0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': + '@hiero-did-sdk/cache@0.0.2(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': dependencies: - '@hiero-did-sdk/core': 0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/core': 0.0.4(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) transitivePeerDependencies: - bn.js - expo-crypto - react-native - '@hiero-did-sdk/client@0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': + '@hiero-did-sdk/client@0.0.3(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': dependencies: '@hashgraph/sdk': 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) transitivePeerDependencies: @@ -10143,7 +10141,27 @@ snapshots: - expo-crypto - react-native - '@hiero-did-sdk/crypto@0.0.1(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': + '@hiero-did-sdk/core@0.0.2(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': + dependencies: + '@hashgraph/sdk': 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@scure/base': 1.2.6 + cbor-x: 1.6.0 + transitivePeerDependencies: + - bn.js + - expo-crypto + - react-native + + '@hiero-did-sdk/core@0.0.4(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': + dependencies: + '@hashgraph/sdk': 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@scure/base': 1.2.6 + cbor-x: 1.6.0 + transitivePeerDependencies: + - bn.js + - expo-crypto + - react-native + + '@hiero-did-sdk/crypto@0.0.2(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': dependencies: crypto: 1.0.1 crypto-js: 4.2.0 @@ -10152,14 +10170,14 @@ snapshots: - react - react-native - '@hiero-did-sdk/hcs@0.0.3(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': + '@hiero-did-sdk/hcs@0.0.5(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': dependencies: '@hashgraph/sdk': 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk/cache': 0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk/client': 0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk/core': 0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk/crypto': 0.0.1(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) - '@hiero-did-sdk/zstd': 0.0.1(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) + '@hiero-did-sdk/cache': 0.0.2(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/client': 0.0.3(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/core': 0.0.4(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/crypto': 0.0.2(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) + '@hiero-did-sdk/zstd': 0.0.2(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) transitivePeerDependencies: - bn.js - expo-crypto @@ -10194,19 +10212,20 @@ snapshots: - expo-crypto - react-native - '@hiero-did-sdk/registrar@0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': + '@hiero-did-sdk/registrar@0.0.3(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': dependencies: '@hashgraph/sdk': 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk/core': 0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/core': 0.0.4(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) '@hiero-did-sdk/lifecycle': 0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) '@hiero-did-sdk/messages': 0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) '@hiero-did-sdk/publisher-internal': 0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk/resolver': 0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/resolver': 0.0.7(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) '@hiero-did-sdk/signer-internal': 0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) '@hiero-did-sdk/verifier-internal': 0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) transitivePeerDependencies: - bn.js - expo-crypto + - react - react-native '@hiero-did-sdk/resolver@0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': @@ -10219,11 +10238,11 @@ snapshots: - expo-crypto - react-native - '@hiero-did-sdk/resolver@0.0.5(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': + '@hiero-did-sdk/resolver@0.0.7(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': dependencies: '@hashgraph/sdk': 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk/core': 0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk/hcs': 0.0.3(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) + '@hiero-did-sdk/core': 0.0.4(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/hcs': 0.0.5(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) '@hiero-did-sdk/verifier-internal': 0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) transitivePeerDependencies: - bn.js @@ -10249,7 +10268,7 @@ snapshots: - expo-crypto - react-native - '@hiero-did-sdk/zstd@0.0.1(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': + '@hiero-did-sdk/zstd@0.0.2(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': dependencies: react-native-zstd: 1.1.0(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) zstd-napi: 0.0.10 From 8b5c168c6cebceca0763e3f0d7ff0cf74935c6d8 Mon Sep 17 00:00:00 2001 From: "andrey.kononov" Date: Tue, 24 Jun 2025 19:01:24 +0300 Subject: [PATCH 10/89] Added signature on createDid Implemented deactivateDid method Add resolveDid e2e-test Add createDid e2e-test Add deactivateDid e2e-test --- packages/hedera/package.json | 10 +- .../hedera/src/dids/HederaDidRegistrar.ts | 106 ++++----- packages/hedera/src/dids/HederaDidResolver.ts | 8 - .../hedera/src/ledger/HederaLedgerService.ts | 75 +++++-- packages/hedera/tests/HederaDid.e2e.test.ts | 34 --- .../tests/HederaDidRegistrar.e2e.test.ts | 94 ++++++++ .../tests/HederaDidResolver.e2e.test.ts | 32 +-- .../hedera/tests/HederaW3cFlow.e2e.test.ts | 204 ------------------ pnpm-lock.yaml | 55 +++-- 9 files changed, 251 insertions(+), 367 deletions(-) delete mode 100644 packages/hedera/tests/HederaDid.e2e.test.ts create mode 100644 packages/hedera/tests/HederaDidRegistrar.e2e.test.ts delete mode 100644 packages/hedera/tests/HederaW3cFlow.e2e.test.ts diff --git a/packages/hedera/package.json b/packages/hedera/package.json index bc0976a97f..9626ac854d 100644 --- a/packages/hedera/package.json +++ b/packages/hedera/package.json @@ -19,18 +19,20 @@ "clean": "rimraf ./build", "compile": "tsc -p tsconfig.build.json", "prepublishOnly": "pnpm run build", - "test": "jest" + "test": "jest", + "style:check": "biome check --unsafe", + "style:fix": "biome check --write --unsafe" }, "dependencies": { "@hashgraph/sdk": "^2.66.0", "@credo-ts/anoncreds": "workspace:*", "@credo-ts/core": "workspace:*", "@hiero-did-sdk/anoncreds": "npm:@hiero-did-sdk/anoncreds@0.0.5", - "@hiero-did-sdk/registrar": "npm:@hiero-did-sdk/registrar@0.0.3", - "@hiero-did-sdk/resolver": "npm:@hiero-did-sdk/resolver@0.0.7", + "@hiero-did-sdk/registrar": "npm:@hiero-did-sdk/registrar@0.0.7", + "@hiero-did-sdk/resolver": "npm:@hiero-did-sdk/resolver@0.0.9", "@hiero-did-sdk/core": "npm:@hiero-did-sdk/core@0.0.2", "@hiero-did-sdk/client": "npm:@hiero-did-sdk/client@0.0.3", - "@hiero-did-sdk/hcs": "npm:@hiero-did-sdk/hcs@0.0.5" + "@hiero-did-sdk/hcs": "npm:@hiero-did-sdk/hcs@0.0.8" }, "devDependencies": { "@credo-ts/node": "workspace:*", diff --git a/packages/hedera/src/dids/HederaDidRegistrar.ts b/packages/hedera/src/dids/HederaDidRegistrar.ts index 8ab46d86de..62cb2a7f36 100644 --- a/packages/hedera/src/dids/HederaDidRegistrar.ts +++ b/packages/hedera/src/dids/HederaDidRegistrar.ts @@ -56,7 +56,10 @@ export class HederaDidRegistrar implements DidRegistrar { const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) // Create did - const { did, didDocument } = await ledgerService.createDid(agentContext, options.options?.network) + const { did, didDocument } = await ledgerService.createDid(agentContext, { + network: options.options?.network, + privateKey: options.secret?.privateKey, + }) // Save the did so we know we created it and can issue with it const credoDidDocument = new DidDocument({ @@ -96,7 +99,7 @@ export class HederaDidRegistrar implements DidRegistrar { } } - async update(agentContext: AgentContext, options: HederaDidUpdateOptions): Promise { + async update(_agentContext: AgentContext, _options: HederaDidUpdateOptions): Promise { throw new Error('Method not implemented.') // const didRepository = agentContext.dependencyManager.resolve(DidRepository) // const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) @@ -153,55 +156,54 @@ export class HederaDidRegistrar implements DidRegistrar { } async deactivate(agentContext: AgentContext, options: HederaDidDeactivateOptions): Promise { - throw new Error('Method not implemented.') - // const didRepository = agentContext.dependencyManager.resolve(DidRepository) - // const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) - // - // const did = options.did - // - // try { - // const { didDocument, didDocumentMetadata } = await ledgerService.resolveDid(agentContext, did) - // - // const didRecord = await didRepository.findCreatedDid(agentContext, did) - // - // if (!didDocument || didDocumentMetadata.deactivated || !didRecord) { - // return { - // didDocumentMetadata, - // didRegistrationMetadata: {}, - // didState: { - // state: 'failed', - // reason: 'Did not found', - // }, - // } - // } - // - // const { didDocument: deactivatedDidDocument } = await ledgerService.deactivateDid(agentContext, { - // did: options.did, - // privateKey: options.secret?.privateKey, - // }) - // - // didRecord.didDocument = JsonTransformer.fromJSON(deactivatedDidDocument, DidDocument) - // await didRepository.update(agentContext, didRecord) - // - // return { - // didDocumentMetadata: {}, - // didRegistrationMetadata: {}, - // didState: { - // state: 'finished', - // did, - // didDocument: didRecord.didDocument, - // }, - // } - // } catch (error) { - // agentContext.config.logger.error('Error deactivating DID', error) - // return { - // didDocumentMetadata: {}, - // didRegistrationMetadata: {}, - // didState: { - // state: 'failed', - // reason: `Unable deactivating DID: ${error.message}`, - // }, - // } - // } + const didRepository = agentContext.dependencyManager.resolve(DidRepository) + const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) + + const did = options.did + + try { + const { didDocument, didDocumentMetadata } = await ledgerService.resolveDid(agentContext, did) + + const didRecord = await didRepository.findCreatedDid(agentContext, did) + + if (!didDocument || didDocumentMetadata.deactivated || !didRecord) { + return { + didDocumentMetadata, + didRegistrationMetadata: {}, + didState: { + state: 'failed', + reason: 'Did not found', + }, + } + } + + const { didDocument: deactivatedDidDocument } = await ledgerService.deactivateDid(agentContext, { + did: options.did, + privateKey: options.secret?.privateKey, + }) + + didRecord.didDocument = JsonTransformer.fromJSON(deactivatedDidDocument, DidDocument) + await didRepository.update(agentContext, didRecord) + + return { + didDocumentMetadata: {}, + didRegistrationMetadata: {}, + didState: { + state: 'finished', + did, + didDocument: didRecord.didDocument, + }, + } + } catch (error) { + agentContext.config.logger.error('Error deactivating DID', error) + return { + didDocumentMetadata: {}, + didRegistrationMetadata: {}, + didState: { + state: 'failed', + reason: `Unable deactivating DID: ${error.message}`, + }, + } + } } } diff --git a/packages/hedera/src/dids/HederaDidResolver.ts b/packages/hedera/src/dids/HederaDidResolver.ts index 5e4bd1194f..c978f19ca0 100644 --- a/packages/hedera/src/dids/HederaDidResolver.ts +++ b/packages/hedera/src/dids/HederaDidResolver.ts @@ -20,23 +20,15 @@ export class HederaDidResolver implements DidResolver { _parsed: ParsedDid, _didResolutionOptions: DidResolutionOptions ): Promise { - try { agentContext.config.logger.trace('Try to resolve a did document from ledger') const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) const resolveDidResult = await ledgerService.resolveDid(agentContext, did) - // const updatedContextDidJson = { - // ...resolveDidResult.didDocument, - // '@context': ['https://www.w3.org/ns/did/v1', 'https://w3id.org/security/suites/ed25519-2018/v1'], - // } const didDocument = JsonTransformer.fromJSON(resolveDidResult.didDocument, DidDocument) return { didDocument, didDocumentMetadata: resolveDidResult.didDocumentMetadata, didResolutionMetadata: resolveDidResult.didResolutionMetadata, - // { - // contentType: 'application/did+json', - // }, } } catch (error) { agentContext.config.logger.debug('Error resolving the did', { diff --git a/packages/hedera/src/ledger/HederaLedgerService.ts b/packages/hedera/src/ledger/HederaLedgerService.ts index 6cca1c1d8c..cfdb60c3f9 100644 --- a/packages/hedera/src/ledger/HederaLedgerService.ts +++ b/packages/hedera/src/ledger/HederaLedgerService.ts @@ -1,5 +1,3 @@ -import {HederaAnoncredsRegistry} from "@hiero-did-sdk/anoncreds"; -import {HederaClientService} from "@hiero-did-sdk/client"; import type { GetCredentialDefinitionReturn, GetRevocationRegistryDefinitionReturn, @@ -15,7 +13,11 @@ import type { RegisterSchemaReturn, } from '@credo-ts/anoncreds' import { type AgentContext, injectable } from '@credo-ts/core' -import { DIDResolution } from '@hiero-did-sdk/core' +import { Client, PrivateKey } from '@hashgraph/sdk' +import { HederaAnoncredsRegistry } from '@hiero-did-sdk/anoncreds' +import { HederaClientService } from '@hiero-did-sdk/client' +import { HederaNetwork } from '@hiero-did-sdk/client/dist/index' +import { DIDResolution, KeysUtility } from '@hiero-did-sdk/core' import { CreateDIDResult, DeactivateDIDOptions, @@ -24,12 +26,17 @@ import { UpdateDIDResult, createDID, deactivateDID, - updateDID, + generateCreateDIDRequest, + submitCreateDIDRequest, } from '@hiero-did-sdk/registrar' import { TopicReaderHederaHcs, parseDID, resolveDID } from '@hiero-did-sdk/resolver' import { HederaModuleConfig } from '../HederaModuleConfig' import { CredoCache } from '../cache/CredoCache' -import {Client} from "@hashgraph/sdk"; + +export interface HederaLedgerServiceDidCreateOptions { + network?: HederaNetwork | string + privateKey?: string | PrivateKey | undefined +} @injectable() export class HederaLedgerService { @@ -46,9 +53,35 @@ export class HederaLedgerService { return await resolveDID(did, 'application/ld+json;profile="https://w3id.org/did-resolution"', { topicReader }) } - public async createDid(agentContext: AgentContext, network?: string): Promise { - return this.clientService.withClient({ networkName: network }, async (client: Client) => { + public async createDid( + agentContext: AgentContext, + options: HederaLedgerServiceDidCreateOptions + ): Promise { + return this.clientService.withClient({ networkName: options.network }, async (client: Client) => { const topicReader = this.getHederaHcsTopicReader(agentContext) + + if (options.privateKey) { + const rootKey = + options.privateKey instanceof PrivateKey + ? options.privateKey + : PrivateKey.fromStringED25519(options.privateKey) + const publicMultibaseRootKey = KeysUtility.fromPublicKey(rootKey.publicKey).toMultibase() + const { state, signingRequest } = await generateCreateDIDRequest( + { + multibasePublicKey: publicMultibaseRootKey, + }, + { + client, + } + ) + const signature = rootKey.sign(signingRequest.serializedPayload) + return await submitCreateDIDRequest( + { state, signature, waitForDIDVisibility: false }, + { + client, + } + ) + } return await createDID( { waitForDIDVisibility: false, @@ -59,7 +92,7 @@ export class HederaLedgerService { }) } - public async updateDid(agentContext: AgentContext, props: UpdateDIDOptions): Promise { + public async updateDid(_agentContext: AgentContext, _props: UpdateDIDOptions): Promise { throw new Error('Method not implemented.') // const { network: networkName } = parseDID(props.did) // return this.clientService.withClient({ networkName }, async (client: Client) => { @@ -76,19 +109,19 @@ export class HederaLedgerService { } public async deactivateDid(agentContext: AgentContext, props: DeactivateDIDOptions): Promise { - throw new Error('Method not implemented.') - // const { network: networkName } = parseDID(props.did) - // return this.clientService.withClient({ networkName }, async (client: Client) => { - // const topicReader = this.getHederaHcsTopicReader(agentContext) - // return await deactivateDID( - // { - // ...props, - // waitForDIDVisibility: false, - // topicReader, - // }, - // { client } - // ) - // }) + const { network: networkName } = parseDID(props.did) + return this.clientService.withClient({ networkName }, async (client: Client) => { + const topicReader = this.getHederaHcsTopicReader(agentContext) + return await deactivateDID( + { + did: props.did, + privateKey: props.privateKey, + waitForDIDVisibility: false, + topicReader, + }, + { client } + ) + }) } /* Anoncreds*/ diff --git a/packages/hedera/tests/HederaDid.e2e.test.ts b/packages/hedera/tests/HederaDid.e2e.test.ts deleted file mode 100644 index aa3a19946d..0000000000 --- a/packages/hedera/tests/HederaDid.e2e.test.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { Agent, ConsoleLogger, LogLevel } from '@credo-ts/core' -import { getHederaAgent, waitTimeout } from './utils' - -const logger = new ConsoleLogger(LogLevel.error) - -describe('Hedera Module did resolver', () => { - let agent: Agent - - beforeAll(async () => { - agent = getHederaAgent({ - logger, - label: 'alice', - }) - await agent.initialize() - }) - - afterAll(async () => { - // Wait for messages to flush out - await waitTimeout(1000) - - if (agent) { - await agent.shutdown() - } - }) - - describe('HederaDidResolver', () => { - it('should creaste and resolve a hedera did', async () => { - const didResult = await agent.dids.create({ method: 'hedera' }) - await waitTimeout(2000) - const resolvedDIDDoc = await agent.dids.resolve(didResult.didState.did ?? '') - expect(resolvedDIDDoc.didDocument?.id).toEqual(didResult.didState.did) - }) - }) -}) diff --git a/packages/hedera/tests/HederaDidRegistrar.e2e.test.ts b/packages/hedera/tests/HederaDidRegistrar.e2e.test.ts new file mode 100644 index 0000000000..152ef60f02 --- /dev/null +++ b/packages/hedera/tests/HederaDidRegistrar.e2e.test.ts @@ -0,0 +1,94 @@ +import { Agent, ConsoleLogger, LogLevel } from '@credo-ts/core' +import { HederaDidCreateOptions, HederaDidDeactivateOptions } from '../src/dids/HederaDidRegistrar' +import { getHederaAgent, waitTimeout } from './utils' + +describe('Hedera DID registrar', () => { + const consensusTimeout = 2000 + const operatorKey = process.env.HEDERA_TEST_OPERATOR_KEY ?? '' + + const logger = new ConsoleLogger(LogLevel.error) + + let agent: Agent + + beforeAll(async () => { + agent = getHederaAgent({ + logger, + label: 'alice', + }) + await agent.initialize() + }) + + afterAll(async () => { + await agent.shutdown() + }) + + it('should create a did:hedera did', async () => { + const didResult = await agent.dids.create({ + method: 'hedera', + options: { network: 'testnet' }, + }) + expect(didResult).toMatchObject({ + didState: { + state: 'finished', + didDocument: { + verificationMethod: [ + { + type: 'Ed25519VerificationKey2020', + publicKeyMultibase: expect.any(String), + }, + ], + }, + }, + }) + }) + + it('should create and add service to a did:hedera did', async () => { + const didResult = await agent.dids.create({ + method: 'hedera', + options: { network: 'testnet' }, + }) + expect(didResult).toMatchObject({ didState: { state: 'finished' } }) + }) + + it('should create and add verification to a did:hedera did', async () => { + const didResult = await agent.dids.create({ + method: 'hedera', + options: { network: 'testnet' }, + }) + expect(didResult).toMatchObject({ didState: { state: 'finished' } }) + }) + + it('should create and deactivate a did:hedera did', async () => { + const didResult = await agent.dids.create({ + method: 'hedera', + options: { + network: 'testnet', + }, + secret: { + privateKey: operatorKey, + }, + }) + expect(didResult).toMatchObject({ didState: { state: 'finished' } }) + + const did = didResult.didState.did! + + await waitTimeout(consensusTimeout) + + const deactivateResult = await agent.dids.deactivate({ + did, + secret: { + privateKey: operatorKey, + }, + }) + + expect(deactivateResult.didState.didDocument?.id).toEqual(did) + expect(deactivateResult.didState.state).toEqual('finished') + + await waitTimeout(consensusTimeout) + + const resolvedDocument = await agent.dids.resolve(did, { + useLocalCreatedDidRecord: false, + }) + expect(resolvedDocument.didDocumentMetadata.deactivated).toBe(true) + }) +}) diff --git a/packages/hedera/tests/HederaDidResolver.e2e.test.ts b/packages/hedera/tests/HederaDidResolver.e2e.test.ts index bd9768e82c..b3546970b7 100644 --- a/packages/hedera/tests/HederaDidResolver.e2e.test.ts +++ b/packages/hedera/tests/HederaDidResolver.e2e.test.ts @@ -1,7 +1,6 @@ import { Agent, ConsoleLogger, JsonTransformer, LogLevel } from '@credo-ts/core' -import { HederaDidRegistrar } from '../src/dids' import { HederaDidCreateOptions } from '../src/dids/HederaDidRegistrar' -import {getHederaAgent, waitTimeout} from './utils' +import { getHederaAgent } from './utils' describe('Hedera DID resolver', () => { const logger = new ConsoleLogger(LogLevel.error) @@ -16,12 +15,7 @@ describe('Hedera DID resolver', () => { }) await agent.initialize() - const _didRegistrar = agent.dependencyManager.resolve(HederaDidRegistrar) - const didResult = await agent.dids.create({ method: 'hedera' }) - - await waitTimeout(3000) - if (!didResult.didState.did) { throw new Error('No DID created') } @@ -36,32 +30,20 @@ describe('Hedera DID resolver', () => { const resolveResult = await agent.dids.resolve(did) expect(JsonTransformer.toJSON(resolveResult)).toMatchObject({ didDocument: { - '@context': ['https://www.w3.org/ns/did/v1', 'https://w3id.org/security/suites/jws-2020/v1'], + '@context': ['https://www.w3.org/ns/did/v1'], id: did, - controller: [did], + controller: did, verificationMethod: [ { controller: did, - id: `${did}#key-1`, - publicKeyJwk: { - kty: 'OKP', - crv: 'Ed25519', - x: expect.any(String), - }, - type: 'JsonWebKey2020', + id: `${did}#did-root-key`, + type: 'Ed25519VerificationKey2020', + publicKeyMultibase: expect.any(String), }, ], - authentication: [`${did}#key-1`], - }, - didDocumentMetadata: { - created: expect.any(String), - updated: undefined, - deactivated: false, - versionId: expect.any(String), - nextVersionId: '', }, + didDocumentMetadata: {}, didResolutionMetadata: {}, }) }) - }) diff --git a/packages/hedera/tests/HederaW3cFlow.e2e.test.ts b/packages/hedera/tests/HederaW3cFlow.e2e.test.ts deleted file mode 100644 index e4e217b2cf..0000000000 --- a/packages/hedera/tests/HederaW3cFlow.e2e.test.ts +++ /dev/null @@ -1,204 +0,0 @@ -import { Agent } from '@credo-ts/core' - -import { - ClaimFormat, - ConsoleLogger, - CredentialIssuancePurpose, - CredoError, - JsonTransformer, - LogLevel, - W3cCredential, - W3cJsonLdVerifiableCredential, - W3cJsonLdVerifiablePresentation, - W3cPresentation, - vcLibraries, -} from '@credo-ts/core' - -import { W3C_FIXTURES } from './fixtures' -import { getHederaAgent, waitTimeout } from './utils' - -const { jsonldSignatures } = vcLibraries -const { purposes } = jsonldSignatures - -const logger = new ConsoleLogger(LogLevel.error) - -//let did: string -//const did = 'did:hedera:testnet:zQDui45JN8tAZyc8aNcgcDp26wPJgVyQnw1wupqaqexKGWgsuMVfgzKmGfyg8fWPt_0.0.5139447' -const did = 'did:hedera:testnet:zGdjMu1hPkjbJXSPPp6RgTptnpYYM9uEkPeNbPhSkXTon_0.0.5139753' - -const _seed = '11011000010000111011001100010100' -// const holderSeed = '00000000000000000000000000holder' - -describe('Hedera Module did resolver', () => { - let aliceAgent: Agent - let faberAgent: Agent - - beforeAll(async () => { - // Initialize alice - aliceAgent = getHederaAgent({ - logger, - label: 'alice', - }) - await aliceAgent.initialize() - - // Initialize faber - faberAgent = getHederaAgent({ - logger, - label: 'faber', - }) - await faberAgent.initialize() - - // // Making the test did - // const didRegistrarResult = await faberAgent.dids.create({ - // method: 'hedera', - // secret: { - // seed, - // }, - // }) - // if (!didRegistrarResult.didState?.didDocument?.id) throw new Error('DidRegistrarError') - // - // did = didRegistrarResult.didState.didDocument.id - }) - - afterAll(async () => { - // Wait for messages to flush out - await waitTimeout(1000) - - if (aliceAgent) { - await aliceAgent.shutdown() - } - - if (faberAgent) { - await faberAgent.shutdown() - } - }) - - describe('W3C Issuance and Verification', () => { - let issuerDid: string - let verificationMethod: string - - beforeAll(async () => { - //const seedBuffer = TypedArrayEncoder.fromString(seed) - //await faberAgent.wallet.createKey({ keyType: KeyType.Ed25519, seed: seedBuffer }) - - const _didDoc = await faberAgent.dids.resolve(did) - - issuerDid = did - verificationMethod = `${issuerDid}#key-1` - - // create did:key for holder - await aliceAgent.dids.create({ - method: 'key', - // options: { - // keyType: KeyType.Ed25519, - // }, - //seed: TypedArrayEncoder.fromString(holderSeed), - }) - }) - - describe('signCredential', () => { - it('should return a successfully signed credential', async () => { - const credentialJson = W3C_FIXTURES.TEST_LD_DOCUMENT - credentialJson.issuer = issuerDid - - const credential = JsonTransformer.fromJSON(credentialJson, W3cCredential) - - const vc = await faberAgent.w3cCredentials.signCredential({ - format: ClaimFormat.LdpVc, - credential, - proofType: 'Ed25519Signature2018', - verificationMethod, - }) - - expect(vc).toBeInstanceOf(W3cJsonLdVerifiableCredential) - expect(vc.issuer).toEqual(issuerDid) - expect(Array.isArray(vc.proof)).toBe(false) - //expect(vc.proof).toBeInstanceOf(LinkedDataProof) - - //vc.proof = vc.proof as any//LinkedDataProof - expect((vc.proof as any).verificationMethod).toEqual(verificationMethod) - }) - - it('should throw because of verificationMethod does not belong to this wallet', async () => { - const credentialJson = W3C_FIXTURES.TEST_LD_DOCUMENT - credentialJson.issuer = issuerDid - - const credential = JsonTransformer.fromJSON(credentialJson, W3cCredential) - - expect(async () => { - await faberAgent.w3cCredentials.signCredential({ - format: ClaimFormat.LdpVc, - credential, - proofType: 'Ed25519Signature2018', - verificationMethod: - 'did:hedera:testnet:zGdjMu1hPkjbJXSPPp6RgTptnpYYM9uEkPeNbPhSkXTon_0.0.5139619#did-root-key', - }) - }).rejects.toThrow(CredoError) - }) - }) - - describe('verifyCredential', () => { - it('should verify the credential successfully', async () => { - const result = await aliceAgent.w3cCredentials.verifyCredential({ - credential: JsonTransformer.fromJSON(W3C_FIXTURES.TEST_LD_DOCUMENT_SIGNED, W3cJsonLdVerifiableCredential), - proofPurpose: new purposes.AssertionProofPurpose(), - }) - - expect(result.isValid).toEqual(true) - }) - - it('should fail because of invalid signature', async () => { - const vc = JsonTransformer.fromJSON(W3C_FIXTURES.TEST_LD_DOCUMENT_BAD_SIGNED, W3cJsonLdVerifiableCredential) - const result = await aliceAgent.w3cCredentials.verifyCredential({ credential: vc }) - - expect(result).toEqual({ - isValid: false, - error: expect.any(Error), - validations: { - vcJs: { - error: expect.any(Error), - isValid: false, - results: expect.any(Array), - }, - }, - }) - }) - }) - - describe('signPresentation', () => { - it('should successfully create a presentation from single verifiable credential', async () => { - const presentation = JsonTransformer.fromJSON(W3C_FIXTURES.TEST_VP_DOCUMENT, W3cPresentation) - - const purpose = new CredentialIssuancePurpose({ - controller: { - id: verificationMethod, - }, - date: new Date().toISOString(), - }) - - const verifiablePresentation = await faberAgent.w3cCredentials.signPresentation({ - format: ClaimFormat.LdpVp, - presentation: presentation, - proofPurpose: purpose, - proofType: 'Ed25519Signature2018', - challenge: '7bf32d0b-39d4-41f3-96b6-45de52988e4c', - domain: 'issuer.example.com', - verificationMethod: verificationMethod, - }) - - expect(verifiablePresentation).toBeInstanceOf(W3cJsonLdVerifiablePresentation) - }) - }) - - describe('verifyPresentation', () => { - it('should successfully verify a presentation containing a single verifiable credential', async () => { - const vp = JsonTransformer.fromJSON(W3C_FIXTURES.TEST_VP_DOCUMENT_SIGNED, W3cJsonLdVerifiablePresentation) - const result = await faberAgent.w3cCredentials.verifyPresentation({ - presentation: vp, - challenge: '7bf32d0b-39d4-41f3-96b6-45de52988e4c', - }) - expect(result.isValid).toBe(true) - }) - }) - }) -}) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a0d7940849..e2ec17f6de 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -621,14 +621,14 @@ importers: specifier: npm:@hiero-did-sdk/core@0.0.2 version: 0.0.2(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) '@hiero-did-sdk/hcs': - specifier: npm:@hiero-did-sdk/hcs@0.0.5 - version: 0.0.5(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) + specifier: npm:@hiero-did-sdk/hcs@0.0.8 + version: 0.0.8(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) '@hiero-did-sdk/registrar': - specifier: npm:@hiero-did-sdk/registrar@0.0.3 - version: 0.0.3(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) - '@hiero-did-sdk/resolver': - specifier: npm:@hiero-did-sdk/resolver@0.0.7 + specifier: npm:@hiero-did-sdk/registrar@0.0.7 version: 0.0.7(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) + '@hiero-did-sdk/resolver': + specifier: npm:@hiero-did-sdk/resolver@0.0.9 + version: 0.0.9(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) devDependencies: '@credo-ts/node': specifier: workspace:* @@ -2423,6 +2423,9 @@ packages: '@hiero-did-sdk/hcs@0.0.5': resolution: {integrity: sha1-GAwjKLcSl/zGku2NCrIseiLdFwA=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/hcs/-/@hiero-did-sdk/hcs-0.0.5.tgz} + '@hiero-did-sdk/hcs@0.0.8': + resolution: {integrity: sha1-qFil2N+Fdej7dkOhouui9CJjPKA=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/hcs/-/@hiero-did-sdk/hcs-0.0.8.tgz} + '@hiero-did-sdk/lifecycle@0.0.1': resolution: {integrity: sha1-Wr9teNFTaBKQWTxg4+ciDkmKmTw=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/lifecycle/-/@hiero-did-sdk/lifecycle-0.0.1.tgz} engines: {node: '>=20'} @@ -2435,20 +2438,20 @@ packages: resolution: {integrity: sha1-ljb+sGgZZ9+LNPjqCD5/L/e/9qQ=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/publisher-internal/-/@hiero-did-sdk/publisher-internal-0.0.1.tgz} engines: {node: '>=20'} - '@hiero-did-sdk/registrar@0.0.3': - resolution: {integrity: sha1-v2Rk8H8kle/DINeOUrqNhQ3quV8=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/registrar/-/@hiero-did-sdk/registrar-0.0.3.tgz} + '@hiero-did-sdk/registrar@0.0.7': + resolution: {integrity: sha1-0z1azwZopTNh9hUg8HX4YHhbYdY=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/registrar/-/@hiero-did-sdk/registrar-0.0.7.tgz} engines: {node: '>=20'} '@hiero-did-sdk/resolver@0.0.1': resolution: {integrity: sha1-wnraBME9Nh2ZndgtpIpsJAiV/L8=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/resolver/-/@hiero-did-sdk/resolver-0.0.1.tgz} engines: {node: '>=20'} - '@hiero-did-sdk/resolver@0.0.7': - resolution: {integrity: sha1-AMoLzBMbtN95c4lTe0m5TjVn8T8=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/resolver/-/@hiero-did-sdk/resolver-0.0.7.tgz} + '@hiero-did-sdk/resolver@0.0.9': + resolution: {integrity: sha1-MRsXEmL6cphcpQMvs+LOmawRGOQ=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/resolver/-/@hiero-did-sdk/resolver-0.0.9.tgz} engines: {node: '>=20'} - '@hiero-did-sdk/signer-internal@0.0.1': - resolution: {integrity: sha1-VRle2ZFCsdlB4VX4pzmC6Fi6OXg=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/signer-internal/-/@hiero-did-sdk/signer-internal-0.0.1.tgz} + '@hiero-did-sdk/signer-internal@0.0.4': + resolution: {integrity: sha1-hwKoetJ+ZmsCfO/sLGsVyANEi/g=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/signer-internal/-/@hiero-did-sdk/signer-internal-0.0.4.tgz} engines: {node: '>=20'} '@hiero-did-sdk/verifier-internal@0.0.1': @@ -10184,6 +10187,20 @@ snapshots: - react - react-native + '@hiero-did-sdk/hcs@0.0.8(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': + dependencies: + '@hashgraph/sdk': 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/cache': 0.0.2(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/client': 0.0.3(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/core': 0.0.4(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/crypto': 0.0.2(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) + '@hiero-did-sdk/zstd': 0.0.2(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) + transitivePeerDependencies: + - bn.js + - expo-crypto + - react + - react-native + '@hiero-did-sdk/lifecycle@0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': dependencies: '@hiero-did-sdk/core': 0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) @@ -10212,15 +10229,15 @@ snapshots: - expo-crypto - react-native - '@hiero-did-sdk/registrar@0.0.3(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': + '@hiero-did-sdk/registrar@0.0.7(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': dependencies: '@hashgraph/sdk': 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) '@hiero-did-sdk/core': 0.0.4(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) '@hiero-did-sdk/lifecycle': 0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) '@hiero-did-sdk/messages': 0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) '@hiero-did-sdk/publisher-internal': 0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk/resolver': 0.0.7(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) - '@hiero-did-sdk/signer-internal': 0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/resolver': 0.0.9(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) + '@hiero-did-sdk/signer-internal': 0.0.4(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) '@hiero-did-sdk/verifier-internal': 0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) transitivePeerDependencies: - bn.js @@ -10238,11 +10255,11 @@ snapshots: - expo-crypto - react-native - '@hiero-did-sdk/resolver@0.0.7(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': + '@hiero-did-sdk/resolver@0.0.9(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': dependencies: '@hashgraph/sdk': 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) '@hiero-did-sdk/core': 0.0.4(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk/hcs': 0.0.5(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) + '@hiero-did-sdk/hcs': 0.0.8(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) '@hiero-did-sdk/verifier-internal': 0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) transitivePeerDependencies: - bn.js @@ -10250,10 +10267,10 @@ snapshots: - react - react-native - '@hiero-did-sdk/signer-internal@0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': + '@hiero-did-sdk/signer-internal@0.0.4(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': dependencies: '@hashgraph/sdk': 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk/core': 0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/core': 0.0.4(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) transitivePeerDependencies: - bn.js - expo-crypto From 8170da8f5965dec35fec44806ca7d3b024c1680a Mon Sep 17 00:00:00 2001 From: "andrey.kononov" Date: Wed, 25 Jun 2025 21:54:26 +0300 Subject: [PATCH 11/89] Implemented updateDid method Add updateDid e2e-test Debug and fix issues --- .../hedera/src/dids/HederaDidRegistrar.ts | 156 ++++----- .../hedera/src/ledger/HederaLedgerService.ts | 302 ++++++++++++++---- .../tests/HederaAnoncredsRegistry.e2e.test.ts | 10 +- .../tests/HederaDidRegistrar.e2e.test.ts | 215 ++++++++++++- .../tests/HederaDidResolver.e2e.test.ts | 5 +- packages/hedera/tests/fixtures/fixtures.ts | 182 ----------- packages/hedera/tests/fixtures/index.ts | 1 - 7 files changed, 511 insertions(+), 360 deletions(-) delete mode 100644 packages/hedera/tests/fixtures/fixtures.ts delete mode 100644 packages/hedera/tests/fixtures/index.ts diff --git a/packages/hedera/src/dids/HederaDidRegistrar.ts b/packages/hedera/src/dids/HederaDidRegistrar.ts index 62cb2a7f36..1c45d6bc06 100644 --- a/packages/hedera/src/dids/HederaDidRegistrar.ts +++ b/packages/hedera/src/dids/HederaDidRegistrar.ts @@ -1,8 +1,6 @@ import { AgentContext, - DidCreateOptions, DidCreateResult, - DidDeactivateOptions, DidDeactivateResult, DidDocument, DidDocumentRole, @@ -10,40 +8,15 @@ import { DidRecord, DidRegistrar, DidRepository, - DidUpdateOptions, DidUpdateResult, JsonTransformer, } from '@credo-ts/core' -import { HederaLedgerService } from '../ledger/HederaLedgerService' - -import { PrivateKey } from '@hashgraph/sdk' -import { HederaNetwork } from '@hiero-did-sdk/client' - -export interface HederaDidCreateOptions extends DidCreateOptions { - method: 'hedera' - did?: string - didDocument?: DidDocument - secret?: { - privateKey?: string | PrivateKey | undefined - } - options?: { - network?: HederaNetwork | string - } -} - -export interface HederaDidUpdateOptions extends DidUpdateOptions { - did: string - secret?: { - privateKey?: string | PrivateKey | undefined - } -} - -export interface HederaDidDeactivateOptions extends DidDeactivateOptions { - did: string - secret?: { - privateKey?: string | PrivateKey | undefined - } -} +import { + HederaDidCreateOptions, + HederaDidDeactivateOptions, + HederaDidUpdateOptions, + HederaLedgerService, +} from '../ledger/HederaLedgerService' export class HederaDidRegistrar implements DidRegistrar { public readonly supportedMethods = ['hedera'] @@ -56,12 +29,9 @@ export class HederaDidRegistrar implements DidRegistrar { const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) // Create did - const { did, didDocument } = await ledgerService.createDid(agentContext, { - network: options.options?.network, - privateKey: options.secret?.privateKey, - }) + const { did, didDocument } = await ledgerService.createDid(agentContext, options) - // Save the did so we know we created it and can issue with it + // Save the did to wallet const credoDidDocument = new DidDocument({ ...didDocument, service: didDocument.service?.map((s) => new DidDocumentService(s)), @@ -72,6 +42,7 @@ export class HederaDidRegistrar implements DidRegistrar { did, role: DidDocumentRole.Created, didDocument: credoDidDocument, + // todo: keys: ??? }) ) @@ -99,60 +70,53 @@ export class HederaDidRegistrar implements DidRegistrar { } } - async update(_agentContext: AgentContext, _options: HederaDidUpdateOptions): Promise { - throw new Error('Method not implemented.') - // const didRepository = agentContext.dependencyManager.resolve(DidRepository) - // const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) - // - // try { - // const { did } = options - // const { didDocument, didDocumentMetadata } = await ledgerService.resolveDid(agentContext, did) - // const didRecord = await didRepository.findCreatedDid(agentContext, did) - // if (!didDocument || didDocumentMetadata.deactivated || !didRecord) { - // return { - // didDocumentMetadata: {}, - // didRegistrationMetadata: {}, - // didState: { - // state: 'failed', - // reason: 'Did not found', - // }, - // } - // } - // - // const { didDocument: updatedDidDocument } = await ledgerService.updateDid(agentContext, { - // did, - // updates: { - // operation: , - // // id: options., - // // property: 'verificationMethod', - // // publicKeyMultibase: 'z6MkkFf6yboMwr1LQVAHqatuGYD9foRe7L2wPkEn1A7LyoQb', - // }, - // privateKey: options.secret?.privateKey, - // }) - // - // didRecord.didDocument = JsonTransformer.fromJSON(updatedDidDocument, DidDocument) - // await didRepository.update(agentContext, didRecord) - // - // return { - // didDocumentMetadata: {}, - // didRegistrationMetadata: {}, - // didState: { - // state: 'finished', - // did, - // didDocument: didRecord.didDocument, - // }, - // } - // } catch (error) { - // agentContext.config.logger.error('Error updating DID', error) - // return { - // didDocumentMetadata: {}, - // didRegistrationMetadata: {}, - // didState: { - // state: 'failed', - // reason: `Unable update DID: ${error.message}`, - // }, - // } - // } + async update(agentContext: AgentContext, options: HederaDidUpdateOptions): Promise { + const didRepository = agentContext.dependencyManager.resolve(DidRepository) + const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) + + try { + const { did } = options + const { didDocument, didDocumentMetadata } = await ledgerService.resolveDid(agentContext, did) + const didRecord = await didRepository.findCreatedDid(agentContext, did) + if (!didDocument || didDocumentMetadata.deactivated || !didRecord) { + return { + didDocumentMetadata: {}, + didRegistrationMetadata: {}, + didState: { + state: 'failed', + reason: 'Did not found', + }, + } + } + + // Update did + const { didDocument: updatedDidDocument } = await ledgerService.updateDid(agentContext, options) + + // Save the did to wallet + didRecord.didDocument = JsonTransformer.fromJSON(updatedDidDocument, DidDocument) + // todo: didRecord.keys = ??? + await didRepository.update(agentContext, didRecord) + + return { + didDocumentMetadata: {}, + didRegistrationMetadata: {}, + didState: { + state: 'finished', + did, + didDocument: didRecord.didDocument, + }, + } + } catch (error) { + agentContext.config.logger.error('Error updating DID', error) + return { + didDocumentMetadata: {}, + didRegistrationMetadata: {}, + didState: { + state: 'failed', + reason: `Unable update DID: ${error.message}`, + }, + } + } } async deactivate(agentContext: AgentContext, options: HederaDidDeactivateOptions): Promise { @@ -176,12 +140,10 @@ export class HederaDidRegistrar implements DidRegistrar { }, } } + // Deactivate did + const { didDocument: deactivatedDidDocument } = await ledgerService.deactivateDid(agentContext, options) - const { didDocument: deactivatedDidDocument } = await ledgerService.deactivateDid(agentContext, { - did: options.did, - privateKey: options.secret?.privateKey, - }) - + // Save the did to wallet didRecord.didDocument = JsonTransformer.fromJSON(deactivatedDidDocument, DidDocument) await didRepository.update(agentContext, didRecord) diff --git a/packages/hedera/src/ledger/HederaLedgerService.ts b/packages/hedera/src/ledger/HederaLedgerService.ts index cfdb60c3f9..4af84442bd 100644 --- a/packages/hedera/src/ledger/HederaLedgerService.ts +++ b/packages/hedera/src/ledger/HederaLedgerService.ts @@ -1,4 +1,4 @@ -import type { +import { GetCredentialDefinitionReturn, GetRevocationRegistryDefinitionReturn, GetRevocationStatusListReturn, @@ -12,30 +12,58 @@ import type { RegisterSchemaOptions, RegisterSchemaReturn, } from '@credo-ts/anoncreds' -import { type AgentContext, injectable } from '@credo-ts/core' +import { + type AgentContext, + DidCreateOptions, + DidDeactivateOptions, + DidDocument, + DidUpdateOptions, + injectable, +} from '@credo-ts/core' import { Client, PrivateKey } from '@hashgraph/sdk' import { HederaAnoncredsRegistry } from '@hiero-did-sdk/anoncreds' import { HederaClientService } from '@hiero-did-sdk/client' import { HederaNetwork } from '@hiero-did-sdk/client/dist/index' -import { DIDResolution, KeysUtility } from '@hiero-did-sdk/core' +import { DIDResolution, KeysUtility, Service, VerificationMethod } from '@hiero-did-sdk/core' import { CreateDIDResult, - DeactivateDIDOptions, + DIDUpdateBuilder, DeactivateDIDResult, - UpdateDIDOptions, UpdateDIDResult, - createDID, deactivateDID, generateCreateDIDRequest, + generateUpdateDIDRequest, submitCreateDIDRequest, + submitUpdateDIDRequest, } from '@hiero-did-sdk/registrar' import { TopicReaderHederaHcs, parseDID, resolveDID } from '@hiero-did-sdk/resolver' import { HederaModuleConfig } from '../HederaModuleConfig' import { CredoCache } from '../cache/CredoCache' -export interface HederaLedgerServiceDidCreateOptions { - network?: HederaNetwork | string - privateKey?: string | PrivateKey | undefined +export interface HederaDidCreateOptions extends DidCreateOptions { + method: 'hedera' + did?: string + didDocument?: DidDocument + secret: { + privateKey: string | PrivateKey + } + options?: { + network?: HederaNetwork | string + } +} + +export interface HederaDidUpdateOptions extends DidUpdateOptions { + did: string + secret: { + privateKey: string | PrivateKey + } +} + +export interface HederaDidDeactivateOptions extends DidDeactivateOptions { + did: string + secret: { + privateKey: string | PrivateKey + } } @injectable() @@ -53,70 +81,114 @@ export class HederaLedgerService { return await resolveDID(did, 'application/ld+json;profile="https://w3id.org/did-resolution"', { topicReader }) } - public async createDid( - agentContext: AgentContext, - options: HederaLedgerServiceDidCreateOptions - ): Promise { - return this.clientService.withClient({ networkName: options.network }, async (client: Client) => { + public async createDid(agentContext: AgentContext, props: HederaDidCreateOptions): Promise { + const { options, secret, didDocument } = props + return this.clientService.withClient({ networkName: options?.network }, async (client: Client) => { const topicReader = this.getHederaHcsTopicReader(agentContext) - - if (options.privateKey) { - const rootKey = - options.privateKey instanceof PrivateKey - ? options.privateKey - : PrivateKey.fromStringED25519(options.privateKey) - const publicMultibaseRootKey = KeysUtility.fromPublicKey(rootKey.publicKey).toMultibase() - const { state, signingRequest } = await generateCreateDIDRequest( - { - multibasePublicKey: publicMultibaseRootKey, - }, - { - client, - } - ) - const signature = rootKey.sign(signingRequest.serializedPayload) - return await submitCreateDIDRequest( - { state, signature, waitForDIDVisibility: false }, - { - client, - } - ) - } - return await createDID( + const rootKey = + secret.privateKey instanceof PrivateKey ? secret.privateKey : PrivateKey.fromStringED25519(secret.privateKey) + const multibasePublicKey = KeysUtility.fromPublicKey(rootKey.publicKey).toMultibase() + const { state, signingRequest } = await generateCreateDIDRequest( { - waitForDIDVisibility: false, + multibasePublicKey, topicReader, }, - { client } + { + client, + } + ) + const signature = rootKey.sign(signingRequest.serializedPayload) + const createdDidDocument = await submitCreateDIDRequest( + { state, signature, topicReader }, + { + client, + } ) + + if (didDocument) { + // update did document + const { didDocument: updatedDidDocument } = await this.updateDid(agentContext, { + did: createdDidDocument.did, + didDocumentOperation: 'setDidDocument', + didDocument: didDocument, + options: { ...options }, + secret: { ...secret }, + }) + return { + did: createdDidDocument.did, + didDocument: updatedDidDocument, + privateKey: undefined, + } + } + + return createdDidDocument }) } - public async updateDid(_agentContext: AgentContext, _props: UpdateDIDOptions): Promise { - throw new Error('Method not implemented.') - // const { network: networkName } = parseDID(props.did) - // return this.clientService.withClient({ networkName }, async (client: Client) => { - // const topicReader = this.getHederaHcsTopicReader(agentContext) - // return await updateDID( - // { - // ...props, - // waitForDIDVisibility: false, - // topicReader, - // }, - // { client } - // ) - // }) + public async updateDid(agentContext: AgentContext, props: HederaDidUpdateOptions): Promise { + const { did, didDocumentOperation, didDocument, secret } = props + + if (!didDocumentOperation) { + throw new Error('DidDocumentOperation is required') + } + + const { network: networkName } = parseDID(did) + return this.clientService.withClient({ networkName }, async (client: Client) => { + const topicReader = this.getHederaHcsTopicReader(agentContext) + + const currentDidDocumentResolution = await resolveDID( + did, + 'application/ld+json;profile="https://w3id.org/did-resolution"', + { topicReader } + ) + if (!currentDidDocumentResolution.didDocument) { + throw new Error(`DID ${did} not found`) + } + + const didUpdates = this.prepareDidUpdates( + currentDidDocumentResolution.didDocument, + didDocument, + didDocumentOperation + ) + + const { states, signingRequests } = await generateUpdateDIDRequest( + { + did, + updates: didUpdates.build(), + topicReader, + }, + { + client, + } + ) + + const rootKey = + secret.privateKey instanceof PrivateKey ? secret.privateKey : PrivateKey.fromStringED25519(secret.privateKey) + const signatures = this.signRequests(signingRequests, rootKey) + return await submitUpdateDIDRequest( + { + states, + signatures, + topicReader, + }, + { + client, + } + ) + }) } - public async deactivateDid(agentContext: AgentContext, props: DeactivateDIDOptions): Promise { + public async deactivateDid( + agentContext: AgentContext, + props: HederaDidDeactivateOptions + ): Promise { const { network: networkName } = parseDID(props.did) return this.clientService.withClient({ networkName }, async (client: Client) => { const topicReader = this.getHederaHcsTopicReader(agentContext) return await deactivateDID( { did: props.did, - privateKey: props.privateKey, - waitForDIDVisibility: false, + privateKey: props.secret?.privateKey, topicReader, }, { client } @@ -185,6 +257,8 @@ export class HederaLedgerService { return await sdk.registerRevocationStatusList(options) } + // Private methods + private getHederaHcsTopicReader(agentContext: AgentContext): TopicReaderHederaHcs { const cache = this.config.options.cache ?? new CredoCache(agentContext) return new TopicReaderHederaHcs({ ...this.config.options, cache }) @@ -194,4 +268,118 @@ export class HederaLedgerService { const cache = this.config.options.cache ?? new CredoCache(agentContext) return new HederaAnoncredsRegistry({ ...this.config.options, cache }) } + + private getId(item: { id: string } | string): string { + const id = typeof item === 'string' ? item : item.id + return id.includes('#') ? `#${id.split('#').pop()}` : id + } + + private getDiff(currentArray?: any[], newArray?: any[]) { + const currentList = currentArray || [] + const newList = newArray || [] + + const currentIds = new Set(currentList.map((item) => this.getId(item))) + const newIds = new Set(newList.map((item) => this.getId(item))) + + const existingItems = newList.filter((item) => currentIds.has(this.getId(item))).map((item) => item.id) + const newItems = newList.filter((item) => !currentIds.has(this.getId(item))) + const missingItems = currentList.filter((item) => !newIds.has(this.getId(item))) + + return { existingItems, newItems, missingItems } + } + + private signRequests(signingRequests: Record, privateKey: PrivateKey): Record { + return Object.entries(signingRequests).reduce((acc, [key, request]) => { + return { + ...acc, + [key]: privateKey.sign(request.serializedPayload), + } + }, {}) + } + + private prepareDidUpdates(currentDoc: any, newDoc: any, operation: string): DIDUpdateBuilder { + const builder = new DIDUpdateBuilder() + const fields = [ + 'service', + 'verificationMethod', + 'assertionMethod', + 'authentication', + 'capabilityDelegation', + 'capabilityInvocation', + 'keyAgreement', + ] + + fields.forEach((field) => { + const { existingItems, newItems, missingItems } = this.getDiff(currentDoc[field], newDoc[field]) + + if (operation === 'setDidDocument') { + missingItems.forEach((item) => { + this.getUpdateMethod(builder, field, 'remove')(this.getId(item)) + }) + newItems.forEach((item) => { + this.getUpdateMethod(builder, field, 'add')(item) + }) + } + + if (operation === 'addToDidDocument') { + newItems.forEach((item) => { + this.getUpdateMethod(builder, field, 'add')(item) + }) + } + + if (operation === 'removeFromDidDocument') { + existingItems.forEach((item) => { + this.getUpdateMethod(builder, field, 'remove')(item) + }) + } + }) + + return builder + } + + private getUpdateMethod( + builder: DIDUpdateBuilder, + field: string, + action: 'add' | 'remove' + ): (item: any) => DIDUpdateBuilder { + type MethodDelegate = (item: any) => DIDUpdateBuilder + + const methodMap: Record> = { + service: { + add: (item: Service) => builder.addService(item), + remove: (id: string) => builder.removeService(id), + }, + verificationMethod: { + add: (item: VerificationMethod | string) => builder.addVerificationMethod(item), + remove: (id: string) => builder.removeVerificationMethod(id), + }, + assertionMethod: { + add: (item: VerificationMethod | string) => builder.addAssertionMethod(item), + remove: (id: string) => builder.removeAssertionMethod(id), + }, + authentication: { + add: (item: VerificationMethod | string) => builder.addAuthenticationMethod(item), + remove: (id: string) => builder.removeAuthenticationMethod(id), + }, + capabilityDelegation: { + add: (item: VerificationMethod | string) => builder.addCapabilityDelegationMethod(item), + remove: (id: string) => builder.removeCapabilityDelegationMethod(id), + }, + capabilityInvocation: { + add: (item: VerificationMethod | string) => builder.addCapabilityInvocationMethod(item), + remove: (id: string) => builder.removeCapabilityInvocationMethod(id), + }, + keyAgreement: { + add: (item: VerificationMethod | string) => builder.addKeyAgreementMethod(item), + remove: (id: string) => builder.removeKeyAgreementMethod(id), + }, + } + + const fieldMethods = methodMap[field] + if (!fieldMethods) { + return () => builder + } + + return fieldMethods[action] + } } diff --git a/packages/hedera/tests/HederaAnoncredsRegistry.e2e.test.ts b/packages/hedera/tests/HederaAnoncredsRegistry.e2e.test.ts index bad119056b..9c469d8ecf 100644 --- a/packages/hedera/tests/HederaAnoncredsRegistry.e2e.test.ts +++ b/packages/hedera/tests/HederaAnoncredsRegistry.e2e.test.ts @@ -2,14 +2,14 @@ import { Agent, ConsoleLogger, LogLevel, utils } from '@credo-ts/core' import { getHederaAgent, waitTimeout } from './utils' import { testCache } from './utils/testCache' -const seed = '11011000010000111011001100010100' -const consensusTimeout = 5000 - describe('Hedera AnonCreds support', () => { + const privateKey = process.env.HEDERA_TEST_OPERATOR_KEY ?? '' + const consensusTimeout = 5000 + let agent: Agent let did: string - const logger = new ConsoleLogger(LogLevel.debug) + const logger = new ConsoleLogger(LogLevel.warn) const cache = new testCache() beforeAll(async () => { @@ -25,7 +25,7 @@ describe('Hedera AnonCreds support', () => { const didRegistrarResult = await agent.dids.create({ method: 'hedera', secret: { - seed, + privateKey, }, }) if (!didRegistrarResult.didState?.didDocument?.id) throw new Error('DidRegistrarError') diff --git a/packages/hedera/tests/HederaDidRegistrar.e2e.test.ts b/packages/hedera/tests/HederaDidRegistrar.e2e.test.ts index 152ef60f02..1d73cab1c1 100644 --- a/packages/hedera/tests/HederaDidRegistrar.e2e.test.ts +++ b/packages/hedera/tests/HederaDidRegistrar.e2e.test.ts @@ -1,15 +1,46 @@ -import { Agent, ConsoleLogger, LogLevel } from '@credo-ts/core' -import { HederaDidCreateOptions, HederaDidDeactivateOptions } from '../src/dids/HederaDidRegistrar' -import { getHederaAgent, waitTimeout } from './utils' +import { Agent, ConsoleLogger, DidDocument, DidDocumentService, LogLevel, VerificationMethod } from '@credo-ts/core' +import { + HederaDidCreateOptions, + HederaDidDeactivateOptions, + HederaDidUpdateOptions, +} from '../src/ledger/HederaLedgerService' +import { getHederaAgent } from './utils' describe('Hedera DID registrar', () => { - const consensusTimeout = 2000 - const operatorKey = process.env.HEDERA_TEST_OPERATOR_KEY ?? '' - + const privateKey = process.env.HEDERA_TEST_OPERATOR_KEY ?? '' const logger = new ConsoleLogger(LogLevel.error) - let agent: Agent + const validDid = 'did:hedera:testnet:44eesExqdsUvLZ35FpnBPErqRGRnYbzzyG3wgCCYxkmq_0.0.6226170' + + function validVerificationMethod() { + return new VerificationMethod({ + id: '#key-1', + type: 'Ed25519VerificationKey2020', + controller: validDid, + publicKeyMultibase: 'z44eesExqdsUvLZ35FpnBPErqRGRnYbzzyG3wgCCYxkmq', + }) + } + + function validService() { + return new DidDocumentService({ + id: '#service-1', + type: 'CustomType', + serviceEndpoint: ['https://rand.io'], + }) + } + + function validDidDoc() { + const service = [validService()] + const verificationMethod = [validVerificationMethod()] + + return new DidDocument({ + id: validDid, + verificationMethod, + service, + }) + } + beforeAll(async () => { agent = getHederaAgent({ logger, @@ -22,10 +53,11 @@ describe('Hedera DID registrar', () => { await agent.shutdown() }) - it('should create a did:hedera did', async () => { + it('should create a did:hedera did document', async () => { const didResult = await agent.dids.create({ method: 'hedera', options: { network: 'testnet' }, + secret: { privateKey }, }) expect(didResult).toMatchObject({ didState: { @@ -42,20 +74,175 @@ describe('Hedera DID registrar', () => { }) }) - it('should create and add service to a did:hedera did', async () => { + it('should create a did:hedera did document with document presets', async () => { const didResult = await agent.dids.create({ method: 'hedera', + didDocument: validDidDoc(), options: { network: 'testnet' }, + secret: { privateKey }, + }) + expect(didResult.didState.state).toEqual('finished') + + const verificationMethod = validVerificationMethod() + expect(didResult.didState.didDocument?.verificationMethod).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + id: expect.stringContaining('#did-root-key'), + type: expect.any(String), + controller: didResult.didState.didDocument?.id, + publicKeyMultibase: expect.any(String), + }), + expect.objectContaining({ + id: expect.stringContaining(verificationMethod.id), + type: verificationMethod.type, + controller: verificationMethod.controller, + publicKeyMultibase: verificationMethod.publicKeyMultibase, + }), + ]) + ) + + const service = validService() + expect(didResult.didState.didDocument?.service).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + id: expect.stringContaining(service.id), + type: service.type, + serviceEndpoint: service.serviceEndpoint, + }), + ]) + ) + }) + + it('should create a did:hedera did document, add and remove service', async () => { + // create document + const didResult = await agent.dids.create({ + method: 'hedera', + options: { + network: 'testnet', + }, + secret: { + privateKey, + }, }) expect(didResult).toMatchObject({ didState: { state: 'finished' } }) + + const did = didResult.didState.did! + const didDocument = didResult.didState.didDocument as DidDocument + didDocument.service = [validService()] + + // add service to the document + const addUpdateResult = await agent.dids.update({ + did, + didDocument, + didDocumentOperation: 'addToDidDocument', + secret: { + privateKey, + }, + }) + + expect(addUpdateResult.didState.state).toEqual('finished') + expect(addUpdateResult.didState.didDocument?.id).toEqual(did) + + const resolvedDocument = await agent.dids.resolve(did, { + useLocalCreatedDidRecord: false, + }) + expect(resolvedDocument.didDocument?.id).toEqual(did) + + const service = validService() + expect(resolvedDocument.didDocument?.service).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + id: expect.stringContaining(service.id), + type: service.type, + serviceEndpoint: service.serviceEndpoint, + }), + ]) + ) + + // remove service from the document + const removeUpdateResult = await agent.dids.update({ + did, + didDocument: { + ...didDocument, + verificationMethod: undefined, + }, + didDocumentOperation: 'removeFromDidDocument', + secret: { + privateKey, + }, + }) + + expect(removeUpdateResult.didState.state).toEqual('finished') + expect(removeUpdateResult.didState.didDocument?.id).toEqual(did) + + const removeResolvedDocument = await agent.dids.resolve(did, { + useLocalCreatedDidRecord: false, + }) + expect(removeResolvedDocument.didDocument?.id).toEqual(did) + expect(removeResolvedDocument.didDocument?.service ?? []).toHaveLength(0) }) - it('should create and add verification to a did:hedera did', async () => { + it('should create a did:hedera did document, add and remove verification method', async () => { + // create did document const didResult = await agent.dids.create({ method: 'hedera', options: { network: 'testnet' }, + secret: { privateKey }, }) expect(didResult).toMatchObject({ didState: { state: 'finished' } }) + + const did = didResult.didState.did! + const didDocument = didResult.didState.didDocument as DidDocument + + const validVerification = validVerificationMethod() + didDocument.verificationMethod = [validVerification] + + // add verification method to the document + const addUpdateResult = await agent.dids.update({ + did, + didDocument, + didDocumentOperation: 'addToDidDocument', + secret: { + privateKey, + }, + }) + expect(addUpdateResult.didState.didDocument?.id).toEqual(did) + expect(addUpdateResult.didState.state).toEqual('finished') + + const addResolvedDocument = await agent.dids.resolve(did, { + useLocalCreatedDidRecord: false, + }) + + expect(addResolvedDocument.didDocument?.id).toEqual(did) + expect(addResolvedDocument.didDocument?.verificationMethod).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + id: expect.stringContaining(validVerification.id), + type: validVerification.type, + controller: validVerification.controller, + publicKeyMultibase: validVerification.publicKeyMultibase, + }), + ]) + ) + + // remove verification method from the document + const removeUpdateResult = await agent.dids.update({ + did, + didDocument, + didDocumentOperation: 'removeFromDidDocument', + secret: { + privateKey, + }, + }) + expect(removeUpdateResult.didState.didDocument?.id).toEqual(did) + expect(removeUpdateResult.didState.state).toEqual('finished') + + const removeResolvedDocument = await agent.dids.resolve(did, { + useLocalCreatedDidRecord: false, + }) + + expect(removeResolvedDocument.didDocument?.id).toEqual(did) + expect(removeResolvedDocument.didDocument?.service ?? []).toHaveLength(0) }) it('should create and deactivate a did:hedera did', async () => { @@ -65,27 +252,23 @@ describe('Hedera DID registrar', () => { network: 'testnet', }, secret: { - privateKey: operatorKey, + privateKey, }, }) expect(didResult).toMatchObject({ didState: { state: 'finished' } }) const did = didResult.didState.did! - await waitTimeout(consensusTimeout) - const deactivateResult = await agent.dids.deactivate({ did, secret: { - privateKey: operatorKey, + privateKey, }, }) expect(deactivateResult.didState.didDocument?.id).toEqual(did) expect(deactivateResult.didState.state).toEqual('finished') - await waitTimeout(consensusTimeout) - const resolvedDocument = await agent.dids.resolve(did, { useLocalCreatedDidRecord: false, }) diff --git a/packages/hedera/tests/HederaDidResolver.e2e.test.ts b/packages/hedera/tests/HederaDidResolver.e2e.test.ts index b3546970b7..b3ea45f3a1 100644 --- a/packages/hedera/tests/HederaDidResolver.e2e.test.ts +++ b/packages/hedera/tests/HederaDidResolver.e2e.test.ts @@ -1,9 +1,10 @@ import { Agent, ConsoleLogger, JsonTransformer, LogLevel } from '@credo-ts/core' -import { HederaDidCreateOptions } from '../src/dids/HederaDidRegistrar' +import { HederaDidCreateOptions } from '../src/ledger/HederaLedgerService' import { getHederaAgent } from './utils' describe('Hedera DID resolver', () => { const logger = new ConsoleLogger(LogLevel.error) + const privateKey = process.env.HEDERA_TEST_OPERATOR_KEY ?? '' let agent: Agent let did: string @@ -15,7 +16,7 @@ describe('Hedera DID resolver', () => { }) await agent.initialize() - const didResult = await agent.dids.create({ method: 'hedera' }) + const didResult = await agent.dids.create({ method: 'hedera', secret: { privateKey } }) if (!didResult.didState.did) { throw new Error('No DID created') } diff --git a/packages/hedera/tests/fixtures/fixtures.ts b/packages/hedera/tests/fixtures/fixtures.ts deleted file mode 100644 index 01b9c18764..0000000000 --- a/packages/hedera/tests/fixtures/fixtures.ts +++ /dev/null @@ -1,182 +0,0 @@ -import { CREDENTIALS_CONTEXT_V1_URL } from '@credo-ts/core' - -export const HOLDER_DID = 'did:key:z6MkiAUh4Fh23QAqv8w8YNCFq3QSTnHV8gQSiABV5Mj9mj2m' - -export const W3C_FIXTURES = { - TEST_LD_DOCUMENT: { - '@context': [CREDENTIALS_CONTEXT_V1_URL, 'https://w3id.org/citizenship/v1'], - id: 'https://issuer.oidp.uscis.gov/credentials/83627465', - type: ['VerifiableCredential', 'PermanentResidentCard'], - issuer: '', - identifier: '83627465', - name: 'Permanent Resident Card', - description: 'Government of Example Permanent Resident Card.', - issuanceDate: '2019-12-03T12:19:52Z', - expirationDate: '2029-12-03T12:19:52Z', - credentialSubject: { - id: HOLDER_DID, - type: ['PermanentResident', 'Person'], - givenName: 'JOHN', - familyName: 'SMITH', - gender: 'Male', - image: 'data:image/png;base64,iVBORw0KGgokJggg==', - residentSince: '2015-01-01', - lprCategory: 'C09', - lprNumber: '999-999-999', - commuterClassification: 'C1', - birthCountry: 'Bahamas', - birthDate: '1958-07-17', - }, - }, - - TEST_LD_DOCUMENT_SIGNED: { - '@context': ['https://www.w3.org/2018/credentials/v1', 'https://w3id.org/citizenship/v1'], - id: 'https://issuer.oidp.uscis.gov/credentials/83627465', - type: ['VerifiableCredential', 'PermanentResidentCard'], - issuer: 'did:hedera:testnet:zGdjMu1hPkjbJXSPPp6RgTptnpYYM9uEkPeNbPhSkXTon_0.0.5139753', - identifier: '83627465', - name: 'Permanent Resident Card', - description: 'Government of Example Permanent Resident Card.', - issuanceDate: '2019-12-03T12:19:52Z', - expirationDate: '2029-12-03T12:19:52Z', - credentialSubject: { - type: ['PermanentResident', 'Person'], - givenName: 'JOHN', - familyName: 'SMITH', - gender: 'Male', - image: 'data:image/png;base64,iVBORw0KGgokJggg==', - residentSince: '2015-01-01', - lprCategory: 'C09', - lprNumber: '999-999-999', - commuterClassification: 'C1', - birthCountry: 'Bahamas', - birthDate: '1958-07-17', - id: 'did:key:z6MkiAUh4Fh23QAqv8w8YNCFq3QSTnHV8gQSiABV5Mj9mj2m', - }, - proof: { - verificationMethod: 'did:hedera:testnet:zGdjMu1hPkjbJXSPPp6RgTptnpYYM9uEkPeNbPhSkXTon_0.0.5139753#key-1', - type: 'Ed25519Signature2018', - created: '2024-11-17T14:28:27Z', - proofPurpose: 'assertionMethod', - jws: 'eyJhbGciOiJFZERTQSIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY0Il19..Dq-AI4T_H4E3bdwSb4omyetKimTogtXWNV4HtNtLYoHLl0f0ddbF3hv807ssGtck51uMUTISkZ7zkdNdn0hZAA', - }, - }, - TEST_LD_DOCUMENT_BAD_SIGNED: { - '@context': ['https://www.w3.org/2018/credentials/v1', 'https://w3id.org/citizenship/v1'], - id: 'https://issuer.oidp.uscis.gov/credentials/83627465', - type: ['VerifiableCredential', 'PermanentResidentCard'], - issuer: 'did:hedera:testnet:zGdjMu1hPkjbJXSPPp6RgTptnpYYM9uEkPeNbPhSkXTon_0.0.5139619', - identifier: '83627465', - name: 'Permanent Resident Card', - description: 'Government of Example Permanent Resident Card.', - issuanceDate: '2019-12-03T12:19:52Z', - expirationDate: '2029-12-03T12:19:52Z', - credentialSubject: { - type: ['PermanentResident', 'Person'], - givenName: 'JOHN', - familyName: 'SMITH', - gender: 'Male', - image: 'data:image/png;base64,iVBORw0KGgokJggg==', - residentSince: '2015-01-01', - lprCategory: 'C09', - lprNumber: '999-999-999', - commuterClassification: 'C1', - birthCountry: 'Bahamas', - birthDate: '1958-07-17', - id: 'did:key:z6MkiAUh4Fh23QAqv8w8YNCFq3QSTnHV8gQSiABV5Mj9mj2m', - }, - proof: { - verificationMethod: 'did:hedera:testnet:zGdjMu1hPkjbJXSPPp6RgTptnpYYM9uEkPeNbPhSkXTon_0.0.5139619#key-1', - type: 'Ed25519Signature2018', - created: '2024-11-17T13:02:11Z', - proofPurpose: 'assertionMethod', - jws: 'eyJhbGciOiJFZERTQSIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY78Il19..J50c8CreYwZfvF63sKJvdyVGZIh6m8GwORWKgsL34nfRi4AuUVBOpCD_2PhPvk8lgkXmKMfeSu2dHU5s6V--Dg', - }, - }, - - TEST_VP_DOCUMENT: { - '@context': [CREDENTIALS_CONTEXT_V1_URL], - type: ['VerifiablePresentation'], - verifiableCredential: [ - { - '@context': ['https://www.w3.org/2018/credentials/v1', 'https://w3id.org/citizenship/v1'], - id: 'https://issuer.oidp.uscis.gov/credentials/83627465', - type: ['VerifiableCredential', 'PermanentResidentCard'], - issuer: 'did:hedera:testnet:zGdjMu1hPkjbJXSPPp6RgTptnpYYM9uEkPeNbPhSkXTon_0.0.5139619', - identifier: '83627465', - name: 'Permanent Resident Card', - description: 'Government of Example Permanent Resident Card.', - issuanceDate: '2019-12-03T12:19:52Z', - expirationDate: '2029-12-03T12:19:52Z', - credentialSubject: { - type: ['PermanentResident', 'Person'], - givenName: 'JOHN', - familyName: 'SMITH', - gender: 'Male', - image: 'data:image/png;base64,iVBORw0KGgokJggg==', - residentSince: '2015-01-01', - lprCategory: 'C09', - lprNumber: '999-999-999', - commuterClassification: 'C1', - birthCountry: 'Bahamas', - birthDate: '1958-07-17', - id: 'did:key:z6MkiAUh4Fh23QAqv8w8YNCFq3QSTnHV8gQSiABV5Mj9mj2m', - }, - proof: { - verificationMethod: 'did:hedera:testnet:zGdjMu1hPkjbJXSPPp6RgTptnpYYM9uEkPeNbPhSkXTon_0.0.5139619#key-1', - type: 'Ed25519Signature2018', - created: '2024-11-17T13:02:11Z', - proofPurpose: 'assertionMethod', - jws: 'eyJhbGciOiJFZERTQSIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY0Il19..J50c8CreYwZfvF63sKJvdyVGZIh6m8GwORWKgsL34nfRi4AuUVBOpCD_2PhPvk8lgkXmKMfeSu2dHU5s6V--Dg', - }, - }, - ], - }, - TEST_VP_DOCUMENT_SIGNED: { - '@context': ['https://www.w3.org/2018/credentials/v1'], - type: ['VerifiablePresentation'], - verifiableCredential: [ - { - '@context': ['https://www.w3.org/2018/credentials/v1', 'https://w3id.org/citizenship/v1'], - id: 'https://issuer.oidp.uscis.gov/credentials/83627465', - type: ['VerifiableCredential', 'PermanentResidentCard'], - issuer: 'did:hedera:testnet:zGdjMu1hPkjbJXSPPp6RgTptnpYYM9uEkPeNbPhSkXTon_0.0.5139619', - identifier: '83627465', - name: 'Permanent Resident Card', - description: 'Government of Example Permanent Resident Card.', - issuanceDate: '2019-12-03T12:19:52Z', - expirationDate: '2029-12-03T12:19:52Z', - credentialSubject: { - type: ['PermanentResident', 'Person'], - givenName: 'JOHN', - familyName: 'SMITH', - gender: 'Male', - image: 'data:image/png;base64,iVBORw0KGgokJggg==', - residentSince: '2015-01-01', - lprCategory: 'C09', - lprNumber: '999-999-999', - commuterClassification: 'C1', - birthCountry: 'Bahamas', - birthDate: '1958-07-17', - id: 'did:key:z6MkiAUh4Fh23QAqv8w8YNCFq3QSTnHV8gQSiABV5Mj9mj2m', - }, - proof: { - verificationMethod: 'did:hedera:testnet:zGdjMu1hPkjbJXSPPp6RgTptnpYYM9uEkPeNbPhSkXTon_0.0.5139619#key-1', - type: 'Ed25519Signature2018', - created: '2024-11-17T13:02:11Z', - proofPurpose: 'assertionMethod', - jws: 'eyJhbGciOiJFZERTQSIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY0Il19..J50c8CreYwZfvF63sKJvdyVGZIh6m8GwORWKgsL34nfRi4AuUVBOpCD_2PhPvk8lgkXmKMfeSu2dHU5s6V--Dg', - }, - }, - ], - proof: { - verificationMethod: 'did:hedera:testnet:zGdjMu1hPkjbJXSPPp6RgTptnpYYM9uEkPeNbPhSkXTon_0.0.5139753#key-1', - type: 'Ed25519Signature2018', - created: '2024-11-17T14:28:30Z', - proofPurpose: 'authentication', - challenge: '7bf32d0b-39d4-41f3-96b6-45de52988e4c', - domain: 'issuer.example.com', - jws: 'eyJhbGciOiJFZERTQSIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY0Il19..TzXuwFtj4r8HaS-TsRHB7gl-HyGPhnWQJUPqWE1OxyBirPzcVskOiSKdnaNcw95DzSfkTYCHIE1U16P-rSlTCA', - }, - }, -} diff --git a/packages/hedera/tests/fixtures/index.ts b/packages/hedera/tests/fixtures/index.ts deleted file mode 100644 index 272a535796..0000000000 --- a/packages/hedera/tests/fixtures/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './fixtures' From da8b7853545b189d01b9728cabe53202d0713f63 Mon Sep 17 00:00:00 2001 From: "andrey.kononov" Date: Thu, 26 Jun 2025 20:28:41 +0300 Subject: [PATCH 12/89] Working with KMS keys --- demo/src/Faber.ts | 6 +- demo/src/FaberInquirer.ts | 2 +- packages/hedera/package.json | 3 +- .../hedera/src/dids/HederaDidRegistrar.ts | 37 ++++++++- .../hedera/src/ledger/HederaLedgerService.ts | 78 ++++++++++++++----- .../src/{ => ledger}/cache/CredoCache.ts | 0 .../hedera/src/ledger/publisher/Publisher.ts | 15 ++++ .../tests/HederaDidRegistrar.e2e.test.ts | 1 + .../tests/HederaDidResolver.e2e.test.ts | 23 +++++- pnpm-lock.yaml | 3 + 10 files changed, 141 insertions(+), 27 deletions(-) rename packages/hedera/src/{ => ledger}/cache/CredoCache.ts (100%) create mode 100644 packages/hedera/src/ledger/publisher/Publisher.ts diff --git a/demo/src/Faber.ts b/demo/src/Faber.ts index b6523610cb..30990da956 100644 --- a/demo/src/Faber.ts +++ b/demo/src/Faber.ts @@ -14,6 +14,7 @@ import { Color, Output, greenText, purpleText, redText } from './OutputClass' export enum RegistryOptions { indy = 'did:indy', cheqd = 'did:cheqd', + hedera = 'did:hedera', } export class Faber extends BaseAgent { @@ -40,9 +41,10 @@ export class Faber extends BaseAgent { const unqualifiedIndyDid = '2jEvRuKmfBJTRa7QowDpNN' const cheqdDid = 'did:cheqd:testnet:d37eba59-513d-42d3-8f9f-d1df0548b675' const indyDid = `did:indy:${indyNetworkConfig.indyNamespace}:${unqualifiedIndyDid}` - const didDocumentRelativeKeyId = registry === RegistryOptions.indy ? '#verkey' : '#key-1' + const hederaDid = 'did:hedera:testnet:44eesExqdsUvLZ35FpnBPErqRGRnYbzzyG3wgCCYxkmq_0.0.6231121' + const didDocumentRelativeKeyId = registry === RegistryOptions.indy ? '#verkey' : registry === RegistryOptions.cheqd ? '#key-1' : '#did-root-key' - const did = registry === RegistryOptions.indy ? indyDid : cheqdDid + const did = registry === RegistryOptions.indy ? indyDid : registry === RegistryOptions.cheqd ? cheqdDid : hederaDid const { privateJwk } = transformPrivateKeyToPrivateJwk({ type: { crv: 'Ed25519', diff --git a/demo/src/FaberInquirer.ts b/demo/src/FaberInquirer.ts index 31d9958776..26eb97e3e2 100644 --- a/demo/src/FaberInquirer.ts +++ b/demo/src/FaberInquirer.ts @@ -90,7 +90,7 @@ export class FaberInquirer extends BaseInquirer { } public async credential() { - const registry = await prompt([this.inquireOptions([RegistryOptions.indy, RegistryOptions.cheqd])]) + const registry = await prompt([this.inquireOptions([RegistryOptions.indy, RegistryOptions.cheqd, RegistryOptions.hedera])]) await this.faber.importDid(registry.options) await this.faber.issueCredential() const title = 'Is the credential offer accepted?' diff --git a/packages/hedera/package.json b/packages/hedera/package.json index 9626ac854d..7a367eef93 100644 --- a/packages/hedera/package.json +++ b/packages/hedera/package.json @@ -32,7 +32,8 @@ "@hiero-did-sdk/resolver": "npm:@hiero-did-sdk/resolver@0.0.9", "@hiero-did-sdk/core": "npm:@hiero-did-sdk/core@0.0.2", "@hiero-did-sdk/client": "npm:@hiero-did-sdk/client@0.0.3", - "@hiero-did-sdk/hcs": "npm:@hiero-did-sdk/hcs@0.0.8" + "@hiero-did-sdk/hcs": "npm:@hiero-did-sdk/hcs@0.0.8", + "@hiero-did-sdk/publisher-internal": "npm:@hiero-did-sdk/publisher-internal@0.0.1" }, "devDependencies": { "@credo-ts/node": "workspace:*", diff --git a/packages/hedera/src/dids/HederaDidRegistrar.ts b/packages/hedera/src/dids/HederaDidRegistrar.ts index 1c45d6bc06..ad3c3a4cc3 100644 --- a/packages/hedera/src/dids/HederaDidRegistrar.ts +++ b/packages/hedera/src/dids/HederaDidRegistrar.ts @@ -3,6 +3,7 @@ import { DidCreateResult, DidDeactivateResult, DidDocument, + DidDocumentKey, DidDocumentRole, DidDocumentService, DidRecord, @@ -11,6 +12,8 @@ import { DidUpdateResult, JsonTransformer, } from '@credo-ts/core' +import { PrivateKey } from '@hashgraph/sdk' +import { KeysUtility } from '@hiero-did-sdk/core' import { HederaDidCreateOptions, HederaDidDeactivateOptions, @@ -36,13 +39,24 @@ export class HederaDidRegistrar implements DidRegistrar { ...didDocument, service: didDocument.service?.map((s) => new DidDocumentService(s)), }) + + const hederaSignKey = + options.secret.key.hederaPrivateKey instanceof PrivateKey + ? options.secret.key.hederaPrivateKey + : PrivateKey.fromStringED25519(options.secret.key.hederaPrivateKey) + const keys = [ + { + kmsKeyId: options.secret.key.kmsKeyId, + didDocumentRelativeKeyId: KeysUtility.fromPublicKey(hederaSignKey.publicKey).toMultibase(), + } satisfies DidDocumentKey, + ] await didRepository.save( agentContext, new DidRecord({ did, role: DidDocumentRole.Created, didDocument: credoDidDocument, - // todo: keys: ??? + keys, }) ) @@ -93,8 +107,17 @@ export class HederaDidRegistrar implements DidRegistrar { const { didDocument: updatedDidDocument } = await ledgerService.updateDid(agentContext, options) // Save the did to wallet + const hederaSignKey = + options.secret.key.hederaPrivateKey instanceof PrivateKey + ? options.secret.key.hederaPrivateKey + : PrivateKey.fromStringED25519(options.secret.key.hederaPrivateKey) + const keys = didRecord.keys ?? [] + keys.push({ + kmsKeyId: options.secret.key.kmsKeyId, + didDocumentRelativeKeyId: KeysUtility.fromPublicKey(hederaSignKey.publicKey).toMultibase(), + } satisfies DidDocumentKey) didRecord.didDocument = JsonTransformer.fromJSON(updatedDidDocument, DidDocument) - // todo: didRecord.keys = ??? + didRecord.keys = keys await didRepository.update(agentContext, didRecord) return { @@ -144,7 +167,17 @@ export class HederaDidRegistrar implements DidRegistrar { const { didDocument: deactivatedDidDocument } = await ledgerService.deactivateDid(agentContext, options) // Save the did to wallet + const hederaSignKey = + options.secret.key.hederaPrivateKey instanceof PrivateKey + ? options.secret.key.hederaPrivateKey + : PrivateKey.fromStringED25519(options.secret.key.hederaPrivateKey) + const keys = didRecord.keys ?? [] + keys.push({ + kmsKeyId: options.secret.key.kmsKeyId, + didDocumentRelativeKeyId: KeysUtility.fromPublicKey(hederaSignKey.publicKey).toMultibase(), + } satisfies DidDocumentKey) didRecord.didDocument = JsonTransformer.fromJSON(deactivatedDidDocument, DidDocument) + didRecord.keys = keys await didRepository.update(agentContext, didRecord) return { diff --git a/packages/hedera/src/ledger/HederaLedgerService.ts b/packages/hedera/src/ledger/HederaLedgerService.ts index 4af84442bd..a0c0ee18cc 100644 --- a/packages/hedera/src/ledger/HederaLedgerService.ts +++ b/packages/hedera/src/ledger/HederaLedgerService.ts @@ -30,22 +30,27 @@ import { DIDUpdateBuilder, DeactivateDIDResult, UpdateDIDResult, - deactivateDID, generateCreateDIDRequest, + generateDeactivateDIDRequest, generateUpdateDIDRequest, submitCreateDIDRequest, + submitDeactivateDIDRequest, submitUpdateDIDRequest, } from '@hiero-did-sdk/registrar' import { TopicReaderHederaHcs, parseDID, resolveDID } from '@hiero-did-sdk/resolver' import { HederaModuleConfig } from '../HederaModuleConfig' -import { CredoCache } from '../cache/CredoCache' +import { CredoCache } from './cache/CredoCache' +import {Publisher} from "./publisher/Publisher"; export interface HederaDidCreateOptions extends DidCreateOptions { method: 'hedera' did?: string didDocument?: DidDocument secret: { - privateKey: string | PrivateKey + key: { + kmsKeyId: string + publicKeyMultibase: string + } } options?: { network?: HederaNetwork | string @@ -55,14 +60,20 @@ export interface HederaDidCreateOptions extends DidCreateOptions { export interface HederaDidUpdateOptions extends DidUpdateOptions { did: string secret: { - privateKey: string | PrivateKey + key: { + kmsKeyId: string + publicKeyMultibase: string + } } } export interface HederaDidDeactivateOptions extends DidDeactivateOptions { did: string secret: { - privateKey: string | PrivateKey + key: { + kmsKeyId: string + publicKeyMultibase: string + } } } @@ -85,28 +96,39 @@ export class HederaLedgerService { const { options, secret, didDocument } = props return this.clientService.withClient({ networkName: options?.network }, async (client: Client) => { const topicReader = this.getHederaHcsTopicReader(agentContext) - const rootKey = - secret.privateKey instanceof PrivateKey ? secret.privateKey : PrivateKey.fromStringED25519(secret.privateKey) - const multibasePublicKey = KeysUtility.fromPublicKey(rootKey.publicKey).toMultibase() + const controller = + typeof didDocument?.controller === 'string' + ? didDocument?.controller + : Array.isArray(didDocument?.controller) + ? didDocument?.controller[0] + : undefined + + const hederaSignKey = + secret.key.hederaPrivateKey instanceof PrivateKey + ? secret.key.hederaPrivateKey + : PrivateKey.fromStringED25519(secret.key.hederaPrivateKey) const { state, signingRequest } = await generateCreateDIDRequest( { - multibasePublicKey, + controller, + multibasePublicKey: KeysUtility.fromPublicKey(hederaSignKey.publicKey).toMultibase(), topicReader, }, { + Publisher client, } ) - const signature = rootKey.sign(signingRequest.serializedPayload) + + const signature = hederaSignKey.sign(signingRequest.serializedPayload) const createdDidDocument = await submitCreateDIDRequest( { state, signature, topicReader }, { client, + publisher: {}, } ) if (didDocument) { - // update did document const { didDocument: updatedDidDocument } = await this.updateDid(agentContext, { did: createdDidDocument.did, didDocumentOperation: 'setDidDocument', @@ -117,7 +139,6 @@ export class HederaLedgerService { return { did: createdDidDocument.did, didDocument: updatedDidDocument, - privateKey: undefined, } } @@ -162,9 +183,11 @@ export class HederaLedgerService { } ) - const rootKey = - secret.privateKey instanceof PrivateKey ? secret.privateKey : PrivateKey.fromStringED25519(secret.privateKey) - const signatures = this.signRequests(signingRequests, rootKey) + const hederaSignKey = + secret.key.hederaPrivateKey instanceof PrivateKey + ? secret.key.hederaPrivateKey + : PrivateKey.fromStringED25519(secret.key.hederaPrivateKey) + const signatures = this.signRequests(signingRequests, hederaSignKey) return await submitUpdateDIDRequest( { states, @@ -182,16 +205,33 @@ export class HederaLedgerService { agentContext: AgentContext, props: HederaDidDeactivateOptions ): Promise { + const { did, secret } = props const { network: networkName } = parseDID(props.did) return this.clientService.withClient({ networkName }, async (client: Client) => { const topicReader = this.getHederaHcsTopicReader(agentContext) - return await deactivateDID( + const { state, signingRequest } = await generateDeactivateDIDRequest( { - did: props.did, - privateKey: props.secret?.privateKey, + did, topicReader, }, - { client } + { + client, + } + ) + const hederaSignKey = + secret.key.hederaPrivateKey instanceof PrivateKey + ? secret.key.hederaPrivateKey + : PrivateKey.fromStringED25519(secret.key.hederaPrivateKey) + const signature = hederaSignKey.sign(signingRequest.serializedPayload) + return await submitDeactivateDIDRequest( + { + state, + signature, + topicReader, + }, + { + client, + } ) }) } diff --git a/packages/hedera/src/cache/CredoCache.ts b/packages/hedera/src/ledger/cache/CredoCache.ts similarity index 100% rename from packages/hedera/src/cache/CredoCache.ts rename to packages/hedera/src/ledger/cache/CredoCache.ts diff --git a/packages/hedera/src/ledger/publisher/Publisher.ts b/packages/hedera/src/ledger/publisher/Publisher.ts new file mode 100644 index 0000000000..27ad42db2d --- /dev/null +++ b/packages/hedera/src/ledger/publisher/Publisher.ts @@ -0,0 +1,15 @@ +import { Client, PublicKey } from '@hashgraph/sdk' +import { Publisher as ClientPublisher } from '@hiero-did-sdk/publisher-internal' + +export class Publisher extends ClientPublisher { + constructor( + client: Client, + private readonly submitKey?: PublicKey + ) { + super(client) + } + + publicKey(): PublicKey { + return this.submitKey ?? this.client.operatorPublicKey! + } +} diff --git a/packages/hedera/tests/HederaDidRegistrar.e2e.test.ts b/packages/hedera/tests/HederaDidRegistrar.e2e.test.ts index 1d73cab1c1..3d5dd04d42 100644 --- a/packages/hedera/tests/HederaDidRegistrar.e2e.test.ts +++ b/packages/hedera/tests/HederaDidRegistrar.e2e.test.ts @@ -59,6 +59,7 @@ describe('Hedera DID registrar', () => { options: { network: 'testnet' }, secret: { privateKey }, }) + expect(didResult).toMatchObject({ didState: { state: 'finished', diff --git a/packages/hedera/tests/HederaDidResolver.e2e.test.ts b/packages/hedera/tests/HederaDidResolver.e2e.test.ts index b3ea45f3a1..0a16db1b74 100644 --- a/packages/hedera/tests/HederaDidResolver.e2e.test.ts +++ b/packages/hedera/tests/HederaDidResolver.e2e.test.ts @@ -1,4 +1,5 @@ -import { Agent, ConsoleLogger, JsonTransformer, LogLevel } from '@credo-ts/core' +import { Agent, ConsoleLogger, JsonTransformer, Kms, LogLevel } from '@credo-ts/core' +import { PrivateKey } from '@hashgraph/sdk' import { HederaDidCreateOptions } from '../src/ledger/HederaLedgerService' import { getHederaAgent } from './utils' @@ -16,7 +17,25 @@ describe('Hedera DID resolver', () => { }) await agent.initialize() - const didResult = await agent.dids.create({ method: 'hedera', secret: { privateKey } }) + const hederaPrivateKey = PrivateKey.fromStringDer(privateKey) + hederaPrivateKey.toBytes() + + const key = await agent.kms.createKey({ + type: { + crv: 'Ed25519', + kty: 'OKP', + }, + }) + const publicKeyJwk = Kms.PublicJwk.fromPublicJwk(key.publicJwk) + const _publicKeyMultibase = publicKeyJwk.fingerprint + + const { signature } = await kms.sign({ + data: payload, + algorithm: publicJwk.signatureAlgorithm, + keyId: kmsKeyId, + }) + + const didResult = await agent.dids.create({ method: 'hedera', secret: { key: {} } }) if (!didResult.didState.did) { throw new Error('No DID created') } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e2ec17f6de..be1f99609a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -623,6 +623,9 @@ importers: '@hiero-did-sdk/hcs': specifier: npm:@hiero-did-sdk/hcs@0.0.8 version: 0.0.8(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) + '@hiero-did-sdk/publisher-internal': + specifier: npm:@hiero-did-sdk/publisher-internal@0.0.1 + version: 0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) '@hiero-did-sdk/registrar': specifier: npm:@hiero-did-sdk/registrar@0.0.7 version: 0.0.7(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) From 7808b6144f34e45b60f3a1c19f2d4fa13df783a9 Mon Sep 17 00:00:00 2001 From: "andrey.kononov" Date: Tue, 1 Jul 2025 22:51:30 +0300 Subject: [PATCH 13/89] Inject KMS to the ledger service Implement KMSPublisher Refactor DidRegstrar.Create API --- .../hedera/src/dids/HederaDidRegistrar.ts | 246 +++++++------ .../hedera/src/ledger/HederaLedgerService.ts | 323 ++++++++++-------- .../src/ledger/publisher/KmsPublisher.ts | 61 ++++ .../hedera/src/ledger/publisher/Publisher.ts | 15 - .../tests/HederaDidRegistrar.e2e.test.ts | 28 +- .../tests/HederaDidResolver.e2e.test.ts | 34 +- 6 files changed, 391 insertions(+), 316 deletions(-) create mode 100644 packages/hedera/src/ledger/publisher/KmsPublisher.ts delete mode 100644 packages/hedera/src/ledger/publisher/Publisher.ts diff --git a/packages/hedera/src/dids/HederaDidRegistrar.ts b/packages/hedera/src/dids/HederaDidRegistrar.ts index ad3c3a4cc3..d437824098 100644 --- a/packages/hedera/src/dids/HederaDidRegistrar.ts +++ b/packages/hedera/src/dids/HederaDidRegistrar.ts @@ -3,17 +3,13 @@ import { DidCreateResult, DidDeactivateResult, DidDocument, - DidDocumentKey, DidDocumentRole, DidDocumentService, DidRecord, DidRegistrar, DidRepository, DidUpdateResult, - JsonTransformer, } from '@credo-ts/core' -import { PrivateKey } from '@hashgraph/sdk' -import { KeysUtility } from '@hiero-did-sdk/core' import { HederaDidCreateOptions, HederaDidDeactivateOptions, @@ -32,7 +28,7 @@ export class HederaDidRegistrar implements DidRegistrar { const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) // Create did - const { did, didDocument } = await ledgerService.createDid(agentContext, options) + const { did, didDocument, keys } = await ledgerService.createDid(agentContext, options) // Save the did to wallet const credoDidDocument = new DidDocument({ @@ -40,16 +36,6 @@ export class HederaDidRegistrar implements DidRegistrar { service: didDocument.service?.map((s) => new DidDocumentService(s)), }) - const hederaSignKey = - options.secret.key.hederaPrivateKey instanceof PrivateKey - ? options.secret.key.hederaPrivateKey - : PrivateKey.fromStringED25519(options.secret.key.hederaPrivateKey) - const keys = [ - { - kmsKeyId: options.secret.key.kmsKeyId, - didDocumentRelativeKeyId: KeysUtility.fromPublicKey(hederaSignKey.publicKey).toMultibase(), - } satisfies DidDocumentKey, - ] await didRepository.save( agentContext, new DidRecord({ @@ -84,121 +70,123 @@ export class HederaDidRegistrar implements DidRegistrar { } } - async update(agentContext: AgentContext, options: HederaDidUpdateOptions): Promise { - const didRepository = agentContext.dependencyManager.resolve(DidRepository) - const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) - - try { - const { did } = options - const { didDocument, didDocumentMetadata } = await ledgerService.resolveDid(agentContext, did) - const didRecord = await didRepository.findCreatedDid(agentContext, did) - if (!didDocument || didDocumentMetadata.deactivated || !didRecord) { - return { - didDocumentMetadata: {}, - didRegistrationMetadata: {}, - didState: { - state: 'failed', - reason: 'Did not found', - }, - } - } - - // Update did - const { didDocument: updatedDidDocument } = await ledgerService.updateDid(agentContext, options) - - // Save the did to wallet - const hederaSignKey = - options.secret.key.hederaPrivateKey instanceof PrivateKey - ? options.secret.key.hederaPrivateKey - : PrivateKey.fromStringED25519(options.secret.key.hederaPrivateKey) - const keys = didRecord.keys ?? [] - keys.push({ - kmsKeyId: options.secret.key.kmsKeyId, - didDocumentRelativeKeyId: KeysUtility.fromPublicKey(hederaSignKey.publicKey).toMultibase(), - } satisfies DidDocumentKey) - didRecord.didDocument = JsonTransformer.fromJSON(updatedDidDocument, DidDocument) - didRecord.keys = keys - await didRepository.update(agentContext, didRecord) - - return { - didDocumentMetadata: {}, - didRegistrationMetadata: {}, - didState: { - state: 'finished', - did, - didDocument: didRecord.didDocument, - }, - } - } catch (error) { - agentContext.config.logger.error('Error updating DID', error) - return { - didDocumentMetadata: {}, - didRegistrationMetadata: {}, - didState: { - state: 'failed', - reason: `Unable update DID: ${error.message}`, - }, - } - } + async update(_agentContext: AgentContext, _options: HederaDidUpdateOptions): Promise { + throw new Error('sss') + // const didRepository = agentContext.dependencyManager.resolve(DidRepository) + // const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) + // + // try { + // const { did } = options + // const { didDocument, didDocumentMetadata } = await ledgerService.resolveDid(agentContext, did) + // const didRecord = await didRepository.findCreatedDid(agentContext, did) + // if (!didDocument || didDocumentMetadata.deactivated || !didRecord) { + // return { + // didDocumentMetadata: {}, + // didRegistrationMetadata: {}, + // didState: { + // state: 'failed', + // reason: 'Did not found', + // }, + // } + // } + // + // // Update did + // const { didDocument: updatedDidDocument } = await ledgerService.updateDid(agentContext, options) + // + // // Save the did to wallet + // const hederaSignKey = + // options.secret.key.hederaPrivateKey instanceof PrivateKey + // ? options.secret.key.hederaPrivateKey + // : PrivateKey.fromStringED25519(options.secret.key.hederaPrivateKey) + // const keys = didRecord.keys ?? [] + // keys.push({ + // kmsKeyId: options.secret.key.kmsKeyId, + // didDocumentRelativeKeyId: KeysUtility.fromPublicKey(hederaSignKey.publicKey).toMultibase(), + // } satisfies DidDocumentKey) + // didRecord.didDocument = JsonTransformer.fromJSON(updatedDidDocument, DidDocument) + // didRecord.keys = keys + // await didRepository.update(agentContext, didRecord) + // + // return { + // didDocumentMetadata: {}, + // didRegistrationMetadata: {}, + // didState: { + // state: 'finished', + // did, + // didDocument: didRecord.didDocument, + // }, + // } + // } catch (error) { + // agentContext.config.logger.error('Error updating DID', error) + // return { + // didDocumentMetadata: {}, + // didRegistrationMetadata: {}, + // didState: { + // state: 'failed', + // reason: `Unable update DID: ${error.message}`, + // }, + // } + // } } - async deactivate(agentContext: AgentContext, options: HederaDidDeactivateOptions): Promise { - const didRepository = agentContext.dependencyManager.resolve(DidRepository) - const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) - - const did = options.did - - try { - const { didDocument, didDocumentMetadata } = await ledgerService.resolveDid(agentContext, did) - - const didRecord = await didRepository.findCreatedDid(agentContext, did) - - if (!didDocument || didDocumentMetadata.deactivated || !didRecord) { - return { - didDocumentMetadata, - didRegistrationMetadata: {}, - didState: { - state: 'failed', - reason: 'Did not found', - }, - } - } - // Deactivate did - const { didDocument: deactivatedDidDocument } = await ledgerService.deactivateDid(agentContext, options) - - // Save the did to wallet - const hederaSignKey = - options.secret.key.hederaPrivateKey instanceof PrivateKey - ? options.secret.key.hederaPrivateKey - : PrivateKey.fromStringED25519(options.secret.key.hederaPrivateKey) - const keys = didRecord.keys ?? [] - keys.push({ - kmsKeyId: options.secret.key.kmsKeyId, - didDocumentRelativeKeyId: KeysUtility.fromPublicKey(hederaSignKey.publicKey).toMultibase(), - } satisfies DidDocumentKey) - didRecord.didDocument = JsonTransformer.fromJSON(deactivatedDidDocument, DidDocument) - didRecord.keys = keys - await didRepository.update(agentContext, didRecord) - - return { - didDocumentMetadata: {}, - didRegistrationMetadata: {}, - didState: { - state: 'finished', - did, - didDocument: didRecord.didDocument, - }, - } - } catch (error) { - agentContext.config.logger.error('Error deactivating DID', error) - return { - didDocumentMetadata: {}, - didRegistrationMetadata: {}, - didState: { - state: 'failed', - reason: `Unable deactivating DID: ${error.message}`, - }, - } - } + async deactivate(_agentContext: AgentContext, _options: HederaDidDeactivateOptions): Promise { + throw new Error('sss') + // const didRepository = agentContext.dependencyManager.resolve(DidRepository) + // const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) + // + // const did = options.did + // + // try { + // const { didDocument, didDocumentMetadata } = await ledgerService.resolveDid(agentContext, did) + // + // const didRecord = await didRepository.findCreatedDid(agentContext, did) + // + // if (!didDocument || didDocumentMetadata.deactivated || !didRecord) { + // return { + // didDocumentMetadata, + // didRegistrationMetadata: {}, + // didState: { + // state: 'failed', + // reason: 'Did not found', + // }, + // } + // } + // // Deactivate did + // const { didDocument: deactivatedDidDocument } = await ledgerService.deactivateDid(agentContext, options) + // + // // Save the did to wallet + // const hederaSignKey = + // options.secret.key.hederaPrivateKey instanceof PrivateKey + // ? options.secret.key.hederaPrivateKey + // : PrivateKey.fromStringED25519(options.secret.key.hederaPrivateKey) + // const keys = didRecord.keys ?? [] + // keys.push({ + // kmsKeyId: options.secret.key.kmsKeyId, + // didDocumentRelativeKeyId: KeysUtility.fromPublicKey(hederaSignKey.publicKey).toMultibase(), + // } satisfies DidDocumentKey) + // didRecord.didDocument = JsonTransformer.fromJSON(deactivatedDidDocument, DidDocument) + // didRecord.keys = keys + // await didRepository.update(agentContext, didRecord) + // + // return { + // didDocumentMetadata: {}, + // didRegistrationMetadata: {}, + // didState: { + // state: 'finished', + // did, + // didDocument: didRecord.didDocument, + // }, + // } + // } catch (error) { + // agentContext.config.logger.error('Error deactivating DID', error) + // return { + // didDocumentMetadata: {}, + // didRegistrationMetadata: {}, + // didState: { + // state: 'failed', + // reason: `Unable deactivating DID: ${error.message}`, + // }, + // } + // } } } diff --git a/packages/hedera/src/ledger/HederaLedgerService.ts b/packages/hedera/src/ledger/HederaLedgerService.ts index a0c0ee18cc..d112e0b2df 100644 --- a/packages/hedera/src/ledger/HederaLedgerService.ts +++ b/packages/hedera/src/ledger/HederaLedgerService.ts @@ -16,65 +16,53 @@ import { type AgentContext, DidCreateOptions, DidDeactivateOptions, - DidDocument, + DidDocumentKey, DidUpdateOptions, - injectable, + Kms, + XOR, + injectable, TypedArrayEncoder, } from '@credo-ts/core' +import { KmsJwkPublicOkp } from '@credo-ts/core/src/modules/kms' import { Client, PrivateKey } from '@hashgraph/sdk' import { HederaAnoncredsRegistry } from '@hiero-did-sdk/anoncreds' import { HederaClientService } from '@hiero-did-sdk/client' import { HederaNetwork } from '@hiero-did-sdk/client/dist/index' -import { DIDResolution, KeysUtility, Service, VerificationMethod } from '@hiero-did-sdk/core' +import {DIDResolution, Service, VerificationMethod} from '@hiero-did-sdk/core' import { CreateDIDResult, DIDUpdateBuilder, DeactivateDIDResult, UpdateDIDResult, generateCreateDIDRequest, - generateDeactivateDIDRequest, - generateUpdateDIDRequest, submitCreateDIDRequest, - submitDeactivateDIDRequest, - submitUpdateDIDRequest, } from '@hiero-did-sdk/registrar' -import { TopicReaderHederaHcs, parseDID, resolveDID } from '@hiero-did-sdk/resolver' +import { TopicReaderHederaHcs, resolveDID } from '@hiero-did-sdk/resolver' import { HederaModuleConfig } from '../HederaModuleConfig' import { CredoCache } from './cache/CredoCache' -import {Publisher} from "./publisher/Publisher"; +import { KmsPublisher } from './publisher/KmsPublisher' + +type DidOperationSecretOptions = { + keys?: DidDocumentKey[] +} & XOR<{ createKey?: boolean }, { keyId?: string }> export interface HederaDidCreateOptions extends DidCreateOptions { method: 'hedera' - did?: string - didDocument?: DidDocument - secret: { - key: { - kmsKeyId: string - publicKeyMultibase: string - } - } options?: { network?: HederaNetwork | string } + secret: DidOperationSecretOptions +} + +export interface HederaCreateDIDResult extends CreateDIDResult { + keys: DidDocumentKey[] } export interface HederaDidUpdateOptions extends DidUpdateOptions { - did: string - secret: { - key: { - kmsKeyId: string - publicKeyMultibase: string - } - } + secret: DidOperationSecretOptions } export interface HederaDidDeactivateOptions extends DidDeactivateOptions { - did: string - secret: { - key: { - kmsKeyId: string - publicKeyMultibase: string - } - } + secret: DidOperationSecretOptions } @injectable() @@ -92,10 +80,11 @@ export class HederaLedgerService { return await resolveDID(did, 'application/ld+json;profile="https://w3id.org/did-resolution"', { topicReader }) } - public async createDid(agentContext: AgentContext, props: HederaDidCreateOptions): Promise { + public async createDid(agentContext: AgentContext, props: HederaDidCreateOptions): Promise { const { options, secret, didDocument } = props return this.clientService.withClient({ networkName: options?.network }, async (client: Client) => { const topicReader = this.getHederaHcsTopicReader(agentContext) + const controller = typeof didDocument?.controller === 'string' ? didDocument?.controller @@ -103,137 +92,181 @@ export class HederaLedgerService { ? didDocument?.controller[0] : undefined - const hederaSignKey = - secret.key.hederaPrivateKey instanceof PrivateKey - ? secret.key.hederaPrivateKey - : PrivateKey.fromStringED25519(secret.key.hederaPrivateKey) - const { state, signingRequest } = await generateCreateDIDRequest( - { - controller, - multibasePublicKey: KeysUtility.fromPublicKey(hederaSignKey.publicKey).toMultibase(), - topicReader, - }, - { - Publisher - client, - } - ) - - const signature = hederaSignKey.sign(signingRequest.serializedPayload) - const createdDidDocument = await submitCreateDIDRequest( - { state, signature, topicReader }, - { - client, - publisher: {}, - } - ) + if (!props.secret.createKey && !props.secret.keyId) { + throw new Error('createKey or keyId are required') + } - if (didDocument) { - const { didDocument: updatedDidDocument } = await this.updateDid(agentContext, { - did: createdDidDocument.did, - didDocumentOperation: 'setDidDocument', - didDocument: didDocument, - options: { ...options }, - secret: { ...secret }, + const kms = agentContext.dependencyManager.resolve(Kms.KeyManagementApi) + + let keyId: string + const keys = props.secret.keys ?? [] + let publicJwk: KmsJwkPublicOkp & { crv: 'Ed25519' } + if (props.secret.createKey) { + const createKeyResult = await kms.createKey({ + type: { + crv: 'Ed25519', + kty: 'OKP', + }, }) - return { - did: createdDidDocument.did, - didDocument: updatedDidDocument, + publicJwk = createKeyResult.publicJwk + keys.push({ + kmsKeyId: createKeyResult.keyId, + didDocumentRelativeKeyId: '#key', + }) + keyId = createKeyResult.keyId + } else { + keyId = props.secret.keyId! + const _publicJwk = await kms.getPublicKey({ keyId }) + if (!_publicJwk) { + throw new Error(`Key with key id '${keyId}' not found`) + } + if (_publicJwk.kty !== 'OKP' || _publicJwk.crv !== 'Ed25519') { + throw new Error( + `Key with key id '${keyId}' uses unsupported ${Kms.getJwkHumanDescription(_publicJwk)} for did:hedera` + ) + } + publicJwk = { + ..._publicJwk, + crv: _publicJwk.crv, } } - return createdDidDocument - }) - } - - public async updateDid(agentContext: AgentContext, props: HederaDidUpdateOptions): Promise { - const { did, didDocumentOperation, didDocument, secret } = props - - if (!didDocumentOperation) { - throw new Error('DidDocumentOperation is required') - } - - const { network: networkName } = parseDID(did) - return this.clientService.withClient({ networkName }, async (client: Client) => { - const topicReader = this.getHederaHcsTopicReader(agentContext) - - const currentDidDocumentResolution = await resolveDID( - did, - 'application/ld+json;profile="https://w3id.org/did-resolution"', - { topicReader } - ) - if (!currentDidDocumentResolution.didDocument) { - throw new Error(`DID ${did} not found`) - } - - const didUpdates = this.prepareDidUpdates( - currentDidDocumentResolution.didDocument, - didDocument, - didDocumentOperation - ) + const publisher = await this.getPublisher(agentContext, client, keyId) - const { states, signingRequests } = await generateUpdateDIDRequest( + const { state, signingRequest } = await generateCreateDIDRequest( { - did, - updates: didUpdates.build(), + controller, + multibasePublicKey: this.getMultibasePublicKey(publicJwk), topicReader, }, { client, + publisher, } ) - const hederaSignKey = - secret.key.hederaPrivateKey instanceof PrivateKey - ? secret.key.hederaPrivateKey - : PrivateKey.fromStringED25519(secret.key.hederaPrivateKey) - const signatures = this.signRequests(signingRequests, hederaSignKey) - return await submitUpdateDIDRequest( - { - states, - signatures, - topicReader, - }, + const signatureResult = await kms.sign({ keyId, data: signingRequest.serializedPayload, algorithm: 'EdDSA' }) + const createdDidDocumentResult = await submitCreateDIDRequest( + { state, signature: signatureResult.signature, topicReader }, { client, + publisher, } ) + + // if (didDocument) { + // const { didDocument: updatedDidDocument, keys: updatedKeys } = await this.updateDid(agentContext, { + // did: createdDidDocument.did, + // didDocumentOperation: 'setDidDocument', + // didDocument: didDocument, + // options: { ...options }, + // secret: { ...secret }, + // }) + // return { + // did: createdDidDocument.did, + // didDocument: updatedDidDocument, + // keys: updatedKeys + // } + // } + + return { + ...createdDidDocumentResult, + keys, + } }) } + public async updateDid(_agentContext: AgentContext, _props: HederaDidUpdateOptions): Promise { + throw new Error('ddd') + // + // const { did, didDocumentOperation, didDocument, secret } = props + // + // if (!didDocumentOperation) { + // throw new Error('DidDocumentOperation is required') + // } + // + // const { network: networkName } = parseDID(did) + // return this.clientService.withClient({ networkName }, async (client: Client) => { + // const topicReader = this.getHederaHcsTopicReader(agentContext) + // + // const currentDidDocumentResolution = await resolveDID( + // did, + // 'application/ld+json;profile="https://w3id.org/did-resolution"', + // { topicReader } + // ) + // if (!currentDidDocumentResolution.didDocument) { + // throw new Error(`DID ${did} not found`) + // } + // + // const didUpdates = this.prepareDidUpdates( + // currentDidDocumentResolution.didDocument, + // didDocument, + // didDocumentOperation + // ) + // + // const { states, signingRequests } = await generateUpdateDIDRequest( + // { + // did, + // updates: didUpdates.build(), + // topicReader, + // }, + // { + // client, + // } + // ) + // + // const hederaSignKey = + // secret.key.hederaPrivateKey instanceof PrivateKey + // ? secret.key.hederaPrivateKey + // : PrivateKey.fromStringED25519(secret.key.hederaPrivateKey) + // const signatures = this.signRequests(signingRequests, hederaSignKey) + // return await submitUpdateDIDRequest( + // { + // states, + // signatures, + // topicReader, + // }, + // { + // client, + // } + // ) + // }) + } + public async deactivateDid( - agentContext: AgentContext, - props: HederaDidDeactivateOptions + _agentContext: AgentContext, + _props: HederaDidDeactivateOptions ): Promise { - const { did, secret } = props - const { network: networkName } = parseDID(props.did) - return this.clientService.withClient({ networkName }, async (client: Client) => { - const topicReader = this.getHederaHcsTopicReader(agentContext) - const { state, signingRequest } = await generateDeactivateDIDRequest( - { - did, - topicReader, - }, - { - client, - } - ) - const hederaSignKey = - secret.key.hederaPrivateKey instanceof PrivateKey - ? secret.key.hederaPrivateKey - : PrivateKey.fromStringED25519(secret.key.hederaPrivateKey) - const signature = hederaSignKey.sign(signingRequest.serializedPayload) - return await submitDeactivateDIDRequest( - { - state, - signature, - topicReader, - }, - { - client, - } - ) - }) + throw new Error('ddd') + // const { did, secret } = props + // const { network: networkName } = parseDID(props.did) + // return this.clientService.withClient({ networkName }, async (client: Client) => { + // const topicReader = this.getHederaHcsTopicReader(agentContext) + // const { state, signingRequest } = await generateDeactivateDIDRequest( + // { + // did, + // topicReader, + // }, + // { + // client, + // } + // ) + // const hederaSignKey = + // secret.key.hederaPrivateKey instanceof PrivateKey + // ? secret.key.hederaPrivateKey + // : PrivateKey.fromStringED25519(secret.key.hederaPrivateKey) + // const signature = hederaSignKey.sign(signingRequest.serializedPayload) + // return await submitDeactivateDIDRequest( + // { + // state, + // signature, + // topicReader, + // }, + // { + // client, + // } + // ) + // }) } /* Anoncreds*/ @@ -304,11 +337,21 @@ export class HederaLedgerService { return new TopicReaderHederaHcs({ ...this.config.options, cache }) } + private async getPublisher(agentContext: AgentContext, client: Client, keyId: string): Promise { + const publisher = new KmsPublisher(agentContext, client) + await publisher.setKeyId(keyId) + return publisher + } + private getHederaAnonCredsSdk(agentContext: AgentContext): HederaAnoncredsRegistry { const cache = this.config.options.cache ?? new CredoCache(agentContext) return new HederaAnoncredsRegistry({ ...this.config.options, cache }) } + private getMultibasePublicKey(publicJwk: KmsJwkPublicOkp & { crv: 'Ed25519' }): string { + return `z${TypedArrayEncoder.toBase58(Uint8Array.from(TypedArrayEncoder.fromBase64(publicJwk.x)))}` + } + private getId(item: { id: string } | string): string { const id = typeof item === 'string' ? item : item.id return id.includes('#') ? `#${id.split('#').pop()}` : id diff --git a/packages/hedera/src/ledger/publisher/KmsPublisher.ts b/packages/hedera/src/ledger/publisher/KmsPublisher.ts new file mode 100644 index 0000000000..056d57bb67 --- /dev/null +++ b/packages/hedera/src/ledger/publisher/KmsPublisher.ts @@ -0,0 +1,61 @@ +import {Client, PublicKey, Transaction, TransactionReceipt} from '@hashgraph/sdk' +import { Publisher as ClientPublisher } from '@hiero-did-sdk/publisher-internal' +import {AgentContext, Kms, TypedArrayEncoder} from "@credo-ts/core"; +import {KeyManagementApi} from "@credo-ts/core/src/modules/kms"; +import {KeysUtility} from "@hiero-did-sdk/core"; + +export class KmsPublisher extends ClientPublisher { + private readonly kms: KeyManagementApi + + private keyId!: string + private submitPublicKey!: PublicKey + + constructor( + agentContext: AgentContext, + client: Client + ) { + super(client) + this.kms = agentContext.dependencyManager.resolve(Kms.KeyManagementApi) + } + + async setKeyId(keyId: string) { + this.keyId = keyId + + const publicJwk = await this.kms.getPublicKey({ keyId }) + + if (!publicJwk) { + throw new Error(`Key with key id '${keyId}' not found`) + } + if (!publicJwk) { + throw new Error(`Key with key id '${keyId}' not found`) + } + if (publicJwk.kty !== 'OKP' || publicJwk.crv !== 'Ed25519') { + throw new Error( + `Key with key id '${keyId}' uses unsupported ${Kms.getJwkHumanDescription(publicJwk)} for did:hedera` + ) + } + this.submitPublicKey = KeysUtility.fromBytes(Uint8Array.from(TypedArrayEncoder.fromBase64(publicJwk.x))).toPublicKey() + } + + publicKey(): PublicKey { + return this.submitPublicKey + } + + async publish(transaction: Transaction): Promise { + if (!this.submitPublicKey) { + throw new Error(`Need to setup the KeyId`) + } + + const frozenTransaction = transaction.freezeWith(this.client) + + await frozenTransaction.signWith(this.submitPublicKey, async (message) => { + const signatureResult = await this.kms.sign({keyId: this.keyId, data: message, algorithm: "EdDSA"}) + return signatureResult.signature + }) + + const response = await transaction.execute(this.client); + + const receipt = await response.getReceipt(this.client); + return receipt; + } +} diff --git a/packages/hedera/src/ledger/publisher/Publisher.ts b/packages/hedera/src/ledger/publisher/Publisher.ts deleted file mode 100644 index 27ad42db2d..0000000000 --- a/packages/hedera/src/ledger/publisher/Publisher.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { Client, PublicKey } from '@hashgraph/sdk' -import { Publisher as ClientPublisher } from '@hiero-did-sdk/publisher-internal' - -export class Publisher extends ClientPublisher { - constructor( - client: Client, - private readonly submitKey?: PublicKey - ) { - super(client) - } - - publicKey(): PublicKey { - return this.submitKey ?? this.client.operatorPublicKey! - } -} diff --git a/packages/hedera/tests/HederaDidRegistrar.e2e.test.ts b/packages/hedera/tests/HederaDidRegistrar.e2e.test.ts index 3d5dd04d42..dbe9e09dd1 100644 --- a/packages/hedera/tests/HederaDidRegistrar.e2e.test.ts +++ b/packages/hedera/tests/HederaDidRegistrar.e2e.test.ts @@ -7,7 +7,7 @@ import { import { getHederaAgent } from './utils' describe('Hedera DID registrar', () => { - const privateKey = process.env.HEDERA_TEST_OPERATOR_KEY ?? '' + const _privateKey = process.env.HEDERA_TEST_OPERATOR_KEY ?? '' const logger = new ConsoleLogger(LogLevel.error) let agent: Agent @@ -57,7 +57,9 @@ describe('Hedera DID registrar', () => { const didResult = await agent.dids.create({ method: 'hedera', options: { network: 'testnet' }, - secret: { privateKey }, + secret: { + createKey: true + }, }) expect(didResult).toMatchObject({ @@ -80,7 +82,9 @@ describe('Hedera DID registrar', () => { method: 'hedera', didDocument: validDidDoc(), options: { network: 'testnet' }, - secret: { privateKey }, + secret: { + createKey: true + }, }) expect(didResult.didState.state).toEqual('finished') @@ -122,7 +126,7 @@ describe('Hedera DID registrar', () => { network: 'testnet', }, secret: { - privateKey, + createKey: true }, }) expect(didResult).toMatchObject({ didState: { state: 'finished' } }) @@ -137,7 +141,7 @@ describe('Hedera DID registrar', () => { didDocument, didDocumentOperation: 'addToDidDocument', secret: { - privateKey, + createKey: true }, }) @@ -169,7 +173,7 @@ describe('Hedera DID registrar', () => { }, didDocumentOperation: 'removeFromDidDocument', secret: { - privateKey, + createKey: true }, }) @@ -188,7 +192,9 @@ describe('Hedera DID registrar', () => { const didResult = await agent.dids.create({ method: 'hedera', options: { network: 'testnet' }, - secret: { privateKey }, + secret: { + createKey: true + }, }) expect(didResult).toMatchObject({ didState: { state: 'finished' } }) @@ -204,7 +210,7 @@ describe('Hedera DID registrar', () => { didDocument, didDocumentOperation: 'addToDidDocument', secret: { - privateKey, + createKey: true }, }) expect(addUpdateResult.didState.didDocument?.id).toEqual(did) @@ -232,7 +238,7 @@ describe('Hedera DID registrar', () => { didDocument, didDocumentOperation: 'removeFromDidDocument', secret: { - privateKey, + createKey: true }, }) expect(removeUpdateResult.didState.didDocument?.id).toEqual(did) @@ -253,7 +259,7 @@ describe('Hedera DID registrar', () => { network: 'testnet', }, secret: { - privateKey, + createKey: true }, }) expect(didResult).toMatchObject({ didState: { state: 'finished' } }) @@ -263,7 +269,7 @@ describe('Hedera DID registrar', () => { const deactivateResult = await agent.dids.deactivate({ did, secret: { - privateKey, + createKey: true }, }) diff --git a/packages/hedera/tests/HederaDidResolver.e2e.test.ts b/packages/hedera/tests/HederaDidResolver.e2e.test.ts index 0a16db1b74..0e9ab297b3 100644 --- a/packages/hedera/tests/HederaDidResolver.e2e.test.ts +++ b/packages/hedera/tests/HederaDidResolver.e2e.test.ts @@ -1,11 +1,10 @@ -import { Agent, ConsoleLogger, JsonTransformer, Kms, LogLevel } from '@credo-ts/core' -import { PrivateKey } from '@hashgraph/sdk' +import { Agent, ConsoleLogger, JsonTransformer, LogLevel } from '@credo-ts/core' import { HederaDidCreateOptions } from '../src/ledger/HederaLedgerService' import { getHederaAgent } from './utils' describe('Hedera DID resolver', () => { - const logger = new ConsoleLogger(LogLevel.error) - const privateKey = process.env.HEDERA_TEST_OPERATOR_KEY ?? '' + const logger = new ConsoleLogger(LogLevel.debug) + const _privateKey = process.env.HEDERA_TEST_OPERATOR_KEY ?? '' let agent: Agent let did: string @@ -17,29 +16,18 @@ describe('Hedera DID resolver', () => { }) await agent.initialize() - const hederaPrivateKey = PrivateKey.fromStringDer(privateKey) - hederaPrivateKey.toBytes() - - const key = await agent.kms.createKey({ - type: { - crv: 'Ed25519', - kty: 'OKP', + const didResult = await agent.dids.create({ + method: 'hedera', + secret: { + createKey: true }, }) - const publicKeyJwk = Kms.PublicJwk.fromPublicJwk(key.publicJwk) - const _publicKeyMultibase = publicKeyJwk.fingerprint - - const { signature } = await kms.sign({ - data: payload, - algorithm: publicJwk.signatureAlgorithm, - keyId: kmsKeyId, - }) - - const didResult = await agent.dids.create({ method: 'hedera', secret: { key: {} } }) if (!didResult.didState.did) { throw new Error('No DID created') } did = didResult.didState.did + + console.log(JSON.stringify(didResult, null, 2)) }) afterAll(async () => { @@ -48,6 +36,10 @@ describe('Hedera DID resolver', () => { it('should resolve a did:cheqd did from local testnet', async () => { const resolveResult = await agent.dids.resolve(did) + + console.log(JSON.stringify(resolveResult, null, 2)) + + expect(JsonTransformer.toJSON(resolveResult)).toMatchObject({ didDocument: { '@context': ['https://www.w3.org/ns/did/v1'], From ebe79c00117886311d6b142053f12592d9f826d7 Mon Sep 17 00:00:00 2001 From: "andrey.kononov" Date: Wed, 2 Jul 2025 22:35:07 +0300 Subject: [PATCH 14/89] Implemented DidRegstrar.Update API Implemented DidRegstrar.Deactivate API --- .../hedera/src/dids/HederaDidRegistrar.ts | 235 ++++++----- .../hedera/src/ledger/HederaLedgerService.ts | 390 ++++++++++-------- .../src/ledger/publisher/KmsPublisher.ts | 43 +- packages/hedera/src/ledger/utils/index.ts | 41 ++ .../tests/HederaAnoncredsRegistry.e2e.test.ts | 9 +- .../tests/HederaDidRegistrar.e2e.test.ts | 191 +++++++-- .../tests/HederaDidResolver.e2e.test.ts | 11 +- 7 files changed, 546 insertions(+), 374 deletions(-) create mode 100644 packages/hedera/src/ledger/utils/index.ts diff --git a/packages/hedera/src/dids/HederaDidRegistrar.ts b/packages/hedera/src/dids/HederaDidRegistrar.ts index d437824098..8216fa229f 100644 --- a/packages/hedera/src/dids/HederaDidRegistrar.ts +++ b/packages/hedera/src/dids/HederaDidRegistrar.ts @@ -3,12 +3,14 @@ import { DidCreateResult, DidDeactivateResult, DidDocument, + DidDocumentKey, DidDocumentRole, DidDocumentService, DidRecord, DidRegistrar, DidRepository, DidUpdateResult, + JsonTransformer, } from '@credo-ts/core' import { HederaDidCreateOptions, @@ -28,7 +30,7 @@ export class HederaDidRegistrar implements DidRegistrar { const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) // Create did - const { did, didDocument, keys } = await ledgerService.createDid(agentContext, options) + const { did, didDocument, rootKey } = await ledgerService.createDid(agentContext, options) // Save the did to wallet const credoDidDocument = new DidDocument({ @@ -42,7 +44,7 @@ export class HederaDidRegistrar implements DidRegistrar { did, role: DidDocumentRole.Created, didDocument: credoDidDocument, - keys, + keys: [rootKey], }) ) @@ -70,123 +72,120 @@ export class HederaDidRegistrar implements DidRegistrar { } } - async update(_agentContext: AgentContext, _options: HederaDidUpdateOptions): Promise { - throw new Error('sss') - // const didRepository = agentContext.dependencyManager.resolve(DidRepository) - // const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) - // - // try { - // const { did } = options - // const { didDocument, didDocumentMetadata } = await ledgerService.resolveDid(agentContext, did) - // const didRecord = await didRepository.findCreatedDid(agentContext, did) - // if (!didDocument || didDocumentMetadata.deactivated || !didRecord) { - // return { - // didDocumentMetadata: {}, - // didRegistrationMetadata: {}, - // didState: { - // state: 'failed', - // reason: 'Did not found', - // }, - // } - // } - // - // // Update did - // const { didDocument: updatedDidDocument } = await ledgerService.updateDid(agentContext, options) - // - // // Save the did to wallet - // const hederaSignKey = - // options.secret.key.hederaPrivateKey instanceof PrivateKey - // ? options.secret.key.hederaPrivateKey - // : PrivateKey.fromStringED25519(options.secret.key.hederaPrivateKey) - // const keys = didRecord.keys ?? [] - // keys.push({ - // kmsKeyId: options.secret.key.kmsKeyId, - // didDocumentRelativeKeyId: KeysUtility.fromPublicKey(hederaSignKey.publicKey).toMultibase(), - // } satisfies DidDocumentKey) - // didRecord.didDocument = JsonTransformer.fromJSON(updatedDidDocument, DidDocument) - // didRecord.keys = keys - // await didRepository.update(agentContext, didRecord) - // - // return { - // didDocumentMetadata: {}, - // didRegistrationMetadata: {}, - // didState: { - // state: 'finished', - // did, - // didDocument: didRecord.didDocument, - // }, - // } - // } catch (error) { - // agentContext.config.logger.error('Error updating DID', error) - // return { - // didDocumentMetadata: {}, - // didRegistrationMetadata: {}, - // didState: { - // state: 'failed', - // reason: `Unable update DID: ${error.message}`, - // }, - // } - // } + async update(agentContext: AgentContext, options: HederaDidUpdateOptions): Promise { + const didRepository = agentContext.dependencyManager.resolve(DidRepository) + const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) + + try { + const { did } = options + const { didDocument, didDocumentMetadata } = await ledgerService.resolveDid(agentContext, did) + const didRecord = await didRepository.findCreatedDid(agentContext, did) + if (!didDocument || didDocumentMetadata.deactivated || !didRecord) { + return { + didDocumentMetadata: {}, + didRegistrationMetadata: {}, + didState: { + state: 'failed', + reason: 'Did not found', + }, + } + } + + // Update did + const keys = this.concateKeys(didRecord.keys, options.secret?.keys) + const { didDocument: updatedDidDocument } = await ledgerService.updateDid(agentContext, { + ...options, + secret: { keys }, + }) + + // Save the did to wallet + didRecord.didDocument = JsonTransformer.fromJSON(updatedDidDocument, DidDocument) + didRecord.keys = keys + await didRepository.update(agentContext, didRecord) + + return { + didDocumentMetadata: {}, + didRegistrationMetadata: {}, + didState: { + state: 'finished', + did, + didDocument: didRecord.didDocument, + }, + } + } catch (error) { + agentContext.config.logger.error('Error updating DID', error) + return { + didDocumentMetadata: {}, + didRegistrationMetadata: {}, + didState: { + state: 'failed', + reason: `Unable update DID: ${error.message}`, + }, + } + } + } + + async deactivate(agentContext: AgentContext, options: HederaDidDeactivateOptions): Promise { + const didRepository = agentContext.dependencyManager.resolve(DidRepository) + const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) + + const did = options.did + + try { + const { didDocument, didDocumentMetadata } = await ledgerService.resolveDid(agentContext, did) + + const didRecord = await didRepository.findCreatedDid(agentContext, did) + + if (!didDocument || didDocumentMetadata.deactivated || !didRecord) { + return { + didDocumentMetadata, + didRegistrationMetadata: {}, + didState: { + state: 'failed', + reason: 'Did not found', + }, + } + } + // Deactivate did + const keys = this.concateKeys(didRecord.keys, options.secret?.keys) + const { didDocument: deactivatedDidDocument } = await ledgerService.deactivateDid(agentContext, { + ...options, + secret: { keys }, + }) + + // Save the did to wallet + didRecord.didDocument = JsonTransformer.fromJSON(deactivatedDidDocument, DidDocument) + didRecord.keys = keys + await didRepository.update(agentContext, didRecord) + + return { + didDocumentMetadata: {}, + didRegistrationMetadata: {}, + didState: { + state: 'finished', + did, + didDocument: didRecord.didDocument, + }, + } + } catch (error) { + agentContext.config.logger.error('Error deactivating DID', error) + return { + didDocumentMetadata: {}, + didRegistrationMetadata: {}, + didState: { + state: 'failed', + reason: `Unable deactivating DID: ${error.message}`, + }, + } + } } - async deactivate(_agentContext: AgentContext, _options: HederaDidDeactivateOptions): Promise { - throw new Error('sss') - // const didRepository = agentContext.dependencyManager.resolve(DidRepository) - // const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) - // - // const did = options.did - // - // try { - // const { didDocument, didDocumentMetadata } = await ledgerService.resolveDid(agentContext, did) - // - // const didRecord = await didRepository.findCreatedDid(agentContext, did) - // - // if (!didDocument || didDocumentMetadata.deactivated || !didRecord) { - // return { - // didDocumentMetadata, - // didRegistrationMetadata: {}, - // didState: { - // state: 'failed', - // reason: 'Did not found', - // }, - // } - // } - // // Deactivate did - // const { didDocument: deactivatedDidDocument } = await ledgerService.deactivateDid(agentContext, options) - // - // // Save the did to wallet - // const hederaSignKey = - // options.secret.key.hederaPrivateKey instanceof PrivateKey - // ? options.secret.key.hederaPrivateKey - // : PrivateKey.fromStringED25519(options.secret.key.hederaPrivateKey) - // const keys = didRecord.keys ?? [] - // keys.push({ - // kmsKeyId: options.secret.key.kmsKeyId, - // didDocumentRelativeKeyId: KeysUtility.fromPublicKey(hederaSignKey.publicKey).toMultibase(), - // } satisfies DidDocumentKey) - // didRecord.didDocument = JsonTransformer.fromJSON(deactivatedDidDocument, DidDocument) - // didRecord.keys = keys - // await didRepository.update(agentContext, didRecord) - // - // return { - // didDocumentMetadata: {}, - // didRegistrationMetadata: {}, - // didState: { - // state: 'finished', - // did, - // didDocument: didRecord.didDocument, - // }, - // } - // } catch (error) { - // agentContext.config.logger.error('Error deactivating DID', error) - // return { - // didDocumentMetadata: {}, - // didRegistrationMetadata: {}, - // didState: { - // state: 'failed', - // reason: `Unable deactivating DID: ${error.message}`, - // }, - // } - // } + private concateKeys(keys1?: DidDocumentKey[], keys2?: DidDocumentKey[]): DidDocumentKey[] { + const _keys1 = keys1 ?? [] + const _keys2 = keys2 ?? [] + return [ + ..._keys1, + ..._keys2.filter((k2) => !_keys1.some((k1) => k1.didDocumentRelativeKeyId === k2.didDocumentRelativeKeyId)), + ] } } diff --git a/packages/hedera/src/ledger/HederaLedgerService.ts b/packages/hedera/src/ledger/HederaLedgerService.ts index d112e0b2df..388cbf8a26 100644 --- a/packages/hedera/src/ledger/HederaLedgerService.ts +++ b/packages/hedera/src/ledger/HederaLedgerService.ts @@ -16,53 +16,61 @@ import { type AgentContext, DidCreateOptions, DidDeactivateOptions, + type DidDocument, DidDocumentKey, DidUpdateOptions, Kms, - XOR, - injectable, TypedArrayEncoder, + injectable, } from '@credo-ts/core' -import { KmsJwkPublicOkp } from '@credo-ts/core/src/modules/kms' -import { Client, PrivateKey } from '@hashgraph/sdk' +import { KeyManagementApi } from '@credo-ts/core/src/modules/kms' +import { Client } from '@hashgraph/sdk' import { HederaAnoncredsRegistry } from '@hiero-did-sdk/anoncreds' import { HederaClientService } from '@hiero-did-sdk/client' import { HederaNetwork } from '@hiero-did-sdk/client/dist/index' -import {DIDResolution, Service, VerificationMethod} from '@hiero-did-sdk/core' +import { DIDResolution, DID_ROOT_KEY_ID, Service, VerificationMethod } from '@hiero-did-sdk/core' import { CreateDIDResult, DIDUpdateBuilder, DeactivateDIDResult, UpdateDIDResult, generateCreateDIDRequest, + generateDeactivateDIDRequest, + generateUpdateDIDRequest, submitCreateDIDRequest, + submitDeactivateDIDRequest, + submitUpdateDIDRequest, } from '@hiero-did-sdk/registrar' -import { TopicReaderHederaHcs, resolveDID } from '@hiero-did-sdk/resolver' +import { TopicReaderHederaHcs, parseDID, resolveDID } from '@hiero-did-sdk/resolver' import { HederaModuleConfig } from '../HederaModuleConfig' import { CredoCache } from './cache/CredoCache' import { KmsPublisher } from './publisher/KmsPublisher' - -type DidOperationSecretOptions = { - keys?: DidDocumentKey[] -} & XOR<{ createKey?: boolean }, { keyId?: string }> +import { createOrGetKey, getMultibasePublicKey } from './utils' export interface HederaDidCreateOptions extends DidCreateOptions { method: 'hedera' options?: { network?: HederaNetwork | string } - secret: DidOperationSecretOptions + secret?: { + rootKeyId?: string + keys?: DidDocumentKey[] + } } export interface HederaCreateDIDResult extends CreateDIDResult { - keys: DidDocumentKey[] + rootKey: DidDocumentKey } export interface HederaDidUpdateOptions extends DidUpdateOptions { - secret: DidOperationSecretOptions + secret?: { + keys?: DidDocumentKey[] + } } export interface HederaDidDeactivateOptions extends DidDeactivateOptions { - secret: DidOperationSecretOptions + secret?: { + keys?: DidDocumentKey[] + } } @injectable() @@ -92,51 +100,17 @@ export class HederaLedgerService { ? didDocument?.controller[0] : undefined - if (!props.secret.createKey && !props.secret.keyId) { - throw new Error('createKey or keyId are required') - } - const kms = agentContext.dependencyManager.resolve(Kms.KeyManagementApi) - let keyId: string - const keys = props.secret.keys ?? [] - let publicJwk: KmsJwkPublicOkp & { crv: 'Ed25519' } - if (props.secret.createKey) { - const createKeyResult = await kms.createKey({ - type: { - crv: 'Ed25519', - kty: 'OKP', - }, - }) - publicJwk = createKeyResult.publicJwk - keys.push({ - kmsKeyId: createKeyResult.keyId, - didDocumentRelativeKeyId: '#key', - }) - keyId = createKeyResult.keyId - } else { - keyId = props.secret.keyId! - const _publicJwk = await kms.getPublicKey({ keyId }) - if (!_publicJwk) { - throw new Error(`Key with key id '${keyId}' not found`) - } - if (_publicJwk.kty !== 'OKP' || _publicJwk.crv !== 'Ed25519') { - throw new Error( - `Key with key id '${keyId}' uses unsupported ${Kms.getJwkHumanDescription(_publicJwk)} for did:hedera` - ) - } - publicJwk = { - ..._publicJwk, - crv: _publicJwk.crv, - } - } + const { keyId, publicJwk } = await createOrGetKey(kms, secret?.rootKeyId) + const rootKey = { kmsKeyId: keyId, didDocumentRelativeKeyId: DID_ROOT_KEY_ID } const publisher = await this.getPublisher(agentContext, client, keyId) const { state, signingRequest } = await generateCreateDIDRequest( { controller, - multibasePublicKey: this.getMultibasePublicKey(publicJwk), + multibasePublicKey: getMultibasePublicKey(publicJwk), topicReader, }, { @@ -146,7 +120,7 @@ export class HederaLedgerService { ) const signatureResult = await kms.sign({ keyId, data: signingRequest.serializedPayload, algorithm: 'EdDSA' }) - const createdDidDocumentResult = await submitCreateDIDRequest( + const createDidDocumentResult = await submitCreateDIDRequest( { state, signature: signatureResult.signature, topicReader }, { client, @@ -154,119 +128,139 @@ export class HederaLedgerService { } ) - // if (didDocument) { - // const { didDocument: updatedDidDocument, keys: updatedKeys } = await this.updateDid(agentContext, { - // did: createdDidDocument.did, - // didDocumentOperation: 'setDidDocument', - // didDocument: didDocument, - // options: { ...options }, - // secret: { ...secret }, - // }) - // return { - // did: createdDidDocument.did, - // didDocument: updatedDidDocument, - // keys: updatedKeys - // } - // } + if (didDocument) { + const keys = [...(secret?.keys ?? []), ...[rootKey]] + const updateDidDocumentResult = await this.updateDid(agentContext, { + did: createDidDocumentResult.did, + didDocumentOperation: 'setDidDocument', + didDocument, + options: { ...options }, + secret: { keys }, + }) + return { + ...updateDidDocumentResult, + rootKey, + } + } return { - ...createdDidDocumentResult, - keys, + ...createDidDocumentResult, + rootKey, } }) } - public async updateDid(_agentContext: AgentContext, _props: HederaDidUpdateOptions): Promise { - throw new Error('ddd') - // - // const { did, didDocumentOperation, didDocument, secret } = props - // - // if (!didDocumentOperation) { - // throw new Error('DidDocumentOperation is required') - // } - // - // const { network: networkName } = parseDID(did) - // return this.clientService.withClient({ networkName }, async (client: Client) => { - // const topicReader = this.getHederaHcsTopicReader(agentContext) - // - // const currentDidDocumentResolution = await resolveDID( - // did, - // 'application/ld+json;profile="https://w3id.org/did-resolution"', - // { topicReader } - // ) - // if (!currentDidDocumentResolution.didDocument) { - // throw new Error(`DID ${did} not found`) - // } - // - // const didUpdates = this.prepareDidUpdates( - // currentDidDocumentResolution.didDocument, - // didDocument, - // didDocumentOperation - // ) - // - // const { states, signingRequests } = await generateUpdateDIDRequest( - // { - // did, - // updates: didUpdates.build(), - // topicReader, - // }, - // { - // client, - // } - // ) - // - // const hederaSignKey = - // secret.key.hederaPrivateKey instanceof PrivateKey - // ? secret.key.hederaPrivateKey - // : PrivateKey.fromStringED25519(secret.key.hederaPrivateKey) - // const signatures = this.signRequests(signingRequests, hederaSignKey) - // return await submitUpdateDIDRequest( - // { - // states, - // signatures, - // topicReader, - // }, - // { - // client, - // } - // ) - // }) + public async updateDid(agentContext: AgentContext, props: HederaDidUpdateOptions): Promise { + const { did, didDocumentOperation, didDocument, secret } = props + const kms = agentContext.dependencyManager.resolve(Kms.KeyManagementApi) + + if (!didDocumentOperation) { + throw new Error('DidDocumentOperation is required') + } + + // Check root key presents + const rootKey = (secret?.keys ?? []).find((k) => k.didDocumentRelativeKeyId === DID_ROOT_KEY_ID) + if (!rootKey?.kmsKeyId) { + throw new Error('The root key not found in the KMS') + } + + // Check all required keys presents + this.checkKeys(didDocument, secret?.keys ?? []) + + const { network: networkName } = parseDID(did) + return this.clientService.withClient({ networkName }, async (client: Client) => { + const topicReader = this.getHederaHcsTopicReader(agentContext) + + const currentDidDocumentResolution = await resolveDID( + did, + 'application/ld+json;profile="https://w3id.org/did-resolution"', + { topicReader } + ) + if (!currentDidDocumentResolution.didDocument) { + throw new Error(`DID ${did} not found`) + } + + const didUpdates = this.prepareDidUpdates( + currentDidDocumentResolution.didDocument, + didDocument, + didDocumentOperation + ) + + const publisher = await this.getPublisher(agentContext, client, rootKey.kmsKeyId) + + const { states, signingRequests } = await generateUpdateDIDRequest( + { + did, + updates: didUpdates.build(), + topicReader, + }, + { + client, + publisher, + } + ) + + const signatures = await this.signRequests(signingRequests, kms, rootKey.kmsKeyId) + return await submitUpdateDIDRequest( + { + states, + signatures, + topicReader, + }, + { + client, + publisher, + } + ) + }) } public async deactivateDid( - _agentContext: AgentContext, - _props: HederaDidDeactivateOptions + agentContext: AgentContext, + props: HederaDidDeactivateOptions ): Promise { - throw new Error('ddd') - // const { did, secret } = props - // const { network: networkName } = parseDID(props.did) - // return this.clientService.withClient({ networkName }, async (client: Client) => { - // const topicReader = this.getHederaHcsTopicReader(agentContext) - // const { state, signingRequest } = await generateDeactivateDIDRequest( - // { - // did, - // topicReader, - // }, - // { - // client, - // } - // ) - // const hederaSignKey = - // secret.key.hederaPrivateKey instanceof PrivateKey - // ? secret.key.hederaPrivateKey - // : PrivateKey.fromStringED25519(secret.key.hederaPrivateKey) - // const signature = hederaSignKey.sign(signingRequest.serializedPayload) - // return await submitDeactivateDIDRequest( - // { - // state, - // signature, - // topicReader, - // }, - // { - // client, - // } - // ) - // }) + const { did, secret } = props + + const kms = agentContext.dependencyManager.resolve(Kms.KeyManagementApi) + + const rootKey = (secret?.keys ?? []).find((k) => k.didDocumentRelativeKeyId === DID_ROOT_KEY_ID) + if (!rootKey?.kmsKeyId) { + throw new Error('The root key not found in the KMS') + } + + const { network: networkName } = parseDID(props.did) + return this.clientService.withClient({ networkName }, async (client: Client) => { + const topicReader = this.getHederaHcsTopicReader(agentContext) + + const publisher = await this.getPublisher(agentContext, client, rootKey.kmsKeyId) + + const { state, signingRequest } = await generateDeactivateDIDRequest( + { + did, + topicReader, + }, + { + client, + publisher, + } + ) + const signatureResult = await kms.sign({ + keyId: rootKey.kmsKeyId, + data: signingRequest.serializedPayload, + algorithm: 'EdDSA', + }) + return await submitDeactivateDIDRequest( + { + state, + signature: signatureResult.signature, + topicReader, + }, + { + client, + publisher, + } + ) + }) } /* Anoncreds*/ @@ -348,8 +342,8 @@ export class HederaLedgerService { return new HederaAnoncredsRegistry({ ...this.config.options, cache }) } - private getMultibasePublicKey(publicJwk: KmsJwkPublicOkp & { crv: 'Ed25519' }): string { - return `z${TypedArrayEncoder.toBase58(Uint8Array.from(TypedArrayEncoder.fromBase64(publicJwk.x)))}` + private isDidRootKeyId(id: string): boolean { + return id.endsWith(DID_ROOT_KEY_ID) } private getId(item: { id: string } | string): string { @@ -371,13 +365,47 @@ export class HederaLedgerService { return { existingItems, newItems, missingItems } } - private signRequests(signingRequests: Record, privateKey: PrivateKey): Record { - return Object.entries(signingRequests).reduce((acc, [key, request]) => { - return { - ...acc, - [key]: privateKey.sign(request.serializedPayload), + private async signRequests( + signingRequests: Record, + kms: KeyManagementApi, + keyId: string + ): Promise> { + const result: Record = {} + + for (const [key, request] of Object.entries(signingRequests)) { + const signResult = await kms.sign({ + keyId, + data: request.serializedPayload, + algorithm: 'EdDSA', + }) + result[key] = signResult.signature + } + + return result + } + + private checkKeys(didDocument: DidDocument | Partial, keys: DidDocumentKey[]) { + const fields = [ + 'verificationMethod', + 'assertionMethod', + 'authentication', + 'capabilityDelegation', + 'capabilityInvocation', + 'keyAgreement', + ] + for (const field of fields) { + const fieldValue = (didDocument as any)[field] + if (fieldValue) { + const fieldValues = Array.isArray(fieldValue) ? fieldValue : [fieldValue] + + for (const value of fieldValues) { + const id = this.getId(value) + if (!keys.some((key) => key.didDocumentRelativeKeyId === id)) { + throw new Error(`Key ${id} from ${field} not found in keys`) + } + } } - }, {}) + } } private prepareDidUpdates(currentDoc: any, newDoc: any, operation: string): DIDUpdateBuilder { @@ -392,30 +420,38 @@ export class HederaLedgerService { 'keyAgreement', ] - fields.forEach((field) => { + for (const field of fields) { const { existingItems, newItems, missingItems } = this.getDiff(currentDoc[field], newDoc[field]) if (operation === 'setDidDocument') { - missingItems.forEach((item) => { - this.getUpdateMethod(builder, field, 'remove')(this.getId(item)) - }) - newItems.forEach((item) => { - this.getUpdateMethod(builder, field, 'add')(item) - }) + for (const item of missingItems) { + if (!this.isDidRootKeyId(typeof item === 'string' ? item : item.id)) { + this.getUpdateMethod(builder, field, 'remove')(this.getId(item)) + } + } + for (const item of newItems) { + if (!this.isDidRootKeyId(typeof item === 'string' ? item : item.id)) { + this.getUpdateMethod(builder, field, 'add')(item) + } + } } if (operation === 'addToDidDocument') { - newItems.forEach((item) => { - this.getUpdateMethod(builder, field, 'add')(item) - }) + for (const item of newItems) { + if (!this.isDidRootKeyId(typeof item === 'string' ? item : item.id)) { + this.getUpdateMethod(builder, field, 'add')(item) + } + } } if (operation === 'removeFromDidDocument') { - existingItems.forEach((item) => { - this.getUpdateMethod(builder, field, 'remove')(item) - }) + for (const item of existingItems) { + if (!this.isDidRootKeyId(typeof item === 'string' ? item : item.id)) { + this.getUpdateMethod(builder, field, 'remove')(item) + } + } } - }) + } return builder } diff --git a/packages/hedera/src/ledger/publisher/KmsPublisher.ts b/packages/hedera/src/ledger/publisher/KmsPublisher.ts index 056d57bb67..aa64b5e1ef 100644 --- a/packages/hedera/src/ledger/publisher/KmsPublisher.ts +++ b/packages/hedera/src/ledger/publisher/KmsPublisher.ts @@ -1,8 +1,9 @@ -import {Client, PublicKey, Transaction, TransactionReceipt} from '@hashgraph/sdk' +import { AgentContext, Kms, TypedArrayEncoder } from '@credo-ts/core' +import { KeyManagementApi } from '@credo-ts/core/src/modules/kms' +import { Client, PublicKey, Transaction, TransactionReceipt } from '@hashgraph/sdk' +import { KeysUtility } from '@hiero-did-sdk/core' import { Publisher as ClientPublisher } from '@hiero-did-sdk/publisher-internal' -import {AgentContext, Kms, TypedArrayEncoder} from "@credo-ts/core"; -import {KeyManagementApi} from "@credo-ts/core/src/modules/kms"; -import {KeysUtility} from "@hiero-did-sdk/core"; +import { createOrGetKey } from '../utils' export class KmsPublisher extends ClientPublisher { private readonly kms: KeyManagementApi @@ -10,31 +11,17 @@ export class KmsPublisher extends ClientPublisher { private keyId!: string private submitPublicKey!: PublicKey - constructor( - agentContext: AgentContext, - client: Client - ) { + constructor(agentContext: AgentContext, client: Client) { super(client) this.kms = agentContext.dependencyManager.resolve(Kms.KeyManagementApi) } async setKeyId(keyId: string) { this.keyId = keyId - - const publicJwk = await this.kms.getPublicKey({ keyId }) - - if (!publicJwk) { - throw new Error(`Key with key id '${keyId}' not found`) - } - if (!publicJwk) { - throw new Error(`Key with key id '${keyId}' not found`) - } - if (publicJwk.kty !== 'OKP' || publicJwk.crv !== 'Ed25519') { - throw new Error( - `Key with key id '${keyId}' uses unsupported ${Kms.getJwkHumanDescription(publicJwk)} for did:hedera` - ) - } - this.submitPublicKey = KeysUtility.fromBytes(Uint8Array.from(TypedArrayEncoder.fromBase64(publicJwk.x))).toPublicKey() + const { publicJwk } = await createOrGetKey(this.kms, keyId) + this.submitPublicKey = KeysUtility.fromBytes( + Uint8Array.from(TypedArrayEncoder.fromBase64(publicJwk.x)) + ).toPublicKey() } publicKey(): PublicKey { @@ -43,19 +30,19 @@ export class KmsPublisher extends ClientPublisher { async publish(transaction: Transaction): Promise { if (!this.submitPublicKey) { - throw new Error(`Need to setup the KeyId`) + throw new Error('Need to setup the KeyId') } const frozenTransaction = transaction.freezeWith(this.client) await frozenTransaction.signWith(this.submitPublicKey, async (message) => { - const signatureResult = await this.kms.sign({keyId: this.keyId, data: message, algorithm: "EdDSA"}) + const signatureResult = await this.kms.sign({ keyId: this.keyId, data: message, algorithm: 'EdDSA' }) return signatureResult.signature }) - const response = await transaction.execute(this.client); + const response = await transaction.execute(this.client) - const receipt = await response.getReceipt(this.client); - return receipt; + const receipt = await response.getReceipt(this.client) + return receipt } } diff --git a/packages/hedera/src/ledger/utils/index.ts b/packages/hedera/src/ledger/utils/index.ts new file mode 100644 index 0000000000..3d99837ae8 --- /dev/null +++ b/packages/hedera/src/ledger/utils/index.ts @@ -0,0 +1,41 @@ +import { Kms, TypedArrayEncoder } from '@credo-ts/core' +import { KeyManagementApi, KmsJwkPublicOkp } from '@credo-ts/core/src/modules/kms' + +export const getMultibasePublicKey = (publicJwk: KmsJwkPublicOkp & { crv: 'Ed25519' }): string => { + return `z${TypedArrayEncoder.toBase58(Uint8Array.from(TypedArrayEncoder.fromBase64(publicJwk.x)))}` +} + +export const createOrGetKey = async ( + kms: KeyManagementApi, + keyId?: string +): Promise<{ keyId: string; publicJwk: KmsJwkPublicOkp & { crv: 'Ed25519' } }> => { + if (!keyId) { + const createKeyResult = await kms.createKey({ + type: { + crv: 'Ed25519', + kty: 'OKP', + }, + }) + return { + publicJwk: createKeyResult.publicJwk, + keyId: createKeyResult.keyId, + } + } + + const publicJwk = await kms.getPublicKey({ keyId }) + if (!publicJwk) { + throw new Error(`Key with key id '${keyId}' not found`) + } + if (publicJwk.kty !== 'OKP' || publicJwk.crv !== 'Ed25519') { + throw new Error( + `Key with key id '${keyId}' uses unsupported ${Kms.getJwkHumanDescription(publicJwk)} for did:hedera` + ) + } + return { + keyId, + publicJwk: { + ...publicJwk, + crv: publicJwk.crv, + }, + } +} diff --git a/packages/hedera/tests/HederaAnoncredsRegistry.e2e.test.ts b/packages/hedera/tests/HederaAnoncredsRegistry.e2e.test.ts index 9c469d8ecf..29f38c7540 100644 --- a/packages/hedera/tests/HederaAnoncredsRegistry.e2e.test.ts +++ b/packages/hedera/tests/HederaAnoncredsRegistry.e2e.test.ts @@ -1,15 +1,15 @@ import { Agent, ConsoleLogger, LogLevel, utils } from '@credo-ts/core' +import { HederaDidCreateOptions } from '../src/ledger/HederaLedgerService' import { getHederaAgent, waitTimeout } from './utils' import { testCache } from './utils/testCache' describe('Hedera AnonCreds support', () => { - const privateKey = process.env.HEDERA_TEST_OPERATOR_KEY ?? '' const consensusTimeout = 5000 let agent: Agent let did: string - const logger = new ConsoleLogger(LogLevel.warn) + const logger = new ConsoleLogger(LogLevel.error) const cache = new testCache() beforeAll(async () => { @@ -22,11 +22,8 @@ describe('Hedera AnonCreds support', () => { await agent.initialize() // Making the test did - const didRegistrarResult = await agent.dids.create({ + const didRegistrarResult = await agent.dids.create({ method: 'hedera', - secret: { - privateKey, - }, }) if (!didRegistrarResult.didState?.didDocument?.id) throw new Error('DidRegistrarError') diff --git a/packages/hedera/tests/HederaDidRegistrar.e2e.test.ts b/packages/hedera/tests/HederaDidRegistrar.e2e.test.ts index dbe9e09dd1..21e25654a9 100644 --- a/packages/hedera/tests/HederaDidRegistrar.e2e.test.ts +++ b/packages/hedera/tests/HederaDidRegistrar.e2e.test.ts @@ -1,24 +1,32 @@ -import { Agent, ConsoleLogger, DidDocument, DidDocumentService, LogLevel, VerificationMethod } from '@credo-ts/core' +import { + Agent, + ConsoleLogger, + DidDocument, + DidDocumentKey, + DidDocumentService, + LogLevel, + VerificationMethod, +} from '@credo-ts/core' import { HederaDidCreateOptions, HederaDidDeactivateOptions, HederaDidUpdateOptions, } from '../src/ledger/HederaLedgerService' +import { getMultibasePublicKey } from '../src/ledger/utils' import { getHederaAgent } from './utils' describe('Hedera DID registrar', () => { - const _privateKey = process.env.HEDERA_TEST_OPERATOR_KEY ?? '' const logger = new ConsoleLogger(LogLevel.error) let agent: Agent const validDid = 'did:hedera:testnet:44eesExqdsUvLZ35FpnBPErqRGRnYbzzyG3wgCCYxkmq_0.0.6226170' - function validVerificationMethod() { + function validVerificationMethod(publicKeyMultibase?: string) { return new VerificationMethod({ id: '#key-1', type: 'Ed25519VerificationKey2020', controller: validDid, - publicKeyMultibase: 'z44eesExqdsUvLZ35FpnBPErqRGRnYbzzyG3wgCCYxkmq', + publicKeyMultibase: publicKeyMultibase ?? 'z44eesExqdsUvLZ35FpnBPErqRGRnYbzzyG3wgCCYxkmq', }) } @@ -30,9 +38,9 @@ describe('Hedera DID registrar', () => { }) } - function validDidDoc() { + function validDidDoc(publicKeyMultibase?: string) { const service = [validService()] - const verificationMethod = [validVerificationMethod()] + const verificationMethod = [validVerificationMethod(publicKeyMultibase)] return new DidDocument({ id: validDid, @@ -57,9 +65,6 @@ describe('Hedera DID registrar', () => { const didResult = await agent.dids.create({ method: 'hedera', options: { network: 'testnet' }, - secret: { - createKey: true - }, }) expect(didResult).toMatchObject({ @@ -78,17 +83,29 @@ describe('Hedera DID registrar', () => { }) it('should create a did:hedera did document with document presets', async () => { + const { keyId, publicJwk } = await agent.kms.createKey({ + type: { + crv: 'Ed25519', + kty: 'OKP', + }, + }) + const multibasePublicKey = getMultibasePublicKey(publicJwk) + const keys: DidDocumentKey[] = [ + { + kmsKeyId: keyId, + didDocumentRelativeKeyId: '#key-1', + }, + ] + const didResult = await agent.dids.create({ method: 'hedera', - didDocument: validDidDoc(), + didDocument: validDidDoc(multibasePublicKey), options: { network: 'testnet' }, - secret: { - createKey: true - }, + secret: { keys }, }) expect(didResult.didState.state).toEqual('finished') - const verificationMethod = validVerificationMethod() + const verificationMethod = validVerificationMethod(multibasePublicKey) expect(didResult.didState.didDocument?.verificationMethod).toEqual( expect.arrayContaining([ expect.objectContaining({ @@ -125,9 +142,6 @@ describe('Hedera DID registrar', () => { options: { network: 'testnet', }, - secret: { - createKey: true - }, }) expect(didResult).toMatchObject({ didState: { state: 'finished' } }) @@ -140,9 +154,6 @@ describe('Hedera DID registrar', () => { did, didDocument, didDocumentOperation: 'addToDidDocument', - secret: { - createKey: true - }, }) expect(addUpdateResult.didState.state).toEqual('finished') @@ -172,9 +183,6 @@ describe('Hedera DID registrar', () => { verificationMethod: undefined, }, didDocumentOperation: 'removeFromDidDocument', - secret: { - createKey: true - }, }) expect(removeUpdateResult.didState.state).toEqual('finished') @@ -188,20 +196,31 @@ describe('Hedera DID registrar', () => { }) it('should create a did:hedera did document, add and remove verification method', async () => { + const { keyId, publicJwk } = await agent.kms.createKey({ + type: { + crv: 'Ed25519', + kty: 'OKP', + }, + }) + const multibasePublicKey = getMultibasePublicKey(publicJwk) + const keys: DidDocumentKey[] = [ + { + kmsKeyId: keyId, + didDocumentRelativeKeyId: '#key-1', + }, + ] + // create did document const didResult = await agent.dids.create({ method: 'hedera', options: { network: 'testnet' }, - secret: { - createKey: true - }, }) expect(didResult).toMatchObject({ didState: { state: 'finished' } }) const did = didResult.didState.did! const didDocument = didResult.didState.didDocument as DidDocument - const validVerification = validVerificationMethod() + const validVerification = validVerificationMethod(multibasePublicKey) didDocument.verificationMethod = [validVerification] // add verification method to the document @@ -210,7 +229,7 @@ describe('Hedera DID registrar', () => { didDocument, didDocumentOperation: 'addToDidDocument', secret: { - createKey: true + keys, }, }) expect(addUpdateResult.didState.didDocument?.id).toEqual(did) @@ -238,7 +257,7 @@ describe('Hedera DID registrar', () => { didDocument, didDocumentOperation: 'removeFromDidDocument', secret: { - createKey: true + keys, }, }) expect(removeUpdateResult.didState.didDocument?.id).toEqual(did) @@ -252,15 +271,120 @@ describe('Hedera DID registrar', () => { expect(removeResolvedDocument.didDocument?.service ?? []).toHaveLength(0) }) + it('should create a did:hedera did document, but should not add verification method without required keys', async () => { + const { publicJwk } = await agent.kms.createKey({ + type: { + crv: 'Ed25519', + kty: 'OKP', + }, + }) + const multibasePublicKey = getMultibasePublicKey(publicJwk) + + // create did document + const didResult = await agent.dids.create({ + method: 'hedera', + options: { network: 'testnet' }, + }) + expect(didResult).toMatchObject({ didState: { state: 'finished' } }) + + const did = didResult.didState.did! + const didDocument = didResult.didState.didDocument as DidDocument + + const validVerification = validVerificationMethod(multibasePublicKey) + didDocument.verificationMethod = [validVerification] + + // add verification method to the document + let updateResult = await agent.dids.update({ + did, + didDocument, + didDocumentOperation: 'addToDidDocument', + }) + expect(updateResult.didState.state).toEqual('failed') + if (updateResult.didState.state === 'failed') + expect(updateResult.didState.reason).toEqual( + 'Unable update DID: Key #key-1 from verificationMethod not found in keys' + ) + + // add assertion method to the document + didDocument.verificationMethod = undefined + didDocument.assertionMethod = [validVerification] + + updateResult = await agent.dids.update({ + did, + didDocument, + didDocumentOperation: 'addToDidDocument', + }) + expect(updateResult.didState.state).toEqual('failed') + if (updateResult.didState.state === 'failed') + expect(updateResult.didState.reason).toEqual( + 'Unable update DID: Key #key-1 from assertionMethod not found in keys' + ) + + // add authentication method to the document + didDocument.assertionMethod = undefined + didDocument.authentication = [validVerification] + + updateResult = await agent.dids.update({ + did, + didDocument, + didDocumentOperation: 'addToDidDocument', + }) + expect(updateResult.didState.state).toEqual('failed') + if (updateResult.didState.state === 'failed') + expect(updateResult.didState.reason).toEqual( + 'Unable update DID: Key #key-1 from authentication not found in keys' + ) + + // add authentication method to the document + didDocument.authentication = undefined + didDocument.capabilityDelegation = [validVerification] + + updateResult = await agent.dids.update({ + did, + didDocument, + didDocumentOperation: 'addToDidDocument', + }) + expect(updateResult.didState.state).toEqual('failed') + if (updateResult.didState.state === 'failed') + expect(updateResult.didState.reason).toEqual( + 'Unable update DID: Key #key-1 from capabilityDelegation not found in keys' + ) + + // add authentication method to the document + didDocument.capabilityDelegation = undefined + didDocument.capabilityInvocation = [validVerification] + + updateResult = await agent.dids.update({ + did, + didDocument, + didDocumentOperation: 'addToDidDocument', + }) + expect(updateResult.didState.state).toEqual('failed') + if (updateResult.didState.state === 'failed') + expect(updateResult.didState.reason).toEqual( + 'Unable update DID: Key #key-1 from capabilityInvocation not found in keys' + ) + + // add authentication method to the document + didDocument.capabilityInvocation = undefined + didDocument.keyAgreement = [validVerification] + + updateResult = await agent.dids.update({ + did, + didDocument, + didDocumentOperation: 'addToDidDocument', + }) + expect(updateResult.didState.state).toEqual('failed') + if (updateResult.didState.state === 'failed') + expect(updateResult.didState.reason).toEqual('Unable update DID: Key #key-1 from keyAgreement not found in keys') + }) + it('should create and deactivate a did:hedera did', async () => { const didResult = await agent.dids.create({ method: 'hedera', options: { network: 'testnet', }, - secret: { - createKey: true - }, }) expect(didResult).toMatchObject({ didState: { state: 'finished' } }) @@ -268,9 +392,6 @@ describe('Hedera DID registrar', () => { const deactivateResult = await agent.dids.deactivate({ did, - secret: { - createKey: true - }, }) expect(deactivateResult.didState.didDocument?.id).toEqual(did) diff --git a/packages/hedera/tests/HederaDidResolver.e2e.test.ts b/packages/hedera/tests/HederaDidResolver.e2e.test.ts index 0e9ab297b3..14f641bf86 100644 --- a/packages/hedera/tests/HederaDidResolver.e2e.test.ts +++ b/packages/hedera/tests/HederaDidResolver.e2e.test.ts @@ -3,8 +3,7 @@ import { HederaDidCreateOptions } from '../src/ledger/HederaLedgerService' import { getHederaAgent } from './utils' describe('Hedera DID resolver', () => { - const logger = new ConsoleLogger(LogLevel.debug) - const _privateKey = process.env.HEDERA_TEST_OPERATOR_KEY ?? '' + const logger = new ConsoleLogger(LogLevel.error) let agent: Agent let did: string @@ -18,16 +17,11 @@ describe('Hedera DID resolver', () => { const didResult = await agent.dids.create({ method: 'hedera', - secret: { - createKey: true - }, }) if (!didResult.didState.did) { throw new Error('No DID created') } did = didResult.didState.did - - console.log(JSON.stringify(didResult, null, 2)) }) afterAll(async () => { @@ -37,9 +31,6 @@ describe('Hedera DID resolver', () => { it('should resolve a did:cheqd did from local testnet', async () => { const resolveResult = await agent.dids.resolve(did) - console.log(JSON.stringify(resolveResult, null, 2)) - - expect(JsonTransformer.toJSON(resolveResult)).toMatchObject({ didDocument: { '@context': ['https://www.w3.org/ns/did/v1'], From 428f8f3edd0eb1fbd4627160e98f1083120f2599 Mon Sep 17 00:00:00 2001 From: "andrey.kononov" Date: Thu, 3 Jul 2025 18:01:00 +0300 Subject: [PATCH 15/89] Use HCS module with changes awaiter Fix tests --- packages/hedera/package.json | 4 ++-- .../hedera/src/ledger/HederaLedgerService.ts | 3 +-- .../tests/HederaAnoncredsRegistry.e2e.test.ts | 16 +++++++------- packages/hedera/tests/utils/utils.ts | 6 ++--- pnpm-lock.yaml | 22 +++++++++---------- 5 files changed, 25 insertions(+), 26 deletions(-) diff --git a/packages/hedera/package.json b/packages/hedera/package.json index 7a367eef93..e8e677de8a 100644 --- a/packages/hedera/package.json +++ b/packages/hedera/package.json @@ -27,12 +27,12 @@ "@hashgraph/sdk": "^2.66.0", "@credo-ts/anoncreds": "workspace:*", "@credo-ts/core": "workspace:*", - "@hiero-did-sdk/anoncreds": "npm:@hiero-did-sdk/anoncreds@0.0.5", + "@hiero-did-sdk/anoncreds": "npm:@hiero-did-sdk/anoncreds@0.0.7", "@hiero-did-sdk/registrar": "npm:@hiero-did-sdk/registrar@0.0.7", "@hiero-did-sdk/resolver": "npm:@hiero-did-sdk/resolver@0.0.9", "@hiero-did-sdk/core": "npm:@hiero-did-sdk/core@0.0.2", "@hiero-did-sdk/client": "npm:@hiero-did-sdk/client@0.0.3", - "@hiero-did-sdk/hcs": "npm:@hiero-did-sdk/hcs@0.0.8", + "@hiero-did-sdk/hcs": "npm:@hiero-did-sdk/hcs@0.0.11", "@hiero-did-sdk/publisher-internal": "npm:@hiero-did-sdk/publisher-internal@0.0.1" }, "devDependencies": { diff --git a/packages/hedera/src/ledger/HederaLedgerService.ts b/packages/hedera/src/ledger/HederaLedgerService.ts index 388cbf8a26..6057682ccc 100644 --- a/packages/hedera/src/ledger/HederaLedgerService.ts +++ b/packages/hedera/src/ledger/HederaLedgerService.ts @@ -25,8 +25,7 @@ import { import { KeyManagementApi } from '@credo-ts/core/src/modules/kms' import { Client } from '@hashgraph/sdk' import { HederaAnoncredsRegistry } from '@hiero-did-sdk/anoncreds' -import { HederaClientService } from '@hiero-did-sdk/client' -import { HederaNetwork } from '@hiero-did-sdk/client/dist/index' +import { HederaNetwork, HederaClientService } from '@hiero-did-sdk/client' import { DIDResolution, DID_ROOT_KEY_ID, Service, VerificationMethod } from '@hiero-did-sdk/core' import { CreateDIDResult, diff --git a/packages/hedera/tests/HederaAnoncredsRegistry.e2e.test.ts b/packages/hedera/tests/HederaAnoncredsRegistry.e2e.test.ts index 29f38c7540..c7470ac441 100644 --- a/packages/hedera/tests/HederaAnoncredsRegistry.e2e.test.ts +++ b/packages/hedera/tests/HederaAnoncredsRegistry.e2e.test.ts @@ -1,6 +1,6 @@ import { Agent, ConsoleLogger, LogLevel, utils } from '@credo-ts/core' import { HederaDidCreateOptions } from '../src/ledger/HederaLedgerService' -import { getHederaAgent, waitTimeout } from './utils' +import { getHederaAgent } from './utils' import { testCache } from './utils/testCache' describe('Hedera AnonCreds support', () => { @@ -61,7 +61,7 @@ describe('Hedera AnonCreds support', () => { const schemaId = schemaResult?.schemaState?.schemaId expect(schemaId).toBeDefined() - await waitTimeout(consensusTimeout) + //await waitTimeout(consensusTimeout) // Register credential definition for the schema const credDefResult = await agent.modules.anoncreds.registerCredentialDefinition({ @@ -80,7 +80,7 @@ describe('Hedera AnonCreds support', () => { const credentialDefinitionId = credDefResult.credentialDefinitionState.credentialDefinitionId ?? '' - await waitTimeout(consensusTimeout) + //await waitTimeout(consensusTimeout) // Register revocation registry definition const revRegDefRegResult = await agent.modules.anoncreds.registerRevocationRegistryDefinition({ @@ -97,7 +97,7 @@ describe('Hedera AnonCreds support', () => { revRegDefRegResult?.revocationRegistryDefinitionState?.revocationRegistryDefinitionId ?? '' expect(revocationRegistryDefinitionId).toBeDefined() - await waitTimeout(consensusTimeout) + //await waitTimeout(consensusTimeout) const resolvedRevRegDef = await agent.modules.anoncreds.getRevocationRegistryDefinition(revocationRegistryDefinitionId) @@ -115,7 +115,7 @@ describe('Hedera AnonCreds support', () => { const revocationStatusList = registerRevocationStatusListResponse?.revocationStatusListState.revocationStatusList expect(revocationStatusList).toBeDefined() - await waitTimeout(consensusTimeout) + //await waitTimeout(consensusTimeout) // Resolve the revocation status list const revocationStatusListResponse = await agent.modules.anoncreds.getRevocationStatusList( @@ -128,7 +128,7 @@ describe('Hedera AnonCreds support', () => { expect(revocationStatusListResponse?.revocationStatusList?.issuerId).toEqual(did) expect(revocationStatusListResponse?.revocationStatusList?.revocationList).toEqual([0, 0, 0, 0, 0, 0, 0, 0, 0, 0]) - await waitTimeout(consensusTimeout) + //await waitTimeout(consensusTimeout) // Update revocation status list - Revoke indexes const revokeUpdateRevocationStatusListResponse = await agent.modules.anoncreds.updateRevocationStatusList({ @@ -144,7 +144,7 @@ describe('Hedera AnonCreds support', () => { revokeUpdateRevocationStatusListResponse?.revocationStatusListState.revocationStatusList expect(revokeRevocationStatusList).toBeDefined() - await waitTimeout(consensusTimeout) + //await waitTimeout(consensusTimeout) // Resolve the revocation status list const revokeRevocationStatusListResponse = await agent.modules.anoncreds.getRevocationStatusList( @@ -174,7 +174,7 @@ describe('Hedera AnonCreds support', () => { issueUpdateRevocationStatusListResponse?.revocationStatusListState.revocationStatusList expect(issueRevocationStatusList).toBeDefined() - await waitTimeout(consensusTimeout) + //await waitTimeout(consensusTimeout) // Resolve the revocation status list const issueRevocationStatusListResponse = await agent.modules.anoncreds.getRevocationStatusList( diff --git a/packages/hedera/tests/utils/utils.ts b/packages/hedera/tests/utils/utils.ts index b967e4382f..baf29ab0d5 100644 --- a/packages/hedera/tests/utils/utils.ts +++ b/packages/hedera/tests/utils/utils.ts @@ -1,5 +1,5 @@ export const getRandomStr = (n: number) => [...Array(n)].map(() => Math.random().toString(36)[2]).join('') -export const waitTimeout = async (timeout?: number) => { - await new Promise((resolve) => setTimeout(resolve, timeout ?? 5000)) -} +// export const waitTimeout = async (timeout?: number) => { +// await new Promise((resolve) => setTimeout(resolve, timeout ?? 5000)) +// } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index be1f99609a..f22e20743e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -612,8 +612,8 @@ importers: specifier: ^2.66.0 version: 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) '@hiero-did-sdk/anoncreds': - specifier: npm:@hiero-did-sdk/anoncreds@0.0.5 - version: 0.0.5(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) + specifier: npm:@hiero-did-sdk/anoncreds@0.0.7 + version: 0.0.7(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) '@hiero-did-sdk/client': specifier: npm:@hiero-did-sdk/client@0.0.3 version: 0.0.3(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) @@ -621,8 +621,8 @@ importers: specifier: npm:@hiero-did-sdk/core@0.0.2 version: 0.0.2(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) '@hiero-did-sdk/hcs': - specifier: npm:@hiero-did-sdk/hcs@0.0.8 - version: 0.0.8(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) + specifier: npm:@hiero-did-sdk/hcs@0.0.11 + version: 0.0.11(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) '@hiero-did-sdk/publisher-internal': specifier: npm:@hiero-did-sdk/publisher-internal@0.0.1 version: 0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) @@ -2399,8 +2399,8 @@ packages: peerDependencies: bn.js: ^5.2.1 - '@hiero-did-sdk/anoncreds@0.0.5': - resolution: {integrity: sha1-2wM2uEtD9o5uN/rzzifDwYQfAa8=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/anoncreds/-/@hiero-did-sdk/anoncreds-0.0.5.tgz} + '@hiero-did-sdk/anoncreds@0.0.7': + resolution: {integrity: sha1-OPt4eOQ0eQESc6IkAP9OtexPFYo=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/anoncreds/-/@hiero-did-sdk/anoncreds-0.0.7.tgz} '@hiero-did-sdk/cache@0.0.2': resolution: {integrity: sha1-jffSjrPyflFrvAJEuJW+ncxFcUY=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/cache/-/@hiero-did-sdk/cache-0.0.2.tgz} @@ -2423,8 +2423,8 @@ packages: '@hiero-did-sdk/crypto@0.0.2': resolution: {integrity: sha1-FXqF4hJhZl2l28snZrFu5wRucZ0=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/crypto/-/@hiero-did-sdk/crypto-0.0.2.tgz} - '@hiero-did-sdk/hcs@0.0.5': - resolution: {integrity: sha1-GAwjKLcSl/zGku2NCrIseiLdFwA=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/hcs/-/@hiero-did-sdk/hcs-0.0.5.tgz} + '@hiero-did-sdk/hcs@0.0.11': + resolution: {integrity: sha1-h9MdYWuf8HmwP1EdDsSQj+IigXo=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/hcs/-/@hiero-did-sdk/hcs-0.0.11.tgz} '@hiero-did-sdk/hcs@0.0.8': resolution: {integrity: sha1-qFil2N+Fdej7dkOhouui9CJjPKA=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/hcs/-/@hiero-did-sdk/hcs-0.0.8.tgz} @@ -10111,9 +10111,9 @@ snapshots: - expo-crypto - react-native - '@hiero-did-sdk/anoncreds@0.0.5(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': + '@hiero-did-sdk/anoncreds@0.0.7(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': dependencies: - '@hiero-did-sdk/hcs': 0.0.5(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) + '@hiero-did-sdk/hcs': 0.0.11(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) '@hiero-did-sdk/zstd': 0.0.2(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) transitivePeerDependencies: - bn.js @@ -10176,7 +10176,7 @@ snapshots: - react - react-native - '@hiero-did-sdk/hcs@0.0.5(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': + '@hiero-did-sdk/hcs@0.0.11(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': dependencies: '@hashgraph/sdk': 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) '@hiero-did-sdk/cache': 0.0.2(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) From 1569e87f0b0766be9c26cb377c98dd0279178663 Mon Sep 17 00:00:00 2001 From: "andrey.kononov" Date: Thu, 3 Jul 2025 18:13:37 +0300 Subject: [PATCH 16/89] Clear code --- .../tests/HederaAnoncredsRegistry.e2e.test.ts | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/packages/hedera/tests/HederaAnoncredsRegistry.e2e.test.ts b/packages/hedera/tests/HederaAnoncredsRegistry.e2e.test.ts index c7470ac441..f8e343e81f 100644 --- a/packages/hedera/tests/HederaAnoncredsRegistry.e2e.test.ts +++ b/packages/hedera/tests/HederaAnoncredsRegistry.e2e.test.ts @@ -4,8 +4,6 @@ import { getHederaAgent } from './utils' import { testCache } from './utils/testCache' describe('Hedera AnonCreds support', () => { - const consensusTimeout = 5000 - let agent: Agent let did: string @@ -61,8 +59,6 @@ describe('Hedera AnonCreds support', () => { const schemaId = schemaResult?.schemaState?.schemaId expect(schemaId).toBeDefined() - //await waitTimeout(consensusTimeout) - // Register credential definition for the schema const credDefResult = await agent.modules.anoncreds.registerCredentialDefinition({ credentialDefinition: { @@ -80,8 +76,6 @@ describe('Hedera AnonCreds support', () => { const credentialDefinitionId = credDefResult.credentialDefinitionState.credentialDefinitionId ?? '' - //await waitTimeout(consensusTimeout) - // Register revocation registry definition const revRegDefRegResult = await agent.modules.anoncreds.registerRevocationRegistryDefinition({ revocationRegistryDefinition: { @@ -97,8 +91,6 @@ describe('Hedera AnonCreds support', () => { revRegDefRegResult?.revocationRegistryDefinitionState?.revocationRegistryDefinitionId ?? '' expect(revocationRegistryDefinitionId).toBeDefined() - //await waitTimeout(consensusTimeout) - const resolvedRevRegDef = await agent.modules.anoncreds.getRevocationRegistryDefinition(revocationRegistryDefinitionId) expect(resolvedRevRegDef.revocationRegistryDefinitionId).toEqual(revocationRegistryDefinitionId) @@ -115,8 +107,6 @@ describe('Hedera AnonCreds support', () => { const revocationStatusList = registerRevocationStatusListResponse?.revocationStatusListState.revocationStatusList expect(revocationStatusList).toBeDefined() - //await waitTimeout(consensusTimeout) - // Resolve the revocation status list const revocationStatusListResponse = await agent.modules.anoncreds.getRevocationStatusList( revocationRegistryDefinitionId, @@ -128,8 +118,6 @@ describe('Hedera AnonCreds support', () => { expect(revocationStatusListResponse?.revocationStatusList?.issuerId).toEqual(did) expect(revocationStatusListResponse?.revocationStatusList?.revocationList).toEqual([0, 0, 0, 0, 0, 0, 0, 0, 0, 0]) - //await waitTimeout(consensusTimeout) - // Update revocation status list - Revoke indexes const revokeUpdateRevocationStatusListResponse = await agent.modules.anoncreds.updateRevocationStatusList({ options: {}, @@ -144,8 +132,6 @@ describe('Hedera AnonCreds support', () => { revokeUpdateRevocationStatusListResponse?.revocationStatusListState.revocationStatusList expect(revokeRevocationStatusList).toBeDefined() - //await waitTimeout(consensusTimeout) - // Resolve the revocation status list const revokeRevocationStatusListResponse = await agent.modules.anoncreds.getRevocationStatusList( revocationRegistryDefinitionId, @@ -174,8 +160,6 @@ describe('Hedera AnonCreds support', () => { issueUpdateRevocationStatusListResponse?.revocationStatusListState.revocationStatusList expect(issueRevocationStatusList).toBeDefined() - //await waitTimeout(consensusTimeout) - // Resolve the revocation status list const issueRevocationStatusListResponse = await agent.modules.anoncreds.getRevocationStatusList( revocationRegistryDefinitionId, From 8e6f173c29f07878701d6f0e16d0b0965a55957e Mon Sep 17 00:00:00 2001 From: "andrey.kononov" Date: Thu, 3 Jul 2025 18:42:44 +0300 Subject: [PATCH 17/89] Update lib versions --- packages/hedera/package.json | 4 ++-- pnpm-lock.yaml | 22 +++++++++++----------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/packages/hedera/package.json b/packages/hedera/package.json index e8e677de8a..67584b46fd 100644 --- a/packages/hedera/package.json +++ b/packages/hedera/package.json @@ -27,12 +27,12 @@ "@hashgraph/sdk": "^2.66.0", "@credo-ts/anoncreds": "workspace:*", "@credo-ts/core": "workspace:*", - "@hiero-did-sdk/anoncreds": "npm:@hiero-did-sdk/anoncreds@0.0.7", + "@hiero-did-sdk/anoncreds": "npm:@hiero-did-sdk/anoncreds@0.0.8", "@hiero-did-sdk/registrar": "npm:@hiero-did-sdk/registrar@0.0.7", "@hiero-did-sdk/resolver": "npm:@hiero-did-sdk/resolver@0.0.9", "@hiero-did-sdk/core": "npm:@hiero-did-sdk/core@0.0.2", "@hiero-did-sdk/client": "npm:@hiero-did-sdk/client@0.0.3", - "@hiero-did-sdk/hcs": "npm:@hiero-did-sdk/hcs@0.0.11", + "@hiero-did-sdk/hcs": "npm:@hiero-did-sdk/hcs@0.0.12", "@hiero-did-sdk/publisher-internal": "npm:@hiero-did-sdk/publisher-internal@0.0.1" }, "devDependencies": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f22e20743e..80791299b5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -612,8 +612,8 @@ importers: specifier: ^2.66.0 version: 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) '@hiero-did-sdk/anoncreds': - specifier: npm:@hiero-did-sdk/anoncreds@0.0.7 - version: 0.0.7(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) + specifier: npm:@hiero-did-sdk/anoncreds@0.0.8 + version: 0.0.8(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) '@hiero-did-sdk/client': specifier: npm:@hiero-did-sdk/client@0.0.3 version: 0.0.3(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) @@ -621,8 +621,8 @@ importers: specifier: npm:@hiero-did-sdk/core@0.0.2 version: 0.0.2(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) '@hiero-did-sdk/hcs': - specifier: npm:@hiero-did-sdk/hcs@0.0.11 - version: 0.0.11(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) + specifier: npm:@hiero-did-sdk/hcs@0.0.12 + version: 0.0.12(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) '@hiero-did-sdk/publisher-internal': specifier: npm:@hiero-did-sdk/publisher-internal@0.0.1 version: 0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) @@ -2399,8 +2399,8 @@ packages: peerDependencies: bn.js: ^5.2.1 - '@hiero-did-sdk/anoncreds@0.0.7': - resolution: {integrity: sha1-OPt4eOQ0eQESc6IkAP9OtexPFYo=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/anoncreds/-/@hiero-did-sdk/anoncreds-0.0.7.tgz} + '@hiero-did-sdk/anoncreds@0.0.8': + resolution: {integrity: sha1-Y4OkQXJsyUEQkaZBmSnkzUXyhdY=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/anoncreds/-/@hiero-did-sdk/anoncreds-0.0.8.tgz} '@hiero-did-sdk/cache@0.0.2': resolution: {integrity: sha1-jffSjrPyflFrvAJEuJW+ncxFcUY=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/cache/-/@hiero-did-sdk/cache-0.0.2.tgz} @@ -2423,8 +2423,8 @@ packages: '@hiero-did-sdk/crypto@0.0.2': resolution: {integrity: sha1-FXqF4hJhZl2l28snZrFu5wRucZ0=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/crypto/-/@hiero-did-sdk/crypto-0.0.2.tgz} - '@hiero-did-sdk/hcs@0.0.11': - resolution: {integrity: sha1-h9MdYWuf8HmwP1EdDsSQj+IigXo=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/hcs/-/@hiero-did-sdk/hcs-0.0.11.tgz} + '@hiero-did-sdk/hcs@0.0.12': + resolution: {integrity: sha1-yOuIZRLwqavehvMldDN61AnYRG8=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/hcs/-/@hiero-did-sdk/hcs-0.0.12.tgz} '@hiero-did-sdk/hcs@0.0.8': resolution: {integrity: sha1-qFil2N+Fdej7dkOhouui9CJjPKA=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/hcs/-/@hiero-did-sdk/hcs-0.0.8.tgz} @@ -10111,9 +10111,9 @@ snapshots: - expo-crypto - react-native - '@hiero-did-sdk/anoncreds@0.0.7(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': + '@hiero-did-sdk/anoncreds@0.0.8(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': dependencies: - '@hiero-did-sdk/hcs': 0.0.11(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) + '@hiero-did-sdk/hcs': 0.0.12(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) '@hiero-did-sdk/zstd': 0.0.2(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) transitivePeerDependencies: - bn.js @@ -10176,7 +10176,7 @@ snapshots: - react - react-native - '@hiero-did-sdk/hcs@0.0.11(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': + '@hiero-did-sdk/hcs@0.0.12(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': dependencies: '@hashgraph/sdk': 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) '@hiero-did-sdk/cache': 0.0.2(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) From 549b1fdd0a5aca7799304d2b45981af2cec84433 Mon Sep 17 00:00:00 2001 From: "andrey.kononov" Date: Wed, 9 Jul 2025 12:37:40 +0300 Subject: [PATCH 18/89] Use updated libraries --- packages/hedera/package.json | 14 +-- pnpm-lock.yaml | 222 +++++++++++++---------------------- 2 files changed, 89 insertions(+), 147 deletions(-) diff --git a/packages/hedera/package.json b/packages/hedera/package.json index 67584b46fd..e67596ca81 100644 --- a/packages/hedera/package.json +++ b/packages/hedera/package.json @@ -27,13 +27,13 @@ "@hashgraph/sdk": "^2.66.0", "@credo-ts/anoncreds": "workspace:*", "@credo-ts/core": "workspace:*", - "@hiero-did-sdk/anoncreds": "npm:@hiero-did-sdk/anoncreds@0.0.8", - "@hiero-did-sdk/registrar": "npm:@hiero-did-sdk/registrar@0.0.7", - "@hiero-did-sdk/resolver": "npm:@hiero-did-sdk/resolver@0.0.9", - "@hiero-did-sdk/core": "npm:@hiero-did-sdk/core@0.0.2", - "@hiero-did-sdk/client": "npm:@hiero-did-sdk/client@0.0.3", - "@hiero-did-sdk/hcs": "npm:@hiero-did-sdk/hcs@0.0.12", - "@hiero-did-sdk/publisher-internal": "npm:@hiero-did-sdk/publisher-internal@0.0.1" + "@hiero-did-sdk/anoncreds": "npm:@hiero-did-sdk/anoncreds@0.0.9", + "@hiero-did-sdk/registrar": "npm:@hiero-did-sdk/registrar@0.0.8", + "@hiero-did-sdk/resolver": "npm:@hiero-did-sdk/resolver@0.0.10", + "@hiero-did-sdk/core": "npm:@hiero-did-sdk/core@0.0.5", + "@hiero-did-sdk/client": "npm:@hiero-did-sdk/client@0.0.4", + "@hiero-did-sdk/hcs": "npm:@hiero-did-sdk/hcs@0.0.13", + "@hiero-did-sdk/publisher-internal": "npm:@hiero-did-sdk/publisher-internal@0.0.2" }, "devDependencies": { "@credo-ts/node": "workspace:*", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 80791299b5..364f0a8d8e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -612,26 +612,26 @@ importers: specifier: ^2.66.0 version: 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) '@hiero-did-sdk/anoncreds': - specifier: npm:@hiero-did-sdk/anoncreds@0.0.8 - version: 0.0.8(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) + specifier: npm:@hiero-did-sdk/anoncreds@0.0.9 + version: 0.0.9(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) '@hiero-did-sdk/client': - specifier: npm:@hiero-did-sdk/client@0.0.3 - version: 0.0.3(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + specifier: npm:@hiero-did-sdk/client@0.0.4 + version: 0.0.4(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) '@hiero-did-sdk/core': - specifier: npm:@hiero-did-sdk/core@0.0.2 - version: 0.0.2(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + specifier: npm:@hiero-did-sdk/core@0.0.5 + version: 0.0.5(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) '@hiero-did-sdk/hcs': - specifier: npm:@hiero-did-sdk/hcs@0.0.12 - version: 0.0.12(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) + specifier: npm:@hiero-did-sdk/hcs@0.0.13 + version: 0.0.13(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) '@hiero-did-sdk/publisher-internal': - specifier: npm:@hiero-did-sdk/publisher-internal@0.0.1 - version: 0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + specifier: npm:@hiero-did-sdk/publisher-internal@0.0.2 + version: 0.0.2(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) '@hiero-did-sdk/registrar': - specifier: npm:@hiero-did-sdk/registrar@0.0.7 - version: 0.0.7(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) + specifier: npm:@hiero-did-sdk/registrar@0.0.8 + version: 0.0.8(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) '@hiero-did-sdk/resolver': - specifier: npm:@hiero-did-sdk/resolver@0.0.9 - version: 0.0.9(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) + specifier: npm:@hiero-did-sdk/resolver@0.0.10 + version: 0.0.10(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) devDependencies: '@credo-ts/node': specifier: workspace:* @@ -2399,70 +2399,55 @@ packages: peerDependencies: bn.js: ^5.2.1 - '@hiero-did-sdk/anoncreds@0.0.8': - resolution: {integrity: sha1-Y4OkQXJsyUEQkaZBmSnkzUXyhdY=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/anoncreds/-/@hiero-did-sdk/anoncreds-0.0.8.tgz} + '@hiero-did-sdk/anoncreds@0.0.9': + resolution: {integrity: sha1-4M8XJ6bmtcMwsoYjA5w7bKMNas0=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/anoncreds/-/@hiero-did-sdk/anoncreds-0.0.9.tgz} - '@hiero-did-sdk/cache@0.0.2': - resolution: {integrity: sha1-jffSjrPyflFrvAJEuJW+ncxFcUY=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/cache/-/@hiero-did-sdk/cache-0.0.2.tgz} + '@hiero-did-sdk/cache@0.0.3': + resolution: {integrity: sha1-JUbuuq3Dl72peNxUEySeTvQElwA=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/cache/-/@hiero-did-sdk/cache-0.0.3.tgz} - '@hiero-did-sdk/client@0.0.3': - resolution: {integrity: sha1-pFwODG9IEbVc9GMkfrC3TroiSbA=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/client/-/@hiero-did-sdk/client-0.0.3.tgz} + '@hiero-did-sdk/client@0.0.4': + resolution: {integrity: sha1-OTnZkhUFMZ3qp7S5WHcO8OxzgsE=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/client/-/@hiero-did-sdk/client-0.0.4.tgz} - '@hiero-did-sdk/core@0.0.1': - resolution: {integrity: sha1-ng7T9mbOTVEkyGyV8CcUtTiRL/Q=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/core/-/@hiero-did-sdk/core-0.0.1.tgz} + '@hiero-did-sdk/core@0.0.5': + resolution: {integrity: sha1-1rRCpwjNfwl8OhCRSTWLnL86RYY=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/core/-/@hiero-did-sdk/core-0.0.5.tgz} engines: {node: '>=20'} - '@hiero-did-sdk/core@0.0.2': - resolution: {integrity: sha1-1/QjEyGk0ASFA+2WkyqrGu7lmL4=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/core/-/@hiero-did-sdk/core-0.0.2.tgz} - engines: {node: '>=20'} - - '@hiero-did-sdk/core@0.0.4': - resolution: {integrity: sha1-CBjHJmObZbG1MVRNos1QkLOnPNE=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/core/-/@hiero-did-sdk/core-0.0.4.tgz} - engines: {node: '>=20'} - - '@hiero-did-sdk/crypto@0.0.2': - resolution: {integrity: sha1-FXqF4hJhZl2l28snZrFu5wRucZ0=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/crypto/-/@hiero-did-sdk/crypto-0.0.2.tgz} - - '@hiero-did-sdk/hcs@0.0.12': - resolution: {integrity: sha1-yOuIZRLwqavehvMldDN61AnYRG8=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/hcs/-/@hiero-did-sdk/hcs-0.0.12.tgz} - - '@hiero-did-sdk/hcs@0.0.8': - resolution: {integrity: sha1-qFil2N+Fdej7dkOhouui9CJjPKA=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/hcs/-/@hiero-did-sdk/hcs-0.0.8.tgz} + '@hiero-did-sdk/crypto@0.0.3': + resolution: {integrity: sha1-m5oxs/c+lmww+MmcEanmCRuWqQc=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/crypto/-/@hiero-did-sdk/crypto-0.0.3.tgz} - '@hiero-did-sdk/lifecycle@0.0.1': - resolution: {integrity: sha1-Wr9teNFTaBKQWTxg4+ciDkmKmTw=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/lifecycle/-/@hiero-did-sdk/lifecycle-0.0.1.tgz} - engines: {node: '>=20'} + '@hiero-did-sdk/hcs@0.0.13': + resolution: {integrity: sha1-i4lx8+8U6u9/31NO8Woq7+jlTWY=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/hcs/-/@hiero-did-sdk/hcs-0.0.13.tgz} - '@hiero-did-sdk/messages@0.0.1': - resolution: {integrity: sha1-V/utYJ7aN7gsXQXvUaWw4bnSS9s=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/messages/-/@hiero-did-sdk/messages-0.0.1.tgz} + '@hiero-did-sdk/lifecycle@0.0.2': + resolution: {integrity: sha1-qj89bZEwBb/a6/C3CRe2VX4Oe6I=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/lifecycle/-/@hiero-did-sdk/lifecycle-0.0.2.tgz} engines: {node: '>=20'} - '@hiero-did-sdk/publisher-internal@0.0.1': - resolution: {integrity: sha1-ljb+sGgZZ9+LNPjqCD5/L/e/9qQ=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/publisher-internal/-/@hiero-did-sdk/publisher-internal-0.0.1.tgz} + '@hiero-did-sdk/messages@0.0.2': + resolution: {integrity: sha1-liKCnJx2Ou0EtOK+9aVM9PJi1jk=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/messages/-/@hiero-did-sdk/messages-0.0.2.tgz} engines: {node: '>=20'} - '@hiero-did-sdk/registrar@0.0.7': - resolution: {integrity: sha1-0z1azwZopTNh9hUg8HX4YHhbYdY=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/registrar/-/@hiero-did-sdk/registrar-0.0.7.tgz} + '@hiero-did-sdk/publisher-internal@0.0.2': + resolution: {integrity: sha1-BKYpxotlinpD3saY0Fas2xo0ts4=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/publisher-internal/-/@hiero-did-sdk/publisher-internal-0.0.2.tgz} engines: {node: '>=20'} - '@hiero-did-sdk/resolver@0.0.1': - resolution: {integrity: sha1-wnraBME9Nh2ZndgtpIpsJAiV/L8=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/resolver/-/@hiero-did-sdk/resolver-0.0.1.tgz} + '@hiero-did-sdk/registrar@0.0.8': + resolution: {integrity: sha1-dL18LF503r2VKSz0R2R+ydUXRBY=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/registrar/-/@hiero-did-sdk/registrar-0.0.8.tgz} engines: {node: '>=20'} - '@hiero-did-sdk/resolver@0.0.9': - resolution: {integrity: sha1-MRsXEmL6cphcpQMvs+LOmawRGOQ=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/resolver/-/@hiero-did-sdk/resolver-0.0.9.tgz} + '@hiero-did-sdk/resolver@0.0.10': + resolution: {integrity: sha1-BDeQYuiD6UubGrOtZOCzmCgHdZU=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/resolver/-/@hiero-did-sdk/resolver-0.0.10.tgz} engines: {node: '>=20'} - '@hiero-did-sdk/signer-internal@0.0.4': - resolution: {integrity: sha1-hwKoetJ+ZmsCfO/sLGsVyANEi/g=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/signer-internal/-/@hiero-did-sdk/signer-internal-0.0.4.tgz} + '@hiero-did-sdk/signer-internal@0.0.5': + resolution: {integrity: sha1-JNO12ItqOgnZEW1tES7qSNI4Zzo=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/signer-internal/-/@hiero-did-sdk/signer-internal-0.0.5.tgz} engines: {node: '>=20'} - '@hiero-did-sdk/verifier-internal@0.0.1': - resolution: {integrity: sha1-OIOfKsgdl0nu6qjsk5dSZg4WcqQ=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/verifier-internal/-/@hiero-did-sdk/verifier-internal-0.0.1.tgz} + '@hiero-did-sdk/verifier-internal@0.0.2': + resolution: {integrity: sha1-V9CZsMYox6KeDq5t7KCKNSrZLLk=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/verifier-internal/-/@hiero-did-sdk/verifier-internal-0.0.2.tgz} engines: {node: '>=20'} - '@hiero-did-sdk/zstd@0.0.2': - resolution: {integrity: sha1-QS6ZLrfamatPUNoIAxyV8Kaq6wk=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/zstd/-/@hiero-did-sdk/zstd-0.0.2.tgz} + '@hiero-did-sdk/zstd@0.0.3': + resolution: {integrity: sha1-4/aMiygba4lv+Wz0hB4wHVkfKAI=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/zstd/-/@hiero-did-sdk/zstd-0.0.3.tgz} '@hyperledger/anoncreds-nodejs@0.3.1': resolution: {integrity: sha512-/oWmWgcOPqjAtd2+dKASPYL84Qd7sAFyCBfEKM7PAgVbObaZUZc0kqA7hkEz/qyiqUvcP/JwKTc1v4zVZi6BTg==} @@ -10111,43 +10096,33 @@ snapshots: - expo-crypto - react-native - '@hiero-did-sdk/anoncreds@0.0.8(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': + '@hiero-did-sdk/anoncreds@0.0.9(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': dependencies: - '@hiero-did-sdk/hcs': 0.0.12(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) - '@hiero-did-sdk/zstd': 0.0.2(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) + '@hiero-did-sdk/hcs': 0.0.13(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) + '@hiero-did-sdk/zstd': 0.0.3(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) transitivePeerDependencies: - bn.js - expo-crypto - react - react-native - '@hiero-did-sdk/cache@0.0.2(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': - dependencies: - '@hiero-did-sdk/core': 0.0.4(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - transitivePeerDependencies: - - bn.js - - expo-crypto - - react-native - - '@hiero-did-sdk/client@0.0.3(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': + '@hiero-did-sdk/cache@0.0.3(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': dependencies: - '@hashgraph/sdk': 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/core': 0.0.5(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) transitivePeerDependencies: - bn.js - expo-crypto - react-native - '@hiero-did-sdk/core@0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': + '@hiero-did-sdk/client@0.0.4(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': dependencies: '@hashgraph/sdk': 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@scure/base': 1.2.6 - cbor-x: 1.6.0 transitivePeerDependencies: - bn.js - expo-crypto - react-native - '@hiero-did-sdk/core@0.0.2(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': + '@hiero-did-sdk/core@0.0.5(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': dependencies: '@hashgraph/sdk': 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) '@scure/base': 1.2.6 @@ -10157,17 +10132,7 @@ snapshots: - expo-crypto - react-native - '@hiero-did-sdk/core@0.0.4(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': - dependencies: - '@hashgraph/sdk': 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@scure/base': 1.2.6 - cbor-x: 1.6.0 - transitivePeerDependencies: - - bn.js - - expo-crypto - - react-native - - '@hiero-did-sdk/crypto@0.0.2(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': + '@hiero-did-sdk/crypto@0.0.3(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': dependencies: crypto: 1.0.1 crypto-js: 4.2.0 @@ -10176,119 +10141,96 @@ snapshots: - react - react-native - '@hiero-did-sdk/hcs@0.0.12(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': + '@hiero-did-sdk/hcs@0.0.13(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': dependencies: '@hashgraph/sdk': 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk/cache': 0.0.2(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk/client': 0.0.3(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk/core': 0.0.4(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk/crypto': 0.0.2(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) - '@hiero-did-sdk/zstd': 0.0.2(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) + '@hiero-did-sdk/cache': 0.0.3(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/client': 0.0.4(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/core': 0.0.5(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/crypto': 0.0.3(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) + '@hiero-did-sdk/zstd': 0.0.3(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) transitivePeerDependencies: - bn.js - expo-crypto - react - react-native - '@hiero-did-sdk/hcs@0.0.8(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': + '@hiero-did-sdk/lifecycle@0.0.2(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': dependencies: - '@hashgraph/sdk': 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk/cache': 0.0.2(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk/client': 0.0.3(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk/core': 0.0.4(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk/crypto': 0.0.2(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) - '@hiero-did-sdk/zstd': 0.0.2(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) + '@hiero-did-sdk/core': 0.0.5(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) transitivePeerDependencies: - bn.js - expo-crypto - - react - react-native - '@hiero-did-sdk/lifecycle@0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': - dependencies: - '@hiero-did-sdk/core': 0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - transitivePeerDependencies: - - bn.js - - expo-crypto - - react-native - - '@hiero-did-sdk/messages@0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': + '@hiero-did-sdk/messages@0.0.2(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': dependencies: '@hashgraph/sdk': 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk/core': 0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk/lifecycle': 0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk/resolver': 0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/core': 0.0.5(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/lifecycle': 0.0.2(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/resolver': 0.0.10(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) transitivePeerDependencies: - bn.js - expo-crypto + - react - react-native - '@hiero-did-sdk/publisher-internal@0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': + '@hiero-did-sdk/publisher-internal@0.0.2(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': dependencies: '@hashgraph/sdk': 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk/core': 0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/core': 0.0.5(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) transitivePeerDependencies: - bn.js - expo-crypto - react-native - '@hiero-did-sdk/registrar@0.0.7(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': + '@hiero-did-sdk/registrar@0.0.8(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': dependencies: '@hashgraph/sdk': 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk/core': 0.0.4(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk/lifecycle': 0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk/messages': 0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk/publisher-internal': 0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk/resolver': 0.0.9(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) - '@hiero-did-sdk/signer-internal': 0.0.4(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk/verifier-internal': 0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/core': 0.0.5(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/lifecycle': 0.0.2(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/messages': 0.0.2(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) + '@hiero-did-sdk/publisher-internal': 0.0.2(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/resolver': 0.0.10(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) + '@hiero-did-sdk/signer-internal': 0.0.5(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/verifier-internal': 0.0.2(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) transitivePeerDependencies: - bn.js - expo-crypto - react - react-native - '@hiero-did-sdk/resolver@0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': - dependencies: - '@hashgraph/sdk': 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk/core': 0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk/verifier-internal': 0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - transitivePeerDependencies: - - bn.js - - expo-crypto - - react-native - - '@hiero-did-sdk/resolver@0.0.9(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': + '@hiero-did-sdk/resolver@0.0.10(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': dependencies: '@hashgraph/sdk': 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk/core': 0.0.4(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk/hcs': 0.0.8(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) - '@hiero-did-sdk/verifier-internal': 0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/core': 0.0.5(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/hcs': 0.0.13(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) + '@hiero-did-sdk/verifier-internal': 0.0.2(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) transitivePeerDependencies: - bn.js - expo-crypto - react - react-native - '@hiero-did-sdk/signer-internal@0.0.4(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': + '@hiero-did-sdk/signer-internal@0.0.5(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': dependencies: '@hashgraph/sdk': 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk/core': 0.0.4(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/core': 0.0.5(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) transitivePeerDependencies: - bn.js - expo-crypto - react-native - '@hiero-did-sdk/verifier-internal@0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': + '@hiero-did-sdk/verifier-internal@0.0.2(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': dependencies: '@hashgraph/sdk': 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk/core': 0.0.1(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/core': 0.0.5(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) transitivePeerDependencies: - bn.js - expo-crypto - react-native - '@hiero-did-sdk/zstd@0.0.2(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': + '@hiero-did-sdk/zstd@0.0.3(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': dependencies: react-native-zstd: 1.1.0(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) zstd-napi: 0.0.10 From 7e5b7141ed5b4ffaf339f86313eabe9d50a721a6 Mon Sep 17 00:00:00 2001 From: "andrey.kononov" Date: Fri, 11 Jul 2025 15:22:18 +0300 Subject: [PATCH 19/89] Up used libraries versions --- packages/hedera/package.json | 4 +-- pnpm-lock.yaml | 50 ++++++++++++++++++++++++++++++------ 2 files changed, 44 insertions(+), 10 deletions(-) diff --git a/packages/hedera/package.json b/packages/hedera/package.json index e67596ca81..c8d6e2cfdb 100644 --- a/packages/hedera/package.json +++ b/packages/hedera/package.json @@ -27,12 +27,12 @@ "@hashgraph/sdk": "^2.66.0", "@credo-ts/anoncreds": "workspace:*", "@credo-ts/core": "workspace:*", - "@hiero-did-sdk/anoncreds": "npm:@hiero-did-sdk/anoncreds@0.0.9", + "@hiero-did-sdk/anoncreds": "npm:@hiero-did-sdk/anoncreds@0.0.10", "@hiero-did-sdk/registrar": "npm:@hiero-did-sdk/registrar@0.0.8", "@hiero-did-sdk/resolver": "npm:@hiero-did-sdk/resolver@0.0.10", "@hiero-did-sdk/core": "npm:@hiero-did-sdk/core@0.0.5", "@hiero-did-sdk/client": "npm:@hiero-did-sdk/client@0.0.4", - "@hiero-did-sdk/hcs": "npm:@hiero-did-sdk/hcs@0.0.13", + "@hiero-did-sdk/hcs": "npm:@hiero-did-sdk/hcs@0.0.15", "@hiero-did-sdk/publisher-internal": "npm:@hiero-did-sdk/publisher-internal@0.0.2" }, "devDependencies": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 364f0a8d8e..6a0619b861 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -612,8 +612,8 @@ importers: specifier: ^2.66.0 version: 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) '@hiero-did-sdk/anoncreds': - specifier: npm:@hiero-did-sdk/anoncreds@0.0.9 - version: 0.0.9(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) + specifier: npm:@hiero-did-sdk/anoncreds@0.0.10 + version: 0.0.10(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) '@hiero-did-sdk/client': specifier: npm:@hiero-did-sdk/client@0.0.4 version: 0.0.4(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) @@ -621,8 +621,8 @@ importers: specifier: npm:@hiero-did-sdk/core@0.0.5 version: 0.0.5(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) '@hiero-did-sdk/hcs': - specifier: npm:@hiero-did-sdk/hcs@0.0.13 - version: 0.0.13(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) + specifier: npm:@hiero-did-sdk/hcs@0.0.15 + version: 0.0.15(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) '@hiero-did-sdk/publisher-internal': specifier: npm:@hiero-did-sdk/publisher-internal@0.0.2 version: 0.0.2(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) @@ -2399,8 +2399,8 @@ packages: peerDependencies: bn.js: ^5.2.1 - '@hiero-did-sdk/anoncreds@0.0.9': - resolution: {integrity: sha1-4M8XJ6bmtcMwsoYjA5w7bKMNas0=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/anoncreds/-/@hiero-did-sdk/anoncreds-0.0.9.tgz} + '@hiero-did-sdk/anoncreds@0.0.10': + resolution: {integrity: sha1-vdwykJlVb5y/jetkQQK+E82JgXU=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/anoncreds/-/@hiero-did-sdk/anoncreds-0.0.10.tgz} '@hiero-did-sdk/cache@0.0.3': resolution: {integrity: sha1-JUbuuq3Dl72peNxUEySeTvQElwA=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/cache/-/@hiero-did-sdk/cache-0.0.3.tgz} @@ -2418,6 +2418,12 @@ packages: '@hiero-did-sdk/hcs@0.0.13': resolution: {integrity: sha1-i4lx8+8U6u9/31NO8Woq7+jlTWY=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/hcs/-/@hiero-did-sdk/hcs-0.0.13.tgz} + '@hiero-did-sdk/hcs@0.0.14': + resolution: {integrity: sha1-o50nHQxmn5oU2TPjSCcJzP1vY/Q=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/hcs/-/@hiero-did-sdk/hcs-0.0.14.tgz} + + '@hiero-did-sdk/hcs@0.0.15': + resolution: {integrity: sha1-eGOJD8+wGX3WYEZC3c7sa4raa7U=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/hcs/-/@hiero-did-sdk/hcs-0.0.15.tgz} + '@hiero-did-sdk/lifecycle@0.0.2': resolution: {integrity: sha1-qj89bZEwBb/a6/C3CRe2VX4Oe6I=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/lifecycle/-/@hiero-did-sdk/lifecycle-0.0.2.tgz} engines: {node: '>=20'} @@ -10096,9 +10102,9 @@ snapshots: - expo-crypto - react-native - '@hiero-did-sdk/anoncreds@0.0.9(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': + '@hiero-did-sdk/anoncreds@0.0.10(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': dependencies: - '@hiero-did-sdk/hcs': 0.0.13(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) + '@hiero-did-sdk/hcs': 0.0.14(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) '@hiero-did-sdk/zstd': 0.0.3(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) transitivePeerDependencies: - bn.js @@ -10155,6 +10161,34 @@ snapshots: - react - react-native + '@hiero-did-sdk/hcs@0.0.14(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': + dependencies: + '@hashgraph/sdk': 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/cache': 0.0.3(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/client': 0.0.4(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/core': 0.0.5(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/crypto': 0.0.3(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) + '@hiero-did-sdk/zstd': 0.0.3(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) + transitivePeerDependencies: + - bn.js + - expo-crypto + - react + - react-native + + '@hiero-did-sdk/hcs@0.0.15(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': + dependencies: + '@hashgraph/sdk': 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/cache': 0.0.3(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/client': 0.0.4(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/core': 0.0.5(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/crypto': 0.0.3(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) + '@hiero-did-sdk/zstd': 0.0.3(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) + transitivePeerDependencies: + - bn.js + - expo-crypto + - react + - react-native + '@hiero-did-sdk/lifecycle@0.0.2(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': dependencies: '@hiero-did-sdk/core': 0.0.5(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) From 2bfc1f9927e16a933837977e18149fe3f5cd069a Mon Sep 17 00:00:00 2001 From: "andrey.kononov" Date: Thu, 17 Jul 2025 17:55:09 +0300 Subject: [PATCH 20/89] Fix PR notes --- demo/src/Faber.ts | 22 +- jest.config.base.ts | 1 + package.json | 3 - packages/hedera/jest.config.ts | 1 - packages/hedera/package.json | 14 +- .../src/anoncreds/HederaAnonCredsRegistry.ts | 16 +- .../hedera/src/dids/HederaDidRegistrar.ts | 24 +- packages/hedera/src/index.ts | 3 - .../hedera/src/ledger/HederaLedgerService.ts | 14 +- .../hedera/src/ledger/cache/CredoCache.ts | 12 +- .../src/ledger/publisher/KmsPublisher.ts | 12 +- .../tests/HederaAnoncredsRegistry.e2e.test.ts | 3 +- .../tests/HederaDidRegistrar.e2e.test.ts | 4 +- .../tests/utils/InMemoryTailsFileService.ts | 59 ----- packages/hedera/tests/utils/index.ts | 1 + .../tests/utils/testTailsFileService.ts | 1 - pnpm-lock.yaml | 206 ++++++++---------- 17 files changed, 156 insertions(+), 240 deletions(-) delete mode 100644 packages/hedera/tests/utils/InMemoryTailsFileService.ts diff --git a/demo/src/Faber.ts b/demo/src/Faber.ts index 30990da956..4179026e62 100644 --- a/demo/src/Faber.ts +++ b/demo/src/Faber.ts @@ -17,6 +17,8 @@ export enum RegistryOptions { hedera = 'did:hedera', } +type Extensible = Record + export class Faber extends BaseAgent { public outOfBandId?: string public credentialDefinition?: RegisterCredentialDefinitionReturnStateFinished @@ -39,12 +41,22 @@ export class Faber extends BaseAgent { // and store the existing did in the wallet // indy did is based on private key (seed) const unqualifiedIndyDid = '2jEvRuKmfBJTRa7QowDpNN' - const cheqdDid = 'did:cheqd:testnet:d37eba59-513d-42d3-8f9f-d1df0548b675' - const indyDid = `did:indy:${indyNetworkConfig.indyNamespace}:${unqualifiedIndyDid}` - const hederaDid = 'did:hedera:testnet:44eesExqdsUvLZ35FpnBPErqRGRnYbzzyG3wgCCYxkmq_0.0.6231121' - const didDocumentRelativeKeyId = registry === RegistryOptions.indy ? '#verkey' : registry === RegistryOptions.cheqd ? '#key-1' : '#did-root-key' - const did = registry === RegistryOptions.indy ? indyDid : registry === RegistryOptions.cheqd ? cheqdDid : hederaDid + const rootKeyIds: Extensible = { + [RegistryOptions.indy]: '#verkey', + [RegistryOptions.cheqd]: '#key-1', + [RegistryOptions.hedera]: '#did-root-key', + } + + const Dids: Extensible = { + [RegistryOptions.indy]: `did:indy:${indyNetworkConfig.indyNamespace}:${unqualifiedIndyDid}`, + [RegistryOptions.cheqd]: 'did:cheqd:testnet:d37eba59-513d-42d3-8f9f-d1df0548b675', + [RegistryOptions.hedera]: 'did:hedera:testnet:44eesExqdsUvLZ35FpnBPErqRGRnYbzzyG3wgCCYxkmq_0.0.6231121', + } + + const didDocumentRelativeKeyId = rootKeyIds[registry] + const did = Dids[registry] + const { privateJwk } = transformPrivateKeyToPrivateJwk({ type: { crv: 'Ed25519', diff --git a/jest.config.base.ts b/jest.config.base.ts index 43b6b40302..41ed7a8e94 100644 --- a/jest.config.base.ts +++ b/jest.config.base.ts @@ -17,6 +17,7 @@ const config: Config.InitialOptions = { }, ], }, + testTimeout: 60000, } export default config diff --git a/package.json b/package.json index c063ec7838..3664eb998e 100644 --- a/package.json +++ b/package.json @@ -60,9 +60,6 @@ "node": ">=18" }, "pnpm": { - "patchedDependencies": { - "@2060.io/ffi-napi@4.0.9": "patches/@2060.io__ffi-napi@4.0.9.patch" - }, "onlyBuiltDependencies": [ "@2060.io/ffi-napi", "@2060.io/ref-napi", diff --git a/packages/hedera/jest.config.ts b/packages/hedera/jest.config.ts index 9192efbeeb..2556d19c61 100644 --- a/packages/hedera/jest.config.ts +++ b/packages/hedera/jest.config.ts @@ -6,7 +6,6 @@ import packageJson from './package.json' const config: Config.InitialOptions = { ...base, - testTimeout: 1200000, displayName: packageJson.name, } diff --git a/packages/hedera/package.json b/packages/hedera/package.json index c8d6e2cfdb..b7abcd9d8e 100644 --- a/packages/hedera/package.json +++ b/packages/hedera/package.json @@ -27,13 +27,13 @@ "@hashgraph/sdk": "^2.66.0", "@credo-ts/anoncreds": "workspace:*", "@credo-ts/core": "workspace:*", - "@hiero-did-sdk/anoncreds": "npm:@hiero-did-sdk/anoncreds@0.0.10", - "@hiero-did-sdk/registrar": "npm:@hiero-did-sdk/registrar@0.0.8", - "@hiero-did-sdk/resolver": "npm:@hiero-did-sdk/resolver@0.0.10", - "@hiero-did-sdk/core": "npm:@hiero-did-sdk/core@0.0.5", - "@hiero-did-sdk/client": "npm:@hiero-did-sdk/client@0.0.4", - "@hiero-did-sdk/hcs": "npm:@hiero-did-sdk/hcs@0.0.15", - "@hiero-did-sdk/publisher-internal": "npm:@hiero-did-sdk/publisher-internal@0.0.2" + "@hiero-did-sdk/anoncreds": "npm:@hiero-did-sdk/anoncreds@0.0.12", + "@hiero-did-sdk/registrar": "npm:@hiero-did-sdk/registrar@0.0.9", + "@hiero-did-sdk/resolver": "npm:@hiero-did-sdk/resolver@0.0.11", + "@hiero-did-sdk/core": "npm:@hiero-did-sdk/core@0.0.7", + "@hiero-did-sdk/client": "npm:@hiero-did-sdk/client@0.0.5", + "@hiero-did-sdk/hcs": "npm:@hiero-did-sdk/hcs@0.0.16", + "@hiero-did-sdk/publisher-internal": "npm:@hiero-did-sdk/publisher-internal@0.0.3" }, "devDependencies": { "@credo-ts/node": "workspace:*", diff --git a/packages/hedera/src/anoncreds/HederaAnonCredsRegistry.ts b/packages/hedera/src/anoncreds/HederaAnonCredsRegistry.ts index 36c2d6f1ef..f743749100 100644 --- a/packages/hedera/src/anoncreds/HederaAnonCredsRegistry.ts +++ b/packages/hedera/src/anoncreds/HederaAnonCredsRegistry.ts @@ -25,7 +25,7 @@ export class HederaAnonCredsRegistry implements AnonCredsRegistry { options: RegisterSchemaOptions ): Promise { try { - agentContext.config.logger.trace('Submitting register schema request to ledger') + agentContext.config.logger.trace('Registering schema on Hedera ledger') const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) return await ledgerService.registerSchema(agentContext, options) } catch (error) { @@ -48,7 +48,7 @@ export class HederaAnonCredsRegistry implements AnonCredsRegistry { public async getSchema(agentContext: AgentContext, schemaId: string): Promise { try { - agentContext.config.logger.trace(`Submitting get schema request for schema '${schemaId}' to ledger`) + agentContext.config.logger.trace(`Resolving schema '${schemaId}' from Hedera ledger`) const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) return await ledgerService.getSchema(agentContext, schemaId) } catch (error) { @@ -72,7 +72,7 @@ export class HederaAnonCredsRegistry implements AnonCredsRegistry { options: RegisterCredentialDefinitionOptions ): Promise { try { - agentContext.config.logger.trace('Submitting register credential definition request to ledger') + agentContext.config.logger.trace('Registering credential definition on Hedera ledger') const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) return await ledgerService.registerCredentialDefinition(agentContext, options) } catch (error) { @@ -102,7 +102,7 @@ export class HederaAnonCredsRegistry implements AnonCredsRegistry { ): Promise { try { agentContext.config.logger.trace( - `Submitting get credential definition request for '${credentialDefinitionId}' to ledger` + `Resolving credential definition '${credentialDefinitionId}' from Hedera ledger` ) const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) return await ledgerService.getCredentialDefinition(agentContext, credentialDefinitionId) @@ -128,7 +128,7 @@ export class HederaAnonCredsRegistry implements AnonCredsRegistry { ): Promise { try { agentContext.config.logger.trace( - `Submitting register revocation registry definition request for '${options.revocationRegistryDefinition.credDefId}' to ledger` + `Registering revocation registry definition for '${options.revocationRegistryDefinition.credDefId}' on Hedera ledger` ) const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) return await ledgerService.registerRevocationRegistryDefinition(agentContext, options) @@ -159,7 +159,7 @@ export class HederaAnonCredsRegistry implements AnonCredsRegistry { ): Promise { try { agentContext.config.logger.trace( - `Submitting get revocation registry definition request for '${revocationRegistryDefinitionId}' to ledger` + `Resolving revocation registry definition for '${revocationRegistryDefinitionId}' from Hedera ledger` ) const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) return await ledgerService.getRevocationRegistryDefinition(agentContext, revocationRegistryDefinitionId) @@ -188,7 +188,7 @@ export class HederaAnonCredsRegistry implements AnonCredsRegistry { ): Promise { try { agentContext.config.logger.trace( - `Submitting register revocation status list request for '${options.revocationStatusList.revRegDefId}' to ledger` + `Registering revocation status list for '${options.revocationStatusList.revRegDefId}' on Hedera ledger` ) const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) return await ledgerService.registerRevocationStatusList(agentContext, options) @@ -220,7 +220,7 @@ export class HederaAnonCredsRegistry implements AnonCredsRegistry { ): Promise { try { agentContext.config.logger.trace( - `Submitting get revocation status request for '${revocationRegistryId}' to ledger` + `Resolving revocation status for for '${revocationRegistryId}' from Hedera ledger` ) const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) return await ledgerService.getRevocationStatusList(agentContext, revocationRegistryId, timestamp) diff --git a/packages/hedera/src/dids/HederaDidRegistrar.ts b/packages/hedera/src/dids/HederaDidRegistrar.ts index 8216fa229f..51dccfa751 100644 --- a/packages/hedera/src/dids/HederaDidRegistrar.ts +++ b/packages/hedera/src/dids/HederaDidRegistrar.ts @@ -24,8 +24,6 @@ export class HederaDidRegistrar implements DidRegistrar { async create(agentContext: AgentContext, options: HederaDidCreateOptions): Promise { try { - agentContext.config.logger.trace('Try to create the did document to ledger') - const didRepository = agentContext.dependencyManager.resolve(DidRepository) const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) @@ -58,7 +56,7 @@ export class HederaDidRegistrar implements DidRegistrar { }, } } catch (error) { - agentContext.config.logger.debug('Error creating of the did ', { + agentContext.config.logger.debug('Error creating DID', { error, }) return { @@ -92,7 +90,7 @@ export class HederaDidRegistrar implements DidRegistrar { } // Update did - const keys = this.concateKeys(didRecord.keys, options.secret?.keys) + const keys = this.concatKeys(didRecord.keys, options.secret?.keys) const { didDocument: updatedDidDocument } = await ledgerService.updateDid(agentContext, { ...options, secret: { keys }, @@ -113,7 +111,7 @@ export class HederaDidRegistrar implements DidRegistrar { }, } } catch (error) { - agentContext.config.logger.error('Error updating DID', error) + agentContext.config.logger.error('Error update DID', error) return { didDocumentMetadata: {}, didRegistrationMetadata: {}, @@ -125,7 +123,7 @@ export class HederaDidRegistrar implements DidRegistrar { } } - async deactivate(agentContext: AgentContext, options: HederaDidDeactivateOptions): Promise { + async deactivate(agentContext: AgentContext, options: Omit): Promise { const didRepository = agentContext.dependencyManager.resolve(DidRepository) const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) @@ -147,15 +145,13 @@ export class HederaDidRegistrar implements DidRegistrar { } } // Deactivate did - const keys = this.concateKeys(didRecord.keys, options.secret?.keys) const { didDocument: deactivatedDidDocument } = await ledgerService.deactivateDid(agentContext, { ...options, - secret: { keys }, + secret: { keys: didRecord.keys }, }) // Save the did to wallet didRecord.didDocument = JsonTransformer.fromJSON(deactivatedDidDocument, DidDocument) - didRecord.keys = keys await didRepository.update(agentContext, didRecord) return { @@ -168,7 +164,7 @@ export class HederaDidRegistrar implements DidRegistrar { }, } } catch (error) { - agentContext.config.logger.error('Error deactivating DID', error) + agentContext.config.logger.error('Error deactivate DID', error) return { didDocumentMetadata: {}, didRegistrationMetadata: {}, @@ -180,12 +176,10 @@ export class HederaDidRegistrar implements DidRegistrar { } } - private concateKeys(keys1?: DidDocumentKey[], keys2?: DidDocumentKey[]): DidDocumentKey[] { - const _keys1 = keys1 ?? [] - const _keys2 = keys2 ?? [] + private concatKeys(keys1: DidDocumentKey[] = [], keys2: DidDocumentKey[] = []): DidDocumentKey[] { return [ - ..._keys1, - ..._keys2.filter((k2) => !_keys1.some((k1) => k1.didDocumentRelativeKeyId === k2.didDocumentRelativeKeyId)), + ...keys1, + ...keys2.filter((k2) => !keys1.some((k1) => k1.didDocumentRelativeKeyId === k2.didDocumentRelativeKeyId)), ] } } diff --git a/packages/hedera/src/index.ts b/packages/hedera/src/index.ts index b552a6b0f9..47a772c75f 100644 --- a/packages/hedera/src/index.ts +++ b/packages/hedera/src/index.ts @@ -1,7 +1,4 @@ -// Dids export * from './dids' - -// AnonCreds export * from './anoncreds' export * from './HederaModule' export * from './HederaModuleConfig' diff --git a/packages/hedera/src/ledger/HederaLedgerService.ts b/packages/hedera/src/ledger/HederaLedgerService.ts index 6057682ccc..3f052e9e66 100644 --- a/packages/hedera/src/ledger/HederaLedgerService.ts +++ b/packages/hedera/src/ledger/HederaLedgerService.ts @@ -26,7 +26,7 @@ import { KeyManagementApi } from '@credo-ts/core/src/modules/kms' import { Client } from '@hashgraph/sdk' import { HederaAnoncredsRegistry } from '@hiero-did-sdk/anoncreds' import { HederaNetwork, HederaClientService } from '@hiero-did-sdk/client' -import { DIDResolution, DID_ROOT_KEY_ID, Service, VerificationMethod } from '@hiero-did-sdk/core' +import {DIDResolution, DID_ROOT_KEY_ID, Service, VerificationMethod, parseDID} from '@hiero-did-sdk/core' import { CreateDIDResult, DIDUpdateBuilder, @@ -39,7 +39,7 @@ import { submitDeactivateDIDRequest, submitUpdateDIDRequest, } from '@hiero-did-sdk/registrar' -import { TopicReaderHederaHcs, parseDID, resolveDID } from '@hiero-did-sdk/resolver' +import { TopicReaderHederaHcs, resolveDID } from '@hiero-did-sdk/resolver' import { HederaModuleConfig } from '../HederaModuleConfig' import { CredoCache } from './cache/CredoCache' import { KmsPublisher } from './publisher/KmsPublisher' @@ -164,7 +164,7 @@ export class HederaLedgerService { } // Check all required keys presents - this.checkKeys(didDocument, secret?.keys ?? []) + this.checkRequiredDidDocumentKeys(didDocument, secret?.keys ?? []) const { network: networkName } = parseDID(did) return this.clientService.withClient({ networkName }, async (client: Client) => { @@ -331,9 +331,9 @@ export class HederaLedgerService { } private async getPublisher(agentContext: AgentContext, client: Client, keyId: string): Promise { - const publisher = new KmsPublisher(agentContext, client) - await publisher.setKeyId(keyId) - return publisher + const kms = agentContext.dependencyManager.resolve(Kms.KeyManagementApi) + const key = await createOrGetKey(kms, keyId) + return new KmsPublisher(agentContext, client, key) } private getHederaAnonCredsSdk(agentContext: AgentContext): HederaAnoncredsRegistry { @@ -383,7 +383,7 @@ export class HederaLedgerService { return result } - private checkKeys(didDocument: DidDocument | Partial, keys: DidDocumentKey[]) { + private checkRequiredDidDocumentKeys(didDocument: DidDocument | Partial, keys: DidDocumentKey[]) { const fields = [ 'verificationMethod', 'assertionMethod', diff --git a/packages/hedera/src/ledger/cache/CredoCache.ts b/packages/hedera/src/ledger/cache/CredoCache.ts index f851268d0b..df6d59e70d 100644 --- a/packages/hedera/src/ledger/cache/CredoCache.ts +++ b/packages/hedera/src/ledger/cache/CredoCache.ts @@ -12,26 +12,20 @@ export class CredoCache implements Cache { constructor(private readonly agentContext: AgentContext) { this.credoCache = agentContext.dependencyManager.resolve(CacheModuleConfig).cache - } - - async get(key: string): Promise { if (!this.credoCache) { throw new CredoError('Error initializing cache') } + } + + async get(key: string): Promise { return await this.credoCache.get(this.agentContext, key) } async set(key: string, value: CacheValue, _expiresInSeconds?: number): Promise { - if (!this.credoCache) { - throw new CredoError('Error initializing cache') - } await this.credoCache.set(this.agentContext, key, value) } async remove(key: string): Promise { - if (!this.credoCache) { - throw new CredoError('Error initializing cache') - } await this.credoCache.remove(this.agentContext, key) } diff --git a/packages/hedera/src/ledger/publisher/KmsPublisher.ts b/packages/hedera/src/ledger/publisher/KmsPublisher.ts index aa64b5e1ef..58c00f0fdf 100644 --- a/packages/hedera/src/ledger/publisher/KmsPublisher.ts +++ b/packages/hedera/src/ledger/publisher/KmsPublisher.ts @@ -1,5 +1,5 @@ import { AgentContext, Kms, TypedArrayEncoder } from '@credo-ts/core' -import { KeyManagementApi } from '@credo-ts/core/src/modules/kms' +import {KeyManagementApi, KmsJwkPublicOkp} from '@credo-ts/core/src/modules/kms' import { Client, PublicKey, Transaction, TransactionReceipt } from '@hashgraph/sdk' import { KeysUtility } from '@hiero-did-sdk/core' import { Publisher as ClientPublisher } from '@hiero-did-sdk/publisher-internal' @@ -11,9 +11,15 @@ export class KmsPublisher extends ClientPublisher { private keyId!: string private submitPublicKey!: PublicKey - constructor(agentContext: AgentContext, client: Client) { + constructor(agentContext: AgentContext, client: Client, key: { keyId: string; publicJwk: KmsJwkPublicOkp & { crv: 'Ed25519' } }) { super(client) + this.kms = agentContext.dependencyManager.resolve(Kms.KeyManagementApi) + + this.keyId = key.keyId + this.submitPublicKey = KeysUtility.fromBytes( + Uint8Array.from(TypedArrayEncoder.fromBase64(key.publicJwk.x)) + ).toPublicKey() } async setKeyId(keyId: string) { @@ -42,7 +48,7 @@ export class KmsPublisher extends ClientPublisher { const response = await transaction.execute(this.client) - const receipt = await response.getReceipt(this.client) + const receipt: TransactionReceipt = await response.getReceipt(this.client) return receipt } } diff --git a/packages/hedera/tests/HederaAnoncredsRegistry.e2e.test.ts b/packages/hedera/tests/HederaAnoncredsRegistry.e2e.test.ts index f8e343e81f..1f76a0c191 100644 --- a/packages/hedera/tests/HederaAnoncredsRegistry.e2e.test.ts +++ b/packages/hedera/tests/HederaAnoncredsRegistry.e2e.test.ts @@ -1,7 +1,6 @@ import { Agent, ConsoleLogger, LogLevel, utils } from '@credo-ts/core' import { HederaDidCreateOptions } from '../src/ledger/HederaLedgerService' -import { getHederaAgent } from './utils' -import { testCache } from './utils/testCache' +import { getHederaAgent, testCache } from './utils' describe('Hedera AnonCreds support', () => { let agent: Agent diff --git a/packages/hedera/tests/HederaDidRegistrar.e2e.test.ts b/packages/hedera/tests/HederaDidRegistrar.e2e.test.ts index 21e25654a9..e2f125e68b 100644 --- a/packages/hedera/tests/HederaDidRegistrar.e2e.test.ts +++ b/packages/hedera/tests/HederaDidRegistrar.e2e.test.ts @@ -390,8 +390,8 @@ describe('Hedera DID registrar', () => { const did = didResult.didState.did! - const deactivateResult = await agent.dids.deactivate({ - did, + const deactivateResult = await agent.dids.deactivate({ + did }) expect(deactivateResult.didState.didDocument?.id).toEqual(did) diff --git a/packages/hedera/tests/utils/InMemoryTailsFileService.ts b/packages/hedera/tests/utils/InMemoryTailsFileService.ts deleted file mode 100644 index 952d4e51ea..0000000000 --- a/packages/hedera/tests/utils/InMemoryTailsFileService.ts +++ /dev/null @@ -1,59 +0,0 @@ -import type { AnonCredsRevocationRegistryDefinition } from '@credo-ts/anoncreds' -import type { AgentContext, FileSystem } from '@credo-ts/core' - -import { InjectionSymbols } from '@credo-ts/core' - -import { BasicTailsFileService } from '@credo-ts/anoncreds' - -export class InMemoryTailsFileService extends BasicTailsFileService { - private tailsFilePaths: Record = {} - - public async uploadTailsFile( - _agentContext: AgentContext, - options: { - revocationRegistryDefinition: AnonCredsRevocationRegistryDefinition - } - ) { - this.tailsFilePaths[options.revocationRegistryDefinition.value.tailsHash] = - options.revocationRegistryDefinition.value.tailsLocation - - return { tailsFileUrl: options.revocationRegistryDefinition.value.tailsLocation.replace(/\\/g, '/') } - } - - public async getTailsFile( - agentContext: AgentContext, - options: { - revocationRegistryDefinition: AnonCredsRevocationRegistryDefinition - } - ) { - const { revocationRegistryDefinition } = options - const { tailsLocation, tailsHash } = revocationRegistryDefinition.value - - try { - agentContext.config.logger.debug( - `Checking to see if tails file for URL ${revocationRegistryDefinition.value.tailsLocation} has been stored in the FileSystem` - ) - - // hash is used as file identifier - const tailsExists = await this.tailsFileExists(agentContext, tailsHash) - const tailsFilePath = await this.getTailsFilePath(agentContext, tailsHash) - agentContext.config.logger.debug( - `Tails file for ${tailsLocation} ${tailsExists ? 'is stored' : 'is not stored'} at ${tailsFilePath}` - ) - - if (!tailsExists) { - agentContext.config.logger.debug(`Retrieving tails file from URL ${tailsLocation}`) - const fileSystem = agentContext.dependencyManager.resolve(InjectionSymbols.FileSystem) - await fileSystem.downloadToFile(tailsLocation, tailsFilePath) - agentContext.config.logger.debug(`Saved tails file to FileSystem at path ${tailsFilePath}`) - } - - return { tailsFilePath } - } catch (error) { - agentContext.config.logger.error(`Error while retrieving tails file from URL ${tailsLocation}`, { - error, - }) - throw error - } - } -} diff --git a/packages/hedera/tests/utils/index.ts b/packages/hedera/tests/utils/index.ts index 10254fc074..ca92ddeaa0 100644 --- a/packages/hedera/tests/utils/index.ts +++ b/packages/hedera/tests/utils/index.ts @@ -1,3 +1,4 @@ export * from './hederaModule' +export * from './testCache' export * from './testTailsFileService' export * from './utils' diff --git a/packages/hedera/tests/utils/testTailsFileService.ts b/packages/hedera/tests/utils/testTailsFileService.ts index ee3672de6a..ce418eed05 100644 --- a/packages/hedera/tests/utils/testTailsFileService.ts +++ b/packages/hedera/tests/utils/testTailsFileService.ts @@ -20,7 +20,6 @@ export class TestTailsFileService extends BasicTailsFileService { return { tailsFileUrl: options.revocationRegistryDefinition.value.tailsLocation, } - // tailsFileUrl: options.revocationRegistryDefinition.value.tailsLocation.replace(/\\/g, '/') } public async getTailsFile( diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6a0619b861..07574726ff 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -612,26 +612,26 @@ importers: specifier: ^2.66.0 version: 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) '@hiero-did-sdk/anoncreds': - specifier: npm:@hiero-did-sdk/anoncreds@0.0.10 - version: 0.0.10(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) + specifier: npm:@hiero-did-sdk/anoncreds@0.0.12 + version: 0.0.12(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) '@hiero-did-sdk/client': - specifier: npm:@hiero-did-sdk/client@0.0.4 - version: 0.0.4(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk/core': - specifier: npm:@hiero-did-sdk/core@0.0.5 + specifier: npm:@hiero-did-sdk/client@0.0.5 version: 0.0.5(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/core': + specifier: npm:@hiero-did-sdk/core@0.0.7 + version: 0.0.7(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) '@hiero-did-sdk/hcs': - specifier: npm:@hiero-did-sdk/hcs@0.0.15 - version: 0.0.15(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) + specifier: npm:@hiero-did-sdk/hcs@0.0.16 + version: 0.0.16(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) '@hiero-did-sdk/publisher-internal': - specifier: npm:@hiero-did-sdk/publisher-internal@0.0.2 - version: 0.0.2(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + specifier: npm:@hiero-did-sdk/publisher-internal@0.0.3 + version: 0.0.3(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) '@hiero-did-sdk/registrar': - specifier: npm:@hiero-did-sdk/registrar@0.0.8 - version: 0.0.8(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) + specifier: npm:@hiero-did-sdk/registrar@0.0.9 + version: 0.0.9(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) '@hiero-did-sdk/resolver': - specifier: npm:@hiero-did-sdk/resolver@0.0.10 - version: 0.0.10(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) + specifier: npm:@hiero-did-sdk/resolver@0.0.11 + version: 0.0.11(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) devDependencies: '@credo-ts/node': specifier: workspace:* @@ -2399,61 +2399,55 @@ packages: peerDependencies: bn.js: ^5.2.1 - '@hiero-did-sdk/anoncreds@0.0.10': - resolution: {integrity: sha1-vdwykJlVb5y/jetkQQK+E82JgXU=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/anoncreds/-/@hiero-did-sdk/anoncreds-0.0.10.tgz} + '@hiero-did-sdk/anoncreds@0.0.12': + resolution: {integrity: sha1-LQ/oQqY+SuCDVhvkOC7/wTOt6tc=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/anoncreds/-/@hiero-did-sdk/anoncreds-0.0.12.tgz} - '@hiero-did-sdk/cache@0.0.3': - resolution: {integrity: sha1-JUbuuq3Dl72peNxUEySeTvQElwA=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/cache/-/@hiero-did-sdk/cache-0.0.3.tgz} + '@hiero-did-sdk/cache@0.0.4': + resolution: {integrity: sha1-TzZZdokp18doe76X2PZ6+P/NysQ=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/cache/-/@hiero-did-sdk/cache-0.0.4.tgz} - '@hiero-did-sdk/client@0.0.4': - resolution: {integrity: sha1-OTnZkhUFMZ3qp7S5WHcO8OxzgsE=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/client/-/@hiero-did-sdk/client-0.0.4.tgz} + '@hiero-did-sdk/client@0.0.5': + resolution: {integrity: sha1-V44WHtnGFC9h+6RBsIhlqxhFOZ4=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/client/-/@hiero-did-sdk/client-0.0.5.tgz} - '@hiero-did-sdk/core@0.0.5': - resolution: {integrity: sha1-1rRCpwjNfwl8OhCRSTWLnL86RYY=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/core/-/@hiero-did-sdk/core-0.0.5.tgz} + '@hiero-did-sdk/core@0.0.7': + resolution: {integrity: sha1-y9F/uQDwxSEj9sFAwx2d/OP1gSY=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/core/-/@hiero-did-sdk/core-0.0.7.tgz} engines: {node: '>=20'} - '@hiero-did-sdk/crypto@0.0.3': - resolution: {integrity: sha1-m5oxs/c+lmww+MmcEanmCRuWqQc=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/crypto/-/@hiero-did-sdk/crypto-0.0.3.tgz} - - '@hiero-did-sdk/hcs@0.0.13': - resolution: {integrity: sha1-i4lx8+8U6u9/31NO8Woq7+jlTWY=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/hcs/-/@hiero-did-sdk/hcs-0.0.13.tgz} - - '@hiero-did-sdk/hcs@0.0.14': - resolution: {integrity: sha1-o50nHQxmn5oU2TPjSCcJzP1vY/Q=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/hcs/-/@hiero-did-sdk/hcs-0.0.14.tgz} + '@hiero-did-sdk/crypto@0.0.4': + resolution: {integrity: sha1-MIH9v7vfEeoP8CzCTRnhPa8wJjE=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/crypto/-/@hiero-did-sdk/crypto-0.0.4.tgz} - '@hiero-did-sdk/hcs@0.0.15': - resolution: {integrity: sha1-eGOJD8+wGX3WYEZC3c7sa4raa7U=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/hcs/-/@hiero-did-sdk/hcs-0.0.15.tgz} + '@hiero-did-sdk/hcs@0.0.16': + resolution: {integrity: sha1-gSuhiRLyIlK8BvHOYlw83UBfTMY=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/hcs/-/@hiero-did-sdk/hcs-0.0.16.tgz} - '@hiero-did-sdk/lifecycle@0.0.2': - resolution: {integrity: sha1-qj89bZEwBb/a6/C3CRe2VX4Oe6I=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/lifecycle/-/@hiero-did-sdk/lifecycle-0.0.2.tgz} + '@hiero-did-sdk/lifecycle@0.0.3': + resolution: {integrity: sha1-mFQM8PfroBFftvHMpylYUILmVJ0=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/lifecycle/-/@hiero-did-sdk/lifecycle-0.0.3.tgz} engines: {node: '>=20'} - '@hiero-did-sdk/messages@0.0.2': - resolution: {integrity: sha1-liKCnJx2Ou0EtOK+9aVM9PJi1jk=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/messages/-/@hiero-did-sdk/messages-0.0.2.tgz} + '@hiero-did-sdk/messages@0.0.3': + resolution: {integrity: sha1-ZJjbZE4sHpGa/fdYm4oepnk4j2E=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/messages/-/@hiero-did-sdk/messages-0.0.3.tgz} engines: {node: '>=20'} - '@hiero-did-sdk/publisher-internal@0.0.2': - resolution: {integrity: sha1-BKYpxotlinpD3saY0Fas2xo0ts4=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/publisher-internal/-/@hiero-did-sdk/publisher-internal-0.0.2.tgz} + '@hiero-did-sdk/publisher-internal@0.0.3': + resolution: {integrity: sha1-tPoQUe7qhjr5fN4e7rM7qcVK9bw=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/publisher-internal/-/@hiero-did-sdk/publisher-internal-0.0.3.tgz} engines: {node: '>=20'} - '@hiero-did-sdk/registrar@0.0.8': - resolution: {integrity: sha1-dL18LF503r2VKSz0R2R+ydUXRBY=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/registrar/-/@hiero-did-sdk/registrar-0.0.8.tgz} + '@hiero-did-sdk/registrar@0.0.9': + resolution: {integrity: sha1-ageDo6jfMlCFVaLoVRrJRadQGlE=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/registrar/-/@hiero-did-sdk/registrar-0.0.9.tgz} engines: {node: '>=20'} - '@hiero-did-sdk/resolver@0.0.10': - resolution: {integrity: sha1-BDeQYuiD6UubGrOtZOCzmCgHdZU=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/resolver/-/@hiero-did-sdk/resolver-0.0.10.tgz} + '@hiero-did-sdk/resolver@0.0.11': + resolution: {integrity: sha1-6Tmi8PZIWy7NKCpIahJIig63SiI=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/resolver/-/@hiero-did-sdk/resolver-0.0.11.tgz} engines: {node: '>=20'} - '@hiero-did-sdk/signer-internal@0.0.5': - resolution: {integrity: sha1-JNO12ItqOgnZEW1tES7qSNI4Zzo=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/signer-internal/-/@hiero-did-sdk/signer-internal-0.0.5.tgz} + '@hiero-did-sdk/signer-internal@0.0.6': + resolution: {integrity: sha1-pgohdAEpmBvuvR+hvtPFqIoK1Yc=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/signer-internal/-/@hiero-did-sdk/signer-internal-0.0.6.tgz} engines: {node: '>=20'} - '@hiero-did-sdk/verifier-internal@0.0.2': - resolution: {integrity: sha1-V9CZsMYox6KeDq5t7KCKNSrZLLk=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/verifier-internal/-/@hiero-did-sdk/verifier-internal-0.0.2.tgz} + '@hiero-did-sdk/verifier-internal@0.0.3': + resolution: {integrity: sha1-HLZK03ispkAwwQXLWakImaYbvNQ=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/verifier-internal/-/@hiero-did-sdk/verifier-internal-0.0.3.tgz} engines: {node: '>=20'} - '@hiero-did-sdk/zstd@0.0.3': - resolution: {integrity: sha1-4/aMiygba4lv+Wz0hB4wHVkfKAI=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/zstd/-/@hiero-did-sdk/zstd-0.0.3.tgz} + '@hiero-did-sdk/zstd@0.0.4': + resolution: {integrity: sha1-yJMI8dyfabe1xkjNdivcRmus9gE=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/zstd/-/@hiero-did-sdk/zstd-0.0.4.tgz} '@hyperledger/anoncreds-nodejs@0.3.1': resolution: {integrity: sha512-/oWmWgcOPqjAtd2+dKASPYL84Qd7sAFyCBfEKM7PAgVbObaZUZc0kqA7hkEz/qyiqUvcP/JwKTc1v4zVZi6BTg==} @@ -10102,25 +10096,25 @@ snapshots: - expo-crypto - react-native - '@hiero-did-sdk/anoncreds@0.0.10(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': + '@hiero-did-sdk/anoncreds@0.0.12(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': dependencies: - '@hiero-did-sdk/hcs': 0.0.14(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) - '@hiero-did-sdk/zstd': 0.0.3(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) + '@hiero-did-sdk/hcs': 0.0.16(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) + '@hiero-did-sdk/zstd': 0.0.4(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) transitivePeerDependencies: - bn.js - expo-crypto - react - react-native - '@hiero-did-sdk/cache@0.0.3(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': + '@hiero-did-sdk/cache@0.0.4(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': dependencies: - '@hiero-did-sdk/core': 0.0.5(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/core': 0.0.7(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) transitivePeerDependencies: - bn.js - expo-crypto - react-native - '@hiero-did-sdk/client@0.0.4(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': + '@hiero-did-sdk/client@0.0.5(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': dependencies: '@hashgraph/sdk': 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) transitivePeerDependencies: @@ -10128,18 +10122,20 @@ snapshots: - expo-crypto - react-native - '@hiero-did-sdk/core@0.0.5(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': + '@hiero-did-sdk/core@0.0.7(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': dependencies: '@hashgraph/sdk': 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) '@scure/base': 1.2.6 + buffer: 6.0.3 cbor-x: 1.6.0 transitivePeerDependencies: - bn.js - expo-crypto - react-native - '@hiero-did-sdk/crypto@0.0.3(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': + '@hiero-did-sdk/crypto@0.0.4(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': dependencies: + buffer: 6.0.3 crypto: 1.0.1 crypto-js: 4.2.0 react-native-quick-crypto: 0.7.14(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) @@ -10147,124 +10143,104 @@ snapshots: - react - react-native - '@hiero-did-sdk/hcs@0.0.13(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': - dependencies: - '@hashgraph/sdk': 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk/cache': 0.0.3(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk/client': 0.0.4(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk/core': 0.0.5(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk/crypto': 0.0.3(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) - '@hiero-did-sdk/zstd': 0.0.3(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) - transitivePeerDependencies: - - bn.js - - expo-crypto - - react - - react-native - - '@hiero-did-sdk/hcs@0.0.14(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': - dependencies: - '@hashgraph/sdk': 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk/cache': 0.0.3(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk/client': 0.0.4(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk/core': 0.0.5(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk/crypto': 0.0.3(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) - '@hiero-did-sdk/zstd': 0.0.3(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) - transitivePeerDependencies: - - bn.js - - expo-crypto - - react - - react-native - - '@hiero-did-sdk/hcs@0.0.15(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': + '@hiero-did-sdk/hcs@0.0.16(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': dependencies: '@hashgraph/sdk': 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk/cache': 0.0.3(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk/client': 0.0.4(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk/core': 0.0.5(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk/crypto': 0.0.3(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) - '@hiero-did-sdk/zstd': 0.0.3(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) + '@hiero-did-sdk/cache': 0.0.4(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/client': 0.0.5(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/core': 0.0.7(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/crypto': 0.0.4(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) + '@hiero-did-sdk/zstd': 0.0.4(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) + buffer: 6.0.3 transitivePeerDependencies: - bn.js - expo-crypto - react - react-native - '@hiero-did-sdk/lifecycle@0.0.2(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': + '@hiero-did-sdk/lifecycle@0.0.3(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': dependencies: - '@hiero-did-sdk/core': 0.0.5(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/core': 0.0.7(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + buffer: 6.0.3 transitivePeerDependencies: - bn.js - expo-crypto - react-native - '@hiero-did-sdk/messages@0.0.2(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': + '@hiero-did-sdk/messages@0.0.3(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': dependencies: '@hashgraph/sdk': 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk/core': 0.0.5(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk/lifecycle': 0.0.2(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk/resolver': 0.0.10(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) + '@hiero-did-sdk/core': 0.0.7(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/lifecycle': 0.0.3(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/resolver': 0.0.11(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) + buffer: 6.0.3 transitivePeerDependencies: - bn.js - expo-crypto - react - react-native - '@hiero-did-sdk/publisher-internal@0.0.2(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': + '@hiero-did-sdk/publisher-internal@0.0.3(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': dependencies: '@hashgraph/sdk': 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk/core': 0.0.5(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/core': 0.0.7(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + buffer: 6.0.3 transitivePeerDependencies: - bn.js - expo-crypto - react-native - '@hiero-did-sdk/registrar@0.0.8(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': + '@hiero-did-sdk/registrar@0.0.9(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': dependencies: '@hashgraph/sdk': 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk/core': 0.0.5(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk/lifecycle': 0.0.2(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk/messages': 0.0.2(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) - '@hiero-did-sdk/publisher-internal': 0.0.2(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk/resolver': 0.0.10(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) - '@hiero-did-sdk/signer-internal': 0.0.5(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk/verifier-internal': 0.0.2(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/core': 0.0.7(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/lifecycle': 0.0.3(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/messages': 0.0.3(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) + '@hiero-did-sdk/publisher-internal': 0.0.3(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/resolver': 0.0.11(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) + '@hiero-did-sdk/signer-internal': 0.0.6(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/verifier-internal': 0.0.3(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + buffer: 6.0.3 transitivePeerDependencies: - bn.js - expo-crypto - react - react-native - '@hiero-did-sdk/resolver@0.0.10(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': + '@hiero-did-sdk/resolver@0.0.11(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': dependencies: '@hashgraph/sdk': 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk/core': 0.0.5(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk/hcs': 0.0.13(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) - '@hiero-did-sdk/verifier-internal': 0.0.2(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/core': 0.0.7(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/hcs': 0.0.16(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) + '@hiero-did-sdk/verifier-internal': 0.0.3(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + buffer: 6.0.3 transitivePeerDependencies: - bn.js - expo-crypto - react - react-native - '@hiero-did-sdk/signer-internal@0.0.5(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': + '@hiero-did-sdk/signer-internal@0.0.6(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': dependencies: '@hashgraph/sdk': 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk/core': 0.0.5(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/core': 0.0.7(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + buffer: 6.0.3 transitivePeerDependencies: - bn.js - expo-crypto - react-native - '@hiero-did-sdk/verifier-internal@0.0.2(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': + '@hiero-did-sdk/verifier-internal@0.0.3(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': dependencies: '@hashgraph/sdk': 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk/core': 0.0.5(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/core': 0.0.7(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + buffer: 6.0.3 transitivePeerDependencies: - bn.js - expo-crypto - react-native - '@hiero-did-sdk/zstd@0.0.3(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': + '@hiero-did-sdk/zstd@0.0.4(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': dependencies: react-native-zstd: 1.1.0(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) zstd-napi: 0.0.10 From 2cd3297164e3c769482c44fb232e58586a7ebdb4 Mon Sep 17 00:00:00 2001 From: "andrey.kononov" Date: Thu, 17 Jul 2025 18:04:22 +0300 Subject: [PATCH 21/89] Fix PR notes --- jest.config.base.ts | 1 - packages/hedera/jest.config.ts | 1 + packages/hedera/tests/HederaDidRegistrar.e2e.test.ts | 1 - 3 files changed, 1 insertion(+), 2 deletions(-) diff --git a/jest.config.base.ts b/jest.config.base.ts index 41ed7a8e94..43b6b40302 100644 --- a/jest.config.base.ts +++ b/jest.config.base.ts @@ -17,7 +17,6 @@ const config: Config.InitialOptions = { }, ], }, - testTimeout: 60000, } export default config diff --git a/packages/hedera/jest.config.ts b/packages/hedera/jest.config.ts index 2556d19c61..95d7a0b737 100644 --- a/packages/hedera/jest.config.ts +++ b/packages/hedera/jest.config.ts @@ -6,6 +6,7 @@ import packageJson from './package.json' const config: Config.InitialOptions = { ...base, + testTimeout: 100000, displayName: packageJson.name, } diff --git a/packages/hedera/tests/HederaDidRegistrar.e2e.test.ts b/packages/hedera/tests/HederaDidRegistrar.e2e.test.ts index e2f125e68b..dcca210093 100644 --- a/packages/hedera/tests/HederaDidRegistrar.e2e.test.ts +++ b/packages/hedera/tests/HederaDidRegistrar.e2e.test.ts @@ -9,7 +9,6 @@ import { } from '@credo-ts/core' import { HederaDidCreateOptions, - HederaDidDeactivateOptions, HederaDidUpdateOptions, } from '../src/ledger/HederaLedgerService' import { getMultibasePublicKey } from '../src/ledger/utils' From a471f613921ba5c3e931676d4989d766e9fce8df Mon Sep 17 00:00:00 2001 From: Alexander Shenshin Date: Mon, 21 Jul 2025 13:03:12 +0300 Subject: [PATCH 22/89] Misc. cleanup --- packages/hedera/package.json | 14 +++++----- packages/hedera/tests/utils/hederaModule.ts | 4 +-- pnpm-lock.yaml | 29 +++++++++------------ 3 files changed, 21 insertions(+), 26 deletions(-) diff --git a/packages/hedera/package.json b/packages/hedera/package.json index b7abcd9d8e..2a67f9b15c 100644 --- a/packages/hedera/package.json +++ b/packages/hedera/package.json @@ -27,13 +27,13 @@ "@hashgraph/sdk": "^2.66.0", "@credo-ts/anoncreds": "workspace:*", "@credo-ts/core": "workspace:*", - "@hiero-did-sdk/anoncreds": "npm:@hiero-did-sdk/anoncreds@0.0.12", - "@hiero-did-sdk/registrar": "npm:@hiero-did-sdk/registrar@0.0.9", - "@hiero-did-sdk/resolver": "npm:@hiero-did-sdk/resolver@0.0.11", - "@hiero-did-sdk/core": "npm:@hiero-did-sdk/core@0.0.7", - "@hiero-did-sdk/client": "npm:@hiero-did-sdk/client@0.0.5", - "@hiero-did-sdk/hcs": "npm:@hiero-did-sdk/hcs@0.0.16", - "@hiero-did-sdk/publisher-internal": "npm:@hiero-did-sdk/publisher-internal@0.0.3" + "@hiero-did-sdk/anoncreds": "0.0.12", + "@hiero-did-sdk/registrar": "0.0.9", + "@hiero-did-sdk/resolver": "0.0.11", + "@hiero-did-sdk/core": "0.0.7", + "@hiero-did-sdk/client": "0.0.5", + "@hiero-did-sdk/hcs": "0.0.16", + "@hiero-did-sdk/publisher-internal": "0.0.3" }, "devDependencies": { "@credo-ts/node": "workspace:*", diff --git a/packages/hedera/tests/utils/hederaModule.ts b/packages/hedera/tests/utils/hederaModule.ts index 11e482f202..2511a9ed53 100644 --- a/packages/hedera/tests/utils/hederaModule.ts +++ b/packages/hedera/tests/utils/hederaModule.ts @@ -14,8 +14,8 @@ import { askar } from '@openwallet-foundation/askar-nodejs' import { TestTailsFileService } from './testTailsFileService' export const getHederaModuleConfig = (props: { operatorId?: string; operatorKey?: string }) => { - const operatorId = props.operatorId ?? process.env.HEDERA_TEST_OPERATOR_ID ?? '' - const operatorKey = props.operatorKey ?? process.env.HEDERA_TEST_OPERATOR_KEY ?? '' + const operatorId = props.operatorId ?? process.env.HEDERA_OPERATOR_ID ?? '' + const operatorKey = props.operatorKey ?? process.env.HEDERA_OPERATOR_KEY ?? '' return { networks: [ { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 07574726ff..ca03cd9ac2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,11 +8,6 @@ overrides: '@types/node': 18.18.8 undici: ^6.20.1 -patchedDependencies: - '@2060.io/ffi-napi@4.0.9': - hash: 6ujtm5ladmp54sbez4f5d2uhca - path: patches/@2060.io__ffi-napi@4.0.9.patch - importers: .: @@ -612,25 +607,25 @@ importers: specifier: ^2.66.0 version: 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) '@hiero-did-sdk/anoncreds': - specifier: npm:@hiero-did-sdk/anoncreds@0.0.12 + specifier: 0.0.12 version: 0.0.12(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) '@hiero-did-sdk/client': - specifier: npm:@hiero-did-sdk/client@0.0.5 + specifier: 0.0.5 version: 0.0.5(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) '@hiero-did-sdk/core': - specifier: npm:@hiero-did-sdk/core@0.0.7 + specifier: 0.0.7 version: 0.0.7(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) '@hiero-did-sdk/hcs': - specifier: npm:@hiero-did-sdk/hcs@0.0.16 + specifier: 0.0.16 version: 0.0.16(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) '@hiero-did-sdk/publisher-internal': - specifier: npm:@hiero-did-sdk/publisher-internal@0.0.3 + specifier: 0.0.3 version: 0.0.3(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) '@hiero-did-sdk/registrar': - specifier: npm:@hiero-did-sdk/registrar@0.0.9 + specifier: 0.0.9 version: 0.0.9(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) '@hiero-did-sdk/resolver': - specifier: npm:@hiero-did-sdk/resolver@0.0.11 + specifier: 0.0.11 version: 0.0.11(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) devDependencies: '@credo-ts/node': @@ -709,7 +704,7 @@ importers: dependencies: '@2060.io/ffi-napi': specifier: ^4.0.9 - version: 4.0.9(patch_hash=6ujtm5ladmp54sbez4f5d2uhca) + version: 4.0.9 '@2060.io/ref-napi': specifier: ^3.0.6 version: 3.0.6 @@ -7923,7 +7918,7 @@ packages: snapshots: - '@2060.io/ffi-napi@4.0.9(patch_hash=6ujtm5ladmp54sbez4f5d2uhca)': + '@2060.io/ffi-napi@4.0.9': dependencies: '@2060.io/ref-napi': 3.0.6 debug: 4.4.1 @@ -10250,7 +10245,7 @@ snapshots: '@hyperledger/anoncreds-nodejs@0.3.1': dependencies: - '@2060.io/ffi-napi': 4.0.9(patch_hash=6ujtm5ladmp54sbez4f5d2uhca) + '@2060.io/ffi-napi': 4.0.9 '@2060.io/ref-napi': 3.0.6 '@hyperledger/anoncreds-shared': 0.3.1 ref-array-di: 1.2.2 @@ -10264,7 +10259,7 @@ snapshots: '@hyperledger/indy-vdr-nodejs@0.2.2': dependencies: - '@2060.io/ffi-napi': 4.0.9(patch_hash=6ujtm5ladmp54sbez4f5d2uhca) + '@2060.io/ffi-napi': 4.0.9 '@2060.io/ref-napi': 3.0.6 '@hyperledger/indy-vdr-shared': 0.2.2 '@mapbox/node-pre-gyp': 1.0.11 @@ -10646,7 +10641,7 @@ snapshots: '@openwallet-foundation/askar-nodejs@0.3.2': dependencies: - '@2060.io/ffi-napi': 4.0.9(patch_hash=6ujtm5ladmp54sbez4f5d2uhca) + '@2060.io/ffi-napi': 4.0.9 '@2060.io/ref-napi': 3.0.6 '@openwallet-foundation/askar-shared': 0.3.2 ref-array-di: 1.2.2 From cf2851f4a67170491f46235bf88131ab690226d9 Mon Sep 17 00:00:00 2001 From: "andrey.kononov" Date: Wed, 13 Aug 2025 19:38:46 +0300 Subject: [PATCH 23/89] * Switched usage of @hiero-did-sdk-js to libraries from NPM repository * Fixed errors that occurred after switching libraries * Added unit tests to improve code coverage --- package.json | 3 + packages/hedera/jest.config.ts | 1 + packages/hedera/package.json | 18 +- .../src/anoncreds/HederaAnonCredsRegistry.ts | 12 +- .../hedera/src/dids/HederaDidRegistrar.ts | 5 +- .../hedera/src/ledger/HederaLedgerService.ts | 11 +- .../hedera/src/ledger/cache/CredoCache.ts | 4 +- .../src/ledger/publisher/KmsPublisher.ts | 10 +- .../HederaAnoncredsRegistry.e2e.test.ts | 4 +- .../HederaDidRegistrar.e2e.test.ts | 9 +- .../HederaDidResolver.e2e.test.ts | 2 +- .../{ => integration}/utils/hederaModule.ts | 0 .../tests/{ => integration}/utils/index.ts | 0 .../{ => integration}/utils/testCache.ts | 0 .../utils/testTailsFileService.ts | 0 packages/hedera/tests/tsconfig.json | 3 + .../hedera/tests/unit/credo-cache.test.ts | 99 ++++ .../unit/hedera-anoncres-registry.test.ts | 388 +++++++++++++ .../tests/unit/hedera-did-registrar.test.ts | 261 +++++++++ .../tests/unit/hedera-did-resolver.test.ts | 80 +++ .../tests/unit/hedera-ledger-service.test.ts | 512 ++++++++++++++++++ .../hedera/tests/unit/kms-publisher.test.ts | 132 +++++ packages/hedera/tests/unit/utils.test.ts | 90 +++ pnpm-lock.yaml | 280 ++++------ 24 files changed, 1715 insertions(+), 209 deletions(-) rename packages/hedera/tests/{ => integration}/HederaAnoncredsRegistry.e2e.test.ts (96%) rename packages/hedera/tests/{ => integration}/HederaDidRegistrar.e2e.test.ts (98%) rename packages/hedera/tests/{ => integration}/HederaDidResolver.e2e.test.ts (94%) rename packages/hedera/tests/{ => integration}/utils/hederaModule.ts (100%) rename packages/hedera/tests/{ => integration}/utils/index.ts (100%) rename packages/hedera/tests/{ => integration}/utils/testCache.ts (100%) rename packages/hedera/tests/{ => integration}/utils/testTailsFileService.ts (100%) create mode 100644 packages/hedera/tests/tsconfig.json create mode 100644 packages/hedera/tests/unit/credo-cache.test.ts create mode 100644 packages/hedera/tests/unit/hedera-anoncres-registry.test.ts create mode 100644 packages/hedera/tests/unit/hedera-did-registrar.test.ts create mode 100644 packages/hedera/tests/unit/hedera-did-resolver.test.ts create mode 100644 packages/hedera/tests/unit/hedera-ledger-service.test.ts create mode 100644 packages/hedera/tests/unit/kms-publisher.test.ts create mode 100644 packages/hedera/tests/unit/utils.test.ts diff --git a/package.json b/package.json index 3664eb998e..c063ec7838 100644 --- a/package.json +++ b/package.json @@ -60,6 +60,9 @@ "node": ">=18" }, "pnpm": { + "patchedDependencies": { + "@2060.io/ffi-napi@4.0.9": "patches/@2060.io__ffi-napi@4.0.9.patch" + }, "onlyBuiltDependencies": [ "@2060.io/ffi-napi", "@2060.io/ref-napi", diff --git a/packages/hedera/jest.config.ts b/packages/hedera/jest.config.ts index 95d7a0b737..80d2dc3106 100644 --- a/packages/hedera/jest.config.ts +++ b/packages/hedera/jest.config.ts @@ -8,6 +8,7 @@ const config: Config.InitialOptions = { ...base, testTimeout: 100000, displayName: packageJson.name, + coveragePathIgnorePatterns: ['../tests'], } export default config diff --git a/packages/hedera/package.json b/packages/hedera/package.json index 2a67f9b15c..4cc45380b5 100644 --- a/packages/hedera/package.json +++ b/packages/hedera/package.json @@ -20,6 +20,7 @@ "compile": "tsc -p tsconfig.build.json", "prepublishOnly": "pnpm run build", "test": "jest", + "test:coverage": "jest --coverage", "style:check": "biome check --unsafe", "style:fix": "biome check --write --unsafe" }, @@ -27,17 +28,18 @@ "@hashgraph/sdk": "^2.66.0", "@credo-ts/anoncreds": "workspace:*", "@credo-ts/core": "workspace:*", - "@hiero-did-sdk/anoncreds": "0.0.12", - "@hiero-did-sdk/registrar": "0.0.9", - "@hiero-did-sdk/resolver": "0.0.11", - "@hiero-did-sdk/core": "0.0.7", - "@hiero-did-sdk/client": "0.0.5", - "@hiero-did-sdk/hcs": "0.0.16", - "@hiero-did-sdk/publisher-internal": "0.0.3" + "@hiero-did-sdk/anoncreds": "0.1.0", + "@hiero-did-sdk/client": "0.1.0", + "@hiero-did-sdk/core": "0.1.0", + "@hiero-did-sdk/hcs": "0.1.0", + "@hiero-did-sdk/publisher-internal": "0.1.0", + "@hiero-did-sdk/registrar": "0.1.0", + "@hiero-did-sdk/resolver": "0.1.0" }, "devDependencies": { "@credo-ts/node": "workspace:*", "@hyperledger/anoncreds-nodejs": "^0.3.1", - "rimraf": "^4.4.0" + "rimraf": "^4.4.0", + "zstd-napi": "^0.0.10" } } diff --git a/packages/hedera/src/anoncreds/HederaAnonCredsRegistry.ts b/packages/hedera/src/anoncreds/HederaAnonCredsRegistry.ts index f743749100..cff195cfd5 100644 --- a/packages/hedera/src/anoncreds/HederaAnonCredsRegistry.ts +++ b/packages/hedera/src/anoncreds/HederaAnonCredsRegistry.ts @@ -101,9 +101,7 @@ export class HederaAnonCredsRegistry implements AnonCredsRegistry { credentialDefinitionId: string ): Promise { try { - agentContext.config.logger.trace( - `Resolving credential definition '${credentialDefinitionId}' from Hedera ledger` - ) + agentContext.config.logger.trace(`Resolving credential definition '${credentialDefinitionId}' from Hedera ledger`) const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) return await ledgerService.getCredentialDefinition(agentContext, credentialDefinitionId) } catch (error) { @@ -159,7 +157,7 @@ export class HederaAnonCredsRegistry implements AnonCredsRegistry { ): Promise { try { agentContext.config.logger.trace( - `Resolving revocation registry definition for '${revocationRegistryDefinitionId}' from Hedera ledger` + `Resolving revocation registry definition for '${revocationRegistryDefinitionId}' from Hedera ledger` ) const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) return await ledgerService.getRevocationRegistryDefinition(agentContext, revocationRegistryDefinitionId) @@ -188,7 +186,7 @@ export class HederaAnonCredsRegistry implements AnonCredsRegistry { ): Promise { try { agentContext.config.logger.trace( - `Registering revocation status list for '${options.revocationStatusList.revRegDefId}' on Hedera ledger` + `Registering revocation status list for '${options.revocationStatusList.revRegDefId}' on Hedera ledger` ) const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) return await ledgerService.registerRevocationStatusList(agentContext, options) @@ -220,10 +218,10 @@ export class HederaAnonCredsRegistry implements AnonCredsRegistry { ): Promise { try { agentContext.config.logger.trace( - `Resolving revocation status for for '${revocationRegistryId}' from Hedera ledger` + `Resolving revocation status for for '${revocationRegistryId}' from Hedera ledger` ) const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) - return await ledgerService.getRevocationStatusList(agentContext, revocationRegistryId, timestamp) + return await ledgerService.getRevocationStatusList(agentContext, revocationRegistryId, timestamp * 1000) } catch (error) { agentContext.config.logger.error(`Error retrieving revocation registry status list '${revocationRegistryId}'`, { error, diff --git a/packages/hedera/src/dids/HederaDidRegistrar.ts b/packages/hedera/src/dids/HederaDidRegistrar.ts index 51dccfa751..fdbcbba9ba 100644 --- a/packages/hedera/src/dids/HederaDidRegistrar.ts +++ b/packages/hedera/src/dids/HederaDidRegistrar.ts @@ -123,7 +123,10 @@ export class HederaDidRegistrar implements DidRegistrar { } } - async deactivate(agentContext: AgentContext, options: Omit): Promise { + async deactivate( + agentContext: AgentContext, + options: Omit + ): Promise { const didRepository = agentContext.dependencyManager.resolve(DidRepository) const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) diff --git a/packages/hedera/src/ledger/HederaLedgerService.ts b/packages/hedera/src/ledger/HederaLedgerService.ts index 3f052e9e66..894df1ab96 100644 --- a/packages/hedera/src/ledger/HederaLedgerService.ts +++ b/packages/hedera/src/ledger/HederaLedgerService.ts @@ -25,8 +25,8 @@ import { import { KeyManagementApi } from '@credo-ts/core/src/modules/kms' import { Client } from '@hashgraph/sdk' import { HederaAnoncredsRegistry } from '@hiero-did-sdk/anoncreds' -import { HederaNetwork, HederaClientService } from '@hiero-did-sdk/client' -import {DIDResolution, DID_ROOT_KEY_ID, Service, VerificationMethod, parseDID} from '@hiero-did-sdk/core' +import { HederaClientService, HederaNetwork } from '@hiero-did-sdk/client' +import { DIDResolution, DID_ROOT_KEY_ID, Service, VerificationMethod, parseDID } from '@hiero-did-sdk/core' import { CreateDIDResult, DIDUpdateBuilder, @@ -287,7 +287,12 @@ export class HederaLedgerService { options: RegisterCredentialDefinitionOptions ): Promise { const sdk = this.getHederaAnonCredsSdk(agentContext) - return await sdk.registerCredentialDefinition(options) + return await sdk.registerCredentialDefinition({ + ...options, + options: { + supportRevocation: options.options?.supportRevocation === true ?? false, + }, + }) } async getRevocationRegistryDefinition( diff --git a/packages/hedera/src/ledger/cache/CredoCache.ts b/packages/hedera/src/ledger/cache/CredoCache.ts index df6d59e70d..30a2eb7ea2 100644 --- a/packages/hedera/src/ledger/cache/CredoCache.ts +++ b/packages/hedera/src/ledger/cache/CredoCache.ts @@ -29,11 +29,11 @@ export class CredoCache implements Cache { await this.credoCache.remove(this.agentContext, key) } - cleanup(): Promise { + async clear(): Promise { throw new Error('Method not implemented.') } - cleanupExpired(): Promise { + async cleanupExpired(): Promise { throw new Error('Method not implemented.') } } diff --git a/packages/hedera/src/ledger/publisher/KmsPublisher.ts b/packages/hedera/src/ledger/publisher/KmsPublisher.ts index 58c00f0fdf..f96ce34451 100644 --- a/packages/hedera/src/ledger/publisher/KmsPublisher.ts +++ b/packages/hedera/src/ledger/publisher/KmsPublisher.ts @@ -1,5 +1,5 @@ import { AgentContext, Kms, TypedArrayEncoder } from '@credo-ts/core' -import {KeyManagementApi, KmsJwkPublicOkp} from '@credo-ts/core/src/modules/kms' +import { KeyManagementApi, KmsJwkPublicOkp } from '@credo-ts/core/src/modules/kms' import { Client, PublicKey, Transaction, TransactionReceipt } from '@hashgraph/sdk' import { KeysUtility } from '@hiero-did-sdk/core' import { Publisher as ClientPublisher } from '@hiero-did-sdk/publisher-internal' @@ -11,14 +11,18 @@ export class KmsPublisher extends ClientPublisher { private keyId!: string private submitPublicKey!: PublicKey - constructor(agentContext: AgentContext, client: Client, key: { keyId: string; publicJwk: KmsJwkPublicOkp & { crv: 'Ed25519' } }) { + constructor( + agentContext: AgentContext, + client: Client, + key: { keyId: string; publicJwk: KmsJwkPublicOkp & { crv: 'Ed25519' } } + ) { super(client) this.kms = agentContext.dependencyManager.resolve(Kms.KeyManagementApi) this.keyId = key.keyId this.submitPublicKey = KeysUtility.fromBytes( - Uint8Array.from(TypedArrayEncoder.fromBase64(key.publicJwk.x)) + Uint8Array.from(TypedArrayEncoder.fromBase64(key.publicJwk.x)) ).toPublicKey() } diff --git a/packages/hedera/tests/HederaAnoncredsRegistry.e2e.test.ts b/packages/hedera/tests/integration/HederaAnoncredsRegistry.e2e.test.ts similarity index 96% rename from packages/hedera/tests/HederaAnoncredsRegistry.e2e.test.ts rename to packages/hedera/tests/integration/HederaAnoncredsRegistry.e2e.test.ts index 1f76a0c191..667f1f7e7e 100644 --- a/packages/hedera/tests/HederaAnoncredsRegistry.e2e.test.ts +++ b/packages/hedera/tests/integration/HederaAnoncredsRegistry.e2e.test.ts @@ -1,5 +1,5 @@ import { Agent, ConsoleLogger, LogLevel, utils } from '@credo-ts/core' -import { HederaDidCreateOptions } from '../src/ledger/HederaLedgerService' +import { HederaDidCreateOptions } from '../../src/ledger/HederaLedgerService' import { getHederaAgent, testCache } from './utils' describe('Hedera AnonCreds support', () => { @@ -42,7 +42,7 @@ describe('Hedera AnonCreds support', () => { }) describe('Hedera Anoncreds Registry', () => { - it('Full flow (register and resolve schema, credential definition, revocation registry definition, revocation status list)', async () => { + it('should executes the full workflow (register and resolve schema, credential definition, revocation registry definition, revocation status list)', async () => { // Create the schema const schemaResult = await agent.modules.anoncreds.registerSchema({ schema: { diff --git a/packages/hedera/tests/HederaDidRegistrar.e2e.test.ts b/packages/hedera/tests/integration/HederaDidRegistrar.e2e.test.ts similarity index 98% rename from packages/hedera/tests/HederaDidRegistrar.e2e.test.ts rename to packages/hedera/tests/integration/HederaDidRegistrar.e2e.test.ts index dcca210093..193c796b40 100644 --- a/packages/hedera/tests/HederaDidRegistrar.e2e.test.ts +++ b/packages/hedera/tests/integration/HederaDidRegistrar.e2e.test.ts @@ -7,11 +7,8 @@ import { LogLevel, VerificationMethod, } from '@credo-ts/core' -import { - HederaDidCreateOptions, - HederaDidUpdateOptions, -} from '../src/ledger/HederaLedgerService' -import { getMultibasePublicKey } from '../src/ledger/utils' +import { HederaDidCreateOptions, HederaDidUpdateOptions } from '../../src/ledger/HederaLedgerService' +import { getMultibasePublicKey } from '../../src/ledger/utils' import { getHederaAgent } from './utils' describe('Hedera DID registrar', () => { @@ -390,7 +387,7 @@ describe('Hedera DID registrar', () => { const did = didResult.didState.did! const deactivateResult = await agent.dids.deactivate({ - did + did, }) expect(deactivateResult.didState.didDocument?.id).toEqual(did) diff --git a/packages/hedera/tests/HederaDidResolver.e2e.test.ts b/packages/hedera/tests/integration/HederaDidResolver.e2e.test.ts similarity index 94% rename from packages/hedera/tests/HederaDidResolver.e2e.test.ts rename to packages/hedera/tests/integration/HederaDidResolver.e2e.test.ts index 14f641bf86..c92aa547d7 100644 --- a/packages/hedera/tests/HederaDidResolver.e2e.test.ts +++ b/packages/hedera/tests/integration/HederaDidResolver.e2e.test.ts @@ -1,5 +1,5 @@ import { Agent, ConsoleLogger, JsonTransformer, LogLevel } from '@credo-ts/core' -import { HederaDidCreateOptions } from '../src/ledger/HederaLedgerService' +import { HederaDidCreateOptions } from '../../src/ledger/HederaLedgerService' import { getHederaAgent } from './utils' describe('Hedera DID resolver', () => { diff --git a/packages/hedera/tests/utils/hederaModule.ts b/packages/hedera/tests/integration/utils/hederaModule.ts similarity index 100% rename from packages/hedera/tests/utils/hederaModule.ts rename to packages/hedera/tests/integration/utils/hederaModule.ts diff --git a/packages/hedera/tests/utils/index.ts b/packages/hedera/tests/integration/utils/index.ts similarity index 100% rename from packages/hedera/tests/utils/index.ts rename to packages/hedera/tests/integration/utils/index.ts diff --git a/packages/hedera/tests/utils/testCache.ts b/packages/hedera/tests/integration/utils/testCache.ts similarity index 100% rename from packages/hedera/tests/utils/testCache.ts rename to packages/hedera/tests/integration/utils/testCache.ts diff --git a/packages/hedera/tests/utils/testTailsFileService.ts b/packages/hedera/tests/integration/utils/testTailsFileService.ts similarity index 100% rename from packages/hedera/tests/utils/testTailsFileService.ts rename to packages/hedera/tests/integration/utils/testTailsFileService.ts diff --git a/packages/hedera/tests/tsconfig.json b/packages/hedera/tests/tsconfig.json new file mode 100644 index 0000000000..105334e225 --- /dev/null +++ b/packages/hedera/tests/tsconfig.json @@ -0,0 +1,3 @@ +{ + "extends": "../../../tsconfig.test.json" +} diff --git a/packages/hedera/tests/unit/credo-cache.test.ts b/packages/hedera/tests/unit/credo-cache.test.ts new file mode 100644 index 0000000000..5c43ffe7ab --- /dev/null +++ b/packages/hedera/tests/unit/credo-cache.test.ts @@ -0,0 +1,99 @@ +import { AgentContext, CacheModuleConfig, CredoError } from '@credo-ts/core' +import { CredoCache, ICredoCache } from '../../src/ledger/cache/CredoCache' + +describe('CredoCache', () => { + let mockAgentContext: AgentContext + let mockDependencyManagerResolve: jest.Mock + let mockCredoCache: jest.Mocked + + beforeEach(() => { + mockCredoCache = { + get: jest.fn(), + set: jest.fn(), + remove: jest.fn(), + } + + mockDependencyManagerResolve = jest.fn().mockReturnValue({ cache: mockCredoCache }) + + mockAgentContext = { + dependencyManager: { + resolve: mockDependencyManagerResolve, + }, + } as unknown as AgentContext + }) + + it('should throw CredoError if cache not found in constructor', () => { + mockDependencyManagerResolve.mockReturnValue({ cache: null }) + + expect(() => new CredoCache(mockAgentContext)).toThrowError(CredoError) + }) + + it('should initialize credoCache from dependency manager', () => { + const credoCacheInstance = new CredoCache(mockAgentContext) + expect(mockDependencyManagerResolve).toHaveBeenCalledWith(CacheModuleConfig) + // @ts-ignore + expect(credoCacheInstance.credoCache).toBe(mockCredoCache) + }) + + describe('get', () => { + it('should call credoCache.get with correct parameters and return value', async () => { + const testKey = 'test-key' + const returnedValue = { foo: 'bar' } + mockCredoCache.get.mockResolvedValue(returnedValue) + + const credoCacheInstance = new CredoCache(mockAgentContext) + const result = await credoCacheInstance.get(testKey) + + expect(mockCredoCache.get).toHaveBeenCalledWith(mockAgentContext, testKey) + expect(result).toBe(returnedValue) + }) + + it('should return null if credoCache.get resolves null', async () => { + mockCredoCache.get.mockResolvedValue(null) + + const credoCacheInstance = new CredoCache(mockAgentContext) + const result = await credoCacheInstance.get('missing') + + expect(result).toBeNull() + }) + }) + + describe('set', () => { + it('should call credoCache.set with correct parameters', async () => { + const key = 'key' + const value = { a: 1 } + mockCredoCache.set.mockResolvedValue(undefined) + + const credoCacheInstance = new CredoCache(mockAgentContext) + await credoCacheInstance.set(key, value, 123) + + expect(mockCredoCache.set).toHaveBeenCalledWith(mockAgentContext, key, value) + }) + }) + + describe('remove', () => { + it('should call credoCache.remove with correct parameters', async () => { + const key = 'keyToRemove' + mockCredoCache.remove.mockResolvedValue(undefined) + + const credoCacheInstance = new CredoCache(mockAgentContext) + await credoCacheInstance.remove(key) + + expect(mockCredoCache.remove).toHaveBeenCalledWith(mockAgentContext, key) + }) + }) + + describe('clear', () => { + it('should throw error when called', async () => { + const credoCacheInstance = new CredoCache(mockAgentContext) + await expect(credoCacheInstance.clear()).rejects.toThrowError('Method not implemented.') + }) + }) + + describe('cleanupExpired', () => { + it('should throw error when called', async () => { + const credoCacheInstance = new CredoCache(mockAgentContext) + await expect(credoCacheInstance.cleanupExpired()).rejects.toThrowError('Method not implemented.') + }) + }) +}) diff --git a/packages/hedera/tests/unit/hedera-anoncres-registry.test.ts b/packages/hedera/tests/unit/hedera-anoncres-registry.test.ts new file mode 100644 index 0000000000..49b7dba713 --- /dev/null +++ b/packages/hedera/tests/unit/hedera-anoncres-registry.test.ts @@ -0,0 +1,388 @@ +import { + RegisterSchemaOptions, + RegisterSchemaReturn, + GetSchemaReturn, + RegisterCredentialDefinitionOptions, + RegisterCredentialDefinitionReturn, + GetCredentialDefinitionReturn, + RegisterRevocationRegistryDefinitionOptions, + RegisterRevocationRegistryDefinitionReturn, + GetRevocationRegistryDefinitionReturn, + RegisterRevocationStatusListOptions, + RegisterRevocationStatusListReturn, + GetRevocationStatusListReturn, + RegisterSchemaReturnStateFinished, +} from '@credo-ts/anoncreds' +import {AgentContext} from "@credo-ts/core"; +import {HederaAnonCredsRegistry} from "@credo-ts/hedera"; +import {HederaLedgerService} from "../../src/ledger/HederaLedgerService"; + +const createMockAgentContext = () => ({ + dependencyManager: { + resolve: jest.fn(), + }, + config: { + logger: { + trace: jest.fn(), + debug: jest.fn(), + error: jest.fn(), + }, + }, +}) as unknown as AgentContext + +describe('HederaAnonCredsRegistry', () => { + let service: HederaAnonCredsRegistry + let mockAgentContext: AgentContext + let mockLedgerService: any + + beforeEach(() => { + mockAgentContext = createMockAgentContext() + mockLedgerService = { + registerSchema: jest.fn(), + getSchema: jest.fn(), + registerCredentialDefinition: jest.fn(), + getCredentialDefinition: jest.fn(), + registerRevocationRegistryDefinition: jest.fn(), + getRevocationRegistryDefinition: jest.fn(), + registerRevocationStatusList: jest.fn(), + getRevocationStatusList: jest.fn(), + } + // @ts-ignore + mockAgentContext.dependencyManager.resolve.mockReturnValue(mockLedgerService) + + service = new HederaAnonCredsRegistry() + }) + + describe('registerSchema', () => { + const options: RegisterSchemaOptions = { + schema: { + issuerId: 'did:hedera:123', name: 'schemaName', version: '1.0', + attrNames: [] + }, + options: {}, + } + + it('should call ledgerService.registerSchema and return result on success', async () => { + const expected: RegisterSchemaReturn = { + schemaMetadata: {}, registrationMetadata: {}, + schemaState: { + state: "finished" + } as RegisterSchemaReturnStateFinished + } + mockLedgerService.registerSchema.mockResolvedValue(expected) + + const result = await service.registerSchema(mockAgentContext, options) + + expect(mockAgentContext.config.logger.trace).toHaveBeenCalledWith('Registering schema on Hedera ledger') + expect(mockAgentContext.dependencyManager.resolve).toHaveBeenCalledWith(expect.any(Function) || HederaLedgerService) + expect(mockLedgerService.registerSchema).toHaveBeenCalledWith(mockAgentContext, options) + expect(result).toEqual(expected) + }) + + it('should catch error and return failed state', async () => { + const error = new Error('fail') + mockLedgerService.registerSchema.mockRejectedValue(error) + + const result = await service.registerSchema(mockAgentContext, options) + + expect(mockAgentContext.config.logger.debug).toHaveBeenCalledWith( + `Error registering schema for did '${options.schema.issuerId}'`, + expect.objectContaining({ error, did: options.schema.issuerId, schema: options }) + ) + expect(result.schemaState.state).toBe('failed') + if (result.schemaState.state === 'failed') + expect(result.schemaState.reason).toContain('fail') + }) + }) + + describe('getSchema', () => { + const schemaId = 'schema-id-123' + + it('should call ledgerService.getSchema and return result on success', async () => { + const expected: GetSchemaReturn = { + schemaId: schemaId, + resolutionMetadata: {}, + schemaMetadata: {} + } + mockLedgerService.getSchema.mockResolvedValue(expected) + + const result = await service.getSchema(mockAgentContext, schemaId) + + expect(mockAgentContext.config.logger.trace).toHaveBeenCalledWith(`Resolving schema '${schemaId}' from Hedera ledger`) + expect(mockLedgerService.getSchema).toHaveBeenCalledWith(mockAgentContext, schemaId) + expect(result).toEqual(expected) + }) + + it('should catch error and return notFound error state', async () => { + const error = new Error('not found') + mockLedgerService.getSchema.mockRejectedValue(error) + + const result = await service.getSchema(mockAgentContext, schemaId) + + expect(mockAgentContext.config.logger.error).toHaveBeenCalledWith( + `Error retrieving schema '${schemaId}'`, + expect.objectContaining({ error, schemaId }) + ) + expect(result.resolutionMetadata.error).toBe('notFound') + expect(result.resolutionMetadata.message).toContain('not found') + }) + }) + + describe('registerCredentialDefinition', () => { + const options: RegisterCredentialDefinitionOptions = { + credentialDefinition: { issuerId: 'did:hedera:issuer' } + } as any + + it('should call ledgerService.registerCredentialDefinition and return result on success', async () => { + const expected: RegisterCredentialDefinitionReturn = { + credentialDefinitionMetadata: {}, + registrationMetadata: {}, + credentialDefinitionState: { + state: "finished", + credentialDefinition: { + issuerId: '', + schemaId: '', + type: 'CL', + tag: '', + value: { + primary: {}, + revocation: undefined + } + }, + credentialDefinitionId: "did:hedera:issuerId", + } + } + mockLedgerService.registerCredentialDefinition.mockResolvedValue(expected) + + const result = await service.registerCredentialDefinition(mockAgentContext, options) + + expect(mockAgentContext.config.logger.trace).toHaveBeenCalledWith('Registering credential definition on Hedera ledger') + expect(mockLedgerService.registerCredentialDefinition).toHaveBeenCalledWith(mockAgentContext, options) + expect(result).toEqual(expected) + }) + + it('should catch error and return failed state', async () => { + const error = new Error('fail') + mockLedgerService.registerCredentialDefinition.mockRejectedValue(error) + + const result = await service.registerCredentialDefinition(mockAgentContext, options) + + expect(mockAgentContext.config.logger.error).toHaveBeenCalledWith( + `Error registering credential definition for did '${options.credentialDefinition.issuerId}'`, + expect.objectContaining({ error, did: options.credentialDefinition.issuerId, schema: options }) + ) + expect(result.credentialDefinitionState.state).toBe('failed') + if (result.credentialDefinitionState.state === 'failed') + expect(result.credentialDefinitionState.reason).toContain('fail') + }) + }) + + describe('getCredentialDefinition', () => { + const credentialDefinitionId = 'cred-def-123' + + it('should call ledgerService.getCredentialDefinition and return result on success', async () => { + const expected: GetCredentialDefinitionReturn = { + credentialDefinitionId, + resolutionMetadata: {}, + credentialDefinitionMetadata: {} + } + mockLedgerService.getCredentialDefinition.mockResolvedValue(expected) + + const result = await service.getCredentialDefinition(mockAgentContext, credentialDefinitionId) + + expect(mockAgentContext.config.logger.trace).toHaveBeenCalledWith( + `Resolving credential definition '${credentialDefinitionId}' from Hedera ledger` + ) + expect(mockLedgerService.getCredentialDefinition).toHaveBeenCalledWith(mockAgentContext, credentialDefinitionId) + expect(result).toEqual(expected) + }) + + it('should catch error and return notFound error state', async () => { + const error = new Error('not found') + mockLedgerService.getCredentialDefinition.mockRejectedValue(error) + + const result = await service.getCredentialDefinition(mockAgentContext, credentialDefinitionId) + + expect(mockAgentContext.config.logger.error).toHaveBeenCalledWith( + `Error retrieving credential definition '${credentialDefinitionId}'`, + expect.objectContaining({ error, credentialDefinitionId }) + ) + expect(result.resolutionMetadata.error).toBe('notFound') + expect(result.resolutionMetadata.message).toContain('not found') + }) + }) + + describe('registerRevocationRegistryDefinition', () => { + const options: RegisterRevocationRegistryDefinitionOptions = { + revocationRegistryDefinition: { credDefId: 'credDef1', issuerId: 'did:hedera:issuer' }, + } as any + + it('should call ledgerService.registerRevocationRegistryDefinition and return result on success', async () => { + const expected: RegisterRevocationRegistryDefinitionReturn = { + revocationRegistryDefinitionMetadata: {}, + registrationMetadata: {}, + revocationRegistryDefinitionState: { + state: "finished", + revocationRegistryDefinitionId: 'test', + revocationRegistryDefinition: { + issuerId: '', + revocDefType: 'CL_ACCUM', + credDefId: '', + tag: '', + value: { + publicKeys: { + accumKey: { + z: '' + } + }, + maxCredNum: 0, + tailsLocation: '', + tailsHash: '' + } + } + } + } + mockLedgerService.registerRevocationRegistryDefinition.mockResolvedValue(expected) + + const result = await service.registerRevocationRegistryDefinition(mockAgentContext, options) + + expect(mockAgentContext.config.logger.trace).toHaveBeenCalledWith( + `Registering revocation registry definition for '${options.revocationRegistryDefinition.credDefId}' on Hedera ledger` + ) + expect(mockLedgerService.registerRevocationRegistryDefinition).toHaveBeenCalledWith(mockAgentContext, options) + expect(result).toEqual(expected) + }) + + it('should catch error and return failed state', async () => { + const error = new Error('fail') + mockLedgerService.registerRevocationRegistryDefinition.mockRejectedValue(error) + + const result = await service.registerRevocationRegistryDefinition(mockAgentContext, options) + + expect(mockAgentContext.config.logger.error).toHaveBeenCalledWith( + `Error registering revocation registry definition for did '${options.revocationRegistryDefinition.issuerId}'`, + expect.objectContaining({ error, did: options.revocationRegistryDefinition.issuerId, options }) + ) + expect(result.revocationRegistryDefinitionState.state).toBe('failed') + if (result.revocationRegistryDefinitionState.state === 'failed') + expect(result.revocationRegistryDefinitionState.reason).toContain('fail') + }) + }) + + describe('getRevocationRegistryDefinition', () => { + const revocationRegistryDefinitionId = 'revRegDef123' + + it('should call ledgerService.getRevocationRegistryDefinition and return result on success', async () => { + const expected: GetRevocationRegistryDefinitionReturn = { + revocationRegistryDefinitionId, + resolutionMetadata: {}, + revocationRegistryDefinitionMetadata: {} + } + mockLedgerService.getRevocationRegistryDefinition.mockResolvedValue(expected) + + const result = await service.getRevocationRegistryDefinition(mockAgentContext, revocationRegistryDefinitionId) + + expect(mockAgentContext.config.logger.trace).toHaveBeenCalledWith( + `Resolving revocation registry definition for '${revocationRegistryDefinitionId}' from Hedera ledger` + ) + expect(mockLedgerService.getRevocationRegistryDefinition).toHaveBeenCalledWith(mockAgentContext, revocationRegistryDefinitionId) + expect(result).toEqual(expected) + }) + + it('should catch error and return notFound error state', async () => { + const error = new Error('not found') + mockLedgerService.getRevocationRegistryDefinition.mockRejectedValue(error) + + const result = await service.getRevocationRegistryDefinition(mockAgentContext, revocationRegistryDefinitionId) + + expect(mockAgentContext.config.logger.error).toHaveBeenCalledWith( + `Error retrieving revocation registry definition '${revocationRegistryDefinitionId}'`, + expect.objectContaining({ error, revocationRegistryDefinitionId }) + ) + expect(result.resolutionMetadata.error).toBe('notFound') + expect(result.resolutionMetadata.message).toContain('not found') + }) + }) + + describe('registerRevocationStatusList', () => { + const options: RegisterRevocationStatusListOptions = { + revocationStatusList: { revRegDefId: 'regDef1', issuerId: 'did:hedera:issuer' } + } as any + + it('should call ledgerService.registerRevocationStatusList and return result on success', async () => { + const expected: RegisterRevocationStatusListReturn = { + revocationStatusListMetadata: {}, + registrationMetadata: {}, + revocationStatusListState: { + state: 'finished', + revocationStatusList: { + revRegDefId: '', + issuerId: '', + revocationList: [], + timestamp: 0, + currentAccumulator: '' + } + } + } + mockLedgerService.registerRevocationStatusList.mockResolvedValue(expected) + + const result = await service.registerRevocationStatusList(mockAgentContext, options) + + expect(mockAgentContext.config.logger.trace).toHaveBeenCalledWith( + `Registering revocation status list for '${options.revocationStatusList.revRegDefId}' on Hedera ledger` + ) + expect(mockLedgerService.registerRevocationStatusList).toHaveBeenCalledWith(mockAgentContext, options) + expect(result).toEqual(expected) + }) + + it('should catch error and return failed state', async () => { + const error = new Error('fail') + mockLedgerService.registerRevocationStatusList.mockRejectedValue(error) + + const result = await service.registerRevocationStatusList(mockAgentContext, options) + + expect(mockAgentContext.config.logger.error).toHaveBeenCalledWith( + `Error registering revocation status list for did '${options.revocationStatusList.issuerId}'`, + expect.objectContaining({ error, did: options.revocationStatusList.issuerId, options }) + ) + expect(result.revocationStatusListState.state).toBe('failed') + if (result.revocationStatusListState.state === 'failed') + expect(result.revocationStatusListState.reason).toContain('fail') + }) + }) + + describe('getRevocationStatusList', () => { + const revocationRegistryId = 'revRegId123' + const timestamp = 1234567890 + + it('should call ledgerService.getRevocationStatusList and return result on success', async () => { + const expected: GetRevocationStatusListReturn = { + resolutionMetadata: {}, + revocationStatusListMetadata: {} + } + mockLedgerService.getRevocationStatusList.mockResolvedValue(expected) + + const result = await service.getRevocationStatusList(mockAgentContext, revocationRegistryId, timestamp) + + expect(mockAgentContext.config.logger.trace).toHaveBeenCalledWith( + `Resolving revocation status for for '${revocationRegistryId}' from Hedera ledger` + ) + expect(mockLedgerService.getRevocationStatusList).toHaveBeenCalledWith(mockAgentContext, revocationRegistryId, timestamp * 1000) + expect(result).toEqual(expected) + }) + + it('should catch error and return notFound error state', async () => { + const error = new Error('not found') + mockLedgerService.getRevocationStatusList.mockRejectedValue(error) + + const result = await service.getRevocationStatusList(mockAgentContext, revocationRegistryId, timestamp) + + expect(mockAgentContext.config.logger.error).toHaveBeenCalledWith( + `Error retrieving revocation registry status list '${revocationRegistryId}'`, + expect.objectContaining({ error, revocationRegistryId }) + ) + expect(result.resolutionMetadata.error).toBe('notFound') + expect(result.resolutionMetadata.message).toContain('not found') + }) + }) +}) diff --git a/packages/hedera/tests/unit/hedera-did-registrar.test.ts b/packages/hedera/tests/unit/hedera-did-registrar.test.ts new file mode 100644 index 0000000000..a9a022d910 --- /dev/null +++ b/packages/hedera/tests/unit/hedera-did-registrar.test.ts @@ -0,0 +1,261 @@ +import type { AgentContext, DidDocumentKey } from '@credo-ts/core' +import { DidDocumentRole } from '@credo-ts/core' +import { HederaDidRegistrar } from '@credo-ts/hedera' +import {HederaDidUpdateOptions} from "../../src/ledger/HederaLedgerService"; + +describe('HederaDidRegistrar', () => { + let service: HederaDidRegistrar + let mockAgentContext: any + let mockDidRepository: any + let mockLedgerService: any + + beforeEach(() => { + const mockLogger = { + debug: jest.fn(), + error: jest.fn(), + } + + mockDidRepository = { + save: jest.fn(), + findCreatedDid: jest.fn(), + update: jest.fn(), + } + + mockLedgerService = { + createDid: jest.fn(), + resolveDid: jest.fn(), + updateDid: jest.fn(), + deactivateDid: jest.fn(), + } + + mockAgentContext = { + dependencyManager: { + resolve: jest.fn() + .mockImplementation((obj: any) => { + if (obj.name === 'DidRepository') return mockDidRepository + if (obj.name === 'HederaLedgerService') return mockLedgerService + }), + }, + config: { + logger: mockLogger, + }, + } + + service = new HederaDidRegistrar() + }) + + describe('create', () => { + it('should create DID, save it, and return finished state on success', async () => { + const did = 'did:hedera:123' + const didDocument = { + service: [{ id: 'service1' }, { id: 'service2' }], + } + const rootKey = { kmsKeyId: 'key1', didDocumentRelativeKeyId: 'rootKeyId' } + + mockLedgerService.createDid.mockResolvedValue({ did, didDocument, rootKey }) + + const result = await service.create(mockAgentContext as AgentContext, { + method: 'hedera', + options: {}, + } as any) + + expect(mockDidRepository.save).toHaveBeenCalled() + const savedRecord = mockDidRepository.save.mock.calls[0][1] + expect(savedRecord.did).toBe(did) + expect(savedRecord.role).toBe(DidDocumentRole.Created) + expect(savedRecord.didDocument).toBeInstanceOf(Object) + expect(savedRecord.didDocument.service[0]).toBeInstanceOf(Object) + + expect(result.didState.state).toBe('finished') + expect(result.didState.did).toBe(did) + expect(result.didState.didDocument).toBeInstanceOf(Object) + }) + + it('should handle error and return failed state', async () => { + mockLedgerService.createDid.mockRejectedValue(new Error('Create failed')) + + const result = await service.create(mockAgentContext as AgentContext, { + method: 'hedera', + options: {}, + } as any) + + expect(mockAgentContext.config.logger.debug).toHaveBeenCalledWith('Error creating DID', expect.any(Object)) + + expect(result.didState.state).toBe('failed') + if (result.didState.state === 'failed') + expect(result.didState.reason).toBe('Unable to register Did: Create failed') + }) + }) + + describe('update', () => { + const did = 'did:hedera:123' + + it('should update DID and save record successfully', async () => { + const didDocument = { id: did } + const updatedDidDocument = { id: did, updated: true } + + const foundDidRecord = { + didDocument, + keys: [{ didDocumentRelativeKeyId: 'key1' }], + }; + mockLedgerService.resolveDid.mockResolvedValue({ + didDocument, + didDocumentMetadata: { deactivated: false }, + didResolutionMetadata: {}, + }); + mockDidRepository.findCreatedDid.mockResolvedValue(foundDidRecord); + mockLedgerService.updateDid.mockResolvedValue({ didDocument: updatedDidDocument }); + mockDidRepository.update.mockResolvedValue(undefined); + + const options: HederaDidUpdateOptions = { + did, + didDocumentOperation: 'setDidDocument', + secret: { keys: [{ + didDocumentRelativeKeyId: 'key2', + kmsKeyId: 'some-key' + }] }, + didDocument: {}, + } + + const result = await service.update(mockAgentContext as AgentContext, options) + + expect(mockLedgerService.resolveDid).toHaveBeenCalledWith(mockAgentContext, did) + expect(mockDidRepository.findCreatedDid).toHaveBeenCalledWith(mockAgentContext, did) + + expect(mockLedgerService.updateDid).toHaveBeenCalledWith(mockAgentContext, expect.objectContaining({ + secret: { keys: expect.any(Array) }, + })) + + expect(mockDidRepository.update).toHaveBeenCalledWith(mockAgentContext, foundDidRecord) + + expect(result.didState.state).toBe('finished') + expect(result.didState.did).toBe(did) + expect(result.didState.didDocument).toBeInstanceOf(Object) + }) + + it('should return failed state if DID not found or deactivated', async () => { + mockLedgerService.resolveDid.mockResolvedValue({ didDocument: null, didDocumentMetadata: { deactivated: true } }) + mockDidRepository.findCreatedDid.mockResolvedValue(null) + + const options = { + did, + } as any + + const result = await service.update(mockAgentContext as AgentContext, options) + + expect(result.didState.state).toBe('failed') + if (result.didState.state === 'failed') + expect(result.didState.reason).toBe('Did not found') + }) + + it('should handle error and return failed state', async () => { + mockLedgerService.resolveDid.mockRejectedValue(new Error('Update failed')) + + const options = { + did, + didDocumentOperation: 'setDidDocument', + } as any + + const result = await service.update(mockAgentContext as AgentContext, options) + + expect(mockAgentContext.config.logger.error).toHaveBeenCalledWith('Error update DID', expect.any(Error)) + expect(result.didState.state).toBe('failed') + if (result.didState.state === 'failed') + expect(result.didState.reason).toBe('Unable update DID: Update failed') + }) + }) + + describe('deactivate', () => { + const did = 'did:hedera:123' + + it('should deactivate DID and save updated record successfully', async () => { + const didDocument = { id: did } + const deactivatedDidDocument = { id: did, deactivated: true } + + const foundDidRecord = { + didDocument, + keys: [{ didDocumentRelativeKeyId: 'key1' }], + } + + mockLedgerService.resolveDid.mockResolvedValue({ didDocument, didDocumentMetadata: {} }) + mockDidRepository.findCreatedDid.mockResolvedValue(foundDidRecord) + mockLedgerService.deactivateDid.mockResolvedValue({ didDocument: deactivatedDidDocument }) + mockDidRepository.update.mockResolvedValue(undefined) + + const options = { + did, + } + + const result = await service.deactivate(mockAgentContext as AgentContext, options) + + expect(mockLedgerService.resolveDid).toHaveBeenCalledWith(mockAgentContext, did) + expect(mockDidRepository.findCreatedDid).toHaveBeenCalledWith(mockAgentContext, did) + expect(mockLedgerService.deactivateDid).toHaveBeenCalledWith(mockAgentContext, expect.objectContaining({ + secret: { keys: foundDidRecord.keys }, + })) + expect(mockDidRepository.update).toHaveBeenCalledWith(mockAgentContext, foundDidRecord) + + expect(result.didState.state).toBe('finished') + expect(result.didState.did).toBe(did) + expect(result.didState.didDocument).toBeInstanceOf(Object) + }) + + it('should return failed state if DID not found or deactivated', async () => { + mockLedgerService.resolveDid.mockResolvedValue({ didDocument: null, didDocumentMetadata: { deactivated: true } }) + mockDidRepository.findCreatedDid.mockResolvedValue(null) + + const options = { + did, + } + + const result = await service.deactivate(mockAgentContext as AgentContext, options) + + expect(result.didState.state).toBe('failed') + if (result.didState.state === 'failed') + expect(result.didState.reason).toBe('Did not found') + }) + + it('should handle error and return failed state', async () => { + mockLedgerService.resolveDid.mockRejectedValue(new Error('Deactivate failed')) + + const options = { + did, + } + + const result = await service.deactivate(mockAgentContext as AgentContext, options) + + expect(mockAgentContext.config.logger.error).toHaveBeenCalledWith('Error deactivate DID', expect.any(Error)) + expect(result.didState.state).toBe('failed') + if (result.didState.state === 'failed') + expect(result.didState.reason).toBe('Unable deactivating DID: Deactivate failed') + }) + }) + + describe('concatKeys (private method)', () => { + it('should concatenate keys without duplicates based on relativeKeyId', () => { + const keys1 = [ + { didDocumentRelativeKeyId: 'key1' }, + { didDocumentRelativeKeyId: 'key2' }, + ] as DidDocumentKey[] + + const keys2 = [ + { didDocumentRelativeKeyId: 'key2' }, + { didDocumentRelativeKeyId: 'key3' }, + ] as DidDocumentKey[] + + const result = (service as any).concatKeys(keys1, keys2) + + expect(result).toHaveLength(3) + expect(result).toEqual(expect.arrayContaining([ + { didDocumentRelativeKeyId: 'key1' }, + { didDocumentRelativeKeyId: 'key2' }, + { didDocumentRelativeKeyId: 'key3' }, + ])) + }) + + it('should handle undefined arguments and return empty array', () => { + const result = (service as any).concatKeys(undefined, undefined) + expect(result).toEqual([]) + }) + }) +}) diff --git a/packages/hedera/tests/unit/hedera-did-resolver.test.ts b/packages/hedera/tests/unit/hedera-did-resolver.test.ts new file mode 100644 index 0000000000..0985400da5 --- /dev/null +++ b/packages/hedera/tests/unit/hedera-did-resolver.test.ts @@ -0,0 +1,80 @@ +import { JsonTransformer, DidDocument } from '@credo-ts/core' +import {HederaLedgerService} from "../../src/ledger/HederaLedgerService"; +import { HederaDidResolver } from '@credo-ts/hedera'; + +describe('HederaDidResolver', () => { + let resolver: HederaDidResolver + let mockAgentContext: any + let mockLedgerService: any + + beforeEach(() => { + const mockLogger = { + trace: jest.fn(), + debug: jest.fn(), + } + + mockLedgerService = { + resolveDid: jest.fn(), + } + + mockAgentContext = { + config: { logger: mockLogger }, + dependencyManager: { + resolve: jest.fn().mockReturnValue(mockLedgerService), + }, + } + + resolver = new HederaDidResolver() + }) + + it('should successfully resolve DID', async () => { + const did = 'did:hedera:123' + const fakeDidDocument = { id: did } + const resolveDidResult = { + didDocument: { id: did }, + didDocumentMetadata: { meta: 'meta' }, + didResolutionMetadata: { resMeta: 'resMeta' }, + } + + mockLedgerService.resolveDid.mockResolvedValue(resolveDidResult) + + jest.spyOn(JsonTransformer, 'fromJSON').mockReturnValue(fakeDidDocument as unknown as DidDocument) + + const result = await resolver.resolve(mockAgentContext, did, {} as any, {} as any) + + expect(mockAgentContext.config.logger.trace).toHaveBeenCalledWith('Try to resolve a did document from ledger') + expect(mockAgentContext.dependencyManager.resolve).toHaveBeenCalledWith(HederaLedgerService) + expect(mockLedgerService.resolveDid).toHaveBeenCalledWith(mockAgentContext, did) + expect(JsonTransformer.fromJSON).toHaveBeenCalledWith(resolveDidResult.didDocument, DidDocument) + + expect(result).toEqual({ + didDocument: fakeDidDocument, + didDocumentMetadata: resolveDidResult.didDocumentMetadata, + didResolutionMetadata: resolveDidResult.didResolutionMetadata, + }) + }) + + it('should handle error and return notFound', async () => { + const did = 'did:hedera:bad' + const error = new Error('Some error') + + mockLedgerService.resolveDid.mockRejectedValue(error) + + const result = await resolver.resolve(mockAgentContext, did, {} as any, {} as any) + + expect(mockAgentContext.config.logger.trace).toHaveBeenCalledWith('Try to resolve a did document from ledger') + expect(mockAgentContext.config.logger.debug).toHaveBeenCalledWith('Error resolving the did', { + error, + did, + }) + + expect(result).toEqual({ + didDocument: null, + didDocumentMetadata: {}, + didResolutionMetadata: { + error: 'notFound', + message: `Unable to resolve did '${did}': ${error}`, + }, + }) + }) +}) diff --git a/packages/hedera/tests/unit/hedera-ledger-service.test.ts b/packages/hedera/tests/unit/hedera-ledger-service.test.ts new file mode 100644 index 0000000000..494e6bf5bb --- /dev/null +++ b/packages/hedera/tests/unit/hedera-ledger-service.test.ts @@ -0,0 +1,512 @@ +import { type DidDocument } from '@credo-ts/core' +import { + AgentContext, + DependencyManager, +} from '@credo-ts/core' +import { DidDocumentKey, Kms } from '@credo-ts/core' +import {KmsJwkPublicOkp} from "@credo-ts/core/src/modules/kms"; +import { + RegisterCredentialDefinitionOptions, + RegisterRevocationRegistryDefinitionOptions, + RegisterRevocationStatusListOptions, RegisterSchemaOptions +} from "@credo-ts/anoncreds"; +import {HederaDidCreateOptions, HederaLedgerService} from '../../src/ledger/HederaLedgerService' +import {Client} from "@hashgraph/sdk"; + +jest.mock('@hiero-did-sdk/registrar', () => ({ + DIDUpdateBuilder: jest.fn().mockReturnValue({ + addService: jest.fn().mockReturnThis(), + removeService: jest.fn().mockReturnThis(), + addVerificationMethod: jest.fn().mockReturnThis(), + removeVerificationMethod: jest.fn().mockReturnThis(), + addAssertionMethod: jest.fn().mockReturnThis(), + removeAssertionMethod: jest.fn().mockReturnThis(), + addAuthenticationMethod: jest.fn().mockReturnThis(), + removeAuthenticationMethod: jest.fn().mockReturnThis(), + addCapabilityDelegationMethod: jest.fn().mockReturnThis(), + removeCapabilityDelegationMethod: jest.fn().mockReturnThis(), + addCapabilityInvocationMethod: jest.fn().mockReturnThis(), + removeCapabilityInvocationMethod: jest.fn().mockReturnThis(), + addKeyAgreementMethod: jest.fn().mockReturnThis(), + removeKeyAgreementMethod: jest.fn().mockReturnThis(), + build: jest.fn() + }), + generateCreateDIDRequest: jest.fn(), + submitCreateDIDRequest: jest.fn(), + generateUpdateDIDRequest: jest.fn(), + submitUpdateDIDRequest: jest.fn(), + generateDeactivateDIDRequest: jest.fn(), + submitDeactivateDIDRequest: jest.fn() +})) + +import { + DIDUpdateBuilder, + generateCreateDIDRequest, + generateDeactivateDIDRequest, + generateUpdateDIDRequest, + submitCreateDIDRequest, + submitDeactivateDIDRequest, + submitUpdateDIDRequest, +} from '@hiero-did-sdk/registrar' + +jest.mock('@hiero-did-sdk/resolver', () => ({ + resolveDID: jest.fn(), + TopicReaderHederaHcs: jest.fn() +})) + +import { resolveDID } from '@hiero-did-sdk/resolver' + +jest.mock('@hiero-did-sdk/core', () => ({ + parseDID: jest.fn(), +})) + +import {DID_ROOT_KEY_ID, parseDID, Publisher} from '@hiero-did-sdk/core' + +jest.mock('../../src/ledger/utils') + +import { createOrGetKey } from '../../src/ledger/utils' + +describe('HederaLedgerService', () => { + let service: HederaLedgerService + let mockAgentContext: Partial + let mockKms: jest.Mocked + let mockedCreateOrGetKey: jest.MockedFunction + let mockedParseDID: jest.MockedFunction + let mockedGenerateDeactivateDIDRequest: jest.MockedFunction + let builder: DIDUpdateBuilder + + beforeEach(() => { + jest.clearAllMocks() + + mockedCreateOrGetKey = createOrGetKey as jest.MockedFunction + mockedParseDID = parseDID as jest.MockedFunction + mockedGenerateDeactivateDIDRequest = generateDeactivateDIDRequest as jest.MockedFunction + + builder = new DIDUpdateBuilder() + + mockKms = { + sign: jest.fn(), + } as unknown as jest.Mocked + + mockAgentContext = { + dependencyManager: { + resolve: jest.fn().mockReturnValue(mockKms), + } as unknown as DependencyManager, + } + + const mockCache = { + get: jest.fn().mockResolvedValue(null), + set: jest.fn().mockResolvedValue(undefined), + remove: jest.fn().mockResolvedValue(undefined), + clear: jest.fn(), + cleanupExpired: jest.fn() + } + + service = new HederaLedgerService({ + options: { + networks: [ + { + network: 'testnet', + operatorId: '1', + operatorKey: '2', + }, + ], + cache: mockCache, + }, + }) + + jest.spyOn(service['clientService'], 'withClient').mockImplementation(async (props, operation) => { + const mockClient = {} as Client; + return operation(mockClient); + }); + }) + + describe('resolveDid', () => { + it('should calls resolveDID with proper args and returns result', async () => { + const did = 'did:hedera:test'; + + const mockResolution = { didDocument: { id: did } }; + + (resolveDID as jest.Mock).mockResolvedValue(mockResolution) + + const result = await service.resolveDid(mockAgentContext as AgentContext, did) + + expect(resolveDID).toHaveBeenCalledWith( + did, + 'application/ld+json;profile="https://w3id.org/did-resolution"', + expect.any(Object) + ) + expect(result).toBe(mockResolution) + }) + }) + + describe('createDid', () => { + it('should creates DID without didDocument', async () => { + const keyId = 'key123' + const publicJwk: KmsJwkPublicOkp & { crv: 'Ed25519' } = { crv: 'Ed25519', kty: 'OKP', x: 'abc' } + const props: HederaDidCreateOptions = { + method: 'hedera', + options: { network: 'testnet' }, + secret: { rootKeyId: keyId, keys: [] }, + }; + + mockedCreateOrGetKey.mockResolvedValue({ keyId, publicJwk }); + + (generateCreateDIDRequest as jest.Mock).mockResolvedValue({ state: {}, signingRequest: { serializedPayload: new Uint8Array() } }); + + (submitCreateDIDRequest as jest.Mock).mockResolvedValue({ did: 'did:hedera:1234' }); + + jest.spyOn(service as any, 'getPublisher').mockResolvedValue({} as Publisher) + + mockKms.sign.mockResolvedValue({ signature: new Uint8Array([1, 2, 3]) }); + + const result = await service.createDid(mockAgentContext as AgentContext, props as any) + expect(createOrGetKey).toHaveBeenCalledWith(mockKms, keyId) + expect(generateCreateDIDRequest).toHaveBeenCalled() + expect(submitCreateDIDRequest).toHaveBeenCalled() + expect(result.did).toBe('did:hedera:1234') + expect(result.rootKey).toBeDefined() + }) + + it('should creates DID with didDocument and calls updateDid', async () => { + const keyId = 'key123' + const publicJwk: KmsJwkPublicOkp & { crv: 'Ed25519' } = { crv: 'Ed25519', kty: 'OKP', x: 'abc' } + const didDocument = { controller: 'did:hedera:controller' } + const props = { + method: 'hedera', + options: { network: 'testnet' }, + secret: { rootKeyId: keyId, keys: [] }, + didDocument, + }; + + mockedCreateOrGetKey.mockResolvedValue({ keyId, publicJwk }); + + (generateCreateDIDRequest as jest.Mock).mockResolvedValue({ state: {}, signingRequest: { serializedPayload: new Uint8Array() } }); + + (submitCreateDIDRequest as jest.Mock).mockResolvedValue({ did: 'did:hedera:1234' }); + + const updateDidSpy = jest.spyOn(service, 'updateDid').mockResolvedValue({ did: 'did:hedera:1234', someProp: true } as any); + + jest.spyOn(service as any, 'getPublisher').mockResolvedValue({} as Publisher); + + mockKms.sign.mockResolvedValue({ signature: new Uint8Array([1, 2, 3]) }) + + const result = await service.createDid(mockAgentContext as AgentContext, props as any) + expect(updateDidSpy).toHaveBeenCalled() + expect(result.rootKey).toBeDefined() + }) + }) + + describe('updateDid', () => { + const did = 'did:hedera:1234' + const kmsKeyId = 'key-id' + + it('should throws error if didDocumentOperation is missing', async () => { + await expect(service.updateDid(mockAgentContext as AgentContext, { did } as any)).rejects.toThrow( + 'DidDocumentOperation is required' + ) + }) + + it('should throws error if rootKey missing', async () => { + const keys: DidDocumentKey[] = [] + await expect( + service.updateDid(mockAgentContext as AgentContext, { + did, + didDocumentOperation: 'setDidDocument', + secret: { keys }, + didDocument: {}, + }) + ).rejects.toThrow('The root key not found in the KMS') + }) + + it('should calls correct builder methods for each field and action', () => { + const spies = { + addService: jest.spyOn(builder, 'addService'), + removeService: jest.spyOn(builder, 'removeService'), + addVerificationMethod: jest.spyOn(builder, 'addVerificationMethod'), + removeVerificationMethod: jest.spyOn(builder, 'removeVerificationMethod'), + addAssertionMethod: jest.spyOn(builder, 'addAssertionMethod'), + removeAssertionMethod: jest.spyOn(builder, 'removeAssertionMethod'), + addAuthenticationMethod: jest.spyOn(builder, 'addAuthenticationMethod'), + removeAuthenticationMethod: jest.spyOn(builder, 'removeAuthenticationMethod'), + addCapabilityDelegationMethod: jest.spyOn(builder, 'addCapabilityDelegationMethod'), + removeCapabilityDelegationMethod: jest.spyOn(builder, 'removeCapabilityDelegationMethod'), + addCapabilityInvocationMethod: jest.spyOn(builder, 'addCapabilityInvocationMethod'), + removeCapabilityInvocationMethod: jest.spyOn(builder, 'removeCapabilityInvocationMethod'), + addKeyAgreementMethod: jest.spyOn(builder, 'addKeyAgreementMethod'), + removeKeyAgreementMethod: jest.spyOn(builder, 'removeKeyAgreementMethod'), + } + + const testCases: [string, 'add' | 'remove', string, jest.SpyInstance][] = [ + ['service', 'add', 'service-item', spies.addService], + ['service', 'remove', 'service-id', spies.removeService], + + ['verificationMethod', 'add', 'verificationMethod-item', spies.addVerificationMethod], + ['verificationMethod', 'remove', 'verificationMethod-id', spies.removeVerificationMethod], + + ['assertionMethod', 'add', 'assertionMethod-item', spies.addAssertionMethod], + ['assertionMethod', 'remove', 'assertionMethod-id', spies.removeAssertionMethod], + + ['authentication', 'add', 'authentication-item', spies.addAuthenticationMethod], + ['authentication', 'remove', 'authentication-id', spies.removeAuthenticationMethod], + + ['capabilityDelegation', 'add', 'capabilityDelegation-item', spies.addCapabilityDelegationMethod], + ['capabilityDelegation', 'remove', 'capabilityDelegation-id', spies.removeCapabilityDelegationMethod], + + ['capabilityInvocation', 'add', 'capabilityInvocation-item', spies.addCapabilityInvocationMethod], + ['capabilityInvocation', 'remove', 'capabilityInvocation-id', spies.removeCapabilityInvocationMethod], + + ['keyAgreement', 'add', 'keyAgreement-item', spies.addKeyAgreementMethod], + ['keyAgreement', 'remove', 'keyAgreement-id', spies.removeKeyAgreementMethod], + ] + + for (const [field, action, param, spy] of testCases) { + jest.clearAllMocks() + + const fn = (service as any).getUpdateMethod(builder, field, action) + + const result = fn(param) + + expect(result).toBe(builder) + expect(spy).toHaveBeenCalledTimes(1) + expect(spy).toHaveBeenCalledWith(param) + for (const otherSpy of Object.values(spies)) { + if (otherSpy !== spy) expect(otherSpy).not.toHaveBeenCalled() + } + } + }) + + it('should returns builder unchanged for unknown field', () => { + const unknownField = 'unknownField' + const fn = (service as any).getUpdateMethod(builder, unknownField, 'add') + const result = fn('any param') + expect(result).toBe(builder) + }) + + it('should performs update flow successfully', async () => { + const keys: DidDocumentKey[] = [{ kmsKeyId, didDocumentRelativeKeyId: DID_ROOT_KEY_ID }, { kmsKeyId: 'some-key', didDocumentRelativeKeyId: '#abc' }]; + + const didDocument: Partial = { + verificationMethod: [{ + id: '#abc', + type: 'hedera', + controller: 'test' + }], + } + const currentDidDoc = { verificationMethod: [{ id: '#abc' }] } + const mockDidResolution = { didDocument: currentDidDoc } + + const updatesMock = { build: jest.fn().mockReturnValue(didDocument) } as any + + mockedParseDID.mockReturnValue({ + network: 'testnet', + method: 'hedera', + publicKey: '', + topicId: '' + }); + + (resolveDID as jest.Mock).mockResolvedValue(mockDidResolution); + + jest.spyOn(service as any, 'prepareDidUpdates').mockReturnValue(updatesMock); + + jest.spyOn(service as any, 'getPublisher').mockResolvedValue({} as Publisher); + + (generateUpdateDIDRequest as jest.Mock).mockResolvedValue({ states: {}, signingRequests: {} }); + + jest.spyOn(service as any, 'signRequests').mockResolvedValue(Promise.resolve()); + + (submitUpdateDIDRequest as jest.Mock).mockResolvedValue({ did: did }) + + await expect( + service.updateDid(mockAgentContext as AgentContext, { + did, + didDocumentOperation: 'setDidDocument', + didDocument, + secret: { keys }, + }) + ).resolves.toHaveProperty('did', did) + + expect((service as any).prepareDidUpdates).toHaveBeenCalled() + expect(generateUpdateDIDRequest).toHaveBeenCalled() + expect(submitUpdateDIDRequest).toHaveBeenCalled() + }) + }) + + describe('deactivateDid', () => { + const did = 'did:hedera:5678' + const kmsKeyId = 'key-id' + + it('should throws error if rootKey is missing', async () => { + await expect( + service.deactivateDid(mockAgentContext as AgentContext, { did, secret: { keys: [] } } as any) + ).rejects.toThrow('The root key not found in the KMS') + }) + + it('should throws an error if root key is not found in deactivateDid', async () => { + const props = { + did: 'did:hedera:123', + secret: { + keys: [], + }, + } + + // @ts-ignore + mockAgentContext.dependencyManager.resolve.mockReturnValue({ sign: jest.fn() }) + + await expect(service.deactivateDid(mockAgentContext as AgentContext, props)) + .rejects.toThrow('The root key not found in the KMS') + }) + + it('should deactivates DID successfully', async () => { + const keys: DidDocumentKey[] = [{ kmsKeyId, didDocumentRelativeKeyId: DID_ROOT_KEY_ID }] + const mockPublisher = {} + const mockState = {} + const mockSigningRequest = { serializedPayload: new Uint8Array() } + const signature = new Uint8Array([1, 2, 3]); + + (parseDID as jest.Mock).mockReturnValue({ network: 'testnet' }); + + jest.spyOn(service as any, 'getPublisher').mockResolvedValue(mockPublisher) + + // @ts-ignore + mockedGenerateDeactivateDIDRequest.mockResolvedValue({ state: mockState, signingRequest: mockSigningRequest }); + + mockKms.sign.mockResolvedValue({ signature }); + + (submitDeactivateDIDRequest as jest.Mock).mockResolvedValue({ did }) + + const result = await service.deactivateDid( + mockAgentContext as AgentContext, + { + did, + secret: { keys }, + } as any + ) + + expect(result).toHaveProperty('did', did) + expect(mockKms.sign).toHaveBeenCalledWith({ + keyId: kmsKeyId, + data: mockSigningRequest.serializedPayload, + algorithm: 'EdDSA', + }) + }) + }) + + describe('Anoncreds SDK methods', () => { + let mockSdk: any + + beforeEach(() => { + mockSdk = { + getSchema: jest.fn().mockResolvedValue('schema'), + registerSchema: jest.fn().mockResolvedValue('registerSchema'), + getCredentialDefinition: jest.fn().mockResolvedValue('credDef'), + registerCredentialDefinition: jest.fn().mockResolvedValue('registerCredDef'), + getRevocationRegistryDefinition: jest.fn().mockResolvedValue('revRegDef'), + registerRevocationRegistryDefinition: jest.fn().mockResolvedValue('registerRevRegDef'), + getRevocationStatusList: jest.fn().mockResolvedValue('revStatusList'), + registerRevocationStatusList: jest.fn().mockResolvedValue('registerRevStatus'), + } + jest.spyOn(service as any, 'getHederaAnonCredsSdk').mockReturnValue(mockSdk) + }) + + it('getSchema', async () => { + const result = await service.getSchema(mockAgentContext as AgentContext, 'schemaId') + expect(mockSdk.getSchema).toHaveBeenCalledWith('schemaId') + expect(result).toBe('schema') + }) + + it('registerSchema', async () => { + const options: RegisterSchemaOptions = { + schema: { + issuerId: '', + name: '', + version: '', + attrNames: [] + }, + options: {} + } + const result = await service.registerSchema(mockAgentContext as AgentContext, options) + expect(mockSdk.registerSchema).toHaveBeenCalledWith(options) + expect(result).toBe('registerSchema') + }) + + it('getCredentialDefinition', async () => { + const result = await service.getCredentialDefinition(mockAgentContext as AgentContext, 'credDefId') + expect(mockSdk.getCredentialDefinition).toHaveBeenCalledWith('credDefId') + expect(result).toBe('credDef') + }) + + it('registerCredentialDefinition', async () => { + const options: RegisterCredentialDefinitionOptions = { + options: {supportRevocation: true}, + credentialDefinition: { + issuerId: '', + schemaId: '', + type: 'CL', + tag: '', + value: { + primary: {}, + revocation: undefined + } + } + } + await service.registerCredentialDefinition(mockAgentContext as AgentContext, options) + expect(mockSdk.registerCredentialDefinition).toHaveBeenCalledWith({ + ...options, + options: { supportRevocation: true }, + }) + }) + + it('getRevocationRegistryDefinition', async () => { + const result = await service.getRevocationRegistryDefinition(mockAgentContext as AgentContext, 'revRegDefId') + expect(mockSdk.getRevocationRegistryDefinition).toHaveBeenCalledWith('revRegDefId') + expect(result).toBe('revRegDef') + }) + + it('registerRevocationRegistryDefinition', async () => { + const options: RegisterRevocationRegistryDefinitionOptions = { + revocationRegistryDefinition: { + issuerId: '', + revocDefType: 'CL_ACCUM', + credDefId: '', + tag: '', + value: { + publicKeys: { + accumKey: { + z: '' + } + }, + maxCredNum: 0, + tailsLocation: '', + tailsHash: '' + } + }, + options: {} + } + const result = await service.registerRevocationRegistryDefinition(mockAgentContext as AgentContext, options) + expect(mockSdk.registerRevocationRegistryDefinition).toHaveBeenCalledWith(options) + expect(result).toBe('registerRevRegDef') + }) + + it('getRevocationStatusList', async () => { + const result = await service.getRevocationStatusList(mockAgentContext as AgentContext, 'revRegId', 12345) + expect(mockSdk.getRevocationStatusList).toHaveBeenCalledWith('revRegId', 12345) + expect(result).toBe('revStatusList') + }) + + it('registerRevocationStatusList', async () => { + const options: RegisterRevocationStatusListOptions = { + options: {}, + revocationStatusList: { + revRegDefId: '', + issuerId: '', + revocationList: [], + currentAccumulator: '' + } + } + const result = await service.registerRevocationStatusList(mockAgentContext as AgentContext, options) + expect(mockSdk.registerRevocationStatusList).toHaveBeenCalledWith(options) + expect(result).toBe('registerRevStatus') + }) + }) +}) diff --git a/packages/hedera/tests/unit/kms-publisher.test.ts b/packages/hedera/tests/unit/kms-publisher.test.ts new file mode 100644 index 0000000000..1a6f44d2d6 --- /dev/null +++ b/packages/hedera/tests/unit/kms-publisher.test.ts @@ -0,0 +1,132 @@ +import { KeysUtility } from '@hiero-did-sdk/core' +import { Kms, TypedArrayEncoder} from '@credo-ts/core' +import { KmsPublisher } from "../../src/ledger/publisher/KmsPublisher"; +import { KmsJwkPublicOkp} from "@credo-ts/core/src/modules/kms"; + +jest.mock('@hiero-did-sdk/core', () => ({ + KeysUtility: { + fromBytes: jest.fn(), + }, + DIDError: class DIDError extends Error {} + +})) + +jest.mock('@credo-ts/core', () => ({ + TypedArrayEncoder: { + fromBase64: jest.fn(), + }, + Kms: { + KeyManagementApi: jest.fn().mockImplementation(() => ({})), + }, +})) + +jest.mock('../../src/ledger/utils', () => ({ + createOrGetKey: jest.fn(), +})) + +import {createOrGetKey} from "../../src/ledger/utils"; + +jest.mock('@hiero-did-sdk/publisher-internal', () => { + return { + Publisher: jest.fn(), + } +}); + +describe('KmsPublisher', () => { + const mockClient = { + freezeWith: jest.fn(), + signWith: jest.fn(), + execute: jest.fn(), + operator: { + accountId: '0.0.1234', + publicKey: {} + }, + } + + const mockFrozenTransaction = { + signWith: jest.fn(), + } + + const mockResponse = { + getReceipt: jest.fn(), + } + + const signMock = jest.fn().mockResolvedValue({ signature: 'signature-bytes' }) + + const kmsMock = { + sign: signMock + } + + const agentContext = { + dependencyManager: { + resolve: jest.fn().mockImplementation((key) => { + if (key === Kms.KeyManagementApi) { + return kmsMock + } + throw new Error(`Unexpected dependency: ${key}`) + }) + } + } + + const keyId = 'test-key-id' + const base64X = 'base64-x' + const publicJwk: KmsJwkPublicOkp & { crv: 'Ed25519' } = { x: base64X, crv: 'Ed25519', kty: 'OKP' } + const key: { keyId: string; publicJwk: KmsJwkPublicOkp & { crv: 'Ed25519' } } = { keyId, publicJwk } + + const mockPublicKey = { + toPublicKey: jest.fn(), + } + + const fakePublicKey = {} + + beforeEach(() => { + jest.clearAllMocks() + + ;(TypedArrayEncoder.fromBase64 as jest.Mock).mockReturnValue(new Uint8Array([1, 2, 3])) + + ;(KeysUtility.fromBytes as jest.Mock).mockReturnValue(mockPublicKey) + mockPublicKey.toPublicKey.mockReturnValue(fakePublicKey) + + mockClient.freezeWith.mockReturnValue(mockFrozenTransaction) + + mockFrozenTransaction.signWith.mockImplementation(async (_publicKey, signCallback) => { + const signature = await signCallback(new Uint8Array([4, 5, 6])) + expect(signature).toBe('signature-bytes') + return + }) + + mockClient.execute.mockResolvedValue(mockResponse) + + mockResponse.getReceipt.mockResolvedValue('receipt-object') + }) + + it('should correctly create an instance via constructor', () => { + const publisher = new KmsPublisher(agentContext as any, mockClient as any, key) + expect(agentContext.dependencyManager.resolve).toHaveBeenCalledWith(expect.anything()) + expect(publisher.publicKey()).toBe(fakePublicKey) + }) + + it('should correctly update key in setKeyId', async () => { + (createOrGetKey as jest.Mock).mockResolvedValue({ + publicJwk: { x: base64X, crv: 'Ed25519' }, + }) + + const publisher = new KmsPublisher(agentContext as any, mockClient as any, key) + await publisher.setKeyId('new-key-id') + + expect(createOrGetKey).toHaveBeenCalledWith(kmsMock, 'new-key-id') + expect(KeysUtility.fromBytes).toHaveBeenCalledTimes(2) + }) + + it('should return correct publicKey', () => { + const publisher = new KmsPublisher(agentContext as any, mockClient as any, key) + expect(publisher.publicKey()).toBe(fakePublicKey) + }) + + it('should throw error in publish if key is not set', async () => { + const publisher = new KmsPublisher(agentContext as any, mockClient as any, key) + ;(publisher as any).submitPublicKey = undefined + + await expect(publisher.publish({} as any)).rejects.toThrow('Need to setup the KeyId') + }) +}) diff --git a/packages/hedera/tests/unit/utils.test.ts b/packages/hedera/tests/unit/utils.test.ts new file mode 100644 index 0000000000..9ef6c20c6e --- /dev/null +++ b/packages/hedera/tests/unit/utils.test.ts @@ -0,0 +1,90 @@ +import { Kms } from '@credo-ts/core' +import type { KeyManagementApi, KmsJwkPublicOkp, KmsJwkPublicRsa } from '@credo-ts/core/src/modules/kms' +import { createOrGetKey, getMultibasePublicKey } from '../../src/ledger/utils' + +describe('getMultibasePublicKey', () => { + it('should return a base58 key string prefixed with "z"', () => { + const base64X = 'dGVzdGtleQ==' // base64 for 'testkey' + const publicJwk = { + crv: 'Ed25519', + x: base64X, + } + // Expect base64 'dGVzdGtleQ==' to be decoded into Uint8Array + // and then encoded into base58 string starting with 'z' + const multibaseKey = getMultibasePublicKey(publicJwk as KmsJwkPublicOkp & { crv: 'Ed25519' }) + expect(multibaseKey.startsWith('z')).toBe(true) + expect(typeof multibaseKey).toBe('string') + }) +}) + +describe('createOrGetKey', () => { + let kmsMock: jest.Mocked + + beforeEach(() => { + kmsMock = { + createKey: jest.fn(), + getPublicKey: jest.fn(), + } as unknown as jest.Mocked + }) + + it('should creates a key if keyId is not provided', async () => { + const fakeKeyId = 'key123' + const fakeJwk: KmsJwkPublicOkp & { kid: string } = { kty: 'OKP', crv: 'Ed25519', x: 'xxx', kid: 'key123' } + kmsMock.createKey.mockResolvedValue({ + keyId: fakeKeyId, + publicJwk: fakeJwk, + }) + + const result = await createOrGetKey(kmsMock, undefined) + // Check that createKey was called with correct parameters + expect(kmsMock.createKey).toHaveBeenCalledWith({ type: { crv: 'Ed25519', kty: 'OKP' } }) + // Check the returned result matches the mocked createKey response + expect(result).toEqual({ + keyId: fakeKeyId, + publicJwk: fakeJwk, + }) + }) + + it('should retrieves an existing key if keyId is provided', async () => { + const keyId = 'key456' + const publicJwk: KmsJwkPublicOkp & { kid: string } = { kty: 'OKP', crv: 'Ed25519', x: 'xxx', kid: 'key123' } + kmsMock.getPublicKey.mockResolvedValue(publicJwk) + + const result = await createOrGetKey(kmsMock, keyId) + // Check that getPublicKey was called with the given keyId + expect(kmsMock.getPublicKey).toHaveBeenCalledWith({ keyId }) + // Check the returned keyId and publicJwk match the mocked response + expect(result).toEqual({ + keyId, + publicJwk: { + ...publicJwk, + crv: publicJwk.crv, + }, + }) + }) + + it('should throws an error if key with given keyId is not found', async () => { + // @ts-ignore + kmsMock.getPublicKey.mockResolvedValue(null) + + // Expect the function to throw an error for missing key + await expect(createOrGetKey(kmsMock, 'notfound')).rejects.toThrowError("Key with key id 'notfound' not found") + }) + + it('should throws an error if key has unsupported kty or crv', async () => { + const keyId = 'badkey' + const badJwk: KmsJwkPublicRsa & { kid: string } = { e: '', kid: 'key-1', n: '', kty: 'RSA' } + + kmsMock.getPublicKey.mockResolvedValue(badJwk) + + // Mock Kms.getJwkHumanDescription to control error message output + const spyDesc = jest.spyOn(Kms, 'getJwkHumanDescription').mockReturnValue('unsupported key type') + + // Expect an error indicating unsupported key type or curve + await expect(createOrGetKey(kmsMock, keyId)).rejects.toThrow( + `Key with key id '${keyId}' uses unsupported unsupported key type for did:hedera` + ) + + spyDesc.mockRestore() + }) +}) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ca03cd9ac2..d9f8013ba7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,6 +8,11 @@ overrides: '@types/node': 18.18.8 undici: ^6.20.1 +patchedDependencies: + '@2060.io/ffi-napi@4.0.9': + hash: 6ujtm5ladmp54sbez4f5d2uhca + path: patches/@2060.io__ffi-napi@4.0.9.patch + importers: .: @@ -607,26 +612,26 @@ importers: specifier: ^2.66.0 version: 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) '@hiero-did-sdk/anoncreds': - specifier: 0.0.12 - version: 0.0.12(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) + specifier: 0.1.0 + version: 0.1.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) '@hiero-did-sdk/client': - specifier: 0.0.5 - version: 0.0.5(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + specifier: 0.1.0 + version: 0.1.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) '@hiero-did-sdk/core': - specifier: 0.0.7 - version: 0.0.7(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + specifier: 0.1.0 + version: 0.1.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) '@hiero-did-sdk/hcs': - specifier: 0.0.16 - version: 0.0.16(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) + specifier: 0.1.0 + version: 0.1.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) '@hiero-did-sdk/publisher-internal': - specifier: 0.0.3 - version: 0.0.3(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + specifier: 0.1.0 + version: 0.1.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) '@hiero-did-sdk/registrar': - specifier: 0.0.9 - version: 0.0.9(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) + specifier: 0.1.0 + version: 0.1.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) '@hiero-did-sdk/resolver': - specifier: 0.0.11 - version: 0.0.11(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) + specifier: 0.1.0 + version: 0.1.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) devDependencies: '@credo-ts/node': specifier: workspace:* @@ -637,6 +642,9 @@ importers: rimraf: specifier: ^4.4.0 version: 4.4.1 + zstd-napi: + specifier: ^0.0.10 + version: 0.0.10 packages/indy-sdk-to-askar-migration: dependencies: @@ -704,7 +712,7 @@ importers: dependencies: '@2060.io/ffi-napi': specifier: ^4.0.9 - version: 4.0.9 + version: 4.0.9(patch_hash=6ujtm5ladmp54sbez4f5d2uhca) '@2060.io/ref-napi': specifier: ^3.0.6 version: 3.0.6 @@ -1986,9 +1994,6 @@ packages: '@cosmjs/utils@0.33.1': resolution: {integrity: sha512-UnLHDY6KMmC+UXf3Ufyh+onE19xzEXjT4VZ504Acmk4PXxqyvG4cCPprlKUFnGUX7f0z8Or9MAOHXBx41uHBcg==} - '@craftzdog/react-native-buffer@6.1.0': - resolution: {integrity: sha512-lJXdjZ7fTllLbzDrwg/FrJLjQ5sBcAgwcqgAB6OPpXTHdCenEhHZblQpfmBLLe7/S7m0yKXL3kN3jpwOEkpjGg==} - '@cspotcode/source-map-support@0.8.1': resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} @@ -2394,55 +2399,61 @@ packages: peerDependencies: bn.js: ^5.2.1 - '@hiero-did-sdk/anoncreds@0.0.12': - resolution: {integrity: sha1-LQ/oQqY+SuCDVhvkOC7/wTOt6tc=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/anoncreds/-/@hiero-did-sdk/anoncreds-0.0.12.tgz} + '@hiero-did-sdk/anoncreds@0.1.0': + resolution: {integrity: sha512-9+DPsjICXUiQrM5+kSDvV9DMSGfuh/xyo21kFBe8Tm9f7khbCz9tPLRKIiK9OfanZB0hWG6htBS+cwCb7SrLDw==} + engines: {node: '>=20'} - '@hiero-did-sdk/cache@0.0.4': - resolution: {integrity: sha1-TzZZdokp18doe76X2PZ6+P/NysQ=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/cache/-/@hiero-did-sdk/cache-0.0.4.tgz} + '@hiero-did-sdk/cache@0.1.0': + resolution: {integrity: sha512-JK58CiMDoezher6exIMAO+YKFi4mFwRdY6PD1RCB36+A8OAkOk1Od3qUKm27rv4pXEh16lY/DKB/xse8b009iQ==} + engines: {node: '>=20'} - '@hiero-did-sdk/client@0.0.5': - resolution: {integrity: sha1-V44WHtnGFC9h+6RBsIhlqxhFOZ4=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/client/-/@hiero-did-sdk/client-0.0.5.tgz} + '@hiero-did-sdk/client@0.1.0': + resolution: {integrity: sha512-8EBsjVxxEZEdQKePenBCo1HXKRK/70p/XRgFPzWIplUE+2jbmfy7NGqx8tzihK0NlXpA17ojp4Pu5wZJONolmA==} + engines: {node: '>=20'} - '@hiero-did-sdk/core@0.0.7': - resolution: {integrity: sha1-y9F/uQDwxSEj9sFAwx2d/OP1gSY=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/core/-/@hiero-did-sdk/core-0.0.7.tgz} + '@hiero-did-sdk/core@0.1.0': + resolution: {integrity: sha512-qbV74xqRQBnTMpm7MGlEcqBHbiHD0+QagU698ZXKB/X3dz1Mf8kvmoZdaPPS+bIq7S6nJqf6u9xd+L0OKLgzbg==} engines: {node: '>=20'} - '@hiero-did-sdk/crypto@0.0.4': - resolution: {integrity: sha1-MIH9v7vfEeoP8CzCTRnhPa8wJjE=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/crypto/-/@hiero-did-sdk/crypto-0.0.4.tgz} + '@hiero-did-sdk/crypto@0.1.0': + resolution: {integrity: sha512-5wGuufZpcaDf3XYmX0CrCtGA9F9Zkitj+DjGVebVEJEOr9CiZeWWoJ/rS1zxOBPNWyZH3aWKG9vUqJ8RyOXiPg==} + engines: {node: '>=20'} - '@hiero-did-sdk/hcs@0.0.16': - resolution: {integrity: sha1-gSuhiRLyIlK8BvHOYlw83UBfTMY=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/hcs/-/@hiero-did-sdk/hcs-0.0.16.tgz} + '@hiero-did-sdk/hcs@0.1.0': + resolution: {integrity: sha512-Eb5pUrdXHcqNISN3kDZiQCFRKcMhrSyyuSMRrD1mYvUG2OGi5nleaUoR6xK2u0G/jJ8hrgytXuYONTim/6wJ+Q==} + engines: {node: '>=20'} - '@hiero-did-sdk/lifecycle@0.0.3': - resolution: {integrity: sha1-mFQM8PfroBFftvHMpylYUILmVJ0=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/lifecycle/-/@hiero-did-sdk/lifecycle-0.0.3.tgz} + '@hiero-did-sdk/lifecycle@0.1.0': + resolution: {integrity: sha512-j+pIqGFz7TVYZYM8R4FFHT+y859X5UPC7ZGLY7fDtEwsRGRlU6DllhO3octh4qyoJ9BkCJyU8omZjAKeq/WW4g==} engines: {node: '>=20'} - '@hiero-did-sdk/messages@0.0.3': - resolution: {integrity: sha1-ZJjbZE4sHpGa/fdYm4oepnk4j2E=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/messages/-/@hiero-did-sdk/messages-0.0.3.tgz} + '@hiero-did-sdk/messages@0.1.0': + resolution: {integrity: sha512-j5GRYzJc+Fp2/ILhOCsE62dJwK9efqCu8YbzIVR3o7hGx7HzAC1fbM73myQqBTrcpxQJkRktV8lCeEKK9nOYGw==} engines: {node: '>=20'} - '@hiero-did-sdk/publisher-internal@0.0.3': - resolution: {integrity: sha1-tPoQUe7qhjr5fN4e7rM7qcVK9bw=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/publisher-internal/-/@hiero-did-sdk/publisher-internal-0.0.3.tgz} + '@hiero-did-sdk/publisher-internal@0.1.0': + resolution: {integrity: sha512-lMBeltfo+NPqVik148h5VWwLrvDiXVYTJyKkaev9/JatTZlJELdYhtvWyBPPSvCikDFf8Td1QGe3wq/Jm4kbOA==} engines: {node: '>=20'} - '@hiero-did-sdk/registrar@0.0.9': - resolution: {integrity: sha1-ageDo6jfMlCFVaLoVRrJRadQGlE=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/registrar/-/@hiero-did-sdk/registrar-0.0.9.tgz} + '@hiero-did-sdk/registrar@0.1.0': + resolution: {integrity: sha512-zpRxQy24R+ZYxX6N4+VVxZwanxEfkCkcbzDncp8q4q/7Tru5bkAs+WghljiQS0CZPvSwP0iv21SsDEWjDtkKBw==} engines: {node: '>=20'} - '@hiero-did-sdk/resolver@0.0.11': - resolution: {integrity: sha1-6Tmi8PZIWy7NKCpIahJIig63SiI=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/resolver/-/@hiero-did-sdk/resolver-0.0.11.tgz} + '@hiero-did-sdk/resolver@0.1.0': + resolution: {integrity: sha512-/SVglErskv8qhBrcvgxHEgv6t1vwX0eJ3Q90QSTqhmnNIZCtjoI9yP/bo7MONBwsowY2DUCF18s5vT2/k2V3gQ==} engines: {node: '>=20'} - '@hiero-did-sdk/signer-internal@0.0.6': - resolution: {integrity: sha1-pgohdAEpmBvuvR+hvtPFqIoK1Yc=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/signer-internal/-/@hiero-did-sdk/signer-internal-0.0.6.tgz} + '@hiero-did-sdk/signer-internal@0.1.0': + resolution: {integrity: sha512-Z55sq1ExxtWZHzZcydQS4eg5G8w+nWx5uMQwAZrS92m6s9G1kg4z90tM321NQca6d9kFIjp59NYQA1inhxLf1w==} engines: {node: '>=20'} - '@hiero-did-sdk/verifier-internal@0.0.3': - resolution: {integrity: sha1-HLZK03ispkAwwQXLWakImaYbvNQ=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/verifier-internal/-/@hiero-did-sdk/verifier-internal-0.0.3.tgz} + '@hiero-did-sdk/verifier-internal@0.1.0': + resolution: {integrity: sha512-AyJz0HqbFO/mtY0t5Fpx7LBrRG5fI8tR5b0LVjhnDsvfCt3hOeLOoqnbv28x7Kljsyz+2ZJG3IPoawF5To5NGA==} engines: {node: '>=20'} - '@hiero-did-sdk/zstd@0.0.4': - resolution: {integrity: sha1-yJMI8dyfabe1xkjNdivcRmus9gE=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/zstd/-/@hiero-did-sdk/zstd-0.0.4.tgz} + '@hiero-did-sdk/zstd@0.1.0': + resolution: {integrity: sha512-Y5jNDMOR268rZJBgTdwg5KjZeXijYjfCdu55P5jhzWXkO3lKHdd5jJR46DLFWse+/WaS9Ev8pz2uX+bHium8tQ==} + engines: {node: '>=20'} '@hyperledger/anoncreds-nodejs@0.3.1': resolution: {integrity: sha512-/oWmWgcOPqjAtd2+dKASPYL84Qd7sAFyCBfEKM7PAgVbObaZUZc0kqA7hkEz/qyiqUvcP/JwKTc1v4zVZi6BTg==} @@ -3995,10 +4006,6 @@ packages: resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} engines: {node: '>=8'} - crypto@1.0.1: - resolution: {integrity: sha512-VxBKmeNcqQdiUQUW2Tzq0t377b54N2bMtXO/qiLa+6eRRmmC4qT3D4OnTGoT/U6O9aklQ/jTwbOtRMTTY8G0Ig==} - deprecated: This package is no longer supported. It's now a built-in Node module. If you've depended on crypto, you should switch to the one that's built-in. - d@1.0.2: resolution: {integrity: sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==} engines: {node: '>=0.12'} @@ -4992,10 +4999,6 @@ packages: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} - is-arguments@1.2.0: - resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==} - engines: {node: '>= 0.4'} - is-array-buffer@3.0.5: resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} engines: {node: '>= 0.4'} @@ -5853,6 +5856,7 @@ packages: metro-react-native-babel-preset@0.73.10: resolution: {integrity: sha512-1/dnH4EHwFb2RKEKx34vVDpUS3urt2WEeR8FYim+ogqALg4sTpG7yeQPxWpbgKATezt4rNfqAANpIyH19MS4BQ==} + deprecated: Use @react-native/babel-preset instead peerDependencies: '@babel/core': '*' @@ -6670,26 +6674,11 @@ packages: peerDependencies: react-native: '>=0.56' - react-native-quick-base64@2.2.0: - resolution: {integrity: sha512-r7/BRsRl8QKEhS0JsHW6QX9+8LrC6NNWlwNnBnZ69h2kbcfABYsUILT71obrs9fqElEIMzuYSI5aHID955akyQ==} - peerDependencies: - react: '*' - react-native: '*' - - react-native-quick-crypto@0.7.14: - resolution: {integrity: sha512-ePl0pNgw0TCl9sn9zVX6es58PHXIA6pdDm5+dHawypD+cacyvzfpAFEqYR6opFtnBff/HHtsQrS0zX0AAfwodQ==} - react-native-securerandom@0.1.1: resolution: {integrity: sha512-CozcCx0lpBLevxiXEb86kwLRalBCHNjiGPlw3P7Fi27U6ZLdfjOCNRHD1LtBKcvPvI3TvkBXB3GOtLvqaYJLGw==} peerDependencies: react-native: '*' - react-native-zstd@1.1.0: - resolution: {integrity: sha512-x/PBfWpUOfzP8oBVMj8SwjKJdYYhRx7LGh65A9kkrK1FprJlWWEt8MX8hZFgYfIkuRx1n4yRpeHEA+KM9PHtlQ==} - peerDependencies: - react: '*' - react-native: '*' - react-native@0.78.2: resolution: {integrity: sha512-UilZ8sP9amHCz7TTMWMJ71JeYcMzEdgCJaqTfoB1hC/nYMXq6xqSFxKWCDhf7sR7nz3FKxS4t338t42AMDDkww==} engines: {node: '>=18'} @@ -7630,9 +7619,6 @@ packages: util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - util@0.12.5: - resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} - utils-merge@1.0.1: resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} engines: {node: '>= 0.4.0'} @@ -7918,7 +7904,7 @@ packages: snapshots: - '@2060.io/ffi-napi@4.0.9': + '@2060.io/ffi-napi@4.0.9(patch_hash=6ujtm5ladmp54sbez4f5d2uhca)': dependencies: '@2060.io/ref-napi': 3.0.6 debug: 4.4.1 @@ -9379,14 +9365,6 @@ snapshots: '@cosmjs/utils@0.33.1': {} - '@craftzdog/react-native-buffer@6.1.0(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': - dependencies: - ieee754: 1.2.1 - react-native-quick-base64: 2.2.0(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) - transitivePeerDependencies: - - react - - react-native - '@cspotcode/source-map-support@0.8.1': dependencies: '@jridgewell/trace-mapping': 0.3.9 @@ -10091,25 +10069,26 @@ snapshots: - expo-crypto - react-native - '@hiero-did-sdk/anoncreds@0.0.12(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': + '@hiero-did-sdk/anoncreds@0.1.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': dependencies: - '@hiero-did-sdk/hcs': 0.0.16(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) - '@hiero-did-sdk/zstd': 0.0.4(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) + '@hiero-did-sdk/core': 0.1.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/hcs': 0.1.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/zstd': 0.1.0 + buffer: 6.0.3 transitivePeerDependencies: - bn.js - expo-crypto - - react - react-native - '@hiero-did-sdk/cache@0.0.4(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': + '@hiero-did-sdk/cache@0.1.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': dependencies: - '@hiero-did-sdk/core': 0.0.7(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/core': 0.1.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) transitivePeerDependencies: - bn.js - expo-crypto - react-native - '@hiero-did-sdk/client@0.0.5(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': + '@hiero-did-sdk/client@0.1.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': dependencies: '@hashgraph/sdk': 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) transitivePeerDependencies: @@ -10117,7 +10096,7 @@ snapshots: - expo-crypto - react-native - '@hiero-did-sdk/core@0.0.7(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': + '@hiero-did-sdk/core@0.1.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': dependencies: '@hashgraph/sdk': 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) '@scure/base': 1.2.6 @@ -10128,124 +10107,109 @@ snapshots: - expo-crypto - react-native - '@hiero-did-sdk/crypto@0.0.4(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': + '@hiero-did-sdk/crypto@0.1.0': dependencies: buffer: 6.0.3 - crypto: 1.0.1 - crypto-js: 4.2.0 - react-native-quick-crypto: 0.7.14(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) - transitivePeerDependencies: - - react - - react-native - '@hiero-did-sdk/hcs@0.0.16(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': + '@hiero-did-sdk/hcs@0.1.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': dependencies: '@hashgraph/sdk': 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk/cache': 0.0.4(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk/client': 0.0.5(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk/core': 0.0.7(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk/crypto': 0.0.4(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) - '@hiero-did-sdk/zstd': 0.0.4(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) + '@hiero-did-sdk/cache': 0.1.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/client': 0.1.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/core': 0.1.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/crypto': 0.1.0 + '@hiero-did-sdk/zstd': 0.1.0 buffer: 6.0.3 transitivePeerDependencies: - bn.js - expo-crypto - - react - react-native - '@hiero-did-sdk/lifecycle@0.0.3(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': + '@hiero-did-sdk/lifecycle@0.1.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': dependencies: - '@hiero-did-sdk/core': 0.0.7(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/core': 0.1.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) buffer: 6.0.3 transitivePeerDependencies: - bn.js - expo-crypto - react-native - '@hiero-did-sdk/messages@0.0.3(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': + '@hiero-did-sdk/messages@0.1.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': dependencies: '@hashgraph/sdk': 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk/core': 0.0.7(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk/lifecycle': 0.0.3(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk/resolver': 0.0.11(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) + '@hiero-did-sdk/core': 0.1.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/lifecycle': 0.1.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/resolver': 0.1.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) buffer: 6.0.3 transitivePeerDependencies: - bn.js - expo-crypto - - react - react-native - '@hiero-did-sdk/publisher-internal@0.0.3(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': + '@hiero-did-sdk/publisher-internal@0.1.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': dependencies: '@hashgraph/sdk': 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk/core': 0.0.7(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/core': 0.1.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) buffer: 6.0.3 transitivePeerDependencies: - bn.js - expo-crypto - react-native - '@hiero-did-sdk/registrar@0.0.9(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': + '@hiero-did-sdk/registrar@0.1.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': dependencies: '@hashgraph/sdk': 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk/core': 0.0.7(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk/lifecycle': 0.0.3(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk/messages': 0.0.3(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) - '@hiero-did-sdk/publisher-internal': 0.0.3(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk/resolver': 0.0.11(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) - '@hiero-did-sdk/signer-internal': 0.0.6(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk/verifier-internal': 0.0.3(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/core': 0.1.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/lifecycle': 0.1.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/messages': 0.1.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/publisher-internal': 0.1.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/resolver': 0.1.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/signer-internal': 0.1.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/verifier-internal': 0.1.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) buffer: 6.0.3 transitivePeerDependencies: - bn.js - expo-crypto - - react - react-native - '@hiero-did-sdk/resolver@0.0.11(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': + '@hiero-did-sdk/resolver@0.1.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': dependencies: '@hashgraph/sdk': 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk/core': 0.0.7(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk/hcs': 0.0.16(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) - '@hiero-did-sdk/verifier-internal': 0.0.3(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/client': 0.1.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/core': 0.1.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/hcs': 0.1.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/verifier-internal': 0.1.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) buffer: 6.0.3 transitivePeerDependencies: - bn.js - expo-crypto - - react - react-native - '@hiero-did-sdk/signer-internal@0.0.6(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': + '@hiero-did-sdk/signer-internal@0.1.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': dependencies: '@hashgraph/sdk': 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk/core': 0.0.7(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/core': 0.1.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) buffer: 6.0.3 transitivePeerDependencies: - bn.js - expo-crypto - react-native - '@hiero-did-sdk/verifier-internal@0.0.3(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': + '@hiero-did-sdk/verifier-internal@0.1.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': dependencies: '@hashgraph/sdk': 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk/core': 0.0.7(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/core': 0.1.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) buffer: 6.0.3 transitivePeerDependencies: - bn.js - expo-crypto - react-native - '@hiero-did-sdk/zstd@0.0.4(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': - dependencies: - react-native-zstd: 1.1.0(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) - zstd-napi: 0.0.10 - transitivePeerDependencies: - - react - - react-native + '@hiero-did-sdk/zstd@0.1.0': {} '@hyperledger/anoncreds-nodejs@0.3.1': dependencies: - '@2060.io/ffi-napi': 4.0.9 + '@2060.io/ffi-napi': 4.0.9(patch_hash=6ujtm5ladmp54sbez4f5d2uhca) '@2060.io/ref-napi': 3.0.6 '@hyperledger/anoncreds-shared': 0.3.1 ref-array-di: 1.2.2 @@ -10259,7 +10223,7 @@ snapshots: '@hyperledger/indy-vdr-nodejs@0.2.2': dependencies: - '@2060.io/ffi-napi': 4.0.9 + '@2060.io/ffi-napi': 4.0.9(patch_hash=6ujtm5ladmp54sbez4f5d2uhca) '@2060.io/ref-napi': 3.0.6 '@hyperledger/indy-vdr-shared': 0.2.2 '@mapbox/node-pre-gyp': 1.0.11 @@ -10641,7 +10605,7 @@ snapshots: '@openwallet-foundation/askar-nodejs@0.3.2': dependencies: - '@2060.io/ffi-napi': 4.0.9 + '@2060.io/ffi-napi': 4.0.9(patch_hash=6ujtm5ladmp54sbez4f5d2uhca) '@2060.io/ref-napi': 3.0.6 '@openwallet-foundation/askar-shared': 0.3.2 ref-array-di: 1.2.2 @@ -12510,8 +12474,6 @@ snapshots: crypto-random-string@2.0.0: {} - crypto@1.0.1: {} - d@1.0.2: dependencies: es5-ext: 0.10.64 @@ -13703,11 +13665,6 @@ snapshots: ipaddr.js@1.9.1: {} - is-arguments@1.2.0: - dependencies: - call-bound: 1.0.4 - has-tostringtag: 1.0.2 - is-array-buffer@3.0.5: dependencies: call-bind: 1.0.8 @@ -15922,33 +15879,12 @@ snapshots: fast-base64-decode: 1.0.0 react-native: 0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1) - react-native-quick-base64@2.2.0(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1): - dependencies: - react: 18.3.1 - react-native: 0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1) - - react-native-quick-crypto@0.7.14(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1): - dependencies: - '@craftzdog/react-native-buffer': 6.1.0(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) - events: 3.3.0 - readable-stream: 4.7.0 - string_decoder: 1.3.0 - util: 0.12.5 - transitivePeerDependencies: - - react - - react-native - react-native-securerandom@0.1.1(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)): dependencies: base64-js: 1.5.1 react-native: 0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1) optional: true - react-native-zstd@1.1.0(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1): - dependencies: - react: 18.3.1 - react-native: 0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1) - react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1): dependencies: '@jest/create-cache-key-function': 29.7.0 @@ -16988,14 +16924,6 @@ snapshots: util-deprecate@1.0.2: {} - util@0.12.5: - dependencies: - inherits: 2.0.4 - is-arguments: 1.2.0 - is-generator-function: 1.1.0 - is-typed-array: 1.1.15 - which-typed-array: 1.1.19 - utils-merge@1.0.1: {} uuid@10.0.0: {} From 64d33d183d1e09ab3b71c92c15bd1ad1a0185146 Mon Sep 17 00:00:00 2001 From: "andrey.kononov" Date: Wed, 13 Aug 2025 19:38:46 +0300 Subject: [PATCH 24/89] Switch to NPM + unit-tests * Switched usage of @hiero-did-sdk-js to libraries from NPM repository * Fixed errors that occurred after switching libraries * Added unit tests to improve code coverage --- package.json | 3 + packages/hedera/jest.config.ts | 1 + packages/hedera/package.json | 18 +- .../src/anoncreds/HederaAnonCredsRegistry.ts | 12 +- .../hedera/src/dids/HederaDidRegistrar.ts | 5 +- .../hedera/src/ledger/HederaLedgerService.ts | 11 +- .../hedera/src/ledger/cache/CredoCache.ts | 4 +- .../src/ledger/publisher/KmsPublisher.ts | 10 +- .../HederaAnoncredsRegistry.e2e.test.ts | 4 +- .../HederaDidRegistrar.e2e.test.ts | 9 +- .../HederaDidResolver.e2e.test.ts | 2 +- .../{ => integration}/utils/hederaModule.ts | 0 .../tests/{ => integration}/utils/index.ts | 0 .../{ => integration}/utils/testCache.ts | 0 .../utils/testTailsFileService.ts | 0 packages/hedera/tests/tsconfig.json | 3 + .../hedera/tests/unit/credo-cache.test.ts | 99 ++++ .../unit/hedera-anoncres-registry.test.ts | 388 +++++++++++++ .../tests/unit/hedera-did-registrar.test.ts | 261 +++++++++ .../tests/unit/hedera-did-resolver.test.ts | 80 +++ .../tests/unit/hedera-ledger-service.test.ts | 512 ++++++++++++++++++ .../hedera/tests/unit/kms-publisher.test.ts | 132 +++++ packages/hedera/tests/unit/utils.test.ts | 90 +++ pnpm-lock.yaml | 280 ++++------ 24 files changed, 1715 insertions(+), 209 deletions(-) rename packages/hedera/tests/{ => integration}/HederaAnoncredsRegistry.e2e.test.ts (96%) rename packages/hedera/tests/{ => integration}/HederaDidRegistrar.e2e.test.ts (98%) rename packages/hedera/tests/{ => integration}/HederaDidResolver.e2e.test.ts (94%) rename packages/hedera/tests/{ => integration}/utils/hederaModule.ts (100%) rename packages/hedera/tests/{ => integration}/utils/index.ts (100%) rename packages/hedera/tests/{ => integration}/utils/testCache.ts (100%) rename packages/hedera/tests/{ => integration}/utils/testTailsFileService.ts (100%) create mode 100644 packages/hedera/tests/tsconfig.json create mode 100644 packages/hedera/tests/unit/credo-cache.test.ts create mode 100644 packages/hedera/tests/unit/hedera-anoncres-registry.test.ts create mode 100644 packages/hedera/tests/unit/hedera-did-registrar.test.ts create mode 100644 packages/hedera/tests/unit/hedera-did-resolver.test.ts create mode 100644 packages/hedera/tests/unit/hedera-ledger-service.test.ts create mode 100644 packages/hedera/tests/unit/kms-publisher.test.ts create mode 100644 packages/hedera/tests/unit/utils.test.ts diff --git a/package.json b/package.json index 3664eb998e..c063ec7838 100644 --- a/package.json +++ b/package.json @@ -60,6 +60,9 @@ "node": ">=18" }, "pnpm": { + "patchedDependencies": { + "@2060.io/ffi-napi@4.0.9": "patches/@2060.io__ffi-napi@4.0.9.patch" + }, "onlyBuiltDependencies": [ "@2060.io/ffi-napi", "@2060.io/ref-napi", diff --git a/packages/hedera/jest.config.ts b/packages/hedera/jest.config.ts index 95d7a0b737..80d2dc3106 100644 --- a/packages/hedera/jest.config.ts +++ b/packages/hedera/jest.config.ts @@ -8,6 +8,7 @@ const config: Config.InitialOptions = { ...base, testTimeout: 100000, displayName: packageJson.name, + coveragePathIgnorePatterns: ['../tests'], } export default config diff --git a/packages/hedera/package.json b/packages/hedera/package.json index 2a67f9b15c..4cc45380b5 100644 --- a/packages/hedera/package.json +++ b/packages/hedera/package.json @@ -20,6 +20,7 @@ "compile": "tsc -p tsconfig.build.json", "prepublishOnly": "pnpm run build", "test": "jest", + "test:coverage": "jest --coverage", "style:check": "biome check --unsafe", "style:fix": "biome check --write --unsafe" }, @@ -27,17 +28,18 @@ "@hashgraph/sdk": "^2.66.0", "@credo-ts/anoncreds": "workspace:*", "@credo-ts/core": "workspace:*", - "@hiero-did-sdk/anoncreds": "0.0.12", - "@hiero-did-sdk/registrar": "0.0.9", - "@hiero-did-sdk/resolver": "0.0.11", - "@hiero-did-sdk/core": "0.0.7", - "@hiero-did-sdk/client": "0.0.5", - "@hiero-did-sdk/hcs": "0.0.16", - "@hiero-did-sdk/publisher-internal": "0.0.3" + "@hiero-did-sdk/anoncreds": "0.1.0", + "@hiero-did-sdk/client": "0.1.0", + "@hiero-did-sdk/core": "0.1.0", + "@hiero-did-sdk/hcs": "0.1.0", + "@hiero-did-sdk/publisher-internal": "0.1.0", + "@hiero-did-sdk/registrar": "0.1.0", + "@hiero-did-sdk/resolver": "0.1.0" }, "devDependencies": { "@credo-ts/node": "workspace:*", "@hyperledger/anoncreds-nodejs": "^0.3.1", - "rimraf": "^4.4.0" + "rimraf": "^4.4.0", + "zstd-napi": "^0.0.10" } } diff --git a/packages/hedera/src/anoncreds/HederaAnonCredsRegistry.ts b/packages/hedera/src/anoncreds/HederaAnonCredsRegistry.ts index f743749100..cff195cfd5 100644 --- a/packages/hedera/src/anoncreds/HederaAnonCredsRegistry.ts +++ b/packages/hedera/src/anoncreds/HederaAnonCredsRegistry.ts @@ -101,9 +101,7 @@ export class HederaAnonCredsRegistry implements AnonCredsRegistry { credentialDefinitionId: string ): Promise { try { - agentContext.config.logger.trace( - `Resolving credential definition '${credentialDefinitionId}' from Hedera ledger` - ) + agentContext.config.logger.trace(`Resolving credential definition '${credentialDefinitionId}' from Hedera ledger`) const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) return await ledgerService.getCredentialDefinition(agentContext, credentialDefinitionId) } catch (error) { @@ -159,7 +157,7 @@ export class HederaAnonCredsRegistry implements AnonCredsRegistry { ): Promise { try { agentContext.config.logger.trace( - `Resolving revocation registry definition for '${revocationRegistryDefinitionId}' from Hedera ledger` + `Resolving revocation registry definition for '${revocationRegistryDefinitionId}' from Hedera ledger` ) const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) return await ledgerService.getRevocationRegistryDefinition(agentContext, revocationRegistryDefinitionId) @@ -188,7 +186,7 @@ export class HederaAnonCredsRegistry implements AnonCredsRegistry { ): Promise { try { agentContext.config.logger.trace( - `Registering revocation status list for '${options.revocationStatusList.revRegDefId}' on Hedera ledger` + `Registering revocation status list for '${options.revocationStatusList.revRegDefId}' on Hedera ledger` ) const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) return await ledgerService.registerRevocationStatusList(agentContext, options) @@ -220,10 +218,10 @@ export class HederaAnonCredsRegistry implements AnonCredsRegistry { ): Promise { try { agentContext.config.logger.trace( - `Resolving revocation status for for '${revocationRegistryId}' from Hedera ledger` + `Resolving revocation status for for '${revocationRegistryId}' from Hedera ledger` ) const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) - return await ledgerService.getRevocationStatusList(agentContext, revocationRegistryId, timestamp) + return await ledgerService.getRevocationStatusList(agentContext, revocationRegistryId, timestamp * 1000) } catch (error) { agentContext.config.logger.error(`Error retrieving revocation registry status list '${revocationRegistryId}'`, { error, diff --git a/packages/hedera/src/dids/HederaDidRegistrar.ts b/packages/hedera/src/dids/HederaDidRegistrar.ts index 51dccfa751..fdbcbba9ba 100644 --- a/packages/hedera/src/dids/HederaDidRegistrar.ts +++ b/packages/hedera/src/dids/HederaDidRegistrar.ts @@ -123,7 +123,10 @@ export class HederaDidRegistrar implements DidRegistrar { } } - async deactivate(agentContext: AgentContext, options: Omit): Promise { + async deactivate( + agentContext: AgentContext, + options: Omit + ): Promise { const didRepository = agentContext.dependencyManager.resolve(DidRepository) const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) diff --git a/packages/hedera/src/ledger/HederaLedgerService.ts b/packages/hedera/src/ledger/HederaLedgerService.ts index 3f052e9e66..894df1ab96 100644 --- a/packages/hedera/src/ledger/HederaLedgerService.ts +++ b/packages/hedera/src/ledger/HederaLedgerService.ts @@ -25,8 +25,8 @@ import { import { KeyManagementApi } from '@credo-ts/core/src/modules/kms' import { Client } from '@hashgraph/sdk' import { HederaAnoncredsRegistry } from '@hiero-did-sdk/anoncreds' -import { HederaNetwork, HederaClientService } from '@hiero-did-sdk/client' -import {DIDResolution, DID_ROOT_KEY_ID, Service, VerificationMethod, parseDID} from '@hiero-did-sdk/core' +import { HederaClientService, HederaNetwork } from '@hiero-did-sdk/client' +import { DIDResolution, DID_ROOT_KEY_ID, Service, VerificationMethod, parseDID } from '@hiero-did-sdk/core' import { CreateDIDResult, DIDUpdateBuilder, @@ -287,7 +287,12 @@ export class HederaLedgerService { options: RegisterCredentialDefinitionOptions ): Promise { const sdk = this.getHederaAnonCredsSdk(agentContext) - return await sdk.registerCredentialDefinition(options) + return await sdk.registerCredentialDefinition({ + ...options, + options: { + supportRevocation: options.options?.supportRevocation === true ?? false, + }, + }) } async getRevocationRegistryDefinition( diff --git a/packages/hedera/src/ledger/cache/CredoCache.ts b/packages/hedera/src/ledger/cache/CredoCache.ts index df6d59e70d..30a2eb7ea2 100644 --- a/packages/hedera/src/ledger/cache/CredoCache.ts +++ b/packages/hedera/src/ledger/cache/CredoCache.ts @@ -29,11 +29,11 @@ export class CredoCache implements Cache { await this.credoCache.remove(this.agentContext, key) } - cleanup(): Promise { + async clear(): Promise { throw new Error('Method not implemented.') } - cleanupExpired(): Promise { + async cleanupExpired(): Promise { throw new Error('Method not implemented.') } } diff --git a/packages/hedera/src/ledger/publisher/KmsPublisher.ts b/packages/hedera/src/ledger/publisher/KmsPublisher.ts index 58c00f0fdf..f96ce34451 100644 --- a/packages/hedera/src/ledger/publisher/KmsPublisher.ts +++ b/packages/hedera/src/ledger/publisher/KmsPublisher.ts @@ -1,5 +1,5 @@ import { AgentContext, Kms, TypedArrayEncoder } from '@credo-ts/core' -import {KeyManagementApi, KmsJwkPublicOkp} from '@credo-ts/core/src/modules/kms' +import { KeyManagementApi, KmsJwkPublicOkp } from '@credo-ts/core/src/modules/kms' import { Client, PublicKey, Transaction, TransactionReceipt } from '@hashgraph/sdk' import { KeysUtility } from '@hiero-did-sdk/core' import { Publisher as ClientPublisher } from '@hiero-did-sdk/publisher-internal' @@ -11,14 +11,18 @@ export class KmsPublisher extends ClientPublisher { private keyId!: string private submitPublicKey!: PublicKey - constructor(agentContext: AgentContext, client: Client, key: { keyId: string; publicJwk: KmsJwkPublicOkp & { crv: 'Ed25519' } }) { + constructor( + agentContext: AgentContext, + client: Client, + key: { keyId: string; publicJwk: KmsJwkPublicOkp & { crv: 'Ed25519' } } + ) { super(client) this.kms = agentContext.dependencyManager.resolve(Kms.KeyManagementApi) this.keyId = key.keyId this.submitPublicKey = KeysUtility.fromBytes( - Uint8Array.from(TypedArrayEncoder.fromBase64(key.publicJwk.x)) + Uint8Array.from(TypedArrayEncoder.fromBase64(key.publicJwk.x)) ).toPublicKey() } diff --git a/packages/hedera/tests/HederaAnoncredsRegistry.e2e.test.ts b/packages/hedera/tests/integration/HederaAnoncredsRegistry.e2e.test.ts similarity index 96% rename from packages/hedera/tests/HederaAnoncredsRegistry.e2e.test.ts rename to packages/hedera/tests/integration/HederaAnoncredsRegistry.e2e.test.ts index 1f76a0c191..667f1f7e7e 100644 --- a/packages/hedera/tests/HederaAnoncredsRegistry.e2e.test.ts +++ b/packages/hedera/tests/integration/HederaAnoncredsRegistry.e2e.test.ts @@ -1,5 +1,5 @@ import { Agent, ConsoleLogger, LogLevel, utils } from '@credo-ts/core' -import { HederaDidCreateOptions } from '../src/ledger/HederaLedgerService' +import { HederaDidCreateOptions } from '../../src/ledger/HederaLedgerService' import { getHederaAgent, testCache } from './utils' describe('Hedera AnonCreds support', () => { @@ -42,7 +42,7 @@ describe('Hedera AnonCreds support', () => { }) describe('Hedera Anoncreds Registry', () => { - it('Full flow (register and resolve schema, credential definition, revocation registry definition, revocation status list)', async () => { + it('should executes the full workflow (register and resolve schema, credential definition, revocation registry definition, revocation status list)', async () => { // Create the schema const schemaResult = await agent.modules.anoncreds.registerSchema({ schema: { diff --git a/packages/hedera/tests/HederaDidRegistrar.e2e.test.ts b/packages/hedera/tests/integration/HederaDidRegistrar.e2e.test.ts similarity index 98% rename from packages/hedera/tests/HederaDidRegistrar.e2e.test.ts rename to packages/hedera/tests/integration/HederaDidRegistrar.e2e.test.ts index dcca210093..193c796b40 100644 --- a/packages/hedera/tests/HederaDidRegistrar.e2e.test.ts +++ b/packages/hedera/tests/integration/HederaDidRegistrar.e2e.test.ts @@ -7,11 +7,8 @@ import { LogLevel, VerificationMethod, } from '@credo-ts/core' -import { - HederaDidCreateOptions, - HederaDidUpdateOptions, -} from '../src/ledger/HederaLedgerService' -import { getMultibasePublicKey } from '../src/ledger/utils' +import { HederaDidCreateOptions, HederaDidUpdateOptions } from '../../src/ledger/HederaLedgerService' +import { getMultibasePublicKey } from '../../src/ledger/utils' import { getHederaAgent } from './utils' describe('Hedera DID registrar', () => { @@ -390,7 +387,7 @@ describe('Hedera DID registrar', () => { const did = didResult.didState.did! const deactivateResult = await agent.dids.deactivate({ - did + did, }) expect(deactivateResult.didState.didDocument?.id).toEqual(did) diff --git a/packages/hedera/tests/HederaDidResolver.e2e.test.ts b/packages/hedera/tests/integration/HederaDidResolver.e2e.test.ts similarity index 94% rename from packages/hedera/tests/HederaDidResolver.e2e.test.ts rename to packages/hedera/tests/integration/HederaDidResolver.e2e.test.ts index 14f641bf86..c92aa547d7 100644 --- a/packages/hedera/tests/HederaDidResolver.e2e.test.ts +++ b/packages/hedera/tests/integration/HederaDidResolver.e2e.test.ts @@ -1,5 +1,5 @@ import { Agent, ConsoleLogger, JsonTransformer, LogLevel } from '@credo-ts/core' -import { HederaDidCreateOptions } from '../src/ledger/HederaLedgerService' +import { HederaDidCreateOptions } from '../../src/ledger/HederaLedgerService' import { getHederaAgent } from './utils' describe('Hedera DID resolver', () => { diff --git a/packages/hedera/tests/utils/hederaModule.ts b/packages/hedera/tests/integration/utils/hederaModule.ts similarity index 100% rename from packages/hedera/tests/utils/hederaModule.ts rename to packages/hedera/tests/integration/utils/hederaModule.ts diff --git a/packages/hedera/tests/utils/index.ts b/packages/hedera/tests/integration/utils/index.ts similarity index 100% rename from packages/hedera/tests/utils/index.ts rename to packages/hedera/tests/integration/utils/index.ts diff --git a/packages/hedera/tests/utils/testCache.ts b/packages/hedera/tests/integration/utils/testCache.ts similarity index 100% rename from packages/hedera/tests/utils/testCache.ts rename to packages/hedera/tests/integration/utils/testCache.ts diff --git a/packages/hedera/tests/utils/testTailsFileService.ts b/packages/hedera/tests/integration/utils/testTailsFileService.ts similarity index 100% rename from packages/hedera/tests/utils/testTailsFileService.ts rename to packages/hedera/tests/integration/utils/testTailsFileService.ts diff --git a/packages/hedera/tests/tsconfig.json b/packages/hedera/tests/tsconfig.json new file mode 100644 index 0000000000..105334e225 --- /dev/null +++ b/packages/hedera/tests/tsconfig.json @@ -0,0 +1,3 @@ +{ + "extends": "../../../tsconfig.test.json" +} diff --git a/packages/hedera/tests/unit/credo-cache.test.ts b/packages/hedera/tests/unit/credo-cache.test.ts new file mode 100644 index 0000000000..5c43ffe7ab --- /dev/null +++ b/packages/hedera/tests/unit/credo-cache.test.ts @@ -0,0 +1,99 @@ +import { AgentContext, CacheModuleConfig, CredoError } from '@credo-ts/core' +import { CredoCache, ICredoCache } from '../../src/ledger/cache/CredoCache' + +describe('CredoCache', () => { + let mockAgentContext: AgentContext + let mockDependencyManagerResolve: jest.Mock + let mockCredoCache: jest.Mocked + + beforeEach(() => { + mockCredoCache = { + get: jest.fn(), + set: jest.fn(), + remove: jest.fn(), + } + + mockDependencyManagerResolve = jest.fn().mockReturnValue({ cache: mockCredoCache }) + + mockAgentContext = { + dependencyManager: { + resolve: mockDependencyManagerResolve, + }, + } as unknown as AgentContext + }) + + it('should throw CredoError if cache not found in constructor', () => { + mockDependencyManagerResolve.mockReturnValue({ cache: null }) + + expect(() => new CredoCache(mockAgentContext)).toThrowError(CredoError) + }) + + it('should initialize credoCache from dependency manager', () => { + const credoCacheInstance = new CredoCache(mockAgentContext) + expect(mockDependencyManagerResolve).toHaveBeenCalledWith(CacheModuleConfig) + // @ts-ignore + expect(credoCacheInstance.credoCache).toBe(mockCredoCache) + }) + + describe('get', () => { + it('should call credoCache.get with correct parameters and return value', async () => { + const testKey = 'test-key' + const returnedValue = { foo: 'bar' } + mockCredoCache.get.mockResolvedValue(returnedValue) + + const credoCacheInstance = new CredoCache(mockAgentContext) + const result = await credoCacheInstance.get(testKey) + + expect(mockCredoCache.get).toHaveBeenCalledWith(mockAgentContext, testKey) + expect(result).toBe(returnedValue) + }) + + it('should return null if credoCache.get resolves null', async () => { + mockCredoCache.get.mockResolvedValue(null) + + const credoCacheInstance = new CredoCache(mockAgentContext) + const result = await credoCacheInstance.get('missing') + + expect(result).toBeNull() + }) + }) + + describe('set', () => { + it('should call credoCache.set with correct parameters', async () => { + const key = 'key' + const value = { a: 1 } + mockCredoCache.set.mockResolvedValue(undefined) + + const credoCacheInstance = new CredoCache(mockAgentContext) + await credoCacheInstance.set(key, value, 123) + + expect(mockCredoCache.set).toHaveBeenCalledWith(mockAgentContext, key, value) + }) + }) + + describe('remove', () => { + it('should call credoCache.remove with correct parameters', async () => { + const key = 'keyToRemove' + mockCredoCache.remove.mockResolvedValue(undefined) + + const credoCacheInstance = new CredoCache(mockAgentContext) + await credoCacheInstance.remove(key) + + expect(mockCredoCache.remove).toHaveBeenCalledWith(mockAgentContext, key) + }) + }) + + describe('clear', () => { + it('should throw error when called', async () => { + const credoCacheInstance = new CredoCache(mockAgentContext) + await expect(credoCacheInstance.clear()).rejects.toThrowError('Method not implemented.') + }) + }) + + describe('cleanupExpired', () => { + it('should throw error when called', async () => { + const credoCacheInstance = new CredoCache(mockAgentContext) + await expect(credoCacheInstance.cleanupExpired()).rejects.toThrowError('Method not implemented.') + }) + }) +}) diff --git a/packages/hedera/tests/unit/hedera-anoncres-registry.test.ts b/packages/hedera/tests/unit/hedera-anoncres-registry.test.ts new file mode 100644 index 0000000000..49b7dba713 --- /dev/null +++ b/packages/hedera/tests/unit/hedera-anoncres-registry.test.ts @@ -0,0 +1,388 @@ +import { + RegisterSchemaOptions, + RegisterSchemaReturn, + GetSchemaReturn, + RegisterCredentialDefinitionOptions, + RegisterCredentialDefinitionReturn, + GetCredentialDefinitionReturn, + RegisterRevocationRegistryDefinitionOptions, + RegisterRevocationRegistryDefinitionReturn, + GetRevocationRegistryDefinitionReturn, + RegisterRevocationStatusListOptions, + RegisterRevocationStatusListReturn, + GetRevocationStatusListReturn, + RegisterSchemaReturnStateFinished, +} from '@credo-ts/anoncreds' +import {AgentContext} from "@credo-ts/core"; +import {HederaAnonCredsRegistry} from "@credo-ts/hedera"; +import {HederaLedgerService} from "../../src/ledger/HederaLedgerService"; + +const createMockAgentContext = () => ({ + dependencyManager: { + resolve: jest.fn(), + }, + config: { + logger: { + trace: jest.fn(), + debug: jest.fn(), + error: jest.fn(), + }, + }, +}) as unknown as AgentContext + +describe('HederaAnonCredsRegistry', () => { + let service: HederaAnonCredsRegistry + let mockAgentContext: AgentContext + let mockLedgerService: any + + beforeEach(() => { + mockAgentContext = createMockAgentContext() + mockLedgerService = { + registerSchema: jest.fn(), + getSchema: jest.fn(), + registerCredentialDefinition: jest.fn(), + getCredentialDefinition: jest.fn(), + registerRevocationRegistryDefinition: jest.fn(), + getRevocationRegistryDefinition: jest.fn(), + registerRevocationStatusList: jest.fn(), + getRevocationStatusList: jest.fn(), + } + // @ts-ignore + mockAgentContext.dependencyManager.resolve.mockReturnValue(mockLedgerService) + + service = new HederaAnonCredsRegistry() + }) + + describe('registerSchema', () => { + const options: RegisterSchemaOptions = { + schema: { + issuerId: 'did:hedera:123', name: 'schemaName', version: '1.0', + attrNames: [] + }, + options: {}, + } + + it('should call ledgerService.registerSchema and return result on success', async () => { + const expected: RegisterSchemaReturn = { + schemaMetadata: {}, registrationMetadata: {}, + schemaState: { + state: "finished" + } as RegisterSchemaReturnStateFinished + } + mockLedgerService.registerSchema.mockResolvedValue(expected) + + const result = await service.registerSchema(mockAgentContext, options) + + expect(mockAgentContext.config.logger.trace).toHaveBeenCalledWith('Registering schema on Hedera ledger') + expect(mockAgentContext.dependencyManager.resolve).toHaveBeenCalledWith(expect.any(Function) || HederaLedgerService) + expect(mockLedgerService.registerSchema).toHaveBeenCalledWith(mockAgentContext, options) + expect(result).toEqual(expected) + }) + + it('should catch error and return failed state', async () => { + const error = new Error('fail') + mockLedgerService.registerSchema.mockRejectedValue(error) + + const result = await service.registerSchema(mockAgentContext, options) + + expect(mockAgentContext.config.logger.debug).toHaveBeenCalledWith( + `Error registering schema for did '${options.schema.issuerId}'`, + expect.objectContaining({ error, did: options.schema.issuerId, schema: options }) + ) + expect(result.schemaState.state).toBe('failed') + if (result.schemaState.state === 'failed') + expect(result.schemaState.reason).toContain('fail') + }) + }) + + describe('getSchema', () => { + const schemaId = 'schema-id-123' + + it('should call ledgerService.getSchema and return result on success', async () => { + const expected: GetSchemaReturn = { + schemaId: schemaId, + resolutionMetadata: {}, + schemaMetadata: {} + } + mockLedgerService.getSchema.mockResolvedValue(expected) + + const result = await service.getSchema(mockAgentContext, schemaId) + + expect(mockAgentContext.config.logger.trace).toHaveBeenCalledWith(`Resolving schema '${schemaId}' from Hedera ledger`) + expect(mockLedgerService.getSchema).toHaveBeenCalledWith(mockAgentContext, schemaId) + expect(result).toEqual(expected) + }) + + it('should catch error and return notFound error state', async () => { + const error = new Error('not found') + mockLedgerService.getSchema.mockRejectedValue(error) + + const result = await service.getSchema(mockAgentContext, schemaId) + + expect(mockAgentContext.config.logger.error).toHaveBeenCalledWith( + `Error retrieving schema '${schemaId}'`, + expect.objectContaining({ error, schemaId }) + ) + expect(result.resolutionMetadata.error).toBe('notFound') + expect(result.resolutionMetadata.message).toContain('not found') + }) + }) + + describe('registerCredentialDefinition', () => { + const options: RegisterCredentialDefinitionOptions = { + credentialDefinition: { issuerId: 'did:hedera:issuer' } + } as any + + it('should call ledgerService.registerCredentialDefinition and return result on success', async () => { + const expected: RegisterCredentialDefinitionReturn = { + credentialDefinitionMetadata: {}, + registrationMetadata: {}, + credentialDefinitionState: { + state: "finished", + credentialDefinition: { + issuerId: '', + schemaId: '', + type: 'CL', + tag: '', + value: { + primary: {}, + revocation: undefined + } + }, + credentialDefinitionId: "did:hedera:issuerId", + } + } + mockLedgerService.registerCredentialDefinition.mockResolvedValue(expected) + + const result = await service.registerCredentialDefinition(mockAgentContext, options) + + expect(mockAgentContext.config.logger.trace).toHaveBeenCalledWith('Registering credential definition on Hedera ledger') + expect(mockLedgerService.registerCredentialDefinition).toHaveBeenCalledWith(mockAgentContext, options) + expect(result).toEqual(expected) + }) + + it('should catch error and return failed state', async () => { + const error = new Error('fail') + mockLedgerService.registerCredentialDefinition.mockRejectedValue(error) + + const result = await service.registerCredentialDefinition(mockAgentContext, options) + + expect(mockAgentContext.config.logger.error).toHaveBeenCalledWith( + `Error registering credential definition for did '${options.credentialDefinition.issuerId}'`, + expect.objectContaining({ error, did: options.credentialDefinition.issuerId, schema: options }) + ) + expect(result.credentialDefinitionState.state).toBe('failed') + if (result.credentialDefinitionState.state === 'failed') + expect(result.credentialDefinitionState.reason).toContain('fail') + }) + }) + + describe('getCredentialDefinition', () => { + const credentialDefinitionId = 'cred-def-123' + + it('should call ledgerService.getCredentialDefinition and return result on success', async () => { + const expected: GetCredentialDefinitionReturn = { + credentialDefinitionId, + resolutionMetadata: {}, + credentialDefinitionMetadata: {} + } + mockLedgerService.getCredentialDefinition.mockResolvedValue(expected) + + const result = await service.getCredentialDefinition(mockAgentContext, credentialDefinitionId) + + expect(mockAgentContext.config.logger.trace).toHaveBeenCalledWith( + `Resolving credential definition '${credentialDefinitionId}' from Hedera ledger` + ) + expect(mockLedgerService.getCredentialDefinition).toHaveBeenCalledWith(mockAgentContext, credentialDefinitionId) + expect(result).toEqual(expected) + }) + + it('should catch error and return notFound error state', async () => { + const error = new Error('not found') + mockLedgerService.getCredentialDefinition.mockRejectedValue(error) + + const result = await service.getCredentialDefinition(mockAgentContext, credentialDefinitionId) + + expect(mockAgentContext.config.logger.error).toHaveBeenCalledWith( + `Error retrieving credential definition '${credentialDefinitionId}'`, + expect.objectContaining({ error, credentialDefinitionId }) + ) + expect(result.resolutionMetadata.error).toBe('notFound') + expect(result.resolutionMetadata.message).toContain('not found') + }) + }) + + describe('registerRevocationRegistryDefinition', () => { + const options: RegisterRevocationRegistryDefinitionOptions = { + revocationRegistryDefinition: { credDefId: 'credDef1', issuerId: 'did:hedera:issuer' }, + } as any + + it('should call ledgerService.registerRevocationRegistryDefinition and return result on success', async () => { + const expected: RegisterRevocationRegistryDefinitionReturn = { + revocationRegistryDefinitionMetadata: {}, + registrationMetadata: {}, + revocationRegistryDefinitionState: { + state: "finished", + revocationRegistryDefinitionId: 'test', + revocationRegistryDefinition: { + issuerId: '', + revocDefType: 'CL_ACCUM', + credDefId: '', + tag: '', + value: { + publicKeys: { + accumKey: { + z: '' + } + }, + maxCredNum: 0, + tailsLocation: '', + tailsHash: '' + } + } + } + } + mockLedgerService.registerRevocationRegistryDefinition.mockResolvedValue(expected) + + const result = await service.registerRevocationRegistryDefinition(mockAgentContext, options) + + expect(mockAgentContext.config.logger.trace).toHaveBeenCalledWith( + `Registering revocation registry definition for '${options.revocationRegistryDefinition.credDefId}' on Hedera ledger` + ) + expect(mockLedgerService.registerRevocationRegistryDefinition).toHaveBeenCalledWith(mockAgentContext, options) + expect(result).toEqual(expected) + }) + + it('should catch error and return failed state', async () => { + const error = new Error('fail') + mockLedgerService.registerRevocationRegistryDefinition.mockRejectedValue(error) + + const result = await service.registerRevocationRegistryDefinition(mockAgentContext, options) + + expect(mockAgentContext.config.logger.error).toHaveBeenCalledWith( + `Error registering revocation registry definition for did '${options.revocationRegistryDefinition.issuerId}'`, + expect.objectContaining({ error, did: options.revocationRegistryDefinition.issuerId, options }) + ) + expect(result.revocationRegistryDefinitionState.state).toBe('failed') + if (result.revocationRegistryDefinitionState.state === 'failed') + expect(result.revocationRegistryDefinitionState.reason).toContain('fail') + }) + }) + + describe('getRevocationRegistryDefinition', () => { + const revocationRegistryDefinitionId = 'revRegDef123' + + it('should call ledgerService.getRevocationRegistryDefinition and return result on success', async () => { + const expected: GetRevocationRegistryDefinitionReturn = { + revocationRegistryDefinitionId, + resolutionMetadata: {}, + revocationRegistryDefinitionMetadata: {} + } + mockLedgerService.getRevocationRegistryDefinition.mockResolvedValue(expected) + + const result = await service.getRevocationRegistryDefinition(mockAgentContext, revocationRegistryDefinitionId) + + expect(mockAgentContext.config.logger.trace).toHaveBeenCalledWith( + `Resolving revocation registry definition for '${revocationRegistryDefinitionId}' from Hedera ledger` + ) + expect(mockLedgerService.getRevocationRegistryDefinition).toHaveBeenCalledWith(mockAgentContext, revocationRegistryDefinitionId) + expect(result).toEqual(expected) + }) + + it('should catch error and return notFound error state', async () => { + const error = new Error('not found') + mockLedgerService.getRevocationRegistryDefinition.mockRejectedValue(error) + + const result = await service.getRevocationRegistryDefinition(mockAgentContext, revocationRegistryDefinitionId) + + expect(mockAgentContext.config.logger.error).toHaveBeenCalledWith( + `Error retrieving revocation registry definition '${revocationRegistryDefinitionId}'`, + expect.objectContaining({ error, revocationRegistryDefinitionId }) + ) + expect(result.resolutionMetadata.error).toBe('notFound') + expect(result.resolutionMetadata.message).toContain('not found') + }) + }) + + describe('registerRevocationStatusList', () => { + const options: RegisterRevocationStatusListOptions = { + revocationStatusList: { revRegDefId: 'regDef1', issuerId: 'did:hedera:issuer' } + } as any + + it('should call ledgerService.registerRevocationStatusList and return result on success', async () => { + const expected: RegisterRevocationStatusListReturn = { + revocationStatusListMetadata: {}, + registrationMetadata: {}, + revocationStatusListState: { + state: 'finished', + revocationStatusList: { + revRegDefId: '', + issuerId: '', + revocationList: [], + timestamp: 0, + currentAccumulator: '' + } + } + } + mockLedgerService.registerRevocationStatusList.mockResolvedValue(expected) + + const result = await service.registerRevocationStatusList(mockAgentContext, options) + + expect(mockAgentContext.config.logger.trace).toHaveBeenCalledWith( + `Registering revocation status list for '${options.revocationStatusList.revRegDefId}' on Hedera ledger` + ) + expect(mockLedgerService.registerRevocationStatusList).toHaveBeenCalledWith(mockAgentContext, options) + expect(result).toEqual(expected) + }) + + it('should catch error and return failed state', async () => { + const error = new Error('fail') + mockLedgerService.registerRevocationStatusList.mockRejectedValue(error) + + const result = await service.registerRevocationStatusList(mockAgentContext, options) + + expect(mockAgentContext.config.logger.error).toHaveBeenCalledWith( + `Error registering revocation status list for did '${options.revocationStatusList.issuerId}'`, + expect.objectContaining({ error, did: options.revocationStatusList.issuerId, options }) + ) + expect(result.revocationStatusListState.state).toBe('failed') + if (result.revocationStatusListState.state === 'failed') + expect(result.revocationStatusListState.reason).toContain('fail') + }) + }) + + describe('getRevocationStatusList', () => { + const revocationRegistryId = 'revRegId123' + const timestamp = 1234567890 + + it('should call ledgerService.getRevocationStatusList and return result on success', async () => { + const expected: GetRevocationStatusListReturn = { + resolutionMetadata: {}, + revocationStatusListMetadata: {} + } + mockLedgerService.getRevocationStatusList.mockResolvedValue(expected) + + const result = await service.getRevocationStatusList(mockAgentContext, revocationRegistryId, timestamp) + + expect(mockAgentContext.config.logger.trace).toHaveBeenCalledWith( + `Resolving revocation status for for '${revocationRegistryId}' from Hedera ledger` + ) + expect(mockLedgerService.getRevocationStatusList).toHaveBeenCalledWith(mockAgentContext, revocationRegistryId, timestamp * 1000) + expect(result).toEqual(expected) + }) + + it('should catch error and return notFound error state', async () => { + const error = new Error('not found') + mockLedgerService.getRevocationStatusList.mockRejectedValue(error) + + const result = await service.getRevocationStatusList(mockAgentContext, revocationRegistryId, timestamp) + + expect(mockAgentContext.config.logger.error).toHaveBeenCalledWith( + `Error retrieving revocation registry status list '${revocationRegistryId}'`, + expect.objectContaining({ error, revocationRegistryId }) + ) + expect(result.resolutionMetadata.error).toBe('notFound') + expect(result.resolutionMetadata.message).toContain('not found') + }) + }) +}) diff --git a/packages/hedera/tests/unit/hedera-did-registrar.test.ts b/packages/hedera/tests/unit/hedera-did-registrar.test.ts new file mode 100644 index 0000000000..a9a022d910 --- /dev/null +++ b/packages/hedera/tests/unit/hedera-did-registrar.test.ts @@ -0,0 +1,261 @@ +import type { AgentContext, DidDocumentKey } from '@credo-ts/core' +import { DidDocumentRole } from '@credo-ts/core' +import { HederaDidRegistrar } from '@credo-ts/hedera' +import {HederaDidUpdateOptions} from "../../src/ledger/HederaLedgerService"; + +describe('HederaDidRegistrar', () => { + let service: HederaDidRegistrar + let mockAgentContext: any + let mockDidRepository: any + let mockLedgerService: any + + beforeEach(() => { + const mockLogger = { + debug: jest.fn(), + error: jest.fn(), + } + + mockDidRepository = { + save: jest.fn(), + findCreatedDid: jest.fn(), + update: jest.fn(), + } + + mockLedgerService = { + createDid: jest.fn(), + resolveDid: jest.fn(), + updateDid: jest.fn(), + deactivateDid: jest.fn(), + } + + mockAgentContext = { + dependencyManager: { + resolve: jest.fn() + .mockImplementation((obj: any) => { + if (obj.name === 'DidRepository') return mockDidRepository + if (obj.name === 'HederaLedgerService') return mockLedgerService + }), + }, + config: { + logger: mockLogger, + }, + } + + service = new HederaDidRegistrar() + }) + + describe('create', () => { + it('should create DID, save it, and return finished state on success', async () => { + const did = 'did:hedera:123' + const didDocument = { + service: [{ id: 'service1' }, { id: 'service2' }], + } + const rootKey = { kmsKeyId: 'key1', didDocumentRelativeKeyId: 'rootKeyId' } + + mockLedgerService.createDid.mockResolvedValue({ did, didDocument, rootKey }) + + const result = await service.create(mockAgentContext as AgentContext, { + method: 'hedera', + options: {}, + } as any) + + expect(mockDidRepository.save).toHaveBeenCalled() + const savedRecord = mockDidRepository.save.mock.calls[0][1] + expect(savedRecord.did).toBe(did) + expect(savedRecord.role).toBe(DidDocumentRole.Created) + expect(savedRecord.didDocument).toBeInstanceOf(Object) + expect(savedRecord.didDocument.service[0]).toBeInstanceOf(Object) + + expect(result.didState.state).toBe('finished') + expect(result.didState.did).toBe(did) + expect(result.didState.didDocument).toBeInstanceOf(Object) + }) + + it('should handle error and return failed state', async () => { + mockLedgerService.createDid.mockRejectedValue(new Error('Create failed')) + + const result = await service.create(mockAgentContext as AgentContext, { + method: 'hedera', + options: {}, + } as any) + + expect(mockAgentContext.config.logger.debug).toHaveBeenCalledWith('Error creating DID', expect.any(Object)) + + expect(result.didState.state).toBe('failed') + if (result.didState.state === 'failed') + expect(result.didState.reason).toBe('Unable to register Did: Create failed') + }) + }) + + describe('update', () => { + const did = 'did:hedera:123' + + it('should update DID and save record successfully', async () => { + const didDocument = { id: did } + const updatedDidDocument = { id: did, updated: true } + + const foundDidRecord = { + didDocument, + keys: [{ didDocumentRelativeKeyId: 'key1' }], + }; + mockLedgerService.resolveDid.mockResolvedValue({ + didDocument, + didDocumentMetadata: { deactivated: false }, + didResolutionMetadata: {}, + }); + mockDidRepository.findCreatedDid.mockResolvedValue(foundDidRecord); + mockLedgerService.updateDid.mockResolvedValue({ didDocument: updatedDidDocument }); + mockDidRepository.update.mockResolvedValue(undefined); + + const options: HederaDidUpdateOptions = { + did, + didDocumentOperation: 'setDidDocument', + secret: { keys: [{ + didDocumentRelativeKeyId: 'key2', + kmsKeyId: 'some-key' + }] }, + didDocument: {}, + } + + const result = await service.update(mockAgentContext as AgentContext, options) + + expect(mockLedgerService.resolveDid).toHaveBeenCalledWith(mockAgentContext, did) + expect(mockDidRepository.findCreatedDid).toHaveBeenCalledWith(mockAgentContext, did) + + expect(mockLedgerService.updateDid).toHaveBeenCalledWith(mockAgentContext, expect.objectContaining({ + secret: { keys: expect.any(Array) }, + })) + + expect(mockDidRepository.update).toHaveBeenCalledWith(mockAgentContext, foundDidRecord) + + expect(result.didState.state).toBe('finished') + expect(result.didState.did).toBe(did) + expect(result.didState.didDocument).toBeInstanceOf(Object) + }) + + it('should return failed state if DID not found or deactivated', async () => { + mockLedgerService.resolveDid.mockResolvedValue({ didDocument: null, didDocumentMetadata: { deactivated: true } }) + mockDidRepository.findCreatedDid.mockResolvedValue(null) + + const options = { + did, + } as any + + const result = await service.update(mockAgentContext as AgentContext, options) + + expect(result.didState.state).toBe('failed') + if (result.didState.state === 'failed') + expect(result.didState.reason).toBe('Did not found') + }) + + it('should handle error and return failed state', async () => { + mockLedgerService.resolveDid.mockRejectedValue(new Error('Update failed')) + + const options = { + did, + didDocumentOperation: 'setDidDocument', + } as any + + const result = await service.update(mockAgentContext as AgentContext, options) + + expect(mockAgentContext.config.logger.error).toHaveBeenCalledWith('Error update DID', expect.any(Error)) + expect(result.didState.state).toBe('failed') + if (result.didState.state === 'failed') + expect(result.didState.reason).toBe('Unable update DID: Update failed') + }) + }) + + describe('deactivate', () => { + const did = 'did:hedera:123' + + it('should deactivate DID and save updated record successfully', async () => { + const didDocument = { id: did } + const deactivatedDidDocument = { id: did, deactivated: true } + + const foundDidRecord = { + didDocument, + keys: [{ didDocumentRelativeKeyId: 'key1' }], + } + + mockLedgerService.resolveDid.mockResolvedValue({ didDocument, didDocumentMetadata: {} }) + mockDidRepository.findCreatedDid.mockResolvedValue(foundDidRecord) + mockLedgerService.deactivateDid.mockResolvedValue({ didDocument: deactivatedDidDocument }) + mockDidRepository.update.mockResolvedValue(undefined) + + const options = { + did, + } + + const result = await service.deactivate(mockAgentContext as AgentContext, options) + + expect(mockLedgerService.resolveDid).toHaveBeenCalledWith(mockAgentContext, did) + expect(mockDidRepository.findCreatedDid).toHaveBeenCalledWith(mockAgentContext, did) + expect(mockLedgerService.deactivateDid).toHaveBeenCalledWith(mockAgentContext, expect.objectContaining({ + secret: { keys: foundDidRecord.keys }, + })) + expect(mockDidRepository.update).toHaveBeenCalledWith(mockAgentContext, foundDidRecord) + + expect(result.didState.state).toBe('finished') + expect(result.didState.did).toBe(did) + expect(result.didState.didDocument).toBeInstanceOf(Object) + }) + + it('should return failed state if DID not found or deactivated', async () => { + mockLedgerService.resolveDid.mockResolvedValue({ didDocument: null, didDocumentMetadata: { deactivated: true } }) + mockDidRepository.findCreatedDid.mockResolvedValue(null) + + const options = { + did, + } + + const result = await service.deactivate(mockAgentContext as AgentContext, options) + + expect(result.didState.state).toBe('failed') + if (result.didState.state === 'failed') + expect(result.didState.reason).toBe('Did not found') + }) + + it('should handle error and return failed state', async () => { + mockLedgerService.resolveDid.mockRejectedValue(new Error('Deactivate failed')) + + const options = { + did, + } + + const result = await service.deactivate(mockAgentContext as AgentContext, options) + + expect(mockAgentContext.config.logger.error).toHaveBeenCalledWith('Error deactivate DID', expect.any(Error)) + expect(result.didState.state).toBe('failed') + if (result.didState.state === 'failed') + expect(result.didState.reason).toBe('Unable deactivating DID: Deactivate failed') + }) + }) + + describe('concatKeys (private method)', () => { + it('should concatenate keys without duplicates based on relativeKeyId', () => { + const keys1 = [ + { didDocumentRelativeKeyId: 'key1' }, + { didDocumentRelativeKeyId: 'key2' }, + ] as DidDocumentKey[] + + const keys2 = [ + { didDocumentRelativeKeyId: 'key2' }, + { didDocumentRelativeKeyId: 'key3' }, + ] as DidDocumentKey[] + + const result = (service as any).concatKeys(keys1, keys2) + + expect(result).toHaveLength(3) + expect(result).toEqual(expect.arrayContaining([ + { didDocumentRelativeKeyId: 'key1' }, + { didDocumentRelativeKeyId: 'key2' }, + { didDocumentRelativeKeyId: 'key3' }, + ])) + }) + + it('should handle undefined arguments and return empty array', () => { + const result = (service as any).concatKeys(undefined, undefined) + expect(result).toEqual([]) + }) + }) +}) diff --git a/packages/hedera/tests/unit/hedera-did-resolver.test.ts b/packages/hedera/tests/unit/hedera-did-resolver.test.ts new file mode 100644 index 0000000000..0985400da5 --- /dev/null +++ b/packages/hedera/tests/unit/hedera-did-resolver.test.ts @@ -0,0 +1,80 @@ +import { JsonTransformer, DidDocument } from '@credo-ts/core' +import {HederaLedgerService} from "../../src/ledger/HederaLedgerService"; +import { HederaDidResolver } from '@credo-ts/hedera'; + +describe('HederaDidResolver', () => { + let resolver: HederaDidResolver + let mockAgentContext: any + let mockLedgerService: any + + beforeEach(() => { + const mockLogger = { + trace: jest.fn(), + debug: jest.fn(), + } + + mockLedgerService = { + resolveDid: jest.fn(), + } + + mockAgentContext = { + config: { logger: mockLogger }, + dependencyManager: { + resolve: jest.fn().mockReturnValue(mockLedgerService), + }, + } + + resolver = new HederaDidResolver() + }) + + it('should successfully resolve DID', async () => { + const did = 'did:hedera:123' + const fakeDidDocument = { id: did } + const resolveDidResult = { + didDocument: { id: did }, + didDocumentMetadata: { meta: 'meta' }, + didResolutionMetadata: { resMeta: 'resMeta' }, + } + + mockLedgerService.resolveDid.mockResolvedValue(resolveDidResult) + + jest.spyOn(JsonTransformer, 'fromJSON').mockReturnValue(fakeDidDocument as unknown as DidDocument) + + const result = await resolver.resolve(mockAgentContext, did, {} as any, {} as any) + + expect(mockAgentContext.config.logger.trace).toHaveBeenCalledWith('Try to resolve a did document from ledger') + expect(mockAgentContext.dependencyManager.resolve).toHaveBeenCalledWith(HederaLedgerService) + expect(mockLedgerService.resolveDid).toHaveBeenCalledWith(mockAgentContext, did) + expect(JsonTransformer.fromJSON).toHaveBeenCalledWith(resolveDidResult.didDocument, DidDocument) + + expect(result).toEqual({ + didDocument: fakeDidDocument, + didDocumentMetadata: resolveDidResult.didDocumentMetadata, + didResolutionMetadata: resolveDidResult.didResolutionMetadata, + }) + }) + + it('should handle error and return notFound', async () => { + const did = 'did:hedera:bad' + const error = new Error('Some error') + + mockLedgerService.resolveDid.mockRejectedValue(error) + + const result = await resolver.resolve(mockAgentContext, did, {} as any, {} as any) + + expect(mockAgentContext.config.logger.trace).toHaveBeenCalledWith('Try to resolve a did document from ledger') + expect(mockAgentContext.config.logger.debug).toHaveBeenCalledWith('Error resolving the did', { + error, + did, + }) + + expect(result).toEqual({ + didDocument: null, + didDocumentMetadata: {}, + didResolutionMetadata: { + error: 'notFound', + message: `Unable to resolve did '${did}': ${error}`, + }, + }) + }) +}) diff --git a/packages/hedera/tests/unit/hedera-ledger-service.test.ts b/packages/hedera/tests/unit/hedera-ledger-service.test.ts new file mode 100644 index 0000000000..494e6bf5bb --- /dev/null +++ b/packages/hedera/tests/unit/hedera-ledger-service.test.ts @@ -0,0 +1,512 @@ +import { type DidDocument } from '@credo-ts/core' +import { + AgentContext, + DependencyManager, +} from '@credo-ts/core' +import { DidDocumentKey, Kms } from '@credo-ts/core' +import {KmsJwkPublicOkp} from "@credo-ts/core/src/modules/kms"; +import { + RegisterCredentialDefinitionOptions, + RegisterRevocationRegistryDefinitionOptions, + RegisterRevocationStatusListOptions, RegisterSchemaOptions +} from "@credo-ts/anoncreds"; +import {HederaDidCreateOptions, HederaLedgerService} from '../../src/ledger/HederaLedgerService' +import {Client} from "@hashgraph/sdk"; + +jest.mock('@hiero-did-sdk/registrar', () => ({ + DIDUpdateBuilder: jest.fn().mockReturnValue({ + addService: jest.fn().mockReturnThis(), + removeService: jest.fn().mockReturnThis(), + addVerificationMethod: jest.fn().mockReturnThis(), + removeVerificationMethod: jest.fn().mockReturnThis(), + addAssertionMethod: jest.fn().mockReturnThis(), + removeAssertionMethod: jest.fn().mockReturnThis(), + addAuthenticationMethod: jest.fn().mockReturnThis(), + removeAuthenticationMethod: jest.fn().mockReturnThis(), + addCapabilityDelegationMethod: jest.fn().mockReturnThis(), + removeCapabilityDelegationMethod: jest.fn().mockReturnThis(), + addCapabilityInvocationMethod: jest.fn().mockReturnThis(), + removeCapabilityInvocationMethod: jest.fn().mockReturnThis(), + addKeyAgreementMethod: jest.fn().mockReturnThis(), + removeKeyAgreementMethod: jest.fn().mockReturnThis(), + build: jest.fn() + }), + generateCreateDIDRequest: jest.fn(), + submitCreateDIDRequest: jest.fn(), + generateUpdateDIDRequest: jest.fn(), + submitUpdateDIDRequest: jest.fn(), + generateDeactivateDIDRequest: jest.fn(), + submitDeactivateDIDRequest: jest.fn() +})) + +import { + DIDUpdateBuilder, + generateCreateDIDRequest, + generateDeactivateDIDRequest, + generateUpdateDIDRequest, + submitCreateDIDRequest, + submitDeactivateDIDRequest, + submitUpdateDIDRequest, +} from '@hiero-did-sdk/registrar' + +jest.mock('@hiero-did-sdk/resolver', () => ({ + resolveDID: jest.fn(), + TopicReaderHederaHcs: jest.fn() +})) + +import { resolveDID } from '@hiero-did-sdk/resolver' + +jest.mock('@hiero-did-sdk/core', () => ({ + parseDID: jest.fn(), +})) + +import {DID_ROOT_KEY_ID, parseDID, Publisher} from '@hiero-did-sdk/core' + +jest.mock('../../src/ledger/utils') + +import { createOrGetKey } from '../../src/ledger/utils' + +describe('HederaLedgerService', () => { + let service: HederaLedgerService + let mockAgentContext: Partial + let mockKms: jest.Mocked + let mockedCreateOrGetKey: jest.MockedFunction + let mockedParseDID: jest.MockedFunction + let mockedGenerateDeactivateDIDRequest: jest.MockedFunction + let builder: DIDUpdateBuilder + + beforeEach(() => { + jest.clearAllMocks() + + mockedCreateOrGetKey = createOrGetKey as jest.MockedFunction + mockedParseDID = parseDID as jest.MockedFunction + mockedGenerateDeactivateDIDRequest = generateDeactivateDIDRequest as jest.MockedFunction + + builder = new DIDUpdateBuilder() + + mockKms = { + sign: jest.fn(), + } as unknown as jest.Mocked + + mockAgentContext = { + dependencyManager: { + resolve: jest.fn().mockReturnValue(mockKms), + } as unknown as DependencyManager, + } + + const mockCache = { + get: jest.fn().mockResolvedValue(null), + set: jest.fn().mockResolvedValue(undefined), + remove: jest.fn().mockResolvedValue(undefined), + clear: jest.fn(), + cleanupExpired: jest.fn() + } + + service = new HederaLedgerService({ + options: { + networks: [ + { + network: 'testnet', + operatorId: '1', + operatorKey: '2', + }, + ], + cache: mockCache, + }, + }) + + jest.spyOn(service['clientService'], 'withClient').mockImplementation(async (props, operation) => { + const mockClient = {} as Client; + return operation(mockClient); + }); + }) + + describe('resolveDid', () => { + it('should calls resolveDID with proper args and returns result', async () => { + const did = 'did:hedera:test'; + + const mockResolution = { didDocument: { id: did } }; + + (resolveDID as jest.Mock).mockResolvedValue(mockResolution) + + const result = await service.resolveDid(mockAgentContext as AgentContext, did) + + expect(resolveDID).toHaveBeenCalledWith( + did, + 'application/ld+json;profile="https://w3id.org/did-resolution"', + expect.any(Object) + ) + expect(result).toBe(mockResolution) + }) + }) + + describe('createDid', () => { + it('should creates DID without didDocument', async () => { + const keyId = 'key123' + const publicJwk: KmsJwkPublicOkp & { crv: 'Ed25519' } = { crv: 'Ed25519', kty: 'OKP', x: 'abc' } + const props: HederaDidCreateOptions = { + method: 'hedera', + options: { network: 'testnet' }, + secret: { rootKeyId: keyId, keys: [] }, + }; + + mockedCreateOrGetKey.mockResolvedValue({ keyId, publicJwk }); + + (generateCreateDIDRequest as jest.Mock).mockResolvedValue({ state: {}, signingRequest: { serializedPayload: new Uint8Array() } }); + + (submitCreateDIDRequest as jest.Mock).mockResolvedValue({ did: 'did:hedera:1234' }); + + jest.spyOn(service as any, 'getPublisher').mockResolvedValue({} as Publisher) + + mockKms.sign.mockResolvedValue({ signature: new Uint8Array([1, 2, 3]) }); + + const result = await service.createDid(mockAgentContext as AgentContext, props as any) + expect(createOrGetKey).toHaveBeenCalledWith(mockKms, keyId) + expect(generateCreateDIDRequest).toHaveBeenCalled() + expect(submitCreateDIDRequest).toHaveBeenCalled() + expect(result.did).toBe('did:hedera:1234') + expect(result.rootKey).toBeDefined() + }) + + it('should creates DID with didDocument and calls updateDid', async () => { + const keyId = 'key123' + const publicJwk: KmsJwkPublicOkp & { crv: 'Ed25519' } = { crv: 'Ed25519', kty: 'OKP', x: 'abc' } + const didDocument = { controller: 'did:hedera:controller' } + const props = { + method: 'hedera', + options: { network: 'testnet' }, + secret: { rootKeyId: keyId, keys: [] }, + didDocument, + }; + + mockedCreateOrGetKey.mockResolvedValue({ keyId, publicJwk }); + + (generateCreateDIDRequest as jest.Mock).mockResolvedValue({ state: {}, signingRequest: { serializedPayload: new Uint8Array() } }); + + (submitCreateDIDRequest as jest.Mock).mockResolvedValue({ did: 'did:hedera:1234' }); + + const updateDidSpy = jest.spyOn(service, 'updateDid').mockResolvedValue({ did: 'did:hedera:1234', someProp: true } as any); + + jest.spyOn(service as any, 'getPublisher').mockResolvedValue({} as Publisher); + + mockKms.sign.mockResolvedValue({ signature: new Uint8Array([1, 2, 3]) }) + + const result = await service.createDid(mockAgentContext as AgentContext, props as any) + expect(updateDidSpy).toHaveBeenCalled() + expect(result.rootKey).toBeDefined() + }) + }) + + describe('updateDid', () => { + const did = 'did:hedera:1234' + const kmsKeyId = 'key-id' + + it('should throws error if didDocumentOperation is missing', async () => { + await expect(service.updateDid(mockAgentContext as AgentContext, { did } as any)).rejects.toThrow( + 'DidDocumentOperation is required' + ) + }) + + it('should throws error if rootKey missing', async () => { + const keys: DidDocumentKey[] = [] + await expect( + service.updateDid(mockAgentContext as AgentContext, { + did, + didDocumentOperation: 'setDidDocument', + secret: { keys }, + didDocument: {}, + }) + ).rejects.toThrow('The root key not found in the KMS') + }) + + it('should calls correct builder methods for each field and action', () => { + const spies = { + addService: jest.spyOn(builder, 'addService'), + removeService: jest.spyOn(builder, 'removeService'), + addVerificationMethod: jest.spyOn(builder, 'addVerificationMethod'), + removeVerificationMethod: jest.spyOn(builder, 'removeVerificationMethod'), + addAssertionMethod: jest.spyOn(builder, 'addAssertionMethod'), + removeAssertionMethod: jest.spyOn(builder, 'removeAssertionMethod'), + addAuthenticationMethod: jest.spyOn(builder, 'addAuthenticationMethod'), + removeAuthenticationMethod: jest.spyOn(builder, 'removeAuthenticationMethod'), + addCapabilityDelegationMethod: jest.spyOn(builder, 'addCapabilityDelegationMethod'), + removeCapabilityDelegationMethod: jest.spyOn(builder, 'removeCapabilityDelegationMethod'), + addCapabilityInvocationMethod: jest.spyOn(builder, 'addCapabilityInvocationMethod'), + removeCapabilityInvocationMethod: jest.spyOn(builder, 'removeCapabilityInvocationMethod'), + addKeyAgreementMethod: jest.spyOn(builder, 'addKeyAgreementMethod'), + removeKeyAgreementMethod: jest.spyOn(builder, 'removeKeyAgreementMethod'), + } + + const testCases: [string, 'add' | 'remove', string, jest.SpyInstance][] = [ + ['service', 'add', 'service-item', spies.addService], + ['service', 'remove', 'service-id', spies.removeService], + + ['verificationMethod', 'add', 'verificationMethod-item', spies.addVerificationMethod], + ['verificationMethod', 'remove', 'verificationMethod-id', spies.removeVerificationMethod], + + ['assertionMethod', 'add', 'assertionMethod-item', spies.addAssertionMethod], + ['assertionMethod', 'remove', 'assertionMethod-id', spies.removeAssertionMethod], + + ['authentication', 'add', 'authentication-item', spies.addAuthenticationMethod], + ['authentication', 'remove', 'authentication-id', spies.removeAuthenticationMethod], + + ['capabilityDelegation', 'add', 'capabilityDelegation-item', spies.addCapabilityDelegationMethod], + ['capabilityDelegation', 'remove', 'capabilityDelegation-id', spies.removeCapabilityDelegationMethod], + + ['capabilityInvocation', 'add', 'capabilityInvocation-item', spies.addCapabilityInvocationMethod], + ['capabilityInvocation', 'remove', 'capabilityInvocation-id', spies.removeCapabilityInvocationMethod], + + ['keyAgreement', 'add', 'keyAgreement-item', spies.addKeyAgreementMethod], + ['keyAgreement', 'remove', 'keyAgreement-id', spies.removeKeyAgreementMethod], + ] + + for (const [field, action, param, spy] of testCases) { + jest.clearAllMocks() + + const fn = (service as any).getUpdateMethod(builder, field, action) + + const result = fn(param) + + expect(result).toBe(builder) + expect(spy).toHaveBeenCalledTimes(1) + expect(spy).toHaveBeenCalledWith(param) + for (const otherSpy of Object.values(spies)) { + if (otherSpy !== spy) expect(otherSpy).not.toHaveBeenCalled() + } + } + }) + + it('should returns builder unchanged for unknown field', () => { + const unknownField = 'unknownField' + const fn = (service as any).getUpdateMethod(builder, unknownField, 'add') + const result = fn('any param') + expect(result).toBe(builder) + }) + + it('should performs update flow successfully', async () => { + const keys: DidDocumentKey[] = [{ kmsKeyId, didDocumentRelativeKeyId: DID_ROOT_KEY_ID }, { kmsKeyId: 'some-key', didDocumentRelativeKeyId: '#abc' }]; + + const didDocument: Partial = { + verificationMethod: [{ + id: '#abc', + type: 'hedera', + controller: 'test' + }], + } + const currentDidDoc = { verificationMethod: [{ id: '#abc' }] } + const mockDidResolution = { didDocument: currentDidDoc } + + const updatesMock = { build: jest.fn().mockReturnValue(didDocument) } as any + + mockedParseDID.mockReturnValue({ + network: 'testnet', + method: 'hedera', + publicKey: '', + topicId: '' + }); + + (resolveDID as jest.Mock).mockResolvedValue(mockDidResolution); + + jest.spyOn(service as any, 'prepareDidUpdates').mockReturnValue(updatesMock); + + jest.spyOn(service as any, 'getPublisher').mockResolvedValue({} as Publisher); + + (generateUpdateDIDRequest as jest.Mock).mockResolvedValue({ states: {}, signingRequests: {} }); + + jest.spyOn(service as any, 'signRequests').mockResolvedValue(Promise.resolve()); + + (submitUpdateDIDRequest as jest.Mock).mockResolvedValue({ did: did }) + + await expect( + service.updateDid(mockAgentContext as AgentContext, { + did, + didDocumentOperation: 'setDidDocument', + didDocument, + secret: { keys }, + }) + ).resolves.toHaveProperty('did', did) + + expect((service as any).prepareDidUpdates).toHaveBeenCalled() + expect(generateUpdateDIDRequest).toHaveBeenCalled() + expect(submitUpdateDIDRequest).toHaveBeenCalled() + }) + }) + + describe('deactivateDid', () => { + const did = 'did:hedera:5678' + const kmsKeyId = 'key-id' + + it('should throws error if rootKey is missing', async () => { + await expect( + service.deactivateDid(mockAgentContext as AgentContext, { did, secret: { keys: [] } } as any) + ).rejects.toThrow('The root key not found in the KMS') + }) + + it('should throws an error if root key is not found in deactivateDid', async () => { + const props = { + did: 'did:hedera:123', + secret: { + keys: [], + }, + } + + // @ts-ignore + mockAgentContext.dependencyManager.resolve.mockReturnValue({ sign: jest.fn() }) + + await expect(service.deactivateDid(mockAgentContext as AgentContext, props)) + .rejects.toThrow('The root key not found in the KMS') + }) + + it('should deactivates DID successfully', async () => { + const keys: DidDocumentKey[] = [{ kmsKeyId, didDocumentRelativeKeyId: DID_ROOT_KEY_ID }] + const mockPublisher = {} + const mockState = {} + const mockSigningRequest = { serializedPayload: new Uint8Array() } + const signature = new Uint8Array([1, 2, 3]); + + (parseDID as jest.Mock).mockReturnValue({ network: 'testnet' }); + + jest.spyOn(service as any, 'getPublisher').mockResolvedValue(mockPublisher) + + // @ts-ignore + mockedGenerateDeactivateDIDRequest.mockResolvedValue({ state: mockState, signingRequest: mockSigningRequest }); + + mockKms.sign.mockResolvedValue({ signature }); + + (submitDeactivateDIDRequest as jest.Mock).mockResolvedValue({ did }) + + const result = await service.deactivateDid( + mockAgentContext as AgentContext, + { + did, + secret: { keys }, + } as any + ) + + expect(result).toHaveProperty('did', did) + expect(mockKms.sign).toHaveBeenCalledWith({ + keyId: kmsKeyId, + data: mockSigningRequest.serializedPayload, + algorithm: 'EdDSA', + }) + }) + }) + + describe('Anoncreds SDK methods', () => { + let mockSdk: any + + beforeEach(() => { + mockSdk = { + getSchema: jest.fn().mockResolvedValue('schema'), + registerSchema: jest.fn().mockResolvedValue('registerSchema'), + getCredentialDefinition: jest.fn().mockResolvedValue('credDef'), + registerCredentialDefinition: jest.fn().mockResolvedValue('registerCredDef'), + getRevocationRegistryDefinition: jest.fn().mockResolvedValue('revRegDef'), + registerRevocationRegistryDefinition: jest.fn().mockResolvedValue('registerRevRegDef'), + getRevocationStatusList: jest.fn().mockResolvedValue('revStatusList'), + registerRevocationStatusList: jest.fn().mockResolvedValue('registerRevStatus'), + } + jest.spyOn(service as any, 'getHederaAnonCredsSdk').mockReturnValue(mockSdk) + }) + + it('getSchema', async () => { + const result = await service.getSchema(mockAgentContext as AgentContext, 'schemaId') + expect(mockSdk.getSchema).toHaveBeenCalledWith('schemaId') + expect(result).toBe('schema') + }) + + it('registerSchema', async () => { + const options: RegisterSchemaOptions = { + schema: { + issuerId: '', + name: '', + version: '', + attrNames: [] + }, + options: {} + } + const result = await service.registerSchema(mockAgentContext as AgentContext, options) + expect(mockSdk.registerSchema).toHaveBeenCalledWith(options) + expect(result).toBe('registerSchema') + }) + + it('getCredentialDefinition', async () => { + const result = await service.getCredentialDefinition(mockAgentContext as AgentContext, 'credDefId') + expect(mockSdk.getCredentialDefinition).toHaveBeenCalledWith('credDefId') + expect(result).toBe('credDef') + }) + + it('registerCredentialDefinition', async () => { + const options: RegisterCredentialDefinitionOptions = { + options: {supportRevocation: true}, + credentialDefinition: { + issuerId: '', + schemaId: '', + type: 'CL', + tag: '', + value: { + primary: {}, + revocation: undefined + } + } + } + await service.registerCredentialDefinition(mockAgentContext as AgentContext, options) + expect(mockSdk.registerCredentialDefinition).toHaveBeenCalledWith({ + ...options, + options: { supportRevocation: true }, + }) + }) + + it('getRevocationRegistryDefinition', async () => { + const result = await service.getRevocationRegistryDefinition(mockAgentContext as AgentContext, 'revRegDefId') + expect(mockSdk.getRevocationRegistryDefinition).toHaveBeenCalledWith('revRegDefId') + expect(result).toBe('revRegDef') + }) + + it('registerRevocationRegistryDefinition', async () => { + const options: RegisterRevocationRegistryDefinitionOptions = { + revocationRegistryDefinition: { + issuerId: '', + revocDefType: 'CL_ACCUM', + credDefId: '', + tag: '', + value: { + publicKeys: { + accumKey: { + z: '' + } + }, + maxCredNum: 0, + tailsLocation: '', + tailsHash: '' + } + }, + options: {} + } + const result = await service.registerRevocationRegistryDefinition(mockAgentContext as AgentContext, options) + expect(mockSdk.registerRevocationRegistryDefinition).toHaveBeenCalledWith(options) + expect(result).toBe('registerRevRegDef') + }) + + it('getRevocationStatusList', async () => { + const result = await service.getRevocationStatusList(mockAgentContext as AgentContext, 'revRegId', 12345) + expect(mockSdk.getRevocationStatusList).toHaveBeenCalledWith('revRegId', 12345) + expect(result).toBe('revStatusList') + }) + + it('registerRevocationStatusList', async () => { + const options: RegisterRevocationStatusListOptions = { + options: {}, + revocationStatusList: { + revRegDefId: '', + issuerId: '', + revocationList: [], + currentAccumulator: '' + } + } + const result = await service.registerRevocationStatusList(mockAgentContext as AgentContext, options) + expect(mockSdk.registerRevocationStatusList).toHaveBeenCalledWith(options) + expect(result).toBe('registerRevStatus') + }) + }) +}) diff --git a/packages/hedera/tests/unit/kms-publisher.test.ts b/packages/hedera/tests/unit/kms-publisher.test.ts new file mode 100644 index 0000000000..1a6f44d2d6 --- /dev/null +++ b/packages/hedera/tests/unit/kms-publisher.test.ts @@ -0,0 +1,132 @@ +import { KeysUtility } from '@hiero-did-sdk/core' +import { Kms, TypedArrayEncoder} from '@credo-ts/core' +import { KmsPublisher } from "../../src/ledger/publisher/KmsPublisher"; +import { KmsJwkPublicOkp} from "@credo-ts/core/src/modules/kms"; + +jest.mock('@hiero-did-sdk/core', () => ({ + KeysUtility: { + fromBytes: jest.fn(), + }, + DIDError: class DIDError extends Error {} + +})) + +jest.mock('@credo-ts/core', () => ({ + TypedArrayEncoder: { + fromBase64: jest.fn(), + }, + Kms: { + KeyManagementApi: jest.fn().mockImplementation(() => ({})), + }, +})) + +jest.mock('../../src/ledger/utils', () => ({ + createOrGetKey: jest.fn(), +})) + +import {createOrGetKey} from "../../src/ledger/utils"; + +jest.mock('@hiero-did-sdk/publisher-internal', () => { + return { + Publisher: jest.fn(), + } +}); + +describe('KmsPublisher', () => { + const mockClient = { + freezeWith: jest.fn(), + signWith: jest.fn(), + execute: jest.fn(), + operator: { + accountId: '0.0.1234', + publicKey: {} + }, + } + + const mockFrozenTransaction = { + signWith: jest.fn(), + } + + const mockResponse = { + getReceipt: jest.fn(), + } + + const signMock = jest.fn().mockResolvedValue({ signature: 'signature-bytes' }) + + const kmsMock = { + sign: signMock + } + + const agentContext = { + dependencyManager: { + resolve: jest.fn().mockImplementation((key) => { + if (key === Kms.KeyManagementApi) { + return kmsMock + } + throw new Error(`Unexpected dependency: ${key}`) + }) + } + } + + const keyId = 'test-key-id' + const base64X = 'base64-x' + const publicJwk: KmsJwkPublicOkp & { crv: 'Ed25519' } = { x: base64X, crv: 'Ed25519', kty: 'OKP' } + const key: { keyId: string; publicJwk: KmsJwkPublicOkp & { crv: 'Ed25519' } } = { keyId, publicJwk } + + const mockPublicKey = { + toPublicKey: jest.fn(), + } + + const fakePublicKey = {} + + beforeEach(() => { + jest.clearAllMocks() + + ;(TypedArrayEncoder.fromBase64 as jest.Mock).mockReturnValue(new Uint8Array([1, 2, 3])) + + ;(KeysUtility.fromBytes as jest.Mock).mockReturnValue(mockPublicKey) + mockPublicKey.toPublicKey.mockReturnValue(fakePublicKey) + + mockClient.freezeWith.mockReturnValue(mockFrozenTransaction) + + mockFrozenTransaction.signWith.mockImplementation(async (_publicKey, signCallback) => { + const signature = await signCallback(new Uint8Array([4, 5, 6])) + expect(signature).toBe('signature-bytes') + return + }) + + mockClient.execute.mockResolvedValue(mockResponse) + + mockResponse.getReceipt.mockResolvedValue('receipt-object') + }) + + it('should correctly create an instance via constructor', () => { + const publisher = new KmsPublisher(agentContext as any, mockClient as any, key) + expect(agentContext.dependencyManager.resolve).toHaveBeenCalledWith(expect.anything()) + expect(publisher.publicKey()).toBe(fakePublicKey) + }) + + it('should correctly update key in setKeyId', async () => { + (createOrGetKey as jest.Mock).mockResolvedValue({ + publicJwk: { x: base64X, crv: 'Ed25519' }, + }) + + const publisher = new KmsPublisher(agentContext as any, mockClient as any, key) + await publisher.setKeyId('new-key-id') + + expect(createOrGetKey).toHaveBeenCalledWith(kmsMock, 'new-key-id') + expect(KeysUtility.fromBytes).toHaveBeenCalledTimes(2) + }) + + it('should return correct publicKey', () => { + const publisher = new KmsPublisher(agentContext as any, mockClient as any, key) + expect(publisher.publicKey()).toBe(fakePublicKey) + }) + + it('should throw error in publish if key is not set', async () => { + const publisher = new KmsPublisher(agentContext as any, mockClient as any, key) + ;(publisher as any).submitPublicKey = undefined + + await expect(publisher.publish({} as any)).rejects.toThrow('Need to setup the KeyId') + }) +}) diff --git a/packages/hedera/tests/unit/utils.test.ts b/packages/hedera/tests/unit/utils.test.ts new file mode 100644 index 0000000000..9ef6c20c6e --- /dev/null +++ b/packages/hedera/tests/unit/utils.test.ts @@ -0,0 +1,90 @@ +import { Kms } from '@credo-ts/core' +import type { KeyManagementApi, KmsJwkPublicOkp, KmsJwkPublicRsa } from '@credo-ts/core/src/modules/kms' +import { createOrGetKey, getMultibasePublicKey } from '../../src/ledger/utils' + +describe('getMultibasePublicKey', () => { + it('should return a base58 key string prefixed with "z"', () => { + const base64X = 'dGVzdGtleQ==' // base64 for 'testkey' + const publicJwk = { + crv: 'Ed25519', + x: base64X, + } + // Expect base64 'dGVzdGtleQ==' to be decoded into Uint8Array + // and then encoded into base58 string starting with 'z' + const multibaseKey = getMultibasePublicKey(publicJwk as KmsJwkPublicOkp & { crv: 'Ed25519' }) + expect(multibaseKey.startsWith('z')).toBe(true) + expect(typeof multibaseKey).toBe('string') + }) +}) + +describe('createOrGetKey', () => { + let kmsMock: jest.Mocked + + beforeEach(() => { + kmsMock = { + createKey: jest.fn(), + getPublicKey: jest.fn(), + } as unknown as jest.Mocked + }) + + it('should creates a key if keyId is not provided', async () => { + const fakeKeyId = 'key123' + const fakeJwk: KmsJwkPublicOkp & { kid: string } = { kty: 'OKP', crv: 'Ed25519', x: 'xxx', kid: 'key123' } + kmsMock.createKey.mockResolvedValue({ + keyId: fakeKeyId, + publicJwk: fakeJwk, + }) + + const result = await createOrGetKey(kmsMock, undefined) + // Check that createKey was called with correct parameters + expect(kmsMock.createKey).toHaveBeenCalledWith({ type: { crv: 'Ed25519', kty: 'OKP' } }) + // Check the returned result matches the mocked createKey response + expect(result).toEqual({ + keyId: fakeKeyId, + publicJwk: fakeJwk, + }) + }) + + it('should retrieves an existing key if keyId is provided', async () => { + const keyId = 'key456' + const publicJwk: KmsJwkPublicOkp & { kid: string } = { kty: 'OKP', crv: 'Ed25519', x: 'xxx', kid: 'key123' } + kmsMock.getPublicKey.mockResolvedValue(publicJwk) + + const result = await createOrGetKey(kmsMock, keyId) + // Check that getPublicKey was called with the given keyId + expect(kmsMock.getPublicKey).toHaveBeenCalledWith({ keyId }) + // Check the returned keyId and publicJwk match the mocked response + expect(result).toEqual({ + keyId, + publicJwk: { + ...publicJwk, + crv: publicJwk.crv, + }, + }) + }) + + it('should throws an error if key with given keyId is not found', async () => { + // @ts-ignore + kmsMock.getPublicKey.mockResolvedValue(null) + + // Expect the function to throw an error for missing key + await expect(createOrGetKey(kmsMock, 'notfound')).rejects.toThrowError("Key with key id 'notfound' not found") + }) + + it('should throws an error if key has unsupported kty or crv', async () => { + const keyId = 'badkey' + const badJwk: KmsJwkPublicRsa & { kid: string } = { e: '', kid: 'key-1', n: '', kty: 'RSA' } + + kmsMock.getPublicKey.mockResolvedValue(badJwk) + + // Mock Kms.getJwkHumanDescription to control error message output + const spyDesc = jest.spyOn(Kms, 'getJwkHumanDescription').mockReturnValue('unsupported key type') + + // Expect an error indicating unsupported key type or curve + await expect(createOrGetKey(kmsMock, keyId)).rejects.toThrow( + `Key with key id '${keyId}' uses unsupported unsupported key type for did:hedera` + ) + + spyDesc.mockRestore() + }) +}) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ca03cd9ac2..d9f8013ba7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,6 +8,11 @@ overrides: '@types/node': 18.18.8 undici: ^6.20.1 +patchedDependencies: + '@2060.io/ffi-napi@4.0.9': + hash: 6ujtm5ladmp54sbez4f5d2uhca + path: patches/@2060.io__ffi-napi@4.0.9.patch + importers: .: @@ -607,26 +612,26 @@ importers: specifier: ^2.66.0 version: 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) '@hiero-did-sdk/anoncreds': - specifier: 0.0.12 - version: 0.0.12(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) + specifier: 0.1.0 + version: 0.1.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) '@hiero-did-sdk/client': - specifier: 0.0.5 - version: 0.0.5(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + specifier: 0.1.0 + version: 0.1.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) '@hiero-did-sdk/core': - specifier: 0.0.7 - version: 0.0.7(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + specifier: 0.1.0 + version: 0.1.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) '@hiero-did-sdk/hcs': - specifier: 0.0.16 - version: 0.0.16(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) + specifier: 0.1.0 + version: 0.1.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) '@hiero-did-sdk/publisher-internal': - specifier: 0.0.3 - version: 0.0.3(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + specifier: 0.1.0 + version: 0.1.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) '@hiero-did-sdk/registrar': - specifier: 0.0.9 - version: 0.0.9(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) + specifier: 0.1.0 + version: 0.1.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) '@hiero-did-sdk/resolver': - specifier: 0.0.11 - version: 0.0.11(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) + specifier: 0.1.0 + version: 0.1.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) devDependencies: '@credo-ts/node': specifier: workspace:* @@ -637,6 +642,9 @@ importers: rimraf: specifier: ^4.4.0 version: 4.4.1 + zstd-napi: + specifier: ^0.0.10 + version: 0.0.10 packages/indy-sdk-to-askar-migration: dependencies: @@ -704,7 +712,7 @@ importers: dependencies: '@2060.io/ffi-napi': specifier: ^4.0.9 - version: 4.0.9 + version: 4.0.9(patch_hash=6ujtm5ladmp54sbez4f5d2uhca) '@2060.io/ref-napi': specifier: ^3.0.6 version: 3.0.6 @@ -1986,9 +1994,6 @@ packages: '@cosmjs/utils@0.33.1': resolution: {integrity: sha512-UnLHDY6KMmC+UXf3Ufyh+onE19xzEXjT4VZ504Acmk4PXxqyvG4cCPprlKUFnGUX7f0z8Or9MAOHXBx41uHBcg==} - '@craftzdog/react-native-buffer@6.1.0': - resolution: {integrity: sha512-lJXdjZ7fTllLbzDrwg/FrJLjQ5sBcAgwcqgAB6OPpXTHdCenEhHZblQpfmBLLe7/S7m0yKXL3kN3jpwOEkpjGg==} - '@cspotcode/source-map-support@0.8.1': resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} @@ -2394,55 +2399,61 @@ packages: peerDependencies: bn.js: ^5.2.1 - '@hiero-did-sdk/anoncreds@0.0.12': - resolution: {integrity: sha1-LQ/oQqY+SuCDVhvkOC7/wTOt6tc=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/anoncreds/-/@hiero-did-sdk/anoncreds-0.0.12.tgz} + '@hiero-did-sdk/anoncreds@0.1.0': + resolution: {integrity: sha512-9+DPsjICXUiQrM5+kSDvV9DMSGfuh/xyo21kFBe8Tm9f7khbCz9tPLRKIiK9OfanZB0hWG6htBS+cwCb7SrLDw==} + engines: {node: '>=20'} - '@hiero-did-sdk/cache@0.0.4': - resolution: {integrity: sha1-TzZZdokp18doe76X2PZ6+P/NysQ=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/cache/-/@hiero-did-sdk/cache-0.0.4.tgz} + '@hiero-did-sdk/cache@0.1.0': + resolution: {integrity: sha512-JK58CiMDoezher6exIMAO+YKFi4mFwRdY6PD1RCB36+A8OAkOk1Od3qUKm27rv4pXEh16lY/DKB/xse8b009iQ==} + engines: {node: '>=20'} - '@hiero-did-sdk/client@0.0.5': - resolution: {integrity: sha1-V44WHtnGFC9h+6RBsIhlqxhFOZ4=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/client/-/@hiero-did-sdk/client-0.0.5.tgz} + '@hiero-did-sdk/client@0.1.0': + resolution: {integrity: sha512-8EBsjVxxEZEdQKePenBCo1HXKRK/70p/XRgFPzWIplUE+2jbmfy7NGqx8tzihK0NlXpA17ojp4Pu5wZJONolmA==} + engines: {node: '>=20'} - '@hiero-did-sdk/core@0.0.7': - resolution: {integrity: sha1-y9F/uQDwxSEj9sFAwx2d/OP1gSY=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/core/-/@hiero-did-sdk/core-0.0.7.tgz} + '@hiero-did-sdk/core@0.1.0': + resolution: {integrity: sha512-qbV74xqRQBnTMpm7MGlEcqBHbiHD0+QagU698ZXKB/X3dz1Mf8kvmoZdaPPS+bIq7S6nJqf6u9xd+L0OKLgzbg==} engines: {node: '>=20'} - '@hiero-did-sdk/crypto@0.0.4': - resolution: {integrity: sha1-MIH9v7vfEeoP8CzCTRnhPa8wJjE=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/crypto/-/@hiero-did-sdk/crypto-0.0.4.tgz} + '@hiero-did-sdk/crypto@0.1.0': + resolution: {integrity: sha512-5wGuufZpcaDf3XYmX0CrCtGA9F9Zkitj+DjGVebVEJEOr9CiZeWWoJ/rS1zxOBPNWyZH3aWKG9vUqJ8RyOXiPg==} + engines: {node: '>=20'} - '@hiero-did-sdk/hcs@0.0.16': - resolution: {integrity: sha1-gSuhiRLyIlK8BvHOYlw83UBfTMY=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/hcs/-/@hiero-did-sdk/hcs-0.0.16.tgz} + '@hiero-did-sdk/hcs@0.1.0': + resolution: {integrity: sha512-Eb5pUrdXHcqNISN3kDZiQCFRKcMhrSyyuSMRrD1mYvUG2OGi5nleaUoR6xK2u0G/jJ8hrgytXuYONTim/6wJ+Q==} + engines: {node: '>=20'} - '@hiero-did-sdk/lifecycle@0.0.3': - resolution: {integrity: sha1-mFQM8PfroBFftvHMpylYUILmVJ0=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/lifecycle/-/@hiero-did-sdk/lifecycle-0.0.3.tgz} + '@hiero-did-sdk/lifecycle@0.1.0': + resolution: {integrity: sha512-j+pIqGFz7TVYZYM8R4FFHT+y859X5UPC7ZGLY7fDtEwsRGRlU6DllhO3octh4qyoJ9BkCJyU8omZjAKeq/WW4g==} engines: {node: '>=20'} - '@hiero-did-sdk/messages@0.0.3': - resolution: {integrity: sha1-ZJjbZE4sHpGa/fdYm4oepnk4j2E=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/messages/-/@hiero-did-sdk/messages-0.0.3.tgz} + '@hiero-did-sdk/messages@0.1.0': + resolution: {integrity: sha512-j5GRYzJc+Fp2/ILhOCsE62dJwK9efqCu8YbzIVR3o7hGx7HzAC1fbM73myQqBTrcpxQJkRktV8lCeEKK9nOYGw==} engines: {node: '>=20'} - '@hiero-did-sdk/publisher-internal@0.0.3': - resolution: {integrity: sha1-tPoQUe7qhjr5fN4e7rM7qcVK9bw=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/publisher-internal/-/@hiero-did-sdk/publisher-internal-0.0.3.tgz} + '@hiero-did-sdk/publisher-internal@0.1.0': + resolution: {integrity: sha512-lMBeltfo+NPqVik148h5VWwLrvDiXVYTJyKkaev9/JatTZlJELdYhtvWyBPPSvCikDFf8Td1QGe3wq/Jm4kbOA==} engines: {node: '>=20'} - '@hiero-did-sdk/registrar@0.0.9': - resolution: {integrity: sha1-ageDo6jfMlCFVaLoVRrJRadQGlE=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/registrar/-/@hiero-did-sdk/registrar-0.0.9.tgz} + '@hiero-did-sdk/registrar@0.1.0': + resolution: {integrity: sha512-zpRxQy24R+ZYxX6N4+VVxZwanxEfkCkcbzDncp8q4q/7Tru5bkAs+WghljiQS0CZPvSwP0iv21SsDEWjDtkKBw==} engines: {node: '>=20'} - '@hiero-did-sdk/resolver@0.0.11': - resolution: {integrity: sha1-6Tmi8PZIWy7NKCpIahJIig63SiI=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/resolver/-/@hiero-did-sdk/resolver-0.0.11.tgz} + '@hiero-did-sdk/resolver@0.1.0': + resolution: {integrity: sha512-/SVglErskv8qhBrcvgxHEgv6t1vwX0eJ3Q90QSTqhmnNIZCtjoI9yP/bo7MONBwsowY2DUCF18s5vT2/k2V3gQ==} engines: {node: '>=20'} - '@hiero-did-sdk/signer-internal@0.0.6': - resolution: {integrity: sha1-pgohdAEpmBvuvR+hvtPFqIoK1Yc=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/signer-internal/-/@hiero-did-sdk/signer-internal-0.0.6.tgz} + '@hiero-did-sdk/signer-internal@0.1.0': + resolution: {integrity: sha512-Z55sq1ExxtWZHzZcydQS4eg5G8w+nWx5uMQwAZrS92m6s9G1kg4z90tM321NQca6d9kFIjp59NYQA1inhxLf1w==} engines: {node: '>=20'} - '@hiero-did-sdk/verifier-internal@0.0.3': - resolution: {integrity: sha1-HLZK03ispkAwwQXLWakImaYbvNQ=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/verifier-internal/-/@hiero-did-sdk/verifier-internal-0.0.3.tgz} + '@hiero-did-sdk/verifier-internal@0.1.0': + resolution: {integrity: sha512-AyJz0HqbFO/mtY0t5Fpx7LBrRG5fI8tR5b0LVjhnDsvfCt3hOeLOoqnbv28x7Kljsyz+2ZJG3IPoawF5To5NGA==} engines: {node: '>=20'} - '@hiero-did-sdk/zstd@0.0.4': - resolution: {integrity: sha1-yJMI8dyfabe1xkjNdivcRmus9gE=, tarball: https://gitlab.dsr-corporation.com/api/v4/projects/1420/packages/npm/@hiero-did-sdk/zstd/-/@hiero-did-sdk/zstd-0.0.4.tgz} + '@hiero-did-sdk/zstd@0.1.0': + resolution: {integrity: sha512-Y5jNDMOR268rZJBgTdwg5KjZeXijYjfCdu55P5jhzWXkO3lKHdd5jJR46DLFWse+/WaS9Ev8pz2uX+bHium8tQ==} + engines: {node: '>=20'} '@hyperledger/anoncreds-nodejs@0.3.1': resolution: {integrity: sha512-/oWmWgcOPqjAtd2+dKASPYL84Qd7sAFyCBfEKM7PAgVbObaZUZc0kqA7hkEz/qyiqUvcP/JwKTc1v4zVZi6BTg==} @@ -3995,10 +4006,6 @@ packages: resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} engines: {node: '>=8'} - crypto@1.0.1: - resolution: {integrity: sha512-VxBKmeNcqQdiUQUW2Tzq0t377b54N2bMtXO/qiLa+6eRRmmC4qT3D4OnTGoT/U6O9aklQ/jTwbOtRMTTY8G0Ig==} - deprecated: This package is no longer supported. It's now a built-in Node module. If you've depended on crypto, you should switch to the one that's built-in. - d@1.0.2: resolution: {integrity: sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==} engines: {node: '>=0.12'} @@ -4992,10 +4999,6 @@ packages: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} - is-arguments@1.2.0: - resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==} - engines: {node: '>= 0.4'} - is-array-buffer@3.0.5: resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} engines: {node: '>= 0.4'} @@ -5853,6 +5856,7 @@ packages: metro-react-native-babel-preset@0.73.10: resolution: {integrity: sha512-1/dnH4EHwFb2RKEKx34vVDpUS3urt2WEeR8FYim+ogqALg4sTpG7yeQPxWpbgKATezt4rNfqAANpIyH19MS4BQ==} + deprecated: Use @react-native/babel-preset instead peerDependencies: '@babel/core': '*' @@ -6670,26 +6674,11 @@ packages: peerDependencies: react-native: '>=0.56' - react-native-quick-base64@2.2.0: - resolution: {integrity: sha512-r7/BRsRl8QKEhS0JsHW6QX9+8LrC6NNWlwNnBnZ69h2kbcfABYsUILT71obrs9fqElEIMzuYSI5aHID955akyQ==} - peerDependencies: - react: '*' - react-native: '*' - - react-native-quick-crypto@0.7.14: - resolution: {integrity: sha512-ePl0pNgw0TCl9sn9zVX6es58PHXIA6pdDm5+dHawypD+cacyvzfpAFEqYR6opFtnBff/HHtsQrS0zX0AAfwodQ==} - react-native-securerandom@0.1.1: resolution: {integrity: sha512-CozcCx0lpBLevxiXEb86kwLRalBCHNjiGPlw3P7Fi27U6ZLdfjOCNRHD1LtBKcvPvI3TvkBXB3GOtLvqaYJLGw==} peerDependencies: react-native: '*' - react-native-zstd@1.1.0: - resolution: {integrity: sha512-x/PBfWpUOfzP8oBVMj8SwjKJdYYhRx7LGh65A9kkrK1FprJlWWEt8MX8hZFgYfIkuRx1n4yRpeHEA+KM9PHtlQ==} - peerDependencies: - react: '*' - react-native: '*' - react-native@0.78.2: resolution: {integrity: sha512-UilZ8sP9amHCz7TTMWMJ71JeYcMzEdgCJaqTfoB1hC/nYMXq6xqSFxKWCDhf7sR7nz3FKxS4t338t42AMDDkww==} engines: {node: '>=18'} @@ -7630,9 +7619,6 @@ packages: util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - util@0.12.5: - resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} - utils-merge@1.0.1: resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} engines: {node: '>= 0.4.0'} @@ -7918,7 +7904,7 @@ packages: snapshots: - '@2060.io/ffi-napi@4.0.9': + '@2060.io/ffi-napi@4.0.9(patch_hash=6ujtm5ladmp54sbez4f5d2uhca)': dependencies: '@2060.io/ref-napi': 3.0.6 debug: 4.4.1 @@ -9379,14 +9365,6 @@ snapshots: '@cosmjs/utils@0.33.1': {} - '@craftzdog/react-native-buffer@6.1.0(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': - dependencies: - ieee754: 1.2.1 - react-native-quick-base64: 2.2.0(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) - transitivePeerDependencies: - - react - - react-native - '@cspotcode/source-map-support@0.8.1': dependencies: '@jridgewell/trace-mapping': 0.3.9 @@ -10091,25 +10069,26 @@ snapshots: - expo-crypto - react-native - '@hiero-did-sdk/anoncreds@0.0.12(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': + '@hiero-did-sdk/anoncreds@0.1.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': dependencies: - '@hiero-did-sdk/hcs': 0.0.16(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) - '@hiero-did-sdk/zstd': 0.0.4(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) + '@hiero-did-sdk/core': 0.1.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/hcs': 0.1.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/zstd': 0.1.0 + buffer: 6.0.3 transitivePeerDependencies: - bn.js - expo-crypto - - react - react-native - '@hiero-did-sdk/cache@0.0.4(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': + '@hiero-did-sdk/cache@0.1.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': dependencies: - '@hiero-did-sdk/core': 0.0.7(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/core': 0.1.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) transitivePeerDependencies: - bn.js - expo-crypto - react-native - '@hiero-did-sdk/client@0.0.5(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': + '@hiero-did-sdk/client@0.1.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': dependencies: '@hashgraph/sdk': 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) transitivePeerDependencies: @@ -10117,7 +10096,7 @@ snapshots: - expo-crypto - react-native - '@hiero-did-sdk/core@0.0.7(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': + '@hiero-did-sdk/core@0.1.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': dependencies: '@hashgraph/sdk': 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) '@scure/base': 1.2.6 @@ -10128,124 +10107,109 @@ snapshots: - expo-crypto - react-native - '@hiero-did-sdk/crypto@0.0.4(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': + '@hiero-did-sdk/crypto@0.1.0': dependencies: buffer: 6.0.3 - crypto: 1.0.1 - crypto-js: 4.2.0 - react-native-quick-crypto: 0.7.14(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) - transitivePeerDependencies: - - react - - react-native - '@hiero-did-sdk/hcs@0.0.16(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': + '@hiero-did-sdk/hcs@0.1.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': dependencies: '@hashgraph/sdk': 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk/cache': 0.0.4(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk/client': 0.0.5(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk/core': 0.0.7(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk/crypto': 0.0.4(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) - '@hiero-did-sdk/zstd': 0.0.4(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) + '@hiero-did-sdk/cache': 0.1.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/client': 0.1.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/core': 0.1.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/crypto': 0.1.0 + '@hiero-did-sdk/zstd': 0.1.0 buffer: 6.0.3 transitivePeerDependencies: - bn.js - expo-crypto - - react - react-native - '@hiero-did-sdk/lifecycle@0.0.3(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': + '@hiero-did-sdk/lifecycle@0.1.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': dependencies: - '@hiero-did-sdk/core': 0.0.7(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/core': 0.1.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) buffer: 6.0.3 transitivePeerDependencies: - bn.js - expo-crypto - react-native - '@hiero-did-sdk/messages@0.0.3(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': + '@hiero-did-sdk/messages@0.1.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': dependencies: '@hashgraph/sdk': 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk/core': 0.0.7(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk/lifecycle': 0.0.3(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk/resolver': 0.0.11(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) + '@hiero-did-sdk/core': 0.1.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/lifecycle': 0.1.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/resolver': 0.1.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) buffer: 6.0.3 transitivePeerDependencies: - bn.js - expo-crypto - - react - react-native - '@hiero-did-sdk/publisher-internal@0.0.3(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': + '@hiero-did-sdk/publisher-internal@0.1.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': dependencies: '@hashgraph/sdk': 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk/core': 0.0.7(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/core': 0.1.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) buffer: 6.0.3 transitivePeerDependencies: - bn.js - expo-crypto - react-native - '@hiero-did-sdk/registrar@0.0.9(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': + '@hiero-did-sdk/registrar@0.1.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': dependencies: '@hashgraph/sdk': 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk/core': 0.0.7(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk/lifecycle': 0.0.3(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk/messages': 0.0.3(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) - '@hiero-did-sdk/publisher-internal': 0.0.3(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk/resolver': 0.0.11(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) - '@hiero-did-sdk/signer-internal': 0.0.6(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk/verifier-internal': 0.0.3(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/core': 0.1.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/lifecycle': 0.1.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/messages': 0.1.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/publisher-internal': 0.1.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/resolver': 0.1.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/signer-internal': 0.1.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/verifier-internal': 0.1.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) buffer: 6.0.3 transitivePeerDependencies: - bn.js - expo-crypto - - react - react-native - '@hiero-did-sdk/resolver@0.0.11(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': + '@hiero-did-sdk/resolver@0.1.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': dependencies: '@hashgraph/sdk': 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk/core': 0.0.7(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk/hcs': 0.0.16(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) - '@hiero-did-sdk/verifier-internal': 0.0.3(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/client': 0.1.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/core': 0.1.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/hcs': 0.1.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/verifier-internal': 0.1.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) buffer: 6.0.3 transitivePeerDependencies: - bn.js - expo-crypto - - react - react-native - '@hiero-did-sdk/signer-internal@0.0.6(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': + '@hiero-did-sdk/signer-internal@0.1.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': dependencies: '@hashgraph/sdk': 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk/core': 0.0.7(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/core': 0.1.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) buffer: 6.0.3 transitivePeerDependencies: - bn.js - expo-crypto - react-native - '@hiero-did-sdk/verifier-internal@0.0.3(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': + '@hiero-did-sdk/verifier-internal@0.1.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))': dependencies: '@hashgraph/sdk': 2.66.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) - '@hiero-did-sdk/core': 0.0.7(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) + '@hiero-did-sdk/core': 0.1.0(bn.js@5.2.2)(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)) buffer: 6.0.3 transitivePeerDependencies: - bn.js - expo-crypto - react-native - '@hiero-did-sdk/zstd@0.0.4(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1)': - dependencies: - react-native-zstd: 1.1.0(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) - zstd-napi: 0.0.10 - transitivePeerDependencies: - - react - - react-native + '@hiero-did-sdk/zstd@0.1.0': {} '@hyperledger/anoncreds-nodejs@0.3.1': dependencies: - '@2060.io/ffi-napi': 4.0.9 + '@2060.io/ffi-napi': 4.0.9(patch_hash=6ujtm5ladmp54sbez4f5d2uhca) '@2060.io/ref-napi': 3.0.6 '@hyperledger/anoncreds-shared': 0.3.1 ref-array-di: 1.2.2 @@ -10259,7 +10223,7 @@ snapshots: '@hyperledger/indy-vdr-nodejs@0.2.2': dependencies: - '@2060.io/ffi-napi': 4.0.9 + '@2060.io/ffi-napi': 4.0.9(patch_hash=6ujtm5ladmp54sbez4f5d2uhca) '@2060.io/ref-napi': 3.0.6 '@hyperledger/indy-vdr-shared': 0.2.2 '@mapbox/node-pre-gyp': 1.0.11 @@ -10641,7 +10605,7 @@ snapshots: '@openwallet-foundation/askar-nodejs@0.3.2': dependencies: - '@2060.io/ffi-napi': 4.0.9 + '@2060.io/ffi-napi': 4.0.9(patch_hash=6ujtm5ladmp54sbez4f5d2uhca) '@2060.io/ref-napi': 3.0.6 '@openwallet-foundation/askar-shared': 0.3.2 ref-array-di: 1.2.2 @@ -12510,8 +12474,6 @@ snapshots: crypto-random-string@2.0.0: {} - crypto@1.0.1: {} - d@1.0.2: dependencies: es5-ext: 0.10.64 @@ -13703,11 +13665,6 @@ snapshots: ipaddr.js@1.9.1: {} - is-arguments@1.2.0: - dependencies: - call-bound: 1.0.4 - has-tostringtag: 1.0.2 - is-array-buffer@3.0.5: dependencies: call-bind: 1.0.8 @@ -15922,33 +15879,12 @@ snapshots: fast-base64-decode: 1.0.0 react-native: 0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1) - react-native-quick-base64@2.2.0(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1): - dependencies: - react: 18.3.1 - react-native: 0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1) - - react-native-quick-crypto@0.7.14(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1): - dependencies: - '@craftzdog/react-native-buffer': 6.1.0(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1) - events: 3.3.0 - readable-stream: 4.7.0 - string_decoder: 1.3.0 - util: 0.12.5 - transitivePeerDependencies: - - react - - react-native - react-native-securerandom@0.1.1(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1)): dependencies: base64-js: 1.5.1 react-native: 0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1) optional: true - react-native-zstd@1.1.0(react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1))(react@18.3.1): - dependencies: - react: 18.3.1 - react-native: 0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1) - react-native@0.78.2(@babel/core@7.27.4)(@babel/preset-env@7.27.2(@babel/core@7.27.4))(@react-native-community/cli@10.2.7(@babel/core@7.27.4))(react@18.3.1): dependencies: '@jest/create-cache-key-function': 29.7.0 @@ -16988,14 +16924,6 @@ snapshots: util-deprecate@1.0.2: {} - util@0.12.5: - dependencies: - inherits: 2.0.4 - is-arguments: 1.2.0 - is-generator-function: 1.1.0 - is-typed-array: 1.1.15 - which-typed-array: 1.1.19 - utils-merge@1.0.1: {} uuid@10.0.0: {} From ef9a57057e02fc5bf87649a088574db5318a9c53 Mon Sep 17 00:00:00 2001 From: "andrey.kononov" Date: Wed, 13 Aug 2025 20:00:06 +0300 Subject: [PATCH 25/89] Switch to NPM + unit-tests * Fix issues --- packages/hedera/tests/integration/utils/utils.ts | 1 + packages/hedera/tests/utils/utils.ts | 5 ----- 2 files changed, 1 insertion(+), 5 deletions(-) create mode 100644 packages/hedera/tests/integration/utils/utils.ts delete mode 100644 packages/hedera/tests/utils/utils.ts diff --git a/packages/hedera/tests/integration/utils/utils.ts b/packages/hedera/tests/integration/utils/utils.ts new file mode 100644 index 0000000000..3114bf6c16 --- /dev/null +++ b/packages/hedera/tests/integration/utils/utils.ts @@ -0,0 +1 @@ +export const getRandomStr = (n: number) => [...Array(n)].map(() => Math.random().toString(36)[2]).join('') diff --git a/packages/hedera/tests/utils/utils.ts b/packages/hedera/tests/utils/utils.ts deleted file mode 100644 index baf29ab0d5..0000000000 --- a/packages/hedera/tests/utils/utils.ts +++ /dev/null @@ -1,5 +0,0 @@ -export const getRandomStr = (n: number) => [...Array(n)].map(() => Math.random().toString(36)[2]).join('') - -// export const waitTimeout = async (timeout?: number) => { -// await new Promise((resolve) => setTimeout(resolve, timeout ?? 5000)) -// } From 01871d550441ff550250a6d5dadd16e057eba31f Mon Sep 17 00:00:00 2001 From: "andrey.kononov" Date: Wed, 13 Aug 2025 20:16:18 +0300 Subject: [PATCH 26/89] Switch to NPM + unit-tests * Fix merge issues --- demo/src/FaberInquirer.ts | 4 +- .../hedera/src/ledger/HederaLedgerService.ts | 2 +- .../unit/hedera-anoncres-registry.test.ts | 736 +++++++------- .../tests/unit/hedera-did-registrar.test.ts | 444 +++++---- .../tests/unit/hedera-did-resolver.test.ts | 138 +-- .../tests/unit/hedera-ledger-service.test.ts | 336 ++++--- .../hedera/tests/unit/kms-publisher.test.ts | 25 +- pnpm-lock.yaml | 933 +++++++++++++++++- 8 files changed, 1787 insertions(+), 831 deletions(-) diff --git a/demo/src/FaberInquirer.ts b/demo/src/FaberInquirer.ts index 26eb97e3e2..ac5fb6118e 100644 --- a/demo/src/FaberInquirer.ts +++ b/demo/src/FaberInquirer.ts @@ -90,7 +90,9 @@ export class FaberInquirer extends BaseInquirer { } public async credential() { - const registry = await prompt([this.inquireOptions([RegistryOptions.indy, RegistryOptions.cheqd, RegistryOptions.hedera])]) + const registry = await prompt([ + this.inquireOptions([RegistryOptions.indy, RegistryOptions.cheqd, RegistryOptions.hedera]), + ]) await this.faber.importDid(registry.options) await this.faber.issueCredential() const title = 'Is the credential offer accepted?' diff --git a/packages/hedera/src/ledger/HederaLedgerService.ts b/packages/hedera/src/ledger/HederaLedgerService.ts index 894df1ab96..c694d7fc66 100644 --- a/packages/hedera/src/ledger/HederaLedgerService.ts +++ b/packages/hedera/src/ledger/HederaLedgerService.ts @@ -290,7 +290,7 @@ export class HederaLedgerService { return await sdk.registerCredentialDefinition({ ...options, options: { - supportRevocation: options.options?.supportRevocation === true ?? false, + supportRevocation: options.options?.supportRevocation === true, }, }) } diff --git a/packages/hedera/tests/unit/hedera-anoncres-registry.test.ts b/packages/hedera/tests/unit/hedera-anoncres-registry.test.ts index 49b7dba713..6674326f59 100644 --- a/packages/hedera/tests/unit/hedera-anoncres-registry.test.ts +++ b/packages/hedera/tests/unit/hedera-anoncres-registry.test.ts @@ -1,388 +1,404 @@ import { - RegisterSchemaOptions, - RegisterSchemaReturn, - GetSchemaReturn, - RegisterCredentialDefinitionOptions, - RegisterCredentialDefinitionReturn, - GetCredentialDefinitionReturn, - RegisterRevocationRegistryDefinitionOptions, - RegisterRevocationRegistryDefinitionReturn, - GetRevocationRegistryDefinitionReturn, - RegisterRevocationStatusListOptions, - RegisterRevocationStatusListReturn, - GetRevocationStatusListReturn, - RegisterSchemaReturnStateFinished, + GetCredentialDefinitionReturn, + GetRevocationRegistryDefinitionReturn, + GetRevocationStatusListReturn, + GetSchemaReturn, + RegisterCredentialDefinitionOptions, + RegisterCredentialDefinitionReturn, + RegisterRevocationRegistryDefinitionOptions, + RegisterRevocationRegistryDefinitionReturn, + RegisterRevocationStatusListOptions, + RegisterRevocationStatusListReturn, + RegisterSchemaOptions, + RegisterSchemaReturn, + RegisterSchemaReturnStateFinished, } from '@credo-ts/anoncreds' -import {AgentContext} from "@credo-ts/core"; -import {HederaAnonCredsRegistry} from "@credo-ts/hedera"; -import {HederaLedgerService} from "../../src/ledger/HederaLedgerService"; +import { AgentContext } from '@credo-ts/core' +import { HederaAnonCredsRegistry } from '@credo-ts/hedera' +import { HederaLedgerService } from '../../src/ledger/HederaLedgerService' -const createMockAgentContext = () => ({ +const createMockAgentContext = () => + ({ dependencyManager: { - resolve: jest.fn(), + resolve: jest.fn(), }, config: { - logger: { - trace: jest.fn(), - debug: jest.fn(), - error: jest.fn(), - }, + logger: { + trace: jest.fn(), + debug: jest.fn(), + error: jest.fn(), + }, }, -}) as unknown as AgentContext + }) as unknown as AgentContext describe('HederaAnonCredsRegistry', () => { - let service: HederaAnonCredsRegistry - let mockAgentContext: AgentContext - let mockLedgerService: any - - beforeEach(() => { - mockAgentContext = createMockAgentContext() - mockLedgerService = { - registerSchema: jest.fn(), - getSchema: jest.fn(), - registerCredentialDefinition: jest.fn(), - getCredentialDefinition: jest.fn(), - registerRevocationRegistryDefinition: jest.fn(), - getRevocationRegistryDefinition: jest.fn(), - registerRevocationStatusList: jest.fn(), - getRevocationStatusList: jest.fn(), - } - // @ts-ignore - mockAgentContext.dependencyManager.resolve.mockReturnValue(mockLedgerService) - - service = new HederaAnonCredsRegistry() + let service: HederaAnonCredsRegistry + let mockAgentContext: AgentContext + let mockLedgerService: any + + beforeEach(() => { + mockAgentContext = createMockAgentContext() + mockLedgerService = { + registerSchema: jest.fn(), + getSchema: jest.fn(), + registerCredentialDefinition: jest.fn(), + getCredentialDefinition: jest.fn(), + registerRevocationRegistryDefinition: jest.fn(), + getRevocationRegistryDefinition: jest.fn(), + registerRevocationStatusList: jest.fn(), + getRevocationStatusList: jest.fn(), + } + // @ts-ignore + mockAgentContext.dependencyManager.resolve.mockReturnValue(mockLedgerService) + + service = new HederaAnonCredsRegistry() + }) + + describe('registerSchema', () => { + const options: RegisterSchemaOptions = { + schema: { + issuerId: 'did:hedera:123', + name: 'schemaName', + version: '1.0', + attrNames: [], + }, + options: {}, + } + + it('should call ledgerService.registerSchema and return result on success', async () => { + const expected: RegisterSchemaReturn = { + schemaMetadata: {}, + registrationMetadata: {}, + schemaState: { + state: 'finished', + } as RegisterSchemaReturnStateFinished, + } + mockLedgerService.registerSchema.mockResolvedValue(expected) + + const result = await service.registerSchema(mockAgentContext, options) + + expect(mockAgentContext.config.logger.trace).toHaveBeenCalledWith('Registering schema on Hedera ledger') + expect(mockAgentContext.dependencyManager.resolve).toHaveBeenCalledWith( + expect.any(Function) || HederaLedgerService + ) + expect(mockLedgerService.registerSchema).toHaveBeenCalledWith(mockAgentContext, options) + expect(result).toEqual(expected) }) - describe('registerSchema', () => { - const options: RegisterSchemaOptions = { - schema: { - issuerId: 'did:hedera:123', name: 'schemaName', version: '1.0', - attrNames: [] + it('should catch error and return failed state', async () => { + const error = new Error('fail') + mockLedgerService.registerSchema.mockRejectedValue(error) + + const result = await service.registerSchema(mockAgentContext, options) + + expect(mockAgentContext.config.logger.debug).toHaveBeenCalledWith( + `Error registering schema for did '${options.schema.issuerId}'`, + expect.objectContaining({ error, did: options.schema.issuerId, schema: options }) + ) + expect(result.schemaState.state).toBe('failed') + if (result.schemaState.state === 'failed') expect(result.schemaState.reason).toContain('fail') + }) + }) + + describe('getSchema', () => { + const schemaId = 'schema-id-123' + + it('should call ledgerService.getSchema and return result on success', async () => { + const expected: GetSchemaReturn = { + schemaId: schemaId, + resolutionMetadata: {}, + schemaMetadata: {}, + } + mockLedgerService.getSchema.mockResolvedValue(expected) + + const result = await service.getSchema(mockAgentContext, schemaId) + + expect(mockAgentContext.config.logger.trace).toHaveBeenCalledWith( + `Resolving schema '${schemaId}' from Hedera ledger` + ) + expect(mockLedgerService.getSchema).toHaveBeenCalledWith(mockAgentContext, schemaId) + expect(result).toEqual(expected) + }) + + it('should catch error and return notFound error state', async () => { + const error = new Error('not found') + mockLedgerService.getSchema.mockRejectedValue(error) + + const result = await service.getSchema(mockAgentContext, schemaId) + + expect(mockAgentContext.config.logger.error).toHaveBeenCalledWith( + `Error retrieving schema '${schemaId}'`, + expect.objectContaining({ error, schemaId }) + ) + expect(result.resolutionMetadata.error).toBe('notFound') + expect(result.resolutionMetadata.message).toContain('not found') + }) + }) + + describe('registerCredentialDefinition', () => { + const options: RegisterCredentialDefinitionOptions = { + credentialDefinition: { issuerId: 'did:hedera:issuer' }, + } as any + + it('should call ledgerService.registerCredentialDefinition and return result on success', async () => { + const expected: RegisterCredentialDefinitionReturn = { + credentialDefinitionMetadata: {}, + registrationMetadata: {}, + credentialDefinitionState: { + state: 'finished', + credentialDefinition: { + issuerId: '', + schemaId: '', + type: 'CL', + tag: '', + value: { + primary: {}, + revocation: undefined, }, - options: {}, - } - - it('should call ledgerService.registerSchema and return result on success', async () => { - const expected: RegisterSchemaReturn = { - schemaMetadata: {}, registrationMetadata: {}, - schemaState: { - state: "finished" - } as RegisterSchemaReturnStateFinished - } - mockLedgerService.registerSchema.mockResolvedValue(expected) - - const result = await service.registerSchema(mockAgentContext, options) - - expect(mockAgentContext.config.logger.trace).toHaveBeenCalledWith('Registering schema on Hedera ledger') - expect(mockAgentContext.dependencyManager.resolve).toHaveBeenCalledWith(expect.any(Function) || HederaLedgerService) - expect(mockLedgerService.registerSchema).toHaveBeenCalledWith(mockAgentContext, options) - expect(result).toEqual(expected) - }) - - it('should catch error and return failed state', async () => { - const error = new Error('fail') - mockLedgerService.registerSchema.mockRejectedValue(error) - - const result = await service.registerSchema(mockAgentContext, options) - - expect(mockAgentContext.config.logger.debug).toHaveBeenCalledWith( - `Error registering schema for did '${options.schema.issuerId}'`, - expect.objectContaining({ error, did: options.schema.issuerId, schema: options }) - ) - expect(result.schemaState.state).toBe('failed') - if (result.schemaState.state === 'failed') - expect(result.schemaState.reason).toContain('fail') - }) + }, + credentialDefinitionId: 'did:hedera:issuerId', + }, + } + mockLedgerService.registerCredentialDefinition.mockResolvedValue(expected) + + const result = await service.registerCredentialDefinition(mockAgentContext, options) + + expect(mockAgentContext.config.logger.trace).toHaveBeenCalledWith( + 'Registering credential definition on Hedera ledger' + ) + expect(mockLedgerService.registerCredentialDefinition).toHaveBeenCalledWith(mockAgentContext, options) + expect(result).toEqual(expected) + }) + + it('should catch error and return failed state', async () => { + const error = new Error('fail') + mockLedgerService.registerCredentialDefinition.mockRejectedValue(error) + + const result = await service.registerCredentialDefinition(mockAgentContext, options) + + expect(mockAgentContext.config.logger.error).toHaveBeenCalledWith( + `Error registering credential definition for did '${options.credentialDefinition.issuerId}'`, + expect.objectContaining({ error, did: options.credentialDefinition.issuerId, schema: options }) + ) + expect(result.credentialDefinitionState.state).toBe('failed') + if (result.credentialDefinitionState.state === 'failed') + expect(result.credentialDefinitionState.reason).toContain('fail') + }) + }) + + describe('getCredentialDefinition', () => { + const credentialDefinitionId = 'cred-def-123' + + it('should call ledgerService.getCredentialDefinition and return result on success', async () => { + const expected: GetCredentialDefinitionReturn = { + credentialDefinitionId, + resolutionMetadata: {}, + credentialDefinitionMetadata: {}, + } + mockLedgerService.getCredentialDefinition.mockResolvedValue(expected) + + const result = await service.getCredentialDefinition(mockAgentContext, credentialDefinitionId) + + expect(mockAgentContext.config.logger.trace).toHaveBeenCalledWith( + `Resolving credential definition '${credentialDefinitionId}' from Hedera ledger` + ) + expect(mockLedgerService.getCredentialDefinition).toHaveBeenCalledWith(mockAgentContext, credentialDefinitionId) + expect(result).toEqual(expected) }) - describe('getSchema', () => { - const schemaId = 'schema-id-123' - - it('should call ledgerService.getSchema and return result on success', async () => { - const expected: GetSchemaReturn = { - schemaId: schemaId, - resolutionMetadata: {}, - schemaMetadata: {} - } - mockLedgerService.getSchema.mockResolvedValue(expected) - - const result = await service.getSchema(mockAgentContext, schemaId) - - expect(mockAgentContext.config.logger.trace).toHaveBeenCalledWith(`Resolving schema '${schemaId}' from Hedera ledger`) - expect(mockLedgerService.getSchema).toHaveBeenCalledWith(mockAgentContext, schemaId) - expect(result).toEqual(expected) - }) - - it('should catch error and return notFound error state', async () => { - const error = new Error('not found') - mockLedgerService.getSchema.mockRejectedValue(error) - - const result = await service.getSchema(mockAgentContext, schemaId) - - expect(mockAgentContext.config.logger.error).toHaveBeenCalledWith( - `Error retrieving schema '${schemaId}'`, - expect.objectContaining({ error, schemaId }) - ) - expect(result.resolutionMetadata.error).toBe('notFound') - expect(result.resolutionMetadata.message).toContain('not found') - }) + it('should catch error and return notFound error state', async () => { + const error = new Error('not found') + mockLedgerService.getCredentialDefinition.mockRejectedValue(error) + + const result = await service.getCredentialDefinition(mockAgentContext, credentialDefinitionId) + + expect(mockAgentContext.config.logger.error).toHaveBeenCalledWith( + `Error retrieving credential definition '${credentialDefinitionId}'`, + expect.objectContaining({ error, credentialDefinitionId }) + ) + expect(result.resolutionMetadata.error).toBe('notFound') + expect(result.resolutionMetadata.message).toContain('not found') }) + }) + + describe('registerRevocationRegistryDefinition', () => { + const options: RegisterRevocationRegistryDefinitionOptions = { + revocationRegistryDefinition: { credDefId: 'credDef1', issuerId: 'did:hedera:issuer' }, + } as any + + it('should call ledgerService.registerRevocationRegistryDefinition and return result on success', async () => { + const expected: RegisterRevocationRegistryDefinitionReturn = { + revocationRegistryDefinitionMetadata: {}, + registrationMetadata: {}, + revocationRegistryDefinitionState: { + state: 'finished', + revocationRegistryDefinitionId: 'test', + revocationRegistryDefinition: { + issuerId: '', + revocDefType: 'CL_ACCUM', + credDefId: '', + tag: '', + value: { + publicKeys: { + accumKey: { + z: '', + }, + }, + maxCredNum: 0, + tailsLocation: '', + tailsHash: '', + }, + }, + }, + } + mockLedgerService.registerRevocationRegistryDefinition.mockResolvedValue(expected) + + const result = await service.registerRevocationRegistryDefinition(mockAgentContext, options) - describe('registerCredentialDefinition', () => { - const options: RegisterCredentialDefinitionOptions = { - credentialDefinition: { issuerId: 'did:hedera:issuer' } - } as any - - it('should call ledgerService.registerCredentialDefinition and return result on success', async () => { - const expected: RegisterCredentialDefinitionReturn = { - credentialDefinitionMetadata: {}, - registrationMetadata: {}, - credentialDefinitionState: { - state: "finished", - credentialDefinition: { - issuerId: '', - schemaId: '', - type: 'CL', - tag: '', - value: { - primary: {}, - revocation: undefined - } - }, - credentialDefinitionId: "did:hedera:issuerId", - } - } - mockLedgerService.registerCredentialDefinition.mockResolvedValue(expected) - - const result = await service.registerCredentialDefinition(mockAgentContext, options) - - expect(mockAgentContext.config.logger.trace).toHaveBeenCalledWith('Registering credential definition on Hedera ledger') - expect(mockLedgerService.registerCredentialDefinition).toHaveBeenCalledWith(mockAgentContext, options) - expect(result).toEqual(expected) - }) - - it('should catch error and return failed state', async () => { - const error = new Error('fail') - mockLedgerService.registerCredentialDefinition.mockRejectedValue(error) - - const result = await service.registerCredentialDefinition(mockAgentContext, options) - - expect(mockAgentContext.config.logger.error).toHaveBeenCalledWith( - `Error registering credential definition for did '${options.credentialDefinition.issuerId}'`, - expect.objectContaining({ error, did: options.credentialDefinition.issuerId, schema: options }) - ) - expect(result.credentialDefinitionState.state).toBe('failed') - if (result.credentialDefinitionState.state === 'failed') - expect(result.credentialDefinitionState.reason).toContain('fail') - }) + expect(mockAgentContext.config.logger.trace).toHaveBeenCalledWith( + `Registering revocation registry definition for '${options.revocationRegistryDefinition.credDefId}' on Hedera ledger` + ) + expect(mockLedgerService.registerRevocationRegistryDefinition).toHaveBeenCalledWith(mockAgentContext, options) + expect(result).toEqual(expected) }) - describe('getCredentialDefinition', () => { - const credentialDefinitionId = 'cred-def-123' - - it('should call ledgerService.getCredentialDefinition and return result on success', async () => { - const expected: GetCredentialDefinitionReturn = { - credentialDefinitionId, - resolutionMetadata: {}, - credentialDefinitionMetadata: {} - } - mockLedgerService.getCredentialDefinition.mockResolvedValue(expected) - - const result = await service.getCredentialDefinition(mockAgentContext, credentialDefinitionId) - - expect(mockAgentContext.config.logger.trace).toHaveBeenCalledWith( - `Resolving credential definition '${credentialDefinitionId}' from Hedera ledger` - ) - expect(mockLedgerService.getCredentialDefinition).toHaveBeenCalledWith(mockAgentContext, credentialDefinitionId) - expect(result).toEqual(expected) - }) - - it('should catch error and return notFound error state', async () => { - const error = new Error('not found') - mockLedgerService.getCredentialDefinition.mockRejectedValue(error) - - const result = await service.getCredentialDefinition(mockAgentContext, credentialDefinitionId) - - expect(mockAgentContext.config.logger.error).toHaveBeenCalledWith( - `Error retrieving credential definition '${credentialDefinitionId}'`, - expect.objectContaining({ error, credentialDefinitionId }) - ) - expect(result.resolutionMetadata.error).toBe('notFound') - expect(result.resolutionMetadata.message).toContain('not found') - }) + it('should catch error and return failed state', async () => { + const error = new Error('fail') + mockLedgerService.registerRevocationRegistryDefinition.mockRejectedValue(error) + + const result = await service.registerRevocationRegistryDefinition(mockAgentContext, options) + + expect(mockAgentContext.config.logger.error).toHaveBeenCalledWith( + `Error registering revocation registry definition for did '${options.revocationRegistryDefinition.issuerId}'`, + expect.objectContaining({ error, did: options.revocationRegistryDefinition.issuerId, options }) + ) + expect(result.revocationRegistryDefinitionState.state).toBe('failed') + if (result.revocationRegistryDefinitionState.state === 'failed') + expect(result.revocationRegistryDefinitionState.reason).toContain('fail') }) + }) + + describe('getRevocationRegistryDefinition', () => { + const revocationRegistryDefinitionId = 'revRegDef123' + + it('should call ledgerService.getRevocationRegistryDefinition and return result on success', async () => { + const expected: GetRevocationRegistryDefinitionReturn = { + revocationRegistryDefinitionId, + resolutionMetadata: {}, + revocationRegistryDefinitionMetadata: {}, + } + mockLedgerService.getRevocationRegistryDefinition.mockResolvedValue(expected) + + const result = await service.getRevocationRegistryDefinition(mockAgentContext, revocationRegistryDefinitionId) + + expect(mockAgentContext.config.logger.trace).toHaveBeenCalledWith( + `Resolving revocation registry definition for '${revocationRegistryDefinitionId}' from Hedera ledger` + ) + expect(mockLedgerService.getRevocationRegistryDefinition).toHaveBeenCalledWith( + mockAgentContext, + revocationRegistryDefinitionId + ) + expect(result).toEqual(expected) + }) + + it('should catch error and return notFound error state', async () => { + const error = new Error('not found') + mockLedgerService.getRevocationRegistryDefinition.mockRejectedValue(error) - describe('registerRevocationRegistryDefinition', () => { - const options: RegisterRevocationRegistryDefinitionOptions = { - revocationRegistryDefinition: { credDefId: 'credDef1', issuerId: 'did:hedera:issuer' }, - } as any - - it('should call ledgerService.registerRevocationRegistryDefinition and return result on success', async () => { - const expected: RegisterRevocationRegistryDefinitionReturn = { - revocationRegistryDefinitionMetadata: {}, - registrationMetadata: {}, - revocationRegistryDefinitionState: { - state: "finished", - revocationRegistryDefinitionId: 'test', - revocationRegistryDefinition: { - issuerId: '', - revocDefType: 'CL_ACCUM', - credDefId: '', - tag: '', - value: { - publicKeys: { - accumKey: { - z: '' - } - }, - maxCredNum: 0, - tailsLocation: '', - tailsHash: '' - } - } - } - } - mockLedgerService.registerRevocationRegistryDefinition.mockResolvedValue(expected) - - const result = await service.registerRevocationRegistryDefinition(mockAgentContext, options) - - expect(mockAgentContext.config.logger.trace).toHaveBeenCalledWith( - `Registering revocation registry definition for '${options.revocationRegistryDefinition.credDefId}' on Hedera ledger` - ) - expect(mockLedgerService.registerRevocationRegistryDefinition).toHaveBeenCalledWith(mockAgentContext, options) - expect(result).toEqual(expected) - }) - - it('should catch error and return failed state', async () => { - const error = new Error('fail') - mockLedgerService.registerRevocationRegistryDefinition.mockRejectedValue(error) - - const result = await service.registerRevocationRegistryDefinition(mockAgentContext, options) - - expect(mockAgentContext.config.logger.error).toHaveBeenCalledWith( - `Error registering revocation registry definition for did '${options.revocationRegistryDefinition.issuerId}'`, - expect.objectContaining({ error, did: options.revocationRegistryDefinition.issuerId, options }) - ) - expect(result.revocationRegistryDefinitionState.state).toBe('failed') - if (result.revocationRegistryDefinitionState.state === 'failed') - expect(result.revocationRegistryDefinitionState.reason).toContain('fail') - }) + const result = await service.getRevocationRegistryDefinition(mockAgentContext, revocationRegistryDefinitionId) + + expect(mockAgentContext.config.logger.error).toHaveBeenCalledWith( + `Error retrieving revocation registry definition '${revocationRegistryDefinitionId}'`, + expect.objectContaining({ error, revocationRegistryDefinitionId }) + ) + expect(result.resolutionMetadata.error).toBe('notFound') + expect(result.resolutionMetadata.message).toContain('not found') }) + }) + + describe('registerRevocationStatusList', () => { + const options: RegisterRevocationStatusListOptions = { + revocationStatusList: { revRegDefId: 'regDef1', issuerId: 'did:hedera:issuer' }, + } as any + + it('should call ledgerService.registerRevocationStatusList and return result on success', async () => { + const expected: RegisterRevocationStatusListReturn = { + revocationStatusListMetadata: {}, + registrationMetadata: {}, + revocationStatusListState: { + state: 'finished', + revocationStatusList: { + revRegDefId: '', + issuerId: '', + revocationList: [], + timestamp: 0, + currentAccumulator: '', + }, + }, + } + mockLedgerService.registerRevocationStatusList.mockResolvedValue(expected) - describe('getRevocationRegistryDefinition', () => { - const revocationRegistryDefinitionId = 'revRegDef123' - - it('should call ledgerService.getRevocationRegistryDefinition and return result on success', async () => { - const expected: GetRevocationRegistryDefinitionReturn = { - revocationRegistryDefinitionId, - resolutionMetadata: {}, - revocationRegistryDefinitionMetadata: {} - } - mockLedgerService.getRevocationRegistryDefinition.mockResolvedValue(expected) - - const result = await service.getRevocationRegistryDefinition(mockAgentContext, revocationRegistryDefinitionId) - - expect(mockAgentContext.config.logger.trace).toHaveBeenCalledWith( - `Resolving revocation registry definition for '${revocationRegistryDefinitionId}' from Hedera ledger` - ) - expect(mockLedgerService.getRevocationRegistryDefinition).toHaveBeenCalledWith(mockAgentContext, revocationRegistryDefinitionId) - expect(result).toEqual(expected) - }) - - it('should catch error and return notFound error state', async () => { - const error = new Error('not found') - mockLedgerService.getRevocationRegistryDefinition.mockRejectedValue(error) - - const result = await service.getRevocationRegistryDefinition(mockAgentContext, revocationRegistryDefinitionId) - - expect(mockAgentContext.config.logger.error).toHaveBeenCalledWith( - `Error retrieving revocation registry definition '${revocationRegistryDefinitionId}'`, - expect.objectContaining({ error, revocationRegistryDefinitionId }) - ) - expect(result.resolutionMetadata.error).toBe('notFound') - expect(result.resolutionMetadata.message).toContain('not found') - }) + const result = await service.registerRevocationStatusList(mockAgentContext, options) + + expect(mockAgentContext.config.logger.trace).toHaveBeenCalledWith( + `Registering revocation status list for '${options.revocationStatusList.revRegDefId}' on Hedera ledger` + ) + expect(mockLedgerService.registerRevocationStatusList).toHaveBeenCalledWith(mockAgentContext, options) + expect(result).toEqual(expected) }) - describe('registerRevocationStatusList', () => { - const options: RegisterRevocationStatusListOptions = { - revocationStatusList: { revRegDefId: 'regDef1', issuerId: 'did:hedera:issuer' } - } as any - - it('should call ledgerService.registerRevocationStatusList and return result on success', async () => { - const expected: RegisterRevocationStatusListReturn = { - revocationStatusListMetadata: {}, - registrationMetadata: {}, - revocationStatusListState: { - state: 'finished', - revocationStatusList: { - revRegDefId: '', - issuerId: '', - revocationList: [], - timestamp: 0, - currentAccumulator: '' - } - } - } - mockLedgerService.registerRevocationStatusList.mockResolvedValue(expected) - - const result = await service.registerRevocationStatusList(mockAgentContext, options) - - expect(mockAgentContext.config.logger.trace).toHaveBeenCalledWith( - `Registering revocation status list for '${options.revocationStatusList.revRegDefId}' on Hedera ledger` - ) - expect(mockLedgerService.registerRevocationStatusList).toHaveBeenCalledWith(mockAgentContext, options) - expect(result).toEqual(expected) - }) - - it('should catch error and return failed state', async () => { - const error = new Error('fail') - mockLedgerService.registerRevocationStatusList.mockRejectedValue(error) - - const result = await service.registerRevocationStatusList(mockAgentContext, options) - - expect(mockAgentContext.config.logger.error).toHaveBeenCalledWith( - `Error registering revocation status list for did '${options.revocationStatusList.issuerId}'`, - expect.objectContaining({ error, did: options.revocationStatusList.issuerId, options }) - ) - expect(result.revocationStatusListState.state).toBe('failed') - if (result.revocationStatusListState.state === 'failed') - expect(result.revocationStatusListState.reason).toContain('fail') - }) + it('should catch error and return failed state', async () => { + const error = new Error('fail') + mockLedgerService.registerRevocationStatusList.mockRejectedValue(error) + + const result = await service.registerRevocationStatusList(mockAgentContext, options) + + expect(mockAgentContext.config.logger.error).toHaveBeenCalledWith( + `Error registering revocation status list for did '${options.revocationStatusList.issuerId}'`, + expect.objectContaining({ error, did: options.revocationStatusList.issuerId, options }) + ) + expect(result.revocationStatusListState.state).toBe('failed') + if (result.revocationStatusListState.state === 'failed') + expect(result.revocationStatusListState.reason).toContain('fail') + }) + }) + + describe('getRevocationStatusList', () => { + const revocationRegistryId = 'revRegId123' + const timestamp = 1234567890 + + it('should call ledgerService.getRevocationStatusList and return result on success', async () => { + const expected: GetRevocationStatusListReturn = { + resolutionMetadata: {}, + revocationStatusListMetadata: {}, + } + mockLedgerService.getRevocationStatusList.mockResolvedValue(expected) + + const result = await service.getRevocationStatusList(mockAgentContext, revocationRegistryId, timestamp) + + expect(mockAgentContext.config.logger.trace).toHaveBeenCalledWith( + `Resolving revocation status for for '${revocationRegistryId}' from Hedera ledger` + ) + expect(mockLedgerService.getRevocationStatusList).toHaveBeenCalledWith( + mockAgentContext, + revocationRegistryId, + timestamp * 1000 + ) + expect(result).toEqual(expected) }) - describe('getRevocationStatusList', () => { - const revocationRegistryId = 'revRegId123' - const timestamp = 1234567890 - - it('should call ledgerService.getRevocationStatusList and return result on success', async () => { - const expected: GetRevocationStatusListReturn = { - resolutionMetadata: {}, - revocationStatusListMetadata: {} - } - mockLedgerService.getRevocationStatusList.mockResolvedValue(expected) - - const result = await service.getRevocationStatusList(mockAgentContext, revocationRegistryId, timestamp) - - expect(mockAgentContext.config.logger.trace).toHaveBeenCalledWith( - `Resolving revocation status for for '${revocationRegistryId}' from Hedera ledger` - ) - expect(mockLedgerService.getRevocationStatusList).toHaveBeenCalledWith(mockAgentContext, revocationRegistryId, timestamp * 1000) - expect(result).toEqual(expected) - }) - - it('should catch error and return notFound error state', async () => { - const error = new Error('not found') - mockLedgerService.getRevocationStatusList.mockRejectedValue(error) - - const result = await service.getRevocationStatusList(mockAgentContext, revocationRegistryId, timestamp) - - expect(mockAgentContext.config.logger.error).toHaveBeenCalledWith( - `Error retrieving revocation registry status list '${revocationRegistryId}'`, - expect.objectContaining({ error, revocationRegistryId }) - ) - expect(result.resolutionMetadata.error).toBe('notFound') - expect(result.resolutionMetadata.message).toContain('not found') - }) + it('should catch error and return notFound error state', async () => { + const error = new Error('not found') + mockLedgerService.getRevocationStatusList.mockRejectedValue(error) + + const result = await service.getRevocationStatusList(mockAgentContext, revocationRegistryId, timestamp) + + expect(mockAgentContext.config.logger.error).toHaveBeenCalledWith( + `Error retrieving revocation registry status list '${revocationRegistryId}'`, + expect.objectContaining({ error, revocationRegistryId }) + ) + expect(result.resolutionMetadata.error).toBe('notFound') + expect(result.resolutionMetadata.message).toContain('not found') }) + }) }) diff --git a/packages/hedera/tests/unit/hedera-did-registrar.test.ts b/packages/hedera/tests/unit/hedera-did-registrar.test.ts index a9a022d910..e26f90e5b4 100644 --- a/packages/hedera/tests/unit/hedera-did-registrar.test.ts +++ b/packages/hedera/tests/unit/hedera-did-registrar.test.ts @@ -1,261 +1,269 @@ import type { AgentContext, DidDocumentKey } from '@credo-ts/core' import { DidDocumentRole } from '@credo-ts/core' import { HederaDidRegistrar } from '@credo-ts/hedera' -import {HederaDidUpdateOptions} from "../../src/ledger/HederaLedgerService"; +import { HederaDidUpdateOptions } from '../../src/ledger/HederaLedgerService' describe('HederaDidRegistrar', () => { - let service: HederaDidRegistrar - let mockAgentContext: any - let mockDidRepository: any - let mockLedgerService: any - - beforeEach(() => { - const mockLogger = { - debug: jest.fn(), - error: jest.fn(), - } - - mockDidRepository = { - save: jest.fn(), - findCreatedDid: jest.fn(), - update: jest.fn(), - } - - mockLedgerService = { - createDid: jest.fn(), - resolveDid: jest.fn(), - updateDid: jest.fn(), - deactivateDid: jest.fn(), - } - - mockAgentContext = { - dependencyManager: { - resolve: jest.fn() - .mockImplementation((obj: any) => { - if (obj.name === 'DidRepository') return mockDidRepository - if (obj.name === 'HederaLedgerService') return mockLedgerService - }), - }, - config: { - logger: mockLogger, - }, - } - - service = new HederaDidRegistrar() + let service: HederaDidRegistrar + let mockAgentContext: any + let mockDidRepository: any + let mockLedgerService: any + + beforeEach(() => { + const mockLogger = { + debug: jest.fn(), + error: jest.fn(), + } + + mockDidRepository = { + save: jest.fn(), + findCreatedDid: jest.fn(), + update: jest.fn(), + } + + mockLedgerService = { + createDid: jest.fn(), + resolveDid: jest.fn(), + updateDid: jest.fn(), + deactivateDid: jest.fn(), + } + + mockAgentContext = { + dependencyManager: { + resolve: jest.fn().mockImplementation((obj: any) => { + if (obj.name === 'DidRepository') return mockDidRepository + if (obj.name === 'HederaLedgerService') return mockLedgerService + }), + }, + config: { + logger: mockLogger, + }, + } + + service = new HederaDidRegistrar() + }) + + describe('create', () => { + it('should create DID, save it, and return finished state on success', async () => { + const did = 'did:hedera:123' + const didDocument = { + service: [{ id: 'service1' }, { id: 'service2' }], + } + const rootKey = { kmsKeyId: 'key1', didDocumentRelativeKeyId: 'rootKeyId' } + + mockLedgerService.createDid.mockResolvedValue({ did, didDocument, rootKey }) + + const result = await service.create( + mockAgentContext as AgentContext, + { + method: 'hedera', + options: {}, + } as any + ) + + expect(mockDidRepository.save).toHaveBeenCalled() + const savedRecord = mockDidRepository.save.mock.calls[0][1] + expect(savedRecord.did).toBe(did) + expect(savedRecord.role).toBe(DidDocumentRole.Created) + expect(savedRecord.didDocument).toBeInstanceOf(Object) + expect(savedRecord.didDocument.service[0]).toBeInstanceOf(Object) + + expect(result.didState.state).toBe('finished') + expect(result.didState.did).toBe(did) + expect(result.didState.didDocument).toBeInstanceOf(Object) }) - describe('create', () => { - it('should create DID, save it, and return finished state on success', async () => { - const did = 'did:hedera:123' - const didDocument = { - service: [{ id: 'service1' }, { id: 'service2' }], - } - const rootKey = { kmsKeyId: 'key1', didDocumentRelativeKeyId: 'rootKeyId' } - - mockLedgerService.createDid.mockResolvedValue({ did, didDocument, rootKey }) - - const result = await service.create(mockAgentContext as AgentContext, { - method: 'hedera', - options: {}, - } as any) - - expect(mockDidRepository.save).toHaveBeenCalled() - const savedRecord = mockDidRepository.save.mock.calls[0][1] - expect(savedRecord.did).toBe(did) - expect(savedRecord.role).toBe(DidDocumentRole.Created) - expect(savedRecord.didDocument).toBeInstanceOf(Object) - expect(savedRecord.didDocument.service[0]).toBeInstanceOf(Object) - - expect(result.didState.state).toBe('finished') - expect(result.didState.did).toBe(did) - expect(result.didState.didDocument).toBeInstanceOf(Object) - }) + it('should handle error and return failed state', async () => { + mockLedgerService.createDid.mockRejectedValue(new Error('Create failed')) - it('should handle error and return failed state', async () => { - mockLedgerService.createDid.mockRejectedValue(new Error('Create failed')) + const result = await service.create( + mockAgentContext as AgentContext, + { + method: 'hedera', + options: {}, + } as any + ) - const result = await service.create(mockAgentContext as AgentContext, { - method: 'hedera', - options: {}, - } as any) + expect(mockAgentContext.config.logger.debug).toHaveBeenCalledWith('Error creating DID', expect.any(Object)) - expect(mockAgentContext.config.logger.debug).toHaveBeenCalledWith('Error creating DID', expect.any(Object)) - - expect(result.didState.state).toBe('failed') - if (result.didState.state === 'failed') - expect(result.didState.reason).toBe('Unable to register Did: Create failed') - }) + expect(result.didState.state).toBe('failed') + if (result.didState.state === 'failed') + expect(result.didState.reason).toBe('Unable to register Did: Create failed') }) + }) + + describe('update', () => { + const did = 'did:hedera:123' + + it('should update DID and save record successfully', async () => { + const didDocument = { id: did } + const updatedDidDocument = { id: did, updated: true } + + const foundDidRecord = { + didDocument, + keys: [{ didDocumentRelativeKeyId: 'key1' }], + } + mockLedgerService.resolveDid.mockResolvedValue({ + didDocument, + didDocumentMetadata: { deactivated: false }, + didResolutionMetadata: {}, + }) + mockDidRepository.findCreatedDid.mockResolvedValue(foundDidRecord) + mockLedgerService.updateDid.mockResolvedValue({ didDocument: updatedDidDocument }) + mockDidRepository.update.mockResolvedValue(undefined) + + const options: HederaDidUpdateOptions = { + did, + didDocumentOperation: 'setDidDocument', + secret: { + keys: [ + { + didDocumentRelativeKeyId: 'key2', + kmsKeyId: 'some-key', + }, + ], + }, + didDocument: {}, + } - describe('update', () => { - const did = 'did:hedera:123' - - it('should update DID and save record successfully', async () => { - const didDocument = { id: did } - const updatedDidDocument = { id: did, updated: true } - - const foundDidRecord = { - didDocument, - keys: [{ didDocumentRelativeKeyId: 'key1' }], - }; - mockLedgerService.resolveDid.mockResolvedValue({ - didDocument, - didDocumentMetadata: { deactivated: false }, - didResolutionMetadata: {}, - }); - mockDidRepository.findCreatedDid.mockResolvedValue(foundDidRecord); - mockLedgerService.updateDid.mockResolvedValue({ didDocument: updatedDidDocument }); - mockDidRepository.update.mockResolvedValue(undefined); - - const options: HederaDidUpdateOptions = { - did, - didDocumentOperation: 'setDidDocument', - secret: { keys: [{ - didDocumentRelativeKeyId: 'key2', - kmsKeyId: 'some-key' - }] }, - didDocument: {}, - } - - const result = await service.update(mockAgentContext as AgentContext, options) - - expect(mockLedgerService.resolveDid).toHaveBeenCalledWith(mockAgentContext, did) - expect(mockDidRepository.findCreatedDid).toHaveBeenCalledWith(mockAgentContext, did) - - expect(mockLedgerService.updateDid).toHaveBeenCalledWith(mockAgentContext, expect.objectContaining({ - secret: { keys: expect.any(Array) }, - })) - - expect(mockDidRepository.update).toHaveBeenCalledWith(mockAgentContext, foundDidRecord) - - expect(result.didState.state).toBe('finished') - expect(result.didState.did).toBe(did) - expect(result.didState.didDocument).toBeInstanceOf(Object) - }) + const result = await service.update(mockAgentContext as AgentContext, options) - it('should return failed state if DID not found or deactivated', async () => { - mockLedgerService.resolveDid.mockResolvedValue({ didDocument: null, didDocumentMetadata: { deactivated: true } }) - mockDidRepository.findCreatedDid.mockResolvedValue(null) + expect(mockLedgerService.resolveDid).toHaveBeenCalledWith(mockAgentContext, did) + expect(mockDidRepository.findCreatedDid).toHaveBeenCalledWith(mockAgentContext, did) - const options = { - did, - } as any + expect(mockLedgerService.updateDid).toHaveBeenCalledWith( + mockAgentContext, + expect.objectContaining({ + secret: { keys: expect.any(Array) }, + }) + ) - const result = await service.update(mockAgentContext as AgentContext, options) + expect(mockDidRepository.update).toHaveBeenCalledWith(mockAgentContext, foundDidRecord) - expect(result.didState.state).toBe('failed') - if (result.didState.state === 'failed') - expect(result.didState.reason).toBe('Did not found') - }) + expect(result.didState.state).toBe('finished') + expect(result.didState.did).toBe(did) + expect(result.didState.didDocument).toBeInstanceOf(Object) + }) - it('should handle error and return failed state', async () => { - mockLedgerService.resolveDid.mockRejectedValue(new Error('Update failed')) + it('should return failed state if DID not found or deactivated', async () => { + mockLedgerService.resolveDid.mockResolvedValue({ didDocument: null, didDocumentMetadata: { deactivated: true } }) + mockDidRepository.findCreatedDid.mockResolvedValue(null) - const options = { - did, - didDocumentOperation: 'setDidDocument', - } as any + const options = { + did, + } as any - const result = await service.update(mockAgentContext as AgentContext, options) + const result = await service.update(mockAgentContext as AgentContext, options) - expect(mockAgentContext.config.logger.error).toHaveBeenCalledWith('Error update DID', expect.any(Error)) - expect(result.didState.state).toBe('failed') - if (result.didState.state === 'failed') - expect(result.didState.reason).toBe('Unable update DID: Update failed') - }) + expect(result.didState.state).toBe('failed') + if (result.didState.state === 'failed') expect(result.didState.reason).toBe('Did not found') }) - describe('deactivate', () => { - const did = 'did:hedera:123' + it('should handle error and return failed state', async () => { + mockLedgerService.resolveDid.mockRejectedValue(new Error('Update failed')) + + const options = { + did, + didDocumentOperation: 'setDidDocument', + } as any - it('should deactivate DID and save updated record successfully', async () => { - const didDocument = { id: did } - const deactivatedDidDocument = { id: did, deactivated: true } + const result = await service.update(mockAgentContext as AgentContext, options) - const foundDidRecord = { - didDocument, - keys: [{ didDocumentRelativeKeyId: 'key1' }], - } + expect(mockAgentContext.config.logger.error).toHaveBeenCalledWith('Error update DID', expect.any(Error)) + expect(result.didState.state).toBe('failed') + if (result.didState.state === 'failed') expect(result.didState.reason).toBe('Unable update DID: Update failed') + }) + }) - mockLedgerService.resolveDid.mockResolvedValue({ didDocument, didDocumentMetadata: {} }) - mockDidRepository.findCreatedDid.mockResolvedValue(foundDidRecord) - mockLedgerService.deactivateDid.mockResolvedValue({ didDocument: deactivatedDidDocument }) - mockDidRepository.update.mockResolvedValue(undefined) + describe('deactivate', () => { + const did = 'did:hedera:123' - const options = { - did, - } + it('should deactivate DID and save updated record successfully', async () => { + const didDocument = { id: did } + const deactivatedDidDocument = { id: did, deactivated: true } - const result = await service.deactivate(mockAgentContext as AgentContext, options) + const foundDidRecord = { + didDocument, + keys: [{ didDocumentRelativeKeyId: 'key1' }], + } - expect(mockLedgerService.resolveDid).toHaveBeenCalledWith(mockAgentContext, did) - expect(mockDidRepository.findCreatedDid).toHaveBeenCalledWith(mockAgentContext, did) - expect(mockLedgerService.deactivateDid).toHaveBeenCalledWith(mockAgentContext, expect.objectContaining({ - secret: { keys: foundDidRecord.keys }, - })) - expect(mockDidRepository.update).toHaveBeenCalledWith(mockAgentContext, foundDidRecord) + mockLedgerService.resolveDid.mockResolvedValue({ didDocument, didDocumentMetadata: {} }) + mockDidRepository.findCreatedDid.mockResolvedValue(foundDidRecord) + mockLedgerService.deactivateDid.mockResolvedValue({ didDocument: deactivatedDidDocument }) + mockDidRepository.update.mockResolvedValue(undefined) - expect(result.didState.state).toBe('finished') - expect(result.didState.did).toBe(did) - expect(result.didState.didDocument).toBeInstanceOf(Object) + const options = { + did, + } + + const result = await service.deactivate(mockAgentContext as AgentContext, options) + + expect(mockLedgerService.resolveDid).toHaveBeenCalledWith(mockAgentContext, did) + expect(mockDidRepository.findCreatedDid).toHaveBeenCalledWith(mockAgentContext, did) + expect(mockLedgerService.deactivateDid).toHaveBeenCalledWith( + mockAgentContext, + expect.objectContaining({ + secret: { keys: foundDidRecord.keys }, }) + ) + expect(mockDidRepository.update).toHaveBeenCalledWith(mockAgentContext, foundDidRecord) - it('should return failed state if DID not found or deactivated', async () => { - mockLedgerService.resolveDid.mockResolvedValue({ didDocument: null, didDocumentMetadata: { deactivated: true } }) - mockDidRepository.findCreatedDid.mockResolvedValue(null) + expect(result.didState.state).toBe('finished') + expect(result.didState.did).toBe(did) + expect(result.didState.didDocument).toBeInstanceOf(Object) + }) - const options = { - did, - } + it('should return failed state if DID not found or deactivated', async () => { + mockLedgerService.resolveDid.mockResolvedValue({ didDocument: null, didDocumentMetadata: { deactivated: true } }) + mockDidRepository.findCreatedDid.mockResolvedValue(null) - const result = await service.deactivate(mockAgentContext as AgentContext, options) + const options = { + did, + } - expect(result.didState.state).toBe('failed') - if (result.didState.state === 'failed') - expect(result.didState.reason).toBe('Did not found') - }) + const result = await service.deactivate(mockAgentContext as AgentContext, options) - it('should handle error and return failed state', async () => { - mockLedgerService.resolveDid.mockRejectedValue(new Error('Deactivate failed')) + expect(result.didState.state).toBe('failed') + if (result.didState.state === 'failed') expect(result.didState.reason).toBe('Did not found') + }) - const options = { - did, - } + it('should handle error and return failed state', async () => { + mockLedgerService.resolveDid.mockRejectedValue(new Error('Deactivate failed')) - const result = await service.deactivate(mockAgentContext as AgentContext, options) + const options = { + did, + } - expect(mockAgentContext.config.logger.error).toHaveBeenCalledWith('Error deactivate DID', expect.any(Error)) - expect(result.didState.state).toBe('failed') - if (result.didState.state === 'failed') - expect(result.didState.reason).toBe('Unable deactivating DID: Deactivate failed') - }) + const result = await service.deactivate(mockAgentContext as AgentContext, options) + + expect(mockAgentContext.config.logger.error).toHaveBeenCalledWith('Error deactivate DID', expect.any(Error)) + expect(result.didState.state).toBe('failed') + if (result.didState.state === 'failed') + expect(result.didState.reason).toBe('Unable deactivating DID: Deactivate failed') }) + }) - describe('concatKeys (private method)', () => { - it('should concatenate keys without duplicates based on relativeKeyId', () => { - const keys1 = [ - { didDocumentRelativeKeyId: 'key1' }, - { didDocumentRelativeKeyId: 'key2' }, - ] as DidDocumentKey[] - - const keys2 = [ - { didDocumentRelativeKeyId: 'key2' }, - { didDocumentRelativeKeyId: 'key3' }, - ] as DidDocumentKey[] - - const result = (service as any).concatKeys(keys1, keys2) - - expect(result).toHaveLength(3) - expect(result).toEqual(expect.arrayContaining([ - { didDocumentRelativeKeyId: 'key1' }, - { didDocumentRelativeKeyId: 'key2' }, - { didDocumentRelativeKeyId: 'key3' }, - ])) - }) + describe('concatKeys (private method)', () => { + it('should concatenate keys without duplicates based on relativeKeyId', () => { + const keys1 = [{ didDocumentRelativeKeyId: 'key1' }, { didDocumentRelativeKeyId: 'key2' }] as DidDocumentKey[] - it('should handle undefined arguments and return empty array', () => { - const result = (service as any).concatKeys(undefined, undefined) - expect(result).toEqual([]) - }) + const keys2 = [{ didDocumentRelativeKeyId: 'key2' }, { didDocumentRelativeKeyId: 'key3' }] as DidDocumentKey[] + + const result = (service as any).concatKeys(keys1, keys2) + + expect(result).toHaveLength(3) + expect(result).toEqual( + expect.arrayContaining([ + { didDocumentRelativeKeyId: 'key1' }, + { didDocumentRelativeKeyId: 'key2' }, + { didDocumentRelativeKeyId: 'key3' }, + ]) + ) + }) + + it('should handle undefined arguments and return empty array', () => { + const result = (service as any).concatKeys(undefined, undefined) + expect(result).toEqual([]) }) + }) }) diff --git a/packages/hedera/tests/unit/hedera-did-resolver.test.ts b/packages/hedera/tests/unit/hedera-did-resolver.test.ts index 0985400da5..0e9f2ae0fd 100644 --- a/packages/hedera/tests/unit/hedera-did-resolver.test.ts +++ b/packages/hedera/tests/unit/hedera-did-resolver.test.ts @@ -1,80 +1,80 @@ -import { JsonTransformer, DidDocument } from '@credo-ts/core' -import {HederaLedgerService} from "../../src/ledger/HederaLedgerService"; -import { HederaDidResolver } from '@credo-ts/hedera'; +import { DidDocument, JsonTransformer } from '@credo-ts/core' +import { HederaDidResolver } from '@credo-ts/hedera' +import { HederaLedgerService } from '../../src/ledger/HederaLedgerService' describe('HederaDidResolver', () => { - let resolver: HederaDidResolver - let mockAgentContext: any - let mockLedgerService: any - - beforeEach(() => { - const mockLogger = { - trace: jest.fn(), - debug: jest.fn(), - } - - mockLedgerService = { - resolveDid: jest.fn(), - } - - mockAgentContext = { - config: { logger: mockLogger }, - dependencyManager: { - resolve: jest.fn().mockReturnValue(mockLedgerService), - }, - } - - resolver = new HederaDidResolver() + let resolver: HederaDidResolver + let mockAgentContext: any + let mockLedgerService: any + + beforeEach(() => { + const mockLogger = { + trace: jest.fn(), + debug: jest.fn(), + } + + mockLedgerService = { + resolveDid: jest.fn(), + } + + mockAgentContext = { + config: { logger: mockLogger }, + dependencyManager: { + resolve: jest.fn().mockReturnValue(mockLedgerService), + }, + } + + resolver = new HederaDidResolver() + }) + + it('should successfully resolve DID', async () => { + const did = 'did:hedera:123' + const fakeDidDocument = { id: did } + const resolveDidResult = { + didDocument: { id: did }, + didDocumentMetadata: { meta: 'meta' }, + didResolutionMetadata: { resMeta: 'resMeta' }, + } + + mockLedgerService.resolveDid.mockResolvedValue(resolveDidResult) + + jest.spyOn(JsonTransformer, 'fromJSON').mockReturnValue(fakeDidDocument as unknown as DidDocument) + + const result = await resolver.resolve(mockAgentContext, did, {} as any, {} as any) + + expect(mockAgentContext.config.logger.trace).toHaveBeenCalledWith('Try to resolve a did document from ledger') + expect(mockAgentContext.dependencyManager.resolve).toHaveBeenCalledWith(HederaLedgerService) + expect(mockLedgerService.resolveDid).toHaveBeenCalledWith(mockAgentContext, did) + expect(JsonTransformer.fromJSON).toHaveBeenCalledWith(resolveDidResult.didDocument, DidDocument) + + expect(result).toEqual({ + didDocument: fakeDidDocument, + didDocumentMetadata: resolveDidResult.didDocumentMetadata, + didResolutionMetadata: resolveDidResult.didResolutionMetadata, }) + }) - it('should successfully resolve DID', async () => { - const did = 'did:hedera:123' - const fakeDidDocument = { id: did } - const resolveDidResult = { - didDocument: { id: did }, - didDocumentMetadata: { meta: 'meta' }, - didResolutionMetadata: { resMeta: 'resMeta' }, - } + it('should handle error and return notFound', async () => { + const did = 'did:hedera:bad' + const error = new Error('Some error') - mockLedgerService.resolveDid.mockResolvedValue(resolveDidResult) + mockLedgerService.resolveDid.mockRejectedValue(error) - jest.spyOn(JsonTransformer, 'fromJSON').mockReturnValue(fakeDidDocument as unknown as DidDocument) + const result = await resolver.resolve(mockAgentContext, did, {} as any, {} as any) - const result = await resolver.resolve(mockAgentContext, did, {} as any, {} as any) - - expect(mockAgentContext.config.logger.trace).toHaveBeenCalledWith('Try to resolve a did document from ledger') - expect(mockAgentContext.dependencyManager.resolve).toHaveBeenCalledWith(HederaLedgerService) - expect(mockLedgerService.resolveDid).toHaveBeenCalledWith(mockAgentContext, did) - expect(JsonTransformer.fromJSON).toHaveBeenCalledWith(resolveDidResult.didDocument, DidDocument) - - expect(result).toEqual({ - didDocument: fakeDidDocument, - didDocumentMetadata: resolveDidResult.didDocumentMetadata, - didResolutionMetadata: resolveDidResult.didResolutionMetadata, - }) + expect(mockAgentContext.config.logger.trace).toHaveBeenCalledWith('Try to resolve a did document from ledger') + expect(mockAgentContext.config.logger.debug).toHaveBeenCalledWith('Error resolving the did', { + error, + did, }) - it('should handle error and return notFound', async () => { - const did = 'did:hedera:bad' - const error = new Error('Some error') - - mockLedgerService.resolveDid.mockRejectedValue(error) - - const result = await resolver.resolve(mockAgentContext, did, {} as any, {} as any) - - expect(mockAgentContext.config.logger.trace).toHaveBeenCalledWith('Try to resolve a did document from ledger') - expect(mockAgentContext.config.logger.debug).toHaveBeenCalledWith('Error resolving the did', { - error, - did, - }) - - expect(result).toEqual({ - didDocument: null, - didDocumentMetadata: {}, - didResolutionMetadata: { - error: 'notFound', - message: `Unable to resolve did '${did}': ${error}`, - }, - }) + expect(result).toEqual({ + didDocument: null, + didDocumentMetadata: {}, + didResolutionMetadata: { + error: 'notFound', + message: `Unable to resolve did '${did}': ${error}`, + }, }) + }) }) diff --git a/packages/hedera/tests/unit/hedera-ledger-service.test.ts b/packages/hedera/tests/unit/hedera-ledger-service.test.ts index 494e6bf5bb..1468edfc1e 100644 --- a/packages/hedera/tests/unit/hedera-ledger-service.test.ts +++ b/packages/hedera/tests/unit/hedera-ledger-service.test.ts @@ -1,57 +1,55 @@ -import { type DidDocument } from '@credo-ts/core' import { - AgentContext, - DependencyManager, -} from '@credo-ts/core' + RegisterCredentialDefinitionOptions, + RegisterRevocationRegistryDefinitionOptions, + RegisterRevocationStatusListOptions, + RegisterSchemaOptions, +} from '@credo-ts/anoncreds' +import { type DidDocument } from '@credo-ts/core' +import { AgentContext, DependencyManager } from '@credo-ts/core' import { DidDocumentKey, Kms } from '@credo-ts/core' -import {KmsJwkPublicOkp} from "@credo-ts/core/src/modules/kms"; -import { - RegisterCredentialDefinitionOptions, - RegisterRevocationRegistryDefinitionOptions, - RegisterRevocationStatusListOptions, RegisterSchemaOptions -} from "@credo-ts/anoncreds"; -import {HederaDidCreateOptions, HederaLedgerService} from '../../src/ledger/HederaLedgerService' -import {Client} from "@hashgraph/sdk"; +import { KmsJwkPublicOkp } from '@credo-ts/core/src/modules/kms' +import { Client } from '@hashgraph/sdk' +import { HederaDidCreateOptions, HederaLedgerService } from '../../src/ledger/HederaLedgerService' jest.mock('@hiero-did-sdk/registrar', () => ({ DIDUpdateBuilder: jest.fn().mockReturnValue({ - addService: jest.fn().mockReturnThis(), - removeService: jest.fn().mockReturnThis(), - addVerificationMethod: jest.fn().mockReturnThis(), - removeVerificationMethod: jest.fn().mockReturnThis(), - addAssertionMethod: jest.fn().mockReturnThis(), - removeAssertionMethod: jest.fn().mockReturnThis(), - addAuthenticationMethod: jest.fn().mockReturnThis(), - removeAuthenticationMethod: jest.fn().mockReturnThis(), - addCapabilityDelegationMethod: jest.fn().mockReturnThis(), - removeCapabilityDelegationMethod: jest.fn().mockReturnThis(), - addCapabilityInvocationMethod: jest.fn().mockReturnThis(), - removeCapabilityInvocationMethod: jest.fn().mockReturnThis(), - addKeyAgreementMethod: jest.fn().mockReturnThis(), - removeKeyAgreementMethod: jest.fn().mockReturnThis(), - build: jest.fn() + addService: jest.fn().mockReturnThis(), + removeService: jest.fn().mockReturnThis(), + addVerificationMethod: jest.fn().mockReturnThis(), + removeVerificationMethod: jest.fn().mockReturnThis(), + addAssertionMethod: jest.fn().mockReturnThis(), + removeAssertionMethod: jest.fn().mockReturnThis(), + addAuthenticationMethod: jest.fn().mockReturnThis(), + removeAuthenticationMethod: jest.fn().mockReturnThis(), + addCapabilityDelegationMethod: jest.fn().mockReturnThis(), + removeCapabilityDelegationMethod: jest.fn().mockReturnThis(), + addCapabilityInvocationMethod: jest.fn().mockReturnThis(), + removeCapabilityInvocationMethod: jest.fn().mockReturnThis(), + addKeyAgreementMethod: jest.fn().mockReturnThis(), + removeKeyAgreementMethod: jest.fn().mockReturnThis(), + build: jest.fn(), }), generateCreateDIDRequest: jest.fn(), submitCreateDIDRequest: jest.fn(), generateUpdateDIDRequest: jest.fn(), submitUpdateDIDRequest: jest.fn(), generateDeactivateDIDRequest: jest.fn(), - submitDeactivateDIDRequest: jest.fn() + submitDeactivateDIDRequest: jest.fn(), })) import { - DIDUpdateBuilder, - generateCreateDIDRequest, - generateDeactivateDIDRequest, - generateUpdateDIDRequest, - submitCreateDIDRequest, - submitDeactivateDIDRequest, - submitUpdateDIDRequest, + DIDUpdateBuilder, + generateCreateDIDRequest, + generateDeactivateDIDRequest, + generateUpdateDIDRequest, + submitCreateDIDRequest, + submitDeactivateDIDRequest, + submitUpdateDIDRequest, } from '@hiero-did-sdk/registrar' jest.mock('@hiero-did-sdk/resolver', () => ({ resolveDID: jest.fn(), - TopicReaderHederaHcs: jest.fn() + TopicReaderHederaHcs: jest.fn(), })) import { resolveDID } from '@hiero-did-sdk/resolver' @@ -60,7 +58,7 @@ jest.mock('@hiero-did-sdk/core', () => ({ parseDID: jest.fn(), })) -import {DID_ROOT_KEY_ID, parseDID, Publisher} from '@hiero-did-sdk/core' +import { DID_ROOT_KEY_ID, Publisher, parseDID } from '@hiero-did-sdk/core' jest.mock('../../src/ledger/utils') @@ -80,7 +78,9 @@ describe('HederaLedgerService', () => { mockedCreateOrGetKey = createOrGetKey as jest.MockedFunction mockedParseDID = parseDID as jest.MockedFunction - mockedGenerateDeactivateDIDRequest = generateDeactivateDIDRequest as jest.MockedFunction + mockedGenerateDeactivateDIDRequest = generateDeactivateDIDRequest as jest.MockedFunction< + typeof generateDeactivateDIDRequest + > builder = new DIDUpdateBuilder() @@ -99,7 +99,7 @@ describe('HederaLedgerService', () => { set: jest.fn().mockResolvedValue(undefined), remove: jest.fn().mockResolvedValue(undefined), clear: jest.fn(), - cleanupExpired: jest.fn() + cleanupExpired: jest.fn(), } service = new HederaLedgerService({ @@ -115,19 +115,19 @@ describe('HederaLedgerService', () => { }, }) - jest.spyOn(service['clientService'], 'withClient').mockImplementation(async (props, operation) => { - const mockClient = {} as Client; - return operation(mockClient); - }); + jest.spyOn(service.clientService, 'withClient').mockImplementation(async (_props, operation) => { + const mockClient = {} as Client + return operation(mockClient) + }) }) describe('resolveDid', () => { it('should calls resolveDID with proper args and returns result', async () => { - const did = 'did:hedera:test'; + const did = 'did:hedera:test' - const mockResolution = { didDocument: { id: did } }; + const mockResolution = { didDocument: { id: did } } - (resolveDID as jest.Mock).mockResolvedValue(mockResolution) + ;(resolveDID as jest.Mock).mockResolvedValue(mockResolution) const result = await service.resolveDid(mockAgentContext as AgentContext, did) @@ -148,17 +148,20 @@ describe('HederaLedgerService', () => { method: 'hedera', options: { network: 'testnet' }, secret: { rootKeyId: keyId, keys: [] }, - }; + } - mockedCreateOrGetKey.mockResolvedValue({ keyId, publicJwk }); + mockedCreateOrGetKey.mockResolvedValue({ keyId, publicJwk }) - (generateCreateDIDRequest as jest.Mock).mockResolvedValue({ state: {}, signingRequest: { serializedPayload: new Uint8Array() } }); + ;(generateCreateDIDRequest as jest.Mock).mockResolvedValue({ + state: {}, + signingRequest: { serializedPayload: new Uint8Array() }, + }) - (submitCreateDIDRequest as jest.Mock).mockResolvedValue({ did: 'did:hedera:1234' }); + ;(submitCreateDIDRequest as jest.Mock).mockResolvedValue({ did: 'did:hedera:1234' }) jest.spyOn(service as any, 'getPublisher').mockResolvedValue({} as Publisher) - mockKms.sign.mockResolvedValue({ signature: new Uint8Array([1, 2, 3]) }); + mockKms.sign.mockResolvedValue({ signature: new Uint8Array([1, 2, 3]) }) const result = await service.createDid(mockAgentContext as AgentContext, props as any) expect(createOrGetKey).toHaveBeenCalledWith(mockKms, keyId) @@ -177,17 +180,22 @@ describe('HederaLedgerService', () => { options: { network: 'testnet' }, secret: { rootKeyId: keyId, keys: [] }, didDocument, - }; + } - mockedCreateOrGetKey.mockResolvedValue({ keyId, publicJwk }); + mockedCreateOrGetKey.mockResolvedValue({ keyId, publicJwk }) - (generateCreateDIDRequest as jest.Mock).mockResolvedValue({ state: {}, signingRequest: { serializedPayload: new Uint8Array() } }); + ;(generateCreateDIDRequest as jest.Mock).mockResolvedValue({ + state: {}, + signingRequest: { serializedPayload: new Uint8Array() }, + }) - (submitCreateDIDRequest as jest.Mock).mockResolvedValue({ did: 'did:hedera:1234' }); + ;(submitCreateDIDRequest as jest.Mock).mockResolvedValue({ did: 'did:hedera:1234' }) - const updateDidSpy = jest.spyOn(service, 'updateDid').mockResolvedValue({ did: 'did:hedera:1234', someProp: true } as any); + const updateDidSpy = jest + .spyOn(service, 'updateDid') + .mockResolvedValue({ did: 'did:hedera:1234', someProp: true } as any) - jest.spyOn(service as any, 'getPublisher').mockResolvedValue({} as Publisher); + jest.spyOn(service as any, 'getPublisher').mockResolvedValue({} as Publisher) mockKms.sign.mockResolvedValue({ signature: new Uint8Array([1, 2, 3]) }) @@ -221,58 +229,58 @@ describe('HederaLedgerService', () => { it('should calls correct builder methods for each field and action', () => { const spies = { - addService: jest.spyOn(builder, 'addService'), - removeService: jest.spyOn(builder, 'removeService'), - addVerificationMethod: jest.spyOn(builder, 'addVerificationMethod'), - removeVerificationMethod: jest.spyOn(builder, 'removeVerificationMethod'), - addAssertionMethod: jest.spyOn(builder, 'addAssertionMethod'), - removeAssertionMethod: jest.spyOn(builder, 'removeAssertionMethod'), - addAuthenticationMethod: jest.spyOn(builder, 'addAuthenticationMethod'), - removeAuthenticationMethod: jest.spyOn(builder, 'removeAuthenticationMethod'), - addCapabilityDelegationMethod: jest.spyOn(builder, 'addCapabilityDelegationMethod'), - removeCapabilityDelegationMethod: jest.spyOn(builder, 'removeCapabilityDelegationMethod'), - addCapabilityInvocationMethod: jest.spyOn(builder, 'addCapabilityInvocationMethod'), - removeCapabilityInvocationMethod: jest.spyOn(builder, 'removeCapabilityInvocationMethod'), - addKeyAgreementMethod: jest.spyOn(builder, 'addKeyAgreementMethod'), - removeKeyAgreementMethod: jest.spyOn(builder, 'removeKeyAgreementMethod'), + addService: jest.spyOn(builder, 'addService'), + removeService: jest.spyOn(builder, 'removeService'), + addVerificationMethod: jest.spyOn(builder, 'addVerificationMethod'), + removeVerificationMethod: jest.spyOn(builder, 'removeVerificationMethod'), + addAssertionMethod: jest.spyOn(builder, 'addAssertionMethod'), + removeAssertionMethod: jest.spyOn(builder, 'removeAssertionMethod'), + addAuthenticationMethod: jest.spyOn(builder, 'addAuthenticationMethod'), + removeAuthenticationMethod: jest.spyOn(builder, 'removeAuthenticationMethod'), + addCapabilityDelegationMethod: jest.spyOn(builder, 'addCapabilityDelegationMethod'), + removeCapabilityDelegationMethod: jest.spyOn(builder, 'removeCapabilityDelegationMethod'), + addCapabilityInvocationMethod: jest.spyOn(builder, 'addCapabilityInvocationMethod'), + removeCapabilityInvocationMethod: jest.spyOn(builder, 'removeCapabilityInvocationMethod'), + addKeyAgreementMethod: jest.spyOn(builder, 'addKeyAgreementMethod'), + removeKeyAgreementMethod: jest.spyOn(builder, 'removeKeyAgreementMethod'), } const testCases: [string, 'add' | 'remove', string, jest.SpyInstance][] = [ - ['service', 'add', 'service-item', spies.addService], - ['service', 'remove', 'service-id', spies.removeService], + ['service', 'add', 'service-item', spies.addService], + ['service', 'remove', 'service-id', spies.removeService], - ['verificationMethod', 'add', 'verificationMethod-item', spies.addVerificationMethod], - ['verificationMethod', 'remove', 'verificationMethod-id', spies.removeVerificationMethod], + ['verificationMethod', 'add', 'verificationMethod-item', spies.addVerificationMethod], + ['verificationMethod', 'remove', 'verificationMethod-id', spies.removeVerificationMethod], - ['assertionMethod', 'add', 'assertionMethod-item', spies.addAssertionMethod], - ['assertionMethod', 'remove', 'assertionMethod-id', spies.removeAssertionMethod], + ['assertionMethod', 'add', 'assertionMethod-item', spies.addAssertionMethod], + ['assertionMethod', 'remove', 'assertionMethod-id', spies.removeAssertionMethod], - ['authentication', 'add', 'authentication-item', spies.addAuthenticationMethod], - ['authentication', 'remove', 'authentication-id', spies.removeAuthenticationMethod], + ['authentication', 'add', 'authentication-item', spies.addAuthenticationMethod], + ['authentication', 'remove', 'authentication-id', spies.removeAuthenticationMethod], - ['capabilityDelegation', 'add', 'capabilityDelegation-item', spies.addCapabilityDelegationMethod], - ['capabilityDelegation', 'remove', 'capabilityDelegation-id', spies.removeCapabilityDelegationMethod], + ['capabilityDelegation', 'add', 'capabilityDelegation-item', spies.addCapabilityDelegationMethod], + ['capabilityDelegation', 'remove', 'capabilityDelegation-id', spies.removeCapabilityDelegationMethod], - ['capabilityInvocation', 'add', 'capabilityInvocation-item', spies.addCapabilityInvocationMethod], - ['capabilityInvocation', 'remove', 'capabilityInvocation-id', spies.removeCapabilityInvocationMethod], + ['capabilityInvocation', 'add', 'capabilityInvocation-item', spies.addCapabilityInvocationMethod], + ['capabilityInvocation', 'remove', 'capabilityInvocation-id', spies.removeCapabilityInvocationMethod], - ['keyAgreement', 'add', 'keyAgreement-item', spies.addKeyAgreementMethod], - ['keyAgreement', 'remove', 'keyAgreement-id', spies.removeKeyAgreementMethod], + ['keyAgreement', 'add', 'keyAgreement-item', spies.addKeyAgreementMethod], + ['keyAgreement', 'remove', 'keyAgreement-id', spies.removeKeyAgreementMethod], ] for (const [field, action, param, spy] of testCases) { - jest.clearAllMocks() + jest.clearAllMocks() - const fn = (service as any).getUpdateMethod(builder, field, action) + const fn = (service as any).getUpdateMethod(builder, field, action) - const result = fn(param) + const result = fn(param) - expect(result).toBe(builder) - expect(spy).toHaveBeenCalledTimes(1) - expect(spy).toHaveBeenCalledWith(param) - for (const otherSpy of Object.values(spies)) { - if (otherSpy !== spy) expect(otherSpy).not.toHaveBeenCalled() - } + expect(result).toBe(builder) + expect(spy).toHaveBeenCalledTimes(1) + expect(spy).toHaveBeenCalledWith(param) + for (const otherSpy of Object.values(spies)) { + if (otherSpy !== spy) expect(otherSpy).not.toHaveBeenCalled() + } } }) @@ -284,14 +292,19 @@ describe('HederaLedgerService', () => { }) it('should performs update flow successfully', async () => { - const keys: DidDocumentKey[] = [{ kmsKeyId, didDocumentRelativeKeyId: DID_ROOT_KEY_ID }, { kmsKeyId: 'some-key', didDocumentRelativeKeyId: '#abc' }]; + const keys: DidDocumentKey[] = [ + { kmsKeyId, didDocumentRelativeKeyId: DID_ROOT_KEY_ID }, + { kmsKeyId: 'some-key', didDocumentRelativeKeyId: '#abc' }, + ] const didDocument: Partial = { - verificationMethod: [{ + verificationMethod: [ + { id: '#abc', type: 'hedera', - controller: 'test' - }], + controller: 'test', + }, + ], } const currentDidDoc = { verificationMethod: [{ id: '#abc' }] } const mockDidResolution = { didDocument: currentDidDoc } @@ -299,23 +312,23 @@ describe('HederaLedgerService', () => { const updatesMock = { build: jest.fn().mockReturnValue(didDocument) } as any mockedParseDID.mockReturnValue({ - network: 'testnet', - method: 'hedera', - publicKey: '', - topicId: '' - }); + network: 'testnet', + method: 'hedera', + publicKey: '', + topicId: '', + }) - (resolveDID as jest.Mock).mockResolvedValue(mockDidResolution); + ;(resolveDID as jest.Mock).mockResolvedValue(mockDidResolution) - jest.spyOn(service as any, 'prepareDidUpdates').mockReturnValue(updatesMock); + jest.spyOn(service as any, 'prepareDidUpdates').mockReturnValue(updatesMock) - jest.spyOn(service as any, 'getPublisher').mockResolvedValue({} as Publisher); + jest.spyOn(service as any, 'getPublisher').mockResolvedValue({} as Publisher) - (generateUpdateDIDRequest as jest.Mock).mockResolvedValue({ states: {}, signingRequests: {} }); + ;(generateUpdateDIDRequest as jest.Mock).mockResolvedValue({ states: {}, signingRequests: {} }) - jest.spyOn(service as any, 'signRequests').mockResolvedValue(Promise.resolve()); + jest.spyOn(service as any, 'signRequests').mockResolvedValue(Promise.resolve()) - (submitUpdateDIDRequest as jest.Mock).mockResolvedValue({ did: did }) + ;(submitUpdateDIDRequest as jest.Mock).mockResolvedValue({ did: did }) await expect( service.updateDid(mockAgentContext as AgentContext, { @@ -344,17 +357,18 @@ describe('HederaLedgerService', () => { it('should throws an error if root key is not found in deactivateDid', async () => { const props = { - did: 'did:hedera:123', - secret: { - keys: [], - }, + did: 'did:hedera:123', + secret: { + keys: [], + }, } // @ts-ignore mockAgentContext.dependencyManager.resolve.mockReturnValue({ sign: jest.fn() }) - await expect(service.deactivateDid(mockAgentContext as AgentContext, props)) - .rejects.toThrow('The root key not found in the KMS') + await expect(service.deactivateDid(mockAgentContext as AgentContext, props)).rejects.toThrow( + 'The root key not found in the KMS' + ) }) it('should deactivates DID successfully', async () => { @@ -362,18 +376,18 @@ describe('HederaLedgerService', () => { const mockPublisher = {} const mockState = {} const mockSigningRequest = { serializedPayload: new Uint8Array() } - const signature = new Uint8Array([1, 2, 3]); + const signature = new Uint8Array([1, 2, 3]) - (parseDID as jest.Mock).mockReturnValue({ network: 'testnet' }); + ;(parseDID as jest.Mock).mockReturnValue({ network: 'testnet' }) jest.spyOn(service as any, 'getPublisher').mockResolvedValue(mockPublisher) // @ts-ignore - mockedGenerateDeactivateDIDRequest.mockResolvedValue({ state: mockState, signingRequest: mockSigningRequest }); + mockedGenerateDeactivateDIDRequest.mockResolvedValue({ state: mockState, signingRequest: mockSigningRequest }) - mockKms.sign.mockResolvedValue({ signature }); + mockKms.sign.mockResolvedValue({ signature }) - (submitDeactivateDIDRequest as jest.Mock).mockResolvedValue({ did }) + ;(submitDeactivateDIDRequest as jest.Mock).mockResolvedValue({ did }) const result = await service.deactivateDid( mockAgentContext as AgentContext, @@ -417,13 +431,13 @@ describe('HederaLedgerService', () => { it('registerSchema', async () => { const options: RegisterSchemaOptions = { - schema: { - issuerId: '', - name: '', - version: '', - attrNames: [] - }, - options: {} + schema: { + issuerId: '', + name: '', + version: '', + attrNames: [], + }, + options: {}, } const result = await service.registerSchema(mockAgentContext as AgentContext, options) expect(mockSdk.registerSchema).toHaveBeenCalledWith(options) @@ -438,17 +452,17 @@ describe('HederaLedgerService', () => { it('registerCredentialDefinition', async () => { const options: RegisterCredentialDefinitionOptions = { - options: {supportRevocation: true}, - credentialDefinition: { - issuerId: '', - schemaId: '', - type: 'CL', - tag: '', - value: { - primary: {}, - revocation: undefined - } - } + options: { supportRevocation: true }, + credentialDefinition: { + issuerId: '', + schemaId: '', + type: 'CL', + tag: '', + value: { + primary: {}, + revocation: undefined, + }, + }, } await service.registerCredentialDefinition(mockAgentContext as AgentContext, options) expect(mockSdk.registerCredentialDefinition).toHaveBeenCalledWith({ @@ -465,23 +479,23 @@ describe('HederaLedgerService', () => { it('registerRevocationRegistryDefinition', async () => { const options: RegisterRevocationRegistryDefinitionOptions = { - revocationRegistryDefinition: { - issuerId: '', - revocDefType: 'CL_ACCUM', - credDefId: '', - tag: '', - value: { - publicKeys: { - accumKey: { - z: '' - } - }, - maxCredNum: 0, - tailsLocation: '', - tailsHash: '' - } + revocationRegistryDefinition: { + issuerId: '', + revocDefType: 'CL_ACCUM', + credDefId: '', + tag: '', + value: { + publicKeys: { + accumKey: { + z: '', + }, + }, + maxCredNum: 0, + tailsLocation: '', + tailsHash: '', }, - options: {} + }, + options: {}, } const result = await service.registerRevocationRegistryDefinition(mockAgentContext as AgentContext, options) expect(mockSdk.registerRevocationRegistryDefinition).toHaveBeenCalledWith(options) @@ -496,13 +510,13 @@ describe('HederaLedgerService', () => { it('registerRevocationStatusList', async () => { const options: RegisterRevocationStatusListOptions = { - options: {}, - revocationStatusList: { - revRegDefId: '', - issuerId: '', - revocationList: [], - currentAccumulator: '' - } + options: {}, + revocationStatusList: { + revRegDefId: '', + issuerId: '', + revocationList: [], + currentAccumulator: '', + }, } const result = await service.registerRevocationStatusList(mockAgentContext as AgentContext, options) expect(mockSdk.registerRevocationStatusList).toHaveBeenCalledWith(options) diff --git a/packages/hedera/tests/unit/kms-publisher.test.ts b/packages/hedera/tests/unit/kms-publisher.test.ts index 1a6f44d2d6..ab5aea1bca 100644 --- a/packages/hedera/tests/unit/kms-publisher.test.ts +++ b/packages/hedera/tests/unit/kms-publisher.test.ts @@ -1,14 +1,13 @@ +import { Kms, TypedArrayEncoder } from '@credo-ts/core' +import { KmsJwkPublicOkp } from '@credo-ts/core/src/modules/kms' import { KeysUtility } from '@hiero-did-sdk/core' -import { Kms, TypedArrayEncoder} from '@credo-ts/core' -import { KmsPublisher } from "../../src/ledger/publisher/KmsPublisher"; -import { KmsJwkPublicOkp} from "@credo-ts/core/src/modules/kms"; +import { KmsPublisher } from '../../src/ledger/publisher/KmsPublisher' jest.mock('@hiero-did-sdk/core', () => ({ KeysUtility: { fromBytes: jest.fn(), }, - DIDError: class DIDError extends Error {} - + DIDError: class DIDError extends Error {}, })) jest.mock('@credo-ts/core', () => ({ @@ -24,13 +23,13 @@ jest.mock('../../src/ledger/utils', () => ({ createOrGetKey: jest.fn(), })) -import {createOrGetKey} from "../../src/ledger/utils"; +import { createOrGetKey } from '../../src/ledger/utils' jest.mock('@hiero-did-sdk/publisher-internal', () => { return { Publisher: jest.fn(), } -}); +}) describe('KmsPublisher', () => { const mockClient = { @@ -39,7 +38,7 @@ describe('KmsPublisher', () => { execute: jest.fn(), operator: { accountId: '0.0.1234', - publicKey: {} + publicKey: {}, }, } @@ -54,7 +53,7 @@ describe('KmsPublisher', () => { const signMock = jest.fn().mockResolvedValue({ signature: 'signature-bytes' }) const kmsMock = { - sign: signMock + sign: signMock, } const agentContext = { @@ -64,8 +63,8 @@ describe('KmsPublisher', () => { return kmsMock } throw new Error(`Unexpected dependency: ${key}`) - }) - } + }), + }, } const keyId = 'test-key-id' @@ -81,9 +80,7 @@ describe('KmsPublisher', () => { beforeEach(() => { jest.clearAllMocks() - ;(TypedArrayEncoder.fromBase64 as jest.Mock).mockReturnValue(new Uint8Array([1, 2, 3])) - ;(KeysUtility.fromBytes as jest.Mock).mockReturnValue(mockPublicKey) mockPublicKey.toPublicKey.mockReturnValue(fakePublicKey) @@ -107,7 +104,7 @@ describe('KmsPublisher', () => { }) it('should correctly update key in setKeyId', async () => { - (createOrGetKey as jest.Mock).mockResolvedValue({ + ;(createOrGetKey as jest.Mock).mockResolvedValue({ publicJwk: { x: base64X, crv: 'Ed25519' }, }) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f3fef87cce..74b9de4f42 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -85,6 +85,11 @@ catalogs: overrides: undici: ^6.20.1 +patchedDependencies: + '@2060.io/ffi-napi@4.0.9': + hash: 9d391c085b8342fd39feab6d234b27742c9c1d160c2f8b63840cc95445fa44aa + path: patches/@2060.io__ffi-napi@4.0.9.patch + importers: .: @@ -195,6 +200,9 @@ importers: '@credo-ts/didcomm': specifier: workspace:* version: link:../packages/didcomm + '@credo-ts/hedera': + specifier: workspace:* + version: link:../packages/hedera '@credo-ts/indy-vdr': specifier: workspace:* version: link:../packages/indy-vdr @@ -398,7 +406,7 @@ importers: packages/cheqd: dependencies: '@cheqd/sdk': - specifier: ^5.2.1 + specifier: 5.2.1 version: 5.2.1 '@cheqd/ts-proto': specifier: ~2.4.1 @@ -663,6 +671,52 @@ importers: specifier: 'catalog:' version: 5.8.3 + packages/hedera: + dependencies: + '@credo-ts/anoncreds': + specifier: workspace:* + version: link:../anoncreds + '@credo-ts/core': + specifier: workspace:* + version: link:../core + '@hashgraph/sdk': + specifier: ^2.66.0 + version: 2.70.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/anoncreds': + specifier: 0.1.0 + version: 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/client': + specifier: 0.1.0 + version: 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/core': + specifier: 0.1.0 + version: 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/hcs': + specifier: 0.1.0 + version: 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/publisher-internal': + specifier: 0.1.0 + version: 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/registrar': + specifier: 0.1.0 + version: 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/resolver': + specifier: 0.1.0 + version: 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + devDependencies: + '@credo-ts/node': + specifier: workspace:* + version: link:../node + '@hyperledger/anoncreds-nodejs': + specifier: ^0.3.1 + version: 0.3.1 + rimraf: + specifier: ^4.4.0 + version: 4.4.1 + zstd-napi: + specifier: ^0.0.10 + version: 0.0.10 + packages/indy-sdk-to-askar-migration: dependencies: '@credo-ts/anoncreds': @@ -729,7 +783,7 @@ importers: dependencies: '@2060.io/ffi-napi': specifier: ^4.0.9 - version: 4.0.9 + version: 4.0.9(patch_hash=9d391c085b8342fd39feab6d234b27742c9c1d160c2f8b63840cc95445fa44aa) '@2060.io/ref-napi': specifier: ^3.0.6 version: 3.0.6 @@ -1940,6 +1994,36 @@ packages: '@bufbuild/protobuf@2.2.5': resolution: {integrity: sha512-/g5EzJifw5GF8aren8wZ/G5oMuPoGeS6MQD3ca8ddcvdXR5UELUfdTZITCGNhNXynY/AYl3Z4plmxdj/tRl/hQ==} + '@cbor-extract/cbor-extract-darwin-arm64@2.2.0': + resolution: {integrity: sha512-P7swiOAdF7aSi0H+tHtHtr6zrpF3aAq/W9FXx5HektRvLTM2O89xCyXF3pk7pLc7QpaY7AoaE8UowVf9QBdh3w==} + cpu: [arm64] + os: [darwin] + + '@cbor-extract/cbor-extract-darwin-x64@2.2.0': + resolution: {integrity: sha512-1liF6fgowph0JxBbYnAS7ZlqNYLf000Qnj4KjqPNW4GViKrEql2MgZnAsExhY9LSy8dnvA4C0qHEBgPrll0z0w==} + cpu: [x64] + os: [darwin] + + '@cbor-extract/cbor-extract-linux-arm64@2.2.0': + resolution: {integrity: sha512-rQvhNmDuhjTVXSPFLolmQ47/ydGOFXtbR7+wgkSY0bdOxCFept1hvg59uiLPT2fVDuJFuEy16EImo5tE2x3RsQ==} + cpu: [arm64] + os: [linux] + + '@cbor-extract/cbor-extract-linux-arm@2.2.0': + resolution: {integrity: sha512-QeBcBXk964zOytiedMPQNZr7sg0TNavZeuUCD6ON4vEOU/25+pLhNN6EDIKJ9VLTKaZ7K7EaAriyYQ1NQ05s/Q==} + cpu: [arm] + os: [linux] + + '@cbor-extract/cbor-extract-linux-x64@2.2.0': + resolution: {integrity: sha512-cWLAWtT3kNLHSvP4RKDzSTX9o0wvQEEAj4SKvhWuOVZxiDAeQazr9A+PSiRILK1VYMLeDml89ohxCnUNQNQNCw==} + cpu: [x64] + os: [linux] + + '@cbor-extract/cbor-extract-win32-x64@2.2.0': + resolution: {integrity: sha512-l2M+Z8DO2vbvADOBNLbbh9y5ST1RY5sqkWOg/58GkUPBYou/cuNZ68SGQ644f1CvZ8kcOxyZtw06+dxWHIoN/w==} + cpu: [x64] + os: [win32] + '@changesets/apply-release-plan@7.0.12': resolution: {integrity: sha512-EaET7As5CeuhTzvXTQCRZeBUcisoYPDDcXvgTE/2jmmypKp0RC7LxKj/yzqeh/1qFTZI7oDGFcL1PHRuQuketQ==} @@ -2308,6 +2392,60 @@ packages: cpu: [x64] os: [win32] + '@ethersproject/abi@5.8.0': + resolution: {integrity: sha512-b9YS/43ObplgyV6SlyQsG53/vkSal0MNA1fskSC4mbnCMi8R+NkcH8K9FPYNESf6jUefBUniE4SOKms0E/KK1Q==} + + '@ethersproject/abstract-provider@5.8.0': + resolution: {integrity: sha512-wC9SFcmh4UK0oKuLJQItoQdzS/qZ51EJegK6EmAWlh+OptpQ/npECOR3QqECd8iGHC0RJb4WKbVdSfif4ammrg==} + + '@ethersproject/abstract-signer@5.8.0': + resolution: {integrity: sha512-N0XhZTswXcmIZQdYtUnd79VJzvEwXQw6PK0dTl9VoYrEBxxCPXqS0Eod7q5TNKRxe1/5WUMuR0u0nqTF/avdCA==} + + '@ethersproject/address@5.8.0': + resolution: {integrity: sha512-GhH/abcC46LJwshoN+uBNoKVFPxUuZm6dA257z0vZkKmU1+t8xTn8oK7B9qrj8W2rFRMch4gbJl6PmVxjxBEBA==} + + '@ethersproject/base64@5.8.0': + resolution: {integrity: sha512-lN0oIwfkYj9LbPx4xEkie6rAMJtySbpOAFXSDVQaBnAzYfB4X2Qr+FXJGxMoc3Bxp2Sm8OwvzMrywxyw0gLjIQ==} + + '@ethersproject/bignumber@5.8.0': + resolution: {integrity: sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA==} + + '@ethersproject/bytes@5.8.0': + resolution: {integrity: sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A==} + + '@ethersproject/constants@5.8.0': + resolution: {integrity: sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg==} + + '@ethersproject/hash@5.8.0': + resolution: {integrity: sha512-ac/lBcTbEWW/VGJij0CNSw/wPcw9bSRgCB0AIBz8CvED/jfvDoV9hsIIiWfvWmFEi8RcXtlNwp2jv6ozWOsooA==} + + '@ethersproject/keccak256@5.8.0': + resolution: {integrity: sha512-A1pkKLZSz8pDaQ1ftutZoaN46I6+jvuqugx5KYNeQOPqq+JZ0Txm7dlWesCHB5cndJSu5vP2VKptKf7cksERng==} + + '@ethersproject/logger@5.8.0': + resolution: {integrity: sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA==} + + '@ethersproject/networks@5.8.0': + resolution: {integrity: sha512-egPJh3aPVAzbHwq8DD7Po53J4OUSsA1MjQp8Vf/OZPav5rlmWUaFLiq8cvQiGK0Z5K6LYzm29+VA/p4RL1FzNg==} + + '@ethersproject/properties@5.8.0': + resolution: {integrity: sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw==} + + '@ethersproject/rlp@5.8.0': + resolution: {integrity: sha512-LqZgAznqDbiEunaUvykH2JAoXTT9NV0Atqk8rQN9nx9SEgThA/WMx5DnW8a9FOufo//6FZOCHZ+XiClzgbqV9Q==} + + '@ethersproject/signing-key@5.8.0': + resolution: {integrity: sha512-LrPW2ZxoigFi6U6aVkFN/fa9Yx/+4AtIUe4/HACTvKJdhm0eeb107EVCIQcrLZkxaSIgc/eCrX8Q1GtbH+9n3w==} + + '@ethersproject/strings@5.8.0': + resolution: {integrity: sha512-qWEAk0MAvl0LszjdfnZ2uC8xbR2wdv4cDabyHiBh3Cldq/T8dPH3V4BbBsAYJUeonwD+8afVXld274Ls+Y1xXg==} + + '@ethersproject/transactions@5.8.0': + resolution: {integrity: sha512-UglxSDjByHG0TuU17bDfCemZ3AnKO2vYrL5/2n2oXvKzvb7Cz+W9gOWXKARjp2URVwcWlQlPOEQyAviKwT4AHg==} + + '@ethersproject/web@5.8.0': + resolution: {integrity: sha512-j7+Ksi/9KfGviws6Qtf9Q7KCqRhpwrYKQPs+JBA/rKVFF/yaWLHJEH3zfVP2plVu+eys0d2DlFmhoQJayFewcw==} + '@expo/bunyan@4.0.0': resolution: {integrity: sha512-Ydf4LidRB/EBI+YrB+cVLqIseiRfjUI/AeHBgjGMtq3GroraDu81OV7zqophRgupngoL3iS3JUMDMnxO7g39qA==} engines: {'0': node >=0.10.0} @@ -2381,6 +2519,15 @@ packages: peerDependencies: graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + '@grpc/grpc-js@1.13.4': + resolution: {integrity: sha512-GsFaMXCkMqkKIvwCQjCrwH+GHbPKBjhwo/8ZuUkWHqbI73Kky9I+pQltrlT0+MWpedCoosda53lgjYfyEPgxBg==} + engines: {node: '>=12.10.0'} + + '@grpc/proto-loader@0.7.15': + resolution: {integrity: sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ==} + engines: {node: '>=6'} + hasBin: true + '@hapi/bourne@3.0.0': resolution: {integrity: sha512-Waj1cwPXJDucOib4a3bAISsKJVb15MKi9IvmTI/7ssVEm6sywXGjVJDhl6/umt1pK1ZS7PacXU3A1PmFKHEZ2w==} @@ -2390,6 +2537,81 @@ packages: '@hapi/topo@5.1.0': resolution: {integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==} + '@hashgraph/cryptography@1.9.0': + resolution: {integrity: sha512-0UItolO1W/f8YIsGBrIxvjY+cSdvs4sEdzXOL49ThYEfPskJUprG3vhMhosRFoA4d0hxdJ7/glB7f7He8RW9xg==} + engines: {node: '>=12.0.0'} + peerDependencies: + expo-crypto: '*' + peerDependenciesMeta: + expo-crypto: + optional: true + + '@hashgraph/proto@2.20.0': + resolution: {integrity: sha512-XGIHRE9jr4wnnmCG8JeUD/nyeCiiYoUt35oRJz0QdCUwJYtbEsR6tPQxO90PxJJVDI5smT1c5i0f9wRRtFDhIA==} + engines: {node: '>=10.0.0'} + + '@hashgraph/sdk@2.70.0': + resolution: {integrity: sha512-naml5lWgewD3Dh8z0K7NRuKpbOpDaxpxwcLjtB9RFVmATMDU3IShSzxy24k5tUgY/0ZE7XXfCKgIpdT7TxGKqQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + bn.js: ^5.2.1 + + '@hiero-did-sdk/anoncreds@0.1.0': + resolution: {integrity: sha512-9+DPsjICXUiQrM5+kSDvV9DMSGfuh/xyo21kFBe8Tm9f7khbCz9tPLRKIiK9OfanZB0hWG6htBS+cwCb7SrLDw==} + engines: {node: '>=20'} + + '@hiero-did-sdk/cache@0.1.0': + resolution: {integrity: sha512-JK58CiMDoezher6exIMAO+YKFi4mFwRdY6PD1RCB36+A8OAkOk1Od3qUKm27rv4pXEh16lY/DKB/xse8b009iQ==} + engines: {node: '>=20'} + + '@hiero-did-sdk/client@0.1.0': + resolution: {integrity: sha512-8EBsjVxxEZEdQKePenBCo1HXKRK/70p/XRgFPzWIplUE+2jbmfy7NGqx8tzihK0NlXpA17ojp4Pu5wZJONolmA==} + engines: {node: '>=20'} + + '@hiero-did-sdk/core@0.1.0': + resolution: {integrity: sha512-qbV74xqRQBnTMpm7MGlEcqBHbiHD0+QagU698ZXKB/X3dz1Mf8kvmoZdaPPS+bIq7S6nJqf6u9xd+L0OKLgzbg==} + engines: {node: '>=20'} + + '@hiero-did-sdk/crypto@0.1.0': + resolution: {integrity: sha512-5wGuufZpcaDf3XYmX0CrCtGA9F9Zkitj+DjGVebVEJEOr9CiZeWWoJ/rS1zxOBPNWyZH3aWKG9vUqJ8RyOXiPg==} + engines: {node: '>=20'} + + '@hiero-did-sdk/hcs@0.1.0': + resolution: {integrity: sha512-Eb5pUrdXHcqNISN3kDZiQCFRKcMhrSyyuSMRrD1mYvUG2OGi5nleaUoR6xK2u0G/jJ8hrgytXuYONTim/6wJ+Q==} + engines: {node: '>=20'} + + '@hiero-did-sdk/lifecycle@0.1.0': + resolution: {integrity: sha512-j+pIqGFz7TVYZYM8R4FFHT+y859X5UPC7ZGLY7fDtEwsRGRlU6DllhO3octh4qyoJ9BkCJyU8omZjAKeq/WW4g==} + engines: {node: '>=20'} + + '@hiero-did-sdk/messages@0.1.0': + resolution: {integrity: sha512-j5GRYzJc+Fp2/ILhOCsE62dJwK9efqCu8YbzIVR3o7hGx7HzAC1fbM73myQqBTrcpxQJkRktV8lCeEKK9nOYGw==} + engines: {node: '>=20'} + + '@hiero-did-sdk/publisher-internal@0.1.0': + resolution: {integrity: sha512-lMBeltfo+NPqVik148h5VWwLrvDiXVYTJyKkaev9/JatTZlJELdYhtvWyBPPSvCikDFf8Td1QGe3wq/Jm4kbOA==} + engines: {node: '>=20'} + + '@hiero-did-sdk/registrar@0.1.0': + resolution: {integrity: sha512-zpRxQy24R+ZYxX6N4+VVxZwanxEfkCkcbzDncp8q4q/7Tru5bkAs+WghljiQS0CZPvSwP0iv21SsDEWjDtkKBw==} + engines: {node: '>=20'} + + '@hiero-did-sdk/resolver@0.1.0': + resolution: {integrity: sha512-/SVglErskv8qhBrcvgxHEgv6t1vwX0eJ3Q90QSTqhmnNIZCtjoI9yP/bo7MONBwsowY2DUCF18s5vT2/k2V3gQ==} + engines: {node: '>=20'} + + '@hiero-did-sdk/signer-internal@0.1.0': + resolution: {integrity: sha512-Z55sq1ExxtWZHzZcydQS4eg5G8w+nWx5uMQwAZrS92m6s9G1kg4z90tM321NQca6d9kFIjp59NYQA1inhxLf1w==} + engines: {node: '>=20'} + + '@hiero-did-sdk/verifier-internal@0.1.0': + resolution: {integrity: sha512-AyJz0HqbFO/mtY0t5Fpx7LBrRG5fI8tR5b0LVjhnDsvfCt3hOeLOoqnbv28x7Kljsyz+2ZJG3IPoawF5To5NGA==} + engines: {node: '>=20'} + + '@hiero-did-sdk/zstd@0.1.0': + resolution: {integrity: sha512-Y5jNDMOR268rZJBgTdwg5KjZeXijYjfCdu55P5jhzWXkO3lKHdd5jJR46DLFWse+/WaS9Ev8pz2uX+bHium8tQ==} + engines: {node: '>=20'} + '@hyperledger/anoncreds-nodejs@0.3.1': resolution: {integrity: sha512-/oWmWgcOPqjAtd2+dKASPYL84Qd7sAFyCBfEKM7PAgVbObaZUZc0kqA7hkEz/qyiqUvcP/JwKTc1v4zVZi6BTg==} engines: {node: '>= 18'} @@ -2549,6 +2771,9 @@ packages: peerDependencies: '@js-joda/core': '>=1.11.0' + '@js-sdsl/ordered-map@4.4.2': + resolution: {integrity: sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==} + '@koa/bodyparser@5.1.1': resolution: {integrity: sha512-ZBF49xqNVxnmJ+8iXegq+fXPQm9RSX8giNl/aXS5rW1VpNct92wnFbGR/47vfoRJVLARGQ4HVL4WaQ0u8IJVoA==} engines: {node: '>= 16'} @@ -2849,6 +3074,9 @@ packages: '@scure/base@1.2.1': resolution: {integrity: sha512-DGmGtC8Tt63J5GfHgfl5CuAXh96VF/LD8K9Hr/Gv0J2lAoRGlPOMpqMpMbCTOoOJMZCk2Xt+DskdDyn6dEFdzQ==} + '@scure/base@1.2.6': + resolution: {integrity: sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg==} + '@sd-jwt/core@0.10.0': resolution: {integrity: sha512-EuFsIHP76fwNi97dGcz2jdEenHL/AkDGcqrEA00k82Uw0HP/hvbAfB+yyPxYrd3dVaxe5PWSKvDkgDK6kKk+6Q==} engines: {node: '>=18'} @@ -3405,6 +3633,10 @@ packages: resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} engines: {node: '>= 4.0.0'} + atomic-sleep@1.0.0: + resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} + engines: {node: '>=8.0.0'} + available-typed-arrays@1.0.7: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} @@ -3692,6 +3924,13 @@ packages: canonicalize@2.0.0: resolution: {integrity: sha512-ulDEYPv7asdKvqahuAY35c1selLdzDwHqugK92hfkzvlDCwXRRelDkR+Er33md/PtnpqHemgkuDPanZ4fiYZ8w==} + cbor-extract@2.2.0: + resolution: {integrity: sha512-Ig1zM66BjLfTXpNgKpvBePq271BPOvu8MR0Jl080yG7Jsl+wAZunfrwiwA+9ruzm/WEdIV5QF/bjDZTqyAIVHA==} + hasBin: true + + cbor-x@1.6.0: + resolution: {integrity: sha512-0kareyRwHSkL6ws5VXHEf8uY1liitysCVJjlmhaLG+IXLqhSaOO+t63coaso7yjwEzWZzLy8fJo06gZDVQM9Qg==} + chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} @@ -3710,6 +3949,9 @@ packages: charenc@0.0.2: resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==} + chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + chownr@2.0.0: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} engines: {node: '>=10'} @@ -3819,6 +4061,9 @@ packages: colorette@1.4.0: resolution: {integrity: sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==} + colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + combined-stream@1.0.8: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} @@ -3962,6 +4207,9 @@ packages: crypt@0.0.2: resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==} + crypto-js@4.2.0: + resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==} + crypto-ld@6.0.0: resolution: {integrity: sha512-XWL1LslqggNoaCI/m3I7HcvaSt9b2tYzdrXO+jHLUj9G1BvRfvV7ZTFDVY5nifYuIGAPdAGu7unPxLRustw3VA==} engines: {node: '>=8.3.0'} @@ -4001,6 +4249,9 @@ packages: resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} engines: {node: '>= 0.4'} + dateformat@4.6.3: + resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==} + dayjs@1.11.11: resolution: {integrity: sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg==} @@ -4381,6 +4632,10 @@ packages: resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} engines: {node: '>= 0.8.0'} + expand-template@2.0.3: + resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} + engines: {node: '>=6'} + expect@29.7.0: resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -4451,6 +4706,9 @@ packages: fast-base64-decode@1.0.0: resolution: {integrity: sha512-qwaScUgUGBYeDNRnbc/KyllVU88Jk1pRHPStuF/lO7B0/RTRLj7U0lkdTAutlBblY08rwZDff6tNU9cjv6j//Q==} + fast-copy@3.0.2: + resolution: {integrity: sha512-dl0O9Vhju8IrcLndv2eU4ldt1ftXMqqfgN4H1cpmGV7P6jeB9FwpN9a2c8DPGE1Ys88rNUJVYDHq73CGAGOPfQ==} + fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -4464,6 +4722,10 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + fast-redact@3.5.0: + resolution: {integrity: sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==} + engines: {node: '>=6'} + fast-safe-stringify@2.1.1: resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} @@ -4595,6 +4857,10 @@ packages: resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} + forge-light@1.1.4: + resolution: {integrity: sha512-Nr0xdu93LJawgBZVU/tC+A+4pbKqigdY5PRBz8CXNm4e5saAZIqU2Qe9+nVFtVO5TWCHSgvI0LaZZuatgE5J1g==} + engines: {node: '>= 6.13.0'} + form-data-encoder@2.1.4: resolution: {integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==} engines: {node: '>= 14.17'} @@ -4630,6 +4896,9 @@ packages: resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} engines: {node: '>= 0.6'} + fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + fs-extra@7.0.1: resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} engines: {node: '>=6 <7 || >=8'} @@ -4730,6 +4999,9 @@ packages: resolution: {integrity: sha512-7yetJWqbS9sbn0vIfliPsFgoXMKn/YMF+Wuiog97x+urnSRRRZ7xB+uVkwGKzRgq9CDFfMQnE9ruL5DHv9c6Xg==} engines: {node: '>=6'} + github-from-package@0.0.0: + resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} + glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -4840,6 +5112,9 @@ packages: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} + help-me@5.0.0: + resolution: {integrity: sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==} + hermes-estree@0.19.1: resolution: {integrity: sha512-daLGV3Q2MKk8w4evNMKwS8zBE/rcpA800nu1Q5kM08IKijoSnPe9Uo1iIxzPKRkn95IxxsgBMPeYHt3VG4ej2g==} @@ -5412,9 +5687,16 @@ packages: jose@5.10.0: resolution: {integrity: sha512-s+3Al/p9g32Iq+oqXxkW//7jk2Vig6FF1CFqzVXoTUXt2qz89YWbL+OwS17NFYEvxC35n0FKeGO2LGYSxeM2Gg==} + joycon@3.1.1: + resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} + engines: {node: '>=10'} + js-base64@3.7.7: resolution: {integrity: sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==} + js-sha3@0.8.0: + resolution: {integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==} + js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -5649,6 +5931,9 @@ packages: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} + lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + lodash.debounce@4.0.8: resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} @@ -6017,6 +6302,9 @@ packages: resolution: {integrity: sha512-umcy022ILvb5/3Djuu8LWeqUa8D68JaBzlttKeMWen48SjabqS3iY5w/vzeMzMUNhLDifyhbOwKDSznB1vvrwg==} engines: {node: '>= 18'} + mkdirp-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + mkdirp@0.5.6: resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} hasBin: true @@ -6079,6 +6367,9 @@ packages: engines: {node: ^18 || >=20} hasBin: true + napi-build-utils@2.0.0: + resolution: {integrity: sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==} + natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} @@ -6110,12 +6401,19 @@ packages: resolution: {integrity: sha512-R49fALR9caB6vxuSWUIaK2eBYeTloZQUFBZ4rHO+TbhMGQHtwnhdqKLYki+o+8qMgLvoBYWrp/2KzGPhxL4S6w==} engines: {node: '>=18.20.0 <20 || >=20.12.1'} + node-abi@3.75.0: + resolution: {integrity: sha512-OhYaY5sDsIka7H7AtijtI9jwGYLyl29eQn/W623DiN/MIv5sUqc4g7BIDThX+gb7di9f6xK02nkp8sdfFWZLTg==} + engines: {node: '>=10'} + node-addon-api@3.2.1: resolution: {integrity: sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==} node-addon-api@5.1.0: resolution: {integrity: sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==} + node-addon-api@7.1.1: + resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} + node-dir@0.1.17: resolution: {integrity: sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg==} engines: {node: '>= 0.10.5'} @@ -6146,6 +6444,10 @@ packages: resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} engines: {node: '>= 6.13.0'} + node-gyp-build-optional-packages@5.1.1: + resolution: {integrity: sha512-+P72GAjVAbTxjjwUmwjVrqrdZROD4nf8KgpBoDxqXXTiYZZt/ud60dE5yvCSr9lRO8e8yv6kgJIC0K0PfZFVQw==} + hasBin: true + node-gyp-build@4.8.1: resolution: {integrity: sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==} hasBin: true @@ -6228,6 +6530,10 @@ packages: resolution: {integrity: sha512-IF4PcGgzAr6XXSff26Sk/+P4KZFJVuHAJZj3wgO3vX2bMdNVp/QXTP3P7CEm9V1IdG8lDLY3HhiqpsE/nOwpPw==} engines: {node: ^10.13.0 || >=12.0.0} + on-exit-leak-free@2.1.2: + resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} + engines: {node: '>=14.0.0'} + on-finished@2.3.0: resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==} engines: {node: '>= 0.8'} @@ -6436,6 +6742,20 @@ packages: resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} engines: {node: '>=6'} + pino-abstract-transport@2.0.0: + resolution: {integrity: sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw==} + + pino-pretty@13.1.1: + resolution: {integrity: sha512-TNNEOg0eA0u+/WuqH0MH0Xui7uqVk9D74ESOpjtebSQYbNWJk/dIxCXIxFsNfeN53JmtWqYHP2OrIZjT/CBEnA==} + hasBin: true + + pino-std-serializers@7.0.0: + resolution: {integrity: sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==} + + pino@9.9.0: + resolution: {integrity: sha512-zxsRIQG9HzG+jEljmvmZupOMDUQ0Jpj0yAgE28jQvvrdYTlEaiGwelJpdndMl/MBuRr70heIj83QyqJUWaU8mQ==} + hasBin: true + pirates@4.0.6: resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} engines: {node: '>= 6'} @@ -6464,6 +6784,11 @@ packages: resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} engines: {node: ^10 || ^12 || >=14} + prebuild-install@7.1.3: + resolution: {integrity: sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==} + engines: {node: '>=10'} + hasBin: true + prelude-ls@1.1.2: resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} engines: {node: '>= 0.8.0'} @@ -6492,6 +6817,9 @@ packages: process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + process-warning@5.0.0: + resolution: {integrity: sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA==} + progress@2.0.3: resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} engines: {node: '>=0.4.0'} @@ -6517,6 +6845,10 @@ packages: resolution: {integrity: sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw==} hasBin: true + protobufjs@7.2.5: + resolution: {integrity: sha512-gGXRSXvxQ7UiPgfw8gevrfRWcTlSbOFg+p/N+JVJEK5VhueL2miT6qTymqAmjr1Q5WbOCyJbyrk6JfWKwlFn6A==} + engines: {node: '>=12.0.0'} + protobufjs@7.4.0: resolution: {integrity: sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw==} engines: {node: '>=12.0.0'} @@ -6573,6 +6905,9 @@ packages: queue@6.0.2: resolution: {integrity: sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==} + quick-format-unescaped@4.0.4: + resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} + quick-lru@5.1.1: resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} engines: {node: '>=10'} @@ -6676,6 +7011,10 @@ packages: readonly-date@1.0.0: resolution: {integrity: sha512-tMKIV7hlk0h4mO3JTmmVuIlJVXjKk3Sep9Bf5OH0O+758ruuVkUy2J9SttDLm91IEX/WHlXPSpxMGjPj4beMIQ==} + real-require@0.2.0: + resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} + engines: {node: '>= 12.13.0'} + recast@0.21.5: resolution: {integrity: sha512-hjMmLaUXAm1hIuTqOdeYObMslq/q+Xff6QE3Y2P+uoHAg2nmVlLBps2hzh1UJDdMtDTMXOFewK6ky51JQIeECg==} engines: {node: '>= 4'} @@ -6797,6 +7136,9 @@ packages: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + rfc4648@1.5.4: + resolution: {integrity: sha512-rRg/6Lb+IGfJqO05HZkN50UtY7K/JhxJag1kP23+zyMfrvoB0B7RWv06MbOzoc79RgCdNTiUaNsTT1AJZ7Z+cg==} + rimraf@2.2.8: resolution: {integrity: sha512-R5KMKHnPAQaZMqLOsyuyUmcIjSeDm+73eoqQpaXA7AZ22BL+6C+1mcUscgOsNd8WVlJuvlgAPsegcx7pjlV0Dg==} deprecated: Rimraf versions prior to v4 are no longer supported @@ -6867,6 +7209,10 @@ packages: resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} engines: {node: '>= 0.4'} + safe-stable-stringify@2.5.0: + resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} + engines: {node: '>=10'} + safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} @@ -6880,6 +7226,9 @@ packages: resolution: {integrity: sha512-lDFs9AAIaWP9UCdtWrotXWWF9t8PWgQDcxqgAnpM9rMqxb3Oaq2J0thzPVSxBwdJgyQtkU/sYtFtbM1RSt/iYA==} engines: {node: '>=18.0.0'} + secure-json-parse@4.0.0: + resolution: {integrity: sha512-dxtLJO6sc35jWidmLxo7ij+Eg48PM/kleBsxpC8QJE0qJICe+KawkDQmvCMZUr9u7WKVHgMW6vy3fQ7zMiFZMA==} + selfsigned@2.4.1: resolution: {integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==} engines: {node: '>=10'} @@ -6989,6 +7338,12 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} + simple-concat@1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + + simple-get@4.0.1: + resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + simple-plist@1.3.1: resolution: {integrity: sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw==} @@ -7007,6 +7362,9 @@ packages: resolution: {integrity: sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==} engines: {node: '>=8.0.0'} + sonic-boom@4.2.0: + resolution: {integrity: sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww==} + source-map-js@1.2.0: resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} engines: {node: '>=0.10.0'} @@ -7029,6 +7387,9 @@ packages: resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} engines: {node: '>= 8'} + spark-md5@3.0.2: + resolution: {integrity: sha512-wcFzz9cDfbuqe0FZzfi2or1sgyIrsDwmPwfZC4hiNidPdPINjeUwNfv5kldczoEAcjl9Y1L3SM7Uz2PUEQzxQw==} + spawndamnit@3.0.1: resolution: {integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==} @@ -7036,6 +7397,10 @@ packages: resolution: {integrity: sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==} engines: {node: '>=6'} + split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} + split@1.0.1: resolution: {integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==} @@ -7155,6 +7520,10 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} + strip-json-comments@5.0.3: + resolution: {integrity: sha512-1tB5mhVo7U+ETBKNf92xT4hrQa3pm0MZ0PQvuDnWgAAGHDsfp4lPSpiS6psrSiet87wyGPh9ft6wmhOMQ0hDiw==} + engines: {node: '>=14.16'} + strnum@1.0.5: resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==} @@ -7219,6 +7588,13 @@ packages: resolution: {integrity: sha512-sQV7phh2WCYAn81oAkakC5qjq2Ml0g8ozqz03wOGnx9dDlG1de6yrF+0RAzSJD8fPUow3PTSMf2SAbOGxb93BA==} engines: {node: '>=0.10'} + tar-fs@2.1.3: + resolution: {integrity: sha512-090nwYJDmlhwFwEW3QQl+vaNnxsO2yVsd45eTKRBzSzu+hlb1w2K9inVq5b0ngXuLVqQ4ApvsUHHnu/zQNkWAg==} + + tar-stream@2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + tar@6.2.1: resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} engines: {node: '>=10'} @@ -7278,6 +7654,9 @@ packages: thenify@3.3.1: resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + thread-stream@3.1.0: + resolution: {integrity: sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==} + throat@5.0.0: resolution: {integrity: sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==} @@ -7392,6 +7771,12 @@ packages: resolution: {integrity: sha512-YB1FG+axdxADa3ncEtRnQCFq/M0lALGLxSZeVNbTU8NqhOVc51nnv2CISTcvc1kyv6EGPtXVr0v6lWeDxiijOA==} engines: {node: '>= 6.0.0'} + tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + + tweetnacl@1.0.3: + resolution: {integrity: sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==} + type-check@0.3.2: resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} engines: {node: '>= 0.8.0'} @@ -7833,9 +8218,13 @@ packages: zod@3.25.67: resolution: {integrity: sha512-idA2YXwpCdqUSKRCACDE6ItZD9TZzy3OZMtpfLoh6oPR47lipysRrJfjzMqFxQ3uJuUPyUeWe1r9vLH33xO/Qw==} + zstd-napi@0.0.10: + resolution: {integrity: sha512-pwnG+auSiIrD2BNSIpPEUtcRSK33cfYmKo3sJPTohFiPqPci9F4SIRPR7gGeI45Maj4nFoyyxzT2YDxVXIIgzQ==} + engines: {node: ^12.22.0 || ^14.17.0 || ^15.12.0 || >=16} + snapshots: - '@2060.io/ffi-napi@4.0.9': + '@2060.io/ffi-napi@4.0.9(patch_hash=9d391c085b8342fd39feab6d234b27742c9c1d160c2f8b63840cc95445fa44aa)': dependencies: '@2060.io/ref-napi': 3.0.6 debug: 4.4.0 @@ -8991,6 +9380,24 @@ snapshots: '@bufbuild/protobuf@2.2.5': {} + '@cbor-extract/cbor-extract-darwin-arm64@2.2.0': + optional: true + + '@cbor-extract/cbor-extract-darwin-x64@2.2.0': + optional: true + + '@cbor-extract/cbor-extract-linux-arm64@2.2.0': + optional: true + + '@cbor-extract/cbor-extract-linux-arm@2.2.0': + optional: true + + '@cbor-extract/cbor-extract-linux-x64@2.2.0': + optional: true + + '@cbor-extract/cbor-extract-win32-x64@2.2.0': + optional: true + '@changesets/apply-release-plan@7.0.12': dependencies: '@changesets/config': 3.1.1 @@ -9621,6 +10028,129 @@ snapshots: '@esbuild/win32-x64@0.25.5': optional: true + '@ethersproject/abi@5.8.0': + dependencies: + '@ethersproject/address': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/constants': 5.8.0 + '@ethersproject/hash': 5.8.0 + '@ethersproject/keccak256': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/strings': 5.8.0 + + '@ethersproject/abstract-provider@5.8.0': + dependencies: + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/networks': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/transactions': 5.8.0 + '@ethersproject/web': 5.8.0 + + '@ethersproject/abstract-signer@5.8.0': + dependencies: + '@ethersproject/abstract-provider': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/properties': 5.8.0 + + '@ethersproject/address@5.8.0': + dependencies: + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/keccak256': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/rlp': 5.8.0 + + '@ethersproject/base64@5.8.0': + dependencies: + '@ethersproject/bytes': 5.8.0 + + '@ethersproject/bignumber@5.8.0': + dependencies: + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 + bn.js: 5.2.1 + + '@ethersproject/bytes@5.8.0': + dependencies: + '@ethersproject/logger': 5.8.0 + + '@ethersproject/constants@5.8.0': + dependencies: + '@ethersproject/bignumber': 5.8.0 + + '@ethersproject/hash@5.8.0': + dependencies: + '@ethersproject/abstract-signer': 5.8.0 + '@ethersproject/address': 5.8.0 + '@ethersproject/base64': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/keccak256': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/strings': 5.8.0 + + '@ethersproject/keccak256@5.8.0': + dependencies: + '@ethersproject/bytes': 5.8.0 + js-sha3: 0.8.0 + + '@ethersproject/logger@5.8.0': {} + + '@ethersproject/networks@5.8.0': + dependencies: + '@ethersproject/logger': 5.8.0 + + '@ethersproject/properties@5.8.0': + dependencies: + '@ethersproject/logger': 5.8.0 + + '@ethersproject/rlp@5.8.0': + dependencies: + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 + + '@ethersproject/signing-key@5.8.0': + dependencies: + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/properties': 5.8.0 + bn.js: 5.2.1 + elliptic: 6.6.1 + hash.js: 1.1.7 + + '@ethersproject/strings@5.8.0': + dependencies: + '@ethersproject/bytes': 5.8.0 + '@ethersproject/constants': 5.8.0 + '@ethersproject/logger': 5.8.0 + + '@ethersproject/transactions@5.8.0': + dependencies: + '@ethersproject/address': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/constants': 5.8.0 + '@ethersproject/keccak256': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/rlp': 5.8.0 + '@ethersproject/signing-key': 5.8.0 + + '@ethersproject/web@5.8.0': + dependencies: + '@ethersproject/base64': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/strings': 5.8.0 + '@expo/bunyan@4.0.0': dependencies: uuid: 8.3.2 @@ -9906,6 +10436,18 @@ snapshots: dependencies: graphql: 15.8.0 + '@grpc/grpc-js@1.13.4': + dependencies: + '@grpc/proto-loader': 0.7.15 + '@js-sdsl/ordered-map': 4.4.2 + + '@grpc/proto-loader@0.7.15': + dependencies: + lodash.camelcase: 4.3.0 + long: 5.3.1 + protobufjs: 7.4.0 + yargs: 17.7.2 + '@hapi/bourne@3.0.0': {} '@hapi/hoek@9.3.0': @@ -9916,9 +10458,192 @@ snapshots: '@hapi/hoek': 9.3.0 optional: true + '@hashgraph/cryptography@1.9.0(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': + dependencies: + '@noble/curves': 1.9.2 + asn1js: 3.0.6 + bignumber.js: 9.1.2 + bn.js: 5.2.1 + buffer: 6.0.3 + crypto-js: 4.2.0 + forge-light: 1.1.4 + js-base64: 3.7.7 + react-native-get-random-values: 1.11.0(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + spark-md5: 3.0.2 + tweetnacl: 1.0.3 + utf8: 3.0.0 + transitivePeerDependencies: + - react-native + + '@hashgraph/proto@2.20.0': + dependencies: + long: 5.3.1 + protobufjs: 7.2.5 + + '@hashgraph/sdk@2.70.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': + dependencies: + '@ethersproject/abi': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/rlp': 5.8.0 + '@grpc/grpc-js': 1.13.4 + '@hashgraph/cryptography': 1.9.0(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hashgraph/proto': 2.20.0 + bignumber.js: 9.1.2 + bn.js: 5.2.1 + crypto-js: 4.2.0 + js-base64: 3.7.7 + long: 5.3.1 + pino: 9.9.0 + pino-pretty: 13.1.1 + protobufjs: 7.2.5 + rfc4648: 1.5.4 + utf8: 3.0.0 + transitivePeerDependencies: + - expo-crypto + - react-native + + '@hiero-did-sdk/anoncreds@0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': + dependencies: + '@hiero-did-sdk/core': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/hcs': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/zstd': 0.1.0 + buffer: 6.0.3 + transitivePeerDependencies: + - bn.js + - expo-crypto + - react-native + + '@hiero-did-sdk/cache@0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': + dependencies: + '@hiero-did-sdk/core': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + transitivePeerDependencies: + - bn.js + - expo-crypto + - react-native + + '@hiero-did-sdk/client@0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': + dependencies: + '@hashgraph/sdk': 2.70.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + transitivePeerDependencies: + - bn.js + - expo-crypto + - react-native + + '@hiero-did-sdk/core@0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': + dependencies: + '@hashgraph/sdk': 2.70.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@scure/base': 1.2.6 + buffer: 6.0.3 + cbor-x: 1.6.0 + transitivePeerDependencies: + - bn.js + - expo-crypto + - react-native + + '@hiero-did-sdk/crypto@0.1.0': + dependencies: + buffer: 6.0.3 + + '@hiero-did-sdk/hcs@0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': + dependencies: + '@hashgraph/sdk': 2.70.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/cache': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/client': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/core': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/crypto': 0.1.0 + '@hiero-did-sdk/zstd': 0.1.0 + buffer: 6.0.3 + transitivePeerDependencies: + - bn.js + - expo-crypto + - react-native + + '@hiero-did-sdk/lifecycle@0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': + dependencies: + '@hiero-did-sdk/core': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + buffer: 6.0.3 + transitivePeerDependencies: + - bn.js + - expo-crypto + - react-native + + '@hiero-did-sdk/messages@0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': + dependencies: + '@hashgraph/sdk': 2.70.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/core': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/lifecycle': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/resolver': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + buffer: 6.0.3 + transitivePeerDependencies: + - bn.js + - expo-crypto + - react-native + + '@hiero-did-sdk/publisher-internal@0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': + dependencies: + '@hashgraph/sdk': 2.70.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/core': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + buffer: 6.0.3 + transitivePeerDependencies: + - bn.js + - expo-crypto + - react-native + + '@hiero-did-sdk/registrar@0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': + dependencies: + '@hashgraph/sdk': 2.70.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/core': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/lifecycle': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/messages': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/publisher-internal': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/resolver': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/signer-internal': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/verifier-internal': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + buffer: 6.0.3 + transitivePeerDependencies: + - bn.js + - expo-crypto + - react-native + + '@hiero-did-sdk/resolver@0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': + dependencies: + '@hashgraph/sdk': 2.70.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/client': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/core': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/hcs': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/verifier-internal': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + buffer: 6.0.3 + transitivePeerDependencies: + - bn.js + - expo-crypto + - react-native + + '@hiero-did-sdk/signer-internal@0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': + dependencies: + '@hashgraph/sdk': 2.70.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/core': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + buffer: 6.0.3 + transitivePeerDependencies: + - bn.js + - expo-crypto + - react-native + + '@hiero-did-sdk/verifier-internal@0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': + dependencies: + '@hashgraph/sdk': 2.70.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/core': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + buffer: 6.0.3 + transitivePeerDependencies: + - bn.js + - expo-crypto + - react-native + + '@hiero-did-sdk/zstd@0.1.0': {} + '@hyperledger/anoncreds-nodejs@0.3.1': dependencies: - '@2060.io/ffi-napi': 4.0.9 + '@2060.io/ffi-napi': 4.0.9(patch_hash=9d391c085b8342fd39feab6d234b27742c9c1d160c2f8b63840cc95445fa44aa) '@2060.io/ref-napi': 3.0.6 '@hyperledger/anoncreds-shared': 0.3.1 ref-array-di: 1.2.2 @@ -9932,7 +10657,7 @@ snapshots: '@hyperledger/indy-vdr-nodejs@0.2.2': dependencies: - '@2060.io/ffi-napi': 4.0.9 + '@2060.io/ffi-napi': 4.0.9(patch_hash=9d391c085b8342fd39feab6d234b27742c9c1d160c2f8b63840cc95445fa44aa) '@2060.io/ref-napi': 3.0.6 '@hyperledger/indy-vdr-shared': 0.2.2 '@mapbox/node-pre-gyp': 1.0.11 @@ -10200,6 +10925,8 @@ snapshots: dependencies: '@js-joda/core': 5.6.3 + '@js-sdsl/ordered-map@4.4.2': {} + '@koa/bodyparser@5.1.1(koa@2.16.0)': dependencies: co-body: 6.2.0 @@ -10318,7 +11045,7 @@ snapshots: '@openwallet-foundation/askar-nodejs@0.3.2': dependencies: - '@2060.io/ffi-napi': 4.0.9 + '@2060.io/ffi-napi': 4.0.9(patch_hash=9d391c085b8342fd39feab6d234b27742c9c1d160c2f8b63840cc95445fa44aa) '@2060.io/ref-napi': 3.0.6 '@openwallet-foundation/askar-shared': 0.3.2 ref-array-di: 1.2.2 @@ -10741,7 +11468,7 @@ snapshots: metro: 0.82.4 metro-config: 0.82.4 metro-core: 0.82.4 - semver: 7.6.2 + semver: 7.7.2 optionalDependencies: '@react-native-community/cli': 10.2.7(@babel/core@7.27.7) transitivePeerDependencies: @@ -10820,6 +11547,8 @@ snapshots: '@scure/base@1.2.1': {} + '@scure/base@1.2.6': {} + '@sd-jwt/core@0.10.0': dependencies: '@sd-jwt/decode': 0.10.0 @@ -11449,6 +12178,8 @@ snapshots: at-least-node@1.0.0: {} + atomic-sleep@1.0.0: {} + available-typed-arrays@1.0.7: dependencies: possible-typed-array-names: 1.0.0 @@ -11864,6 +12595,22 @@ snapshots: canonicalize@2.0.0: {} + cbor-extract@2.2.0: + dependencies: + node-gyp-build-optional-packages: 5.1.1 + optionalDependencies: + '@cbor-extract/cbor-extract-darwin-arm64': 2.2.0 + '@cbor-extract/cbor-extract-darwin-x64': 2.2.0 + '@cbor-extract/cbor-extract-linux-arm': 2.2.0 + '@cbor-extract/cbor-extract-linux-arm64': 2.2.0 + '@cbor-extract/cbor-extract-linux-x64': 2.2.0 + '@cbor-extract/cbor-extract-win32-x64': 2.2.0 + optional: true + + cbor-x@1.6.0: + optionalDependencies: + cbor-extract: 2.2.0 + chalk@2.4.2: dependencies: ansi-styles: 3.2.1 @@ -11881,6 +12628,8 @@ snapshots: charenc@0.0.2: {} + chownr@1.1.4: {} + chownr@2.0.0: {} chownr@3.0.0: {} @@ -11989,6 +12738,8 @@ snapshots: colorette@1.4.0: optional: true + colorette@2.0.20: {} + combined-stream@1.0.8: dependencies: delayed-stream: 1.0.0 @@ -12156,6 +12907,8 @@ snapshots: crypt@0.0.2: {} + crypto-js@4.2.0: {} + crypto-ld@6.0.0: {} crypto-random-string@1.0.0: {} @@ -12191,6 +12944,8 @@ snapshots: es-errors: 1.3.0 is-data-view: 1.0.2 + dateformat@4.6.3: {} + dayjs@1.11.11: optional: true @@ -12605,6 +13360,8 @@ snapshots: exit@0.1.2: {} + expand-template@2.0.3: {} + expect@29.7.0: dependencies: '@jest/expect-utils': 29.7.0 @@ -12749,6 +13506,8 @@ snapshots: fast-base64-decode@1.0.0: {} + fast-copy@3.0.2: {} + fast-deep-equal@3.1.3: {} fast-glob@3.3.2: @@ -12763,6 +13522,8 @@ snapshots: fast-levenshtein@2.0.6: {} + fast-redact@3.5.0: {} + fast-safe-stringify@2.1.1: {} fast-text-encoding@1.0.6: {} @@ -12917,6 +13678,8 @@ snapshots: cross-spawn: 7.0.6 signal-exit: 4.1.0 + forge-light@1.1.4: {} + form-data-encoder@2.1.4: {} form-data@3.0.1: @@ -12951,6 +13714,8 @@ snapshots: fresh@0.5.2: {} + fs-constants@1.0.0: {} + fs-extra@7.0.1: dependencies: graceful-fs: 4.2.11 @@ -13073,6 +13838,8 @@ snapshots: getenv@1.0.0: {} + github-from-package@0.0.0: {} + glob-parent@5.1.2: dependencies: is-glob: 4.0.3 @@ -13209,6 +13976,8 @@ snapshots: dependencies: function-bind: 1.1.2 + help-me@5.0.0: {} + hermes-estree@0.19.1: {} hermes-estree@0.25.1: {} @@ -14013,8 +14782,12 @@ snapshots: jose@5.10.0: {} + joycon@3.1.1: {} + js-base64@3.7.7: {} + js-sha3@0.8.0: {} + js-tokens@4.0.0: {} js-yaml@3.14.1: @@ -14268,6 +15041,8 @@ snapshots: dependencies: p-locate: 5.0.0 + lodash.camelcase@4.3.0: {} + lodash.debounce@4.0.8: {} lodash.defaults@4.2.0: {} @@ -14917,6 +15692,8 @@ snapshots: minipass: 7.1.2 rimraf: 5.0.10 + mkdirp-classic@0.5.3: {} + mkdirp@0.5.6: dependencies: minimist: 1.2.8 @@ -14970,6 +15747,8 @@ snapshots: nanoid@5.0.9: {} + napi-build-utils@2.0.0: {} + natural-compare@1.4.0: {} ncp@2.0.0: @@ -14994,10 +15773,16 @@ snapshots: json-stringify-safe: 5.0.1 propagate: 2.0.1 + node-abi@3.75.0: + dependencies: + semver: 7.7.2 + node-addon-api@3.2.1: {} node-addon-api@5.1.0: {} + node-addon-api@7.1.1: {} + node-dir@0.1.17: dependencies: minimatch: 3.1.2 @@ -15023,6 +15808,11 @@ snapshots: node-forge@1.3.1: {} + node-gyp-build-optional-packages@5.1.1: + dependencies: + detect-libc: 2.0.3 + optional: true + node-gyp-build@4.8.1: {} node-int64@0.4.0: {} @@ -15110,6 +15900,8 @@ snapshots: oidc-token-hash@5.0.3: {} + on-exit-leak-free@2.1.2: {} + on-finished@2.3.0: dependencies: ee-first: 1.1.1 @@ -15307,6 +16099,42 @@ snapshots: pify@4.0.1: {} + pino-abstract-transport@2.0.0: + dependencies: + split2: 4.2.0 + + pino-pretty@13.1.1: + dependencies: + colorette: 2.0.20 + dateformat: 4.6.3 + fast-copy: 3.0.2 + fast-safe-stringify: 2.1.1 + help-me: 5.0.0 + joycon: 3.1.1 + minimist: 1.2.8 + on-exit-leak-free: 2.1.2 + pino-abstract-transport: 2.0.0 + pump: 3.0.0 + secure-json-parse: 4.0.0 + sonic-boom: 4.2.0 + strip-json-comments: 5.0.3 + + pino-std-serializers@7.0.0: {} + + pino@9.9.0: + dependencies: + atomic-sleep: 1.0.0 + fast-redact: 3.5.0 + on-exit-leak-free: 2.1.2 + pino-abstract-transport: 2.0.0 + pino-std-serializers: 7.0.0 + process-warning: 5.0.0 + quick-format-unescaped: 4.0.4 + real-require: 0.2.0 + safe-stable-stringify: 2.5.0 + sonic-boom: 4.2.0 + thread-stream: 3.1.0 + pirates@4.0.6: {} pkg-dir@3.0.0: @@ -15333,6 +16161,21 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.0 + prebuild-install@7.1.3: + dependencies: + detect-libc: 2.0.3 + expand-template: 2.0.3 + github-from-package: 0.0.0 + minimist: 1.2.8 + mkdirp-classic: 0.5.3 + napi-build-utils: 2.0.0 + node-abi: 3.75.0 + pump: 3.0.0 + rc: 1.2.8 + simple-get: 4.0.1 + tar-fs: 2.1.3 + tunnel-agent: 0.6.0 + prelude-ls@1.1.2: {} prettier@2.8.8: {} @@ -15363,6 +16206,8 @@ snapshots: process-nextick-args@2.0.1: optional: true + process-warning@5.0.0: {} + progress@2.0.3: {} promise@7.3.1: @@ -15402,6 +16247,21 @@ snapshots: '@types/node': 20.19.2 long: 4.0.0 + protobufjs@7.2.5: + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/base64': 1.1.2 + '@protobufjs/codegen': 2.0.4 + '@protobufjs/eventemitter': 1.1.0 + '@protobufjs/fetch': 1.1.0 + '@protobufjs/float': 1.0.2 + '@protobufjs/inquire': 1.1.0 + '@protobufjs/path': 1.1.2 + '@protobufjs/pool': 1.1.0 + '@protobufjs/utf8': 1.1.0 + '@types/node': 20.19.2 + long: 5.3.1 + protobufjs@7.4.0: dependencies: '@protobufjs/aspromise': 1.1.2 @@ -15468,6 +16328,8 @@ snapshots: dependencies: inherits: 2.0.4 + quick-format-unescaped@4.0.4: {} + quick-lru@5.1.1: {} quick-lru@7.0.0: {} @@ -15619,6 +16481,8 @@ snapshots: readonly-date@1.0.0: {} + real-require@0.2.0: {} + recast@0.21.5: dependencies: ast-types: 0.15.2 @@ -15753,6 +16617,8 @@ snapshots: reusify@1.0.4: {} + rfc4648@1.5.4: {} + rimraf@2.2.8: optional: true @@ -15823,6 +16689,8 @@ snapshots: es-errors: 1.3.0 is-regex: 1.2.1 + safe-stable-stringify@2.5.0: {} + safer-buffer@2.1.2: {} sax@1.4.1: {} @@ -15835,6 +16703,8 @@ snapshots: node-addon-api: 5.1.0 node-gyp-build: 4.8.1 + secure-json-parse@4.0.0: {} + selfsigned@2.4.1: dependencies: '@types/node-forge': 1.3.11 @@ -15977,6 +16847,14 @@ snapshots: signal-exit@4.1.0: {} + simple-concat@1.0.1: {} + + simple-get@4.0.1: + dependencies: + decompress-response: 6.0.0 + once: 1.4.0 + simple-concat: 1.0.1 + simple-plist@1.3.1: dependencies: bplist-creator: 0.1.0 @@ -15996,6 +16874,10 @@ snapshots: slugify@1.6.6: {} + sonic-boom@4.2.0: + dependencies: + atomic-sleep: 1.0.0 + source-map-js@1.2.0: {} source-map-support@0.5.13: @@ -16015,6 +16897,8 @@ snapshots: source-map@0.7.4: optional: true + spark-md5@3.0.2: {} + spawndamnit@3.0.1: dependencies: cross-spawn: 7.0.6 @@ -16022,6 +16906,8 @@ snapshots: split-on-first@1.1.0: {} + split2@4.2.0: {} + split@1.0.1: dependencies: through: 2.3.8 @@ -16135,6 +17021,8 @@ snapshots: strip-json-comments@3.1.1: {} + strip-json-comments@5.0.3: {} + strnum@1.0.5: optional: true @@ -16209,6 +17097,21 @@ snapshots: symbol-observable@2.0.3: {} + tar-fs@2.1.3: + dependencies: + chownr: 1.1.4 + mkdirp-classic: 0.5.3 + pump: 3.0.0 + tar-stream: 2.2.0 + + tar-stream@2.2.0: + dependencies: + bl: 4.1.0 + end-of-stream: 1.4.4 + fs-constants: 1.0.0 + inherits: 2.0.4 + readable-stream: 3.6.2 + tar@6.2.1: dependencies: chownr: 2.0.0 @@ -16285,6 +17188,10 @@ snapshots: dependencies: any-promise: 1.3.0 + thread-stream@3.1.0: + dependencies: + real-require: 0.2.0 + throat@5.0.0: {} through2@2.0.5: @@ -16390,6 +17297,12 @@ snapshots: dependencies: tslib: 1.14.1 + tunnel-agent@0.6.0: + dependencies: + safe-buffer: 5.2.1 + + tweetnacl@1.0.3: {} + type-check@0.3.2: dependencies: prelude-ls: 1.1.2 @@ -16803,3 +17716,9 @@ snapshots: zod: 3.25.67 zod@3.25.67: {} + + zstd-napi@0.0.10: + dependencies: + '@types/node': 20.19.2 + node-addon-api: 7.1.1 + prebuild-install: 7.1.3 From d63f6905795754257080e99b8edabfefc7fffa96 Mon Sep 17 00:00:00 2001 From: "andrey.kononov" Date: Thu, 14 Aug 2025 18:40:31 +0300 Subject: [PATCH 27/89] Switch to NPM + unit-tests * Biome fixes * Demo application fixes --- demo/src/BaseAgent.ts | 8 ++- .../hedera/src/ledger/HederaLedgerService.ts | 6 ++ .../HederaAnoncredsRegistry.e2e.test.ts | 2 +- .../HederaDidRegistrar.e2e.test.ts | 21 ++----- .../integration/HederaDidResolver.e2e.test.ts | 2 +- .../tests/integration/utils/testCache.ts | 1 + .../unit/hedera-anoncres-registry.test.ts | 45 ++++++++++++-- .../tests/unit/hedera-did-registrar.test.ts | 38 ++++++------ .../tests/unit/hedera-did-resolver.test.ts | 4 ++ .../tests/unit/hedera-ledger-service.test.ts | 62 +++++++++++-------- .../hedera/tests/unit/kms-publisher.test.ts | 16 +++-- 11 files changed, 127 insertions(+), 78 deletions(-) diff --git a/demo/src/BaseAgent.ts b/demo/src/BaseAgent.ts index 417c8e53f6..ddad42b052 100644 --- a/demo/src/BaseAgent.ts +++ b/demo/src/BaseAgent.ts @@ -151,9 +151,11 @@ function getAskarAnonCredsIndyModules( hedera: new HederaModule({ networks: [ { - network: 'testnet', - operatorId: process.env.HEDERA_TEST_OPERATOR_ID ?? '', - operatorKey: process.env.HEDERA_TEST_OPERATOR_KEY ?? '', + network: (process.env.HEDERA_NETWORK as 'testnet' | 'mainnet' | 'previewnet' | 'local-node') ?? 'testnet', + operatorId: process.env.HEDERA_OPERATOR_ID ?? '0.0.5489553', + operatorKey: + process.env.HEDERA_OPERATOR_KEY ?? + '302e020100300506032b6570042204209f54b75b6238ced43e41b1463999cb40bf2f7dd2c9fd4fd3ef780027c016a138', }, ], }), diff --git a/packages/hedera/src/ledger/HederaLedgerService.ts b/packages/hedera/src/ledger/HederaLedgerService.ts index c694d7fc66..1f82379c5b 100644 --- a/packages/hedera/src/ledger/HederaLedgerService.ts +++ b/packages/hedera/src/ledger/HederaLedgerService.ts @@ -355,6 +355,7 @@ export class HederaLedgerService { return id.includes('#') ? `#${id.split('#').pop()}` : id } + // biome-ignore lint/suspicious/noExplicitAny: private getDiff(currentArray?: any[], newArray?: any[]) { const currentList = currentArray || [] const newList = newArray || [] @@ -370,6 +371,7 @@ export class HederaLedgerService { } private async signRequests( + // biome-ignore lint/suspicious/noExplicitAny: signingRequests: Record, kms: KeyManagementApi, keyId: string @@ -398,6 +400,7 @@ export class HederaLedgerService { 'keyAgreement', ] for (const field of fields) { + // biome-ignore lint/suspicious/noExplicitAny: const fieldValue = (didDocument as any)[field] if (fieldValue) { const fieldValues = Array.isArray(fieldValue) ? fieldValue : [fieldValue] @@ -412,6 +415,7 @@ export class HederaLedgerService { } } + // biome-ignore lint/suspicious/noExplicitAny: private prepareDidUpdates(currentDoc: any, newDoc: any, operation: string): DIDUpdateBuilder { const builder = new DIDUpdateBuilder() const fields = [ @@ -464,7 +468,9 @@ export class HederaLedgerService { builder: DIDUpdateBuilder, field: string, action: 'add' | 'remove' + // biome-ignore lint/suspicious/noExplicitAny: ): (item: any) => DIDUpdateBuilder { + // biome-ignore lint/suspicious/noExplicitAny: type MethodDelegate = (item: any) => DIDUpdateBuilder const methodMap: Record> = { diff --git a/packages/hedera/tests/integration/HederaAnoncredsRegistry.e2e.test.ts b/packages/hedera/tests/integration/HederaAnoncredsRegistry.e2e.test.ts index 667f1f7e7e..c12ea35edb 100644 --- a/packages/hedera/tests/integration/HederaAnoncredsRegistry.e2e.test.ts +++ b/packages/hedera/tests/integration/HederaAnoncredsRegistry.e2e.test.ts @@ -63,7 +63,7 @@ describe('Hedera AnonCreds support', () => { credentialDefinition: { tag: 'default', issuerId: did, - schemaId: schemaId!, + schemaId: schemaId, }, options: { supportRevocation: true, diff --git a/packages/hedera/tests/integration/HederaDidRegistrar.e2e.test.ts b/packages/hedera/tests/integration/HederaDidRegistrar.e2e.test.ts index 193c796b40..31ce111451 100644 --- a/packages/hedera/tests/integration/HederaDidRegistrar.e2e.test.ts +++ b/packages/hedera/tests/integration/HederaDidRegistrar.e2e.test.ts @@ -132,7 +132,6 @@ describe('Hedera DID registrar', () => { }) it('should create a did:hedera did document, add and remove service', async () => { - // create document const didResult = await agent.dids.create({ method: 'hedera', options: { @@ -141,11 +140,10 @@ describe('Hedera DID registrar', () => { }) expect(didResult).toMatchObject({ didState: { state: 'finished' } }) - const did = didResult.didState.did! + const did = didResult.didState.did ?? '' const didDocument = didResult.didState.didDocument as DidDocument didDocument.service = [validService()] - // add service to the document const addUpdateResult = await agent.dids.update({ did, didDocument, @@ -171,7 +169,6 @@ describe('Hedera DID registrar', () => { ]) ) - // remove service from the document const removeUpdateResult = await agent.dids.update({ did, didDocument: { @@ -206,20 +203,18 @@ describe('Hedera DID registrar', () => { }, ] - // create did document const didResult = await agent.dids.create({ method: 'hedera', options: { network: 'testnet' }, }) expect(didResult).toMatchObject({ didState: { state: 'finished' } }) - const did = didResult.didState.did! + const did = didResult.didState.did ?? '' const didDocument = didResult.didState.didDocument as DidDocument const validVerification = validVerificationMethod(multibasePublicKey) didDocument.verificationMethod = [validVerification] - // add verification method to the document const addUpdateResult = await agent.dids.update({ did, didDocument, @@ -247,7 +242,6 @@ describe('Hedera DID registrar', () => { ]) ) - // remove verification method from the document const removeUpdateResult = await agent.dids.update({ did, didDocument, @@ -276,20 +270,18 @@ describe('Hedera DID registrar', () => { }) const multibasePublicKey = getMultibasePublicKey(publicJwk) - // create did document const didResult = await agent.dids.create({ method: 'hedera', options: { network: 'testnet' }, }) expect(didResult).toMatchObject({ didState: { state: 'finished' } }) - const did = didResult.didState.did! + const did = didResult.didState.did ?? '' const didDocument = didResult.didState.didDocument as DidDocument const validVerification = validVerificationMethod(multibasePublicKey) didDocument.verificationMethod = [validVerification] - // add verification method to the document let updateResult = await agent.dids.update({ did, didDocument, @@ -301,7 +293,6 @@ describe('Hedera DID registrar', () => { 'Unable update DID: Key #key-1 from verificationMethod not found in keys' ) - // add assertion method to the document didDocument.verificationMethod = undefined didDocument.assertionMethod = [validVerification] @@ -316,7 +307,6 @@ describe('Hedera DID registrar', () => { 'Unable update DID: Key #key-1 from assertionMethod not found in keys' ) - // add authentication method to the document didDocument.assertionMethod = undefined didDocument.authentication = [validVerification] @@ -331,7 +321,6 @@ describe('Hedera DID registrar', () => { 'Unable update DID: Key #key-1 from authentication not found in keys' ) - // add authentication method to the document didDocument.authentication = undefined didDocument.capabilityDelegation = [validVerification] @@ -346,7 +335,6 @@ describe('Hedera DID registrar', () => { 'Unable update DID: Key #key-1 from capabilityDelegation not found in keys' ) - // add authentication method to the document didDocument.capabilityDelegation = undefined didDocument.capabilityInvocation = [validVerification] @@ -361,7 +349,6 @@ describe('Hedera DID registrar', () => { 'Unable update DID: Key #key-1 from capabilityInvocation not found in keys' ) - // add authentication method to the document didDocument.capabilityInvocation = undefined didDocument.keyAgreement = [validVerification] @@ -384,7 +371,7 @@ describe('Hedera DID registrar', () => { }) expect(didResult).toMatchObject({ didState: { state: 'finished' } }) - const did = didResult.didState.did! + const did = didResult.didState.did ?? '' const deactivateResult = await agent.dids.deactivate({ did, diff --git a/packages/hedera/tests/integration/HederaDidResolver.e2e.test.ts b/packages/hedera/tests/integration/HederaDidResolver.e2e.test.ts index c92aa547d7..c7169f6b48 100644 --- a/packages/hedera/tests/integration/HederaDidResolver.e2e.test.ts +++ b/packages/hedera/tests/integration/HederaDidResolver.e2e.test.ts @@ -28,7 +28,7 @@ describe('Hedera DID resolver', () => { await agent.shutdown() }) - it('should resolve a did:cheqd did from local testnet', async () => { + it('should resolve a did:hedera did from local testnet', async () => { const resolveResult = await agent.dids.resolve(did) expect(JsonTransformer.toJSON(resolveResult)).toMatchObject({ diff --git a/packages/hedera/tests/integration/utils/testCache.ts b/packages/hedera/tests/integration/utils/testCache.ts index 5df1c9d1b2..22249ef0d5 100644 --- a/packages/hedera/tests/integration/utils/testCache.ts +++ b/packages/hedera/tests/integration/utils/testCache.ts @@ -1,6 +1,7 @@ import type { AgentContext, Cache } from '@credo-ts/core' export class testCache implements Cache { + // biome-ignore lint/suspicious/noExplicitAny: private _cache: Map = new Map() get(_agentContext: AgentContext, key: string): Promise { diff --git a/packages/hedera/tests/unit/hedera-anoncres-registry.test.ts b/packages/hedera/tests/unit/hedera-anoncres-registry.test.ts index 6674326f59..a181c7bb62 100644 --- a/packages/hedera/tests/unit/hedera-anoncres-registry.test.ts +++ b/packages/hedera/tests/unit/hedera-anoncres-registry.test.ts @@ -34,6 +34,7 @@ const createMockAgentContext = () => describe('HederaAnonCredsRegistry', () => { let service: HederaAnonCredsRegistry let mockAgentContext: AgentContext + // biome-ignore lint/suspicious/noExplicitAny: let mockLedgerService: any beforeEach(() => { @@ -137,8 +138,18 @@ describe('HederaAnonCredsRegistry', () => { describe('registerCredentialDefinition', () => { const options: RegisterCredentialDefinitionOptions = { - credentialDefinition: { issuerId: 'did:hedera:issuer' }, - } as any + options: {}, + credentialDefinition: { + issuerId: 'did:hedera:issuer', + schemaId: '', + type: 'CL', + tag: '', + value: { + primary: {}, + revocation: undefined, + }, + }, + } it('should call ledgerService.registerCredentialDefinition and return result on success', async () => { const expected: RegisterCredentialDefinitionReturn = { @@ -223,8 +234,24 @@ describe('HederaAnonCredsRegistry', () => { describe('registerRevocationRegistryDefinition', () => { const options: RegisterRevocationRegistryDefinitionOptions = { - revocationRegistryDefinition: { credDefId: 'credDef1', issuerId: 'did:hedera:issuer' }, - } as any + options: {}, + revocationRegistryDefinition: { + credDefId: 'credDef1', + issuerId: 'did:hedera:issuer', + revocDefType: 'CL_ACCUM', + tag: '', + value: { + publicKeys: { + accumKey: { + z: '', + }, + }, + maxCredNum: 0, + tailsLocation: '', + tailsHash: '', + }, + }, + } it('should call ledgerService.registerRevocationRegistryDefinition and return result on success', async () => { const expected: RegisterRevocationRegistryDefinitionReturn = { @@ -318,8 +345,14 @@ describe('HederaAnonCredsRegistry', () => { describe('registerRevocationStatusList', () => { const options: RegisterRevocationStatusListOptions = { - revocationStatusList: { revRegDefId: 'regDef1', issuerId: 'did:hedera:issuer' }, - } as any + options: {}, + revocationStatusList: { + revRegDefId: 'regDef1', + issuerId: 'did:hedera:issuer', + revocationList: [], + currentAccumulator: '', + }, + } it('should call ledgerService.registerRevocationStatusList and return result on success', async () => { const expected: RegisterRevocationStatusListReturn = { diff --git a/packages/hedera/tests/unit/hedera-did-registrar.test.ts b/packages/hedera/tests/unit/hedera-did-registrar.test.ts index e26f90e5b4..d17a88ba6e 100644 --- a/packages/hedera/tests/unit/hedera-did-registrar.test.ts +++ b/packages/hedera/tests/unit/hedera-did-registrar.test.ts @@ -5,8 +5,11 @@ import { HederaDidUpdateOptions } from '../../src/ledger/HederaLedgerService' describe('HederaDidRegistrar', () => { let service: HederaDidRegistrar + // biome-ignore lint/suspicious/noExplicitAny: let mockAgentContext: any + // biome-ignore lint/suspicious/noExplicitAny: let mockDidRepository: any + // biome-ignore lint/suspicious/noExplicitAny: let mockLedgerService: any beforeEach(() => { @@ -30,6 +33,7 @@ describe('HederaDidRegistrar', () => { mockAgentContext = { dependencyManager: { + // biome-ignore lint/suspicious/noExplicitAny: resolve: jest.fn().mockImplementation((obj: any) => { if (obj.name === 'DidRepository') return mockDidRepository if (obj.name === 'HederaLedgerService') return mockLedgerService @@ -53,13 +57,10 @@ describe('HederaDidRegistrar', () => { mockLedgerService.createDid.mockResolvedValue({ did, didDocument, rootKey }) - const result = await service.create( - mockAgentContext as AgentContext, - { - method: 'hedera', - options: {}, - } as any - ) + const result = await service.create(mockAgentContext as AgentContext, { + method: 'hedera', + options: {}, + }) expect(mockDidRepository.save).toHaveBeenCalled() const savedRecord = mockDidRepository.save.mock.calls[0][1] @@ -76,13 +77,10 @@ describe('HederaDidRegistrar', () => { it('should handle error and return failed state', async () => { mockLedgerService.createDid.mockRejectedValue(new Error('Create failed')) - const result = await service.create( - mockAgentContext as AgentContext, - { - method: 'hedera', - options: {}, - } as any - ) + const result = await service.create(mockAgentContext as AgentContext, { + method: 'hedera', + options: {}, + }) expect(mockAgentContext.config.logger.debug).toHaveBeenCalledWith('Error creating DID', expect.any(Object)) @@ -149,9 +147,10 @@ describe('HederaDidRegistrar', () => { mockLedgerService.resolveDid.mockResolvedValue({ didDocument: null, didDocumentMetadata: { deactivated: true } }) mockDidRepository.findCreatedDid.mockResolvedValue(null) - const options = { + const options: HederaDidUpdateOptions = { did, - } as any + didDocument: {}, + } const result = await service.update(mockAgentContext as AgentContext, options) @@ -162,10 +161,11 @@ describe('HederaDidRegistrar', () => { it('should handle error and return failed state', async () => { mockLedgerService.resolveDid.mockRejectedValue(new Error('Update failed')) - const options = { + const options: HederaDidUpdateOptions = { did, didDocumentOperation: 'setDidDocument', - } as any + didDocument: {}, + } const result = await service.update(mockAgentContext as AgentContext, options) @@ -249,6 +249,7 @@ describe('HederaDidRegistrar', () => { const keys2 = [{ didDocumentRelativeKeyId: 'key2' }, { didDocumentRelativeKeyId: 'key3' }] as DidDocumentKey[] + // biome-ignore lint/suspicious/noExplicitAny: const result = (service as any).concatKeys(keys1, keys2) expect(result).toHaveLength(3) @@ -262,6 +263,7 @@ describe('HederaDidRegistrar', () => { }) it('should handle undefined arguments and return empty array', () => { + // biome-ignore lint/suspicious/noExplicitAny: const result = (service as any).concatKeys(undefined, undefined) expect(result).toEqual([]) }) diff --git a/packages/hedera/tests/unit/hedera-did-resolver.test.ts b/packages/hedera/tests/unit/hedera-did-resolver.test.ts index 0e9f2ae0fd..8128a7371e 100644 --- a/packages/hedera/tests/unit/hedera-did-resolver.test.ts +++ b/packages/hedera/tests/unit/hedera-did-resolver.test.ts @@ -4,7 +4,9 @@ import { HederaLedgerService } from '../../src/ledger/HederaLedgerService' describe('HederaDidResolver', () => { let resolver: HederaDidResolver + // biome-ignore lint/suspicious/noExplicitAny: let mockAgentContext: any + // biome-ignore lint/suspicious/noExplicitAny: let mockLedgerService: any beforeEach(() => { @@ -40,6 +42,7 @@ describe('HederaDidResolver', () => { jest.spyOn(JsonTransformer, 'fromJSON').mockReturnValue(fakeDidDocument as unknown as DidDocument) + // biome-ignore lint/suspicious/noExplicitAny: const result = await resolver.resolve(mockAgentContext, did, {} as any, {} as any) expect(mockAgentContext.config.logger.trace).toHaveBeenCalledWith('Try to resolve a did document from ledger') @@ -60,6 +63,7 @@ describe('HederaDidResolver', () => { mockLedgerService.resolveDid.mockRejectedValue(error) + // biome-ignore lint/suspicious/noExplicitAny: const result = await resolver.resolve(mockAgentContext, did, {} as any, {} as any) expect(mockAgentContext.config.logger.trace).toHaveBeenCalledWith('Try to resolve a did document from ledger') diff --git a/packages/hedera/tests/unit/hedera-ledger-service.test.ts b/packages/hedera/tests/unit/hedera-ledger-service.test.ts index 1468edfc1e..b359a4a627 100644 --- a/packages/hedera/tests/unit/hedera-ledger-service.test.ts +++ b/packages/hedera/tests/unit/hedera-ledger-service.test.ts @@ -9,7 +9,11 @@ import { AgentContext, DependencyManager } from '@credo-ts/core' import { DidDocumentKey, Kms } from '@credo-ts/core' import { KmsJwkPublicOkp } from '@credo-ts/core/src/modules/kms' import { Client } from '@hashgraph/sdk' -import { HederaDidCreateOptions, HederaLedgerService } from '../../src/ledger/HederaLedgerService' +import { + HederaDidCreateOptions, + HederaDidUpdateOptions, + HederaLedgerService, +} from '../../src/ledger/HederaLedgerService' jest.mock('@hiero-did-sdk/registrar', () => ({ DIDUpdateBuilder: jest.fn().mockReturnValue({ @@ -39,6 +43,7 @@ jest.mock('@hiero-did-sdk/registrar', () => ({ import { DIDUpdateBuilder, + UpdateDIDResult, generateCreateDIDRequest, generateDeactivateDIDRequest, generateUpdateDIDRequest, @@ -115,8 +120,10 @@ describe('HederaLedgerService', () => { }, }) - jest.spyOn(service.clientService, 'withClient').mockImplementation(async (_props, operation) => { + // biome-ignore lint/suspicious/noExplicitAny: + jest.spyOn((service as any).clientService, 'withClient').mockImplementation(async (_props, operation) => { const mockClient = {} as Client + // @ts-ignore return operation(mockClient) }) }) @@ -126,7 +133,6 @@ describe('HederaLedgerService', () => { const did = 'did:hedera:test' const mockResolution = { didDocument: { id: did } } - ;(resolveDID as jest.Mock).mockResolvedValue(mockResolution) const result = await service.resolveDid(mockAgentContext as AgentContext, did) @@ -151,19 +157,18 @@ describe('HederaLedgerService', () => { } mockedCreateOrGetKey.mockResolvedValue({ keyId, publicJwk }) - ;(generateCreateDIDRequest as jest.Mock).mockResolvedValue({ state: {}, signingRequest: { serializedPayload: new Uint8Array() }, }) - ;(submitCreateDIDRequest as jest.Mock).mockResolvedValue({ did: 'did:hedera:1234' }) + // biome-ignore lint/suspicious/noExplicitAny: jest.spyOn(service as any, 'getPublisher').mockResolvedValue({} as Publisher) mockKms.sign.mockResolvedValue({ signature: new Uint8Array([1, 2, 3]) }) - const result = await service.createDid(mockAgentContext as AgentContext, props as any) + const result = await service.createDid(mockAgentContext as AgentContext, props) expect(createOrGetKey).toHaveBeenCalledWith(mockKms, keyId) expect(generateCreateDIDRequest).toHaveBeenCalled() expect(submitCreateDIDRequest).toHaveBeenCalled() @@ -183,23 +188,25 @@ describe('HederaLedgerService', () => { } mockedCreateOrGetKey.mockResolvedValue({ keyId, publicJwk }) - ;(generateCreateDIDRequest as jest.Mock).mockResolvedValue({ state: {}, signingRequest: { serializedPayload: new Uint8Array() }, }) - ;(submitCreateDIDRequest as jest.Mock).mockResolvedValue({ did: 'did:hedera:1234' }) const updateDidSpy = jest .spyOn(service, 'updateDid') - .mockResolvedValue({ did: 'did:hedera:1234', someProp: true } as any) + .mockResolvedValue({ did: 'did:hedera:1234' } as unknown as UpdateDIDResult) + // biome-ignore lint/suspicious/noExplicitAny: jest.spyOn(service as any, 'getPublisher').mockResolvedValue({} as Publisher) mockKms.sign.mockResolvedValue({ signature: new Uint8Array([1, 2, 3]) }) - const result = await service.createDid(mockAgentContext as AgentContext, props as any) + const result = await service.createDid( + mockAgentContext as AgentContext, + props as unknown as HederaDidCreateOptions + ) expect(updateDidSpy).toHaveBeenCalled() expect(result.rootKey).toBeDefined() }) @@ -210,9 +217,9 @@ describe('HederaLedgerService', () => { const kmsKeyId = 'key-id' it('should throws error if didDocumentOperation is missing', async () => { - await expect(service.updateDid(mockAgentContext as AgentContext, { did } as any)).rejects.toThrow( - 'DidDocumentOperation is required' - ) + await expect( + service.updateDid(mockAgentContext as AgentContext, { did } as HederaDidUpdateOptions) + ).rejects.toThrow('DidDocumentOperation is required') }) it('should throws error if rootKey missing', async () => { @@ -271,6 +278,7 @@ describe('HederaLedgerService', () => { for (const [field, action, param, spy] of testCases) { jest.clearAllMocks() + // biome-ignore lint/suspicious/noExplicitAny: const fn = (service as any).getUpdateMethod(builder, field, action) const result = fn(param) @@ -286,6 +294,7 @@ describe('HederaLedgerService', () => { it('should returns builder unchanged for unknown field', () => { const unknownField = 'unknownField' + // biome-ignore lint/suspicious/noExplicitAny: const fn = (service as any).getUpdateMethod(builder, unknownField, 'add') const result = fn('any param') expect(result).toBe(builder) @@ -309,7 +318,7 @@ describe('HederaLedgerService', () => { const currentDidDoc = { verificationMethod: [{ id: '#abc' }] } const mockDidResolution = { didDocument: currentDidDoc } - const updatesMock = { build: jest.fn().mockReturnValue(didDocument) } as any + const updatesMock = { build: jest.fn().mockReturnValue(didDocument) } mockedParseDID.mockReturnValue({ network: 'testnet', @@ -317,17 +326,17 @@ describe('HederaLedgerService', () => { publicKey: '', topicId: '', }) - ;(resolveDID as jest.Mock).mockResolvedValue(mockDidResolution) + // biome-ignore lint/suspicious/noExplicitAny: jest.spyOn(service as any, 'prepareDidUpdates').mockReturnValue(updatesMock) + // biome-ignore lint/suspicious/noExplicitAny: jest.spyOn(service as any, 'getPublisher').mockResolvedValue({} as Publisher) - ;(generateUpdateDIDRequest as jest.Mock).mockResolvedValue({ states: {}, signingRequests: {} }) + // biome-ignore lint/suspicious/noExplicitAny: jest.spyOn(service as any, 'signRequests').mockResolvedValue(Promise.resolve()) - ;(submitUpdateDIDRequest as jest.Mock).mockResolvedValue({ did: did }) await expect( @@ -339,6 +348,7 @@ describe('HederaLedgerService', () => { }) ).resolves.toHaveProperty('did', did) + // biome-ignore lint/suspicious/noExplicitAny: expect((service as any).prepareDidUpdates).toHaveBeenCalled() expect(generateUpdateDIDRequest).toHaveBeenCalled() expect(submitUpdateDIDRequest).toHaveBeenCalled() @@ -351,7 +361,7 @@ describe('HederaLedgerService', () => { it('should throws error if rootKey is missing', async () => { await expect( - service.deactivateDid(mockAgentContext as AgentContext, { did, secret: { keys: [] } } as any) + service.deactivateDid(mockAgentContext as AgentContext, { did, secret: { keys: [] } }) ).rejects.toThrow('The root key not found in the KMS') }) @@ -377,25 +387,21 @@ describe('HederaLedgerService', () => { const mockState = {} const mockSigningRequest = { serializedPayload: new Uint8Array() } const signature = new Uint8Array([1, 2, 3]) - ;(parseDID as jest.Mock).mockReturnValue({ network: 'testnet' }) + // biome-ignore lint/suspicious/noExplicitAny: jest.spyOn(service as any, 'getPublisher').mockResolvedValue(mockPublisher) // @ts-ignore mockedGenerateDeactivateDIDRequest.mockResolvedValue({ state: mockState, signingRequest: mockSigningRequest }) mockKms.sign.mockResolvedValue({ signature }) - ;(submitDeactivateDIDRequest as jest.Mock).mockResolvedValue({ did }) - const result = await service.deactivateDid( - mockAgentContext as AgentContext, - { - did, - secret: { keys }, - } as any - ) + const result = await service.deactivateDid(mockAgentContext as AgentContext, { + did, + secret: { keys }, + }) expect(result).toHaveProperty('did', did) expect(mockKms.sign).toHaveBeenCalledWith({ @@ -407,6 +413,7 @@ describe('HederaLedgerService', () => { }) describe('Anoncreds SDK methods', () => { + // biome-ignore lint/suspicious/noExplicitAny: let mockSdk: any beforeEach(() => { @@ -420,6 +427,7 @@ describe('HederaLedgerService', () => { getRevocationStatusList: jest.fn().mockResolvedValue('revStatusList'), registerRevocationStatusList: jest.fn().mockResolvedValue('registerRevStatus'), } + // biome-ignore lint/suspicious/noExplicitAny: jest.spyOn(service as any, 'getHederaAnonCredsSdk').mockReturnValue(mockSdk) }) diff --git a/packages/hedera/tests/unit/kms-publisher.test.ts b/packages/hedera/tests/unit/kms-publisher.test.ts index ab5aea1bca..e76a8a59a8 100644 --- a/packages/hedera/tests/unit/kms-publisher.test.ts +++ b/packages/hedera/tests/unit/kms-publisher.test.ts @@ -1,4 +1,4 @@ -import { Kms, TypedArrayEncoder } from '@credo-ts/core' +import { AgentContext, Kms, TypedArrayEncoder } from '@credo-ts/core' import { KmsJwkPublicOkp } from '@credo-ts/core/src/modules/kms' import { KeysUtility } from '@hiero-did-sdk/core' import { KmsPublisher } from '../../src/ledger/publisher/KmsPublisher' @@ -23,6 +23,7 @@ jest.mock('../../src/ledger/utils', () => ({ createOrGetKey: jest.fn(), })) +import { Transaction } from '@hashgraph/sdk' import { createOrGetKey } from '../../src/ledger/utils' jest.mock('@hiero-did-sdk/publisher-internal', () => { @@ -98,6 +99,7 @@ describe('KmsPublisher', () => { }) it('should correctly create an instance via constructor', () => { + // biome-ignore lint/suspicious/noExplicitAny: const publisher = new KmsPublisher(agentContext as any, mockClient as any, key) expect(agentContext.dependencyManager.resolve).toHaveBeenCalledWith(expect.anything()) expect(publisher.publicKey()).toBe(fakePublicKey) @@ -108,7 +110,8 @@ describe('KmsPublisher', () => { publicJwk: { x: base64X, crv: 'Ed25519' }, }) - const publisher = new KmsPublisher(agentContext as any, mockClient as any, key) + // biome-ignore lint/suspicious/noExplicitAny: + const publisher = new KmsPublisher(agentContext as unknown as AgentContext, mockClient as any, key) await publisher.setKeyId('new-key-id') expect(createOrGetKey).toHaveBeenCalledWith(kmsMock, 'new-key-id') @@ -116,14 +119,17 @@ describe('KmsPublisher', () => { }) it('should return correct publicKey', () => { - const publisher = new KmsPublisher(agentContext as any, mockClient as any, key) + // biome-ignore lint/suspicious/noExplicitAny: + const publisher = new KmsPublisher(agentContext as unknown as AgentContext, mockClient as any, key) expect(publisher.publicKey()).toBe(fakePublicKey) }) it('should throw error in publish if key is not set', async () => { - const publisher = new KmsPublisher(agentContext as any, mockClient as any, key) + // biome-ignore lint/suspicious/noExplicitAny: + const publisher = new KmsPublisher(agentContext as unknown as AgentContext, mockClient as any, key) + // biome-ignore lint/suspicious/noExplicitAny: ;(publisher as any).submitPublicKey = undefined - await expect(publisher.publish({} as any)).rejects.toThrow('Need to setup the KeyId') + await expect(publisher.publish({} as unknown as Transaction)).rejects.toThrow('Need to setup the KeyId') }) }) From a4548253529384b145d8fa60e3652f17f203ec43 Mon Sep 17 00:00:00 2001 From: "andrey.kononov" Date: Thu, 14 Aug 2025 18:40:31 +0300 Subject: [PATCH 28/89] - fix: Switch to NPM + unit-tests --- demo/src/BaseAgent.ts | 8 ++- .../hedera/src/ledger/HederaLedgerService.ts | 6 ++ .../HederaAnoncredsRegistry.e2e.test.ts | 2 +- .../HederaDidRegistrar.e2e.test.ts | 21 ++----- .../integration/HederaDidResolver.e2e.test.ts | 2 +- .../tests/integration/utils/testCache.ts | 1 + .../unit/hedera-anoncres-registry.test.ts | 45 ++++++++++++-- .../tests/unit/hedera-did-registrar.test.ts | 38 ++++++------ .../tests/unit/hedera-did-resolver.test.ts | 4 ++ .../tests/unit/hedera-ledger-service.test.ts | 62 +++++++++++-------- .../hedera/tests/unit/kms-publisher.test.ts | 16 +++-- 11 files changed, 127 insertions(+), 78 deletions(-) diff --git a/demo/src/BaseAgent.ts b/demo/src/BaseAgent.ts index 417c8e53f6..ddad42b052 100644 --- a/demo/src/BaseAgent.ts +++ b/demo/src/BaseAgent.ts @@ -151,9 +151,11 @@ function getAskarAnonCredsIndyModules( hedera: new HederaModule({ networks: [ { - network: 'testnet', - operatorId: process.env.HEDERA_TEST_OPERATOR_ID ?? '', - operatorKey: process.env.HEDERA_TEST_OPERATOR_KEY ?? '', + network: (process.env.HEDERA_NETWORK as 'testnet' | 'mainnet' | 'previewnet' | 'local-node') ?? 'testnet', + operatorId: process.env.HEDERA_OPERATOR_ID ?? '0.0.5489553', + operatorKey: + process.env.HEDERA_OPERATOR_KEY ?? + '302e020100300506032b6570042204209f54b75b6238ced43e41b1463999cb40bf2f7dd2c9fd4fd3ef780027c016a138', }, ], }), diff --git a/packages/hedera/src/ledger/HederaLedgerService.ts b/packages/hedera/src/ledger/HederaLedgerService.ts index c694d7fc66..1f82379c5b 100644 --- a/packages/hedera/src/ledger/HederaLedgerService.ts +++ b/packages/hedera/src/ledger/HederaLedgerService.ts @@ -355,6 +355,7 @@ export class HederaLedgerService { return id.includes('#') ? `#${id.split('#').pop()}` : id } + // biome-ignore lint/suspicious/noExplicitAny: private getDiff(currentArray?: any[], newArray?: any[]) { const currentList = currentArray || [] const newList = newArray || [] @@ -370,6 +371,7 @@ export class HederaLedgerService { } private async signRequests( + // biome-ignore lint/suspicious/noExplicitAny: signingRequests: Record, kms: KeyManagementApi, keyId: string @@ -398,6 +400,7 @@ export class HederaLedgerService { 'keyAgreement', ] for (const field of fields) { + // biome-ignore lint/suspicious/noExplicitAny: const fieldValue = (didDocument as any)[field] if (fieldValue) { const fieldValues = Array.isArray(fieldValue) ? fieldValue : [fieldValue] @@ -412,6 +415,7 @@ export class HederaLedgerService { } } + // biome-ignore lint/suspicious/noExplicitAny: private prepareDidUpdates(currentDoc: any, newDoc: any, operation: string): DIDUpdateBuilder { const builder = new DIDUpdateBuilder() const fields = [ @@ -464,7 +468,9 @@ export class HederaLedgerService { builder: DIDUpdateBuilder, field: string, action: 'add' | 'remove' + // biome-ignore lint/suspicious/noExplicitAny: ): (item: any) => DIDUpdateBuilder { + // biome-ignore lint/suspicious/noExplicitAny: type MethodDelegate = (item: any) => DIDUpdateBuilder const methodMap: Record> = { diff --git a/packages/hedera/tests/integration/HederaAnoncredsRegistry.e2e.test.ts b/packages/hedera/tests/integration/HederaAnoncredsRegistry.e2e.test.ts index 667f1f7e7e..c12ea35edb 100644 --- a/packages/hedera/tests/integration/HederaAnoncredsRegistry.e2e.test.ts +++ b/packages/hedera/tests/integration/HederaAnoncredsRegistry.e2e.test.ts @@ -63,7 +63,7 @@ describe('Hedera AnonCreds support', () => { credentialDefinition: { tag: 'default', issuerId: did, - schemaId: schemaId!, + schemaId: schemaId, }, options: { supportRevocation: true, diff --git a/packages/hedera/tests/integration/HederaDidRegistrar.e2e.test.ts b/packages/hedera/tests/integration/HederaDidRegistrar.e2e.test.ts index 193c796b40..31ce111451 100644 --- a/packages/hedera/tests/integration/HederaDidRegistrar.e2e.test.ts +++ b/packages/hedera/tests/integration/HederaDidRegistrar.e2e.test.ts @@ -132,7 +132,6 @@ describe('Hedera DID registrar', () => { }) it('should create a did:hedera did document, add and remove service', async () => { - // create document const didResult = await agent.dids.create({ method: 'hedera', options: { @@ -141,11 +140,10 @@ describe('Hedera DID registrar', () => { }) expect(didResult).toMatchObject({ didState: { state: 'finished' } }) - const did = didResult.didState.did! + const did = didResult.didState.did ?? '' const didDocument = didResult.didState.didDocument as DidDocument didDocument.service = [validService()] - // add service to the document const addUpdateResult = await agent.dids.update({ did, didDocument, @@ -171,7 +169,6 @@ describe('Hedera DID registrar', () => { ]) ) - // remove service from the document const removeUpdateResult = await agent.dids.update({ did, didDocument: { @@ -206,20 +203,18 @@ describe('Hedera DID registrar', () => { }, ] - // create did document const didResult = await agent.dids.create({ method: 'hedera', options: { network: 'testnet' }, }) expect(didResult).toMatchObject({ didState: { state: 'finished' } }) - const did = didResult.didState.did! + const did = didResult.didState.did ?? '' const didDocument = didResult.didState.didDocument as DidDocument const validVerification = validVerificationMethod(multibasePublicKey) didDocument.verificationMethod = [validVerification] - // add verification method to the document const addUpdateResult = await agent.dids.update({ did, didDocument, @@ -247,7 +242,6 @@ describe('Hedera DID registrar', () => { ]) ) - // remove verification method from the document const removeUpdateResult = await agent.dids.update({ did, didDocument, @@ -276,20 +270,18 @@ describe('Hedera DID registrar', () => { }) const multibasePublicKey = getMultibasePublicKey(publicJwk) - // create did document const didResult = await agent.dids.create({ method: 'hedera', options: { network: 'testnet' }, }) expect(didResult).toMatchObject({ didState: { state: 'finished' } }) - const did = didResult.didState.did! + const did = didResult.didState.did ?? '' const didDocument = didResult.didState.didDocument as DidDocument const validVerification = validVerificationMethod(multibasePublicKey) didDocument.verificationMethod = [validVerification] - // add verification method to the document let updateResult = await agent.dids.update({ did, didDocument, @@ -301,7 +293,6 @@ describe('Hedera DID registrar', () => { 'Unable update DID: Key #key-1 from verificationMethod not found in keys' ) - // add assertion method to the document didDocument.verificationMethod = undefined didDocument.assertionMethod = [validVerification] @@ -316,7 +307,6 @@ describe('Hedera DID registrar', () => { 'Unable update DID: Key #key-1 from assertionMethod not found in keys' ) - // add authentication method to the document didDocument.assertionMethod = undefined didDocument.authentication = [validVerification] @@ -331,7 +321,6 @@ describe('Hedera DID registrar', () => { 'Unable update DID: Key #key-1 from authentication not found in keys' ) - // add authentication method to the document didDocument.authentication = undefined didDocument.capabilityDelegation = [validVerification] @@ -346,7 +335,6 @@ describe('Hedera DID registrar', () => { 'Unable update DID: Key #key-1 from capabilityDelegation not found in keys' ) - // add authentication method to the document didDocument.capabilityDelegation = undefined didDocument.capabilityInvocation = [validVerification] @@ -361,7 +349,6 @@ describe('Hedera DID registrar', () => { 'Unable update DID: Key #key-1 from capabilityInvocation not found in keys' ) - // add authentication method to the document didDocument.capabilityInvocation = undefined didDocument.keyAgreement = [validVerification] @@ -384,7 +371,7 @@ describe('Hedera DID registrar', () => { }) expect(didResult).toMatchObject({ didState: { state: 'finished' } }) - const did = didResult.didState.did! + const did = didResult.didState.did ?? '' const deactivateResult = await agent.dids.deactivate({ did, diff --git a/packages/hedera/tests/integration/HederaDidResolver.e2e.test.ts b/packages/hedera/tests/integration/HederaDidResolver.e2e.test.ts index c92aa547d7..c7169f6b48 100644 --- a/packages/hedera/tests/integration/HederaDidResolver.e2e.test.ts +++ b/packages/hedera/tests/integration/HederaDidResolver.e2e.test.ts @@ -28,7 +28,7 @@ describe('Hedera DID resolver', () => { await agent.shutdown() }) - it('should resolve a did:cheqd did from local testnet', async () => { + it('should resolve a did:hedera did from local testnet', async () => { const resolveResult = await agent.dids.resolve(did) expect(JsonTransformer.toJSON(resolveResult)).toMatchObject({ diff --git a/packages/hedera/tests/integration/utils/testCache.ts b/packages/hedera/tests/integration/utils/testCache.ts index 5df1c9d1b2..22249ef0d5 100644 --- a/packages/hedera/tests/integration/utils/testCache.ts +++ b/packages/hedera/tests/integration/utils/testCache.ts @@ -1,6 +1,7 @@ import type { AgentContext, Cache } from '@credo-ts/core' export class testCache implements Cache { + // biome-ignore lint/suspicious/noExplicitAny: private _cache: Map = new Map() get(_agentContext: AgentContext, key: string): Promise { diff --git a/packages/hedera/tests/unit/hedera-anoncres-registry.test.ts b/packages/hedera/tests/unit/hedera-anoncres-registry.test.ts index 6674326f59..a181c7bb62 100644 --- a/packages/hedera/tests/unit/hedera-anoncres-registry.test.ts +++ b/packages/hedera/tests/unit/hedera-anoncres-registry.test.ts @@ -34,6 +34,7 @@ const createMockAgentContext = () => describe('HederaAnonCredsRegistry', () => { let service: HederaAnonCredsRegistry let mockAgentContext: AgentContext + // biome-ignore lint/suspicious/noExplicitAny: let mockLedgerService: any beforeEach(() => { @@ -137,8 +138,18 @@ describe('HederaAnonCredsRegistry', () => { describe('registerCredentialDefinition', () => { const options: RegisterCredentialDefinitionOptions = { - credentialDefinition: { issuerId: 'did:hedera:issuer' }, - } as any + options: {}, + credentialDefinition: { + issuerId: 'did:hedera:issuer', + schemaId: '', + type: 'CL', + tag: '', + value: { + primary: {}, + revocation: undefined, + }, + }, + } it('should call ledgerService.registerCredentialDefinition and return result on success', async () => { const expected: RegisterCredentialDefinitionReturn = { @@ -223,8 +234,24 @@ describe('HederaAnonCredsRegistry', () => { describe('registerRevocationRegistryDefinition', () => { const options: RegisterRevocationRegistryDefinitionOptions = { - revocationRegistryDefinition: { credDefId: 'credDef1', issuerId: 'did:hedera:issuer' }, - } as any + options: {}, + revocationRegistryDefinition: { + credDefId: 'credDef1', + issuerId: 'did:hedera:issuer', + revocDefType: 'CL_ACCUM', + tag: '', + value: { + publicKeys: { + accumKey: { + z: '', + }, + }, + maxCredNum: 0, + tailsLocation: '', + tailsHash: '', + }, + }, + } it('should call ledgerService.registerRevocationRegistryDefinition and return result on success', async () => { const expected: RegisterRevocationRegistryDefinitionReturn = { @@ -318,8 +345,14 @@ describe('HederaAnonCredsRegistry', () => { describe('registerRevocationStatusList', () => { const options: RegisterRevocationStatusListOptions = { - revocationStatusList: { revRegDefId: 'regDef1', issuerId: 'did:hedera:issuer' }, - } as any + options: {}, + revocationStatusList: { + revRegDefId: 'regDef1', + issuerId: 'did:hedera:issuer', + revocationList: [], + currentAccumulator: '', + }, + } it('should call ledgerService.registerRevocationStatusList and return result on success', async () => { const expected: RegisterRevocationStatusListReturn = { diff --git a/packages/hedera/tests/unit/hedera-did-registrar.test.ts b/packages/hedera/tests/unit/hedera-did-registrar.test.ts index e26f90e5b4..d17a88ba6e 100644 --- a/packages/hedera/tests/unit/hedera-did-registrar.test.ts +++ b/packages/hedera/tests/unit/hedera-did-registrar.test.ts @@ -5,8 +5,11 @@ import { HederaDidUpdateOptions } from '../../src/ledger/HederaLedgerService' describe('HederaDidRegistrar', () => { let service: HederaDidRegistrar + // biome-ignore lint/suspicious/noExplicitAny: let mockAgentContext: any + // biome-ignore lint/suspicious/noExplicitAny: let mockDidRepository: any + // biome-ignore lint/suspicious/noExplicitAny: let mockLedgerService: any beforeEach(() => { @@ -30,6 +33,7 @@ describe('HederaDidRegistrar', () => { mockAgentContext = { dependencyManager: { + // biome-ignore lint/suspicious/noExplicitAny: resolve: jest.fn().mockImplementation((obj: any) => { if (obj.name === 'DidRepository') return mockDidRepository if (obj.name === 'HederaLedgerService') return mockLedgerService @@ -53,13 +57,10 @@ describe('HederaDidRegistrar', () => { mockLedgerService.createDid.mockResolvedValue({ did, didDocument, rootKey }) - const result = await service.create( - mockAgentContext as AgentContext, - { - method: 'hedera', - options: {}, - } as any - ) + const result = await service.create(mockAgentContext as AgentContext, { + method: 'hedera', + options: {}, + }) expect(mockDidRepository.save).toHaveBeenCalled() const savedRecord = mockDidRepository.save.mock.calls[0][1] @@ -76,13 +77,10 @@ describe('HederaDidRegistrar', () => { it('should handle error and return failed state', async () => { mockLedgerService.createDid.mockRejectedValue(new Error('Create failed')) - const result = await service.create( - mockAgentContext as AgentContext, - { - method: 'hedera', - options: {}, - } as any - ) + const result = await service.create(mockAgentContext as AgentContext, { + method: 'hedera', + options: {}, + }) expect(mockAgentContext.config.logger.debug).toHaveBeenCalledWith('Error creating DID', expect.any(Object)) @@ -149,9 +147,10 @@ describe('HederaDidRegistrar', () => { mockLedgerService.resolveDid.mockResolvedValue({ didDocument: null, didDocumentMetadata: { deactivated: true } }) mockDidRepository.findCreatedDid.mockResolvedValue(null) - const options = { + const options: HederaDidUpdateOptions = { did, - } as any + didDocument: {}, + } const result = await service.update(mockAgentContext as AgentContext, options) @@ -162,10 +161,11 @@ describe('HederaDidRegistrar', () => { it('should handle error and return failed state', async () => { mockLedgerService.resolveDid.mockRejectedValue(new Error('Update failed')) - const options = { + const options: HederaDidUpdateOptions = { did, didDocumentOperation: 'setDidDocument', - } as any + didDocument: {}, + } const result = await service.update(mockAgentContext as AgentContext, options) @@ -249,6 +249,7 @@ describe('HederaDidRegistrar', () => { const keys2 = [{ didDocumentRelativeKeyId: 'key2' }, { didDocumentRelativeKeyId: 'key3' }] as DidDocumentKey[] + // biome-ignore lint/suspicious/noExplicitAny: const result = (service as any).concatKeys(keys1, keys2) expect(result).toHaveLength(3) @@ -262,6 +263,7 @@ describe('HederaDidRegistrar', () => { }) it('should handle undefined arguments and return empty array', () => { + // biome-ignore lint/suspicious/noExplicitAny: const result = (service as any).concatKeys(undefined, undefined) expect(result).toEqual([]) }) diff --git a/packages/hedera/tests/unit/hedera-did-resolver.test.ts b/packages/hedera/tests/unit/hedera-did-resolver.test.ts index 0e9f2ae0fd..8128a7371e 100644 --- a/packages/hedera/tests/unit/hedera-did-resolver.test.ts +++ b/packages/hedera/tests/unit/hedera-did-resolver.test.ts @@ -4,7 +4,9 @@ import { HederaLedgerService } from '../../src/ledger/HederaLedgerService' describe('HederaDidResolver', () => { let resolver: HederaDidResolver + // biome-ignore lint/suspicious/noExplicitAny: let mockAgentContext: any + // biome-ignore lint/suspicious/noExplicitAny: let mockLedgerService: any beforeEach(() => { @@ -40,6 +42,7 @@ describe('HederaDidResolver', () => { jest.spyOn(JsonTransformer, 'fromJSON').mockReturnValue(fakeDidDocument as unknown as DidDocument) + // biome-ignore lint/suspicious/noExplicitAny: const result = await resolver.resolve(mockAgentContext, did, {} as any, {} as any) expect(mockAgentContext.config.logger.trace).toHaveBeenCalledWith('Try to resolve a did document from ledger') @@ -60,6 +63,7 @@ describe('HederaDidResolver', () => { mockLedgerService.resolveDid.mockRejectedValue(error) + // biome-ignore lint/suspicious/noExplicitAny: const result = await resolver.resolve(mockAgentContext, did, {} as any, {} as any) expect(mockAgentContext.config.logger.trace).toHaveBeenCalledWith('Try to resolve a did document from ledger') diff --git a/packages/hedera/tests/unit/hedera-ledger-service.test.ts b/packages/hedera/tests/unit/hedera-ledger-service.test.ts index 1468edfc1e..b359a4a627 100644 --- a/packages/hedera/tests/unit/hedera-ledger-service.test.ts +++ b/packages/hedera/tests/unit/hedera-ledger-service.test.ts @@ -9,7 +9,11 @@ import { AgentContext, DependencyManager } from '@credo-ts/core' import { DidDocumentKey, Kms } from '@credo-ts/core' import { KmsJwkPublicOkp } from '@credo-ts/core/src/modules/kms' import { Client } from '@hashgraph/sdk' -import { HederaDidCreateOptions, HederaLedgerService } from '../../src/ledger/HederaLedgerService' +import { + HederaDidCreateOptions, + HederaDidUpdateOptions, + HederaLedgerService, +} from '../../src/ledger/HederaLedgerService' jest.mock('@hiero-did-sdk/registrar', () => ({ DIDUpdateBuilder: jest.fn().mockReturnValue({ @@ -39,6 +43,7 @@ jest.mock('@hiero-did-sdk/registrar', () => ({ import { DIDUpdateBuilder, + UpdateDIDResult, generateCreateDIDRequest, generateDeactivateDIDRequest, generateUpdateDIDRequest, @@ -115,8 +120,10 @@ describe('HederaLedgerService', () => { }, }) - jest.spyOn(service.clientService, 'withClient').mockImplementation(async (_props, operation) => { + // biome-ignore lint/suspicious/noExplicitAny: + jest.spyOn((service as any).clientService, 'withClient').mockImplementation(async (_props, operation) => { const mockClient = {} as Client + // @ts-ignore return operation(mockClient) }) }) @@ -126,7 +133,6 @@ describe('HederaLedgerService', () => { const did = 'did:hedera:test' const mockResolution = { didDocument: { id: did } } - ;(resolveDID as jest.Mock).mockResolvedValue(mockResolution) const result = await service.resolveDid(mockAgentContext as AgentContext, did) @@ -151,19 +157,18 @@ describe('HederaLedgerService', () => { } mockedCreateOrGetKey.mockResolvedValue({ keyId, publicJwk }) - ;(generateCreateDIDRequest as jest.Mock).mockResolvedValue({ state: {}, signingRequest: { serializedPayload: new Uint8Array() }, }) - ;(submitCreateDIDRequest as jest.Mock).mockResolvedValue({ did: 'did:hedera:1234' }) + // biome-ignore lint/suspicious/noExplicitAny: jest.spyOn(service as any, 'getPublisher').mockResolvedValue({} as Publisher) mockKms.sign.mockResolvedValue({ signature: new Uint8Array([1, 2, 3]) }) - const result = await service.createDid(mockAgentContext as AgentContext, props as any) + const result = await service.createDid(mockAgentContext as AgentContext, props) expect(createOrGetKey).toHaveBeenCalledWith(mockKms, keyId) expect(generateCreateDIDRequest).toHaveBeenCalled() expect(submitCreateDIDRequest).toHaveBeenCalled() @@ -183,23 +188,25 @@ describe('HederaLedgerService', () => { } mockedCreateOrGetKey.mockResolvedValue({ keyId, publicJwk }) - ;(generateCreateDIDRequest as jest.Mock).mockResolvedValue({ state: {}, signingRequest: { serializedPayload: new Uint8Array() }, }) - ;(submitCreateDIDRequest as jest.Mock).mockResolvedValue({ did: 'did:hedera:1234' }) const updateDidSpy = jest .spyOn(service, 'updateDid') - .mockResolvedValue({ did: 'did:hedera:1234', someProp: true } as any) + .mockResolvedValue({ did: 'did:hedera:1234' } as unknown as UpdateDIDResult) + // biome-ignore lint/suspicious/noExplicitAny: jest.spyOn(service as any, 'getPublisher').mockResolvedValue({} as Publisher) mockKms.sign.mockResolvedValue({ signature: new Uint8Array([1, 2, 3]) }) - const result = await service.createDid(mockAgentContext as AgentContext, props as any) + const result = await service.createDid( + mockAgentContext as AgentContext, + props as unknown as HederaDidCreateOptions + ) expect(updateDidSpy).toHaveBeenCalled() expect(result.rootKey).toBeDefined() }) @@ -210,9 +217,9 @@ describe('HederaLedgerService', () => { const kmsKeyId = 'key-id' it('should throws error if didDocumentOperation is missing', async () => { - await expect(service.updateDid(mockAgentContext as AgentContext, { did } as any)).rejects.toThrow( - 'DidDocumentOperation is required' - ) + await expect( + service.updateDid(mockAgentContext as AgentContext, { did } as HederaDidUpdateOptions) + ).rejects.toThrow('DidDocumentOperation is required') }) it('should throws error if rootKey missing', async () => { @@ -271,6 +278,7 @@ describe('HederaLedgerService', () => { for (const [field, action, param, spy] of testCases) { jest.clearAllMocks() + // biome-ignore lint/suspicious/noExplicitAny: const fn = (service as any).getUpdateMethod(builder, field, action) const result = fn(param) @@ -286,6 +294,7 @@ describe('HederaLedgerService', () => { it('should returns builder unchanged for unknown field', () => { const unknownField = 'unknownField' + // biome-ignore lint/suspicious/noExplicitAny: const fn = (service as any).getUpdateMethod(builder, unknownField, 'add') const result = fn('any param') expect(result).toBe(builder) @@ -309,7 +318,7 @@ describe('HederaLedgerService', () => { const currentDidDoc = { verificationMethod: [{ id: '#abc' }] } const mockDidResolution = { didDocument: currentDidDoc } - const updatesMock = { build: jest.fn().mockReturnValue(didDocument) } as any + const updatesMock = { build: jest.fn().mockReturnValue(didDocument) } mockedParseDID.mockReturnValue({ network: 'testnet', @@ -317,17 +326,17 @@ describe('HederaLedgerService', () => { publicKey: '', topicId: '', }) - ;(resolveDID as jest.Mock).mockResolvedValue(mockDidResolution) + // biome-ignore lint/suspicious/noExplicitAny: jest.spyOn(service as any, 'prepareDidUpdates').mockReturnValue(updatesMock) + // biome-ignore lint/suspicious/noExplicitAny: jest.spyOn(service as any, 'getPublisher').mockResolvedValue({} as Publisher) - ;(generateUpdateDIDRequest as jest.Mock).mockResolvedValue({ states: {}, signingRequests: {} }) + // biome-ignore lint/suspicious/noExplicitAny: jest.spyOn(service as any, 'signRequests').mockResolvedValue(Promise.resolve()) - ;(submitUpdateDIDRequest as jest.Mock).mockResolvedValue({ did: did }) await expect( @@ -339,6 +348,7 @@ describe('HederaLedgerService', () => { }) ).resolves.toHaveProperty('did', did) + // biome-ignore lint/suspicious/noExplicitAny: expect((service as any).prepareDidUpdates).toHaveBeenCalled() expect(generateUpdateDIDRequest).toHaveBeenCalled() expect(submitUpdateDIDRequest).toHaveBeenCalled() @@ -351,7 +361,7 @@ describe('HederaLedgerService', () => { it('should throws error if rootKey is missing', async () => { await expect( - service.deactivateDid(mockAgentContext as AgentContext, { did, secret: { keys: [] } } as any) + service.deactivateDid(mockAgentContext as AgentContext, { did, secret: { keys: [] } }) ).rejects.toThrow('The root key not found in the KMS') }) @@ -377,25 +387,21 @@ describe('HederaLedgerService', () => { const mockState = {} const mockSigningRequest = { serializedPayload: new Uint8Array() } const signature = new Uint8Array([1, 2, 3]) - ;(parseDID as jest.Mock).mockReturnValue({ network: 'testnet' }) + // biome-ignore lint/suspicious/noExplicitAny: jest.spyOn(service as any, 'getPublisher').mockResolvedValue(mockPublisher) // @ts-ignore mockedGenerateDeactivateDIDRequest.mockResolvedValue({ state: mockState, signingRequest: mockSigningRequest }) mockKms.sign.mockResolvedValue({ signature }) - ;(submitDeactivateDIDRequest as jest.Mock).mockResolvedValue({ did }) - const result = await service.deactivateDid( - mockAgentContext as AgentContext, - { - did, - secret: { keys }, - } as any - ) + const result = await service.deactivateDid(mockAgentContext as AgentContext, { + did, + secret: { keys }, + }) expect(result).toHaveProperty('did', did) expect(mockKms.sign).toHaveBeenCalledWith({ @@ -407,6 +413,7 @@ describe('HederaLedgerService', () => { }) describe('Anoncreds SDK methods', () => { + // biome-ignore lint/suspicious/noExplicitAny: let mockSdk: any beforeEach(() => { @@ -420,6 +427,7 @@ describe('HederaLedgerService', () => { getRevocationStatusList: jest.fn().mockResolvedValue('revStatusList'), registerRevocationStatusList: jest.fn().mockResolvedValue('registerRevStatus'), } + // biome-ignore lint/suspicious/noExplicitAny: jest.spyOn(service as any, 'getHederaAnonCredsSdk').mockReturnValue(mockSdk) }) diff --git a/packages/hedera/tests/unit/kms-publisher.test.ts b/packages/hedera/tests/unit/kms-publisher.test.ts index ab5aea1bca..e76a8a59a8 100644 --- a/packages/hedera/tests/unit/kms-publisher.test.ts +++ b/packages/hedera/tests/unit/kms-publisher.test.ts @@ -1,4 +1,4 @@ -import { Kms, TypedArrayEncoder } from '@credo-ts/core' +import { AgentContext, Kms, TypedArrayEncoder } from '@credo-ts/core' import { KmsJwkPublicOkp } from '@credo-ts/core/src/modules/kms' import { KeysUtility } from '@hiero-did-sdk/core' import { KmsPublisher } from '../../src/ledger/publisher/KmsPublisher' @@ -23,6 +23,7 @@ jest.mock('../../src/ledger/utils', () => ({ createOrGetKey: jest.fn(), })) +import { Transaction } from '@hashgraph/sdk' import { createOrGetKey } from '../../src/ledger/utils' jest.mock('@hiero-did-sdk/publisher-internal', () => { @@ -98,6 +99,7 @@ describe('KmsPublisher', () => { }) it('should correctly create an instance via constructor', () => { + // biome-ignore lint/suspicious/noExplicitAny: const publisher = new KmsPublisher(agentContext as any, mockClient as any, key) expect(agentContext.dependencyManager.resolve).toHaveBeenCalledWith(expect.anything()) expect(publisher.publicKey()).toBe(fakePublicKey) @@ -108,7 +110,8 @@ describe('KmsPublisher', () => { publicJwk: { x: base64X, crv: 'Ed25519' }, }) - const publisher = new KmsPublisher(agentContext as any, mockClient as any, key) + // biome-ignore lint/suspicious/noExplicitAny: + const publisher = new KmsPublisher(agentContext as unknown as AgentContext, mockClient as any, key) await publisher.setKeyId('new-key-id') expect(createOrGetKey).toHaveBeenCalledWith(kmsMock, 'new-key-id') @@ -116,14 +119,17 @@ describe('KmsPublisher', () => { }) it('should return correct publicKey', () => { - const publisher = new KmsPublisher(agentContext as any, mockClient as any, key) + // biome-ignore lint/suspicious/noExplicitAny: + const publisher = new KmsPublisher(agentContext as unknown as AgentContext, mockClient as any, key) expect(publisher.publicKey()).toBe(fakePublicKey) }) it('should throw error in publish if key is not set', async () => { - const publisher = new KmsPublisher(agentContext as any, mockClient as any, key) + // biome-ignore lint/suspicious/noExplicitAny: + const publisher = new KmsPublisher(agentContext as unknown as AgentContext, mockClient as any, key) + // biome-ignore lint/suspicious/noExplicitAny: ;(publisher as any).submitPublicKey = undefined - await expect(publisher.publish({} as any)).rejects.toThrow('Need to setup the KeyId') + await expect(publisher.publish({} as unknown as Transaction)).rejects.toThrow('Need to setup the KeyId') }) }) From 42c35d36290c02d710a5623b6295620463434dba Mon Sep 17 00:00:00 2001 From: "andrey.kononov" Date: Thu, 14 Aug 2025 18:58:27 +0300 Subject: [PATCH 29/89] - fix: add hedera anoncreds registry support to the demo --- demo/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/demo/package.json b/demo/package.json index 06a0eebdcc..5079e76896 100644 --- a/demo/package.json +++ b/demo/package.json @@ -1,6 +1,6 @@ { "name": "credo-demo", - "version": "1.0.0", + "version": "1.0.1", "private": true, "repository": { "type": "git", From 324179411de41b2fcbbdb4d9c2ed8b3e7728d616 Mon Sep 17 00:00:00 2001 From: "andrey.kononov" Date: Thu, 14 Aug 2025 19:14:53 +0300 Subject: [PATCH 30/89] Fix the github action for hedera e2e tests support --- .github/workflows/continuous-integration.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/continuous-integration.yml b/.github/workflows/continuous-integration.yml index f4db74d324..3261d69c2d 100644 --- a/.github/workflows/continuous-integration.yml +++ b/.github/workflows/continuous-integration.yml @@ -142,6 +142,12 @@ jobs: run: pnpm install --frozen-lockfile - name: Run tests + timeout-minutes: 15 + env: + # HEDERA_OPERATOR_ID: ${{ secrets.HEDERA_OPERATOR_ID }} + # HEDERA_OPERATOR_KEY: ${{ secrets.HEDERA_OPERATOR_KEY }} + HEDERA_OPERATOR_ID: '0.0.5489553' + HEDERA_OPERATOR_KEY: '302e020100300506032b6570042204209f54b75b6238ced43e41b1463999cb40bf2f7dd2c9fd4fd3ef780027c016a138' run: pnpm test:e2e --coverage --forceExit # Upload coverage for e2e From 787779fdc82bdcc0bdd4fc2cd488357594583baa Mon Sep 17 00:00:00 2001 From: "andrey.kononov" Date: Thu, 14 Aug 2025 19:21:36 +0300 Subject: [PATCH 31/89] Restart github actions --- packages/hedera/tests/unit/hedera-did-registrar.test.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/hedera/tests/unit/hedera-did-registrar.test.ts b/packages/hedera/tests/unit/hedera-did-registrar.test.ts index d17a88ba6e..52b33083d5 100644 --- a/packages/hedera/tests/unit/hedera-did-registrar.test.ts +++ b/packages/hedera/tests/unit/hedera-did-registrar.test.ts @@ -1,4 +1,5 @@ import type { AgentContext, DidDocumentKey } from '@credo-ts/core' + import { DidDocumentRole } from '@credo-ts/core' import { HederaDidRegistrar } from '@credo-ts/hedera' import { HederaDidUpdateOptions } from '../../src/ledger/HederaLedgerService' From f2ea20af5ace12b2d3050fae1da2d23f3d09f565 Mon Sep 17 00:00:00 2001 From: "andrey.kononov" Date: Thu, 14 Aug 2025 19:22:28 +0300 Subject: [PATCH 32/89] Restart github actions --- .github/workflows/continuous-integration.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/continuous-integration.yml b/.github/workflows/continuous-integration.yml index 3261d69c2d..68283a099e 100644 --- a/.github/workflows/continuous-integration.yml +++ b/.github/workflows/continuous-integration.yml @@ -144,10 +144,10 @@ jobs: - name: Run tests timeout-minutes: 15 env: - # HEDERA_OPERATOR_ID: ${{ secrets.HEDERA_OPERATOR_ID }} - # HEDERA_OPERATOR_KEY: ${{ secrets.HEDERA_OPERATOR_KEY }} - HEDERA_OPERATOR_ID: '0.0.5489553' - HEDERA_OPERATOR_KEY: '302e020100300506032b6570042204209f54b75b6238ced43e41b1463999cb40bf2f7dd2c9fd4fd3ef780027c016a138' + # HEDERA_OPERATOR_ID: ${{ secrets.HEDERA_OPERATOR_ID }} + # HEDERA_OPERATOR_KEY: ${{ secrets.HEDERA_OPERATOR_KEY }} + HEDERA_OPERATOR_ID: '0.0.5489553' + HEDERA_OPERATOR_KEY: '302e020100300506032b6570042204209f54b75b6238ced43e41b1463999cb40bf2f7dd2c9fd4fd3ef780027c016a138' run: pnpm test:e2e --coverage --forceExit # Upload coverage for e2e From 6cbe8b5432869d4285f6ff21b0dee161b508eb10 Mon Sep 17 00:00:00 2001 From: "andrey.kononov" Date: Thu, 14 Aug 2025 19:42:40 +0300 Subject: [PATCH 33/89] Set timeout directly to Hedera e2e tests --- .../tests/integration/HederaAnoncredsRegistry.e2e.test.ts | 2 ++ .../hedera/tests/integration/HederaDidRegistrar.e2e.test.ts | 2 ++ packages/hedera/tests/integration/HederaDidResolver.e2e.test.ts | 2 ++ 3 files changed, 6 insertions(+) diff --git a/packages/hedera/tests/integration/HederaAnoncredsRegistry.e2e.test.ts b/packages/hedera/tests/integration/HederaAnoncredsRegistry.e2e.test.ts index c12ea35edb..267c134aae 100644 --- a/packages/hedera/tests/integration/HederaAnoncredsRegistry.e2e.test.ts +++ b/packages/hedera/tests/integration/HederaAnoncredsRegistry.e2e.test.ts @@ -3,6 +3,8 @@ import { HederaDidCreateOptions } from '../../src/ledger/HederaLedgerService' import { getHederaAgent, testCache } from './utils' describe('Hedera AnonCreds support', () => { + jest.setTimeout(100000) + let agent: Agent let did: string diff --git a/packages/hedera/tests/integration/HederaDidRegistrar.e2e.test.ts b/packages/hedera/tests/integration/HederaDidRegistrar.e2e.test.ts index 31ce111451..e92afe326c 100644 --- a/packages/hedera/tests/integration/HederaDidRegistrar.e2e.test.ts +++ b/packages/hedera/tests/integration/HederaDidRegistrar.e2e.test.ts @@ -12,6 +12,8 @@ import { getMultibasePublicKey } from '../../src/ledger/utils' import { getHederaAgent } from './utils' describe('Hedera DID registrar', () => { + jest.setTimeout(100000) + const logger = new ConsoleLogger(LogLevel.error) let agent: Agent diff --git a/packages/hedera/tests/integration/HederaDidResolver.e2e.test.ts b/packages/hedera/tests/integration/HederaDidResolver.e2e.test.ts index c7169f6b48..675a7f8161 100644 --- a/packages/hedera/tests/integration/HederaDidResolver.e2e.test.ts +++ b/packages/hedera/tests/integration/HederaDidResolver.e2e.test.ts @@ -3,6 +3,8 @@ import { HederaDidCreateOptions } from '../../src/ledger/HederaLedgerService' import { getHederaAgent } from './utils' describe('Hedera DID resolver', () => { + jest.setTimeout(100000) + const logger = new ConsoleLogger(LogLevel.error) let agent: Agent From 7a32c1e89a0b8c88f87e9a72812f60a9b9c98426 Mon Sep 17 00:00:00 2001 From: "andrey.kononov" Date: Thu, 14 Aug 2025 20:04:28 +0300 Subject: [PATCH 34/89] Use secrets for HEDERA_OPERATOR_*** env variables --- .github/workflows/continuous-integration.yml | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/.github/workflows/continuous-integration.yml b/.github/workflows/continuous-integration.yml index 68283a099e..04bc467e49 100644 --- a/.github/workflows/continuous-integration.yml +++ b/.github/workflows/continuous-integration.yml @@ -142,12 +142,9 @@ jobs: run: pnpm install --frozen-lockfile - name: Run tests - timeout-minutes: 15 env: - # HEDERA_OPERATOR_ID: ${{ secrets.HEDERA_OPERATOR_ID }} - # HEDERA_OPERATOR_KEY: ${{ secrets.HEDERA_OPERATOR_KEY }} - HEDERA_OPERATOR_ID: '0.0.5489553' - HEDERA_OPERATOR_KEY: '302e020100300506032b6570042204209f54b75b6238ced43e41b1463999cb40bf2f7dd2c9fd4fd3ef780027c016a138' + HEDERA_OPERATOR_ID: ${{ secrets.HEDERA_OPERATOR_ID }} + HEDERA_OPERATOR_KEY: ${{ secrets.HEDERA_OPERATOR_KEY }} run: pnpm test:e2e --coverage --forceExit # Upload coverage for e2e From 14fdd35e4c6f46209ad570f0b826088fff30530d Mon Sep 17 00:00:00 2001 From: "andrey.kononov" Date: Thu, 14 Aug 2025 20:34:11 +0300 Subject: [PATCH 35/89] Update readme --- README.md | 10 +++++++++- packages/hedera/CHANGELOG.md | 2 +- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 623189bb5b..fd8744ae33 100644 --- a/README.md +++ b/README.md @@ -51,7 +51,7 @@ See [Supported Features](https://credo.js.org/guides/features) on the Credo webs - 🏃 **Platform agnostic** - out of the box support for Node.JS and React Native - 🔒 **DIDComm and AIP** - Support for [DIDComm v1](https://hyperledger.github.io/aries-rfcs/latest/concepts/0005-didcomm/), and both v1 and v2 of the [Aries Interop Profile](https://github.com/hyperledger/aries-rfcs/blob/main/concepts/0302-aries-interop-profile/README.md). -- 🛂 **Extendable [DID](https://www.w3.org/TR/did-core/) resolver and registrar** - out of the box support for `did:web`, `did:key`, `did:jwk`, `did:peer`, `did:sov`, `did:indy` and `did:cheqd`. +- 🛂 **Extendable [DID](https://www.w3.org/TR/did-core/) resolver and registrar** - out of the box support for `did:web`, `did:key`, `did:jwk`, `did:peer`, `did:sov`, `did:indy`, `did:cheqd` and `did:hedera`. - 🔑 **[OpenID4VC](https://openid.net/sg/openid4vc/)** - support for [OpenID for Verifiable Credential Issuance](https://openid.net/specs/openid-4-verifiable-credential-issuance-1_0.html), [OpenID for Verifiable Presentations](https://openid.net/specs/openid-4-verifiable-presentations-1_0.html) and [Self-Issued OpenID Provider v2](https://openid.net/specs/openid-connect-self-issued-v2-1_0.html). - 🪪 **Multiple credential formats** - [W3C Verifiable Credential Data Model v1.1](https://www.w3.org/TR/vc-data-model/), [SD-JWT VCs](https://www.ietf.org/archive/id/draft-ietf-oauth-sd-jwt-vc-03.html), and [AnonCreds](https://hyperledger.github.io/anoncreds-spec/). - 🏢 **Multi-tenant** - Optional multi-tenant module for managing multiple tenants under a single agent. @@ -158,6 +158,14 @@ See [Supported Features](https://credo.js.org/guides/features) on the Credo webs + + @credo-ts/hedera + + + @credo-ts/hedera version + + + @aries-framework/indy-sdk (deprecated, unmaintained after 0.4.x) diff --git a/packages/hedera/CHANGELOG.md b/packages/hedera/CHANGELOG.md index 62e74296bd..cb65216ef8 100644 --- a/packages/hedera/CHANGELOG.md +++ b/packages/hedera/CHANGELOG.md @@ -1,6 +1,6 @@ # Changelog -## 0.0.1 +## 0.5.13 ### Patch Changes From 1a0c1f2310723c99fe84e4e99f59f60a76db2a84 Mon Sep 17 00:00:00 2001 From: "andrey.kononov" Date: Thu, 14 Aug 2025 20:42:08 +0300 Subject: [PATCH 36/89] Set test timeout for all tests over setup.ts --- packages/hedera/jest.config.ts | 2 +- .../tests/integration/HederaAnoncredsRegistry.e2e.test.ts | 2 -- .../hedera/tests/integration/HederaDidRegistrar.e2e.test.ts | 2 -- packages/hedera/tests/integration/HederaDidResolver.e2e.test.ts | 2 -- packages/hedera/tests/setup.ts | 1 + 5 files changed, 2 insertions(+), 7 deletions(-) create mode 100644 packages/hedera/tests/setup.ts diff --git a/packages/hedera/jest.config.ts b/packages/hedera/jest.config.ts index 80d2dc3106..d91513a189 100644 --- a/packages/hedera/jest.config.ts +++ b/packages/hedera/jest.config.ts @@ -6,8 +6,8 @@ import packageJson from './package.json' const config: Config.InitialOptions = { ...base, - testTimeout: 100000, displayName: packageJson.name, + setupFilesAfterEnv: ['./tests/setup.ts'], coveragePathIgnorePatterns: ['../tests'], } diff --git a/packages/hedera/tests/integration/HederaAnoncredsRegistry.e2e.test.ts b/packages/hedera/tests/integration/HederaAnoncredsRegistry.e2e.test.ts index 267c134aae..c12ea35edb 100644 --- a/packages/hedera/tests/integration/HederaAnoncredsRegistry.e2e.test.ts +++ b/packages/hedera/tests/integration/HederaAnoncredsRegistry.e2e.test.ts @@ -3,8 +3,6 @@ import { HederaDidCreateOptions } from '../../src/ledger/HederaLedgerService' import { getHederaAgent, testCache } from './utils' describe('Hedera AnonCreds support', () => { - jest.setTimeout(100000) - let agent: Agent let did: string diff --git a/packages/hedera/tests/integration/HederaDidRegistrar.e2e.test.ts b/packages/hedera/tests/integration/HederaDidRegistrar.e2e.test.ts index e92afe326c..31ce111451 100644 --- a/packages/hedera/tests/integration/HederaDidRegistrar.e2e.test.ts +++ b/packages/hedera/tests/integration/HederaDidRegistrar.e2e.test.ts @@ -12,8 +12,6 @@ import { getMultibasePublicKey } from '../../src/ledger/utils' import { getHederaAgent } from './utils' describe('Hedera DID registrar', () => { - jest.setTimeout(100000) - const logger = new ConsoleLogger(LogLevel.error) let agent: Agent diff --git a/packages/hedera/tests/integration/HederaDidResolver.e2e.test.ts b/packages/hedera/tests/integration/HederaDidResolver.e2e.test.ts index 675a7f8161..c7169f6b48 100644 --- a/packages/hedera/tests/integration/HederaDidResolver.e2e.test.ts +++ b/packages/hedera/tests/integration/HederaDidResolver.e2e.test.ts @@ -3,8 +3,6 @@ import { HederaDidCreateOptions } from '../../src/ledger/HederaLedgerService' import { getHederaAgent } from './utils' describe('Hedera DID resolver', () => { - jest.setTimeout(100000) - const logger = new ConsoleLogger(LogLevel.error) let agent: Agent diff --git a/packages/hedera/tests/setup.ts b/packages/hedera/tests/setup.ts new file mode 100644 index 0000000000..cc76304a17 --- /dev/null +++ b/packages/hedera/tests/setup.ts @@ -0,0 +1 @@ +jest.setTimeout(100000) From 07b57fb5fee90ecde83550fa8eeea124a12a1242 Mon Sep 17 00:00:00 2001 From: "andrey.kononov" Date: Mon, 18 Aug 2025 19:16:52 +0300 Subject: [PATCH 37/89] Fix PR review notes --- demo/package.json | 7 +++--- demo/src/BaseAgent.ts | 10 ++++---- demo/src/Faber.ts | 6 ++--- .../hedera/src/dids/HederaDidRegistrar.ts | 10 ++------ .../hedera/src/ledger/HederaLedgerService.ts | 22 ++++++++--------- .../hedera/src/ledger/cache/CredoCache.ts | 13 ++++------ .../HederaAnoncredsRegistry.e2e.test.ts | 2 +- .../HederaDidRegistrar.e2e.test.ts | 2 +- .../integration/HederaDidResolver.e2e.test.ts | 2 +- .../tests/integration/utils/hederaModule.ts | 5 ++-- .../hedera/tests/unit/credo-cache.test.ts | 4 ++-- .../tests/unit/hedera-did-registrar.test.ts | 4 ++-- .../tests/unit/hedera-ledger-service.test.ts | 24 +++++++++---------- packages/hedera/tests/unit/utils.test.ts | 8 +++---- packages/hedera/tsconfig.json | 2 +- pnpm-lock.yaml | 5 +++- 16 files changed, 59 insertions(+), 67 deletions(-) diff --git a/demo/package.json b/demo/package.json index 5079e76896..9378ba8e81 100644 --- a/demo/package.json +++ b/demo/package.json @@ -1,6 +1,6 @@ { "name": "credo-demo", - "version": "1.0.1", + "version": "1.0.0", "private": true, "repository": { "type": "git", @@ -13,19 +13,20 @@ "faber": "ts-node src/FaberInquirer.ts" }, "dependencies": { - "@hyperledger/indy-vdr-nodejs": "catalog:", + "@hiero-did-sdk/client": "0.1.0", "@hyperledger/anoncreds-nodejs": "catalog:", + "@hyperledger/indy-vdr-nodejs": "catalog:", "@openwallet-foundation/askar-nodejs": "catalog:", "inquirer": "^8.2.5" }, "devDependencies": { "@credo-ts/anoncreds": "workspace:*", "@credo-ts/askar": "workspace:*", + "@credo-ts/cheqd": "workspace:*", "@credo-ts/core": "workspace:*", "@credo-ts/didcomm": "workspace:*", "@credo-ts/hedera": "workspace:*", "@credo-ts/indy-vdr": "workspace:*", - "@credo-ts/cheqd": "workspace:*", "@credo-ts/node": "workspace:*", "@types/figlet": "^1.5.4", "@types/inquirer": "^8.2.6", diff --git a/demo/src/BaseAgent.ts b/demo/src/BaseAgent.ts index ddad42b052..837b79722a 100644 --- a/demo/src/BaseAgent.ts +++ b/demo/src/BaseAgent.ts @@ -1,7 +1,3 @@ -import type { InitConfig } from '@credo-ts/core' -import type { DidCommModuleConfigOptions } from '@credo-ts/didcomm' -import type { IndyVdrPoolConfig } from '@credo-ts/indy-vdr' - import { AnonCredsCredentialFormatService, AnonCredsModule, @@ -19,7 +15,9 @@ import { CheqdModule, CheqdModuleConfig, } from '@credo-ts/cheqd' +import type { InitConfig } from '@credo-ts/core' import { Agent, DidsModule } from '@credo-ts/core' +import type { DidCommModuleConfigOptions } from '@credo-ts/didcomm' import { AutoAcceptCredential, AutoAcceptProof, @@ -31,8 +29,10 @@ import { V2ProofProtocol, getDefaultDidcommModules, } from '@credo-ts/didcomm' +import type { IndyVdrPoolConfig } from '@credo-ts/indy-vdr' import { IndyVdrAnonCredsRegistry, IndyVdrIndyDidResolver, IndyVdrModule } from '@credo-ts/indy-vdr' import { HttpInboundTransport, agentDependencies } from '@credo-ts/node' +import { HederaNetwork } from '@hiero-did-sdk/client' import { anoncreds } from '@hyperledger/anoncreds-nodejs' import { indyVdr } from '@hyperledger/indy-vdr-nodejs' import { askar } from '@openwallet-foundation/askar-nodejs' @@ -151,7 +151,7 @@ function getAskarAnonCredsIndyModules( hedera: new HederaModule({ networks: [ { - network: (process.env.HEDERA_NETWORK as 'testnet' | 'mainnet' | 'previewnet' | 'local-node') ?? 'testnet', + network: (process.env.HEDERA_NETWORK as HederaNetwork) ?? 'testnet', operatorId: process.env.HEDERA_OPERATOR_ID ?? '0.0.5489553', operatorKey: process.env.HEDERA_OPERATOR_KEY ?? diff --git a/demo/src/Faber.ts b/demo/src/Faber.ts index 4179026e62..0ea91b03d7 100644 --- a/demo/src/Faber.ts +++ b/demo/src/Faber.ts @@ -17,8 +17,6 @@ export enum RegistryOptions { hedera = 'did:hedera', } -type Extensible = Record - export class Faber extends BaseAgent { public outOfBandId?: string public credentialDefinition?: RegisterCredentialDefinitionReturnStateFinished @@ -42,13 +40,13 @@ export class Faber extends BaseAgent { // indy did is based on private key (seed) const unqualifiedIndyDid = '2jEvRuKmfBJTRa7QowDpNN' - const rootKeyIds: Extensible = { + const rootKeyIds: Record = { [RegistryOptions.indy]: '#verkey', [RegistryOptions.cheqd]: '#key-1', [RegistryOptions.hedera]: '#did-root-key', } - const Dids: Extensible = { + const Dids: Record = { [RegistryOptions.indy]: `did:indy:${indyNetworkConfig.indyNamespace}:${unqualifiedIndyDid}`, [RegistryOptions.cheqd]: 'did:cheqd:testnet:d37eba59-513d-42d3-8f9f-d1df0548b675', [RegistryOptions.hedera]: 'did:hedera:testnet:44eesExqdsUvLZ35FpnBPErqRGRnYbzzyG3wgCCYxkmq_0.0.6231121', diff --git a/packages/hedera/src/dids/HederaDidRegistrar.ts b/packages/hedera/src/dids/HederaDidRegistrar.ts index fdbcbba9ba..f68a5a234a 100644 --- a/packages/hedera/src/dids/HederaDidRegistrar.ts +++ b/packages/hedera/src/dids/HederaDidRegistrar.ts @@ -27,10 +27,8 @@ export class HederaDidRegistrar implements DidRegistrar { const didRepository = agentContext.dependencyManager.resolve(DidRepository) const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) - // Create did const { did, didDocument, rootKey } = await ledgerService.createDid(agentContext, options) - // Save the did to wallet const credoDidDocument = new DidDocument({ ...didDocument, service: didDocument.service?.map((s) => new DidDocumentService(s)), @@ -89,14 +87,12 @@ export class HederaDidRegistrar implements DidRegistrar { } } - // Update did const keys = this.concatKeys(didRecord.keys, options.secret?.keys) const { didDocument: updatedDidDocument } = await ledgerService.updateDid(agentContext, { ...options, secret: { keys }, }) - // Save the did to wallet didRecord.didDocument = JsonTransformer.fromJSON(updatedDidDocument, DidDocument) didRecord.keys = keys await didRepository.update(agentContext, didRecord) @@ -111,7 +107,7 @@ export class HederaDidRegistrar implements DidRegistrar { }, } } catch (error) { - agentContext.config.logger.error('Error update DID', error) + agentContext.config.logger.error('Error updating DID', error) return { didDocumentMetadata: {}, didRegistrationMetadata: {}, @@ -147,13 +143,11 @@ export class HederaDidRegistrar implements DidRegistrar { }, } } - // Deactivate did const { didDocument: deactivatedDidDocument } = await ledgerService.deactivateDid(agentContext, { ...options, secret: { keys: didRecord.keys }, }) - // Save the did to wallet didRecord.didDocument = JsonTransformer.fromJSON(deactivatedDidDocument, DidDocument) await didRepository.update(agentContext, didRecord) @@ -167,7 +161,7 @@ export class HederaDidRegistrar implements DidRegistrar { }, } } catch (error) { - agentContext.config.logger.error('Error deactivate DID', error) + agentContext.config.logger.error('Error deactivating DID', error) return { didDocumentMetadata: {}, didRegistrationMetadata: {}, diff --git a/packages/hedera/src/ledger/HederaLedgerService.ts b/packages/hedera/src/ledger/HederaLedgerService.ts index 1f82379c5b..a66452a097 100644 --- a/packages/hedera/src/ledger/HederaLedgerService.ts +++ b/packages/hedera/src/ledger/HederaLedgerService.ts @@ -158,7 +158,7 @@ export class HederaLedgerService { } // Check root key presents - const rootKey = (secret?.keys ?? []).find((k) => k.didDocumentRelativeKeyId === DID_ROOT_KEY_ID) + const rootKey = secret?.keys?.find((k) => k.didDocumentRelativeKeyId === DID_ROOT_KEY_ID) if (!rootKey?.kmsKeyId) { throw new Error('The root key not found in the KMS') } @@ -222,7 +222,7 @@ export class HederaLedgerService { const kms = agentContext.dependencyManager.resolve(Kms.KeyManagementApi) - const rootKey = (secret?.keys ?? []).find((k) => k.didDocumentRelativeKeyId === DID_ROOT_KEY_ID) + const rootKey = secret?.keys?.find((k) => k.didDocumentRelativeKeyId === DID_ROOT_KEY_ID) if (!rootKey?.kmsKeyId) { throw new Error('The root key not found in the KMS') } @@ -265,12 +265,12 @@ export class HederaLedgerService { /* Anoncreds*/ async getSchema(agentContext: AgentContext, schemaId: string): Promise { - const sdk = this.getHederaAnonCredsSdk(agentContext) + const sdk = this.getHederaAnoncredsRegistry(agentContext) return await sdk.getSchema(schemaId) } async registerSchema(agentContext: AgentContext, options: RegisterSchemaOptions): Promise { - const sdk = this.getHederaAnonCredsSdk(agentContext) + const sdk = this.getHederaAnoncredsRegistry(agentContext) return await sdk.registerSchema(options) } @@ -278,7 +278,7 @@ export class HederaLedgerService { agentContext: AgentContext, credentialDefinitionId: string ): Promise { - const sdk = this.getHederaAnonCredsSdk(agentContext) + const sdk = this.getHederaAnoncredsRegistry(agentContext) return await sdk.getCredentialDefinition(credentialDefinitionId) } @@ -286,7 +286,7 @@ export class HederaLedgerService { agentContext: AgentContext, options: RegisterCredentialDefinitionOptions ): Promise { - const sdk = this.getHederaAnonCredsSdk(agentContext) + const sdk = this.getHederaAnoncredsRegistry(agentContext) return await sdk.registerCredentialDefinition({ ...options, options: { @@ -299,7 +299,7 @@ export class HederaLedgerService { agentContext: AgentContext, revocationRegistryDefinitionId: string ): Promise { - const sdk = this.getHederaAnonCredsSdk(agentContext) + const sdk = this.getHederaAnoncredsRegistry(agentContext) return await sdk.getRevocationRegistryDefinition(revocationRegistryDefinitionId) } @@ -307,7 +307,7 @@ export class HederaLedgerService { agentContext: AgentContext, options: RegisterRevocationRegistryDefinitionOptions ): Promise { - const sdk = this.getHederaAnonCredsSdk(agentContext) + const sdk = this.getHederaAnoncredsRegistry(agentContext) return await sdk.registerRevocationRegistryDefinition(options) } @@ -316,7 +316,7 @@ export class HederaLedgerService { revocationRegistryId: string, timestamp: number ): Promise { - const sdk = this.getHederaAnonCredsSdk(agentContext) + const sdk = this.getHederaAnoncredsRegistry(agentContext) return await sdk.getRevocationStatusList(revocationRegistryId, timestamp) } @@ -324,7 +324,7 @@ export class HederaLedgerService { agentContext: AgentContext, options: RegisterRevocationStatusListOptions ): Promise { - const sdk = this.getHederaAnonCredsSdk(agentContext) + const sdk = this.getHederaAnoncredsRegistry(agentContext) return await sdk.registerRevocationStatusList(options) } @@ -341,7 +341,7 @@ export class HederaLedgerService { return new KmsPublisher(agentContext, client, key) } - private getHederaAnonCredsSdk(agentContext: AgentContext): HederaAnoncredsRegistry { + private getHederaAnoncredsRegistry(agentContext: AgentContext): HederaAnoncredsRegistry { const cache = this.config.options.cache ?? new CredoCache(agentContext) return new HederaAnoncredsRegistry({ ...this.config.options, cache }) } diff --git a/packages/hedera/src/ledger/cache/CredoCache.ts b/packages/hedera/src/ledger/cache/CredoCache.ts index 30a2eb7ea2..bf7194fc76 100644 --- a/packages/hedera/src/ledger/cache/CredoCache.ts +++ b/packages/hedera/src/ledger/cache/CredoCache.ts @@ -1,14 +1,9 @@ import { AgentContext, CacheModuleConfig, CredoError } from '@credo-ts/core' import { Cache } from '@hiero-did-sdk/core' - -export interface ICredoCache { - get(agentContext: AgentContext, key: string): Promise - set(agentContext: AgentContext, key: string, value: CacheValue, expiresInSeconds?: number): Promise - remove(agentContext: AgentContext, key: string): Promise -} +import { Cache as CoreCredoCache} from '@credo-ts/core' export class CredoCache implements Cache { - private readonly credoCache: ICredoCache + private readonly credoCache: CoreCredoCache constructor(private readonly agentContext: AgentContext) { this.credoCache = agentContext.dependencyManager.resolve(CacheModuleConfig).cache @@ -30,10 +25,10 @@ export class CredoCache implements Cache { } async clear(): Promise { - throw new Error('Method not implemented.') + // nothing } async cleanupExpired(): Promise { - throw new Error('Method not implemented.') + // nothing } } diff --git a/packages/hedera/tests/integration/HederaAnoncredsRegistry.e2e.test.ts b/packages/hedera/tests/integration/HederaAnoncredsRegistry.e2e.test.ts index c12ea35edb..f3e8c6ff79 100644 --- a/packages/hedera/tests/integration/HederaAnoncredsRegistry.e2e.test.ts +++ b/packages/hedera/tests/integration/HederaAnoncredsRegistry.e2e.test.ts @@ -6,7 +6,7 @@ describe('Hedera AnonCreds support', () => { let agent: Agent let did: string - const logger = new ConsoleLogger(LogLevel.error) + const logger = new ConsoleLogger(LogLevel.fatal) const cache = new testCache() beforeAll(async () => { diff --git a/packages/hedera/tests/integration/HederaDidRegistrar.e2e.test.ts b/packages/hedera/tests/integration/HederaDidRegistrar.e2e.test.ts index 31ce111451..952edc8474 100644 --- a/packages/hedera/tests/integration/HederaDidRegistrar.e2e.test.ts +++ b/packages/hedera/tests/integration/HederaDidRegistrar.e2e.test.ts @@ -12,7 +12,7 @@ import { getMultibasePublicKey } from '../../src/ledger/utils' import { getHederaAgent } from './utils' describe('Hedera DID registrar', () => { - const logger = new ConsoleLogger(LogLevel.error) + const logger = new ConsoleLogger(LogLevel.fatal) let agent: Agent const validDid = 'did:hedera:testnet:44eesExqdsUvLZ35FpnBPErqRGRnYbzzyG3wgCCYxkmq_0.0.6226170' diff --git a/packages/hedera/tests/integration/HederaDidResolver.e2e.test.ts b/packages/hedera/tests/integration/HederaDidResolver.e2e.test.ts index c7169f6b48..71834c6ced 100644 --- a/packages/hedera/tests/integration/HederaDidResolver.e2e.test.ts +++ b/packages/hedera/tests/integration/HederaDidResolver.e2e.test.ts @@ -3,7 +3,7 @@ import { HederaDidCreateOptions } from '../../src/ledger/HederaLedgerService' import { getHederaAgent } from './utils' describe('Hedera DID resolver', () => { - const logger = new ConsoleLogger(LogLevel.error) + const logger = new ConsoleLogger(LogLevel.fatal) let agent: Agent let did: string diff --git a/packages/hedera/tests/integration/utils/hederaModule.ts b/packages/hedera/tests/integration/utils/hederaModule.ts index 2511a9ed53..ebdfc58acd 100644 --- a/packages/hedera/tests/integration/utils/hederaModule.ts +++ b/packages/hedera/tests/integration/utils/hederaModule.ts @@ -16,7 +16,7 @@ import { TestTailsFileService } from './testTailsFileService' export const getHederaModuleConfig = (props: { operatorId?: string; operatorKey?: string }) => { const operatorId = props.operatorId ?? process.env.HEDERA_OPERATOR_ID ?? '' const operatorKey = props.operatorKey ?? process.env.HEDERA_OPERATOR_KEY ?? '' - return { + const config: HederaModuleConfigOptions = { networks: [ { network: 'testnet', @@ -24,7 +24,8 @@ export const getHederaModuleConfig = (props: { operatorId?: string; operatorKey? operatorKey, }, ], - } satisfies HederaModuleConfigOptions + } + return config } export const getHederaAgent = (props: { diff --git a/packages/hedera/tests/unit/credo-cache.test.ts b/packages/hedera/tests/unit/credo-cache.test.ts index 5c43ffe7ab..5756d2d0db 100644 --- a/packages/hedera/tests/unit/credo-cache.test.ts +++ b/packages/hedera/tests/unit/credo-cache.test.ts @@ -86,14 +86,14 @@ describe('CredoCache', () => { describe('clear', () => { it('should throw error when called', async () => { const credoCacheInstance = new CredoCache(mockAgentContext) - await expect(credoCacheInstance.clear()).rejects.toThrowError('Method not implemented.') + await expect(credoCacheInstance.clear()).resolves.not.toThrow() }) }) describe('cleanupExpired', () => { it('should throw error when called', async () => { const credoCacheInstance = new CredoCache(mockAgentContext) - await expect(credoCacheInstance.cleanupExpired()).rejects.toThrowError('Method not implemented.') + await expect(credoCacheInstance.cleanupExpired()).resolves.not.toThrow() }) }) }) diff --git a/packages/hedera/tests/unit/hedera-did-registrar.test.ts b/packages/hedera/tests/unit/hedera-did-registrar.test.ts index 52b33083d5..9347f876d2 100644 --- a/packages/hedera/tests/unit/hedera-did-registrar.test.ts +++ b/packages/hedera/tests/unit/hedera-did-registrar.test.ts @@ -170,7 +170,7 @@ describe('HederaDidRegistrar', () => { const result = await service.update(mockAgentContext as AgentContext, options) - expect(mockAgentContext.config.logger.error).toHaveBeenCalledWith('Error update DID', expect.any(Error)) + expect(mockAgentContext.config.logger.error).toHaveBeenCalledWith('Error updating DID', expect.any(Error)) expect(result.didState.state).toBe('failed') if (result.didState.state === 'failed') expect(result.didState.reason).toBe('Unable update DID: Update failed') }) @@ -237,7 +237,7 @@ describe('HederaDidRegistrar', () => { const result = await service.deactivate(mockAgentContext as AgentContext, options) - expect(mockAgentContext.config.logger.error).toHaveBeenCalledWith('Error deactivate DID', expect.any(Error)) + expect(mockAgentContext.config.logger.error).toHaveBeenCalledWith('Error deactivating DID', expect.any(Error)) expect(result.didState.state).toBe('failed') if (result.didState.state === 'failed') expect(result.didState.reason).toBe('Unable deactivating DID: Deactivate failed') diff --git a/packages/hedera/tests/unit/hedera-ledger-service.test.ts b/packages/hedera/tests/unit/hedera-ledger-service.test.ts index b359a4a627..37ab1c9d54 100644 --- a/packages/hedera/tests/unit/hedera-ledger-service.test.ts +++ b/packages/hedera/tests/unit/hedera-ledger-service.test.ts @@ -129,7 +129,7 @@ describe('HederaLedgerService', () => { }) describe('resolveDid', () => { - it('should calls resolveDID with proper args and returns result', async () => { + it('should call resolveDID with proper args and returns result', async () => { const did = 'did:hedera:test' const mockResolution = { didDocument: { id: did } } @@ -147,7 +147,7 @@ describe('HederaLedgerService', () => { }) describe('createDid', () => { - it('should creates DID without didDocument', async () => { + it('should create DID without didDocument', async () => { const keyId = 'key123' const publicJwk: KmsJwkPublicOkp & { crv: 'Ed25519' } = { crv: 'Ed25519', kty: 'OKP', x: 'abc' } const props: HederaDidCreateOptions = { @@ -176,7 +176,7 @@ describe('HederaLedgerService', () => { expect(result.rootKey).toBeDefined() }) - it('should creates DID with didDocument and calls updateDid', async () => { + it('should create DID with didDocument and calls updateDid', async () => { const keyId = 'key123' const publicJwk: KmsJwkPublicOkp & { crv: 'Ed25519' } = { crv: 'Ed25519', kty: 'OKP', x: 'abc' } const didDocument = { controller: 'did:hedera:controller' } @@ -216,13 +216,13 @@ describe('HederaLedgerService', () => { const did = 'did:hedera:1234' const kmsKeyId = 'key-id' - it('should throws error if didDocumentOperation is missing', async () => { + it('should throw error if didDocumentOperation is missing', async () => { await expect( service.updateDid(mockAgentContext as AgentContext, { did } as HederaDidUpdateOptions) ).rejects.toThrow('DidDocumentOperation is required') }) - it('should throws error if rootKey missing', async () => { + it('should throw error if rootKey missing', async () => { const keys: DidDocumentKey[] = [] await expect( service.updateDid(mockAgentContext as AgentContext, { @@ -234,7 +234,7 @@ describe('HederaLedgerService', () => { ).rejects.toThrow('The root key not found in the KMS') }) - it('should calls correct builder methods for each field and action', () => { + it('should call correct builder methods for each field and action', () => { const spies = { addService: jest.spyOn(builder, 'addService'), removeService: jest.spyOn(builder, 'removeService'), @@ -292,7 +292,7 @@ describe('HederaLedgerService', () => { } }) - it('should returns builder unchanged for unknown field', () => { + it('should return builder unchanged for unknown field', () => { const unknownField = 'unknownField' // biome-ignore lint/suspicious/noExplicitAny: const fn = (service as any).getUpdateMethod(builder, unknownField, 'add') @@ -300,7 +300,7 @@ describe('HederaLedgerService', () => { expect(result).toBe(builder) }) - it('should performs update flow successfully', async () => { + it('should perform update flow successfully', async () => { const keys: DidDocumentKey[] = [ { kmsKeyId, didDocumentRelativeKeyId: DID_ROOT_KEY_ID }, { kmsKeyId: 'some-key', didDocumentRelativeKeyId: '#abc' }, @@ -359,13 +359,13 @@ describe('HederaLedgerService', () => { const did = 'did:hedera:5678' const kmsKeyId = 'key-id' - it('should throws error if rootKey is missing', async () => { + it('should throw error if rootKey is missing', async () => { await expect( service.deactivateDid(mockAgentContext as AgentContext, { did, secret: { keys: [] } }) ).rejects.toThrow('The root key not found in the KMS') }) - it('should throws an error if root key is not found in deactivateDid', async () => { + it('should throw an error if root key is not found in deactivateDid', async () => { const props = { did: 'did:hedera:123', secret: { @@ -381,7 +381,7 @@ describe('HederaLedgerService', () => { ) }) - it('should deactivates DID successfully', async () => { + it('should deactivate DID successfully', async () => { const keys: DidDocumentKey[] = [{ kmsKeyId, didDocumentRelativeKeyId: DID_ROOT_KEY_ID }] const mockPublisher = {} const mockState = {} @@ -428,7 +428,7 @@ describe('HederaLedgerService', () => { registerRevocationStatusList: jest.fn().mockResolvedValue('registerRevStatus'), } // biome-ignore lint/suspicious/noExplicitAny: - jest.spyOn(service as any, 'getHederaAnonCredsSdk').mockReturnValue(mockSdk) + jest.spyOn(service as any, 'getHederaAnoncredsRegistry').mockReturnValue(mockSdk) }) it('getSchema', async () => { diff --git a/packages/hedera/tests/unit/utils.test.ts b/packages/hedera/tests/unit/utils.test.ts index 9ef6c20c6e..25a37aae19 100644 --- a/packages/hedera/tests/unit/utils.test.ts +++ b/packages/hedera/tests/unit/utils.test.ts @@ -27,7 +27,7 @@ describe('createOrGetKey', () => { } as unknown as jest.Mocked }) - it('should creates a key if keyId is not provided', async () => { + it('should create a key if keyId is not provided', async () => { const fakeKeyId = 'key123' const fakeJwk: KmsJwkPublicOkp & { kid: string } = { kty: 'OKP', crv: 'Ed25519', x: 'xxx', kid: 'key123' } kmsMock.createKey.mockResolvedValue({ @@ -45,7 +45,7 @@ describe('createOrGetKey', () => { }) }) - it('should retrieves an existing key if keyId is provided', async () => { + it('should retrieve an existing key if keyId is provided', async () => { const keyId = 'key456' const publicJwk: KmsJwkPublicOkp & { kid: string } = { kty: 'OKP', crv: 'Ed25519', x: 'xxx', kid: 'key123' } kmsMock.getPublicKey.mockResolvedValue(publicJwk) @@ -63,7 +63,7 @@ describe('createOrGetKey', () => { }) }) - it('should throws an error if key with given keyId is not found', async () => { + it('should throw an error if key with given keyId is not found', async () => { // @ts-ignore kmsMock.getPublicKey.mockResolvedValue(null) @@ -71,7 +71,7 @@ describe('createOrGetKey', () => { await expect(createOrGetKey(kmsMock, 'notfound')).rejects.toThrowError("Key with key id 'notfound' not found") }) - it('should throws an error if key has unsupported kty or crv', async () => { + it('should throw an error if key has unsupported kty or crv', async () => { const keyId = 'badkey' const badJwk: KmsJwkPublicRsa & { kid: string } = { e: '', kid: 'key-1', n: '', kty: 'RSA' } diff --git a/packages/hedera/tsconfig.json b/packages/hedera/tsconfig.json index 03b41a1553..dcd84a3af2 100644 --- a/packages/hedera/tsconfig.json +++ b/packages/hedera/tsconfig.json @@ -1,7 +1,7 @@ { "extends": "../../tsconfig.json", "compilerOptions": { - "types": ["node", "jest"], + "types": ["jest"], "moduleResolution": "node" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 74b9de4f42..624dfcb2c3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -172,6 +172,9 @@ importers: demo: dependencies: + '@hiero-did-sdk/client': + specifier: 0.1.0 + version: 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) '@hyperledger/anoncreds-nodejs': specifier: 'catalog:' version: 0.3.1 @@ -3164,7 +3167,6 @@ packages: '@sphereon/kmp-mdoc-core@0.2.0-SNAPSHOT.26': resolution: {integrity: sha512-QXJ6R8ENiZV2rPMbn06cw5JKwqUYN1kzVRbYfONqE1PEXx1noQ4md7uxr2zSczi0ubKkNcbyYDNtIMTZIhGzmQ==} - bundledDependencies: [] '@sphereon/pex-models@2.3.2': resolution: {integrity: sha512-foFxfLkRwcn/MOp/eht46Q7wsvpQGlO7aowowIIb5Tz9u97kYZ2kz6K2h2ODxWuv5CRA7Q0MY8XUBGE2lfOhOQ==} @@ -7558,6 +7560,7 @@ packages: superagent@10.2.1: resolution: {integrity: sha512-O+PCv11lgTNJUzy49teNAWLjBZfc+A1enOwTpLlH6/rsvKcTwcdTT8m9azGkVqM7HBl5jpyZ7KTPhHweokBcdg==} engines: {node: '>=14.18.0'} + deprecated: Please upgrade to superagent v10.2.2+, see release notes at https://github.com/forwardemail/superagent/releases/tag/v10.2.2 - maintenance is supported by Forward Email @ https://forwardemail.net supertest@7.1.1: resolution: {integrity: sha512-aI59HBTlG9e2wTjxGJV+DygfNLgnWbGdZxiA/sgrnNNikIW8lbDvCtF6RnhZoJ82nU7qv7ZLjrvWqCEm52fAmw==} From b5ffa40094120e9458de115a9cd3eae326000abb Mon Sep 17 00:00:00 2001 From: "andrey.kononov" Date: Mon, 18 Aug 2025 19:20:31 +0300 Subject: [PATCH 38/89] Fix PR review notes --- packages/hedera/src/ledger/cache/CredoCache.ts | 6 +++--- packages/hedera/tests/unit/credo-cache.test.ts | 5 +++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/packages/hedera/src/ledger/cache/CredoCache.ts b/packages/hedera/src/ledger/cache/CredoCache.ts index bf7194fc76..e5914f8c2f 100644 --- a/packages/hedera/src/ledger/cache/CredoCache.ts +++ b/packages/hedera/src/ledger/cache/CredoCache.ts @@ -1,6 +1,6 @@ import { AgentContext, CacheModuleConfig, CredoError } from '@credo-ts/core' +import { Cache as CoreCredoCache } from '@credo-ts/core' import { Cache } from '@hiero-did-sdk/core' -import { Cache as CoreCredoCache} from '@credo-ts/core' export class CredoCache implements Cache { private readonly credoCache: CoreCredoCache @@ -25,10 +25,10 @@ export class CredoCache implements Cache { } async clear(): Promise { - // nothing + // nothing } async cleanupExpired(): Promise { - // nothing + // nothing } } diff --git a/packages/hedera/tests/unit/credo-cache.test.ts b/packages/hedera/tests/unit/credo-cache.test.ts index 5756d2d0db..b9927933ad 100644 --- a/packages/hedera/tests/unit/credo-cache.test.ts +++ b/packages/hedera/tests/unit/credo-cache.test.ts @@ -1,10 +1,11 @@ import { AgentContext, CacheModuleConfig, CredoError } from '@credo-ts/core' -import { CredoCache, ICredoCache } from '../../src/ledger/cache/CredoCache' +import { Cache as CoreCredoCache } from '@credo-ts/core' +import { CredoCache } from '../../src/ledger/cache/CredoCache' describe('CredoCache', () => { let mockAgentContext: AgentContext let mockDependencyManagerResolve: jest.Mock - let mockCredoCache: jest.Mocked + let mockCredoCache: jest.Mocked beforeEach(() => { mockCredoCache = { From 10e5aad01f0cff7c25b22ea2d50d034afdc5d67b Mon Sep 17 00:00:00 2001 From: "andrey.kononov" Date: Mon, 18 Aug 2025 19:23:33 +0300 Subject: [PATCH 39/89] Fix PR review notes --- package.json | 3 --- patches/@2060.io__ffi-napi@4.0.9.patch | 14 -------------- 2 files changed, 17 deletions(-) delete mode 100644 patches/@2060.io__ffi-napi@4.0.9.patch diff --git a/package.json b/package.json index f83828f3af..c7f6eb39ab 100644 --- a/package.json +++ b/package.json @@ -57,9 +57,6 @@ "node": ">=20" }, "pnpm": { - "patchedDependencies": { - "@2060.io/ffi-napi@4.0.9": "patches/@2060.io__ffi-napi@4.0.9.patch" - }, "onlyBuiltDependencies": [ "@2060.io/ffi-napi", "@2060.io/ref-napi", diff --git a/patches/@2060.io__ffi-napi@4.0.9.patch b/patches/@2060.io__ffi-napi@4.0.9.patch deleted file mode 100644 index 2e3cb8248d..0000000000 --- a/patches/@2060.io__ffi-napi@4.0.9.patch +++ /dev/null @@ -1,14 +0,0 @@ -diff --git a/deps/libffi/libffi.gyp b/deps/libffi/libffi.gyp -index d02bef739c0cfb9c1bbb0a666ab3363fd34c5041..5d49572898681902fca1079b7b25d02f15f7617a 100644 ---- a/deps/libffi/libffi.gyp -+++ b/deps/libffi/libffi.gyp -@@ -74,8 +74,7 @@ - '<(INTERMEDIATE_DIR)/<(RULE_INPUT_ROOT).asm', - ], - 'action': [ -- 'call', -- 'preprocess_asm.cmd', -+ '../../../deps/libffi/preprocess_asm.cmd', - 'include', - 'config/<(OS)/<(target_arch)', - '<(RULE_INPUT_PATH)', From 11c2e1308213cc6e2f2d80a30f61e41de4d11e4e Mon Sep 17 00:00:00 2001 From: "andrey.kononov" Date: Mon, 18 Aug 2025 19:58:24 +0300 Subject: [PATCH 40/89] Fix PR review notes --- package.json | 18 +++--------------- patches/@2060.io__ffi-napi@4.0.9.patch | 14 ++++++++++++++ pnpm-workspace.yaml | 7 +++++++ 3 files changed, 24 insertions(+), 15 deletions(-) create mode 100644 patches/@2060.io__ffi-napi@4.0.9.patch diff --git a/package.json b/package.json index c7f6eb39ab..d8fc5cd9cb 100644 --- a/package.json +++ b/package.json @@ -57,20 +57,8 @@ "node": ">=20" }, "pnpm": { - "onlyBuiltDependencies": [ - "@2060.io/ffi-napi", - "@2060.io/ref-napi", - "@hyperledger/aries-askar-nodejs", - "@hyperledger/anoncreds-nodejs", - "@hyperledger/indy-vdr-nodejs", - "@openwallet-foundation/askar-nodejs", - "@biomejs/biome", - "es5-ext", - "esbuild", - "protobufjs", - "zstd-napi", - "cbor-extract", - "secp256k1" - ] + "patchedDependencies": { + "@2060.io/ffi-napi@4.0.9": "patches/@2060.io__ffi-napi@4.0.9.patch" + } } } diff --git a/patches/@2060.io__ffi-napi@4.0.9.patch b/patches/@2060.io__ffi-napi@4.0.9.patch new file mode 100644 index 0000000000..2e3cb8248d --- /dev/null +++ b/patches/@2060.io__ffi-napi@4.0.9.patch @@ -0,0 +1,14 @@ +diff --git a/deps/libffi/libffi.gyp b/deps/libffi/libffi.gyp +index d02bef739c0cfb9c1bbb0a666ab3363fd34c5041..5d49572898681902fca1079b7b25d02f15f7617a 100644 +--- a/deps/libffi/libffi.gyp ++++ b/deps/libffi/libffi.gyp +@@ -74,8 +74,7 @@ + '<(INTERMEDIATE_DIR)/<(RULE_INPUT_ROOT).asm', + ], + 'action': [ +- 'call', +- 'preprocess_asm.cmd', ++ '../../../deps/libffi/preprocess_asm.cmd', + 'include', + 'config/<(OS)/<(target_arch)', + '<(RULE_INPUT_PATH)', diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 8da71a7c33..d16ac8840a 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -44,3 +44,10 @@ onlyBuiltDependencies: - "@hyperledger/anoncreds-nodejs" - "@hyperledger/indy-vdr-nodejs" - "@openwallet-foundation/askar-nodejs" + - "@hyperledger/aries-askar-nodejs" + - "es5-ext" + - "esbuild" + - "protobufjs" + - "zstd-napi" + - "cbor-extract" + - "secp256k1" From 0549b7b3ed03c8338472cd2a6aedd2f154fe15de Mon Sep 17 00:00:00 2001 From: "andrey.kononov" Date: Tue, 19 Aug 2025 23:26:30 +0300 Subject: [PATCH 41/89] Sign topic, files, messages with issuerKey --- packages/hedera/package.json | 16 +-- .../hedera/src/ledger/HederaLedgerService.ts | 64 ++++++++---- .../HederaAnoncredsRegistry.e2e.test.ts | 22 ++--- .../tests/unit/hedera-ledger-service.test.ts | 99 +++++++++++++++++-- 4 files changed, 157 insertions(+), 44 deletions(-) diff --git a/packages/hedera/package.json b/packages/hedera/package.json index 4cc45380b5..5f3b872675 100644 --- a/packages/hedera/package.json +++ b/packages/hedera/package.json @@ -25,16 +25,16 @@ "style:fix": "biome check --write --unsafe" }, "dependencies": { - "@hashgraph/sdk": "^2.66.0", "@credo-ts/anoncreds": "workspace:*", "@credo-ts/core": "workspace:*", - "@hiero-did-sdk/anoncreds": "0.1.0", - "@hiero-did-sdk/client": "0.1.0", - "@hiero-did-sdk/core": "0.1.0", - "@hiero-did-sdk/hcs": "0.1.0", - "@hiero-did-sdk/publisher-internal": "0.1.0", - "@hiero-did-sdk/registrar": "0.1.0", - "@hiero-did-sdk/resolver": "0.1.0" + "@hashgraph/sdk": "^2.66.0", + "@hiero-did-sdk/anoncreds": "^0.1.1", + "@hiero-did-sdk/client": "^0.1.1", + "@hiero-did-sdk/core": "^0.1.1", + "@hiero-did-sdk/hcs": "^0.1.1", + "@hiero-did-sdk/publisher-internal": "^0.1.1", + "@hiero-did-sdk/registrar": "^0.1.1", + "@hiero-did-sdk/resolver": "^0.1.1" }, "devDependencies": { "@credo-ts/node": "workspace:*", diff --git a/packages/hedera/src/ledger/HederaLedgerService.ts b/packages/hedera/src/ledger/HederaLedgerService.ts index a66452a097..257531dd43 100644 --- a/packages/hedera/src/ledger/HederaLedgerService.ts +++ b/packages/hedera/src/ledger/HederaLedgerService.ts @@ -18,12 +18,13 @@ import { DidDeactivateOptions, type DidDocument, DidDocumentKey, + DidRepository, DidUpdateOptions, Kms, injectable, } from '@credo-ts/core' import { KeyManagementApi } from '@credo-ts/core/src/modules/kms' -import { Client } from '@hashgraph/sdk' +import { Client, PrivateKey } from '@hashgraph/sdk' import { HederaAnoncredsRegistry } from '@hiero-did-sdk/anoncreds' import { HederaClientService, HederaNetwork } from '@hiero-did-sdk/client' import { DIDResolution, DID_ROOT_KEY_ID, Service, VerificationMethod, parseDID } from '@hiero-did-sdk/core' @@ -265,30 +266,33 @@ export class HederaLedgerService { /* Anoncreds*/ async getSchema(agentContext: AgentContext, schemaId: string): Promise { - const sdk = this.getHederaAnoncredsRegistry(agentContext) - return await sdk.getSchema(schemaId) + const registry = this.getHederaAnoncredsRegistry(agentContext) + return await registry.getSchema(schemaId) } async registerSchema(agentContext: AgentContext, options: RegisterSchemaOptions): Promise { - const sdk = this.getHederaAnoncredsRegistry(agentContext) - return await sdk.registerSchema(options) + const registry = this.getHederaAnoncredsRegistry(agentContext) + const issuerPrivateKey = await this.getIssuerPrivateKey(agentContext, options.schema.issuerId) + return await registry.registerSchema({ ...options, issuerKeyDer: issuerPrivateKey.toStringDer() }) } async getCredentialDefinition( agentContext: AgentContext, credentialDefinitionId: string ): Promise { - const sdk = this.getHederaAnoncredsRegistry(agentContext) - return await sdk.getCredentialDefinition(credentialDefinitionId) + const registry = this.getHederaAnoncredsRegistry(agentContext) + return await registry.getCredentialDefinition(credentialDefinitionId) } async registerCredentialDefinition( agentContext: AgentContext, options: RegisterCredentialDefinitionOptions ): Promise { - const sdk = this.getHederaAnoncredsRegistry(agentContext) - return await sdk.registerCredentialDefinition({ + const registry = this.getHederaAnoncredsRegistry(agentContext) + const issuerPrivateKey = await this.getIssuerPrivateKey(agentContext, options.credentialDefinition.issuerId) + return await registry.registerCredentialDefinition({ ...options, + issuerKeyDer: issuerPrivateKey.toStringDer(), options: { supportRevocation: options.options?.supportRevocation === true, }, @@ -299,16 +303,20 @@ export class HederaLedgerService { agentContext: AgentContext, revocationRegistryDefinitionId: string ): Promise { - const sdk = this.getHederaAnoncredsRegistry(agentContext) - return await sdk.getRevocationRegistryDefinition(revocationRegistryDefinitionId) + const registry = this.getHederaAnoncredsRegistry(agentContext) + return await registry.getRevocationRegistryDefinition(revocationRegistryDefinitionId) } async registerRevocationRegistryDefinition( agentContext: AgentContext, options: RegisterRevocationRegistryDefinitionOptions ): Promise { - const sdk = this.getHederaAnoncredsRegistry(agentContext) - return await sdk.registerRevocationRegistryDefinition(options) + const registry = this.getHederaAnoncredsRegistry(agentContext) + const issuerPrivateKey = await this.getIssuerPrivateKey(agentContext, options.revocationRegistryDefinition.issuerId) + return await registry.registerRevocationRegistryDefinition({ + ...options, + issuerKeyDer: issuerPrivateKey.toStringDer(), + }) } async getRevocationStatusList( @@ -316,16 +324,20 @@ export class HederaLedgerService { revocationRegistryId: string, timestamp: number ): Promise { - const sdk = this.getHederaAnoncredsRegistry(agentContext) - return await sdk.getRevocationStatusList(revocationRegistryId, timestamp) + const registry = this.getHederaAnoncredsRegistry(agentContext) + return await registry.getRevocationStatusList(revocationRegistryId, timestamp) } async registerRevocationStatusList( agentContext: AgentContext, options: RegisterRevocationStatusListOptions ): Promise { - const sdk = this.getHederaAnoncredsRegistry(agentContext) - return await sdk.registerRevocationStatusList(options) + const registry = this.getHederaAnoncredsRegistry(agentContext) + const issuerPrivateKey = await this.getIssuerPrivateKey(agentContext, options.revocationStatusList.issuerId) + return await registry.registerRevocationStatusList({ + ...options, + issuerKeyDer: issuerPrivateKey.toStringDer(), + }) } // Private methods @@ -511,4 +523,22 @@ export class HederaLedgerService { return fieldMethods[action] } + + private async getIssuerPrivateKey(agentContext: AgentContext, issuerId: string): Promise { + const didRepository = agentContext.dependencyManager.resolve(DidRepository) + const kms = agentContext.dependencyManager.resolve(Kms.KeyManagementApi) + + const didRecord = await didRepository.findCreatedDid(agentContext, issuerId) + const rootKey = didRecord?.keys?.find((k) => k.didDocumentRelativeKeyId === DID_ROOT_KEY_ID) + if (!rootKey?.kmsKeyId) { + throw new Error('The root key not found in the KMS') + } + + // @ts-ignore + const keyManagementService = kms.getKms(agentContext) as AskarKeyManagementService + // @ts-ignore + const keyInfo = await keyManagementService.getKeyAsserted(agentContext, rootKey.kmsKeyId) + + return PrivateKey.fromBytesED25519(keyInfo.key.secretBytes) + } } diff --git a/packages/hedera/tests/integration/HederaAnoncredsRegistry.e2e.test.ts b/packages/hedera/tests/integration/HederaAnoncredsRegistry.e2e.test.ts index f3e8c6ff79..fee13c73ca 100644 --- a/packages/hedera/tests/integration/HederaAnoncredsRegistry.e2e.test.ts +++ b/packages/hedera/tests/integration/HederaAnoncredsRegistry.e2e.test.ts @@ -4,7 +4,7 @@ import { getHederaAgent, testCache } from './utils' describe('Hedera AnonCreds support', () => { let agent: Agent - let did: string + let issuerId: string const logger = new ConsoleLogger(LogLevel.fatal) const cache = new testCache() @@ -18,14 +18,14 @@ describe('Hedera AnonCreds support', () => { }) await agent.initialize() - // Making the test did + // Making the test issuerId const didRegistrarResult = await agent.dids.create({ method: 'hedera', }) if (!didRegistrarResult.didState?.didDocument?.id) throw new Error('DidRegistrarError') - did = didRegistrarResult.didState.didDocument.id - logger.debug('DID', [did]) + issuerId = didRegistrarResult.didState.didDocument.id + logger.debug('issuerId', [issuerId]) }) beforeEach(() => { @@ -48,7 +48,7 @@ describe('Hedera AnonCreds support', () => { schema: { name: utils.uuid(), version: '1', - issuerId: did, + issuerId: issuerId, attrNames: ['field1'], }, options: {}, @@ -62,7 +62,7 @@ describe('Hedera AnonCreds support', () => { const credDefResult = await agent.modules.anoncreds.registerCredentialDefinition({ credentialDefinition: { tag: 'default', - issuerId: did, + issuerId: issuerId, schemaId: schemaId, }, options: { @@ -78,7 +78,7 @@ describe('Hedera AnonCreds support', () => { // Register revocation registry definition const revRegDefRegResult = await agent.modules.anoncreds.registerRevocationRegistryDefinition({ revocationRegistryDefinition: { - issuerId: did, + issuerId: issuerId, credentialDefinitionId, maximumCredentialNumber: 10, tag: 'default', @@ -98,7 +98,7 @@ describe('Hedera AnonCreds support', () => { const registerRevocationStatusListResponse = await agent.modules.anoncreds.registerRevocationStatusList({ options: {}, revocationStatusList: { - issuerId: did, + issuerId: issuerId, revocationRegistryDefinitionId, }, }) @@ -114,7 +114,7 @@ describe('Hedera AnonCreds support', () => { logger.debug('revocationStatusListResponse', [revocationStatusListResponse]) expect(revocationStatusListResponse?.revocationStatusList?.revRegDefId).toEqual(revocationRegistryDefinitionId) - expect(revocationStatusListResponse?.revocationStatusList?.issuerId).toEqual(did) + expect(revocationStatusListResponse?.revocationStatusList?.issuerId).toEqual(issuerId) expect(revocationStatusListResponse?.revocationStatusList?.revocationList).toEqual([0, 0, 0, 0, 0, 0, 0, 0, 0, 0]) // Update revocation status list - Revoke indexes @@ -140,7 +140,7 @@ describe('Hedera AnonCreds support', () => { expect(revokeRevocationStatusListResponse?.revocationStatusList?.revRegDefId).toEqual( revocationRegistryDefinitionId ) - expect(revokeRevocationStatusListResponse?.revocationStatusList?.issuerId).toEqual(did) + expect(revokeRevocationStatusListResponse?.revocationStatusList?.issuerId).toEqual(issuerId) expect(revokeRevocationStatusListResponse?.revocationStatusList?.revocationList).toEqual([ 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, ]) @@ -168,7 +168,7 @@ describe('Hedera AnonCreds support', () => { expect(issueRevocationStatusListResponse?.revocationStatusList?.revRegDefId).toEqual( revocationRegistryDefinitionId ) - expect(issueRevocationStatusListResponse?.revocationStatusList?.issuerId).toEqual(did) + expect(issueRevocationStatusListResponse?.revocationStatusList?.issuerId).toEqual(issuerId) expect(issueRevocationStatusListResponse?.revocationStatusList?.revocationList).toEqual([ 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, ]) diff --git a/packages/hedera/tests/unit/hedera-ledger-service.test.ts b/packages/hedera/tests/unit/hedera-ledger-service.test.ts index 37ab1c9d54..4d6a83ed2f 100644 --- a/packages/hedera/tests/unit/hedera-ledger-service.test.ts +++ b/packages/hedera/tests/unit/hedera-ledger-service.test.ts @@ -4,11 +4,11 @@ import { RegisterRevocationStatusListOptions, RegisterSchemaOptions, } from '@credo-ts/anoncreds' -import { type DidDocument } from '@credo-ts/core' +import { type DidDocument, DidRecord, DidRepository } from '@credo-ts/core' import { AgentContext, DependencyManager } from '@credo-ts/core' import { DidDocumentKey, Kms } from '@credo-ts/core' import { KmsJwkPublicOkp } from '@credo-ts/core/src/modules/kms' -import { Client } from '@hashgraph/sdk' +import { Client, PrivateKey } from '@hashgraph/sdk' import { HederaDidCreateOptions, HederaDidUpdateOptions, @@ -67,12 +67,16 @@ import { DID_ROOT_KEY_ID, Publisher, parseDID } from '@hiero-did-sdk/core' jest.mock('../../src/ledger/utils') +import { AskarKeyManagementService } from '@credo-ts/askar' +import { KeyEntryObject } from '@openwallet-foundation/askar-nodejs' import { createOrGetKey } from '../../src/ledger/utils' describe('HederaLedgerService', () => { let service: HederaLedgerService let mockAgentContext: Partial let mockKms: jest.Mocked + let mockDidRepository: jest.Mocked + let mockKeyManagementService: jest.Mocked let mockedCreateOrGetKey: jest.MockedFunction let mockedParseDID: jest.MockedFunction let mockedGenerateDeactivateDIDRequest: jest.MockedFunction @@ -89,13 +93,39 @@ describe('HederaLedgerService', () => { builder = new DIDUpdateBuilder() + mockDidRepository = { + findCreatedDid: jest.fn().mockReturnValue({ + keys: [ + { + didDocumentRelativeKeyId: DID_ROOT_KEY_ID, + kmsKeyId: 'kmsKeyId', + }, + ], + } as unknown as DidRecord), + } as unknown as jest.Mocked + + mockKeyManagementService = { + getKeyAsserted: jest + .fn() + .mockReturnValue({ key: { secretBytes: PrivateKey.generateED25519().toBytes() } } as unknown as KeyEntryObject), + } as unknown as jest.Mocked + mockKms = { sign: jest.fn(), + getKms: jest.fn().mockReturnValue(mockKeyManagementService), } as unknown as jest.Mocked mockAgentContext = { dependencyManager: { - resolve: jest.fn().mockReturnValue(mockKms), + resolve: jest.fn((cls) => { + if (cls === Kms.KeyManagementApi) { + return mockKms + } + if (cls === DidRepository) { + return mockDidRepository + } + throw new Error(`No instance found for ${cls}`) + }), } as unknown as DependencyManager, } @@ -412,7 +442,7 @@ describe('HederaLedgerService', () => { }) }) - describe('Anoncreds SDK methods', () => { + describe('anoncreds SDK methods', () => { // biome-ignore lint/suspicious/noExplicitAny: let mockSdk: any @@ -448,7 +478,7 @@ describe('HederaLedgerService', () => { options: {}, } const result = await service.registerSchema(mockAgentContext as AgentContext, options) - expect(mockSdk.registerSchema).toHaveBeenCalledWith(options) + expect(mockSdk.registerSchema).toHaveBeenCalledWith({ ...options, issuerKeyDer: expect.anything() }) expect(result).toBe('registerSchema') }) @@ -460,7 +490,9 @@ describe('HederaLedgerService', () => { it('registerCredentialDefinition', async () => { const options: RegisterCredentialDefinitionOptions = { - options: { supportRevocation: true }, + options: { + supportRevocation: true, + }, credentialDefinition: { issuerId: '', schemaId: '', @@ -475,7 +507,10 @@ describe('HederaLedgerService', () => { await service.registerCredentialDefinition(mockAgentContext as AgentContext, options) expect(mockSdk.registerCredentialDefinition).toHaveBeenCalledWith({ ...options, - options: { supportRevocation: true }, + issuerKeyDer: expect.anything(), + options: { + supportRevocation: true, + }, }) }) @@ -506,7 +541,10 @@ describe('HederaLedgerService', () => { options: {}, } const result = await service.registerRevocationRegistryDefinition(mockAgentContext as AgentContext, options) - expect(mockSdk.registerRevocationRegistryDefinition).toHaveBeenCalledWith(options) + expect(mockSdk.registerRevocationRegistryDefinition).toHaveBeenCalledWith({ + ...options, + issuerKeyDer: expect.anything(), + }) expect(result).toBe('registerRevRegDef') }) @@ -531,4 +569,49 @@ describe('HederaLedgerService', () => { expect(result).toBe('registerRevStatus') }) }) + + describe('getIssuerPrivateKey', () => { + it('should return PrivateKey from secretBytes when rootKey exists', async () => { + const secretBytes = PrivateKey.generate().toBytes() + const didRecord = { + keys: [{ didDocumentRelativeKeyId: DID_ROOT_KEY_ID, kmsKeyId: 'kms-key-id' }], + } + const keyInfo = { key: { secretBytes } } + + mockDidRepository.findCreatedDid.mockResolvedValue(didRecord as unknown as DidRecord) + // @ts-ignore + mockKeyManagementService.getKeyAsserted.mockResolvedValue(keyInfo) + + // biome-ignore lint/suspicious/noExplicitAny: + const result = await (service as any).getIssuerPrivateKey(mockAgentContext, 'issuer-id') + + expect(mockDidRepository.findCreatedDid).toHaveBeenCalledWith(mockAgentContext, 'issuer-id') + // @ts-ignore + expect(mockKms.getKms).toHaveBeenCalledWith(mockAgentContext) + // @ts-ignore + expect(mockKeyManagementService.getKeyAsserted).toHaveBeenCalledWith(mockAgentContext, 'kms-key-id') + expect(result).toEqual(PrivateKey.fromBytesED25519(secretBytes)) + }) + + it('should throw error if no rootKey found', async () => { + const didRecord = { + keys: [], + } + mockDidRepository.findCreatedDid.mockResolvedValue(didRecord as unknown as DidRecord) + + // biome-ignore lint/suspicious/noExplicitAny: + await expect((service as any).getIssuerPrivateKey(mockAgentContext, 'issuer-id')).rejects.toThrow( + 'The root key not found in the KMS' + ) + }) + + it('should throw error if didRecord is null or undefined', async () => { + mockDidRepository.findCreatedDid.mockResolvedValue(null) + + // biome-ignore lint/suspicious/noExplicitAny: + await expect((service as any).getIssuerPrivateKey(mockAgentContext, 'issuer-id')).rejects.toThrow( + 'The root key not found in the KMS' + ) + }) + }) }) From 0b742fe44767b551e663cd0193d47181e9d7fb99 Mon Sep 17 00:00:00 2001 From: "andrey.kononov" Date: Wed, 20 Aug 2025 11:06:21 +0300 Subject: [PATCH 42/89] Up used libraries --- packages/hedera/package.json | 14 +++++++------- .../tests/unit/hedera-ledger-service.test.ts | 5 ++++- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/packages/hedera/package.json b/packages/hedera/package.json index 5f3b872675..05be886dd9 100644 --- a/packages/hedera/package.json +++ b/packages/hedera/package.json @@ -28,13 +28,13 @@ "@credo-ts/anoncreds": "workspace:*", "@credo-ts/core": "workspace:*", "@hashgraph/sdk": "^2.66.0", - "@hiero-did-sdk/anoncreds": "^0.1.1", - "@hiero-did-sdk/client": "^0.1.1", - "@hiero-did-sdk/core": "^0.1.1", - "@hiero-did-sdk/hcs": "^0.1.1", - "@hiero-did-sdk/publisher-internal": "^0.1.1", - "@hiero-did-sdk/registrar": "^0.1.1", - "@hiero-did-sdk/resolver": "^0.1.1" + "@hiero-did-sdk/anoncreds": "^0.1.2", + "@hiero-did-sdk/client": "^0.1.2", + "@hiero-did-sdk/core": "^0.1.2", + "@hiero-did-sdk/hcs": "^0.1.2", + "@hiero-did-sdk/publisher-internal": "^0.1.2", + "@hiero-did-sdk/registrar": "^0.1.2", + "@hiero-did-sdk/resolver": "^0.1.2" }, "devDependencies": { "@credo-ts/node": "workspace:*", diff --git a/packages/hedera/tests/unit/hedera-ledger-service.test.ts b/packages/hedera/tests/unit/hedera-ledger-service.test.ts index 4d6a83ed2f..49c0f0c68b 100644 --- a/packages/hedera/tests/unit/hedera-ledger-service.test.ts +++ b/packages/hedera/tests/unit/hedera-ledger-service.test.ts @@ -565,7 +565,10 @@ describe('HederaLedgerService', () => { }, } const result = await service.registerRevocationStatusList(mockAgentContext as AgentContext, options) - expect(mockSdk.registerRevocationStatusList).toHaveBeenCalledWith(options) + expect(mockSdk.registerRevocationStatusList).toHaveBeenCalledWith({ + ...options, + issuerKeyDer: expect.anything(), + }) expect(result).toBe('registerRevStatus') }) }) From 4f69da114408cf55f0fe0281114d83f18625d0e9 Mon Sep 17 00:00:00 2001 From: "andrey.kononov" Date: Wed, 20 Aug 2025 11:48:07 +0300 Subject: [PATCH 43/89] Up used libraries --- pnpm-lock.yaml | 184 ++++++++++++++++++++++++++----------------------- 1 file changed, 96 insertions(+), 88 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 624dfcb2c3..c9eedb8ca5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -174,7 +174,7 @@ importers: dependencies: '@hiero-did-sdk/client': specifier: 0.1.0 - version: 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + version: 0.1.0(bn.js@5.2.1) '@hyperledger/anoncreds-nodejs': specifier: 'catalog:' version: 0.3.1 @@ -686,26 +686,26 @@ importers: specifier: ^2.66.0 version: 2.70.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) '@hiero-did-sdk/anoncreds': - specifier: 0.1.0 - version: 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + specifier: ^0.1.2 + version: 0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) '@hiero-did-sdk/client': - specifier: 0.1.0 - version: 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + specifier: ^0.1.2 + version: 0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) '@hiero-did-sdk/core': - specifier: 0.1.0 - version: 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + specifier: ^0.1.2 + version: 0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) '@hiero-did-sdk/hcs': - specifier: 0.1.0 - version: 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + specifier: ^0.1.2 + version: 0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) '@hiero-did-sdk/publisher-internal': - specifier: 0.1.0 - version: 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + specifier: ^0.1.2 + version: 0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) '@hiero-did-sdk/registrar': - specifier: 0.1.0 - version: 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + specifier: ^0.1.2 + version: 0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) '@hiero-did-sdk/resolver': - specifier: 0.1.0 - version: 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + specifier: ^0.1.2 + version: 0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) devDependencies: '@credo-ts/node': specifier: workspace:* @@ -2559,60 +2559,64 @@ packages: peerDependencies: bn.js: ^5.2.1 - '@hiero-did-sdk/anoncreds@0.1.0': - resolution: {integrity: sha512-9+DPsjICXUiQrM5+kSDvV9DMSGfuh/xyo21kFBe8Tm9f7khbCz9tPLRKIiK9OfanZB0hWG6htBS+cwCb7SrLDw==} + '@hiero-did-sdk/anoncreds@0.1.2': + resolution: {integrity: sha512-Htq627498/XP9mZRhkGlT1rb+DIC4TtQSfATv1zYzwszp1ZCc0Ii9nqePCitIOjj33w1pn6ugyiRMXKAqmsDAA==} engines: {node: '>=20'} - '@hiero-did-sdk/cache@0.1.0': - resolution: {integrity: sha512-JK58CiMDoezher6exIMAO+YKFi4mFwRdY6PD1RCB36+A8OAkOk1Od3qUKm27rv4pXEh16lY/DKB/xse8b009iQ==} + '@hiero-did-sdk/cache@0.1.2': + resolution: {integrity: sha512-stj/s2dZ6nPcbg+dXcQ1HiGR4nd/eHtZu3kxQ4PlXQ7HcwnMFMO+DZE1hdh8vwPVD/JCtUzy2BrPdJXQwIzhwA==} engines: {node: '>=20'} '@hiero-did-sdk/client@0.1.0': resolution: {integrity: sha512-8EBsjVxxEZEdQKePenBCo1HXKRK/70p/XRgFPzWIplUE+2jbmfy7NGqx8tzihK0NlXpA17ojp4Pu5wZJONolmA==} engines: {node: '>=20'} - '@hiero-did-sdk/core@0.1.0': - resolution: {integrity: sha512-qbV74xqRQBnTMpm7MGlEcqBHbiHD0+QagU698ZXKB/X3dz1Mf8kvmoZdaPPS+bIq7S6nJqf6u9xd+L0OKLgzbg==} + '@hiero-did-sdk/client@0.1.2': + resolution: {integrity: sha512-1HOk6O13+ex9KOxkaxhD27aEeubwT1UAAyOFVo7YKEkXBOJc1PPAZVPbkYOyyuYA+UEUT6ntUvXmhsYvm8IMog==} engines: {node: '>=20'} - '@hiero-did-sdk/crypto@0.1.0': - resolution: {integrity: sha512-5wGuufZpcaDf3XYmX0CrCtGA9F9Zkitj+DjGVebVEJEOr9CiZeWWoJ/rS1zxOBPNWyZH3aWKG9vUqJ8RyOXiPg==} + '@hiero-did-sdk/core@0.1.2': + resolution: {integrity: sha512-TqKR1/vg9vg4TmGB3y5oYCDS1d+5amF95EUBVj2KJI4wgKqprtoMSQP6sWxhKwkXH1vdhRhRYiUOnadq2IuL8Q==} engines: {node: '>=20'} - '@hiero-did-sdk/hcs@0.1.0': - resolution: {integrity: sha512-Eb5pUrdXHcqNISN3kDZiQCFRKcMhrSyyuSMRrD1mYvUG2OGi5nleaUoR6xK2u0G/jJ8hrgytXuYONTim/6wJ+Q==} + '@hiero-did-sdk/crypto@0.1.2': + resolution: {integrity: sha512-wURtHaiKOyJ9BEf10BvBi13Qy2s4dTYpH5A3mOGmxetsy2vjUvd+pIgjzP+P7A3Zskni2b8iyrRe70G/LiR5fA==} engines: {node: '>=20'} - '@hiero-did-sdk/lifecycle@0.1.0': - resolution: {integrity: sha512-j+pIqGFz7TVYZYM8R4FFHT+y859X5UPC7ZGLY7fDtEwsRGRlU6DllhO3octh4qyoJ9BkCJyU8omZjAKeq/WW4g==} + '@hiero-did-sdk/hcs@0.1.2': + resolution: {integrity: sha512-pyWQAKrS93hmj+ydOZRr3vB6ZObxx8wHRwvJb67YADudU6FhWH0FyWmflDiJ2D+f1a+Z3EsuF6Drbui9Ja0AVQ==} engines: {node: '>=20'} - '@hiero-did-sdk/messages@0.1.0': - resolution: {integrity: sha512-j5GRYzJc+Fp2/ILhOCsE62dJwK9efqCu8YbzIVR3o7hGx7HzAC1fbM73myQqBTrcpxQJkRktV8lCeEKK9nOYGw==} + '@hiero-did-sdk/lifecycle@0.1.2': + resolution: {integrity: sha512-QYjXlQWSRgfEmsXTQj5X5lRZ7E2GXG+6yKA3WsPFjG4MoPC6AL1i1ZXczsDOfGGLxglQGJjf78CL2fQDjxMtlg==} engines: {node: '>=20'} - '@hiero-did-sdk/publisher-internal@0.1.0': - resolution: {integrity: sha512-lMBeltfo+NPqVik148h5VWwLrvDiXVYTJyKkaev9/JatTZlJELdYhtvWyBPPSvCikDFf8Td1QGe3wq/Jm4kbOA==} + '@hiero-did-sdk/messages@0.1.2': + resolution: {integrity: sha512-dIm0aM519qTCNrDkT14IMy3l7n8L4G1EsT52Sl/Q0FIEQiLDwCiiJO866a8UXHe+7FH1V6n0yOERiggGwIZhbA==} engines: {node: '>=20'} - '@hiero-did-sdk/registrar@0.1.0': - resolution: {integrity: sha512-zpRxQy24R+ZYxX6N4+VVxZwanxEfkCkcbzDncp8q4q/7Tru5bkAs+WghljiQS0CZPvSwP0iv21SsDEWjDtkKBw==} + '@hiero-did-sdk/publisher-internal@0.1.2': + resolution: {integrity: sha512-vs4NRfF3+/uzoL3b2edaIeGNLt5jWx5+KruYLgmbgeP21Eb3ZrClZEZGRQaeU5IP/nqxCHalpffs1nI/kVxymA==} engines: {node: '>=20'} - '@hiero-did-sdk/resolver@0.1.0': - resolution: {integrity: sha512-/SVglErskv8qhBrcvgxHEgv6t1vwX0eJ3Q90QSTqhmnNIZCtjoI9yP/bo7MONBwsowY2DUCF18s5vT2/k2V3gQ==} + '@hiero-did-sdk/registrar@0.1.2': + resolution: {integrity: sha512-aa+khHIqkgF3geOhIxM9eKRNNgYiPdaXkf9Rq1jByoVwo/liLtdoe8xOQfRL3YMEVf94ztbGjYpb9NmeaZY2Ow==} engines: {node: '>=20'} - '@hiero-did-sdk/signer-internal@0.1.0': - resolution: {integrity: sha512-Z55sq1ExxtWZHzZcydQS4eg5G8w+nWx5uMQwAZrS92m6s9G1kg4z90tM321NQca6d9kFIjp59NYQA1inhxLf1w==} + '@hiero-did-sdk/resolver@0.1.2': + resolution: {integrity: sha512-9r9s2SVrPPaMmIKjbO7UgxmC0qkxYSuO06nv2m8A1tq11w9EDkLoIK+u8Fdgdh2HGZHZ9ZLmFQn9QRl2Y1tnYQ==} engines: {node: '>=20'} - '@hiero-did-sdk/verifier-internal@0.1.0': - resolution: {integrity: sha512-AyJz0HqbFO/mtY0t5Fpx7LBrRG5fI8tR5b0LVjhnDsvfCt3hOeLOoqnbv28x7Kljsyz+2ZJG3IPoawF5To5NGA==} + '@hiero-did-sdk/signer-internal@0.1.2': + resolution: {integrity: sha512-cpwHgW1lUCe8UuyT9P2iasQ0AVynmvGFueM21qxOr4qXFXI0oy0mGgORDsnXOnljgy7Yn8/QvBVxjeWx569yyg==} engines: {node: '>=20'} - '@hiero-did-sdk/zstd@0.1.0': - resolution: {integrity: sha512-Y5jNDMOR268rZJBgTdwg5KjZeXijYjfCdu55P5jhzWXkO3lKHdd5jJR46DLFWse+/WaS9Ev8pz2uX+bHium8tQ==} + '@hiero-did-sdk/verifier-internal@0.1.2': + resolution: {integrity: sha512-rOC1DbqCCH63NnVaF31bsSQc+iDxpqW97GwL+br1QulpcUpGXPTUoCwTadPd1qRUrlFU4Rh1yDR3IW+4aqVsqA==} + engines: {node: '>=20'} + + '@hiero-did-sdk/zstd@0.1.2': + resolution: {integrity: sha512-IaqgqRLBrn3wTOUsYMo55OG1uU8gSLIWNnimbxLpZs6ZUvL2ri36HUmpjLT1ZypgupAcPscM+BLPIRMUFWjwZQ==} engines: {node: '>=20'} '@hyperledger/anoncreds-nodejs@0.3.1': @@ -3074,9 +3078,6 @@ packages: resolution: {integrity: sha512-lzD84av1ZQhYUS+jsGqJiCMaJO2dn9u+RTT9n9q6D3SaKVwWqv+7AoRKqBu19bkwyE+iFRl1ymr40QS90jVFYg==} engines: {node: '>=14.15'} - '@scure/base@1.2.1': - resolution: {integrity: sha512-DGmGtC8Tt63J5GfHgfl5CuAXh96VF/LD8K9Hr/Gv0J2lAoRGlPOMpqMpMbCTOoOJMZCk2Xt+DskdDyn6dEFdzQ==} - '@scure/base@1.2.6': resolution: {integrity: sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg==} @@ -3167,6 +3168,7 @@ packages: '@sphereon/kmp-mdoc-core@0.2.0-SNAPSHOT.26': resolution: {integrity: sha512-QXJ6R8ENiZV2rPMbn06cw5JKwqUYN1kzVRbYfONqE1PEXx1noQ4md7uxr2zSczi0ubKkNcbyYDNtIMTZIhGzmQ==} + bundledDependencies: [] '@sphereon/pex-models@2.3.2': resolution: {integrity: sha512-foFxfLkRwcn/MOp/eht46Q7wsvpQGlO7aowowIIb5Tz9u97kYZ2kz6K2h2ODxWuv5CRA7Q0MY8XUBGE2lfOhOQ==} @@ -10506,26 +10508,26 @@ snapshots: - expo-crypto - react-native - '@hiero-did-sdk/anoncreds@0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': + '@hiero-did-sdk/anoncreds@0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': dependencies: - '@hiero-did-sdk/core': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) - '@hiero-did-sdk/hcs': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) - '@hiero-did-sdk/zstd': 0.1.0 + '@hiero-did-sdk/core': 0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/hcs': 0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/zstd': 0.1.2 buffer: 6.0.3 transitivePeerDependencies: - bn.js - expo-crypto - react-native - '@hiero-did-sdk/cache@0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': + '@hiero-did-sdk/cache@0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': dependencies: - '@hiero-did-sdk/core': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/core': 0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) transitivePeerDependencies: - bn.js - expo-crypto - react-native - '@hiero-did-sdk/client@0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': + '@hiero-did-sdk/client@0.1.0(bn.js@5.2.1)': dependencies: '@hashgraph/sdk': 2.70.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) transitivePeerDependencies: @@ -10533,7 +10535,15 @@ snapshots: - expo-crypto - react-native - '@hiero-did-sdk/core@0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': + '@hiero-did-sdk/client@0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': + dependencies: + '@hashgraph/sdk': 2.70.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + transitivePeerDependencies: + - bn.js + - expo-crypto + - react-native + + '@hiero-did-sdk/core@0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': dependencies: '@hashgraph/sdk': 2.70.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) '@scure/base': 1.2.6 @@ -10544,105 +10554,105 @@ snapshots: - expo-crypto - react-native - '@hiero-did-sdk/crypto@0.1.0': + '@hiero-did-sdk/crypto@0.1.2': dependencies: buffer: 6.0.3 - '@hiero-did-sdk/hcs@0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': + '@hiero-did-sdk/hcs@0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': dependencies: '@hashgraph/sdk': 2.70.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) - '@hiero-did-sdk/cache': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) - '@hiero-did-sdk/client': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) - '@hiero-did-sdk/core': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) - '@hiero-did-sdk/crypto': 0.1.0 - '@hiero-did-sdk/zstd': 0.1.0 + '@hiero-did-sdk/cache': 0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/client': 0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/core': 0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/crypto': 0.1.2 + '@hiero-did-sdk/zstd': 0.1.2 buffer: 6.0.3 transitivePeerDependencies: - bn.js - expo-crypto - react-native - '@hiero-did-sdk/lifecycle@0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': + '@hiero-did-sdk/lifecycle@0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': dependencies: - '@hiero-did-sdk/core': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/core': 0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) buffer: 6.0.3 transitivePeerDependencies: - bn.js - expo-crypto - react-native - '@hiero-did-sdk/messages@0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': + '@hiero-did-sdk/messages@0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': dependencies: '@hashgraph/sdk': 2.70.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) - '@hiero-did-sdk/core': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) - '@hiero-did-sdk/lifecycle': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) - '@hiero-did-sdk/resolver': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/core': 0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/lifecycle': 0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/resolver': 0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) buffer: 6.0.3 transitivePeerDependencies: - bn.js - expo-crypto - react-native - '@hiero-did-sdk/publisher-internal@0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': + '@hiero-did-sdk/publisher-internal@0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': dependencies: '@hashgraph/sdk': 2.70.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) - '@hiero-did-sdk/core': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/core': 0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) buffer: 6.0.3 transitivePeerDependencies: - bn.js - expo-crypto - react-native - '@hiero-did-sdk/registrar@0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': + '@hiero-did-sdk/registrar@0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': dependencies: '@hashgraph/sdk': 2.70.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) - '@hiero-did-sdk/core': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) - '@hiero-did-sdk/lifecycle': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) - '@hiero-did-sdk/messages': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) - '@hiero-did-sdk/publisher-internal': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) - '@hiero-did-sdk/resolver': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) - '@hiero-did-sdk/signer-internal': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) - '@hiero-did-sdk/verifier-internal': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/core': 0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/lifecycle': 0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/messages': 0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/publisher-internal': 0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/resolver': 0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/signer-internal': 0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/verifier-internal': 0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) buffer: 6.0.3 transitivePeerDependencies: - bn.js - expo-crypto - react-native - '@hiero-did-sdk/resolver@0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': + '@hiero-did-sdk/resolver@0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': dependencies: '@hashgraph/sdk': 2.70.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) - '@hiero-did-sdk/client': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) - '@hiero-did-sdk/core': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) - '@hiero-did-sdk/hcs': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) - '@hiero-did-sdk/verifier-internal': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/client': 0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/core': 0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/hcs': 0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/verifier-internal': 0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) buffer: 6.0.3 transitivePeerDependencies: - bn.js - expo-crypto - react-native - '@hiero-did-sdk/signer-internal@0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': + '@hiero-did-sdk/signer-internal@0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': dependencies: '@hashgraph/sdk': 2.70.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) - '@hiero-did-sdk/core': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/core': 0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) buffer: 6.0.3 transitivePeerDependencies: - bn.js - expo-crypto - react-native - '@hiero-did-sdk/verifier-internal@0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': + '@hiero-did-sdk/verifier-internal@0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': dependencies: '@hashgraph/sdk': 2.70.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) - '@hiero-did-sdk/core': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/core': 0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) buffer: 6.0.3 transitivePeerDependencies: - bn.js - expo-crypto - react-native - '@hiero-did-sdk/zstd@0.1.0': {} + '@hiero-did-sdk/zstd@0.1.2': {} '@hyperledger/anoncreds-nodejs@0.3.1': dependencies: @@ -11548,8 +11558,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@scure/base@1.2.1': {} - '@scure/base@1.2.6': {} '@sd-jwt/core@0.10.0': @@ -13065,7 +13073,7 @@ snapshots: '@noble/ciphers': 1.2.1 '@noble/curves': 1.9.2 '@noble/hashes': 1.8.0 - '@scure/base': 1.2.1 + '@scure/base': 1.2.6 canonicalize: 2.0.0 did-resolver: 4.1.0 multibase: 4.0.6 From 36c2e9f8f282e51c9a56facbaaf78760e28d754c Mon Sep 17 00:00:00 2001 From: "andrey.kononov" Date: Wed, 20 Aug 2025 12:03:41 +0300 Subject: [PATCH 44/89] Lint --- packages/hedera/src/ledger/HederaLedgerService.ts | 4 ++-- packages/hedera/tests/unit/hedera-ledger-service.test.ts | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/hedera/src/ledger/HederaLedgerService.ts b/packages/hedera/src/ledger/HederaLedgerService.ts index 257531dd43..b915d437e8 100644 --- a/packages/hedera/src/ledger/HederaLedgerService.ts +++ b/packages/hedera/src/ledger/HederaLedgerService.ts @@ -335,8 +335,8 @@ export class HederaLedgerService { const registry = this.getHederaAnoncredsRegistry(agentContext) const issuerPrivateKey = await this.getIssuerPrivateKey(agentContext, options.revocationStatusList.issuerId) return await registry.registerRevocationStatusList({ - ...options, - issuerKeyDer: issuerPrivateKey.toStringDer(), + ...options, + issuerKeyDer: issuerPrivateKey.toStringDer(), }) } diff --git a/packages/hedera/tests/unit/hedera-ledger-service.test.ts b/packages/hedera/tests/unit/hedera-ledger-service.test.ts index 49c0f0c68b..e7f946ae7e 100644 --- a/packages/hedera/tests/unit/hedera-ledger-service.test.ts +++ b/packages/hedera/tests/unit/hedera-ledger-service.test.ts @@ -566,8 +566,8 @@ describe('HederaLedgerService', () => { } const result = await service.registerRevocationStatusList(mockAgentContext as AgentContext, options) expect(mockSdk.registerRevocationStatusList).toHaveBeenCalledWith({ - ...options, - issuerKeyDer: expect.anything(), + ...options, + issuerKeyDer: expect.anything(), }) expect(result).toBe('registerRevStatus') }) From fc527ad68d9db47a0650ea7617670c344ab355d1 Mon Sep 17 00:00:00 2001 From: "andrey.kononov" Date: Fri, 6 Jun 2025 23:28:49 +0300 Subject: [PATCH 45/89] Added HederaCredo module Start using the hashgraph-did-js sdk --- packages/hedera/CHANGELOG.md | 8 + packages/hedera/README.md | 31 +++ packages/hedera/jest.config.ts | 13 + packages/hedera/package.json | 34 +++ packages/hedera/src/HederaModule.ts | 32 +++ packages/hedera/src/HederaModuleConfig.ts | 15 ++ .../src/anoncreds/HederaAnonCredsRegistry.ts | 249 ++++++++++++++++++ packages/hedera/src/anoncreds/index.ts | 1 + .../hedera/src/dids/HederaDidRegistrar.ts | 104 ++++++++ packages/hedera/src/dids/HederaDidResolver.ts | 66 +++++ packages/hedera/src/dids/index.ts | 2 + packages/hedera/src/index.ts | 8 + .../hedera/src/ledger/HederaLedgerService.ts | 18 ++ .../src/ledger/HederaLedgerServiceCache.ts | 42 +++ packages/hedera/src/ledger/index.ts | 1 + packages/hedera/tests/setup.ts | 1 + packages/hedera/tests/setupHederaModule.ts | 21 ++ packages/hedera/tsconfig.build.json | 10 + packages/hedera/tsconfig.json | 8 + patches/@2060.io__ffi-napi@4.0.9.patch | 14 + 20 files changed, 678 insertions(+) create mode 100644 packages/hedera/CHANGELOG.md create mode 100644 packages/hedera/README.md create mode 100644 packages/hedera/jest.config.ts create mode 100644 packages/hedera/package.json create mode 100644 packages/hedera/src/HederaModule.ts create mode 100644 packages/hedera/src/HederaModuleConfig.ts create mode 100644 packages/hedera/src/anoncreds/HederaAnonCredsRegistry.ts create mode 100644 packages/hedera/src/anoncreds/index.ts create mode 100644 packages/hedera/src/dids/HederaDidRegistrar.ts create mode 100644 packages/hedera/src/dids/HederaDidResolver.ts create mode 100644 packages/hedera/src/dids/index.ts create mode 100644 packages/hedera/src/index.ts create mode 100644 packages/hedera/src/ledger/HederaLedgerService.ts create mode 100644 packages/hedera/src/ledger/HederaLedgerServiceCache.ts create mode 100644 packages/hedera/src/ledger/index.ts create mode 100644 packages/hedera/tests/setup.ts create mode 100644 packages/hedera/tests/setupHederaModule.ts create mode 100644 packages/hedera/tsconfig.build.json create mode 100644 packages/hedera/tsconfig.json create mode 100644 patches/@2060.io__ffi-napi@4.0.9.patch diff --git a/packages/hedera/CHANGELOG.md b/packages/hedera/CHANGELOG.md new file mode 100644 index 0000000000..62e74296bd --- /dev/null +++ b/packages/hedera/CHANGELOG.md @@ -0,0 +1,8 @@ +# Changelog + +## 0.0.1 + +### Patch Changes + +- Added Hedera module + diff --git a/packages/hedera/README.md b/packages/hedera/README.md new file mode 100644 index 0000000000..0f0db816da --- /dev/null +++ b/packages/hedera/README.md @@ -0,0 +1,31 @@ +

+
+ Credo Logo +

+

Credo Hedera Module

+

+ License + typescript + @credo-ts/hedera version + +

+
+ +Credo hedera provides integration of the Hedera network into Credo. See the [Hedera Setup](https://credo.js.org/guides/getting-started/set-up/hedera) for installation instructions. diff --git a/packages/hedera/jest.config.ts b/packages/hedera/jest.config.ts new file mode 100644 index 0000000000..93c0197296 --- /dev/null +++ b/packages/hedera/jest.config.ts @@ -0,0 +1,13 @@ +import type { Config } from '@jest/types' + +import base from '../../jest.config.base' + +import packageJson from './package.json' + +const config: Config.InitialOptions = { + ...base, + displayName: packageJson.name, + setupFilesAfterEnv: ['./tests/setup.ts'], +} + +export default config diff --git a/packages/hedera/package.json b/packages/hedera/package.json new file mode 100644 index 0000000000..f6ef239f46 --- /dev/null +++ b/packages/hedera/package.json @@ -0,0 +1,34 @@ +{ + "name": "@credo-ts/hedera", + "main": "src/index", + "types": "src/index", + "version": "0.5.13", + "files": ["build"], + "license": "Apache-2.0", + "publishConfig": { + "access": "public" + }, + "homepage": "https://github.com/openwallet-foundation/credo-ts/tree/main/packages/hedera", + "repository": { + "type": "git", + "url": "https://github.com/openwallet-foundation/credo-ts", + "directory": "packages/hedera" + }, + "scripts": { + "build": "pnpm run clean && pnpm run compile", + "clean": "rimraf ./build", + "compile": "tsc -p tsconfig.build.json", + "prepublishOnly": "pnpm run build", + "test": "jest" + }, + "dependencies": { + "@credo-ts/anoncreds": "workspace:*", + "@credo-ts/core": "workspace:*", + "@hiero-did-sdk-js/anoncreds": "npm:@hiero-did-sdk-js/anoncreds@0.0.1", + "@swiss-digital-assets-institute/registrar": "0.3.0" + }, + "devDependencies": { + "rimraf": "^4.0.7", + "typescript": "~5.5.2" + } +} diff --git a/packages/hedera/src/HederaModule.ts b/packages/hedera/src/HederaModule.ts new file mode 100644 index 0000000000..d23a2db144 --- /dev/null +++ b/packages/hedera/src/HederaModule.ts @@ -0,0 +1,32 @@ +import { DependencyManager, Module } from '@credo-ts/core' + +import { AgentConfig, Buffer } from '@credo-ts/core' + +import { HederaModuleConfig, HederaModuleConfigOptions } from './HederaModuleConfig' +import { HederaLedgerService } from './ledger' + +export class HederaModule implements Module { + public readonly config: HederaModuleConfig + + public constructor(config: HederaModuleConfigOptions) { + this.config = new HederaModuleConfig(config) + } + + public register(dependencyManager: DependencyManager) { + // Warn about experimental module + dependencyManager + .resolve(AgentConfig) + .logger.warn( + "The '@credo-ts/hedera' module is experimental and could have unexpected breaking changes. When using this module, make sure to use strict versions for all @credo-ts packages." + ) + + // Register config + dependencyManager.registerInstance(HederaModuleConfig, this.config) + dependencyManager.registerSingleton(HederaLedgerService) + + // Hedera module needs Buffer to be available globally + // If it is not available yet, we overwrite it with the + // Buffer implementation from Credo + global.Buffer = global.Buffer || Buffer + } +} diff --git a/packages/hedera/src/HederaModuleConfig.ts b/packages/hedera/src/HederaModuleConfig.ts new file mode 100644 index 0000000000..5fe22428ef --- /dev/null +++ b/packages/hedera/src/HederaModuleConfig.ts @@ -0,0 +1,15 @@ +import { HederaAnoncredsRegistryConfiguration } from '@hiero-did-sdk-js/anoncreds' + +export type HederaModuleConfigOptions = HederaAnoncredsRegistryConfiguration + +export class HederaModuleConfig { + private readonly _options: HederaModuleConfigOptions + + public constructor(options: HederaModuleConfigOptions) { + this._options = options + } + + get options(): HederaModuleConfigOptions { + return this._options + } +} diff --git a/packages/hedera/src/anoncreds/HederaAnonCredsRegistry.ts b/packages/hedera/src/anoncreds/HederaAnonCredsRegistry.ts new file mode 100644 index 0000000000..c7ccfa9d7a --- /dev/null +++ b/packages/hedera/src/anoncreds/HederaAnonCredsRegistry.ts @@ -0,0 +1,249 @@ +import type { + AnonCredsRegistry, + GetCredentialDefinitionReturn, + GetRevocationRegistryDefinitionReturn, + GetRevocationStatusListReturn, + GetSchemaReturn, + RegisterCredentialDefinitionOptions, + RegisterCredentialDefinitionReturn, + RegisterRevocationRegistryDefinitionOptions, + RegisterRevocationRegistryDefinitionReturn, + RegisterRevocationStatusListOptions, + RegisterRevocationStatusListReturn, + RegisterSchemaOptions, + RegisterSchemaReturn, +} from '@credo-ts/anoncreds' +import type { AgentContext } from '@credo-ts/core' +import { HederaLedgerService } from '../ledger' + +export class HederaAnonCredsRegistry implements AnonCredsRegistry { + public readonly methodName = 'hedera' + public readonly supportedIdentifier = /^did:hedera:.*$/ + + public async registerSchema( + agentContext: AgentContext, + options: RegisterSchemaOptions + ): Promise { + try { + const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) + const sdk = ledgerService.getHederaAnonCredsSdk(agentContext) + agentContext.config.logger.trace('Submitting register schema request to ledger') + return await sdk.registerSchema(options) + } catch (error) { + agentContext.config.logger.debug(`Error registering schema for did '${options.schema.issuerId}'`, { + error, + did: options.schema.issuerId, + schema: options, + }) + return { + schemaMetadata: {}, + registrationMetadata: {}, + schemaState: { + state: 'failed', + schema: options.schema, + reason: `Unable to register schema: ${error.message}`, + }, + } + } + } + + public async getSchema(agentContext: AgentContext, schemaId: string): Promise { + try { + const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) + const sdk = ledgerService.getHederaAnonCredsSdk(agentContext) + agentContext.config.logger.trace(`Submitting get schema request for schema '${schemaId}' to ledger`) + return await sdk.getSchema(schemaId) + } catch (error) { + agentContext.config.logger.error(`Error retrieving schema '${schemaId}'`, { + error, + schemaId, + }) + return { + schemaId, + resolutionMetadata: { + error: 'notFound', + message: `Unable to resolve schema: ${error.message}`, + }, + schemaMetadata: {}, + } + } + } + + public async registerCredentialDefinition( + agentContext: AgentContext, + options: RegisterCredentialDefinitionOptions + ): Promise { + try { + const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) + const sdk = ledgerService.getHederaAnonCredsSdk(agentContext) + agentContext.config.logger.trace('Submitting register credential definition request to ledger') + return await sdk.registerCredentialDefinition(options) + } catch (error) { + agentContext.config.logger.error( + `Error registering credential definition for did '${options.credentialDefinition.issuerId}'`, + { + error, + did: options.credentialDefinition.issuerId, + schema: options, + } + ) + return { + credentialDefinitionMetadata: {}, + registrationMetadata: {}, + credentialDefinitionState: { + state: 'failed', + credentialDefinition: options.credentialDefinition, + reason: `Unable to register credential definition: ${error.message}`, + }, + } + } + } + + public async getCredentialDefinition( + agentContext: AgentContext, + credentialDefinitionId: string + ): Promise { + try { + const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) + const sdk = ledgerService.getHederaAnonCredsSdk(agentContext) + agentContext.config.logger.trace( + `Submitting get credential definition request for '${credentialDefinitionId}' to ledger` + ) + return await sdk.getCredentialDefinition(credentialDefinitionId) + } catch (error) { + agentContext.config.logger.error(`Error retrieving credential definition '${credentialDefinitionId}'`, { + error, + credentialDefinitionId, + }) + return { + credentialDefinitionId, + resolutionMetadata: { + error: 'notFound', + message: `Unable to resolve credential definition: ${error.message}`, + }, + credentialDefinitionMetadata: {}, + } + } + } + + public async registerRevocationRegistryDefinition( + agentContext: AgentContext, + options: RegisterRevocationRegistryDefinitionOptions + ): Promise { + try { + const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) + const sdk = ledgerService.getHederaAnonCredsSdk(agentContext) + agentContext.config.logger.trace( + `Submitting register revocation registry definition request for '${options.revocationRegistryDefinition.credDefId}' to ledger` + ) + return await sdk.registerRevocationRegistryDefinition(options) + } catch (error) { + agentContext.config.logger.error( + `Error registering revocation registry definition for did '${options.revocationRegistryDefinition.issuerId}'`, + { + error, + did: options.revocationRegistryDefinition.issuerId, + options, + } + ) + return { + revocationRegistryDefinitionMetadata: {}, + registrationMetadata: {}, + revocationRegistryDefinitionState: { + state: 'failed', + revocationRegistryDefinition: options.revocationRegistryDefinition, + reason: `Unable to register revocation registry definition: ${error.message}`, + }, + } + } + } + + public async getRevocationRegistryDefinition( + agentContext: AgentContext, + revocationRegistryDefinitionId: string + ): Promise { + try { + const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) + const sdk = ledgerService.getHederaAnonCredsSdk(agentContext) + agentContext.config.logger.trace( + `Submitting get revocation registry definition request for '${revocationRegistryDefinitionId}' to ledger` + ) + return await sdk.getRevocationRegistryDefinition(revocationRegistryDefinitionId) + } catch (error) { + agentContext.config.logger.error( + `Error retrieving revocation registry definition '${revocationRegistryDefinitionId}'`, + { + error, + revocationRegistryDefinitionId, + } + ) + return { + revocationRegistryDefinitionId, + resolutionMetadata: { + error: 'notFound', + message: `Unable to resolve revocation registry definition: ${error.message}`, + }, + revocationRegistryDefinitionMetadata: {}, + } + } + } + + public async registerRevocationStatusList( + agentContext: AgentContext, + options: RegisterRevocationStatusListOptions + ): Promise { + try { + const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) + const sdk = ledgerService.getHederaAnonCredsSdk(agentContext) + agentContext.config.logger.trace( + `Submitting register revocation status list request for '${options.revocationStatusList.revRegDefId}' to ledger` + ) + return await sdk.registerRevocationStatusList(options) + } catch (error) { + agentContext.config.logger.error( + `Error registering revocation status list for did '${options.revocationStatusList.issuerId}'`, + { + error, + did: options.revocationStatusList.issuerId, + options, + } + ) + return { + revocationStatusListMetadata: {}, + registrationMetadata: {}, + revocationStatusListState: { + state: 'failed', + revocationStatusList: options.revocationStatusList, + reason: `Unable to register revocation status list: ${error.message}`, + }, + } + } + } + + public async getRevocationStatusList( + agentContext: AgentContext, + revocationRegistryId: string, + timestamp: number + ): Promise { + try { + const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) + const sdk = ledgerService.getHederaAnonCredsSdk(agentContext) + agentContext.config.logger.trace( + `Submitting get revocation status request for '${revocationRegistryId}' to ledger` + ) + return await sdk.getRevocationStatusList(revocationRegistryId, timestamp) + } catch (error) { + agentContext.config.logger.error(`Error retrieving revocation registry status list '${revocationRegistryId}'`, { + error, + revocationRegistryId, + }) + return { + resolutionMetadata: { + error: 'notFound', + message: `Unable to resolve revocation registry status list: ${error.message}`, + }, + revocationStatusListMetadata: {}, + } + } + } +} diff --git a/packages/hedera/src/anoncreds/index.ts b/packages/hedera/src/anoncreds/index.ts new file mode 100644 index 0000000000..886cabd90b --- /dev/null +++ b/packages/hedera/src/anoncreds/index.ts @@ -0,0 +1 @@ +export { HederaAnonCredsRegistry } from './HederaAnonCredsRegistry' diff --git a/packages/hedera/src/dids/HederaDidRegistrar.ts b/packages/hedera/src/dids/HederaDidRegistrar.ts new file mode 100644 index 0000000000..51897b5fd9 --- /dev/null +++ b/packages/hedera/src/dids/HederaDidRegistrar.ts @@ -0,0 +1,104 @@ +import type { + AgentContext, + DidCreateOptions, + DidCreateResult, + DidDeactivateOptions, + DidDeactivateResult, + DidRegistrar, + DidUpdateOptions, + DidUpdateResult, +} from '@credo-ts/core' +import { + DidDocument, + DidDocumentRole, + DidRecord, + DidRepository, + JsonTransformer, + TypedArrayEncoder, +} from '@credo-ts/core' +import { HederaLedgerService } from '../ledger' +import {createDID} from "@swiss-digital-assets-institute/registrar"; + +export class HederaDidRegistrar implements DidRegistrar { + public readonly supportedMethods = ['hedera'] + + public async create(agentContext: AgentContext, options: HederaDidCreateOptions): Promise { + const didRepository = agentContext.dependencyManager.resolve(DidRepository) + const hederaLedgerService = agentContext.dependencyManager.resolve(HederaLedgerService) + + try { + const { did, didDocument } = await createDID({ + client, + }); + + console.log(`DID: ${did}`); + console.log(`DID Document: ${JSON.stringify(didDocument, null, 2)}`); + } catch (error) { + console.error("Error creating DID:", error); + } + + + + // let didDocument: DidDocument + // + // try { + // const seedBuffer = TypedArrayEncoder.fromString(options.secret.seed) + // + // await agentContext.wallet.createKey({ keyType: KeyType.Ed25519, privateKey: seedBuffer }) + // + // const hederaDid = await hederaLedgerService.registerHcsDid(Buffer.from(seedBuffer)) + // + // const did = await hederaDid.resolve() + // + // didDocument = JsonTransformer.fromJSON(did.toJsonTree(), DidDocument) + // + // // Save the did so we know we created it and can issue with it + // const didRecord = new DidRecord({ + // did: did.getId(), + // role: DidDocumentRole.Created, + // didDocument, + // }) + // await didRepository.save(agentContext, didRecord) + // + // return { + // didDocumentMetadata: {}, + // didRegistrationMetadata: {}, + // didState: { + // state: 'finished', + // did: didDocument.id, + // didDocument, + // secret: options.secret, + // }, + // } + // } catch (error) { + // agentContext.config.logger.error(`Error registering DID : ${error}`) + // return { + // didDocumentMetadata: {}, + // didRegistrationMetadata: {}, + // didState: { + // state: 'failed', + // reason: `unknownError: ${error}`, + // }, + // } + // } + } + + public async update(agentContext: AgentContext, options: DidUpdateOptions): Promise { + throw new Error('Method not implemented.') + } + + public async deactivate(agentContext: AgentContext, options: DidDeactivateOptions): Promise { + throw new Error('Method not implemented.') + } +} + +export type SeedString = string + +export interface HederaDidCreateOptions extends DidCreateOptions { + method: 'hedera' + did?: never + secret: { + network: HederaNetwork + seed: string + } +} diff --git a/packages/hedera/src/dids/HederaDidResolver.ts b/packages/hedera/src/dids/HederaDidResolver.ts new file mode 100644 index 0000000000..0a76a33844 --- /dev/null +++ b/packages/hedera/src/dids/HederaDidResolver.ts @@ -0,0 +1,66 @@ +import { + type AgentContext, + DidDocument, + type DidResolutionResult, + type DidResolver, + JsonTransformer, + type ParsedDid, +} from '@credo-ts/core' +import { HederaLedgerService } from '../ledger' + +export class HederaDidResolver implements DidResolver { + public readonly supportedMethods = ['hedera'] + + public readonly allowsCaching = true + + public readonly allowsLocalDidRecord = true + + private readonly _cache: Map = new Map() + + public async resolve(agentContext: AgentContext, did: string, parsed: ParsedDid): Promise { + const didDocumentMetadata = {} + + if (this._cache.has(did)) { + return { + didDocument: this._cache.get(did), + didDocumentMetadata, + didResolutionMetadata: { + contentType: 'application/did+json', + }, + } + } + + const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) + try { + const didDoc = await ledgerService.getHederaAnonCredsSdk().resolveDid(did) + + const didJson = didDoc.toJsonTree() + + const updatedContextDidJson = { + ...didJson, + '@context': ['https://www.w3.org/ns/did/v1', 'https://w3id.org/security/suites/ed25519-2018/v1'], + } + + const didDocument = JsonTransformer.fromJSON(updatedContextDidJson, DidDocument) + + this._cache.set(did, didDocument) + + return { + didDocument, + didDocumentMetadata, + didResolutionMetadata: { + contentType: 'application/did+json', + }, + } + } catch (error) { + return { + didDocument: null, + didDocumentMetadata, + didResolutionMetadata: { + error: 'notFound', + message: `resolver_error: Unable to resolve did '${did}': ${error}`, + }, + } + } + } +} diff --git a/packages/hedera/src/dids/index.ts b/packages/hedera/src/dids/index.ts new file mode 100644 index 0000000000..960467c6ea --- /dev/null +++ b/packages/hedera/src/dids/index.ts @@ -0,0 +1,2 @@ +export { HederaDidRegistrar } from './HederaDidRegistrar' +export { HederaDidResolver } from './HederaDidResolver' diff --git a/packages/hedera/src/index.ts b/packages/hedera/src/index.ts new file mode 100644 index 0000000000..06098167ff --- /dev/null +++ b/packages/hedera/src/index.ts @@ -0,0 +1,8 @@ +// Dids +export * from './dids' + +// AnonCreds +export * from './anoncreds' +export * from './ledger' +export * from './HederaModule' +export * from './HederaModuleConfig' diff --git a/packages/hedera/src/ledger/HederaLedgerService.ts b/packages/hedera/src/ledger/HederaLedgerService.ts new file mode 100644 index 0000000000..bc851422f2 --- /dev/null +++ b/packages/hedera/src/ledger/HederaLedgerService.ts @@ -0,0 +1,18 @@ +import { type AgentContext, injectable } from '@credo-ts/core' +import { HederaAnoncredsRegistry } from '@hiero-did-sdk-js/anoncreds' +import { HederaModuleConfig } from '../.' +import { HederaLedgerServiceCache } from './HederaLedgerServiceCache' + +@injectable() +export class HederaLedgerService { + private readonly config: HederaModuleConfig + + public constructor(config: HederaModuleConfig) { + this.config = config + } + + public getHederaAnonCredsSdk(agentContext: AgentContext): HederaAnoncredsRegistry { + const cache = this.config.options.cache ?? new HederaLedgerServiceCache(agentContext) + return new HederaAnoncredsRegistry({ ...this.config.options, cache: cache }) + } +} diff --git a/packages/hedera/src/ledger/HederaLedgerServiceCache.ts b/packages/hedera/src/ledger/HederaLedgerServiceCache.ts new file mode 100644 index 0000000000..2fd6f326c8 --- /dev/null +++ b/packages/hedera/src/ledger/HederaLedgerServiceCache.ts @@ -0,0 +1,42 @@ +import { AgentContext, CacheModuleConfig, CredoError } from '@credo-ts/core' + +export interface CredoCache { + get(agentContext: AgentContext, key: string): Promise + set(agentContext: AgentContext, key: string, value: CacheValue, expiresInSeconds?: number): Promise + remove(agentContext: AgentContext, key: string): Promise +} + +interface SdkCache { + get(key: string): Promise + set(key: string, value: CacheValue, expiresInSeconds?: number): Promise + remove(key: string): Promise +} + +export class HederaLedgerServiceCache implements SdkCache { + private readonly credoCache: CredoCache + + constructor(private readonly agentContext: AgentContext) { + this.credoCache = agentContext.dependencyManager.resolve(CacheModuleConfig).cache + } + + async get(key: string): Promise { + if (!this.credoCache) { + throw new CredoError('Error initializing cache') + } + return await this.credoCache.get(this.agentContext, key) + } + + async set(key: string, value: CacheValue, _expiresInSeconds?: number): Promise { + if (!this.credoCache) { + throw new CredoError('Error initializing cache') + } + await this.credoCache.set(this.agentContext, key, value) + } + + async remove(key: string): Promise { + if (!this.credoCache) { + throw new CredoError('Error initializing cache') + } + await this.credoCache.remove(this.agentContext, key) + } +} diff --git a/packages/hedera/src/ledger/index.ts b/packages/hedera/src/ledger/index.ts new file mode 100644 index 0000000000..20a31b739b --- /dev/null +++ b/packages/hedera/src/ledger/index.ts @@ -0,0 +1 @@ +export { HederaLedgerService } from './HederaLedgerService' diff --git a/packages/hedera/tests/setup.ts b/packages/hedera/tests/setup.ts new file mode 100644 index 0000000000..7f0aeddaa3 --- /dev/null +++ b/packages/hedera/tests/setup.ts @@ -0,0 +1 @@ +jest.setTimeout(60000) diff --git a/packages/hedera/tests/setupHederaModule.ts b/packages/hedera/tests/setupHederaModule.ts new file mode 100644 index 0000000000..92ff809e0c --- /dev/null +++ b/packages/hedera/tests/setupHederaModule.ts @@ -0,0 +1,21 @@ +import { HederaModuleConfigOptions } from '@credo-ts/hedera' +import { HederaModule } from '../src' + +export const getHederaModuleConfig = () => + ({ + networks: [ + { + network: 'testnet', + operatorId: '', + operatorKey: '', + }, + ], + }) satisfies HederaModuleConfigOptions + +export const getHederaModules = () => ({ + hederaSdk: new HederaModule(getHederaModuleConfig()), + // dids: new DidsModule({ + // registrars: [new HederaDidRegistrar()], + // resolvers: [new HederaDidResolver()], + // }), +}) diff --git a/packages/hedera/tsconfig.build.json b/packages/hedera/tsconfig.build.json new file mode 100644 index 0000000000..e7ee40ad18 --- /dev/null +++ b/packages/hedera/tsconfig.build.json @@ -0,0 +1,10 @@ +{ + "extends": "../../tsconfig.build.json", + "compilerOptions": { + "outDir": "./build", + "baseUrl": ".", + "skipDefaultLibCheck": true + }, + "include": ["src/**/*"], + "exclude": ["../core"] +} diff --git a/packages/hedera/tsconfig.json b/packages/hedera/tsconfig.json new file mode 100644 index 0000000000..f274e6f9e1 --- /dev/null +++ b/packages/hedera/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "types": ["node", "jest"], + "moduleResolution": "node", + "resolveJsonModule": true + } +} diff --git a/patches/@2060.io__ffi-napi@4.0.9.patch b/patches/@2060.io__ffi-napi@4.0.9.patch new file mode 100644 index 0000000000..2e3cb8248d --- /dev/null +++ b/patches/@2060.io__ffi-napi@4.0.9.patch @@ -0,0 +1,14 @@ +diff --git a/deps/libffi/libffi.gyp b/deps/libffi/libffi.gyp +index d02bef739c0cfb9c1bbb0a666ab3363fd34c5041..5d49572898681902fca1079b7b25d02f15f7617a 100644 +--- a/deps/libffi/libffi.gyp ++++ b/deps/libffi/libffi.gyp +@@ -74,8 +74,7 @@ + '<(INTERMEDIATE_DIR)/<(RULE_INPUT_ROOT).asm', + ], + 'action': [ +- 'call', +- 'preprocess_asm.cmd', ++ '../../../deps/libffi/preprocess_asm.cmd', + 'include', + 'config/<(OS)/<(target_arch)', + '<(RULE_INPUT_PATH)', From e3e043e858a9becf214a146bdf11db29ed5771ac Mon Sep 17 00:00:00 2001 From: "andrey.kononov" Date: Tue, 10 Jun 2025 23:27:55 +0300 Subject: [PATCH 46/89] Added DID registry Added tests --- babel.config.json | 12 ++ demo/src/BaseAgent.ts | 16 +- jest.config.base.ts | 1 + packages/hedera/jest.config.ts | 13 +- packages/hedera/package.json | 6 +- .../hedera/src/dids/HederaDidRegistrar.ts | 133 +++++------- packages/hedera/src/dids/HederaDidResolver.ts | 46 ++-- .../hedera/src/ledger/HederaLedgerService.ts | 10 +- packages/hedera/src/ledger/index.ts | 1 + .../tests/HederaAnoncredsRegistry.e2e.test.ts | 197 ++++++++++++++++++ packages/hedera/tests/HederaDid.e2e.test.ts | 34 +++ .../hedera/tests/HederaW3cFlow.e2e.test.ts | 192 +++++++++++++++++ packages/hedera/tests/fixtures/fixtures.ts | 182 ++++++++++++++++ packages/hedera/tests/fixtures/index.ts | 1 + packages/hedera/tests/setup.ts | 1 - packages/hedera/tests/setupHederaModule.ts | 21 -- .../tests/utils/InMemoryTailsFileService.ts | 59 ++++++ packages/hedera/tests/utils/hederaModule.ts | 66 ++++++ packages/hedera/tests/utils/index.ts | 3 + packages/hedera/tests/utils/testCache.ts | 28 +++ packages/hedera/tests/utils/utils.ts | 5 + packages/hedera/tsconfig.json | 3 +- 22 files changed, 890 insertions(+), 140 deletions(-) create mode 100644 babel.config.json create mode 100644 packages/hedera/tests/HederaAnoncredsRegistry.e2e.test.ts create mode 100644 packages/hedera/tests/HederaDid.e2e.test.ts create mode 100644 packages/hedera/tests/HederaW3cFlow.e2e.test.ts create mode 100644 packages/hedera/tests/fixtures/fixtures.ts create mode 100644 packages/hedera/tests/fixtures/index.ts delete mode 100644 packages/hedera/tests/setup.ts delete mode 100644 packages/hedera/tests/setupHederaModule.ts create mode 100644 packages/hedera/tests/utils/InMemoryTailsFileService.ts create mode 100644 packages/hedera/tests/utils/hederaModule.ts create mode 100644 packages/hedera/tests/utils/index.ts create mode 100644 packages/hedera/tests/utils/testCache.ts create mode 100644 packages/hedera/tests/utils/utils.ts diff --git a/babel.config.json b/babel.config.json new file mode 100644 index 0000000000..72009cef1f --- /dev/null +++ b/babel.config.json @@ -0,0 +1,12 @@ +{ + "presets": [ + [ + "@babel/preset-env", + { + "targets": { + "node": "current" + } + } + ] + ] +} diff --git a/demo/src/BaseAgent.ts b/demo/src/BaseAgent.ts index 0f19b2fadd..417c8e53f6 100644 --- a/demo/src/BaseAgent.ts +++ b/demo/src/BaseAgent.ts @@ -38,6 +38,7 @@ import { indyVdr } from '@hyperledger/indy-vdr-nodejs' import { askar } from '@openwallet-foundation/askar-nodejs' import { AskarModuleConfigStoreOptions } from '@credo-ts/askar' +import { HederaAnonCredsRegistry, HederaDidRegistrar, HederaDidResolver, HederaModule } from '@credo-ts/hedera' import { greenText } from './OutputClass' const bcovrin = `{"reqSignature":{},"txn":{"data":{"data":{"alias":"Node1","blskey":"4N8aUNHSgjQVgkpm8nhNEfDf6txHznoYREg9kirmJrkivgL4oSEimFF6nsQ6M41QvhM2Z33nves5vfSn9n1UwNFJBYtWVnHYMATn76vLuL3zU88KyeAYcHfsih3He6UHcXDxcaecHVz6jhCYz1P2UZn2bDVruL5wXpehgBfBaLKm3Ba","blskey_pop":"RahHYiCvoNCtPTrVtP7nMC5eTYrsUA8WjXbdhNc8debh1agE9bGiJxWBXYNFbnJXoXhWFMvyqhqhRoq737YQemH5ik9oL7R4NTTCz2LEZhkgLJzB3QRQqJyBNyv7acbdHrAT8nQ9UkLbaVL9NBpnWXBTw4LEMePaSHEw66RzPNdAX1","client_ip":"138.197.138.255","client_port":9702,"node_ip":"138.197.138.255","node_port":9701,"services":["VALIDATOR"]},"dest":"Gw6pDLhcBcoQesN72qfotTgFa7cbuqZpkX3Xo6pLhPhv"},"metadata":{"from":"Th7MpTaRZVRYnPiabds81Y"},"type":"0"},"txnMetadata":{"seqNo":1,"txnId":"fea82e10e894419fe2bea7d96296a6d46f50f93f9eeda954ec461b2ed2950b62"},"ver":"1"} @@ -121,7 +122,7 @@ function getAskarAnonCredsIndyModules( ], }), anoncreds: new AnonCredsModule({ - registries: [new IndyVdrAnonCredsRegistry(), new CheqdAnonCredsRegistry()], + registries: [new IndyVdrAnonCredsRegistry(), new CheqdAnonCredsRegistry(), new HederaAnonCredsRegistry()], anoncreds, }), indyVdr: new IndyVdrModule({ @@ -140,12 +141,21 @@ function getAskarAnonCredsIndyModules( }) ), dids: new DidsModule({ - resolvers: [new IndyVdrIndyDidResolver(), new CheqdDidResolver()], - registrars: [new CheqdDidRegistrar()], + resolvers: [new IndyVdrIndyDidResolver(), new CheqdDidResolver(), new HederaDidResolver()], + registrars: [new CheqdDidRegistrar(), new HederaDidRegistrar()], }), askar: new AskarModule({ askar, store: askarStoreConfig, }), + hedera: new HederaModule({ + networks: [ + { + network: 'testnet', + operatorId: process.env.HEDERA_TEST_OPERATOR_ID ?? '', + operatorKey: process.env.HEDERA_TEST_OPERATOR_KEY ?? '', + }, + ], + }), } as const } diff --git a/jest.config.base.ts b/jest.config.base.ts index 43b6b40302..d339bf9769 100644 --- a/jest.config.base.ts +++ b/jest.config.base.ts @@ -16,6 +16,7 @@ const config: Config.InitialOptions = { isolatedModules: true, }, ], + '^.+\\.[t|j]sx?$': 'babel-jest', }, } diff --git a/packages/hedera/jest.config.ts b/packages/hedera/jest.config.ts index 93c0197296..4926b00d2f 100644 --- a/packages/hedera/jest.config.ts +++ b/packages/hedera/jest.config.ts @@ -6,8 +6,19 @@ import packageJson from './package.json' const config: Config.InitialOptions = { ...base, + testTimeout: 1200000, displayName: packageJson.name, - setupFilesAfterEnv: ['./tests/setup.ts'], + transform: { + '^.+\\.ts$': 'ts-jest', + '^.+\\.(t|j)s?$': 'babel-jest', + }, + transformIgnorePatterns: ['../../node_modules/.pnpm/(?!(cbor2)/)'], + extensionsToTreatAsEsm: ['.ts'], + moduleFileExtensions: ['ts', 'js', 'json', 'node'], + globals: { + Uint8Array: Uint8Array, + ArrayBuffer: ArrayBuffer, + } } export default config diff --git a/packages/hedera/package.json b/packages/hedera/package.json index f6ef239f46..b5dc0023c0 100644 --- a/packages/hedera/package.json +++ b/packages/hedera/package.json @@ -25,10 +25,10 @@ "@credo-ts/anoncreds": "workspace:*", "@credo-ts/core": "workspace:*", "@hiero-did-sdk-js/anoncreds": "npm:@hiero-did-sdk-js/anoncreds@0.0.1", - "@swiss-digital-assets-institute/registrar": "0.3.0" + "@hiero-did-sdk-js/did": "npm:@hiero-did-sdk-js/did@0.0.1" }, "devDependencies": { - "rimraf": "^4.0.7", - "typescript": "~5.5.2" + "@credo-ts/node": "workspace:*", + "@hyperledger/anoncreds-nodejs": "^0.3.1" } } diff --git a/packages/hedera/src/dids/HederaDidRegistrar.ts b/packages/hedera/src/dids/HederaDidRegistrar.ts index 51897b5fd9..1b8dce017e 100644 --- a/packages/hedera/src/dids/HederaDidRegistrar.ts +++ b/packages/hedera/src/dids/HederaDidRegistrar.ts @@ -1,104 +1,83 @@ -import type { +import { AgentContext, DidCreateOptions, DidCreateResult, DidDeactivateOptions, DidDeactivateResult, - DidRegistrar, - DidUpdateOptions, - DidUpdateResult, -} from '@credo-ts/core' -import { DidDocument, DidDocumentRole, + DidDocumentService, DidRecord, + DidRegistrar, DidRepository, - JsonTransformer, - TypedArrayEncoder, + DidUpdateOptions, + DidUpdateResult, } from '@credo-ts/core' import { HederaLedgerService } from '../ledger' -import {createDID} from "@swiss-digital-assets-institute/registrar"; export class HederaDidRegistrar implements DidRegistrar { public readonly supportedMethods = ['hedera'] - public async create(agentContext: AgentContext, options: HederaDidCreateOptions): Promise { - const didRepository = agentContext.dependencyManager.resolve(DidRepository) - const hederaLedgerService = agentContext.dependencyManager.resolve(HederaLedgerService) - + async create(agentContext: AgentContext, _options: DidCreateOptions): Promise { try { - const { did, didDocument } = await createDID({ - client, - }); - - console.log(`DID: ${did}`); - console.log(`DID Document: ${JSON.stringify(didDocument, null, 2)}`); - } catch (error) { - console.error("Error creating DID:", error); - } + const didRepository = agentContext.dependencyManager.resolve(DidRepository) + const hederaLedgerService = agentContext.dependencyManager.resolve(HederaLedgerService) + const sdk = hederaLedgerService.getHederaDidSdk(agentContext) + const { did, didDocument } = await sdk.createDid({}) + // Save the did so we know we created it and can issue with it + const credoDidDocument = new DidDocument({ + ...didDocument, + service: didDocument.service?.map((s) => new DidDocumentService(s)), + }) + await didRepository.save( + agentContext, + new DidRecord({ + did, + role: DidDocumentRole.Created, + didDocument: credoDidDocument, + }) + ) - // let didDocument: DidDocument - // - // try { - // const seedBuffer = TypedArrayEncoder.fromString(options.secret.seed) - // - // await agentContext.wallet.createKey({ keyType: KeyType.Ed25519, privateKey: seedBuffer }) - // - // const hederaDid = await hederaLedgerService.registerHcsDid(Buffer.from(seedBuffer)) - // - // const did = await hederaDid.resolve() - // - // didDocument = JsonTransformer.fromJSON(did.toJsonTree(), DidDocument) - // - // // Save the did so we know we created it and can issue with it - // const didRecord = new DidRecord({ - // did: did.getId(), - // role: DidDocumentRole.Created, - // didDocument, - // }) - // await didRepository.save(agentContext, didRecord) - // - // return { - // didDocumentMetadata: {}, - // didRegistrationMetadata: {}, - // didState: { - // state: 'finished', - // did: didDocument.id, - // didDocument, - // secret: options.secret, - // }, - // } - // } catch (error) { - // agentContext.config.logger.error(`Error registering DID : ${error}`) - // return { - // didDocumentMetadata: {}, - // didRegistrationMetadata: {}, - // didState: { - // state: 'failed', - // reason: `unknownError: ${error}`, - // }, - // } - // } + return { + didDocumentMetadata: {}, + didRegistrationMetadata: {}, + didState: { + state: 'finished', + did, + didDocument: credoDidDocument, + }, + } + } catch (error) { + agentContext.config.logger.error(`Error registering DID : ${error}`) + return { + didDocumentMetadata: {}, + didRegistrationMetadata: {}, + didState: { + state: 'failed', + reason: `Unable to register Did: ${error.message}`, + }, + } + } } - public async update(agentContext: AgentContext, options: DidUpdateOptions): Promise { + update(_agentContext: AgentContext, _options: DidUpdateOptions): Promise { throw new Error('Method not implemented.') } - public async deactivate(agentContext: AgentContext, options: DidDeactivateOptions): Promise { + deactivate(_agentContext: AgentContext, _options: DidDeactivateOptions): Promise { throw new Error('Method not implemented.') } } - -export type SeedString = string - -export interface HederaDidCreateOptions extends DidCreateOptions { - method: 'hedera' - did?: never - secret: { - network: HederaNetwork - seed: string - } -} +// +// export type SeedString = string +// +// export interface HederaDidCreateOptions extends DidCreateOptions { +// method: 'hedera' +// did?: never +// secret: { +// network: HederaNetwork +// seed: string +// } +// } diff --git a/packages/hedera/src/dids/HederaDidResolver.ts b/packages/hedera/src/dids/HederaDidResolver.ts index 0a76a33844..5fe2100cb6 100644 --- a/packages/hedera/src/dids/HederaDidResolver.ts +++ b/packages/hedera/src/dids/HederaDidResolver.ts @@ -1,6 +1,7 @@ import { type AgentContext, DidDocument, + type DidResolutionOptions, type DidResolutionResult, type DidResolver, JsonTransformer, @@ -10,44 +11,31 @@ import { HederaLedgerService } from '../ledger' export class HederaDidResolver implements DidResolver { public readonly supportedMethods = ['hedera'] - - public readonly allowsCaching = true - - public readonly allowsLocalDidRecord = true - - private readonly _cache: Map = new Map() - - public async resolve(agentContext: AgentContext, did: string, parsed: ParsedDid): Promise { - const didDocumentMetadata = {} - - if (this._cache.has(did)) { - return { - didDocument: this._cache.get(did), - didDocumentMetadata, - didResolutionMetadata: { - contentType: 'application/did+json', - }, - } - } - - const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) + public readonly allowsCaching: boolean = true + public readonly allowsLocalDidRecord?: boolean | undefined = true + + async resolve( + agentContext: AgentContext, + did: string, + _parsed: ParsedDid, + _didResolutionOptions: DidResolutionOptions + ): Promise { try { - const didDoc = await ledgerService.getHederaAnonCredsSdk().resolveDid(did) + const hederaLedgerService = agentContext.dependencyManager.resolve(HederaLedgerService) + const sdk = hederaLedgerService.getHederaDidSdk(agentContext) - const didJson = didDoc.toJsonTree() + const resolveDidResult = await sdk.resolveDid(did, 'did+json') const updatedContextDidJson = { - ...didJson, + ...resolveDidResult, '@context': ['https://www.w3.org/ns/did/v1', 'https://w3id.org/security/suites/ed25519-2018/v1'], } const didDocument = JsonTransformer.fromJSON(updatedContextDidJson, DidDocument) - this._cache.set(did, didDocument) - return { didDocument, - didDocumentMetadata, + didDocumentMetadata: {}, didResolutionMetadata: { contentType: 'application/did+json', }, @@ -55,10 +43,10 @@ export class HederaDidResolver implements DidResolver { } catch (error) { return { didDocument: null, - didDocumentMetadata, + didDocumentMetadata: {}, didResolutionMetadata: { error: 'notFound', - message: `resolver_error: Unable to resolve did '${did}': ${error}`, + message: `Unable to resolve did '${did}': ${error}`, }, } } diff --git a/packages/hedera/src/ledger/HederaLedgerService.ts b/packages/hedera/src/ledger/HederaLedgerService.ts index bc851422f2..d0fd7ad6e6 100644 --- a/packages/hedera/src/ledger/HederaLedgerService.ts +++ b/packages/hedera/src/ledger/HederaLedgerService.ts @@ -1,7 +1,7 @@ import { type AgentContext, injectable } from '@credo-ts/core' import { HederaAnoncredsRegistry } from '@hiero-did-sdk-js/anoncreds' -import { HederaModuleConfig } from '../.' -import { HederaLedgerServiceCache } from './HederaLedgerServiceCache' +import { HederaDidService } from '@hiero-did-sdk-js/did' +import { HederaLedgerServiceCache, HederaModuleConfig } from '../.' @injectable() export class HederaLedgerService { @@ -13,6 +13,10 @@ export class HederaLedgerService { public getHederaAnonCredsSdk(agentContext: AgentContext): HederaAnoncredsRegistry { const cache = this.config.options.cache ?? new HederaLedgerServiceCache(agentContext) - return new HederaAnoncredsRegistry({ ...this.config.options, cache: cache }) + return new HederaAnoncredsRegistry({ ...this.config.options, cache }) + } + + public getHederaDidSdk(_agentContext: AgentContext): HederaDidService { + return new HederaDidService({ ...this.config.options }) } } diff --git a/packages/hedera/src/ledger/index.ts b/packages/hedera/src/ledger/index.ts index 20a31b739b..77cb4eedf3 100644 --- a/packages/hedera/src/ledger/index.ts +++ b/packages/hedera/src/ledger/index.ts @@ -1 +1,2 @@ export { HederaLedgerService } from './HederaLedgerService' +export { HederaLedgerServiceCache } from './HederaLedgerServiceCache' diff --git a/packages/hedera/tests/HederaAnoncredsRegistry.e2e.test.ts b/packages/hedera/tests/HederaAnoncredsRegistry.e2e.test.ts new file mode 100644 index 0000000000..6dd33b1026 --- /dev/null +++ b/packages/hedera/tests/HederaAnoncredsRegistry.e2e.test.ts @@ -0,0 +1,197 @@ +import { Agent, ConsoleLogger, LogLevel, utils } from '@credo-ts/core' +import { getHederaAgent, waitTimeout } from './utils' +import { testCache } from './utils/testCache' + +const seed = '11011000010000111011001100010100' +const consensusTimeout = 5000 + +describe('Hedera AnonCreds support', () => { + let agent: Agent + let did: string + + const logger = new ConsoleLogger(LogLevel.error) + const cache = new testCache() + + beforeAll(async () => { + // Initialize the agent + agent = getHederaAgent({ + label: 'alice', + logger, + cache, + }) + await agent.initialize() + + // Making the test did + const didRegistrarResult = await agent.dids.create({ + method: 'hedera', + secret: { + seed, + }, + }) + if (!didRegistrarResult.didState?.didDocument?.id) throw new Error('DidRegistrarError') + + did = didRegistrarResult.didState.didDocument.id + logger.debug('DID', [did]) + }) + + beforeEach(() => { + cache.clear() + }) + + afterAll(async () => { + // Wait for messages to flush out + await new Promise((r) => setTimeout(r, 1000)) + + if (agent) { + await agent.shutdown() + } + }) + + describe('Hedera Anoncreds Registry', () => { + it('Full flow (register and resolve schema, credential definition, revocation registry definition, revocation status list)', async () => { + // Create the schema + const schemaResult = await agent.modules.anoncreds.registerSchema({ + schema: { + name: utils.uuid(), + version: '1', + issuerId: did, + attrNames: ['field1'], + }, + options: {}, + }) + logger.debug('RegisterSchema', [schemaResult]) + + const schemaId = schemaResult?.schemaState?.schemaId + expect(schemaId).toBeDefined() + + await waitTimeout(consensusTimeout) + + // Register credential definition for the schema + const credDefResult = await agent.modules.anoncreds.registerCredentialDefinition({ + credentialDefinition: { + tag: 'default', + issuerId: did, + schemaId: schemaId!, + }, + options: { + supportRevocation: true, + }, + }) + + logger.debug('credDefResult', [credDefResult]) + expect(credDefResult?.credentialDefinitionState?.state).toEqual('finished') + + const credentialDefinitionId = credDefResult.credentialDefinitionState.credentialDefinitionId ?? '' + + await waitTimeout(consensusTimeout) + + // Register revocation registry definition + const revRegDefRegResult = await agent.modules.anoncreds.registerRevocationRegistryDefinition({ + revocationRegistryDefinition: { + issuerId: did, + credentialDefinitionId, + maximumCredentialNumber: 10, + tag: 'default', + }, + options: {}, + }) + logger.debug('revRegDefRegResult', [revRegDefRegResult]) + const revocationRegistryDefinitionId = + revRegDefRegResult?.revocationRegistryDefinitionState?.revocationRegistryDefinitionId ?? '' + expect(revocationRegistryDefinitionId).toBeDefined() + + await waitTimeout(consensusTimeout) + + const resolvedRevRegDef = + await agent.modules.anoncreds.getRevocationRegistryDefinition(revocationRegistryDefinitionId) + expect(resolvedRevRegDef.revocationRegistryDefinitionId).toEqual(revocationRegistryDefinitionId) + + // Register the init revocation status list + const registerRevocationStatusListResponse = await agent.modules.anoncreds.registerRevocationStatusList({ + options: {}, + revocationStatusList: { + issuerId: did, + revocationRegistryDefinitionId, + }, + }) + logger.debug('registerRevocationStatusListResponse', [registerRevocationStatusListResponse]) + const revocationStatusList = registerRevocationStatusListResponse?.revocationStatusListState.revocationStatusList + expect(revocationStatusList).toBeDefined() + + await waitTimeout(consensusTimeout) + + // Resolve the revocation status list + const revocationStatusListResponse = await agent.modules.anoncreds.getRevocationStatusList( + revocationRegistryDefinitionId, + Date.now() + ) + logger.debug('revocationStatusListResponse', [revocationStatusListResponse]) + + expect(revocationStatusListResponse?.revocationStatusList?.revRegDefId).toEqual(revocationRegistryDefinitionId) + expect(revocationStatusListResponse?.revocationStatusList?.issuerId).toEqual(did) + expect(revocationStatusListResponse?.revocationStatusList?.revocationList).toEqual([0, 0, 0, 0, 0, 0, 0, 0, 0, 0]) + + await waitTimeout(consensusTimeout) + + // Update revocation status list - Revoke indexes + const revokeUpdateRevocationStatusListResponse = await agent.modules.anoncreds.updateRevocationStatusList({ + options: {}, + revocationStatusList: { + revocationRegistryDefinitionId: revocationRegistryDefinitionId, + issuedCredentialIndexes: undefined, + revokedCredentialIndexes: [1, 3, 5, 9], + }, + }) + logger.debug('revokeUpdateRevocationStatusListResponse', [revokeUpdateRevocationStatusListResponse]) + const revokeRevocationStatusList = + revokeUpdateRevocationStatusListResponse?.revocationStatusListState.revocationStatusList + expect(revokeRevocationStatusList).toBeDefined() + + await waitTimeout(consensusTimeout) + + // Resolve the revocation status list + const revokeRevocationStatusListResponse = await agent.modules.anoncreds.getRevocationStatusList( + revocationRegistryDefinitionId, + Date.now() + ) + logger.debug('revokeRevocationStatusListResponse', [revokeRevocationStatusListResponse]) + expect(revokeRevocationStatusListResponse?.revocationStatusList?.revRegDefId).toEqual( + revocationRegistryDefinitionId + ) + expect(revokeRevocationStatusListResponse?.revocationStatusList?.issuerId).toEqual(did) + expect(revokeRevocationStatusListResponse?.revocationStatusList?.revocationList).toEqual([ + 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, + ]) + + // Update revocation status list - Revoke/Issue indexes + const issueUpdateRevocationStatusListResponse = await agent.modules.anoncreds.updateRevocationStatusList({ + options: {}, + revocationStatusList: { + revocationRegistryDefinitionId: revocationRegistryDefinitionId, + issuedCredentialIndexes: [3, 5], + revokedCredentialIndexes: [4], + }, + }) + logger.debug('issueUpdateRevocationStatusListResponse', [issueUpdateRevocationStatusListResponse]) + const issueRevocationStatusList = + issueUpdateRevocationStatusListResponse?.revocationStatusListState.revocationStatusList + expect(issueRevocationStatusList).toBeDefined() + + await waitTimeout(consensusTimeout) + + // Resolve the revocation status list + const issueRevocationStatusListResponse = await agent.modules.anoncreds.getRevocationStatusList( + revocationRegistryDefinitionId, + Date.now() + ) + logger.debug('issueRevocationStatusListResponse', [issueRevocationStatusListResponse]) + expect(issueRevocationStatusListResponse?.revocationStatusList?.revRegDefId).toEqual( + revocationRegistryDefinitionId + ) + expect(issueRevocationStatusListResponse?.revocationStatusList?.issuerId).toEqual(did) + expect(issueRevocationStatusListResponse?.revocationStatusList?.revocationList).toEqual([ + 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, + ]) + }) + }) +}) diff --git a/packages/hedera/tests/HederaDid.e2e.test.ts b/packages/hedera/tests/HederaDid.e2e.test.ts new file mode 100644 index 0000000000..c57b737f5d --- /dev/null +++ b/packages/hedera/tests/HederaDid.e2e.test.ts @@ -0,0 +1,34 @@ +import { Agent, ConsoleLogger, LogLevel } from '@credo-ts/core' +import { getHederaAgent, waitTimeout } from './utils' + +const logger = new ConsoleLogger(LogLevel.error) + +const did = 'did:hedera:testnet:zGdjMu1hPkjbJXSPPp6RgTptnpYYM9uEkPeNbPhSkXTon_0.0.5139753' + +describe('Hedera Module did resolver', () => { + let aliceAgent: Agent + + beforeAll(async () => { + const aliceAgent = getHederaAgent({ + logger, + label: 'alice', + }) + await aliceAgent.initialize() + }) + + afterAll(async () => { + // Wait for messages to flush out + await waitTimeout(1000) + + if (aliceAgent) { + await aliceAgent.shutdown() + } + }) + + describe('HederaDidResolver', () => { + it('should resolve a hedera did when valid did is passed', async () => { + const resolvedDIDDoc = await aliceAgent.dids.resolve(did) + expect(resolvedDIDDoc).toBeDefined() + }) + }) +}) diff --git a/packages/hedera/tests/HederaW3cFlow.e2e.test.ts b/packages/hedera/tests/HederaW3cFlow.e2e.test.ts new file mode 100644 index 0000000000..811d7ce713 --- /dev/null +++ b/packages/hedera/tests/HederaW3cFlow.e2e.test.ts @@ -0,0 +1,192 @@ +import { Agent } from '@credo-ts/core' + +import { + ClaimFormat, + ConsoleLogger, + CredentialIssuancePurpose, + CredoError, + JsonTransformer, + LogLevel, + W3cCredential, + W3cJsonLdVerifiableCredential, + W3cJsonLdVerifiablePresentation, + W3cPresentation, + vcLibraries, +} from '@credo-ts/core' + +import { LinkedDataProof } from '@credo-ts/core/build/modules/vc/data-integrity/models/LinkedDataProof' +import { W3C_FIXTURES } from './fixtures' +import { getHederaAgent, waitTimeout } from './utils' + +const { jsonldSignatures } = vcLibraries +const { purposes } = jsonldSignatures + +const logger = new ConsoleLogger(LogLevel.error) + +// const did = 'did:hedera:testnet:zQDui45JN8tAZyc8aNcgcDp26wPJgVyQnw1wupqaqexKGWgsuMVfgzKmGfyg8fWPt_0.0.5139447' +const did = 'did:hedera:testnet:zGdjMu1hPkjbJXSPPp6RgTptnpYYM9uEkPeNbPhSkXTon_0.0.5139753' +// const seed = '11011000010000111011001100010100' +// const holderSeed = '00000000000000000000000000holder' + +describe('Hedera Module did resolver', () => { + let aliceAgent: Agent + let faberAgent: Agent + + beforeAll(async () => { + // Initialize alice + aliceAgent = getHederaAgent({ + logger, + label: 'alice', + }) + await aliceAgent.initialize() + + // Initialize faber + faberAgent = getHederaAgent({ + logger, + label: 'faber', + }) + await faberAgent.initialize() + }) + + afterAll(async () => { + // Wait for messages to flush out + await waitTimeout(1000) + + if (aliceAgent) { + await aliceAgent.shutdown() + } + + if (faberAgent) { + await faberAgent.shutdown() + } + }) + + describe('W3C Issuance and Verification', () => { + let issuerDid: string + let verificationMethod: string + + beforeAll(async () => { + //const seedBuffer = TypedArrayEncoder.fromString(seed) + //await faberAgent.wallet.createKey({ keyType: KeyType.Ed25519, seed: seedBuffer }) + + const _didDoc = await faberAgent.dids.resolve(did) + + issuerDid = did + verificationMethod = `${issuerDid}#key-1` + + // create did:key for holder + await aliceAgent.dids.create({ + method: 'key', + // options: { + // keyType: KeyType.Ed25519, + // }, + //seed: TypedArrayEncoder.fromString(holderSeed), + }) + }) + + describe('signCredential', () => { + it('should return a successfully signed credential', async () => { + const credentialJson = W3C_FIXTURES.TEST_LD_DOCUMENT + credentialJson.issuer = issuerDid + + const credential = JsonTransformer.fromJSON(credentialJson, W3cCredential) + + const vc = await faberAgent.w3cCredentials.signCredential({ + format: ClaimFormat.LdpVc, + credential, + proofType: 'Ed25519Signature2018', + verificationMethod, + }) + + expect(vc).toBeInstanceOf(W3cJsonLdVerifiableCredential) + expect(vc.issuer).toEqual(issuerDid) + expect(Array.isArray(vc.proof)).toBe(false) + expect(vc.proof).toBeInstanceOf(LinkedDataProof) + + vc.proof = vc.proof as LinkedDataProof + expect(vc.proof.verificationMethod).toEqual(verificationMethod) + }) + + it('should throw because of verificationMethod does not belong to this wallet', async () => { + const credentialJson = W3C_FIXTURES.TEST_LD_DOCUMENT + credentialJson.issuer = issuerDid + + const credential = JsonTransformer.fromJSON(credentialJson, W3cCredential) + + expect(async () => { + await faberAgent.w3cCredentials.signCredential({ + format: ClaimFormat.LdpVc, + credential, + proofType: 'Ed25519Signature2018', + verificationMethod: + 'did:hedera:testnet:zGdjMu1hPkjbJXSPPp6RgTptnpYYM9uEkPeNbPhSkXTon_0.0.5139619#did-root-key', + }) + }).rejects.toThrow(CredoError) + }) + }) + + describe('verifyCredential', () => { + it('should verify the credential successfully', async () => { + const result = await aliceAgent.w3cCredentials.verifyCredential({ + credential: JsonTransformer.fromJSON(W3C_FIXTURES.TEST_LD_DOCUMENT_SIGNED, W3cJsonLdVerifiableCredential), + proofPurpose: new purposes.AssertionProofPurpose(), + }) + + expect(result.isValid).toEqual(true) + }) + + it('should fail because of invalid signature', async () => { + const vc = JsonTransformer.fromJSON(W3C_FIXTURES.TEST_LD_DOCUMENT_BAD_SIGNED, W3cJsonLdVerifiableCredential) + const result = await aliceAgent.w3cCredentials.verifyCredential({ credential: vc }) + + expect(result).toEqual({ + isValid: false, + error: expect.any(Error), + validations: { + vcJs: { + error: expect.any(Error), + isValid: false, + results: expect.any(Array), + }, + }, + }) + }) + }) + + describe('signPresentation', () => { + it('should successfully create a presentation from single verifiable credential', async () => { + const presentation = JsonTransformer.fromJSON(W3C_FIXTURES.TEST_VP_DOCUMENT, W3cPresentation) + + const purpose = new CredentialIssuancePurpose({ + controller: { + id: verificationMethod, + }, + date: new Date().toISOString(), + }) + + const verifiablePresentation = await faberAgent.w3cCredentials.signPresentation({ + format: ClaimFormat.LdpVp, + presentation: presentation, + proofPurpose: purpose, + proofType: 'Ed25519Signature2018', + challenge: '7bf32d0b-39d4-41f3-96b6-45de52988e4c', + domain: 'issuer.example.com', + verificationMethod: verificationMethod, + }) + + expect(verifiablePresentation).toBeInstanceOf(W3cJsonLdVerifiablePresentation) + }) + }) + + describe('verifyPresentation', () => { + it('should successfully verify a presentation containing a single verifiable credential', async () => { + const vp = JsonTransformer.fromJSON(W3C_FIXTURES.TEST_VP_DOCUMENT_SIGNED, W3cJsonLdVerifiablePresentation) + const result = await faberAgent.w3cCredentials.verifyPresentation({ + presentation: vp, + challenge: '7bf32d0b-39d4-41f3-96b6-45de52988e4c', + }) + expect(result.isValid).toBe(true) + }) + }) + }) +}) diff --git a/packages/hedera/tests/fixtures/fixtures.ts b/packages/hedera/tests/fixtures/fixtures.ts new file mode 100644 index 0000000000..01b9c18764 --- /dev/null +++ b/packages/hedera/tests/fixtures/fixtures.ts @@ -0,0 +1,182 @@ +import { CREDENTIALS_CONTEXT_V1_URL } from '@credo-ts/core' + +export const HOLDER_DID = 'did:key:z6MkiAUh4Fh23QAqv8w8YNCFq3QSTnHV8gQSiABV5Mj9mj2m' + +export const W3C_FIXTURES = { + TEST_LD_DOCUMENT: { + '@context': [CREDENTIALS_CONTEXT_V1_URL, 'https://w3id.org/citizenship/v1'], + id: 'https://issuer.oidp.uscis.gov/credentials/83627465', + type: ['VerifiableCredential', 'PermanentResidentCard'], + issuer: '', + identifier: '83627465', + name: 'Permanent Resident Card', + description: 'Government of Example Permanent Resident Card.', + issuanceDate: '2019-12-03T12:19:52Z', + expirationDate: '2029-12-03T12:19:52Z', + credentialSubject: { + id: HOLDER_DID, + type: ['PermanentResident', 'Person'], + givenName: 'JOHN', + familyName: 'SMITH', + gender: 'Male', + image: 'data:image/png;base64,iVBORw0KGgokJggg==', + residentSince: '2015-01-01', + lprCategory: 'C09', + lprNumber: '999-999-999', + commuterClassification: 'C1', + birthCountry: 'Bahamas', + birthDate: '1958-07-17', + }, + }, + + TEST_LD_DOCUMENT_SIGNED: { + '@context': ['https://www.w3.org/2018/credentials/v1', 'https://w3id.org/citizenship/v1'], + id: 'https://issuer.oidp.uscis.gov/credentials/83627465', + type: ['VerifiableCredential', 'PermanentResidentCard'], + issuer: 'did:hedera:testnet:zGdjMu1hPkjbJXSPPp6RgTptnpYYM9uEkPeNbPhSkXTon_0.0.5139753', + identifier: '83627465', + name: 'Permanent Resident Card', + description: 'Government of Example Permanent Resident Card.', + issuanceDate: '2019-12-03T12:19:52Z', + expirationDate: '2029-12-03T12:19:52Z', + credentialSubject: { + type: ['PermanentResident', 'Person'], + givenName: 'JOHN', + familyName: 'SMITH', + gender: 'Male', + image: 'data:image/png;base64,iVBORw0KGgokJggg==', + residentSince: '2015-01-01', + lprCategory: 'C09', + lprNumber: '999-999-999', + commuterClassification: 'C1', + birthCountry: 'Bahamas', + birthDate: '1958-07-17', + id: 'did:key:z6MkiAUh4Fh23QAqv8w8YNCFq3QSTnHV8gQSiABV5Mj9mj2m', + }, + proof: { + verificationMethod: 'did:hedera:testnet:zGdjMu1hPkjbJXSPPp6RgTptnpYYM9uEkPeNbPhSkXTon_0.0.5139753#key-1', + type: 'Ed25519Signature2018', + created: '2024-11-17T14:28:27Z', + proofPurpose: 'assertionMethod', + jws: 'eyJhbGciOiJFZERTQSIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY0Il19..Dq-AI4T_H4E3bdwSb4omyetKimTogtXWNV4HtNtLYoHLl0f0ddbF3hv807ssGtck51uMUTISkZ7zkdNdn0hZAA', + }, + }, + TEST_LD_DOCUMENT_BAD_SIGNED: { + '@context': ['https://www.w3.org/2018/credentials/v1', 'https://w3id.org/citizenship/v1'], + id: 'https://issuer.oidp.uscis.gov/credentials/83627465', + type: ['VerifiableCredential', 'PermanentResidentCard'], + issuer: 'did:hedera:testnet:zGdjMu1hPkjbJXSPPp6RgTptnpYYM9uEkPeNbPhSkXTon_0.0.5139619', + identifier: '83627465', + name: 'Permanent Resident Card', + description: 'Government of Example Permanent Resident Card.', + issuanceDate: '2019-12-03T12:19:52Z', + expirationDate: '2029-12-03T12:19:52Z', + credentialSubject: { + type: ['PermanentResident', 'Person'], + givenName: 'JOHN', + familyName: 'SMITH', + gender: 'Male', + image: 'data:image/png;base64,iVBORw0KGgokJggg==', + residentSince: '2015-01-01', + lprCategory: 'C09', + lprNumber: '999-999-999', + commuterClassification: 'C1', + birthCountry: 'Bahamas', + birthDate: '1958-07-17', + id: 'did:key:z6MkiAUh4Fh23QAqv8w8YNCFq3QSTnHV8gQSiABV5Mj9mj2m', + }, + proof: { + verificationMethod: 'did:hedera:testnet:zGdjMu1hPkjbJXSPPp6RgTptnpYYM9uEkPeNbPhSkXTon_0.0.5139619#key-1', + type: 'Ed25519Signature2018', + created: '2024-11-17T13:02:11Z', + proofPurpose: 'assertionMethod', + jws: 'eyJhbGciOiJFZERTQSIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY78Il19..J50c8CreYwZfvF63sKJvdyVGZIh6m8GwORWKgsL34nfRi4AuUVBOpCD_2PhPvk8lgkXmKMfeSu2dHU5s6V--Dg', + }, + }, + + TEST_VP_DOCUMENT: { + '@context': [CREDENTIALS_CONTEXT_V1_URL], + type: ['VerifiablePresentation'], + verifiableCredential: [ + { + '@context': ['https://www.w3.org/2018/credentials/v1', 'https://w3id.org/citizenship/v1'], + id: 'https://issuer.oidp.uscis.gov/credentials/83627465', + type: ['VerifiableCredential', 'PermanentResidentCard'], + issuer: 'did:hedera:testnet:zGdjMu1hPkjbJXSPPp6RgTptnpYYM9uEkPeNbPhSkXTon_0.0.5139619', + identifier: '83627465', + name: 'Permanent Resident Card', + description: 'Government of Example Permanent Resident Card.', + issuanceDate: '2019-12-03T12:19:52Z', + expirationDate: '2029-12-03T12:19:52Z', + credentialSubject: { + type: ['PermanentResident', 'Person'], + givenName: 'JOHN', + familyName: 'SMITH', + gender: 'Male', + image: 'data:image/png;base64,iVBORw0KGgokJggg==', + residentSince: '2015-01-01', + lprCategory: 'C09', + lprNumber: '999-999-999', + commuterClassification: 'C1', + birthCountry: 'Bahamas', + birthDate: '1958-07-17', + id: 'did:key:z6MkiAUh4Fh23QAqv8w8YNCFq3QSTnHV8gQSiABV5Mj9mj2m', + }, + proof: { + verificationMethod: 'did:hedera:testnet:zGdjMu1hPkjbJXSPPp6RgTptnpYYM9uEkPeNbPhSkXTon_0.0.5139619#key-1', + type: 'Ed25519Signature2018', + created: '2024-11-17T13:02:11Z', + proofPurpose: 'assertionMethod', + jws: 'eyJhbGciOiJFZERTQSIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY0Il19..J50c8CreYwZfvF63sKJvdyVGZIh6m8GwORWKgsL34nfRi4AuUVBOpCD_2PhPvk8lgkXmKMfeSu2dHU5s6V--Dg', + }, + }, + ], + }, + TEST_VP_DOCUMENT_SIGNED: { + '@context': ['https://www.w3.org/2018/credentials/v1'], + type: ['VerifiablePresentation'], + verifiableCredential: [ + { + '@context': ['https://www.w3.org/2018/credentials/v1', 'https://w3id.org/citizenship/v1'], + id: 'https://issuer.oidp.uscis.gov/credentials/83627465', + type: ['VerifiableCredential', 'PermanentResidentCard'], + issuer: 'did:hedera:testnet:zGdjMu1hPkjbJXSPPp6RgTptnpYYM9uEkPeNbPhSkXTon_0.0.5139619', + identifier: '83627465', + name: 'Permanent Resident Card', + description: 'Government of Example Permanent Resident Card.', + issuanceDate: '2019-12-03T12:19:52Z', + expirationDate: '2029-12-03T12:19:52Z', + credentialSubject: { + type: ['PermanentResident', 'Person'], + givenName: 'JOHN', + familyName: 'SMITH', + gender: 'Male', + image: 'data:image/png;base64,iVBORw0KGgokJggg==', + residentSince: '2015-01-01', + lprCategory: 'C09', + lprNumber: '999-999-999', + commuterClassification: 'C1', + birthCountry: 'Bahamas', + birthDate: '1958-07-17', + id: 'did:key:z6MkiAUh4Fh23QAqv8w8YNCFq3QSTnHV8gQSiABV5Mj9mj2m', + }, + proof: { + verificationMethod: 'did:hedera:testnet:zGdjMu1hPkjbJXSPPp6RgTptnpYYM9uEkPeNbPhSkXTon_0.0.5139619#key-1', + type: 'Ed25519Signature2018', + created: '2024-11-17T13:02:11Z', + proofPurpose: 'assertionMethod', + jws: 'eyJhbGciOiJFZERTQSIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY0Il19..J50c8CreYwZfvF63sKJvdyVGZIh6m8GwORWKgsL34nfRi4AuUVBOpCD_2PhPvk8lgkXmKMfeSu2dHU5s6V--Dg', + }, + }, + ], + proof: { + verificationMethod: 'did:hedera:testnet:zGdjMu1hPkjbJXSPPp6RgTptnpYYM9uEkPeNbPhSkXTon_0.0.5139753#key-1', + type: 'Ed25519Signature2018', + created: '2024-11-17T14:28:30Z', + proofPurpose: 'authentication', + challenge: '7bf32d0b-39d4-41f3-96b6-45de52988e4c', + domain: 'issuer.example.com', + jws: 'eyJhbGciOiJFZERTQSIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY0Il19..TzXuwFtj4r8HaS-TsRHB7gl-HyGPhnWQJUPqWE1OxyBirPzcVskOiSKdnaNcw95DzSfkTYCHIE1U16P-rSlTCA', + }, + }, +} diff --git a/packages/hedera/tests/fixtures/index.ts b/packages/hedera/tests/fixtures/index.ts new file mode 100644 index 0000000000..272a535796 --- /dev/null +++ b/packages/hedera/tests/fixtures/index.ts @@ -0,0 +1 @@ +export * from './fixtures' diff --git a/packages/hedera/tests/setup.ts b/packages/hedera/tests/setup.ts deleted file mode 100644 index 7f0aeddaa3..0000000000 --- a/packages/hedera/tests/setup.ts +++ /dev/null @@ -1 +0,0 @@ -jest.setTimeout(60000) diff --git a/packages/hedera/tests/setupHederaModule.ts b/packages/hedera/tests/setupHederaModule.ts deleted file mode 100644 index 92ff809e0c..0000000000 --- a/packages/hedera/tests/setupHederaModule.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { HederaModuleConfigOptions } from '@credo-ts/hedera' -import { HederaModule } from '../src' - -export const getHederaModuleConfig = () => - ({ - networks: [ - { - network: 'testnet', - operatorId: '', - operatorKey: '', - }, - ], - }) satisfies HederaModuleConfigOptions - -export const getHederaModules = () => ({ - hederaSdk: new HederaModule(getHederaModuleConfig()), - // dids: new DidsModule({ - // registrars: [new HederaDidRegistrar()], - // resolvers: [new HederaDidResolver()], - // }), -}) diff --git a/packages/hedera/tests/utils/InMemoryTailsFileService.ts b/packages/hedera/tests/utils/InMemoryTailsFileService.ts new file mode 100644 index 0000000000..de7a81b73b --- /dev/null +++ b/packages/hedera/tests/utils/InMemoryTailsFileService.ts @@ -0,0 +1,59 @@ +import type { AnonCredsRevocationRegistryDefinition } from '@credo-ts/anoncreds' +import type { AgentContext, FileSystem } from '@credo-ts/core' + +import { InjectionSymbols } from '@credo-ts/core' + +import { BasicTailsFileService } from '@credo-ts/anoncreds' + +export class InMemoryTailsFileService extends BasicTailsFileService { + private tailsFilePaths: Record = {} + + public async uploadTailsFile( + _agentContext: AgentContext, + options: { + revocationRegistryDefinition: AnonCredsRevocationRegistryDefinition + } + ) { + this.tailsFilePaths[options.revocationRegistryDefinition.value.tailsHash] = + options.revocationRegistryDefinition.value.tailsLocation + + return { tailsFileUrl: options.revocationRegistryDefinition.value.tailsHash } + } + + public async getTailsFile( + agentContext: AgentContext, + options: { + revocationRegistryDefinition: AnonCredsRevocationRegistryDefinition + } + ) { + const { revocationRegistryDefinition } = options + const { tailsLocation, tailsHash } = revocationRegistryDefinition.value + + try { + agentContext.config.logger.debug( + `Checking to see if tails file for URL ${revocationRegistryDefinition.value.tailsLocation} has been stored in the FileSystem` + ) + + // hash is used as file identifier + const tailsExists = await this.tailsFileExists(agentContext, tailsHash) + const tailsFilePath = await this.getTailsFilePath(agentContext, tailsHash) + agentContext.config.logger.debug( + `Tails file for ${tailsLocation} ${tailsExists ? 'is stored' : 'is not stored'} at ${tailsFilePath}` + ) + + if (!tailsExists) { + agentContext.config.logger.debug(`Retrieving tails file from URL ${tailsLocation}`) + const fileSystem = agentContext.dependencyManager.resolve(InjectionSymbols.FileSystem) + await fileSystem.downloadToFile(tailsLocation, tailsFilePath) + agentContext.config.logger.debug(`Saved tails file to FileSystem at path ${tailsFilePath}`) + } + + return { tailsFilePath } + } catch (error) { + agentContext.config.logger.error(`Error while retrieving tails file from URL ${tailsLocation}`, { + error, + }) + throw error + } + } +} diff --git a/packages/hedera/tests/utils/hederaModule.ts b/packages/hedera/tests/utils/hederaModule.ts new file mode 100644 index 0000000000..46e956d469 --- /dev/null +++ b/packages/hedera/tests/utils/hederaModule.ts @@ -0,0 +1,66 @@ +import { AnonCredsModule } from '@credo-ts/anoncreds' +import { AskarModule } from '@credo-ts/askar' +import { Agent, Cache, CacheModule, DidsModule, Logger, utils } from '@credo-ts/core' +import { + HederaAnonCredsRegistry, + HederaDidRegistrar, + HederaDidResolver, + HederaModule, + HederaModuleConfigOptions, +} from '@credo-ts/hedera' +import { agentDependencies } from '@credo-ts/node' +import { anoncreds } from '@hyperledger/anoncreds-nodejs' +import { askar } from '@openwallet-foundation/askar-nodejs' +import { InMemoryTailsFileService } from './InMemoryTailsFileService' + +export const getHederaModuleConfig = (props: { operatorId?: string; operatorKey?: string }) => { + const operatorId = props.operatorId ?? process.env.HEDERA_TEST_OPERATOR_ID ?? '' + const operatorKey = props.operatorKey ?? process.env.HEDERA_TEST_OPERATOR_KEY ?? '' + return { + networks: [ + { + network: 'testnet', + operatorId, + operatorKey, + }, + ], + } satisfies HederaModuleConfigOptions +} + +export const getHederaAgent = (props: { + operatorId?: string + operatorKey?: string + label?: string + logger?: Logger + cache?: Cache +}) => { + const label = props.label ?? utils.uuid() + const logger = props.logger + const cache = props.cache + + let modules = {} + + modules = { + ...modules, + askar: new AskarModule({ askar, store: { id: label, key: label } }), + hedera: new HederaModule(getHederaModuleConfig(props)), + anoncreds: new AnonCredsModule({ + anoncreds, + registries: [new HederaAnonCredsRegistry()], + tailsFileService: new InMemoryTailsFileService(), + }), + dids: new DidsModule({ + resolvers: [new HederaDidResolver()], + registrars: [new HederaDidRegistrar()], + }), + } + if (cache) { + modules = { ...modules, cache: new CacheModule({ cache }) } + } + + return new Agent({ + config: { label, logger }, + dependencies: agentDependencies, + modules, + }) +} diff --git a/packages/hedera/tests/utils/index.ts b/packages/hedera/tests/utils/index.ts new file mode 100644 index 0000000000..1f91d5d2d7 --- /dev/null +++ b/packages/hedera/tests/utils/index.ts @@ -0,0 +1,3 @@ +export * from './hederaModule' +export * from './InMemoryTailsFileService' +export * from './utils' diff --git a/packages/hedera/tests/utils/testCache.ts b/packages/hedera/tests/utils/testCache.ts new file mode 100644 index 0000000000..5df1c9d1b2 --- /dev/null +++ b/packages/hedera/tests/utils/testCache.ts @@ -0,0 +1,28 @@ +import type { AgentContext, Cache } from '@credo-ts/core' + +export class testCache implements Cache { + private _cache: Map = new Map() + + get(_agentContext: AgentContext, key: string): Promise { + return Promise.resolve(this._cache.get(key)) + } + + set( + _agentContext: AgentContext, + key: string, + value: CacheValue, + _expiresInSeconds?: number | undefined + ): Promise { + this._cache.set(key, value) + return Promise.resolve() + } + + async remove(_agentContext: AgentContext, key: string): Promise { + this._cache.delete(key) + return Promise.resolve() + } + + clear() { + this._cache.clear() + } +} diff --git a/packages/hedera/tests/utils/utils.ts b/packages/hedera/tests/utils/utils.ts new file mode 100644 index 0000000000..b967e4382f --- /dev/null +++ b/packages/hedera/tests/utils/utils.ts @@ -0,0 +1,5 @@ +export const getRandomStr = (n: number) => [...Array(n)].map(() => Math.random().toString(36)[2]).join('') + +export const waitTimeout = async (timeout?: number) => { + await new Promise((resolve) => setTimeout(resolve, timeout ?? 5000)) +} diff --git a/packages/hedera/tsconfig.json b/packages/hedera/tsconfig.json index f274e6f9e1..03b41a1553 100644 --- a/packages/hedera/tsconfig.json +++ b/packages/hedera/tsconfig.json @@ -2,7 +2,6 @@ "extends": "../../tsconfig.json", "compilerOptions": { "types": ["node", "jest"], - "moduleResolution": "node", - "resolveJsonModule": true + "moduleResolution": "node" } } From ce2f2293741875a52253ddfa599669a43a9b74a0 Mon Sep 17 00:00:00 2001 From: "andrey.kononov" Date: Wed, 11 Jun 2025 19:24:17 +0300 Subject: [PATCH 47/89] Debug and fix Did registrar/resolver Debug and tests --- babel.config.json | 12 ---------- jest.config.base.ts | 3 +-- .../services/tails/BasicTailsFileService.ts | 2 +- packages/hedera/jest.config.ts | 13 +---------- packages/hedera/package.json | 2 +- packages/hedera/src/HederaModule.ts | 2 +- packages/hedera/src/HederaModuleConfig.ts | 10 +++------ .../src/anoncreds/HederaAnonCredsRegistry.ts | 2 +- .../hedera/src/dids/HederaDidRegistrar.ts | 3 ++- packages/hedera/src/dids/HederaDidResolver.ts | 4 ++-- packages/hedera/src/index.ts | 1 - .../hedera/src/ledger/HederaLedgerService.ts | 15 ++++++------- packages/hedera/src/ledger/index.ts | 2 -- .../tests/HederaAnoncredsRegistry.e2e.test.ts | 2 +- packages/hedera/tests/HederaDid.e2e.test.ts | 22 +++++++++++-------- .../hedera/tests/HederaW3cFlow.e2e.test.ts | 7 +++--- .../tests/utils/InMemoryTailsFileService.ts | 2 +- packages/hedera/tests/utils/hederaModule.ts | 2 +- 18 files changed, 39 insertions(+), 67 deletions(-) delete mode 100644 babel.config.json delete mode 100644 packages/hedera/src/ledger/index.ts diff --git a/babel.config.json b/babel.config.json deleted file mode 100644 index 72009cef1f..0000000000 --- a/babel.config.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "presets": [ - [ - "@babel/preset-env", - { - "targets": { - "node": "current" - } - } - ] - ] -} diff --git a/jest.config.base.ts b/jest.config.base.ts index d339bf9769..79f2467b61 100644 --- a/jest.config.base.ts +++ b/jest.config.base.ts @@ -15,8 +15,7 @@ const config: Config.InitialOptions = { { isolatedModules: true, }, - ], - '^.+\\.[t|j]sx?$': 'babel-jest', + ] }, } diff --git a/packages/anoncreds/src/services/tails/BasicTailsFileService.ts b/packages/anoncreds/src/services/tails/BasicTailsFileService.ts index fe79190761..b76b738ca7 100644 --- a/packages/anoncreds/src/services/tails/BasicTailsFileService.ts +++ b/packages/anoncreds/src/services/tails/BasicTailsFileService.ts @@ -75,7 +75,7 @@ export class BasicTailsFileService implements TailsFileService { } protected async getTailsFilePath(agentContext: AgentContext, tailsHash: string) { - return `${await this.getTailsBasePath(agentContext)}/${tailsHash}` + return `${await this.getTailsBasePath(agentContext)}/${tailsHash}`.replace(/\\/g, '/') } protected async tailsFileExists(agentContext: AgentContext, tailsHash: string): Promise { diff --git a/packages/hedera/jest.config.ts b/packages/hedera/jest.config.ts index 4926b00d2f..b594a3aaf4 100644 --- a/packages/hedera/jest.config.ts +++ b/packages/hedera/jest.config.ts @@ -7,18 +7,7 @@ import packageJson from './package.json' const config: Config.InitialOptions = { ...base, testTimeout: 1200000, - displayName: packageJson.name, - transform: { - '^.+\\.ts$': 'ts-jest', - '^.+\\.(t|j)s?$': 'babel-jest', - }, - transformIgnorePatterns: ['../../node_modules/.pnpm/(?!(cbor2)/)'], - extensionsToTreatAsEsm: ['.ts'], - moduleFileExtensions: ['ts', 'js', 'json', 'node'], - globals: { - Uint8Array: Uint8Array, - ArrayBuffer: ArrayBuffer, - } + displayName: packageJson.name } export default config diff --git a/packages/hedera/package.json b/packages/hedera/package.json index b5dc0023c0..cf641ca229 100644 --- a/packages/hedera/package.json +++ b/packages/hedera/package.json @@ -25,7 +25,7 @@ "@credo-ts/anoncreds": "workspace:*", "@credo-ts/core": "workspace:*", "@hiero-did-sdk-js/anoncreds": "npm:@hiero-did-sdk-js/anoncreds@0.0.1", - "@hiero-did-sdk-js/did": "npm:@hiero-did-sdk-js/did@0.0.1" + "@hiero-did-sdk-js/did": "npm:@hiero-did-sdk-js/did@0.0.3" }, "devDependencies": { "@credo-ts/node": "workspace:*", diff --git a/packages/hedera/src/HederaModule.ts b/packages/hedera/src/HederaModule.ts index d23a2db144..773791a366 100644 --- a/packages/hedera/src/HederaModule.ts +++ b/packages/hedera/src/HederaModule.ts @@ -3,7 +3,7 @@ import { DependencyManager, Module } from '@credo-ts/core' import { AgentConfig, Buffer } from '@credo-ts/core' import { HederaModuleConfig, HederaModuleConfigOptions } from './HederaModuleConfig' -import { HederaLedgerService } from './ledger' +import {HederaLedgerService} from "./ledger/HederaLedgerService"; export class HederaModule implements Module { public readonly config: HederaModuleConfig diff --git a/packages/hedera/src/HederaModuleConfig.ts b/packages/hedera/src/HederaModuleConfig.ts index 5fe22428ef..e4a87d6188 100644 --- a/packages/hedera/src/HederaModuleConfig.ts +++ b/packages/hedera/src/HederaModuleConfig.ts @@ -1,15 +1,11 @@ import { HederaAnoncredsRegistryConfiguration } from '@hiero-did-sdk-js/anoncreds' -export type HederaModuleConfigOptions = HederaAnoncredsRegistryConfiguration +export interface HederaModuleConfigOptions extends HederaAnoncredsRegistryConfiguration {} export class HederaModuleConfig { - private readonly _options: HederaModuleConfigOptions + public readonly options: HederaModuleConfigOptions public constructor(options: HederaModuleConfigOptions) { - this._options = options - } - - get options(): HederaModuleConfigOptions { - return this._options + this.options = options } } diff --git a/packages/hedera/src/anoncreds/HederaAnonCredsRegistry.ts b/packages/hedera/src/anoncreds/HederaAnonCredsRegistry.ts index c7ccfa9d7a..76ae86ecba 100644 --- a/packages/hedera/src/anoncreds/HederaAnonCredsRegistry.ts +++ b/packages/hedera/src/anoncreds/HederaAnonCredsRegistry.ts @@ -14,7 +14,7 @@ import type { RegisterSchemaReturn, } from '@credo-ts/anoncreds' import type { AgentContext } from '@credo-ts/core' -import { HederaLedgerService } from '../ledger' +import {HederaLedgerService} from "../ledger/HederaLedgerService"; export class HederaAnonCredsRegistry implements AnonCredsRegistry { public readonly methodName = 'hedera' diff --git a/packages/hedera/src/dids/HederaDidRegistrar.ts b/packages/hedera/src/dids/HederaDidRegistrar.ts index 1b8dce017e..e1a21a6c97 100644 --- a/packages/hedera/src/dids/HederaDidRegistrar.ts +++ b/packages/hedera/src/dids/HederaDidRegistrar.ts @@ -13,7 +13,7 @@ import { DidUpdateOptions, DidUpdateResult, } from '@credo-ts/core' -import { HederaLedgerService } from '../ledger' +import {HederaLedgerService} from "../ledger/HederaLedgerService"; export class HederaDidRegistrar implements DidRegistrar { public readonly supportedMethods = ['hedera'] @@ -31,6 +31,7 @@ export class HederaDidRegistrar implements DidRegistrar { ...didDocument, service: didDocument.service?.map((s) => new DidDocumentService(s)), }) + await didRepository.save( agentContext, new DidRecord({ diff --git a/packages/hedera/src/dids/HederaDidResolver.ts b/packages/hedera/src/dids/HederaDidResolver.ts index 5fe2100cb6..2bf1d2533d 100644 --- a/packages/hedera/src/dids/HederaDidResolver.ts +++ b/packages/hedera/src/dids/HederaDidResolver.ts @@ -7,7 +7,7 @@ import { JsonTransformer, type ParsedDid, } from '@credo-ts/core' -import { HederaLedgerService } from '../ledger' +import {HederaLedgerService} from "../ledger/HederaLedgerService"; export class HederaDidResolver implements DidResolver { public readonly supportedMethods = ['hedera'] @@ -24,7 +24,7 @@ export class HederaDidResolver implements DidResolver { const hederaLedgerService = agentContext.dependencyManager.resolve(HederaLedgerService) const sdk = hederaLedgerService.getHederaDidSdk(agentContext) - const resolveDidResult = await sdk.resolveDid(did, 'did+json') + const resolveDidResult = await sdk.resolveDid(did) const updatedContextDidJson = { ...resolveDidResult, diff --git a/packages/hedera/src/index.ts b/packages/hedera/src/index.ts index 06098167ff..b552a6b0f9 100644 --- a/packages/hedera/src/index.ts +++ b/packages/hedera/src/index.ts @@ -3,6 +3,5 @@ export * from './dids' // AnonCreds export * from './anoncreds' -export * from './ledger' export * from './HederaModule' export * from './HederaModuleConfig' diff --git a/packages/hedera/src/ledger/HederaLedgerService.ts b/packages/hedera/src/ledger/HederaLedgerService.ts index d0fd7ad6e6..fd4ec364d6 100644 --- a/packages/hedera/src/ledger/HederaLedgerService.ts +++ b/packages/hedera/src/ledger/HederaLedgerService.ts @@ -1,22 +1,21 @@ import { type AgentContext, injectable } from '@credo-ts/core' import { HederaAnoncredsRegistry } from '@hiero-did-sdk-js/anoncreds' import { HederaDidService } from '@hiero-did-sdk-js/did' -import { HederaLedgerServiceCache, HederaModuleConfig } from '../.' +import { HederaModuleConfig } from '../HederaModuleConfig' +import { HederaLedgerServiceCache } from './HederaLedgerServiceCache' @injectable() export class HederaLedgerService { - private readonly config: HederaModuleConfig - - public constructor(config: HederaModuleConfig) { - this.config = config + public constructor(private readonly hederaModuleConfig: HederaModuleConfig) { + console.log('HederaLedgerService', hederaModuleConfig) } public getHederaAnonCredsSdk(agentContext: AgentContext): HederaAnoncredsRegistry { - const cache = this.config.options.cache ?? new HederaLedgerServiceCache(agentContext) - return new HederaAnoncredsRegistry({ ...this.config.options, cache }) + const cache = this.hederaModuleConfig.options.cache ?? new HederaLedgerServiceCache(agentContext) + return new HederaAnoncredsRegistry({ ...this.hederaModuleConfig.options, cache }) } public getHederaDidSdk(_agentContext: AgentContext): HederaDidService { - return new HederaDidService({ ...this.config.options }) + return new HederaDidService({ ...this.hederaModuleConfig.options }) } } diff --git a/packages/hedera/src/ledger/index.ts b/packages/hedera/src/ledger/index.ts deleted file mode 100644 index 77cb4eedf3..0000000000 --- a/packages/hedera/src/ledger/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { HederaLedgerService } from './HederaLedgerService' -export { HederaLedgerServiceCache } from './HederaLedgerServiceCache' diff --git a/packages/hedera/tests/HederaAnoncredsRegistry.e2e.test.ts b/packages/hedera/tests/HederaAnoncredsRegistry.e2e.test.ts index 6dd33b1026..0524f6c2b0 100644 --- a/packages/hedera/tests/HederaAnoncredsRegistry.e2e.test.ts +++ b/packages/hedera/tests/HederaAnoncredsRegistry.e2e.test.ts @@ -9,7 +9,7 @@ describe('Hedera AnonCreds support', () => { let agent: Agent let did: string - const logger = new ConsoleLogger(LogLevel.error) + const logger = new ConsoleLogger(LogLevel.debug) const cache = new testCache() beforeAll(async () => { diff --git a/packages/hedera/tests/HederaDid.e2e.test.ts b/packages/hedera/tests/HederaDid.e2e.test.ts index c57b737f5d..c7856cf3d8 100644 --- a/packages/hedera/tests/HederaDid.e2e.test.ts +++ b/packages/hedera/tests/HederaDid.e2e.test.ts @@ -3,32 +3,36 @@ import { getHederaAgent, waitTimeout } from './utils' const logger = new ConsoleLogger(LogLevel.error) -const did = 'did:hedera:testnet:zGdjMu1hPkjbJXSPPp6RgTptnpYYM9uEkPeNbPhSkXTon_0.0.5139753' +//const did = 'did:hedera:testnet:zGdjMu1hPkjbJXSPPp6RgTptnpYYM9uEkPeNbPhSkXTon_0.0.5139753' describe('Hedera Module did resolver', () => { - let aliceAgent: Agent + let agent: Agent beforeAll(async () => { - const aliceAgent = getHederaAgent({ + agent = getHederaAgent({ logger, label: 'alice', }) - await aliceAgent.initialize() + await agent.initialize() }) afterAll(async () => { // Wait for messages to flush out await waitTimeout(1000) - if (aliceAgent) { - await aliceAgent.shutdown() + if (agent) { + await agent.shutdown() } }) describe('HederaDidResolver', () => { - it('should resolve a hedera did when valid did is passed', async () => { - const resolvedDIDDoc = await aliceAgent.dids.resolve(did) - expect(resolvedDIDDoc).toBeDefined() + it('should creaste and resolve a hedera did', async () => { + const didResult = await agent.dids.create({method: 'hedera'}) + await waitTimeout(2000) + const resolvedDIDDoc = await agent.dids.resolve(didResult.didState.did ?? '') + expect(resolvedDIDDoc.didDocument?.id).toEqual(didResult.didState.did) }) }) }) + + diff --git a/packages/hedera/tests/HederaW3cFlow.e2e.test.ts b/packages/hedera/tests/HederaW3cFlow.e2e.test.ts index 811d7ce713..1c4da8a8c8 100644 --- a/packages/hedera/tests/HederaW3cFlow.e2e.test.ts +++ b/packages/hedera/tests/HederaW3cFlow.e2e.test.ts @@ -14,7 +14,6 @@ import { vcLibraries, } from '@credo-ts/core' -import { LinkedDataProof } from '@credo-ts/core/build/modules/vc/data-integrity/models/LinkedDataProof' import { W3C_FIXTURES } from './fixtures' import { getHederaAgent, waitTimeout } from './utils' @@ -101,10 +100,10 @@ describe('Hedera Module did resolver', () => { expect(vc).toBeInstanceOf(W3cJsonLdVerifiableCredential) expect(vc.issuer).toEqual(issuerDid) expect(Array.isArray(vc.proof)).toBe(false) - expect(vc.proof).toBeInstanceOf(LinkedDataProof) + //expect(vc.proof).toBeInstanceOf(LinkedDataProof) - vc.proof = vc.proof as LinkedDataProof - expect(vc.proof.verificationMethod).toEqual(verificationMethod) + //vc.proof = vc.proof as any//LinkedDataProof + expect((vc.proof as any).verificationMethod).toEqual(verificationMethod) }) it('should throw because of verificationMethod does not belong to this wallet', async () => { diff --git a/packages/hedera/tests/utils/InMemoryTailsFileService.ts b/packages/hedera/tests/utils/InMemoryTailsFileService.ts index de7a81b73b..952d4e51ea 100644 --- a/packages/hedera/tests/utils/InMemoryTailsFileService.ts +++ b/packages/hedera/tests/utils/InMemoryTailsFileService.ts @@ -17,7 +17,7 @@ export class InMemoryTailsFileService extends BasicTailsFileService { this.tailsFilePaths[options.revocationRegistryDefinition.value.tailsHash] = options.revocationRegistryDefinition.value.tailsLocation - return { tailsFileUrl: options.revocationRegistryDefinition.value.tailsHash } + return { tailsFileUrl: options.revocationRegistryDefinition.value.tailsLocation.replace(/\\/g, '/') } } public async getTailsFile( diff --git a/packages/hedera/tests/utils/hederaModule.ts b/packages/hedera/tests/utils/hederaModule.ts index 46e956d469..bcc649cd99 100644 --- a/packages/hedera/tests/utils/hederaModule.ts +++ b/packages/hedera/tests/utils/hederaModule.ts @@ -43,7 +43,6 @@ export const getHederaAgent = (props: { modules = { ...modules, askar: new AskarModule({ askar, store: { id: label, key: label } }), - hedera: new HederaModule(getHederaModuleConfig(props)), anoncreds: new AnonCredsModule({ anoncreds, registries: [new HederaAnonCredsRegistry()], @@ -53,6 +52,7 @@ export const getHederaAgent = (props: { resolvers: [new HederaDidResolver()], registrars: [new HederaDidRegistrar()], }), + hedera: new HederaModule(getHederaModuleConfig(props)), } if (cache) { modules = { ...modules, cache: new CacheModule({ cache }) } From ee2272441f2d4a7864429ea0f61bd6e0817f5959 Mon Sep 17 00:00:00 2001 From: "andrey.kononov" Date: Mon, 16 Jun 2025 22:37:04 +0300 Subject: [PATCH 48/89] Fix revocation status list issues for CredoTS --- packages/hedera/package.json | 2 +- .../tests/HederaAnoncredsRegistry.e2e.test.ts | 6 +- .../hedera/tests/HederaW3cFlow.e2e.test.ts | 19 +++++- packages/hedera/tests/utils/hederaModule.ts | 4 +- packages/hedera/tests/utils/index.ts | 2 +- .../tests/utils/testTailsFileService.ts | 62 +++++++++++++++++++ 6 files changed, 86 insertions(+), 9 deletions(-) create mode 100644 packages/hedera/tests/utils/testTailsFileService.ts diff --git a/packages/hedera/package.json b/packages/hedera/package.json index cf641ca229..c5813b281b 100644 --- a/packages/hedera/package.json +++ b/packages/hedera/package.json @@ -24,7 +24,7 @@ "dependencies": { "@credo-ts/anoncreds": "workspace:*", "@credo-ts/core": "workspace:*", - "@hiero-did-sdk-js/anoncreds": "npm:@hiero-did-sdk-js/anoncreds@0.0.1", + "@hiero-did-sdk-js/anoncreds": "npm:@hiero-did-sdk-js/anoncreds@0.0.5", "@hiero-did-sdk-js/did": "npm:@hiero-did-sdk-js/did@0.0.3" }, "devDependencies": { diff --git a/packages/hedera/tests/HederaAnoncredsRegistry.e2e.test.ts b/packages/hedera/tests/HederaAnoncredsRegistry.e2e.test.ts index 0524f6c2b0..bad119056b 100644 --- a/packages/hedera/tests/HederaAnoncredsRegistry.e2e.test.ts +++ b/packages/hedera/tests/HederaAnoncredsRegistry.e2e.test.ts @@ -123,7 +123,7 @@ describe('Hedera AnonCreds support', () => { // Resolve the revocation status list const revocationStatusListResponse = await agent.modules.anoncreds.getRevocationStatusList( revocationRegistryDefinitionId, - Date.now() + Date.now() / 1000 ) logger.debug('revocationStatusListResponse', [revocationStatusListResponse]) @@ -152,7 +152,7 @@ describe('Hedera AnonCreds support', () => { // Resolve the revocation status list const revokeRevocationStatusListResponse = await agent.modules.anoncreds.getRevocationStatusList( revocationRegistryDefinitionId, - Date.now() + Date.now() / 1000 ) logger.debug('revokeRevocationStatusListResponse', [revokeRevocationStatusListResponse]) expect(revokeRevocationStatusListResponse?.revocationStatusList?.revRegDefId).toEqual( @@ -182,7 +182,7 @@ describe('Hedera AnonCreds support', () => { // Resolve the revocation status list const issueRevocationStatusListResponse = await agent.modules.anoncreds.getRevocationStatusList( revocationRegistryDefinitionId, - Date.now() + Date.now() / 1000 ) logger.debug('issueRevocationStatusListResponse', [issueRevocationStatusListResponse]) expect(issueRevocationStatusListResponse?.revocationStatusList?.revRegDefId).toEqual( diff --git a/packages/hedera/tests/HederaW3cFlow.e2e.test.ts b/packages/hedera/tests/HederaW3cFlow.e2e.test.ts index 1c4da8a8c8..af17c4481f 100644 --- a/packages/hedera/tests/HederaW3cFlow.e2e.test.ts +++ b/packages/hedera/tests/HederaW3cFlow.e2e.test.ts @@ -22,9 +22,11 @@ const { purposes } = jsonldSignatures const logger = new ConsoleLogger(LogLevel.error) -// const did = 'did:hedera:testnet:zQDui45JN8tAZyc8aNcgcDp26wPJgVyQnw1wupqaqexKGWgsuMVfgzKmGfyg8fWPt_0.0.5139447' +//let did: string +//const did = 'did:hedera:testnet:zQDui45JN8tAZyc8aNcgcDp26wPJgVyQnw1wupqaqexKGWgsuMVfgzKmGfyg8fWPt_0.0.5139447' const did = 'did:hedera:testnet:zGdjMu1hPkjbJXSPPp6RgTptnpYYM9uEkPeNbPhSkXTon_0.0.5139753' -// const seed = '11011000010000111011001100010100' + +const seed = '11011000010000111011001100010100' // const holderSeed = '00000000000000000000000000holder' describe('Hedera Module did resolver', () => { @@ -45,6 +47,19 @@ describe('Hedera Module did resolver', () => { label: 'faber', }) await faberAgent.initialize() + + // // Making the test did + // const didRegistrarResult = await faberAgent.dids.create({ + // method: 'hedera', + // secret: { + // seed, + // }, + // }) + // if (!didRegistrarResult.didState?.didDocument?.id) throw new Error('DidRegistrarError') + // + // did = didRegistrarResult.didState.didDocument.id + + }) afterAll(async () => { diff --git a/packages/hedera/tests/utils/hederaModule.ts b/packages/hedera/tests/utils/hederaModule.ts index bcc649cd99..11e482f202 100644 --- a/packages/hedera/tests/utils/hederaModule.ts +++ b/packages/hedera/tests/utils/hederaModule.ts @@ -11,7 +11,7 @@ import { import { agentDependencies } from '@credo-ts/node' import { anoncreds } from '@hyperledger/anoncreds-nodejs' import { askar } from '@openwallet-foundation/askar-nodejs' -import { InMemoryTailsFileService } from './InMemoryTailsFileService' +import { TestTailsFileService } from './testTailsFileService' export const getHederaModuleConfig = (props: { operatorId?: string; operatorKey?: string }) => { const operatorId = props.operatorId ?? process.env.HEDERA_TEST_OPERATOR_ID ?? '' @@ -46,7 +46,7 @@ export const getHederaAgent = (props: { anoncreds: new AnonCredsModule({ anoncreds, registries: [new HederaAnonCredsRegistry()], - tailsFileService: new InMemoryTailsFileService(), + tailsFileService: new TestTailsFileService(), }), dids: new DidsModule({ resolvers: [new HederaDidResolver()], diff --git a/packages/hedera/tests/utils/index.ts b/packages/hedera/tests/utils/index.ts index 1f91d5d2d7..10254fc074 100644 --- a/packages/hedera/tests/utils/index.ts +++ b/packages/hedera/tests/utils/index.ts @@ -1,3 +1,3 @@ export * from './hederaModule' -export * from './InMemoryTailsFileService' +export * from './testTailsFileService' export * from './utils' diff --git a/packages/hedera/tests/utils/testTailsFileService.ts b/packages/hedera/tests/utils/testTailsFileService.ts new file mode 100644 index 0000000000..679567045d --- /dev/null +++ b/packages/hedera/tests/utils/testTailsFileService.ts @@ -0,0 +1,62 @@ +import type { AnonCredsRevocationRegistryDefinition } from '@credo-ts/anoncreds' +import type { AgentContext, FileSystem } from '@credo-ts/core' + +import { InjectionSymbols } from '@credo-ts/core' + +import { BasicTailsFileService } from '@credo-ts/anoncreds' + +export class TestTailsFileService extends BasicTailsFileService { + private tailsFilePaths: Record = {} + + public async uploadTailsFile( + _agentContext: AgentContext, + options: { + revocationRegistryDefinition: AnonCredsRevocationRegistryDefinition + } + ) { + this.tailsFilePaths[options.revocationRegistryDefinition.value.tailsHash] = + options.revocationRegistryDefinition.value.tailsLocation + + return { + tailsFileUrl: options.revocationRegistryDefinition.value.tailsLocation + } + // tailsFileUrl: options.revocationRegistryDefinition.value.tailsLocation.replace(/\\/g, '/') + } + + public async getTailsFile( + agentContext: AgentContext, + options: { + revocationRegistryDefinition: AnonCredsRevocationRegistryDefinition + } + ) { + const { revocationRegistryDefinition } = options + const { tailsLocation, tailsHash } = revocationRegistryDefinition.value + + try { + agentContext.config.logger.debug( + `Checking to see if tails file for URL ${revocationRegistryDefinition.value.tailsLocation} has been stored in the FileSystem` + ) + + // hash is used as file identifier + const tailsExists = await this.tailsFileExists(agentContext, tailsHash) + const tailsFilePath = await this.getTailsFilePath(agentContext, tailsHash) + agentContext.config.logger.debug( + `Tails file for ${tailsLocation} ${tailsExists ? 'is stored' : 'is not stored'} at ${tailsFilePath}` + ) + + if (!tailsExists) { + agentContext.config.logger.debug(`Retrieving tails file from URL ${tailsLocation}`) + const fileSystem = agentContext.dependencyManager.resolve(InjectionSymbols.FileSystem) + await fileSystem.downloadToFile(tailsLocation, tailsFilePath) + agentContext.config.logger.debug(`Saved tails file to FileSystem at path ${tailsFilePath}`) + } + + return { tailsFilePath } + } catch (error) { + agentContext.config.logger.error(`Error while retrieving tails file from URL ${tailsLocation}`, { + error, + }) + throw error + } + } +} From 1de8cc53f3b5ba08c7a19916c78fe014d6dd1e14 Mon Sep 17 00:00:00 2001 From: "andrey.kononov" Date: Tue, 17 Jun 2025 18:21:46 +0300 Subject: [PATCH 49/89] Use the new @hiero-did-sdk-js/* --- packages/hedera/package.json | 5 +++-- .../src/ledger/HederaLedgerServiceCache.ts | 17 ++++++++++------- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/packages/hedera/package.json b/packages/hedera/package.json index c5813b281b..b8e05cd779 100644 --- a/packages/hedera/package.json +++ b/packages/hedera/package.json @@ -24,8 +24,9 @@ "dependencies": { "@credo-ts/anoncreds": "workspace:*", "@credo-ts/core": "workspace:*", - "@hiero-did-sdk-js/anoncreds": "npm:@hiero-did-sdk-js/anoncreds@0.0.5", - "@hiero-did-sdk-js/did": "npm:@hiero-did-sdk-js/did@0.0.3" + "@hiero-did-sdk-js/anoncreds": "npm:@hiero-did-sdk-js/anoncreds@0.0.6", + "@hiero-did-sdk-js/did": "npm:@hiero-did-sdk-js/did@0.0.4", + "@hiero-did-sdk-js/core": "npm:@hiero-did-sdk-js/core@0.0.1" }, "devDependencies": { "@credo-ts/node": "workspace:*", diff --git a/packages/hedera/src/ledger/HederaLedgerServiceCache.ts b/packages/hedera/src/ledger/HederaLedgerServiceCache.ts index 2fd6f326c8..ee77b02886 100644 --- a/packages/hedera/src/ledger/HederaLedgerServiceCache.ts +++ b/packages/hedera/src/ledger/HederaLedgerServiceCache.ts @@ -1,4 +1,5 @@ import { AgentContext, CacheModuleConfig, CredoError } from '@credo-ts/core' +import {Cache} from "@hiero-did-sdk-js/core"; export interface CredoCache { get(agentContext: AgentContext, key: string): Promise @@ -6,13 +7,7 @@ export interface CredoCache { remove(agentContext: AgentContext, key: string): Promise } -interface SdkCache { - get(key: string): Promise - set(key: string, value: CacheValue, expiresInSeconds?: number): Promise - remove(key: string): Promise -} - -export class HederaLedgerServiceCache implements SdkCache { +export class HederaLedgerServiceCache implements Cache { private readonly credoCache: CredoCache constructor(private readonly agentContext: AgentContext) { @@ -39,4 +34,12 @@ export class HederaLedgerServiceCache implements SdkCache { } await this.credoCache.remove(this.agentContext, key) } + + cleanup(): Promise { + throw new Error('Method not implemented.'); + } + + cleanupExpired(): Promise { + throw new Error('Method not implemented.'); + } } From fb32a3e4931a5b28a2f603f3e6adea71978daf91 Mon Sep 17 00:00:00 2001 From: "andrey.kononov" Date: Wed, 18 Jun 2025 13:01:13 +0300 Subject: [PATCH 50/89] Biome fixes --- packages/hedera/jest.config.ts | 2 +- packages/hedera/package.json | 2 +- packages/hedera/src/HederaModule.ts | 2 +- packages/hedera/src/anoncreds/HederaAnonCredsRegistry.ts | 2 +- packages/hedera/src/dids/HederaDidRegistrar.ts | 2 +- packages/hedera/src/dids/HederaDidResolver.ts | 2 +- packages/hedera/src/ledger/HederaLedgerService.ts | 4 +--- packages/hedera/src/ledger/HederaLedgerServiceCache.ts | 6 +++--- packages/hedera/tests/HederaDid.e2e.test.ts | 4 +--- packages/hedera/tests/HederaW3cFlow.e2e.test.ts | 4 +--- packages/hedera/tests/utils/testTailsFileService.ts | 2 +- 11 files changed, 13 insertions(+), 19 deletions(-) diff --git a/packages/hedera/jest.config.ts b/packages/hedera/jest.config.ts index b594a3aaf4..9192efbeeb 100644 --- a/packages/hedera/jest.config.ts +++ b/packages/hedera/jest.config.ts @@ -7,7 +7,7 @@ import packageJson from './package.json' const config: Config.InitialOptions = { ...base, testTimeout: 1200000, - displayName: packageJson.name + displayName: packageJson.name, } export default config diff --git a/packages/hedera/package.json b/packages/hedera/package.json index b8e05cd779..12e6d10bd5 100644 --- a/packages/hedera/package.json +++ b/packages/hedera/package.json @@ -24,7 +24,7 @@ "dependencies": { "@credo-ts/anoncreds": "workspace:*", "@credo-ts/core": "workspace:*", - "@hiero-did-sdk-js/anoncreds": "npm:@hiero-did-sdk-js/anoncreds@0.0.6", + "@hiero-did-sdk-js/anoncreds": "npm:@hiero-did-sdk-js/anoncreds@0.0.7", "@hiero-did-sdk-js/did": "npm:@hiero-did-sdk-js/did@0.0.4", "@hiero-did-sdk-js/core": "npm:@hiero-did-sdk-js/core@0.0.1" }, diff --git a/packages/hedera/src/HederaModule.ts b/packages/hedera/src/HederaModule.ts index 773791a366..c3ce218400 100644 --- a/packages/hedera/src/HederaModule.ts +++ b/packages/hedera/src/HederaModule.ts @@ -3,7 +3,7 @@ import { DependencyManager, Module } from '@credo-ts/core' import { AgentConfig, Buffer } from '@credo-ts/core' import { HederaModuleConfig, HederaModuleConfigOptions } from './HederaModuleConfig' -import {HederaLedgerService} from "./ledger/HederaLedgerService"; +import { HederaLedgerService } from './ledger/HederaLedgerService' export class HederaModule implements Module { public readonly config: HederaModuleConfig diff --git a/packages/hedera/src/anoncreds/HederaAnonCredsRegistry.ts b/packages/hedera/src/anoncreds/HederaAnonCredsRegistry.ts index 76ae86ecba..669508d2b9 100644 --- a/packages/hedera/src/anoncreds/HederaAnonCredsRegistry.ts +++ b/packages/hedera/src/anoncreds/HederaAnonCredsRegistry.ts @@ -14,7 +14,7 @@ import type { RegisterSchemaReturn, } from '@credo-ts/anoncreds' import type { AgentContext } from '@credo-ts/core' -import {HederaLedgerService} from "../ledger/HederaLedgerService"; +import { HederaLedgerService } from '../ledger/HederaLedgerService' export class HederaAnonCredsRegistry implements AnonCredsRegistry { public readonly methodName = 'hedera' diff --git a/packages/hedera/src/dids/HederaDidRegistrar.ts b/packages/hedera/src/dids/HederaDidRegistrar.ts index e1a21a6c97..fc4d179c95 100644 --- a/packages/hedera/src/dids/HederaDidRegistrar.ts +++ b/packages/hedera/src/dids/HederaDidRegistrar.ts @@ -13,7 +13,7 @@ import { DidUpdateOptions, DidUpdateResult, } from '@credo-ts/core' -import {HederaLedgerService} from "../ledger/HederaLedgerService"; +import { HederaLedgerService } from '../ledger/HederaLedgerService' export class HederaDidRegistrar implements DidRegistrar { public readonly supportedMethods = ['hedera'] diff --git a/packages/hedera/src/dids/HederaDidResolver.ts b/packages/hedera/src/dids/HederaDidResolver.ts index 2bf1d2533d..7a231f6f81 100644 --- a/packages/hedera/src/dids/HederaDidResolver.ts +++ b/packages/hedera/src/dids/HederaDidResolver.ts @@ -7,7 +7,7 @@ import { JsonTransformer, type ParsedDid, } from '@credo-ts/core' -import {HederaLedgerService} from "../ledger/HederaLedgerService"; +import { HederaLedgerService } from '../ledger/HederaLedgerService' export class HederaDidResolver implements DidResolver { public readonly supportedMethods = ['hedera'] diff --git a/packages/hedera/src/ledger/HederaLedgerService.ts b/packages/hedera/src/ledger/HederaLedgerService.ts index fd4ec364d6..b8e3150ce1 100644 --- a/packages/hedera/src/ledger/HederaLedgerService.ts +++ b/packages/hedera/src/ledger/HederaLedgerService.ts @@ -6,9 +6,7 @@ import { HederaLedgerServiceCache } from './HederaLedgerServiceCache' @injectable() export class HederaLedgerService { - public constructor(private readonly hederaModuleConfig: HederaModuleConfig) { - console.log('HederaLedgerService', hederaModuleConfig) - } + public constructor(private readonly hederaModuleConfig: HederaModuleConfig) {} public getHederaAnonCredsSdk(agentContext: AgentContext): HederaAnoncredsRegistry { const cache = this.hederaModuleConfig.options.cache ?? new HederaLedgerServiceCache(agentContext) diff --git a/packages/hedera/src/ledger/HederaLedgerServiceCache.ts b/packages/hedera/src/ledger/HederaLedgerServiceCache.ts index ee77b02886..ff4e8fbb35 100644 --- a/packages/hedera/src/ledger/HederaLedgerServiceCache.ts +++ b/packages/hedera/src/ledger/HederaLedgerServiceCache.ts @@ -1,5 +1,5 @@ import { AgentContext, CacheModuleConfig, CredoError } from '@credo-ts/core' -import {Cache} from "@hiero-did-sdk-js/core"; +import { Cache } from '@hiero-did-sdk-js/core' export interface CredoCache { get(agentContext: AgentContext, key: string): Promise @@ -36,10 +36,10 @@ export class HederaLedgerServiceCache implements Cache { } cleanup(): Promise { - throw new Error('Method not implemented.'); + throw new Error('Method not implemented.') } cleanupExpired(): Promise { - throw new Error('Method not implemented.'); + throw new Error('Method not implemented.') } } diff --git a/packages/hedera/tests/HederaDid.e2e.test.ts b/packages/hedera/tests/HederaDid.e2e.test.ts index c7856cf3d8..597c61bf70 100644 --- a/packages/hedera/tests/HederaDid.e2e.test.ts +++ b/packages/hedera/tests/HederaDid.e2e.test.ts @@ -27,12 +27,10 @@ describe('Hedera Module did resolver', () => { describe('HederaDidResolver', () => { it('should creaste and resolve a hedera did', async () => { - const didResult = await agent.dids.create({method: 'hedera'}) + const didResult = await agent.dids.create({ method: 'hedera' }) await waitTimeout(2000) const resolvedDIDDoc = await agent.dids.resolve(didResult.didState.did ?? '') expect(resolvedDIDDoc.didDocument?.id).toEqual(didResult.didState.did) }) }) }) - - diff --git a/packages/hedera/tests/HederaW3cFlow.e2e.test.ts b/packages/hedera/tests/HederaW3cFlow.e2e.test.ts index af17c4481f..e4e217b2cf 100644 --- a/packages/hedera/tests/HederaW3cFlow.e2e.test.ts +++ b/packages/hedera/tests/HederaW3cFlow.e2e.test.ts @@ -26,7 +26,7 @@ const logger = new ConsoleLogger(LogLevel.error) //const did = 'did:hedera:testnet:zQDui45JN8tAZyc8aNcgcDp26wPJgVyQnw1wupqaqexKGWgsuMVfgzKmGfyg8fWPt_0.0.5139447' const did = 'did:hedera:testnet:zGdjMu1hPkjbJXSPPp6RgTptnpYYM9uEkPeNbPhSkXTon_0.0.5139753' -const seed = '11011000010000111011001100010100' +const _seed = '11011000010000111011001100010100' // const holderSeed = '00000000000000000000000000holder' describe('Hedera Module did resolver', () => { @@ -58,8 +58,6 @@ describe('Hedera Module did resolver', () => { // if (!didRegistrarResult.didState?.didDocument?.id) throw new Error('DidRegistrarError') // // did = didRegistrarResult.didState.didDocument.id - - }) afterAll(async () => { diff --git a/packages/hedera/tests/utils/testTailsFileService.ts b/packages/hedera/tests/utils/testTailsFileService.ts index 679567045d..ee3672de6a 100644 --- a/packages/hedera/tests/utils/testTailsFileService.ts +++ b/packages/hedera/tests/utils/testTailsFileService.ts @@ -18,7 +18,7 @@ export class TestTailsFileService extends BasicTailsFileService { options.revocationRegistryDefinition.value.tailsLocation return { - tailsFileUrl: options.revocationRegistryDefinition.value.tailsLocation + tailsFileUrl: options.revocationRegistryDefinition.value.tailsLocation, } // tailsFileUrl: options.revocationRegistryDefinition.value.tailsLocation.replace(/\\/g, '/') } From bef1d1c305c43cf7bcaea70303d347a04f3e9d86 Mon Sep 17 00:00:00 2001 From: "andrey.kononov" Date: Thu, 19 Jun 2025 22:24:50 +0300 Subject: [PATCH 51/89] Implement HederaLedgerService methods the new hiero-did-sdk using Implement DidRegistar methods Implement DidResolver method --- jest.config.base.ts | 2 +- packages/hedera/package.json | 10 +- packages/hedera/src/HederaModuleConfig.ts | 2 +- .../src/anoncreds/HederaAnonCredsRegistry.ts | 40 ++--- .../CredoCache.ts} | 8 +- .../hedera/src/dids/HederaDidRegistrar.ts | 165 +++++++++++++++--- packages/hedera/src/dids/HederaDidResolver.ts | 33 ++-- .../hedera/src/ledger/HederaLedgerService.ts | 161 ++++++++++++++++- 8 files changed, 342 insertions(+), 79 deletions(-) rename packages/hedera/src/{ledger/HederaLedgerServiceCache.ts => cache/CredoCache.ts} (88%) diff --git a/jest.config.base.ts b/jest.config.base.ts index 79f2467b61..43b6b40302 100644 --- a/jest.config.base.ts +++ b/jest.config.base.ts @@ -15,7 +15,7 @@ const config: Config.InitialOptions = { { isolatedModules: true, }, - ] + ], }, } diff --git a/packages/hedera/package.json b/packages/hedera/package.json index 12e6d10bd5..96f73169d3 100644 --- a/packages/hedera/package.json +++ b/packages/hedera/package.json @@ -22,11 +22,15 @@ "test": "jest" }, "dependencies": { + "@hashgraph/sdk": "^2.66.0", "@credo-ts/anoncreds": "workspace:*", "@credo-ts/core": "workspace:*", - "@hiero-did-sdk-js/anoncreds": "npm:@hiero-did-sdk-js/anoncreds@0.0.7", - "@hiero-did-sdk-js/did": "npm:@hiero-did-sdk-js/did@0.0.4", - "@hiero-did-sdk-js/core": "npm:@hiero-did-sdk-js/core@0.0.1" + "@hiero-did-sdk/anoncreds": "npm:@hiero-did-sdk/anoncreds@0.0.3", + "@hiero-did-sdk/registrar": "npm:@hiero-did-sdk/registrar@0.0.1", + "@hiero-did-sdk/resolver": "npm:@hiero-did-sdk/resolver@0.0.5", + "@hiero-did-sdk/core": "npm:@hiero-did-sdk/core@0.0.1", + "@hiero-did-sdk/client": "npm:@hiero-did-sdk/client@0.0.1", + "@hiero-did-sdk/hcs": "npm:@hiero-did-sdk/hcs@0.0.3" }, "devDependencies": { "@credo-ts/node": "workspace:*", diff --git a/packages/hedera/src/HederaModuleConfig.ts b/packages/hedera/src/HederaModuleConfig.ts index e4a87d6188..4b5aa6fab5 100644 --- a/packages/hedera/src/HederaModuleConfig.ts +++ b/packages/hedera/src/HederaModuleConfig.ts @@ -1,4 +1,4 @@ -import { HederaAnoncredsRegistryConfiguration } from '@hiero-did-sdk-js/anoncreds' +import { HederaAnoncredsRegistryConfiguration } from '@hiero-did-sdk/anoncreds' export interface HederaModuleConfigOptions extends HederaAnoncredsRegistryConfiguration {} diff --git a/packages/hedera/src/anoncreds/HederaAnonCredsRegistry.ts b/packages/hedera/src/anoncreds/HederaAnonCredsRegistry.ts index 669508d2b9..36c2d6f1ef 100644 --- a/packages/hedera/src/anoncreds/HederaAnonCredsRegistry.ts +++ b/packages/hedera/src/anoncreds/HederaAnonCredsRegistry.ts @@ -25,10 +25,9 @@ export class HederaAnonCredsRegistry implements AnonCredsRegistry { options: RegisterSchemaOptions ): Promise { try { - const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) - const sdk = ledgerService.getHederaAnonCredsSdk(agentContext) agentContext.config.logger.trace('Submitting register schema request to ledger') - return await sdk.registerSchema(options) + const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) + return await ledgerService.registerSchema(agentContext, options) } catch (error) { agentContext.config.logger.debug(`Error registering schema for did '${options.schema.issuerId}'`, { error, @@ -49,10 +48,9 @@ export class HederaAnonCredsRegistry implements AnonCredsRegistry { public async getSchema(agentContext: AgentContext, schemaId: string): Promise { try { - const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) - const sdk = ledgerService.getHederaAnonCredsSdk(agentContext) agentContext.config.logger.trace(`Submitting get schema request for schema '${schemaId}' to ledger`) - return await sdk.getSchema(schemaId) + const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) + return await ledgerService.getSchema(agentContext, schemaId) } catch (error) { agentContext.config.logger.error(`Error retrieving schema '${schemaId}'`, { error, @@ -74,10 +72,9 @@ export class HederaAnonCredsRegistry implements AnonCredsRegistry { options: RegisterCredentialDefinitionOptions ): Promise { try { - const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) - const sdk = ledgerService.getHederaAnonCredsSdk(agentContext) agentContext.config.logger.trace('Submitting register credential definition request to ledger') - return await sdk.registerCredentialDefinition(options) + const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) + return await ledgerService.registerCredentialDefinition(agentContext, options) } catch (error) { agentContext.config.logger.error( `Error registering credential definition for did '${options.credentialDefinition.issuerId}'`, @@ -104,12 +101,11 @@ export class HederaAnonCredsRegistry implements AnonCredsRegistry { credentialDefinitionId: string ): Promise { try { - const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) - const sdk = ledgerService.getHederaAnonCredsSdk(agentContext) agentContext.config.logger.trace( `Submitting get credential definition request for '${credentialDefinitionId}' to ledger` ) - return await sdk.getCredentialDefinition(credentialDefinitionId) + const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) + return await ledgerService.getCredentialDefinition(agentContext, credentialDefinitionId) } catch (error) { agentContext.config.logger.error(`Error retrieving credential definition '${credentialDefinitionId}'`, { error, @@ -131,12 +127,11 @@ export class HederaAnonCredsRegistry implements AnonCredsRegistry { options: RegisterRevocationRegistryDefinitionOptions ): Promise { try { - const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) - const sdk = ledgerService.getHederaAnonCredsSdk(agentContext) agentContext.config.logger.trace( `Submitting register revocation registry definition request for '${options.revocationRegistryDefinition.credDefId}' to ledger` ) - return await sdk.registerRevocationRegistryDefinition(options) + const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) + return await ledgerService.registerRevocationRegistryDefinition(agentContext, options) } catch (error) { agentContext.config.logger.error( `Error registering revocation registry definition for did '${options.revocationRegistryDefinition.issuerId}'`, @@ -163,12 +158,11 @@ export class HederaAnonCredsRegistry implements AnonCredsRegistry { revocationRegistryDefinitionId: string ): Promise { try { - const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) - const sdk = ledgerService.getHederaAnonCredsSdk(agentContext) agentContext.config.logger.trace( `Submitting get revocation registry definition request for '${revocationRegistryDefinitionId}' to ledger` ) - return await sdk.getRevocationRegistryDefinition(revocationRegistryDefinitionId) + const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) + return await ledgerService.getRevocationRegistryDefinition(agentContext, revocationRegistryDefinitionId) } catch (error) { agentContext.config.logger.error( `Error retrieving revocation registry definition '${revocationRegistryDefinitionId}'`, @@ -193,12 +187,11 @@ export class HederaAnonCredsRegistry implements AnonCredsRegistry { options: RegisterRevocationStatusListOptions ): Promise { try { - const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) - const sdk = ledgerService.getHederaAnonCredsSdk(agentContext) agentContext.config.logger.trace( `Submitting register revocation status list request for '${options.revocationStatusList.revRegDefId}' to ledger` ) - return await sdk.registerRevocationStatusList(options) + const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) + return await ledgerService.registerRevocationStatusList(agentContext, options) } catch (error) { agentContext.config.logger.error( `Error registering revocation status list for did '${options.revocationStatusList.issuerId}'`, @@ -226,12 +219,11 @@ export class HederaAnonCredsRegistry implements AnonCredsRegistry { timestamp: number ): Promise { try { - const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) - const sdk = ledgerService.getHederaAnonCredsSdk(agentContext) agentContext.config.logger.trace( `Submitting get revocation status request for '${revocationRegistryId}' to ledger` ) - return await sdk.getRevocationStatusList(revocationRegistryId, timestamp) + const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) + return await ledgerService.getRevocationStatusList(agentContext, revocationRegistryId, timestamp) } catch (error) { agentContext.config.logger.error(`Error retrieving revocation registry status list '${revocationRegistryId}'`, { error, diff --git a/packages/hedera/src/ledger/HederaLedgerServiceCache.ts b/packages/hedera/src/cache/CredoCache.ts similarity index 88% rename from packages/hedera/src/ledger/HederaLedgerServiceCache.ts rename to packages/hedera/src/cache/CredoCache.ts index ff4e8fbb35..f851268d0b 100644 --- a/packages/hedera/src/ledger/HederaLedgerServiceCache.ts +++ b/packages/hedera/src/cache/CredoCache.ts @@ -1,14 +1,14 @@ import { AgentContext, CacheModuleConfig, CredoError } from '@credo-ts/core' -import { Cache } from '@hiero-did-sdk-js/core' +import { Cache } from '@hiero-did-sdk/core' -export interface CredoCache { +export interface ICredoCache { get(agentContext: AgentContext, key: string): Promise set(agentContext: AgentContext, key: string, value: CacheValue, expiresInSeconds?: number): Promise remove(agentContext: AgentContext, key: string): Promise } -export class HederaLedgerServiceCache implements Cache { - private readonly credoCache: CredoCache +export class CredoCache implements Cache { + private readonly credoCache: ICredoCache constructor(private readonly agentContext: AgentContext) { this.credoCache = agentContext.dependencyManager.resolve(CacheModuleConfig).cache diff --git a/packages/hedera/src/dids/HederaDidRegistrar.ts b/packages/hedera/src/dids/HederaDidRegistrar.ts index fc4d179c95..627ee46f38 100644 --- a/packages/hedera/src/dids/HederaDidRegistrar.ts +++ b/packages/hedera/src/dids/HederaDidRegistrar.ts @@ -12,26 +12,59 @@ import { DidRepository, DidUpdateOptions, DidUpdateResult, + JsonTransformer, } from '@credo-ts/core' import { HederaLedgerService } from '../ledger/HederaLedgerService' +import { PrivateKey } from '@hashgraph/sdk' +import { HederaNetwork } from '@hiero-did-sdk/client' + +export interface HederaDidCreateOptions extends DidCreateOptions { + method: 'hedera' + did?: string + didDocument?: DidDocument + secret?: { + privateKey?: string | PrivateKey | undefined + } + options?: { + network?: HederaNetwork | string + } +} + +export interface HederaDidUpdateOptions extends DidUpdateOptions { + did: string + secret?: { + privateKey?: string | PrivateKey | undefined + } +} + +export interface HederaDidDeactivateOptions extends DidDeactivateOptions { + did: string + secret?: { + privateKey?: string | PrivateKey | undefined + } +} + export class HederaDidRegistrar implements DidRegistrar { public readonly supportedMethods = ['hedera'] - async create(agentContext: AgentContext, _options: DidCreateOptions): Promise { + async create(agentContext: AgentContext, options: HederaDidCreateOptions): Promise { try { + agentContext.config.logger.trace('Try to create the did document to ledger') + const didRepository = agentContext.dependencyManager.resolve(DidRepository) - const hederaLedgerService = agentContext.dependencyManager.resolve(HederaLedgerService) - const sdk = hederaLedgerService.getHederaDidSdk(agentContext) + const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) - const { did, didDocument } = await sdk.createDid({}) + // Create did + const { did, didDocument } = await ledgerService.createDid(agentContext, { + networkName: options.options?.network, + }) // Save the did so we know we created it and can issue with it const credoDidDocument = new DidDocument({ ...didDocument, service: didDocument.service?.map((s) => new DidDocumentService(s)), }) - await didRepository.save( agentContext, new DidRecord({ @@ -51,7 +84,9 @@ export class HederaDidRegistrar implements DidRegistrar { }, } } catch (error) { - agentContext.config.logger.error(`Error registering DID : ${error}`) + agentContext.config.logger.debug('Error creating of the did ', { + error, + }) return { didDocumentMetadata: {}, didRegistrationMetadata: {}, @@ -63,22 +98,110 @@ export class HederaDidRegistrar implements DidRegistrar { } } - update(_agentContext: AgentContext, _options: DidUpdateOptions): Promise { - throw new Error('Method not implemented.') + async update(agentContext: AgentContext, options: HederaDidUpdateOptions): Promise { + const didRepository = agentContext.dependencyManager.resolve(DidRepository) + const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) + + try { + const { did } = options + const { didDocument, didDocumentMetadata } = await ledgerService.resolveDid(agentContext, did) + const didRecord = await didRepository.findCreatedDid(agentContext, did) + if (!didDocument || didDocumentMetadata.deactivated || !didRecord) { + return { + didDocumentMetadata: {}, + didRegistrationMetadata: {}, + didState: { + state: 'failed', + reason: 'Did not found', + }, + } + } + + const { didDocument: updatedDidDocument } = await ledgerService.updateDid(agentContext, { + did, + updates: { + operation: , + // id: options., + // property: 'verificationMethod', + // publicKeyMultibase: 'z6MkkFf6yboMwr1LQVAHqatuGYD9foRe7L2wPkEn1A7LyoQb', + }, + privateKey: options.secret?.privateKey, + }) + + didRecord.didDocument = JsonTransformer.fromJSON(updatedDidDocument, DidDocument) + await didRepository.update(agentContext, didRecord) + + return { + didDocumentMetadata: {}, + didRegistrationMetadata: {}, + didState: { + state: 'finished', + did, + didDocument: didRecord.didDocument, + }, + } + } catch (error) { + agentContext.config.logger.error('Error updating DID', error) + return { + didDocumentMetadata: {}, + didRegistrationMetadata: {}, + didState: { + state: 'failed', + reason: `Unable update DID: ${error.message}`, + }, + } + } } - deactivate(_agentContext: AgentContext, _options: DidDeactivateOptions): Promise { - throw new Error('Method not implemented.') + async deactivate(agentContext: AgentContext, options: HederaDidDeactivateOptions): Promise { + const didRepository = agentContext.dependencyManager.resolve(DidRepository) + const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) + + const did = options.did + + try { + const { didDocument, didDocumentMetadata } = await ledgerService.resolveDid(agentContext, did) + + const didRecord = await didRepository.findCreatedDid(agentContext, did) + + if (!didDocument || didDocumentMetadata.deactivated || !didRecord) { + return { + didDocumentMetadata, + didRegistrationMetadata: {}, + didState: { + state: 'failed', + reason: 'Did not found', + }, + } + } + + const { didDocument: deactivatedDidDocument } = await ledgerService.deactivateDid(agentContext, { + did: options.did, + privateKey: options.secret?.privateKey, + }) + + didRecord.didDocument = JsonTransformer.fromJSON(deactivatedDidDocument, DidDocument) + await didRepository.update(agentContext, didRecord) + + return { + didDocumentMetadata: {}, + didRegistrationMetadata: {}, + didState: { + state: 'finished', + did, + didDocument: didRecord.didDocument, + }, + } + } catch (error) { + agentContext.config.logger.error('Error deactivating DID', error) + return { + didDocumentMetadata: {}, + didRegistrationMetadata: {}, + didState: { + state: 'failed', + reason: `Unable deactivating DID: ${error.message}`, + }, + } + } } } -// -// export type SeedString = string -// -// export interface HederaDidCreateOptions extends DidCreateOptions { -// method: 'hedera' -// did?: never -// secret: { -// network: HederaNetwork -// seed: string -// } -// } diff --git a/packages/hedera/src/dids/HederaDidResolver.ts b/packages/hedera/src/dids/HederaDidResolver.ts index 7a231f6f81..3dc00f4e6a 100644 --- a/packages/hedera/src/dids/HederaDidResolver.ts +++ b/packages/hedera/src/dids/HederaDidResolver.ts @@ -21,26 +21,27 @@ export class HederaDidResolver implements DidResolver { _didResolutionOptions: DidResolutionOptions ): Promise { try { - const hederaLedgerService = agentContext.dependencyManager.resolve(HederaLedgerService) - const sdk = hederaLedgerService.getHederaDidSdk(agentContext) - - const resolveDidResult = await sdk.resolveDid(did) - - const updatedContextDidJson = { - ...resolveDidResult, - '@context': ['https://www.w3.org/ns/did/v1', 'https://w3id.org/security/suites/ed25519-2018/v1'], - } - - const didDocument = JsonTransformer.fromJSON(updatedContextDidJson, DidDocument) - + agentContext.config.logger.trace('Try to resolve a did document from ledger') + const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) + const resolveDidResult = await ledgerService.resolveDid(agentContext, did) + // const updatedContextDidJson = { + // ...resolveDidResult.didDocument, + // '@context': ['https://www.w3.org/ns/did/v1', 'https://w3id.org/security/suites/ed25519-2018/v1'], + // } + const didDocument = JsonTransformer.fromJSON(resolveDidResult.didDocument, DidDocument) return { didDocument, - didDocumentMetadata: {}, - didResolutionMetadata: { - contentType: 'application/did+json', - }, + didDocumentMetadata: resolveDidResult.didDocumentMetadata, + didResolutionMetadata: resolveDidResult.didResolutionMetadata, + // { + // contentType: 'application/did+json', + // }, } } catch (error) { + agentContext.config.logger.debug('Error resolving the did', { + error, + did, + }) return { didDocument: null, didDocumentMetadata: {}, diff --git a/packages/hedera/src/ledger/HederaLedgerService.ts b/packages/hedera/src/ledger/HederaLedgerService.ts index b8e3150ce1..fba3693935 100644 --- a/packages/hedera/src/ledger/HederaLedgerService.ts +++ b/packages/hedera/src/ledger/HederaLedgerService.ts @@ -1,19 +1,162 @@ +import type { + GetCredentialDefinitionReturn, + GetRevocationRegistryDefinitionReturn, + GetRevocationStatusListReturn, + GetSchemaReturn, + RegisterCredentialDefinitionOptions, + RegisterCredentialDefinitionReturn, + RegisterRevocationRegistryDefinitionOptions, + RegisterRevocationRegistryDefinitionReturn, + RegisterRevocationStatusListOptions, + RegisterRevocationStatusListReturn, + RegisterSchemaOptions, + RegisterSchemaReturn, +} from '@credo-ts/anoncreds' import { type AgentContext, injectable } from '@credo-ts/core' -import { HederaAnoncredsRegistry } from '@hiero-did-sdk-js/anoncreds' -import { HederaDidService } from '@hiero-did-sdk-js/did' +import { Client } from '@hashgraph/sdk' +import { HederaAnoncredsRegistry } from '@hiero-did-sdk/anoncreds' +import { HederaClientService, NetworkName } from '@hiero-did-sdk/client' +import { DIDResolution } from '@hiero-did-sdk/core' +import { + CreateDIDResult, + DeactivateDIDOptions, + DeactivateDIDResult, + UpdateDIDOptions, + UpdateDIDResult, + createDID, + deactivateDID, + updateDID, +} from '@hiero-did-sdk/registrar' +import { TopicReaderHederaHcs, parseDID, resolveDID } from '@hiero-did-sdk/resolver' import { HederaModuleConfig } from '../HederaModuleConfig' -import { HederaLedgerServiceCache } from './HederaLedgerServiceCache' +import { CredoCache } from '../cache/CredoCache' @injectable() export class HederaLedgerService { - public constructor(private readonly hederaModuleConfig: HederaModuleConfig) {} + private readonly clientService: HederaClientService - public getHederaAnonCredsSdk(agentContext: AgentContext): HederaAnoncredsRegistry { - const cache = this.hederaModuleConfig.options.cache ?? new HederaLedgerServiceCache(agentContext) - return new HederaAnoncredsRegistry({ ...this.hederaModuleConfig.options, cache }) + public constructor(private readonly config: HederaModuleConfig) { + this.clientService = new HederaClientService(config.options) } - public getHederaDidSdk(_agentContext: AgentContext): HederaDidService { - return new HederaDidService({ ...this.hederaModuleConfig.options }) + /* Dids */ + + public async resolveDid(agentContext: AgentContext, did: string): Promise { + const topicReader = this.getHederaHcsTopicReader(agentContext) + return await resolveDID(did, 'application/ld+json;profile="https://w3id.org/did-resolution"', { topicReader }) + } + + public async createDid(agentContext: AgentContext, props?: NetworkName): Promise { + return this.clientService.withClient({ ...(props ?? {}) }, async (client: Client) => { + const topicReader = this.getHederaHcsTopicReader(agentContext) + return await createDID( + { + waitForDIDVisibility: false, + topicReader, + }, + { client } + ) + }) + } + + public async updateDid(agentContext: AgentContext, props: UpdateDIDOptions): Promise { + const { network: networkName } = parseDID(props.did) + return this.clientService.withClient({ networkName }, async (client: Client) => { + const topicReader = this.getHederaHcsTopicReader(agentContext) + return await updateDID( + { + ...props, + waitForDIDVisibility: false, + topicReader, + }, + { client } + ) + }) + } + + public async deactivateDid(agentContext: AgentContext, props: DeactivateDIDOptions): Promise { + const { network: networkName } = parseDID(props.did) + return this.clientService.withClient({ networkName }, async (client: Client) => { + const topicReader = this.getHederaHcsTopicReader(agentContext) + return await deactivateDID( + { + ...props, + waitForDIDVisibility: false, + topicReader, + }, + { client } + ) + }) + } + + /* Anoncreds*/ + + async getSchema(agentContext: AgentContext, schemaId: string): Promise { + const sdk = this.getHederaAnonCredsSdk(agentContext) + return await sdk.getSchema(schemaId) + } + + async registerSchema(agentContext: AgentContext, options: RegisterSchemaOptions): Promise { + const sdk = this.getHederaAnonCredsSdk(agentContext) + return await sdk.registerSchema(options) + } + + async getCredentialDefinition( + agentContext: AgentContext, + credentialDefinitionId: string + ): Promise { + const sdk = this.getHederaAnonCredsSdk(agentContext) + return await sdk.getCredentialDefinition(credentialDefinitionId) + } + + async registerCredentialDefinition( + agentContext: AgentContext, + options: RegisterCredentialDefinitionOptions + ): Promise { + const sdk = this.getHederaAnonCredsSdk(agentContext) + return await sdk.registerCredentialDefinition(options) + } + + async getRevocationRegistryDefinition( + agentContext: AgentContext, + revocationRegistryDefinitionId: string + ): Promise { + const sdk = this.getHederaAnonCredsSdk(agentContext) + return await sdk.getRevocationRegistryDefinition(revocationRegistryDefinitionId) + } + + async registerRevocationRegistryDefinition( + agentContext: AgentContext, + options: RegisterRevocationRegistryDefinitionOptions + ): Promise { + const sdk = this.getHederaAnonCredsSdk(agentContext) + return await sdk.registerRevocationRegistryDefinition(options) + } + + async getRevocationStatusList( + agentContext: AgentContext, + revocationRegistryId: string, + timestamp: number + ): Promise { + const sdk = this.getHederaAnonCredsSdk(agentContext) + return await sdk.getRevocationStatusList(revocationRegistryId, timestamp) + } + + async registerRevocationStatusList( + agentContext: AgentContext, + options: RegisterRevocationStatusListOptions + ): Promise { + const sdk = this.getHederaAnonCredsSdk(agentContext) + return await sdk.registerRevocationStatusList(options) + } + + private getHederaHcsTopicReader(agentContext: AgentContext): TopicReaderHederaHcs { + const cache = this.config.options.cache ?? new CredoCache(agentContext) + return new TopicReaderHederaHcs({ ...this.config.options, cache }) + } + + private getHederaAnonCredsSdk(agentContext: AgentContext): HederaAnoncredsRegistry { + const cache = this.config.options.cache ?? new CredoCache(agentContext) + return new HederaAnoncredsRegistry({ ...this.config.options, cache }) } } From d44440873494b5f9f1731d98cf32fc6503ac5664 Mon Sep 17 00:00:00 2001 From: "andrey.kononov" Date: Fri, 20 Jun 2025 15:39:12 +0300 Subject: [PATCH 52/89] Restore changes --- packages/anoncreds/src/services/tails/BasicTailsFileService.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/anoncreds/src/services/tails/BasicTailsFileService.ts b/packages/anoncreds/src/services/tails/BasicTailsFileService.ts index b76b738ca7..fe79190761 100644 --- a/packages/anoncreds/src/services/tails/BasicTailsFileService.ts +++ b/packages/anoncreds/src/services/tails/BasicTailsFileService.ts @@ -75,7 +75,7 @@ export class BasicTailsFileService implements TailsFileService { } protected async getTailsFilePath(agentContext: AgentContext, tailsHash: string) { - return `${await this.getTailsBasePath(agentContext)}/${tailsHash}`.replace(/\\/g, '/') + return `${await this.getTailsBasePath(agentContext)}/${tailsHash}` } protected async tailsFileExists(agentContext: AgentContext, tailsHash: string): Promise { From 5e721b81488cc739886e1c0cf01f38a53ab4a221 Mon Sep 17 00:00:00 2001 From: "andrey.kononov" Date: Fri, 20 Jun 2025 20:01:54 +0300 Subject: [PATCH 53/89] Fix issues --- packages/cheqd/package.json | 2 +- packages/hedera/package.json | 15 +- .../hedera/src/dids/HederaDidRegistrar.ts | 208 +++++++++--------- packages/hedera/src/dids/HederaDidResolver.ts | 1 + .../hedera/src/ledger/HederaLedgerService.ts | 60 ++--- packages/hedera/tests/HederaDid.e2e.test.ts | 2 - .../tests/HederaDidResolver.e2e.test.ts | 67 ++++++ 7 files changed, 212 insertions(+), 143 deletions(-) create mode 100644 packages/hedera/tests/HederaDidResolver.e2e.test.ts diff --git a/packages/cheqd/package.json b/packages/cheqd/package.json index c6140b8b62..04b3852bbc 100644 --- a/packages/cheqd/package.json +++ b/packages/cheqd/package.json @@ -24,7 +24,7 @@ "test": "jest" }, "dependencies": { - "@cheqd/sdk": "^5.2.1", + "@cheqd/sdk": "5.2.1", "@cheqd/ts-proto": "~2.4.1", "@cosmjs/crypto": "~0.30.1", "@cosmjs/proto-signing": "~0.30.1", diff --git a/packages/hedera/package.json b/packages/hedera/package.json index 96f73169d3..bc0976a97f 100644 --- a/packages/hedera/package.json +++ b/packages/hedera/package.json @@ -25,15 +25,16 @@ "@hashgraph/sdk": "^2.66.0", "@credo-ts/anoncreds": "workspace:*", "@credo-ts/core": "workspace:*", - "@hiero-did-sdk/anoncreds": "npm:@hiero-did-sdk/anoncreds@0.0.3", - "@hiero-did-sdk/registrar": "npm:@hiero-did-sdk/registrar@0.0.1", - "@hiero-did-sdk/resolver": "npm:@hiero-did-sdk/resolver@0.0.5", - "@hiero-did-sdk/core": "npm:@hiero-did-sdk/core@0.0.1", - "@hiero-did-sdk/client": "npm:@hiero-did-sdk/client@0.0.1", - "@hiero-did-sdk/hcs": "npm:@hiero-did-sdk/hcs@0.0.3" + "@hiero-did-sdk/anoncreds": "npm:@hiero-did-sdk/anoncreds@0.0.5", + "@hiero-did-sdk/registrar": "npm:@hiero-did-sdk/registrar@0.0.3", + "@hiero-did-sdk/resolver": "npm:@hiero-did-sdk/resolver@0.0.7", + "@hiero-did-sdk/core": "npm:@hiero-did-sdk/core@0.0.2", + "@hiero-did-sdk/client": "npm:@hiero-did-sdk/client@0.0.3", + "@hiero-did-sdk/hcs": "npm:@hiero-did-sdk/hcs@0.0.5" }, "devDependencies": { "@credo-ts/node": "workspace:*", - "@hyperledger/anoncreds-nodejs": "^0.3.1" + "@hyperledger/anoncreds-nodejs": "^0.3.1", + "rimraf": "^4.4.0" } } diff --git a/packages/hedera/src/dids/HederaDidRegistrar.ts b/packages/hedera/src/dids/HederaDidRegistrar.ts index 627ee46f38..8ab46d86de 100644 --- a/packages/hedera/src/dids/HederaDidRegistrar.ts +++ b/packages/hedera/src/dids/HederaDidRegistrar.ts @@ -56,9 +56,7 @@ export class HederaDidRegistrar implements DidRegistrar { const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) // Create did - const { did, didDocument } = await ledgerService.createDid(agentContext, { - networkName: options.options?.network, - }) + const { did, didDocument } = await ledgerService.createDid(agentContext, options.options?.network) // Save the did so we know we created it and can issue with it const credoDidDocument = new DidDocument({ @@ -99,109 +97,111 @@ export class HederaDidRegistrar implements DidRegistrar { } async update(agentContext: AgentContext, options: HederaDidUpdateOptions): Promise { - const didRepository = agentContext.dependencyManager.resolve(DidRepository) - const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) - - try { - const { did } = options - const { didDocument, didDocumentMetadata } = await ledgerService.resolveDid(agentContext, did) - const didRecord = await didRepository.findCreatedDid(agentContext, did) - if (!didDocument || didDocumentMetadata.deactivated || !didRecord) { - return { - didDocumentMetadata: {}, - didRegistrationMetadata: {}, - didState: { - state: 'failed', - reason: 'Did not found', - }, - } - } - - const { didDocument: updatedDidDocument } = await ledgerService.updateDid(agentContext, { - did, - updates: { - operation: , - // id: options., - // property: 'verificationMethod', - // publicKeyMultibase: 'z6MkkFf6yboMwr1LQVAHqatuGYD9foRe7L2wPkEn1A7LyoQb', - }, - privateKey: options.secret?.privateKey, - }) - - didRecord.didDocument = JsonTransformer.fromJSON(updatedDidDocument, DidDocument) - await didRepository.update(agentContext, didRecord) - - return { - didDocumentMetadata: {}, - didRegistrationMetadata: {}, - didState: { - state: 'finished', - did, - didDocument: didRecord.didDocument, - }, - } - } catch (error) { - agentContext.config.logger.error('Error updating DID', error) - return { - didDocumentMetadata: {}, - didRegistrationMetadata: {}, - didState: { - state: 'failed', - reason: `Unable update DID: ${error.message}`, - }, - } - } + throw new Error('Method not implemented.') + // const didRepository = agentContext.dependencyManager.resolve(DidRepository) + // const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) + // + // try { + // const { did } = options + // const { didDocument, didDocumentMetadata } = await ledgerService.resolveDid(agentContext, did) + // const didRecord = await didRepository.findCreatedDid(agentContext, did) + // if (!didDocument || didDocumentMetadata.deactivated || !didRecord) { + // return { + // didDocumentMetadata: {}, + // didRegistrationMetadata: {}, + // didState: { + // state: 'failed', + // reason: 'Did not found', + // }, + // } + // } + // + // const { didDocument: updatedDidDocument } = await ledgerService.updateDid(agentContext, { + // did, + // updates: { + // operation: , + // // id: options., + // // property: 'verificationMethod', + // // publicKeyMultibase: 'z6MkkFf6yboMwr1LQVAHqatuGYD9foRe7L2wPkEn1A7LyoQb', + // }, + // privateKey: options.secret?.privateKey, + // }) + // + // didRecord.didDocument = JsonTransformer.fromJSON(updatedDidDocument, DidDocument) + // await didRepository.update(agentContext, didRecord) + // + // return { + // didDocumentMetadata: {}, + // didRegistrationMetadata: {}, + // didState: { + // state: 'finished', + // did, + // didDocument: didRecord.didDocument, + // }, + // } + // } catch (error) { + // agentContext.config.logger.error('Error updating DID', error) + // return { + // didDocumentMetadata: {}, + // didRegistrationMetadata: {}, + // didState: { + // state: 'failed', + // reason: `Unable update DID: ${error.message}`, + // }, + // } + // } } async deactivate(agentContext: AgentContext, options: HederaDidDeactivateOptions): Promise { - const didRepository = agentContext.dependencyManager.resolve(DidRepository) - const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) - - const did = options.did - - try { - const { didDocument, didDocumentMetadata } = await ledgerService.resolveDid(agentContext, did) - - const didRecord = await didRepository.findCreatedDid(agentContext, did) - - if (!didDocument || didDocumentMetadata.deactivated || !didRecord) { - return { - didDocumentMetadata, - didRegistrationMetadata: {}, - didState: { - state: 'failed', - reason: 'Did not found', - }, - } - } - - const { didDocument: deactivatedDidDocument } = await ledgerService.deactivateDid(agentContext, { - did: options.did, - privateKey: options.secret?.privateKey, - }) - - didRecord.didDocument = JsonTransformer.fromJSON(deactivatedDidDocument, DidDocument) - await didRepository.update(agentContext, didRecord) - - return { - didDocumentMetadata: {}, - didRegistrationMetadata: {}, - didState: { - state: 'finished', - did, - didDocument: didRecord.didDocument, - }, - } - } catch (error) { - agentContext.config.logger.error('Error deactivating DID', error) - return { - didDocumentMetadata: {}, - didRegistrationMetadata: {}, - didState: { - state: 'failed', - reason: `Unable deactivating DID: ${error.message}`, - }, - } - } + throw new Error('Method not implemented.') + // const didRepository = agentContext.dependencyManager.resolve(DidRepository) + // const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) + // + // const did = options.did + // + // try { + // const { didDocument, didDocumentMetadata } = await ledgerService.resolveDid(agentContext, did) + // + // const didRecord = await didRepository.findCreatedDid(agentContext, did) + // + // if (!didDocument || didDocumentMetadata.deactivated || !didRecord) { + // return { + // didDocumentMetadata, + // didRegistrationMetadata: {}, + // didState: { + // state: 'failed', + // reason: 'Did not found', + // }, + // } + // } + // + // const { didDocument: deactivatedDidDocument } = await ledgerService.deactivateDid(agentContext, { + // did: options.did, + // privateKey: options.secret?.privateKey, + // }) + // + // didRecord.didDocument = JsonTransformer.fromJSON(deactivatedDidDocument, DidDocument) + // await didRepository.update(agentContext, didRecord) + // + // return { + // didDocumentMetadata: {}, + // didRegistrationMetadata: {}, + // didState: { + // state: 'finished', + // did, + // didDocument: didRecord.didDocument, + // }, + // } + // } catch (error) { + // agentContext.config.logger.error('Error deactivating DID', error) + // return { + // didDocumentMetadata: {}, + // didRegistrationMetadata: {}, + // didState: { + // state: 'failed', + // reason: `Unable deactivating DID: ${error.message}`, + // }, + // } + // } } } diff --git a/packages/hedera/src/dids/HederaDidResolver.ts b/packages/hedera/src/dids/HederaDidResolver.ts index 3dc00f4e6a..5e4bd1194f 100644 --- a/packages/hedera/src/dids/HederaDidResolver.ts +++ b/packages/hedera/src/dids/HederaDidResolver.ts @@ -20,6 +20,7 @@ export class HederaDidResolver implements DidResolver { _parsed: ParsedDid, _didResolutionOptions: DidResolutionOptions ): Promise { + try { agentContext.config.logger.trace('Try to resolve a did document from ledger') const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) diff --git a/packages/hedera/src/ledger/HederaLedgerService.ts b/packages/hedera/src/ledger/HederaLedgerService.ts index fba3693935..6cca1c1d8c 100644 --- a/packages/hedera/src/ledger/HederaLedgerService.ts +++ b/packages/hedera/src/ledger/HederaLedgerService.ts @@ -1,3 +1,5 @@ +import {HederaAnoncredsRegistry} from "@hiero-did-sdk/anoncreds"; +import {HederaClientService} from "@hiero-did-sdk/client"; import type { GetCredentialDefinitionReturn, GetRevocationRegistryDefinitionReturn, @@ -13,9 +15,6 @@ import type { RegisterSchemaReturn, } from '@credo-ts/anoncreds' import { type AgentContext, injectable } from '@credo-ts/core' -import { Client } from '@hashgraph/sdk' -import { HederaAnoncredsRegistry } from '@hiero-did-sdk/anoncreds' -import { HederaClientService, NetworkName } from '@hiero-did-sdk/client' import { DIDResolution } from '@hiero-did-sdk/core' import { CreateDIDResult, @@ -30,6 +29,7 @@ import { import { TopicReaderHederaHcs, parseDID, resolveDID } from '@hiero-did-sdk/resolver' import { HederaModuleConfig } from '../HederaModuleConfig' import { CredoCache } from '../cache/CredoCache' +import {Client} from "@hashgraph/sdk"; @injectable() export class HederaLedgerService { @@ -46,8 +46,8 @@ export class HederaLedgerService { return await resolveDID(did, 'application/ld+json;profile="https://w3id.org/did-resolution"', { topicReader }) } - public async createDid(agentContext: AgentContext, props?: NetworkName): Promise { - return this.clientService.withClient({ ...(props ?? {}) }, async (client: Client) => { + public async createDid(agentContext: AgentContext, network?: string): Promise { + return this.clientService.withClient({ networkName: network }, async (client: Client) => { const topicReader = this.getHederaHcsTopicReader(agentContext) return await createDID( { @@ -60,33 +60,35 @@ export class HederaLedgerService { } public async updateDid(agentContext: AgentContext, props: UpdateDIDOptions): Promise { - const { network: networkName } = parseDID(props.did) - return this.clientService.withClient({ networkName }, async (client: Client) => { - const topicReader = this.getHederaHcsTopicReader(agentContext) - return await updateDID( - { - ...props, - waitForDIDVisibility: false, - topicReader, - }, - { client } - ) - }) + throw new Error('Method not implemented.') + // const { network: networkName } = parseDID(props.did) + // return this.clientService.withClient({ networkName }, async (client: Client) => { + // const topicReader = this.getHederaHcsTopicReader(agentContext) + // return await updateDID( + // { + // ...props, + // waitForDIDVisibility: false, + // topicReader, + // }, + // { client } + // ) + // }) } public async deactivateDid(agentContext: AgentContext, props: DeactivateDIDOptions): Promise { - const { network: networkName } = parseDID(props.did) - return this.clientService.withClient({ networkName }, async (client: Client) => { - const topicReader = this.getHederaHcsTopicReader(agentContext) - return await deactivateDID( - { - ...props, - waitForDIDVisibility: false, - topicReader, - }, - { client } - ) - }) + throw new Error('Method not implemented.') + // const { network: networkName } = parseDID(props.did) + // return this.clientService.withClient({ networkName }, async (client: Client) => { + // const topicReader = this.getHederaHcsTopicReader(agentContext) + // return await deactivateDID( + // { + // ...props, + // waitForDIDVisibility: false, + // topicReader, + // }, + // { client } + // ) + // }) } /* Anoncreds*/ diff --git a/packages/hedera/tests/HederaDid.e2e.test.ts b/packages/hedera/tests/HederaDid.e2e.test.ts index 597c61bf70..aa3a19946d 100644 --- a/packages/hedera/tests/HederaDid.e2e.test.ts +++ b/packages/hedera/tests/HederaDid.e2e.test.ts @@ -3,8 +3,6 @@ import { getHederaAgent, waitTimeout } from './utils' const logger = new ConsoleLogger(LogLevel.error) -//const did = 'did:hedera:testnet:zGdjMu1hPkjbJXSPPp6RgTptnpYYM9uEkPeNbPhSkXTon_0.0.5139753' - describe('Hedera Module did resolver', () => { let agent: Agent diff --git a/packages/hedera/tests/HederaDidResolver.e2e.test.ts b/packages/hedera/tests/HederaDidResolver.e2e.test.ts new file mode 100644 index 0000000000..bd9768e82c --- /dev/null +++ b/packages/hedera/tests/HederaDidResolver.e2e.test.ts @@ -0,0 +1,67 @@ +import { Agent, ConsoleLogger, JsonTransformer, LogLevel } from '@credo-ts/core' +import { HederaDidRegistrar } from '../src/dids' +import { HederaDidCreateOptions } from '../src/dids/HederaDidRegistrar' +import {getHederaAgent, waitTimeout} from './utils' + +describe('Hedera DID resolver', () => { + const logger = new ConsoleLogger(LogLevel.error) + + let agent: Agent + let did: string + + beforeAll(async () => { + agent = getHederaAgent({ + logger, + label: 'alice', + }) + await agent.initialize() + + const _didRegistrar = agent.dependencyManager.resolve(HederaDidRegistrar) + + const didResult = await agent.dids.create({ method: 'hedera' }) + + await waitTimeout(3000) + + if (!didResult.didState.did) { + throw new Error('No DID created') + } + did = didResult.didState.did + }) + + afterAll(async () => { + await agent.shutdown() + }) + + it('should resolve a did:cheqd did from local testnet', async () => { + const resolveResult = await agent.dids.resolve(did) + expect(JsonTransformer.toJSON(resolveResult)).toMatchObject({ + didDocument: { + '@context': ['https://www.w3.org/ns/did/v1', 'https://w3id.org/security/suites/jws-2020/v1'], + id: did, + controller: [did], + verificationMethod: [ + { + controller: did, + id: `${did}#key-1`, + publicKeyJwk: { + kty: 'OKP', + crv: 'Ed25519', + x: expect.any(String), + }, + type: 'JsonWebKey2020', + }, + ], + authentication: [`${did}#key-1`], + }, + didDocumentMetadata: { + created: expect.any(String), + updated: undefined, + deactivated: false, + versionId: expect.any(String), + nextVersionId: '', + }, + didResolutionMetadata: {}, + }) + }) + +}) From 5dfd681f13a807035695ec27f58fd1029b248ea5 Mon Sep 17 00:00:00 2001 From: "andrey.kononov" Date: Tue, 24 Jun 2025 19:01:24 +0300 Subject: [PATCH 54/89] Added signature on createDid Implemented deactivateDid method Add resolveDid e2e-test Add createDid e2e-test Add deactivateDid e2e-test --- packages/hedera/package.json | 10 +- .../hedera/src/dids/HederaDidRegistrar.ts | 106 ++++----- packages/hedera/src/dids/HederaDidResolver.ts | 8 - .../hedera/src/ledger/HederaLedgerService.ts | 75 +++++-- packages/hedera/tests/HederaDid.e2e.test.ts | 34 --- .../tests/HederaDidRegistrar.e2e.test.ts | 94 ++++++++ .../tests/HederaDidResolver.e2e.test.ts | 32 +-- .../hedera/tests/HederaW3cFlow.e2e.test.ts | 204 ------------------ 8 files changed, 215 insertions(+), 348 deletions(-) delete mode 100644 packages/hedera/tests/HederaDid.e2e.test.ts create mode 100644 packages/hedera/tests/HederaDidRegistrar.e2e.test.ts delete mode 100644 packages/hedera/tests/HederaW3cFlow.e2e.test.ts diff --git a/packages/hedera/package.json b/packages/hedera/package.json index bc0976a97f..9626ac854d 100644 --- a/packages/hedera/package.json +++ b/packages/hedera/package.json @@ -19,18 +19,20 @@ "clean": "rimraf ./build", "compile": "tsc -p tsconfig.build.json", "prepublishOnly": "pnpm run build", - "test": "jest" + "test": "jest", + "style:check": "biome check --unsafe", + "style:fix": "biome check --write --unsafe" }, "dependencies": { "@hashgraph/sdk": "^2.66.0", "@credo-ts/anoncreds": "workspace:*", "@credo-ts/core": "workspace:*", "@hiero-did-sdk/anoncreds": "npm:@hiero-did-sdk/anoncreds@0.0.5", - "@hiero-did-sdk/registrar": "npm:@hiero-did-sdk/registrar@0.0.3", - "@hiero-did-sdk/resolver": "npm:@hiero-did-sdk/resolver@0.0.7", + "@hiero-did-sdk/registrar": "npm:@hiero-did-sdk/registrar@0.0.7", + "@hiero-did-sdk/resolver": "npm:@hiero-did-sdk/resolver@0.0.9", "@hiero-did-sdk/core": "npm:@hiero-did-sdk/core@0.0.2", "@hiero-did-sdk/client": "npm:@hiero-did-sdk/client@0.0.3", - "@hiero-did-sdk/hcs": "npm:@hiero-did-sdk/hcs@0.0.5" + "@hiero-did-sdk/hcs": "npm:@hiero-did-sdk/hcs@0.0.8" }, "devDependencies": { "@credo-ts/node": "workspace:*", diff --git a/packages/hedera/src/dids/HederaDidRegistrar.ts b/packages/hedera/src/dids/HederaDidRegistrar.ts index 8ab46d86de..62cb2a7f36 100644 --- a/packages/hedera/src/dids/HederaDidRegistrar.ts +++ b/packages/hedera/src/dids/HederaDidRegistrar.ts @@ -56,7 +56,10 @@ export class HederaDidRegistrar implements DidRegistrar { const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) // Create did - const { did, didDocument } = await ledgerService.createDid(agentContext, options.options?.network) + const { did, didDocument } = await ledgerService.createDid(agentContext, { + network: options.options?.network, + privateKey: options.secret?.privateKey, + }) // Save the did so we know we created it and can issue with it const credoDidDocument = new DidDocument({ @@ -96,7 +99,7 @@ export class HederaDidRegistrar implements DidRegistrar { } } - async update(agentContext: AgentContext, options: HederaDidUpdateOptions): Promise { + async update(_agentContext: AgentContext, _options: HederaDidUpdateOptions): Promise { throw new Error('Method not implemented.') // const didRepository = agentContext.dependencyManager.resolve(DidRepository) // const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) @@ -153,55 +156,54 @@ export class HederaDidRegistrar implements DidRegistrar { } async deactivate(agentContext: AgentContext, options: HederaDidDeactivateOptions): Promise { - throw new Error('Method not implemented.') - // const didRepository = agentContext.dependencyManager.resolve(DidRepository) - // const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) - // - // const did = options.did - // - // try { - // const { didDocument, didDocumentMetadata } = await ledgerService.resolveDid(agentContext, did) - // - // const didRecord = await didRepository.findCreatedDid(agentContext, did) - // - // if (!didDocument || didDocumentMetadata.deactivated || !didRecord) { - // return { - // didDocumentMetadata, - // didRegistrationMetadata: {}, - // didState: { - // state: 'failed', - // reason: 'Did not found', - // }, - // } - // } - // - // const { didDocument: deactivatedDidDocument } = await ledgerService.deactivateDid(agentContext, { - // did: options.did, - // privateKey: options.secret?.privateKey, - // }) - // - // didRecord.didDocument = JsonTransformer.fromJSON(deactivatedDidDocument, DidDocument) - // await didRepository.update(agentContext, didRecord) - // - // return { - // didDocumentMetadata: {}, - // didRegistrationMetadata: {}, - // didState: { - // state: 'finished', - // did, - // didDocument: didRecord.didDocument, - // }, - // } - // } catch (error) { - // agentContext.config.logger.error('Error deactivating DID', error) - // return { - // didDocumentMetadata: {}, - // didRegistrationMetadata: {}, - // didState: { - // state: 'failed', - // reason: `Unable deactivating DID: ${error.message}`, - // }, - // } - // } + const didRepository = agentContext.dependencyManager.resolve(DidRepository) + const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) + + const did = options.did + + try { + const { didDocument, didDocumentMetadata } = await ledgerService.resolveDid(agentContext, did) + + const didRecord = await didRepository.findCreatedDid(agentContext, did) + + if (!didDocument || didDocumentMetadata.deactivated || !didRecord) { + return { + didDocumentMetadata, + didRegistrationMetadata: {}, + didState: { + state: 'failed', + reason: 'Did not found', + }, + } + } + + const { didDocument: deactivatedDidDocument } = await ledgerService.deactivateDid(agentContext, { + did: options.did, + privateKey: options.secret?.privateKey, + }) + + didRecord.didDocument = JsonTransformer.fromJSON(deactivatedDidDocument, DidDocument) + await didRepository.update(agentContext, didRecord) + + return { + didDocumentMetadata: {}, + didRegistrationMetadata: {}, + didState: { + state: 'finished', + did, + didDocument: didRecord.didDocument, + }, + } + } catch (error) { + agentContext.config.logger.error('Error deactivating DID', error) + return { + didDocumentMetadata: {}, + didRegistrationMetadata: {}, + didState: { + state: 'failed', + reason: `Unable deactivating DID: ${error.message}`, + }, + } + } } } diff --git a/packages/hedera/src/dids/HederaDidResolver.ts b/packages/hedera/src/dids/HederaDidResolver.ts index 5e4bd1194f..c978f19ca0 100644 --- a/packages/hedera/src/dids/HederaDidResolver.ts +++ b/packages/hedera/src/dids/HederaDidResolver.ts @@ -20,23 +20,15 @@ export class HederaDidResolver implements DidResolver { _parsed: ParsedDid, _didResolutionOptions: DidResolutionOptions ): Promise { - try { agentContext.config.logger.trace('Try to resolve a did document from ledger') const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) const resolveDidResult = await ledgerService.resolveDid(agentContext, did) - // const updatedContextDidJson = { - // ...resolveDidResult.didDocument, - // '@context': ['https://www.w3.org/ns/did/v1', 'https://w3id.org/security/suites/ed25519-2018/v1'], - // } const didDocument = JsonTransformer.fromJSON(resolveDidResult.didDocument, DidDocument) return { didDocument, didDocumentMetadata: resolveDidResult.didDocumentMetadata, didResolutionMetadata: resolveDidResult.didResolutionMetadata, - // { - // contentType: 'application/did+json', - // }, } } catch (error) { agentContext.config.logger.debug('Error resolving the did', { diff --git a/packages/hedera/src/ledger/HederaLedgerService.ts b/packages/hedera/src/ledger/HederaLedgerService.ts index 6cca1c1d8c..cfdb60c3f9 100644 --- a/packages/hedera/src/ledger/HederaLedgerService.ts +++ b/packages/hedera/src/ledger/HederaLedgerService.ts @@ -1,5 +1,3 @@ -import {HederaAnoncredsRegistry} from "@hiero-did-sdk/anoncreds"; -import {HederaClientService} from "@hiero-did-sdk/client"; import type { GetCredentialDefinitionReturn, GetRevocationRegistryDefinitionReturn, @@ -15,7 +13,11 @@ import type { RegisterSchemaReturn, } from '@credo-ts/anoncreds' import { type AgentContext, injectable } from '@credo-ts/core' -import { DIDResolution } from '@hiero-did-sdk/core' +import { Client, PrivateKey } from '@hashgraph/sdk' +import { HederaAnoncredsRegistry } from '@hiero-did-sdk/anoncreds' +import { HederaClientService } from '@hiero-did-sdk/client' +import { HederaNetwork } from '@hiero-did-sdk/client/dist/index' +import { DIDResolution, KeysUtility } from '@hiero-did-sdk/core' import { CreateDIDResult, DeactivateDIDOptions, @@ -24,12 +26,17 @@ import { UpdateDIDResult, createDID, deactivateDID, - updateDID, + generateCreateDIDRequest, + submitCreateDIDRequest, } from '@hiero-did-sdk/registrar' import { TopicReaderHederaHcs, parseDID, resolveDID } from '@hiero-did-sdk/resolver' import { HederaModuleConfig } from '../HederaModuleConfig' import { CredoCache } from '../cache/CredoCache' -import {Client} from "@hashgraph/sdk"; + +export interface HederaLedgerServiceDidCreateOptions { + network?: HederaNetwork | string + privateKey?: string | PrivateKey | undefined +} @injectable() export class HederaLedgerService { @@ -46,9 +53,35 @@ export class HederaLedgerService { return await resolveDID(did, 'application/ld+json;profile="https://w3id.org/did-resolution"', { topicReader }) } - public async createDid(agentContext: AgentContext, network?: string): Promise { - return this.clientService.withClient({ networkName: network }, async (client: Client) => { + public async createDid( + agentContext: AgentContext, + options: HederaLedgerServiceDidCreateOptions + ): Promise { + return this.clientService.withClient({ networkName: options.network }, async (client: Client) => { const topicReader = this.getHederaHcsTopicReader(agentContext) + + if (options.privateKey) { + const rootKey = + options.privateKey instanceof PrivateKey + ? options.privateKey + : PrivateKey.fromStringED25519(options.privateKey) + const publicMultibaseRootKey = KeysUtility.fromPublicKey(rootKey.publicKey).toMultibase() + const { state, signingRequest } = await generateCreateDIDRequest( + { + multibasePublicKey: publicMultibaseRootKey, + }, + { + client, + } + ) + const signature = rootKey.sign(signingRequest.serializedPayload) + return await submitCreateDIDRequest( + { state, signature, waitForDIDVisibility: false }, + { + client, + } + ) + } return await createDID( { waitForDIDVisibility: false, @@ -59,7 +92,7 @@ export class HederaLedgerService { }) } - public async updateDid(agentContext: AgentContext, props: UpdateDIDOptions): Promise { + public async updateDid(_agentContext: AgentContext, _props: UpdateDIDOptions): Promise { throw new Error('Method not implemented.') // const { network: networkName } = parseDID(props.did) // return this.clientService.withClient({ networkName }, async (client: Client) => { @@ -76,19 +109,19 @@ export class HederaLedgerService { } public async deactivateDid(agentContext: AgentContext, props: DeactivateDIDOptions): Promise { - throw new Error('Method not implemented.') - // const { network: networkName } = parseDID(props.did) - // return this.clientService.withClient({ networkName }, async (client: Client) => { - // const topicReader = this.getHederaHcsTopicReader(agentContext) - // return await deactivateDID( - // { - // ...props, - // waitForDIDVisibility: false, - // topicReader, - // }, - // { client } - // ) - // }) + const { network: networkName } = parseDID(props.did) + return this.clientService.withClient({ networkName }, async (client: Client) => { + const topicReader = this.getHederaHcsTopicReader(agentContext) + return await deactivateDID( + { + did: props.did, + privateKey: props.privateKey, + waitForDIDVisibility: false, + topicReader, + }, + { client } + ) + }) } /* Anoncreds*/ diff --git a/packages/hedera/tests/HederaDid.e2e.test.ts b/packages/hedera/tests/HederaDid.e2e.test.ts deleted file mode 100644 index aa3a19946d..0000000000 --- a/packages/hedera/tests/HederaDid.e2e.test.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { Agent, ConsoleLogger, LogLevel } from '@credo-ts/core' -import { getHederaAgent, waitTimeout } from './utils' - -const logger = new ConsoleLogger(LogLevel.error) - -describe('Hedera Module did resolver', () => { - let agent: Agent - - beforeAll(async () => { - agent = getHederaAgent({ - logger, - label: 'alice', - }) - await agent.initialize() - }) - - afterAll(async () => { - // Wait for messages to flush out - await waitTimeout(1000) - - if (agent) { - await agent.shutdown() - } - }) - - describe('HederaDidResolver', () => { - it('should creaste and resolve a hedera did', async () => { - const didResult = await agent.dids.create({ method: 'hedera' }) - await waitTimeout(2000) - const resolvedDIDDoc = await agent.dids.resolve(didResult.didState.did ?? '') - expect(resolvedDIDDoc.didDocument?.id).toEqual(didResult.didState.did) - }) - }) -}) diff --git a/packages/hedera/tests/HederaDidRegistrar.e2e.test.ts b/packages/hedera/tests/HederaDidRegistrar.e2e.test.ts new file mode 100644 index 0000000000..152ef60f02 --- /dev/null +++ b/packages/hedera/tests/HederaDidRegistrar.e2e.test.ts @@ -0,0 +1,94 @@ +import { Agent, ConsoleLogger, LogLevel } from '@credo-ts/core' +import { HederaDidCreateOptions, HederaDidDeactivateOptions } from '../src/dids/HederaDidRegistrar' +import { getHederaAgent, waitTimeout } from './utils' + +describe('Hedera DID registrar', () => { + const consensusTimeout = 2000 + const operatorKey = process.env.HEDERA_TEST_OPERATOR_KEY ?? '' + + const logger = new ConsoleLogger(LogLevel.error) + + let agent: Agent + + beforeAll(async () => { + agent = getHederaAgent({ + logger, + label: 'alice', + }) + await agent.initialize() + }) + + afterAll(async () => { + await agent.shutdown() + }) + + it('should create a did:hedera did', async () => { + const didResult = await agent.dids.create({ + method: 'hedera', + options: { network: 'testnet' }, + }) + expect(didResult).toMatchObject({ + didState: { + state: 'finished', + didDocument: { + verificationMethod: [ + { + type: 'Ed25519VerificationKey2020', + publicKeyMultibase: expect.any(String), + }, + ], + }, + }, + }) + }) + + it('should create and add service to a did:hedera did', async () => { + const didResult = await agent.dids.create({ + method: 'hedera', + options: { network: 'testnet' }, + }) + expect(didResult).toMatchObject({ didState: { state: 'finished' } }) + }) + + it('should create and add verification to a did:hedera did', async () => { + const didResult = await agent.dids.create({ + method: 'hedera', + options: { network: 'testnet' }, + }) + expect(didResult).toMatchObject({ didState: { state: 'finished' } }) + }) + + it('should create and deactivate a did:hedera did', async () => { + const didResult = await agent.dids.create({ + method: 'hedera', + options: { + network: 'testnet', + }, + secret: { + privateKey: operatorKey, + }, + }) + expect(didResult).toMatchObject({ didState: { state: 'finished' } }) + + const did = didResult.didState.did! + + await waitTimeout(consensusTimeout) + + const deactivateResult = await agent.dids.deactivate({ + did, + secret: { + privateKey: operatorKey, + }, + }) + + expect(deactivateResult.didState.didDocument?.id).toEqual(did) + expect(deactivateResult.didState.state).toEqual('finished') + + await waitTimeout(consensusTimeout) + + const resolvedDocument = await agent.dids.resolve(did, { + useLocalCreatedDidRecord: false, + }) + expect(resolvedDocument.didDocumentMetadata.deactivated).toBe(true) + }) +}) diff --git a/packages/hedera/tests/HederaDidResolver.e2e.test.ts b/packages/hedera/tests/HederaDidResolver.e2e.test.ts index bd9768e82c..b3546970b7 100644 --- a/packages/hedera/tests/HederaDidResolver.e2e.test.ts +++ b/packages/hedera/tests/HederaDidResolver.e2e.test.ts @@ -1,7 +1,6 @@ import { Agent, ConsoleLogger, JsonTransformer, LogLevel } from '@credo-ts/core' -import { HederaDidRegistrar } from '../src/dids' import { HederaDidCreateOptions } from '../src/dids/HederaDidRegistrar' -import {getHederaAgent, waitTimeout} from './utils' +import { getHederaAgent } from './utils' describe('Hedera DID resolver', () => { const logger = new ConsoleLogger(LogLevel.error) @@ -16,12 +15,7 @@ describe('Hedera DID resolver', () => { }) await agent.initialize() - const _didRegistrar = agent.dependencyManager.resolve(HederaDidRegistrar) - const didResult = await agent.dids.create({ method: 'hedera' }) - - await waitTimeout(3000) - if (!didResult.didState.did) { throw new Error('No DID created') } @@ -36,32 +30,20 @@ describe('Hedera DID resolver', () => { const resolveResult = await agent.dids.resolve(did) expect(JsonTransformer.toJSON(resolveResult)).toMatchObject({ didDocument: { - '@context': ['https://www.w3.org/ns/did/v1', 'https://w3id.org/security/suites/jws-2020/v1'], + '@context': ['https://www.w3.org/ns/did/v1'], id: did, - controller: [did], + controller: did, verificationMethod: [ { controller: did, - id: `${did}#key-1`, - publicKeyJwk: { - kty: 'OKP', - crv: 'Ed25519', - x: expect.any(String), - }, - type: 'JsonWebKey2020', + id: `${did}#did-root-key`, + type: 'Ed25519VerificationKey2020', + publicKeyMultibase: expect.any(String), }, ], - authentication: [`${did}#key-1`], - }, - didDocumentMetadata: { - created: expect.any(String), - updated: undefined, - deactivated: false, - versionId: expect.any(String), - nextVersionId: '', }, + didDocumentMetadata: {}, didResolutionMetadata: {}, }) }) - }) diff --git a/packages/hedera/tests/HederaW3cFlow.e2e.test.ts b/packages/hedera/tests/HederaW3cFlow.e2e.test.ts deleted file mode 100644 index e4e217b2cf..0000000000 --- a/packages/hedera/tests/HederaW3cFlow.e2e.test.ts +++ /dev/null @@ -1,204 +0,0 @@ -import { Agent } from '@credo-ts/core' - -import { - ClaimFormat, - ConsoleLogger, - CredentialIssuancePurpose, - CredoError, - JsonTransformer, - LogLevel, - W3cCredential, - W3cJsonLdVerifiableCredential, - W3cJsonLdVerifiablePresentation, - W3cPresentation, - vcLibraries, -} from '@credo-ts/core' - -import { W3C_FIXTURES } from './fixtures' -import { getHederaAgent, waitTimeout } from './utils' - -const { jsonldSignatures } = vcLibraries -const { purposes } = jsonldSignatures - -const logger = new ConsoleLogger(LogLevel.error) - -//let did: string -//const did = 'did:hedera:testnet:zQDui45JN8tAZyc8aNcgcDp26wPJgVyQnw1wupqaqexKGWgsuMVfgzKmGfyg8fWPt_0.0.5139447' -const did = 'did:hedera:testnet:zGdjMu1hPkjbJXSPPp6RgTptnpYYM9uEkPeNbPhSkXTon_0.0.5139753' - -const _seed = '11011000010000111011001100010100' -// const holderSeed = '00000000000000000000000000holder' - -describe('Hedera Module did resolver', () => { - let aliceAgent: Agent - let faberAgent: Agent - - beforeAll(async () => { - // Initialize alice - aliceAgent = getHederaAgent({ - logger, - label: 'alice', - }) - await aliceAgent.initialize() - - // Initialize faber - faberAgent = getHederaAgent({ - logger, - label: 'faber', - }) - await faberAgent.initialize() - - // // Making the test did - // const didRegistrarResult = await faberAgent.dids.create({ - // method: 'hedera', - // secret: { - // seed, - // }, - // }) - // if (!didRegistrarResult.didState?.didDocument?.id) throw new Error('DidRegistrarError') - // - // did = didRegistrarResult.didState.didDocument.id - }) - - afterAll(async () => { - // Wait for messages to flush out - await waitTimeout(1000) - - if (aliceAgent) { - await aliceAgent.shutdown() - } - - if (faberAgent) { - await faberAgent.shutdown() - } - }) - - describe('W3C Issuance and Verification', () => { - let issuerDid: string - let verificationMethod: string - - beforeAll(async () => { - //const seedBuffer = TypedArrayEncoder.fromString(seed) - //await faberAgent.wallet.createKey({ keyType: KeyType.Ed25519, seed: seedBuffer }) - - const _didDoc = await faberAgent.dids.resolve(did) - - issuerDid = did - verificationMethod = `${issuerDid}#key-1` - - // create did:key for holder - await aliceAgent.dids.create({ - method: 'key', - // options: { - // keyType: KeyType.Ed25519, - // }, - //seed: TypedArrayEncoder.fromString(holderSeed), - }) - }) - - describe('signCredential', () => { - it('should return a successfully signed credential', async () => { - const credentialJson = W3C_FIXTURES.TEST_LD_DOCUMENT - credentialJson.issuer = issuerDid - - const credential = JsonTransformer.fromJSON(credentialJson, W3cCredential) - - const vc = await faberAgent.w3cCredentials.signCredential({ - format: ClaimFormat.LdpVc, - credential, - proofType: 'Ed25519Signature2018', - verificationMethod, - }) - - expect(vc).toBeInstanceOf(W3cJsonLdVerifiableCredential) - expect(vc.issuer).toEqual(issuerDid) - expect(Array.isArray(vc.proof)).toBe(false) - //expect(vc.proof).toBeInstanceOf(LinkedDataProof) - - //vc.proof = vc.proof as any//LinkedDataProof - expect((vc.proof as any).verificationMethod).toEqual(verificationMethod) - }) - - it('should throw because of verificationMethod does not belong to this wallet', async () => { - const credentialJson = W3C_FIXTURES.TEST_LD_DOCUMENT - credentialJson.issuer = issuerDid - - const credential = JsonTransformer.fromJSON(credentialJson, W3cCredential) - - expect(async () => { - await faberAgent.w3cCredentials.signCredential({ - format: ClaimFormat.LdpVc, - credential, - proofType: 'Ed25519Signature2018', - verificationMethod: - 'did:hedera:testnet:zGdjMu1hPkjbJXSPPp6RgTptnpYYM9uEkPeNbPhSkXTon_0.0.5139619#did-root-key', - }) - }).rejects.toThrow(CredoError) - }) - }) - - describe('verifyCredential', () => { - it('should verify the credential successfully', async () => { - const result = await aliceAgent.w3cCredentials.verifyCredential({ - credential: JsonTransformer.fromJSON(W3C_FIXTURES.TEST_LD_DOCUMENT_SIGNED, W3cJsonLdVerifiableCredential), - proofPurpose: new purposes.AssertionProofPurpose(), - }) - - expect(result.isValid).toEqual(true) - }) - - it('should fail because of invalid signature', async () => { - const vc = JsonTransformer.fromJSON(W3C_FIXTURES.TEST_LD_DOCUMENT_BAD_SIGNED, W3cJsonLdVerifiableCredential) - const result = await aliceAgent.w3cCredentials.verifyCredential({ credential: vc }) - - expect(result).toEqual({ - isValid: false, - error: expect.any(Error), - validations: { - vcJs: { - error: expect.any(Error), - isValid: false, - results: expect.any(Array), - }, - }, - }) - }) - }) - - describe('signPresentation', () => { - it('should successfully create a presentation from single verifiable credential', async () => { - const presentation = JsonTransformer.fromJSON(W3C_FIXTURES.TEST_VP_DOCUMENT, W3cPresentation) - - const purpose = new CredentialIssuancePurpose({ - controller: { - id: verificationMethod, - }, - date: new Date().toISOString(), - }) - - const verifiablePresentation = await faberAgent.w3cCredentials.signPresentation({ - format: ClaimFormat.LdpVp, - presentation: presentation, - proofPurpose: purpose, - proofType: 'Ed25519Signature2018', - challenge: '7bf32d0b-39d4-41f3-96b6-45de52988e4c', - domain: 'issuer.example.com', - verificationMethod: verificationMethod, - }) - - expect(verifiablePresentation).toBeInstanceOf(W3cJsonLdVerifiablePresentation) - }) - }) - - describe('verifyPresentation', () => { - it('should successfully verify a presentation containing a single verifiable credential', async () => { - const vp = JsonTransformer.fromJSON(W3C_FIXTURES.TEST_VP_DOCUMENT_SIGNED, W3cJsonLdVerifiablePresentation) - const result = await faberAgent.w3cCredentials.verifyPresentation({ - presentation: vp, - challenge: '7bf32d0b-39d4-41f3-96b6-45de52988e4c', - }) - expect(result.isValid).toBe(true) - }) - }) - }) -}) From 1dc9aad2dca789237a11bc82331c806af746d2ad Mon Sep 17 00:00:00 2001 From: "andrey.kononov" Date: Wed, 25 Jun 2025 21:54:26 +0300 Subject: [PATCH 55/89] Implemented updateDid method Add updateDid e2e-test Debug and fix issues --- .../hedera/src/dids/HederaDidRegistrar.ts | 156 ++++----- .../hedera/src/ledger/HederaLedgerService.ts | 302 ++++++++++++++---- .../tests/HederaAnoncredsRegistry.e2e.test.ts | 10 +- .../tests/HederaDidRegistrar.e2e.test.ts | 215 ++++++++++++- .../tests/HederaDidResolver.e2e.test.ts | 5 +- packages/hedera/tests/fixtures/fixtures.ts | 182 ----------- packages/hedera/tests/fixtures/index.ts | 1 - 7 files changed, 511 insertions(+), 360 deletions(-) delete mode 100644 packages/hedera/tests/fixtures/fixtures.ts delete mode 100644 packages/hedera/tests/fixtures/index.ts diff --git a/packages/hedera/src/dids/HederaDidRegistrar.ts b/packages/hedera/src/dids/HederaDidRegistrar.ts index 62cb2a7f36..1c45d6bc06 100644 --- a/packages/hedera/src/dids/HederaDidRegistrar.ts +++ b/packages/hedera/src/dids/HederaDidRegistrar.ts @@ -1,8 +1,6 @@ import { AgentContext, - DidCreateOptions, DidCreateResult, - DidDeactivateOptions, DidDeactivateResult, DidDocument, DidDocumentRole, @@ -10,40 +8,15 @@ import { DidRecord, DidRegistrar, DidRepository, - DidUpdateOptions, DidUpdateResult, JsonTransformer, } from '@credo-ts/core' -import { HederaLedgerService } from '../ledger/HederaLedgerService' - -import { PrivateKey } from '@hashgraph/sdk' -import { HederaNetwork } from '@hiero-did-sdk/client' - -export interface HederaDidCreateOptions extends DidCreateOptions { - method: 'hedera' - did?: string - didDocument?: DidDocument - secret?: { - privateKey?: string | PrivateKey | undefined - } - options?: { - network?: HederaNetwork | string - } -} - -export interface HederaDidUpdateOptions extends DidUpdateOptions { - did: string - secret?: { - privateKey?: string | PrivateKey | undefined - } -} - -export interface HederaDidDeactivateOptions extends DidDeactivateOptions { - did: string - secret?: { - privateKey?: string | PrivateKey | undefined - } -} +import { + HederaDidCreateOptions, + HederaDidDeactivateOptions, + HederaDidUpdateOptions, + HederaLedgerService, +} from '../ledger/HederaLedgerService' export class HederaDidRegistrar implements DidRegistrar { public readonly supportedMethods = ['hedera'] @@ -56,12 +29,9 @@ export class HederaDidRegistrar implements DidRegistrar { const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) // Create did - const { did, didDocument } = await ledgerService.createDid(agentContext, { - network: options.options?.network, - privateKey: options.secret?.privateKey, - }) + const { did, didDocument } = await ledgerService.createDid(agentContext, options) - // Save the did so we know we created it and can issue with it + // Save the did to wallet const credoDidDocument = new DidDocument({ ...didDocument, service: didDocument.service?.map((s) => new DidDocumentService(s)), @@ -72,6 +42,7 @@ export class HederaDidRegistrar implements DidRegistrar { did, role: DidDocumentRole.Created, didDocument: credoDidDocument, + // todo: keys: ??? }) ) @@ -99,60 +70,53 @@ export class HederaDidRegistrar implements DidRegistrar { } } - async update(_agentContext: AgentContext, _options: HederaDidUpdateOptions): Promise { - throw new Error('Method not implemented.') - // const didRepository = agentContext.dependencyManager.resolve(DidRepository) - // const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) - // - // try { - // const { did } = options - // const { didDocument, didDocumentMetadata } = await ledgerService.resolveDid(agentContext, did) - // const didRecord = await didRepository.findCreatedDid(agentContext, did) - // if (!didDocument || didDocumentMetadata.deactivated || !didRecord) { - // return { - // didDocumentMetadata: {}, - // didRegistrationMetadata: {}, - // didState: { - // state: 'failed', - // reason: 'Did not found', - // }, - // } - // } - // - // const { didDocument: updatedDidDocument } = await ledgerService.updateDid(agentContext, { - // did, - // updates: { - // operation: , - // // id: options., - // // property: 'verificationMethod', - // // publicKeyMultibase: 'z6MkkFf6yboMwr1LQVAHqatuGYD9foRe7L2wPkEn1A7LyoQb', - // }, - // privateKey: options.secret?.privateKey, - // }) - // - // didRecord.didDocument = JsonTransformer.fromJSON(updatedDidDocument, DidDocument) - // await didRepository.update(agentContext, didRecord) - // - // return { - // didDocumentMetadata: {}, - // didRegistrationMetadata: {}, - // didState: { - // state: 'finished', - // did, - // didDocument: didRecord.didDocument, - // }, - // } - // } catch (error) { - // agentContext.config.logger.error('Error updating DID', error) - // return { - // didDocumentMetadata: {}, - // didRegistrationMetadata: {}, - // didState: { - // state: 'failed', - // reason: `Unable update DID: ${error.message}`, - // }, - // } - // } + async update(agentContext: AgentContext, options: HederaDidUpdateOptions): Promise { + const didRepository = agentContext.dependencyManager.resolve(DidRepository) + const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) + + try { + const { did } = options + const { didDocument, didDocumentMetadata } = await ledgerService.resolveDid(agentContext, did) + const didRecord = await didRepository.findCreatedDid(agentContext, did) + if (!didDocument || didDocumentMetadata.deactivated || !didRecord) { + return { + didDocumentMetadata: {}, + didRegistrationMetadata: {}, + didState: { + state: 'failed', + reason: 'Did not found', + }, + } + } + + // Update did + const { didDocument: updatedDidDocument } = await ledgerService.updateDid(agentContext, options) + + // Save the did to wallet + didRecord.didDocument = JsonTransformer.fromJSON(updatedDidDocument, DidDocument) + // todo: didRecord.keys = ??? + await didRepository.update(agentContext, didRecord) + + return { + didDocumentMetadata: {}, + didRegistrationMetadata: {}, + didState: { + state: 'finished', + did, + didDocument: didRecord.didDocument, + }, + } + } catch (error) { + agentContext.config.logger.error('Error updating DID', error) + return { + didDocumentMetadata: {}, + didRegistrationMetadata: {}, + didState: { + state: 'failed', + reason: `Unable update DID: ${error.message}`, + }, + } + } } async deactivate(agentContext: AgentContext, options: HederaDidDeactivateOptions): Promise { @@ -176,12 +140,10 @@ export class HederaDidRegistrar implements DidRegistrar { }, } } + // Deactivate did + const { didDocument: deactivatedDidDocument } = await ledgerService.deactivateDid(agentContext, options) - const { didDocument: deactivatedDidDocument } = await ledgerService.deactivateDid(agentContext, { - did: options.did, - privateKey: options.secret?.privateKey, - }) - + // Save the did to wallet didRecord.didDocument = JsonTransformer.fromJSON(deactivatedDidDocument, DidDocument) await didRepository.update(agentContext, didRecord) diff --git a/packages/hedera/src/ledger/HederaLedgerService.ts b/packages/hedera/src/ledger/HederaLedgerService.ts index cfdb60c3f9..4af84442bd 100644 --- a/packages/hedera/src/ledger/HederaLedgerService.ts +++ b/packages/hedera/src/ledger/HederaLedgerService.ts @@ -1,4 +1,4 @@ -import type { +import { GetCredentialDefinitionReturn, GetRevocationRegistryDefinitionReturn, GetRevocationStatusListReturn, @@ -12,30 +12,58 @@ import type { RegisterSchemaOptions, RegisterSchemaReturn, } from '@credo-ts/anoncreds' -import { type AgentContext, injectable } from '@credo-ts/core' +import { + type AgentContext, + DidCreateOptions, + DidDeactivateOptions, + DidDocument, + DidUpdateOptions, + injectable, +} from '@credo-ts/core' import { Client, PrivateKey } from '@hashgraph/sdk' import { HederaAnoncredsRegistry } from '@hiero-did-sdk/anoncreds' import { HederaClientService } from '@hiero-did-sdk/client' import { HederaNetwork } from '@hiero-did-sdk/client/dist/index' -import { DIDResolution, KeysUtility } from '@hiero-did-sdk/core' +import { DIDResolution, KeysUtility, Service, VerificationMethod } from '@hiero-did-sdk/core' import { CreateDIDResult, - DeactivateDIDOptions, + DIDUpdateBuilder, DeactivateDIDResult, - UpdateDIDOptions, UpdateDIDResult, - createDID, deactivateDID, generateCreateDIDRequest, + generateUpdateDIDRequest, submitCreateDIDRequest, + submitUpdateDIDRequest, } from '@hiero-did-sdk/registrar' import { TopicReaderHederaHcs, parseDID, resolveDID } from '@hiero-did-sdk/resolver' import { HederaModuleConfig } from '../HederaModuleConfig' import { CredoCache } from '../cache/CredoCache' -export interface HederaLedgerServiceDidCreateOptions { - network?: HederaNetwork | string - privateKey?: string | PrivateKey | undefined +export interface HederaDidCreateOptions extends DidCreateOptions { + method: 'hedera' + did?: string + didDocument?: DidDocument + secret: { + privateKey: string | PrivateKey + } + options?: { + network?: HederaNetwork | string + } +} + +export interface HederaDidUpdateOptions extends DidUpdateOptions { + did: string + secret: { + privateKey: string | PrivateKey + } +} + +export interface HederaDidDeactivateOptions extends DidDeactivateOptions { + did: string + secret: { + privateKey: string | PrivateKey + } } @injectable() @@ -53,70 +81,114 @@ export class HederaLedgerService { return await resolveDID(did, 'application/ld+json;profile="https://w3id.org/did-resolution"', { topicReader }) } - public async createDid( - agentContext: AgentContext, - options: HederaLedgerServiceDidCreateOptions - ): Promise { - return this.clientService.withClient({ networkName: options.network }, async (client: Client) => { + public async createDid(agentContext: AgentContext, props: HederaDidCreateOptions): Promise { + const { options, secret, didDocument } = props + return this.clientService.withClient({ networkName: options?.network }, async (client: Client) => { const topicReader = this.getHederaHcsTopicReader(agentContext) - - if (options.privateKey) { - const rootKey = - options.privateKey instanceof PrivateKey - ? options.privateKey - : PrivateKey.fromStringED25519(options.privateKey) - const publicMultibaseRootKey = KeysUtility.fromPublicKey(rootKey.publicKey).toMultibase() - const { state, signingRequest } = await generateCreateDIDRequest( - { - multibasePublicKey: publicMultibaseRootKey, - }, - { - client, - } - ) - const signature = rootKey.sign(signingRequest.serializedPayload) - return await submitCreateDIDRequest( - { state, signature, waitForDIDVisibility: false }, - { - client, - } - ) - } - return await createDID( + const rootKey = + secret.privateKey instanceof PrivateKey ? secret.privateKey : PrivateKey.fromStringED25519(secret.privateKey) + const multibasePublicKey = KeysUtility.fromPublicKey(rootKey.publicKey).toMultibase() + const { state, signingRequest } = await generateCreateDIDRequest( { - waitForDIDVisibility: false, + multibasePublicKey, topicReader, }, - { client } + { + client, + } + ) + const signature = rootKey.sign(signingRequest.serializedPayload) + const createdDidDocument = await submitCreateDIDRequest( + { state, signature, topicReader }, + { + client, + } ) + + if (didDocument) { + // update did document + const { didDocument: updatedDidDocument } = await this.updateDid(agentContext, { + did: createdDidDocument.did, + didDocumentOperation: 'setDidDocument', + didDocument: didDocument, + options: { ...options }, + secret: { ...secret }, + }) + return { + did: createdDidDocument.did, + didDocument: updatedDidDocument, + privateKey: undefined, + } + } + + return createdDidDocument }) } - public async updateDid(_agentContext: AgentContext, _props: UpdateDIDOptions): Promise { - throw new Error('Method not implemented.') - // const { network: networkName } = parseDID(props.did) - // return this.clientService.withClient({ networkName }, async (client: Client) => { - // const topicReader = this.getHederaHcsTopicReader(agentContext) - // return await updateDID( - // { - // ...props, - // waitForDIDVisibility: false, - // topicReader, - // }, - // { client } - // ) - // }) + public async updateDid(agentContext: AgentContext, props: HederaDidUpdateOptions): Promise { + const { did, didDocumentOperation, didDocument, secret } = props + + if (!didDocumentOperation) { + throw new Error('DidDocumentOperation is required') + } + + const { network: networkName } = parseDID(did) + return this.clientService.withClient({ networkName }, async (client: Client) => { + const topicReader = this.getHederaHcsTopicReader(agentContext) + + const currentDidDocumentResolution = await resolveDID( + did, + 'application/ld+json;profile="https://w3id.org/did-resolution"', + { topicReader } + ) + if (!currentDidDocumentResolution.didDocument) { + throw new Error(`DID ${did} not found`) + } + + const didUpdates = this.prepareDidUpdates( + currentDidDocumentResolution.didDocument, + didDocument, + didDocumentOperation + ) + + const { states, signingRequests } = await generateUpdateDIDRequest( + { + did, + updates: didUpdates.build(), + topicReader, + }, + { + client, + } + ) + + const rootKey = + secret.privateKey instanceof PrivateKey ? secret.privateKey : PrivateKey.fromStringED25519(secret.privateKey) + const signatures = this.signRequests(signingRequests, rootKey) + return await submitUpdateDIDRequest( + { + states, + signatures, + topicReader, + }, + { + client, + } + ) + }) } - public async deactivateDid(agentContext: AgentContext, props: DeactivateDIDOptions): Promise { + public async deactivateDid( + agentContext: AgentContext, + props: HederaDidDeactivateOptions + ): Promise { const { network: networkName } = parseDID(props.did) return this.clientService.withClient({ networkName }, async (client: Client) => { const topicReader = this.getHederaHcsTopicReader(agentContext) return await deactivateDID( { did: props.did, - privateKey: props.privateKey, - waitForDIDVisibility: false, + privateKey: props.secret?.privateKey, topicReader, }, { client } @@ -185,6 +257,8 @@ export class HederaLedgerService { return await sdk.registerRevocationStatusList(options) } + // Private methods + private getHederaHcsTopicReader(agentContext: AgentContext): TopicReaderHederaHcs { const cache = this.config.options.cache ?? new CredoCache(agentContext) return new TopicReaderHederaHcs({ ...this.config.options, cache }) @@ -194,4 +268,118 @@ export class HederaLedgerService { const cache = this.config.options.cache ?? new CredoCache(agentContext) return new HederaAnoncredsRegistry({ ...this.config.options, cache }) } + + private getId(item: { id: string } | string): string { + const id = typeof item === 'string' ? item : item.id + return id.includes('#') ? `#${id.split('#').pop()}` : id + } + + private getDiff(currentArray?: any[], newArray?: any[]) { + const currentList = currentArray || [] + const newList = newArray || [] + + const currentIds = new Set(currentList.map((item) => this.getId(item))) + const newIds = new Set(newList.map((item) => this.getId(item))) + + const existingItems = newList.filter((item) => currentIds.has(this.getId(item))).map((item) => item.id) + const newItems = newList.filter((item) => !currentIds.has(this.getId(item))) + const missingItems = currentList.filter((item) => !newIds.has(this.getId(item))) + + return { existingItems, newItems, missingItems } + } + + private signRequests(signingRequests: Record, privateKey: PrivateKey): Record { + return Object.entries(signingRequests).reduce((acc, [key, request]) => { + return { + ...acc, + [key]: privateKey.sign(request.serializedPayload), + } + }, {}) + } + + private prepareDidUpdates(currentDoc: any, newDoc: any, operation: string): DIDUpdateBuilder { + const builder = new DIDUpdateBuilder() + const fields = [ + 'service', + 'verificationMethod', + 'assertionMethod', + 'authentication', + 'capabilityDelegation', + 'capabilityInvocation', + 'keyAgreement', + ] + + fields.forEach((field) => { + const { existingItems, newItems, missingItems } = this.getDiff(currentDoc[field], newDoc[field]) + + if (operation === 'setDidDocument') { + missingItems.forEach((item) => { + this.getUpdateMethod(builder, field, 'remove')(this.getId(item)) + }) + newItems.forEach((item) => { + this.getUpdateMethod(builder, field, 'add')(item) + }) + } + + if (operation === 'addToDidDocument') { + newItems.forEach((item) => { + this.getUpdateMethod(builder, field, 'add')(item) + }) + } + + if (operation === 'removeFromDidDocument') { + existingItems.forEach((item) => { + this.getUpdateMethod(builder, field, 'remove')(item) + }) + } + }) + + return builder + } + + private getUpdateMethod( + builder: DIDUpdateBuilder, + field: string, + action: 'add' | 'remove' + ): (item: any) => DIDUpdateBuilder { + type MethodDelegate = (item: any) => DIDUpdateBuilder + + const methodMap: Record> = { + service: { + add: (item: Service) => builder.addService(item), + remove: (id: string) => builder.removeService(id), + }, + verificationMethod: { + add: (item: VerificationMethod | string) => builder.addVerificationMethod(item), + remove: (id: string) => builder.removeVerificationMethod(id), + }, + assertionMethod: { + add: (item: VerificationMethod | string) => builder.addAssertionMethod(item), + remove: (id: string) => builder.removeAssertionMethod(id), + }, + authentication: { + add: (item: VerificationMethod | string) => builder.addAuthenticationMethod(item), + remove: (id: string) => builder.removeAuthenticationMethod(id), + }, + capabilityDelegation: { + add: (item: VerificationMethod | string) => builder.addCapabilityDelegationMethod(item), + remove: (id: string) => builder.removeCapabilityDelegationMethod(id), + }, + capabilityInvocation: { + add: (item: VerificationMethod | string) => builder.addCapabilityInvocationMethod(item), + remove: (id: string) => builder.removeCapabilityInvocationMethod(id), + }, + keyAgreement: { + add: (item: VerificationMethod | string) => builder.addKeyAgreementMethod(item), + remove: (id: string) => builder.removeKeyAgreementMethod(id), + }, + } + + const fieldMethods = methodMap[field] + if (!fieldMethods) { + return () => builder + } + + return fieldMethods[action] + } } diff --git a/packages/hedera/tests/HederaAnoncredsRegistry.e2e.test.ts b/packages/hedera/tests/HederaAnoncredsRegistry.e2e.test.ts index bad119056b..9c469d8ecf 100644 --- a/packages/hedera/tests/HederaAnoncredsRegistry.e2e.test.ts +++ b/packages/hedera/tests/HederaAnoncredsRegistry.e2e.test.ts @@ -2,14 +2,14 @@ import { Agent, ConsoleLogger, LogLevel, utils } from '@credo-ts/core' import { getHederaAgent, waitTimeout } from './utils' import { testCache } from './utils/testCache' -const seed = '11011000010000111011001100010100' -const consensusTimeout = 5000 - describe('Hedera AnonCreds support', () => { + const privateKey = process.env.HEDERA_TEST_OPERATOR_KEY ?? '' + const consensusTimeout = 5000 + let agent: Agent let did: string - const logger = new ConsoleLogger(LogLevel.debug) + const logger = new ConsoleLogger(LogLevel.warn) const cache = new testCache() beforeAll(async () => { @@ -25,7 +25,7 @@ describe('Hedera AnonCreds support', () => { const didRegistrarResult = await agent.dids.create({ method: 'hedera', secret: { - seed, + privateKey, }, }) if (!didRegistrarResult.didState?.didDocument?.id) throw new Error('DidRegistrarError') diff --git a/packages/hedera/tests/HederaDidRegistrar.e2e.test.ts b/packages/hedera/tests/HederaDidRegistrar.e2e.test.ts index 152ef60f02..1d73cab1c1 100644 --- a/packages/hedera/tests/HederaDidRegistrar.e2e.test.ts +++ b/packages/hedera/tests/HederaDidRegistrar.e2e.test.ts @@ -1,15 +1,46 @@ -import { Agent, ConsoleLogger, LogLevel } from '@credo-ts/core' -import { HederaDidCreateOptions, HederaDidDeactivateOptions } from '../src/dids/HederaDidRegistrar' -import { getHederaAgent, waitTimeout } from './utils' +import { Agent, ConsoleLogger, DidDocument, DidDocumentService, LogLevel, VerificationMethod } from '@credo-ts/core' +import { + HederaDidCreateOptions, + HederaDidDeactivateOptions, + HederaDidUpdateOptions, +} from '../src/ledger/HederaLedgerService' +import { getHederaAgent } from './utils' describe('Hedera DID registrar', () => { - const consensusTimeout = 2000 - const operatorKey = process.env.HEDERA_TEST_OPERATOR_KEY ?? '' - + const privateKey = process.env.HEDERA_TEST_OPERATOR_KEY ?? '' const logger = new ConsoleLogger(LogLevel.error) - let agent: Agent + const validDid = 'did:hedera:testnet:44eesExqdsUvLZ35FpnBPErqRGRnYbzzyG3wgCCYxkmq_0.0.6226170' + + function validVerificationMethod() { + return new VerificationMethod({ + id: '#key-1', + type: 'Ed25519VerificationKey2020', + controller: validDid, + publicKeyMultibase: 'z44eesExqdsUvLZ35FpnBPErqRGRnYbzzyG3wgCCYxkmq', + }) + } + + function validService() { + return new DidDocumentService({ + id: '#service-1', + type: 'CustomType', + serviceEndpoint: ['https://rand.io'], + }) + } + + function validDidDoc() { + const service = [validService()] + const verificationMethod = [validVerificationMethod()] + + return new DidDocument({ + id: validDid, + verificationMethod, + service, + }) + } + beforeAll(async () => { agent = getHederaAgent({ logger, @@ -22,10 +53,11 @@ describe('Hedera DID registrar', () => { await agent.shutdown() }) - it('should create a did:hedera did', async () => { + it('should create a did:hedera did document', async () => { const didResult = await agent.dids.create({ method: 'hedera', options: { network: 'testnet' }, + secret: { privateKey }, }) expect(didResult).toMatchObject({ didState: { @@ -42,20 +74,175 @@ describe('Hedera DID registrar', () => { }) }) - it('should create and add service to a did:hedera did', async () => { + it('should create a did:hedera did document with document presets', async () => { const didResult = await agent.dids.create({ method: 'hedera', + didDocument: validDidDoc(), options: { network: 'testnet' }, + secret: { privateKey }, + }) + expect(didResult.didState.state).toEqual('finished') + + const verificationMethod = validVerificationMethod() + expect(didResult.didState.didDocument?.verificationMethod).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + id: expect.stringContaining('#did-root-key'), + type: expect.any(String), + controller: didResult.didState.didDocument?.id, + publicKeyMultibase: expect.any(String), + }), + expect.objectContaining({ + id: expect.stringContaining(verificationMethod.id), + type: verificationMethod.type, + controller: verificationMethod.controller, + publicKeyMultibase: verificationMethod.publicKeyMultibase, + }), + ]) + ) + + const service = validService() + expect(didResult.didState.didDocument?.service).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + id: expect.stringContaining(service.id), + type: service.type, + serviceEndpoint: service.serviceEndpoint, + }), + ]) + ) + }) + + it('should create a did:hedera did document, add and remove service', async () => { + // create document + const didResult = await agent.dids.create({ + method: 'hedera', + options: { + network: 'testnet', + }, + secret: { + privateKey, + }, }) expect(didResult).toMatchObject({ didState: { state: 'finished' } }) + + const did = didResult.didState.did! + const didDocument = didResult.didState.didDocument as DidDocument + didDocument.service = [validService()] + + // add service to the document + const addUpdateResult = await agent.dids.update({ + did, + didDocument, + didDocumentOperation: 'addToDidDocument', + secret: { + privateKey, + }, + }) + + expect(addUpdateResult.didState.state).toEqual('finished') + expect(addUpdateResult.didState.didDocument?.id).toEqual(did) + + const resolvedDocument = await agent.dids.resolve(did, { + useLocalCreatedDidRecord: false, + }) + expect(resolvedDocument.didDocument?.id).toEqual(did) + + const service = validService() + expect(resolvedDocument.didDocument?.service).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + id: expect.stringContaining(service.id), + type: service.type, + serviceEndpoint: service.serviceEndpoint, + }), + ]) + ) + + // remove service from the document + const removeUpdateResult = await agent.dids.update({ + did, + didDocument: { + ...didDocument, + verificationMethod: undefined, + }, + didDocumentOperation: 'removeFromDidDocument', + secret: { + privateKey, + }, + }) + + expect(removeUpdateResult.didState.state).toEqual('finished') + expect(removeUpdateResult.didState.didDocument?.id).toEqual(did) + + const removeResolvedDocument = await agent.dids.resolve(did, { + useLocalCreatedDidRecord: false, + }) + expect(removeResolvedDocument.didDocument?.id).toEqual(did) + expect(removeResolvedDocument.didDocument?.service ?? []).toHaveLength(0) }) - it('should create and add verification to a did:hedera did', async () => { + it('should create a did:hedera did document, add and remove verification method', async () => { + // create did document const didResult = await agent.dids.create({ method: 'hedera', options: { network: 'testnet' }, + secret: { privateKey }, }) expect(didResult).toMatchObject({ didState: { state: 'finished' } }) + + const did = didResult.didState.did! + const didDocument = didResult.didState.didDocument as DidDocument + + const validVerification = validVerificationMethod() + didDocument.verificationMethod = [validVerification] + + // add verification method to the document + const addUpdateResult = await agent.dids.update({ + did, + didDocument, + didDocumentOperation: 'addToDidDocument', + secret: { + privateKey, + }, + }) + expect(addUpdateResult.didState.didDocument?.id).toEqual(did) + expect(addUpdateResult.didState.state).toEqual('finished') + + const addResolvedDocument = await agent.dids.resolve(did, { + useLocalCreatedDidRecord: false, + }) + + expect(addResolvedDocument.didDocument?.id).toEqual(did) + expect(addResolvedDocument.didDocument?.verificationMethod).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + id: expect.stringContaining(validVerification.id), + type: validVerification.type, + controller: validVerification.controller, + publicKeyMultibase: validVerification.publicKeyMultibase, + }), + ]) + ) + + // remove verification method from the document + const removeUpdateResult = await agent.dids.update({ + did, + didDocument, + didDocumentOperation: 'removeFromDidDocument', + secret: { + privateKey, + }, + }) + expect(removeUpdateResult.didState.didDocument?.id).toEqual(did) + expect(removeUpdateResult.didState.state).toEqual('finished') + + const removeResolvedDocument = await agent.dids.resolve(did, { + useLocalCreatedDidRecord: false, + }) + + expect(removeResolvedDocument.didDocument?.id).toEqual(did) + expect(removeResolvedDocument.didDocument?.service ?? []).toHaveLength(0) }) it('should create and deactivate a did:hedera did', async () => { @@ -65,27 +252,23 @@ describe('Hedera DID registrar', () => { network: 'testnet', }, secret: { - privateKey: operatorKey, + privateKey, }, }) expect(didResult).toMatchObject({ didState: { state: 'finished' } }) const did = didResult.didState.did! - await waitTimeout(consensusTimeout) - const deactivateResult = await agent.dids.deactivate({ did, secret: { - privateKey: operatorKey, + privateKey, }, }) expect(deactivateResult.didState.didDocument?.id).toEqual(did) expect(deactivateResult.didState.state).toEqual('finished') - await waitTimeout(consensusTimeout) - const resolvedDocument = await agent.dids.resolve(did, { useLocalCreatedDidRecord: false, }) diff --git a/packages/hedera/tests/HederaDidResolver.e2e.test.ts b/packages/hedera/tests/HederaDidResolver.e2e.test.ts index b3546970b7..b3ea45f3a1 100644 --- a/packages/hedera/tests/HederaDidResolver.e2e.test.ts +++ b/packages/hedera/tests/HederaDidResolver.e2e.test.ts @@ -1,9 +1,10 @@ import { Agent, ConsoleLogger, JsonTransformer, LogLevel } from '@credo-ts/core' -import { HederaDidCreateOptions } from '../src/dids/HederaDidRegistrar' +import { HederaDidCreateOptions } from '../src/ledger/HederaLedgerService' import { getHederaAgent } from './utils' describe('Hedera DID resolver', () => { const logger = new ConsoleLogger(LogLevel.error) + const privateKey = process.env.HEDERA_TEST_OPERATOR_KEY ?? '' let agent: Agent let did: string @@ -15,7 +16,7 @@ describe('Hedera DID resolver', () => { }) await agent.initialize() - const didResult = await agent.dids.create({ method: 'hedera' }) + const didResult = await agent.dids.create({ method: 'hedera', secret: { privateKey } }) if (!didResult.didState.did) { throw new Error('No DID created') } diff --git a/packages/hedera/tests/fixtures/fixtures.ts b/packages/hedera/tests/fixtures/fixtures.ts deleted file mode 100644 index 01b9c18764..0000000000 --- a/packages/hedera/tests/fixtures/fixtures.ts +++ /dev/null @@ -1,182 +0,0 @@ -import { CREDENTIALS_CONTEXT_V1_URL } from '@credo-ts/core' - -export const HOLDER_DID = 'did:key:z6MkiAUh4Fh23QAqv8w8YNCFq3QSTnHV8gQSiABV5Mj9mj2m' - -export const W3C_FIXTURES = { - TEST_LD_DOCUMENT: { - '@context': [CREDENTIALS_CONTEXT_V1_URL, 'https://w3id.org/citizenship/v1'], - id: 'https://issuer.oidp.uscis.gov/credentials/83627465', - type: ['VerifiableCredential', 'PermanentResidentCard'], - issuer: '', - identifier: '83627465', - name: 'Permanent Resident Card', - description: 'Government of Example Permanent Resident Card.', - issuanceDate: '2019-12-03T12:19:52Z', - expirationDate: '2029-12-03T12:19:52Z', - credentialSubject: { - id: HOLDER_DID, - type: ['PermanentResident', 'Person'], - givenName: 'JOHN', - familyName: 'SMITH', - gender: 'Male', - image: 'data:image/png;base64,iVBORw0KGgokJggg==', - residentSince: '2015-01-01', - lprCategory: 'C09', - lprNumber: '999-999-999', - commuterClassification: 'C1', - birthCountry: 'Bahamas', - birthDate: '1958-07-17', - }, - }, - - TEST_LD_DOCUMENT_SIGNED: { - '@context': ['https://www.w3.org/2018/credentials/v1', 'https://w3id.org/citizenship/v1'], - id: 'https://issuer.oidp.uscis.gov/credentials/83627465', - type: ['VerifiableCredential', 'PermanentResidentCard'], - issuer: 'did:hedera:testnet:zGdjMu1hPkjbJXSPPp6RgTptnpYYM9uEkPeNbPhSkXTon_0.0.5139753', - identifier: '83627465', - name: 'Permanent Resident Card', - description: 'Government of Example Permanent Resident Card.', - issuanceDate: '2019-12-03T12:19:52Z', - expirationDate: '2029-12-03T12:19:52Z', - credentialSubject: { - type: ['PermanentResident', 'Person'], - givenName: 'JOHN', - familyName: 'SMITH', - gender: 'Male', - image: 'data:image/png;base64,iVBORw0KGgokJggg==', - residentSince: '2015-01-01', - lprCategory: 'C09', - lprNumber: '999-999-999', - commuterClassification: 'C1', - birthCountry: 'Bahamas', - birthDate: '1958-07-17', - id: 'did:key:z6MkiAUh4Fh23QAqv8w8YNCFq3QSTnHV8gQSiABV5Mj9mj2m', - }, - proof: { - verificationMethod: 'did:hedera:testnet:zGdjMu1hPkjbJXSPPp6RgTptnpYYM9uEkPeNbPhSkXTon_0.0.5139753#key-1', - type: 'Ed25519Signature2018', - created: '2024-11-17T14:28:27Z', - proofPurpose: 'assertionMethod', - jws: 'eyJhbGciOiJFZERTQSIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY0Il19..Dq-AI4T_H4E3bdwSb4omyetKimTogtXWNV4HtNtLYoHLl0f0ddbF3hv807ssGtck51uMUTISkZ7zkdNdn0hZAA', - }, - }, - TEST_LD_DOCUMENT_BAD_SIGNED: { - '@context': ['https://www.w3.org/2018/credentials/v1', 'https://w3id.org/citizenship/v1'], - id: 'https://issuer.oidp.uscis.gov/credentials/83627465', - type: ['VerifiableCredential', 'PermanentResidentCard'], - issuer: 'did:hedera:testnet:zGdjMu1hPkjbJXSPPp6RgTptnpYYM9uEkPeNbPhSkXTon_0.0.5139619', - identifier: '83627465', - name: 'Permanent Resident Card', - description: 'Government of Example Permanent Resident Card.', - issuanceDate: '2019-12-03T12:19:52Z', - expirationDate: '2029-12-03T12:19:52Z', - credentialSubject: { - type: ['PermanentResident', 'Person'], - givenName: 'JOHN', - familyName: 'SMITH', - gender: 'Male', - image: 'data:image/png;base64,iVBORw0KGgokJggg==', - residentSince: '2015-01-01', - lprCategory: 'C09', - lprNumber: '999-999-999', - commuterClassification: 'C1', - birthCountry: 'Bahamas', - birthDate: '1958-07-17', - id: 'did:key:z6MkiAUh4Fh23QAqv8w8YNCFq3QSTnHV8gQSiABV5Mj9mj2m', - }, - proof: { - verificationMethod: 'did:hedera:testnet:zGdjMu1hPkjbJXSPPp6RgTptnpYYM9uEkPeNbPhSkXTon_0.0.5139619#key-1', - type: 'Ed25519Signature2018', - created: '2024-11-17T13:02:11Z', - proofPurpose: 'assertionMethod', - jws: 'eyJhbGciOiJFZERTQSIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY78Il19..J50c8CreYwZfvF63sKJvdyVGZIh6m8GwORWKgsL34nfRi4AuUVBOpCD_2PhPvk8lgkXmKMfeSu2dHU5s6V--Dg', - }, - }, - - TEST_VP_DOCUMENT: { - '@context': [CREDENTIALS_CONTEXT_V1_URL], - type: ['VerifiablePresentation'], - verifiableCredential: [ - { - '@context': ['https://www.w3.org/2018/credentials/v1', 'https://w3id.org/citizenship/v1'], - id: 'https://issuer.oidp.uscis.gov/credentials/83627465', - type: ['VerifiableCredential', 'PermanentResidentCard'], - issuer: 'did:hedera:testnet:zGdjMu1hPkjbJXSPPp6RgTptnpYYM9uEkPeNbPhSkXTon_0.0.5139619', - identifier: '83627465', - name: 'Permanent Resident Card', - description: 'Government of Example Permanent Resident Card.', - issuanceDate: '2019-12-03T12:19:52Z', - expirationDate: '2029-12-03T12:19:52Z', - credentialSubject: { - type: ['PermanentResident', 'Person'], - givenName: 'JOHN', - familyName: 'SMITH', - gender: 'Male', - image: 'data:image/png;base64,iVBORw0KGgokJggg==', - residentSince: '2015-01-01', - lprCategory: 'C09', - lprNumber: '999-999-999', - commuterClassification: 'C1', - birthCountry: 'Bahamas', - birthDate: '1958-07-17', - id: 'did:key:z6MkiAUh4Fh23QAqv8w8YNCFq3QSTnHV8gQSiABV5Mj9mj2m', - }, - proof: { - verificationMethod: 'did:hedera:testnet:zGdjMu1hPkjbJXSPPp6RgTptnpYYM9uEkPeNbPhSkXTon_0.0.5139619#key-1', - type: 'Ed25519Signature2018', - created: '2024-11-17T13:02:11Z', - proofPurpose: 'assertionMethod', - jws: 'eyJhbGciOiJFZERTQSIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY0Il19..J50c8CreYwZfvF63sKJvdyVGZIh6m8GwORWKgsL34nfRi4AuUVBOpCD_2PhPvk8lgkXmKMfeSu2dHU5s6V--Dg', - }, - }, - ], - }, - TEST_VP_DOCUMENT_SIGNED: { - '@context': ['https://www.w3.org/2018/credentials/v1'], - type: ['VerifiablePresentation'], - verifiableCredential: [ - { - '@context': ['https://www.w3.org/2018/credentials/v1', 'https://w3id.org/citizenship/v1'], - id: 'https://issuer.oidp.uscis.gov/credentials/83627465', - type: ['VerifiableCredential', 'PermanentResidentCard'], - issuer: 'did:hedera:testnet:zGdjMu1hPkjbJXSPPp6RgTptnpYYM9uEkPeNbPhSkXTon_0.0.5139619', - identifier: '83627465', - name: 'Permanent Resident Card', - description: 'Government of Example Permanent Resident Card.', - issuanceDate: '2019-12-03T12:19:52Z', - expirationDate: '2029-12-03T12:19:52Z', - credentialSubject: { - type: ['PermanentResident', 'Person'], - givenName: 'JOHN', - familyName: 'SMITH', - gender: 'Male', - image: 'data:image/png;base64,iVBORw0KGgokJggg==', - residentSince: '2015-01-01', - lprCategory: 'C09', - lprNumber: '999-999-999', - commuterClassification: 'C1', - birthCountry: 'Bahamas', - birthDate: '1958-07-17', - id: 'did:key:z6MkiAUh4Fh23QAqv8w8YNCFq3QSTnHV8gQSiABV5Mj9mj2m', - }, - proof: { - verificationMethod: 'did:hedera:testnet:zGdjMu1hPkjbJXSPPp6RgTptnpYYM9uEkPeNbPhSkXTon_0.0.5139619#key-1', - type: 'Ed25519Signature2018', - created: '2024-11-17T13:02:11Z', - proofPurpose: 'assertionMethod', - jws: 'eyJhbGciOiJFZERTQSIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY0Il19..J50c8CreYwZfvF63sKJvdyVGZIh6m8GwORWKgsL34nfRi4AuUVBOpCD_2PhPvk8lgkXmKMfeSu2dHU5s6V--Dg', - }, - }, - ], - proof: { - verificationMethod: 'did:hedera:testnet:zGdjMu1hPkjbJXSPPp6RgTptnpYYM9uEkPeNbPhSkXTon_0.0.5139753#key-1', - type: 'Ed25519Signature2018', - created: '2024-11-17T14:28:30Z', - proofPurpose: 'authentication', - challenge: '7bf32d0b-39d4-41f3-96b6-45de52988e4c', - domain: 'issuer.example.com', - jws: 'eyJhbGciOiJFZERTQSIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY0Il19..TzXuwFtj4r8HaS-TsRHB7gl-HyGPhnWQJUPqWE1OxyBirPzcVskOiSKdnaNcw95DzSfkTYCHIE1U16P-rSlTCA', - }, - }, -} diff --git a/packages/hedera/tests/fixtures/index.ts b/packages/hedera/tests/fixtures/index.ts deleted file mode 100644 index 272a535796..0000000000 --- a/packages/hedera/tests/fixtures/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './fixtures' From 7d8040eadd2cd9ed74a3ebd05274db5373cce95d Mon Sep 17 00:00:00 2001 From: "andrey.kononov" Date: Thu, 26 Jun 2025 20:28:41 +0300 Subject: [PATCH 56/89] Working with KMS keys --- demo/src/Faber.ts | 6 +- demo/src/FaberInquirer.ts | 2 +- packages/hedera/package.json | 3 +- .../hedera/src/dids/HederaDidRegistrar.ts | 37 ++++++++- .../hedera/src/ledger/HederaLedgerService.ts | 78 ++++++++++++++----- .../src/{ => ledger}/cache/CredoCache.ts | 0 .../hedera/src/ledger/publisher/Publisher.ts | 15 ++++ .../tests/HederaDidRegistrar.e2e.test.ts | 1 + .../tests/HederaDidResolver.e2e.test.ts | 23 +++++- 9 files changed, 138 insertions(+), 27 deletions(-) rename packages/hedera/src/{ => ledger}/cache/CredoCache.ts (100%) create mode 100644 packages/hedera/src/ledger/publisher/Publisher.ts diff --git a/demo/src/Faber.ts b/demo/src/Faber.ts index b6523610cb..30990da956 100644 --- a/demo/src/Faber.ts +++ b/demo/src/Faber.ts @@ -14,6 +14,7 @@ import { Color, Output, greenText, purpleText, redText } from './OutputClass' export enum RegistryOptions { indy = 'did:indy', cheqd = 'did:cheqd', + hedera = 'did:hedera', } export class Faber extends BaseAgent { @@ -40,9 +41,10 @@ export class Faber extends BaseAgent { const unqualifiedIndyDid = '2jEvRuKmfBJTRa7QowDpNN' const cheqdDid = 'did:cheqd:testnet:d37eba59-513d-42d3-8f9f-d1df0548b675' const indyDid = `did:indy:${indyNetworkConfig.indyNamespace}:${unqualifiedIndyDid}` - const didDocumentRelativeKeyId = registry === RegistryOptions.indy ? '#verkey' : '#key-1' + const hederaDid = 'did:hedera:testnet:44eesExqdsUvLZ35FpnBPErqRGRnYbzzyG3wgCCYxkmq_0.0.6231121' + const didDocumentRelativeKeyId = registry === RegistryOptions.indy ? '#verkey' : registry === RegistryOptions.cheqd ? '#key-1' : '#did-root-key' - const did = registry === RegistryOptions.indy ? indyDid : cheqdDid + const did = registry === RegistryOptions.indy ? indyDid : registry === RegistryOptions.cheqd ? cheqdDid : hederaDid const { privateJwk } = transformPrivateKeyToPrivateJwk({ type: { crv: 'Ed25519', diff --git a/demo/src/FaberInquirer.ts b/demo/src/FaberInquirer.ts index 31d9958776..26eb97e3e2 100644 --- a/demo/src/FaberInquirer.ts +++ b/demo/src/FaberInquirer.ts @@ -90,7 +90,7 @@ export class FaberInquirer extends BaseInquirer { } public async credential() { - const registry = await prompt([this.inquireOptions([RegistryOptions.indy, RegistryOptions.cheqd])]) + const registry = await prompt([this.inquireOptions([RegistryOptions.indy, RegistryOptions.cheqd, RegistryOptions.hedera])]) await this.faber.importDid(registry.options) await this.faber.issueCredential() const title = 'Is the credential offer accepted?' diff --git a/packages/hedera/package.json b/packages/hedera/package.json index 9626ac854d..7a367eef93 100644 --- a/packages/hedera/package.json +++ b/packages/hedera/package.json @@ -32,7 +32,8 @@ "@hiero-did-sdk/resolver": "npm:@hiero-did-sdk/resolver@0.0.9", "@hiero-did-sdk/core": "npm:@hiero-did-sdk/core@0.0.2", "@hiero-did-sdk/client": "npm:@hiero-did-sdk/client@0.0.3", - "@hiero-did-sdk/hcs": "npm:@hiero-did-sdk/hcs@0.0.8" + "@hiero-did-sdk/hcs": "npm:@hiero-did-sdk/hcs@0.0.8", + "@hiero-did-sdk/publisher-internal": "npm:@hiero-did-sdk/publisher-internal@0.0.1" }, "devDependencies": { "@credo-ts/node": "workspace:*", diff --git a/packages/hedera/src/dids/HederaDidRegistrar.ts b/packages/hedera/src/dids/HederaDidRegistrar.ts index 1c45d6bc06..ad3c3a4cc3 100644 --- a/packages/hedera/src/dids/HederaDidRegistrar.ts +++ b/packages/hedera/src/dids/HederaDidRegistrar.ts @@ -3,6 +3,7 @@ import { DidCreateResult, DidDeactivateResult, DidDocument, + DidDocumentKey, DidDocumentRole, DidDocumentService, DidRecord, @@ -11,6 +12,8 @@ import { DidUpdateResult, JsonTransformer, } from '@credo-ts/core' +import { PrivateKey } from '@hashgraph/sdk' +import { KeysUtility } from '@hiero-did-sdk/core' import { HederaDidCreateOptions, HederaDidDeactivateOptions, @@ -36,13 +39,24 @@ export class HederaDidRegistrar implements DidRegistrar { ...didDocument, service: didDocument.service?.map((s) => new DidDocumentService(s)), }) + + const hederaSignKey = + options.secret.key.hederaPrivateKey instanceof PrivateKey + ? options.secret.key.hederaPrivateKey + : PrivateKey.fromStringED25519(options.secret.key.hederaPrivateKey) + const keys = [ + { + kmsKeyId: options.secret.key.kmsKeyId, + didDocumentRelativeKeyId: KeysUtility.fromPublicKey(hederaSignKey.publicKey).toMultibase(), + } satisfies DidDocumentKey, + ] await didRepository.save( agentContext, new DidRecord({ did, role: DidDocumentRole.Created, didDocument: credoDidDocument, - // todo: keys: ??? + keys, }) ) @@ -93,8 +107,17 @@ export class HederaDidRegistrar implements DidRegistrar { const { didDocument: updatedDidDocument } = await ledgerService.updateDid(agentContext, options) // Save the did to wallet + const hederaSignKey = + options.secret.key.hederaPrivateKey instanceof PrivateKey + ? options.secret.key.hederaPrivateKey + : PrivateKey.fromStringED25519(options.secret.key.hederaPrivateKey) + const keys = didRecord.keys ?? [] + keys.push({ + kmsKeyId: options.secret.key.kmsKeyId, + didDocumentRelativeKeyId: KeysUtility.fromPublicKey(hederaSignKey.publicKey).toMultibase(), + } satisfies DidDocumentKey) didRecord.didDocument = JsonTransformer.fromJSON(updatedDidDocument, DidDocument) - // todo: didRecord.keys = ??? + didRecord.keys = keys await didRepository.update(agentContext, didRecord) return { @@ -144,7 +167,17 @@ export class HederaDidRegistrar implements DidRegistrar { const { didDocument: deactivatedDidDocument } = await ledgerService.deactivateDid(agentContext, options) // Save the did to wallet + const hederaSignKey = + options.secret.key.hederaPrivateKey instanceof PrivateKey + ? options.secret.key.hederaPrivateKey + : PrivateKey.fromStringED25519(options.secret.key.hederaPrivateKey) + const keys = didRecord.keys ?? [] + keys.push({ + kmsKeyId: options.secret.key.kmsKeyId, + didDocumentRelativeKeyId: KeysUtility.fromPublicKey(hederaSignKey.publicKey).toMultibase(), + } satisfies DidDocumentKey) didRecord.didDocument = JsonTransformer.fromJSON(deactivatedDidDocument, DidDocument) + didRecord.keys = keys await didRepository.update(agentContext, didRecord) return { diff --git a/packages/hedera/src/ledger/HederaLedgerService.ts b/packages/hedera/src/ledger/HederaLedgerService.ts index 4af84442bd..a0c0ee18cc 100644 --- a/packages/hedera/src/ledger/HederaLedgerService.ts +++ b/packages/hedera/src/ledger/HederaLedgerService.ts @@ -30,22 +30,27 @@ import { DIDUpdateBuilder, DeactivateDIDResult, UpdateDIDResult, - deactivateDID, generateCreateDIDRequest, + generateDeactivateDIDRequest, generateUpdateDIDRequest, submitCreateDIDRequest, + submitDeactivateDIDRequest, submitUpdateDIDRequest, } from '@hiero-did-sdk/registrar' import { TopicReaderHederaHcs, parseDID, resolveDID } from '@hiero-did-sdk/resolver' import { HederaModuleConfig } from '../HederaModuleConfig' -import { CredoCache } from '../cache/CredoCache' +import { CredoCache } from './cache/CredoCache' +import {Publisher} from "./publisher/Publisher"; export interface HederaDidCreateOptions extends DidCreateOptions { method: 'hedera' did?: string didDocument?: DidDocument secret: { - privateKey: string | PrivateKey + key: { + kmsKeyId: string + publicKeyMultibase: string + } } options?: { network?: HederaNetwork | string @@ -55,14 +60,20 @@ export interface HederaDidCreateOptions extends DidCreateOptions { export interface HederaDidUpdateOptions extends DidUpdateOptions { did: string secret: { - privateKey: string | PrivateKey + key: { + kmsKeyId: string + publicKeyMultibase: string + } } } export interface HederaDidDeactivateOptions extends DidDeactivateOptions { did: string secret: { - privateKey: string | PrivateKey + key: { + kmsKeyId: string + publicKeyMultibase: string + } } } @@ -85,28 +96,39 @@ export class HederaLedgerService { const { options, secret, didDocument } = props return this.clientService.withClient({ networkName: options?.network }, async (client: Client) => { const topicReader = this.getHederaHcsTopicReader(agentContext) - const rootKey = - secret.privateKey instanceof PrivateKey ? secret.privateKey : PrivateKey.fromStringED25519(secret.privateKey) - const multibasePublicKey = KeysUtility.fromPublicKey(rootKey.publicKey).toMultibase() + const controller = + typeof didDocument?.controller === 'string' + ? didDocument?.controller + : Array.isArray(didDocument?.controller) + ? didDocument?.controller[0] + : undefined + + const hederaSignKey = + secret.key.hederaPrivateKey instanceof PrivateKey + ? secret.key.hederaPrivateKey + : PrivateKey.fromStringED25519(secret.key.hederaPrivateKey) const { state, signingRequest } = await generateCreateDIDRequest( { - multibasePublicKey, + controller, + multibasePublicKey: KeysUtility.fromPublicKey(hederaSignKey.publicKey).toMultibase(), topicReader, }, { + Publisher client, } ) - const signature = rootKey.sign(signingRequest.serializedPayload) + + const signature = hederaSignKey.sign(signingRequest.serializedPayload) const createdDidDocument = await submitCreateDIDRequest( { state, signature, topicReader }, { client, + publisher: {}, } ) if (didDocument) { - // update did document const { didDocument: updatedDidDocument } = await this.updateDid(agentContext, { did: createdDidDocument.did, didDocumentOperation: 'setDidDocument', @@ -117,7 +139,6 @@ export class HederaLedgerService { return { did: createdDidDocument.did, didDocument: updatedDidDocument, - privateKey: undefined, } } @@ -162,9 +183,11 @@ export class HederaLedgerService { } ) - const rootKey = - secret.privateKey instanceof PrivateKey ? secret.privateKey : PrivateKey.fromStringED25519(secret.privateKey) - const signatures = this.signRequests(signingRequests, rootKey) + const hederaSignKey = + secret.key.hederaPrivateKey instanceof PrivateKey + ? secret.key.hederaPrivateKey + : PrivateKey.fromStringED25519(secret.key.hederaPrivateKey) + const signatures = this.signRequests(signingRequests, hederaSignKey) return await submitUpdateDIDRequest( { states, @@ -182,16 +205,33 @@ export class HederaLedgerService { agentContext: AgentContext, props: HederaDidDeactivateOptions ): Promise { + const { did, secret } = props const { network: networkName } = parseDID(props.did) return this.clientService.withClient({ networkName }, async (client: Client) => { const topicReader = this.getHederaHcsTopicReader(agentContext) - return await deactivateDID( + const { state, signingRequest } = await generateDeactivateDIDRequest( { - did: props.did, - privateKey: props.secret?.privateKey, + did, topicReader, }, - { client } + { + client, + } + ) + const hederaSignKey = + secret.key.hederaPrivateKey instanceof PrivateKey + ? secret.key.hederaPrivateKey + : PrivateKey.fromStringED25519(secret.key.hederaPrivateKey) + const signature = hederaSignKey.sign(signingRequest.serializedPayload) + return await submitDeactivateDIDRequest( + { + state, + signature, + topicReader, + }, + { + client, + } ) }) } diff --git a/packages/hedera/src/cache/CredoCache.ts b/packages/hedera/src/ledger/cache/CredoCache.ts similarity index 100% rename from packages/hedera/src/cache/CredoCache.ts rename to packages/hedera/src/ledger/cache/CredoCache.ts diff --git a/packages/hedera/src/ledger/publisher/Publisher.ts b/packages/hedera/src/ledger/publisher/Publisher.ts new file mode 100644 index 0000000000..27ad42db2d --- /dev/null +++ b/packages/hedera/src/ledger/publisher/Publisher.ts @@ -0,0 +1,15 @@ +import { Client, PublicKey } from '@hashgraph/sdk' +import { Publisher as ClientPublisher } from '@hiero-did-sdk/publisher-internal' + +export class Publisher extends ClientPublisher { + constructor( + client: Client, + private readonly submitKey?: PublicKey + ) { + super(client) + } + + publicKey(): PublicKey { + return this.submitKey ?? this.client.operatorPublicKey! + } +} diff --git a/packages/hedera/tests/HederaDidRegistrar.e2e.test.ts b/packages/hedera/tests/HederaDidRegistrar.e2e.test.ts index 1d73cab1c1..3d5dd04d42 100644 --- a/packages/hedera/tests/HederaDidRegistrar.e2e.test.ts +++ b/packages/hedera/tests/HederaDidRegistrar.e2e.test.ts @@ -59,6 +59,7 @@ describe('Hedera DID registrar', () => { options: { network: 'testnet' }, secret: { privateKey }, }) + expect(didResult).toMatchObject({ didState: { state: 'finished', diff --git a/packages/hedera/tests/HederaDidResolver.e2e.test.ts b/packages/hedera/tests/HederaDidResolver.e2e.test.ts index b3ea45f3a1..0a16db1b74 100644 --- a/packages/hedera/tests/HederaDidResolver.e2e.test.ts +++ b/packages/hedera/tests/HederaDidResolver.e2e.test.ts @@ -1,4 +1,5 @@ -import { Agent, ConsoleLogger, JsonTransformer, LogLevel } from '@credo-ts/core' +import { Agent, ConsoleLogger, JsonTransformer, Kms, LogLevel } from '@credo-ts/core' +import { PrivateKey } from '@hashgraph/sdk' import { HederaDidCreateOptions } from '../src/ledger/HederaLedgerService' import { getHederaAgent } from './utils' @@ -16,7 +17,25 @@ describe('Hedera DID resolver', () => { }) await agent.initialize() - const didResult = await agent.dids.create({ method: 'hedera', secret: { privateKey } }) + const hederaPrivateKey = PrivateKey.fromStringDer(privateKey) + hederaPrivateKey.toBytes() + + const key = await agent.kms.createKey({ + type: { + crv: 'Ed25519', + kty: 'OKP', + }, + }) + const publicKeyJwk = Kms.PublicJwk.fromPublicJwk(key.publicJwk) + const _publicKeyMultibase = publicKeyJwk.fingerprint + + const { signature } = await kms.sign({ + data: payload, + algorithm: publicJwk.signatureAlgorithm, + keyId: kmsKeyId, + }) + + const didResult = await agent.dids.create({ method: 'hedera', secret: { key: {} } }) if (!didResult.didState.did) { throw new Error('No DID created') } From 1989c9ac422e56d65aec924f02eb15e9e74d70ca Mon Sep 17 00:00:00 2001 From: "andrey.kononov" Date: Tue, 1 Jul 2025 22:51:30 +0300 Subject: [PATCH 57/89] Inject KMS to the ledger service Implement KMSPublisher Refactor DidRegstrar.Create API --- .../hedera/src/dids/HederaDidRegistrar.ts | 246 +++++++------ .../hedera/src/ledger/HederaLedgerService.ts | 323 ++++++++++-------- .../src/ledger/publisher/KmsPublisher.ts | 61 ++++ .../hedera/src/ledger/publisher/Publisher.ts | 15 - .../tests/HederaDidRegistrar.e2e.test.ts | 28 +- .../tests/HederaDidResolver.e2e.test.ts | 34 +- 6 files changed, 391 insertions(+), 316 deletions(-) create mode 100644 packages/hedera/src/ledger/publisher/KmsPublisher.ts delete mode 100644 packages/hedera/src/ledger/publisher/Publisher.ts diff --git a/packages/hedera/src/dids/HederaDidRegistrar.ts b/packages/hedera/src/dids/HederaDidRegistrar.ts index ad3c3a4cc3..d437824098 100644 --- a/packages/hedera/src/dids/HederaDidRegistrar.ts +++ b/packages/hedera/src/dids/HederaDidRegistrar.ts @@ -3,17 +3,13 @@ import { DidCreateResult, DidDeactivateResult, DidDocument, - DidDocumentKey, DidDocumentRole, DidDocumentService, DidRecord, DidRegistrar, DidRepository, DidUpdateResult, - JsonTransformer, } from '@credo-ts/core' -import { PrivateKey } from '@hashgraph/sdk' -import { KeysUtility } from '@hiero-did-sdk/core' import { HederaDidCreateOptions, HederaDidDeactivateOptions, @@ -32,7 +28,7 @@ export class HederaDidRegistrar implements DidRegistrar { const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) // Create did - const { did, didDocument } = await ledgerService.createDid(agentContext, options) + const { did, didDocument, keys } = await ledgerService.createDid(agentContext, options) // Save the did to wallet const credoDidDocument = new DidDocument({ @@ -40,16 +36,6 @@ export class HederaDidRegistrar implements DidRegistrar { service: didDocument.service?.map((s) => new DidDocumentService(s)), }) - const hederaSignKey = - options.secret.key.hederaPrivateKey instanceof PrivateKey - ? options.secret.key.hederaPrivateKey - : PrivateKey.fromStringED25519(options.secret.key.hederaPrivateKey) - const keys = [ - { - kmsKeyId: options.secret.key.kmsKeyId, - didDocumentRelativeKeyId: KeysUtility.fromPublicKey(hederaSignKey.publicKey).toMultibase(), - } satisfies DidDocumentKey, - ] await didRepository.save( agentContext, new DidRecord({ @@ -84,121 +70,123 @@ export class HederaDidRegistrar implements DidRegistrar { } } - async update(agentContext: AgentContext, options: HederaDidUpdateOptions): Promise { - const didRepository = agentContext.dependencyManager.resolve(DidRepository) - const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) - - try { - const { did } = options - const { didDocument, didDocumentMetadata } = await ledgerService.resolveDid(agentContext, did) - const didRecord = await didRepository.findCreatedDid(agentContext, did) - if (!didDocument || didDocumentMetadata.deactivated || !didRecord) { - return { - didDocumentMetadata: {}, - didRegistrationMetadata: {}, - didState: { - state: 'failed', - reason: 'Did not found', - }, - } - } - - // Update did - const { didDocument: updatedDidDocument } = await ledgerService.updateDid(agentContext, options) - - // Save the did to wallet - const hederaSignKey = - options.secret.key.hederaPrivateKey instanceof PrivateKey - ? options.secret.key.hederaPrivateKey - : PrivateKey.fromStringED25519(options.secret.key.hederaPrivateKey) - const keys = didRecord.keys ?? [] - keys.push({ - kmsKeyId: options.secret.key.kmsKeyId, - didDocumentRelativeKeyId: KeysUtility.fromPublicKey(hederaSignKey.publicKey).toMultibase(), - } satisfies DidDocumentKey) - didRecord.didDocument = JsonTransformer.fromJSON(updatedDidDocument, DidDocument) - didRecord.keys = keys - await didRepository.update(agentContext, didRecord) - - return { - didDocumentMetadata: {}, - didRegistrationMetadata: {}, - didState: { - state: 'finished', - did, - didDocument: didRecord.didDocument, - }, - } - } catch (error) { - agentContext.config.logger.error('Error updating DID', error) - return { - didDocumentMetadata: {}, - didRegistrationMetadata: {}, - didState: { - state: 'failed', - reason: `Unable update DID: ${error.message}`, - }, - } - } + async update(_agentContext: AgentContext, _options: HederaDidUpdateOptions): Promise { + throw new Error('sss') + // const didRepository = agentContext.dependencyManager.resolve(DidRepository) + // const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) + // + // try { + // const { did } = options + // const { didDocument, didDocumentMetadata } = await ledgerService.resolveDid(agentContext, did) + // const didRecord = await didRepository.findCreatedDid(agentContext, did) + // if (!didDocument || didDocumentMetadata.deactivated || !didRecord) { + // return { + // didDocumentMetadata: {}, + // didRegistrationMetadata: {}, + // didState: { + // state: 'failed', + // reason: 'Did not found', + // }, + // } + // } + // + // // Update did + // const { didDocument: updatedDidDocument } = await ledgerService.updateDid(agentContext, options) + // + // // Save the did to wallet + // const hederaSignKey = + // options.secret.key.hederaPrivateKey instanceof PrivateKey + // ? options.secret.key.hederaPrivateKey + // : PrivateKey.fromStringED25519(options.secret.key.hederaPrivateKey) + // const keys = didRecord.keys ?? [] + // keys.push({ + // kmsKeyId: options.secret.key.kmsKeyId, + // didDocumentRelativeKeyId: KeysUtility.fromPublicKey(hederaSignKey.publicKey).toMultibase(), + // } satisfies DidDocumentKey) + // didRecord.didDocument = JsonTransformer.fromJSON(updatedDidDocument, DidDocument) + // didRecord.keys = keys + // await didRepository.update(agentContext, didRecord) + // + // return { + // didDocumentMetadata: {}, + // didRegistrationMetadata: {}, + // didState: { + // state: 'finished', + // did, + // didDocument: didRecord.didDocument, + // }, + // } + // } catch (error) { + // agentContext.config.logger.error('Error updating DID', error) + // return { + // didDocumentMetadata: {}, + // didRegistrationMetadata: {}, + // didState: { + // state: 'failed', + // reason: `Unable update DID: ${error.message}`, + // }, + // } + // } } - async deactivate(agentContext: AgentContext, options: HederaDidDeactivateOptions): Promise { - const didRepository = agentContext.dependencyManager.resolve(DidRepository) - const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) - - const did = options.did - - try { - const { didDocument, didDocumentMetadata } = await ledgerService.resolveDid(agentContext, did) - - const didRecord = await didRepository.findCreatedDid(agentContext, did) - - if (!didDocument || didDocumentMetadata.deactivated || !didRecord) { - return { - didDocumentMetadata, - didRegistrationMetadata: {}, - didState: { - state: 'failed', - reason: 'Did not found', - }, - } - } - // Deactivate did - const { didDocument: deactivatedDidDocument } = await ledgerService.deactivateDid(agentContext, options) - - // Save the did to wallet - const hederaSignKey = - options.secret.key.hederaPrivateKey instanceof PrivateKey - ? options.secret.key.hederaPrivateKey - : PrivateKey.fromStringED25519(options.secret.key.hederaPrivateKey) - const keys = didRecord.keys ?? [] - keys.push({ - kmsKeyId: options.secret.key.kmsKeyId, - didDocumentRelativeKeyId: KeysUtility.fromPublicKey(hederaSignKey.publicKey).toMultibase(), - } satisfies DidDocumentKey) - didRecord.didDocument = JsonTransformer.fromJSON(deactivatedDidDocument, DidDocument) - didRecord.keys = keys - await didRepository.update(agentContext, didRecord) - - return { - didDocumentMetadata: {}, - didRegistrationMetadata: {}, - didState: { - state: 'finished', - did, - didDocument: didRecord.didDocument, - }, - } - } catch (error) { - agentContext.config.logger.error('Error deactivating DID', error) - return { - didDocumentMetadata: {}, - didRegistrationMetadata: {}, - didState: { - state: 'failed', - reason: `Unable deactivating DID: ${error.message}`, - }, - } - } + async deactivate(_agentContext: AgentContext, _options: HederaDidDeactivateOptions): Promise { + throw new Error('sss') + // const didRepository = agentContext.dependencyManager.resolve(DidRepository) + // const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) + // + // const did = options.did + // + // try { + // const { didDocument, didDocumentMetadata } = await ledgerService.resolveDid(agentContext, did) + // + // const didRecord = await didRepository.findCreatedDid(agentContext, did) + // + // if (!didDocument || didDocumentMetadata.deactivated || !didRecord) { + // return { + // didDocumentMetadata, + // didRegistrationMetadata: {}, + // didState: { + // state: 'failed', + // reason: 'Did not found', + // }, + // } + // } + // // Deactivate did + // const { didDocument: deactivatedDidDocument } = await ledgerService.deactivateDid(agentContext, options) + // + // // Save the did to wallet + // const hederaSignKey = + // options.secret.key.hederaPrivateKey instanceof PrivateKey + // ? options.secret.key.hederaPrivateKey + // : PrivateKey.fromStringED25519(options.secret.key.hederaPrivateKey) + // const keys = didRecord.keys ?? [] + // keys.push({ + // kmsKeyId: options.secret.key.kmsKeyId, + // didDocumentRelativeKeyId: KeysUtility.fromPublicKey(hederaSignKey.publicKey).toMultibase(), + // } satisfies DidDocumentKey) + // didRecord.didDocument = JsonTransformer.fromJSON(deactivatedDidDocument, DidDocument) + // didRecord.keys = keys + // await didRepository.update(agentContext, didRecord) + // + // return { + // didDocumentMetadata: {}, + // didRegistrationMetadata: {}, + // didState: { + // state: 'finished', + // did, + // didDocument: didRecord.didDocument, + // }, + // } + // } catch (error) { + // agentContext.config.logger.error('Error deactivating DID', error) + // return { + // didDocumentMetadata: {}, + // didRegistrationMetadata: {}, + // didState: { + // state: 'failed', + // reason: `Unable deactivating DID: ${error.message}`, + // }, + // } + // } } } diff --git a/packages/hedera/src/ledger/HederaLedgerService.ts b/packages/hedera/src/ledger/HederaLedgerService.ts index a0c0ee18cc..d112e0b2df 100644 --- a/packages/hedera/src/ledger/HederaLedgerService.ts +++ b/packages/hedera/src/ledger/HederaLedgerService.ts @@ -16,65 +16,53 @@ import { type AgentContext, DidCreateOptions, DidDeactivateOptions, - DidDocument, + DidDocumentKey, DidUpdateOptions, - injectable, + Kms, + XOR, + injectable, TypedArrayEncoder, } from '@credo-ts/core' +import { KmsJwkPublicOkp } from '@credo-ts/core/src/modules/kms' import { Client, PrivateKey } from '@hashgraph/sdk' import { HederaAnoncredsRegistry } from '@hiero-did-sdk/anoncreds' import { HederaClientService } from '@hiero-did-sdk/client' import { HederaNetwork } from '@hiero-did-sdk/client/dist/index' -import { DIDResolution, KeysUtility, Service, VerificationMethod } from '@hiero-did-sdk/core' +import {DIDResolution, Service, VerificationMethod} from '@hiero-did-sdk/core' import { CreateDIDResult, DIDUpdateBuilder, DeactivateDIDResult, UpdateDIDResult, generateCreateDIDRequest, - generateDeactivateDIDRequest, - generateUpdateDIDRequest, submitCreateDIDRequest, - submitDeactivateDIDRequest, - submitUpdateDIDRequest, } from '@hiero-did-sdk/registrar' -import { TopicReaderHederaHcs, parseDID, resolveDID } from '@hiero-did-sdk/resolver' +import { TopicReaderHederaHcs, resolveDID } from '@hiero-did-sdk/resolver' import { HederaModuleConfig } from '../HederaModuleConfig' import { CredoCache } from './cache/CredoCache' -import {Publisher} from "./publisher/Publisher"; +import { KmsPublisher } from './publisher/KmsPublisher' + +type DidOperationSecretOptions = { + keys?: DidDocumentKey[] +} & XOR<{ createKey?: boolean }, { keyId?: string }> export interface HederaDidCreateOptions extends DidCreateOptions { method: 'hedera' - did?: string - didDocument?: DidDocument - secret: { - key: { - kmsKeyId: string - publicKeyMultibase: string - } - } options?: { network?: HederaNetwork | string } + secret: DidOperationSecretOptions +} + +export interface HederaCreateDIDResult extends CreateDIDResult { + keys: DidDocumentKey[] } export interface HederaDidUpdateOptions extends DidUpdateOptions { - did: string - secret: { - key: { - kmsKeyId: string - publicKeyMultibase: string - } - } + secret: DidOperationSecretOptions } export interface HederaDidDeactivateOptions extends DidDeactivateOptions { - did: string - secret: { - key: { - kmsKeyId: string - publicKeyMultibase: string - } - } + secret: DidOperationSecretOptions } @injectable() @@ -92,10 +80,11 @@ export class HederaLedgerService { return await resolveDID(did, 'application/ld+json;profile="https://w3id.org/did-resolution"', { topicReader }) } - public async createDid(agentContext: AgentContext, props: HederaDidCreateOptions): Promise { + public async createDid(agentContext: AgentContext, props: HederaDidCreateOptions): Promise { const { options, secret, didDocument } = props return this.clientService.withClient({ networkName: options?.network }, async (client: Client) => { const topicReader = this.getHederaHcsTopicReader(agentContext) + const controller = typeof didDocument?.controller === 'string' ? didDocument?.controller @@ -103,137 +92,181 @@ export class HederaLedgerService { ? didDocument?.controller[0] : undefined - const hederaSignKey = - secret.key.hederaPrivateKey instanceof PrivateKey - ? secret.key.hederaPrivateKey - : PrivateKey.fromStringED25519(secret.key.hederaPrivateKey) - const { state, signingRequest } = await generateCreateDIDRequest( - { - controller, - multibasePublicKey: KeysUtility.fromPublicKey(hederaSignKey.publicKey).toMultibase(), - topicReader, - }, - { - Publisher - client, - } - ) - - const signature = hederaSignKey.sign(signingRequest.serializedPayload) - const createdDidDocument = await submitCreateDIDRequest( - { state, signature, topicReader }, - { - client, - publisher: {}, - } - ) + if (!props.secret.createKey && !props.secret.keyId) { + throw new Error('createKey or keyId are required') + } - if (didDocument) { - const { didDocument: updatedDidDocument } = await this.updateDid(agentContext, { - did: createdDidDocument.did, - didDocumentOperation: 'setDidDocument', - didDocument: didDocument, - options: { ...options }, - secret: { ...secret }, + const kms = agentContext.dependencyManager.resolve(Kms.KeyManagementApi) + + let keyId: string + const keys = props.secret.keys ?? [] + let publicJwk: KmsJwkPublicOkp & { crv: 'Ed25519' } + if (props.secret.createKey) { + const createKeyResult = await kms.createKey({ + type: { + crv: 'Ed25519', + kty: 'OKP', + }, }) - return { - did: createdDidDocument.did, - didDocument: updatedDidDocument, + publicJwk = createKeyResult.publicJwk + keys.push({ + kmsKeyId: createKeyResult.keyId, + didDocumentRelativeKeyId: '#key', + }) + keyId = createKeyResult.keyId + } else { + keyId = props.secret.keyId! + const _publicJwk = await kms.getPublicKey({ keyId }) + if (!_publicJwk) { + throw new Error(`Key with key id '${keyId}' not found`) + } + if (_publicJwk.kty !== 'OKP' || _publicJwk.crv !== 'Ed25519') { + throw new Error( + `Key with key id '${keyId}' uses unsupported ${Kms.getJwkHumanDescription(_publicJwk)} for did:hedera` + ) + } + publicJwk = { + ..._publicJwk, + crv: _publicJwk.crv, } } - return createdDidDocument - }) - } - - public async updateDid(agentContext: AgentContext, props: HederaDidUpdateOptions): Promise { - const { did, didDocumentOperation, didDocument, secret } = props - - if (!didDocumentOperation) { - throw new Error('DidDocumentOperation is required') - } - - const { network: networkName } = parseDID(did) - return this.clientService.withClient({ networkName }, async (client: Client) => { - const topicReader = this.getHederaHcsTopicReader(agentContext) - - const currentDidDocumentResolution = await resolveDID( - did, - 'application/ld+json;profile="https://w3id.org/did-resolution"', - { topicReader } - ) - if (!currentDidDocumentResolution.didDocument) { - throw new Error(`DID ${did} not found`) - } - - const didUpdates = this.prepareDidUpdates( - currentDidDocumentResolution.didDocument, - didDocument, - didDocumentOperation - ) + const publisher = await this.getPublisher(agentContext, client, keyId) - const { states, signingRequests } = await generateUpdateDIDRequest( + const { state, signingRequest } = await generateCreateDIDRequest( { - did, - updates: didUpdates.build(), + controller, + multibasePublicKey: this.getMultibasePublicKey(publicJwk), topicReader, }, { client, + publisher, } ) - const hederaSignKey = - secret.key.hederaPrivateKey instanceof PrivateKey - ? secret.key.hederaPrivateKey - : PrivateKey.fromStringED25519(secret.key.hederaPrivateKey) - const signatures = this.signRequests(signingRequests, hederaSignKey) - return await submitUpdateDIDRequest( - { - states, - signatures, - topicReader, - }, + const signatureResult = await kms.sign({ keyId, data: signingRequest.serializedPayload, algorithm: 'EdDSA' }) + const createdDidDocumentResult = await submitCreateDIDRequest( + { state, signature: signatureResult.signature, topicReader }, { client, + publisher, } ) + + // if (didDocument) { + // const { didDocument: updatedDidDocument, keys: updatedKeys } = await this.updateDid(agentContext, { + // did: createdDidDocument.did, + // didDocumentOperation: 'setDidDocument', + // didDocument: didDocument, + // options: { ...options }, + // secret: { ...secret }, + // }) + // return { + // did: createdDidDocument.did, + // didDocument: updatedDidDocument, + // keys: updatedKeys + // } + // } + + return { + ...createdDidDocumentResult, + keys, + } }) } + public async updateDid(_agentContext: AgentContext, _props: HederaDidUpdateOptions): Promise { + throw new Error('ddd') + // + // const { did, didDocumentOperation, didDocument, secret } = props + // + // if (!didDocumentOperation) { + // throw new Error('DidDocumentOperation is required') + // } + // + // const { network: networkName } = parseDID(did) + // return this.clientService.withClient({ networkName }, async (client: Client) => { + // const topicReader = this.getHederaHcsTopicReader(agentContext) + // + // const currentDidDocumentResolution = await resolveDID( + // did, + // 'application/ld+json;profile="https://w3id.org/did-resolution"', + // { topicReader } + // ) + // if (!currentDidDocumentResolution.didDocument) { + // throw new Error(`DID ${did} not found`) + // } + // + // const didUpdates = this.prepareDidUpdates( + // currentDidDocumentResolution.didDocument, + // didDocument, + // didDocumentOperation + // ) + // + // const { states, signingRequests } = await generateUpdateDIDRequest( + // { + // did, + // updates: didUpdates.build(), + // topicReader, + // }, + // { + // client, + // } + // ) + // + // const hederaSignKey = + // secret.key.hederaPrivateKey instanceof PrivateKey + // ? secret.key.hederaPrivateKey + // : PrivateKey.fromStringED25519(secret.key.hederaPrivateKey) + // const signatures = this.signRequests(signingRequests, hederaSignKey) + // return await submitUpdateDIDRequest( + // { + // states, + // signatures, + // topicReader, + // }, + // { + // client, + // } + // ) + // }) + } + public async deactivateDid( - agentContext: AgentContext, - props: HederaDidDeactivateOptions + _agentContext: AgentContext, + _props: HederaDidDeactivateOptions ): Promise { - const { did, secret } = props - const { network: networkName } = parseDID(props.did) - return this.clientService.withClient({ networkName }, async (client: Client) => { - const topicReader = this.getHederaHcsTopicReader(agentContext) - const { state, signingRequest } = await generateDeactivateDIDRequest( - { - did, - topicReader, - }, - { - client, - } - ) - const hederaSignKey = - secret.key.hederaPrivateKey instanceof PrivateKey - ? secret.key.hederaPrivateKey - : PrivateKey.fromStringED25519(secret.key.hederaPrivateKey) - const signature = hederaSignKey.sign(signingRequest.serializedPayload) - return await submitDeactivateDIDRequest( - { - state, - signature, - topicReader, - }, - { - client, - } - ) - }) + throw new Error('ddd') + // const { did, secret } = props + // const { network: networkName } = parseDID(props.did) + // return this.clientService.withClient({ networkName }, async (client: Client) => { + // const topicReader = this.getHederaHcsTopicReader(agentContext) + // const { state, signingRequest } = await generateDeactivateDIDRequest( + // { + // did, + // topicReader, + // }, + // { + // client, + // } + // ) + // const hederaSignKey = + // secret.key.hederaPrivateKey instanceof PrivateKey + // ? secret.key.hederaPrivateKey + // : PrivateKey.fromStringED25519(secret.key.hederaPrivateKey) + // const signature = hederaSignKey.sign(signingRequest.serializedPayload) + // return await submitDeactivateDIDRequest( + // { + // state, + // signature, + // topicReader, + // }, + // { + // client, + // } + // ) + // }) } /* Anoncreds*/ @@ -304,11 +337,21 @@ export class HederaLedgerService { return new TopicReaderHederaHcs({ ...this.config.options, cache }) } + private async getPublisher(agentContext: AgentContext, client: Client, keyId: string): Promise { + const publisher = new KmsPublisher(agentContext, client) + await publisher.setKeyId(keyId) + return publisher + } + private getHederaAnonCredsSdk(agentContext: AgentContext): HederaAnoncredsRegistry { const cache = this.config.options.cache ?? new CredoCache(agentContext) return new HederaAnoncredsRegistry({ ...this.config.options, cache }) } + private getMultibasePublicKey(publicJwk: KmsJwkPublicOkp & { crv: 'Ed25519' }): string { + return `z${TypedArrayEncoder.toBase58(Uint8Array.from(TypedArrayEncoder.fromBase64(publicJwk.x)))}` + } + private getId(item: { id: string } | string): string { const id = typeof item === 'string' ? item : item.id return id.includes('#') ? `#${id.split('#').pop()}` : id diff --git a/packages/hedera/src/ledger/publisher/KmsPublisher.ts b/packages/hedera/src/ledger/publisher/KmsPublisher.ts new file mode 100644 index 0000000000..056d57bb67 --- /dev/null +++ b/packages/hedera/src/ledger/publisher/KmsPublisher.ts @@ -0,0 +1,61 @@ +import {Client, PublicKey, Transaction, TransactionReceipt} from '@hashgraph/sdk' +import { Publisher as ClientPublisher } from '@hiero-did-sdk/publisher-internal' +import {AgentContext, Kms, TypedArrayEncoder} from "@credo-ts/core"; +import {KeyManagementApi} from "@credo-ts/core/src/modules/kms"; +import {KeysUtility} from "@hiero-did-sdk/core"; + +export class KmsPublisher extends ClientPublisher { + private readonly kms: KeyManagementApi + + private keyId!: string + private submitPublicKey!: PublicKey + + constructor( + agentContext: AgentContext, + client: Client + ) { + super(client) + this.kms = agentContext.dependencyManager.resolve(Kms.KeyManagementApi) + } + + async setKeyId(keyId: string) { + this.keyId = keyId + + const publicJwk = await this.kms.getPublicKey({ keyId }) + + if (!publicJwk) { + throw new Error(`Key with key id '${keyId}' not found`) + } + if (!publicJwk) { + throw new Error(`Key with key id '${keyId}' not found`) + } + if (publicJwk.kty !== 'OKP' || publicJwk.crv !== 'Ed25519') { + throw new Error( + `Key with key id '${keyId}' uses unsupported ${Kms.getJwkHumanDescription(publicJwk)} for did:hedera` + ) + } + this.submitPublicKey = KeysUtility.fromBytes(Uint8Array.from(TypedArrayEncoder.fromBase64(publicJwk.x))).toPublicKey() + } + + publicKey(): PublicKey { + return this.submitPublicKey + } + + async publish(transaction: Transaction): Promise { + if (!this.submitPublicKey) { + throw new Error(`Need to setup the KeyId`) + } + + const frozenTransaction = transaction.freezeWith(this.client) + + await frozenTransaction.signWith(this.submitPublicKey, async (message) => { + const signatureResult = await this.kms.sign({keyId: this.keyId, data: message, algorithm: "EdDSA"}) + return signatureResult.signature + }) + + const response = await transaction.execute(this.client); + + const receipt = await response.getReceipt(this.client); + return receipt; + } +} diff --git a/packages/hedera/src/ledger/publisher/Publisher.ts b/packages/hedera/src/ledger/publisher/Publisher.ts deleted file mode 100644 index 27ad42db2d..0000000000 --- a/packages/hedera/src/ledger/publisher/Publisher.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { Client, PublicKey } from '@hashgraph/sdk' -import { Publisher as ClientPublisher } from '@hiero-did-sdk/publisher-internal' - -export class Publisher extends ClientPublisher { - constructor( - client: Client, - private readonly submitKey?: PublicKey - ) { - super(client) - } - - publicKey(): PublicKey { - return this.submitKey ?? this.client.operatorPublicKey! - } -} diff --git a/packages/hedera/tests/HederaDidRegistrar.e2e.test.ts b/packages/hedera/tests/HederaDidRegistrar.e2e.test.ts index 3d5dd04d42..dbe9e09dd1 100644 --- a/packages/hedera/tests/HederaDidRegistrar.e2e.test.ts +++ b/packages/hedera/tests/HederaDidRegistrar.e2e.test.ts @@ -7,7 +7,7 @@ import { import { getHederaAgent } from './utils' describe('Hedera DID registrar', () => { - const privateKey = process.env.HEDERA_TEST_OPERATOR_KEY ?? '' + const _privateKey = process.env.HEDERA_TEST_OPERATOR_KEY ?? '' const logger = new ConsoleLogger(LogLevel.error) let agent: Agent @@ -57,7 +57,9 @@ describe('Hedera DID registrar', () => { const didResult = await agent.dids.create({ method: 'hedera', options: { network: 'testnet' }, - secret: { privateKey }, + secret: { + createKey: true + }, }) expect(didResult).toMatchObject({ @@ -80,7 +82,9 @@ describe('Hedera DID registrar', () => { method: 'hedera', didDocument: validDidDoc(), options: { network: 'testnet' }, - secret: { privateKey }, + secret: { + createKey: true + }, }) expect(didResult.didState.state).toEqual('finished') @@ -122,7 +126,7 @@ describe('Hedera DID registrar', () => { network: 'testnet', }, secret: { - privateKey, + createKey: true }, }) expect(didResult).toMatchObject({ didState: { state: 'finished' } }) @@ -137,7 +141,7 @@ describe('Hedera DID registrar', () => { didDocument, didDocumentOperation: 'addToDidDocument', secret: { - privateKey, + createKey: true }, }) @@ -169,7 +173,7 @@ describe('Hedera DID registrar', () => { }, didDocumentOperation: 'removeFromDidDocument', secret: { - privateKey, + createKey: true }, }) @@ -188,7 +192,9 @@ describe('Hedera DID registrar', () => { const didResult = await agent.dids.create({ method: 'hedera', options: { network: 'testnet' }, - secret: { privateKey }, + secret: { + createKey: true + }, }) expect(didResult).toMatchObject({ didState: { state: 'finished' } }) @@ -204,7 +210,7 @@ describe('Hedera DID registrar', () => { didDocument, didDocumentOperation: 'addToDidDocument', secret: { - privateKey, + createKey: true }, }) expect(addUpdateResult.didState.didDocument?.id).toEqual(did) @@ -232,7 +238,7 @@ describe('Hedera DID registrar', () => { didDocument, didDocumentOperation: 'removeFromDidDocument', secret: { - privateKey, + createKey: true }, }) expect(removeUpdateResult.didState.didDocument?.id).toEqual(did) @@ -253,7 +259,7 @@ describe('Hedera DID registrar', () => { network: 'testnet', }, secret: { - privateKey, + createKey: true }, }) expect(didResult).toMatchObject({ didState: { state: 'finished' } }) @@ -263,7 +269,7 @@ describe('Hedera DID registrar', () => { const deactivateResult = await agent.dids.deactivate({ did, secret: { - privateKey, + createKey: true }, }) diff --git a/packages/hedera/tests/HederaDidResolver.e2e.test.ts b/packages/hedera/tests/HederaDidResolver.e2e.test.ts index 0a16db1b74..0e9ab297b3 100644 --- a/packages/hedera/tests/HederaDidResolver.e2e.test.ts +++ b/packages/hedera/tests/HederaDidResolver.e2e.test.ts @@ -1,11 +1,10 @@ -import { Agent, ConsoleLogger, JsonTransformer, Kms, LogLevel } from '@credo-ts/core' -import { PrivateKey } from '@hashgraph/sdk' +import { Agent, ConsoleLogger, JsonTransformer, LogLevel } from '@credo-ts/core' import { HederaDidCreateOptions } from '../src/ledger/HederaLedgerService' import { getHederaAgent } from './utils' describe('Hedera DID resolver', () => { - const logger = new ConsoleLogger(LogLevel.error) - const privateKey = process.env.HEDERA_TEST_OPERATOR_KEY ?? '' + const logger = new ConsoleLogger(LogLevel.debug) + const _privateKey = process.env.HEDERA_TEST_OPERATOR_KEY ?? '' let agent: Agent let did: string @@ -17,29 +16,18 @@ describe('Hedera DID resolver', () => { }) await agent.initialize() - const hederaPrivateKey = PrivateKey.fromStringDer(privateKey) - hederaPrivateKey.toBytes() - - const key = await agent.kms.createKey({ - type: { - crv: 'Ed25519', - kty: 'OKP', + const didResult = await agent.dids.create({ + method: 'hedera', + secret: { + createKey: true }, }) - const publicKeyJwk = Kms.PublicJwk.fromPublicJwk(key.publicJwk) - const _publicKeyMultibase = publicKeyJwk.fingerprint - - const { signature } = await kms.sign({ - data: payload, - algorithm: publicJwk.signatureAlgorithm, - keyId: kmsKeyId, - }) - - const didResult = await agent.dids.create({ method: 'hedera', secret: { key: {} } }) if (!didResult.didState.did) { throw new Error('No DID created') } did = didResult.didState.did + + console.log(JSON.stringify(didResult, null, 2)) }) afterAll(async () => { @@ -48,6 +36,10 @@ describe('Hedera DID resolver', () => { it('should resolve a did:cheqd did from local testnet', async () => { const resolveResult = await agent.dids.resolve(did) + + console.log(JSON.stringify(resolveResult, null, 2)) + + expect(JsonTransformer.toJSON(resolveResult)).toMatchObject({ didDocument: { '@context': ['https://www.w3.org/ns/did/v1'], From d6275c535fd206209cc3ee6dfb22059b705beb5b Mon Sep 17 00:00:00 2001 From: "andrey.kononov" Date: Wed, 2 Jul 2025 22:35:07 +0300 Subject: [PATCH 58/89] Implemented DidRegstrar.Update API Implemented DidRegstrar.Deactivate API --- .../hedera/src/dids/HederaDidRegistrar.ts | 235 ++++++----- .../hedera/src/ledger/HederaLedgerService.ts | 390 ++++++++++-------- .../src/ledger/publisher/KmsPublisher.ts | 43 +- packages/hedera/src/ledger/utils/index.ts | 41 ++ .../tests/HederaAnoncredsRegistry.e2e.test.ts | 9 +- .../tests/HederaDidRegistrar.e2e.test.ts | 191 +++++++-- .../tests/HederaDidResolver.e2e.test.ts | 11 +- 7 files changed, 546 insertions(+), 374 deletions(-) create mode 100644 packages/hedera/src/ledger/utils/index.ts diff --git a/packages/hedera/src/dids/HederaDidRegistrar.ts b/packages/hedera/src/dids/HederaDidRegistrar.ts index d437824098..8216fa229f 100644 --- a/packages/hedera/src/dids/HederaDidRegistrar.ts +++ b/packages/hedera/src/dids/HederaDidRegistrar.ts @@ -3,12 +3,14 @@ import { DidCreateResult, DidDeactivateResult, DidDocument, + DidDocumentKey, DidDocumentRole, DidDocumentService, DidRecord, DidRegistrar, DidRepository, DidUpdateResult, + JsonTransformer, } from '@credo-ts/core' import { HederaDidCreateOptions, @@ -28,7 +30,7 @@ export class HederaDidRegistrar implements DidRegistrar { const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) // Create did - const { did, didDocument, keys } = await ledgerService.createDid(agentContext, options) + const { did, didDocument, rootKey } = await ledgerService.createDid(agentContext, options) // Save the did to wallet const credoDidDocument = new DidDocument({ @@ -42,7 +44,7 @@ export class HederaDidRegistrar implements DidRegistrar { did, role: DidDocumentRole.Created, didDocument: credoDidDocument, - keys, + keys: [rootKey], }) ) @@ -70,123 +72,120 @@ export class HederaDidRegistrar implements DidRegistrar { } } - async update(_agentContext: AgentContext, _options: HederaDidUpdateOptions): Promise { - throw new Error('sss') - // const didRepository = agentContext.dependencyManager.resolve(DidRepository) - // const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) - // - // try { - // const { did } = options - // const { didDocument, didDocumentMetadata } = await ledgerService.resolveDid(agentContext, did) - // const didRecord = await didRepository.findCreatedDid(agentContext, did) - // if (!didDocument || didDocumentMetadata.deactivated || !didRecord) { - // return { - // didDocumentMetadata: {}, - // didRegistrationMetadata: {}, - // didState: { - // state: 'failed', - // reason: 'Did not found', - // }, - // } - // } - // - // // Update did - // const { didDocument: updatedDidDocument } = await ledgerService.updateDid(agentContext, options) - // - // // Save the did to wallet - // const hederaSignKey = - // options.secret.key.hederaPrivateKey instanceof PrivateKey - // ? options.secret.key.hederaPrivateKey - // : PrivateKey.fromStringED25519(options.secret.key.hederaPrivateKey) - // const keys = didRecord.keys ?? [] - // keys.push({ - // kmsKeyId: options.secret.key.kmsKeyId, - // didDocumentRelativeKeyId: KeysUtility.fromPublicKey(hederaSignKey.publicKey).toMultibase(), - // } satisfies DidDocumentKey) - // didRecord.didDocument = JsonTransformer.fromJSON(updatedDidDocument, DidDocument) - // didRecord.keys = keys - // await didRepository.update(agentContext, didRecord) - // - // return { - // didDocumentMetadata: {}, - // didRegistrationMetadata: {}, - // didState: { - // state: 'finished', - // did, - // didDocument: didRecord.didDocument, - // }, - // } - // } catch (error) { - // agentContext.config.logger.error('Error updating DID', error) - // return { - // didDocumentMetadata: {}, - // didRegistrationMetadata: {}, - // didState: { - // state: 'failed', - // reason: `Unable update DID: ${error.message}`, - // }, - // } - // } + async update(agentContext: AgentContext, options: HederaDidUpdateOptions): Promise { + const didRepository = agentContext.dependencyManager.resolve(DidRepository) + const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) + + try { + const { did } = options + const { didDocument, didDocumentMetadata } = await ledgerService.resolveDid(agentContext, did) + const didRecord = await didRepository.findCreatedDid(agentContext, did) + if (!didDocument || didDocumentMetadata.deactivated || !didRecord) { + return { + didDocumentMetadata: {}, + didRegistrationMetadata: {}, + didState: { + state: 'failed', + reason: 'Did not found', + }, + } + } + + // Update did + const keys = this.concateKeys(didRecord.keys, options.secret?.keys) + const { didDocument: updatedDidDocument } = await ledgerService.updateDid(agentContext, { + ...options, + secret: { keys }, + }) + + // Save the did to wallet + didRecord.didDocument = JsonTransformer.fromJSON(updatedDidDocument, DidDocument) + didRecord.keys = keys + await didRepository.update(agentContext, didRecord) + + return { + didDocumentMetadata: {}, + didRegistrationMetadata: {}, + didState: { + state: 'finished', + did, + didDocument: didRecord.didDocument, + }, + } + } catch (error) { + agentContext.config.logger.error('Error updating DID', error) + return { + didDocumentMetadata: {}, + didRegistrationMetadata: {}, + didState: { + state: 'failed', + reason: `Unable update DID: ${error.message}`, + }, + } + } + } + + async deactivate(agentContext: AgentContext, options: HederaDidDeactivateOptions): Promise { + const didRepository = agentContext.dependencyManager.resolve(DidRepository) + const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) + + const did = options.did + + try { + const { didDocument, didDocumentMetadata } = await ledgerService.resolveDid(agentContext, did) + + const didRecord = await didRepository.findCreatedDid(agentContext, did) + + if (!didDocument || didDocumentMetadata.deactivated || !didRecord) { + return { + didDocumentMetadata, + didRegistrationMetadata: {}, + didState: { + state: 'failed', + reason: 'Did not found', + }, + } + } + // Deactivate did + const keys = this.concateKeys(didRecord.keys, options.secret?.keys) + const { didDocument: deactivatedDidDocument } = await ledgerService.deactivateDid(agentContext, { + ...options, + secret: { keys }, + }) + + // Save the did to wallet + didRecord.didDocument = JsonTransformer.fromJSON(deactivatedDidDocument, DidDocument) + didRecord.keys = keys + await didRepository.update(agentContext, didRecord) + + return { + didDocumentMetadata: {}, + didRegistrationMetadata: {}, + didState: { + state: 'finished', + did, + didDocument: didRecord.didDocument, + }, + } + } catch (error) { + agentContext.config.logger.error('Error deactivating DID', error) + return { + didDocumentMetadata: {}, + didRegistrationMetadata: {}, + didState: { + state: 'failed', + reason: `Unable deactivating DID: ${error.message}`, + }, + } + } } - async deactivate(_agentContext: AgentContext, _options: HederaDidDeactivateOptions): Promise { - throw new Error('sss') - // const didRepository = agentContext.dependencyManager.resolve(DidRepository) - // const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) - // - // const did = options.did - // - // try { - // const { didDocument, didDocumentMetadata } = await ledgerService.resolveDid(agentContext, did) - // - // const didRecord = await didRepository.findCreatedDid(agentContext, did) - // - // if (!didDocument || didDocumentMetadata.deactivated || !didRecord) { - // return { - // didDocumentMetadata, - // didRegistrationMetadata: {}, - // didState: { - // state: 'failed', - // reason: 'Did not found', - // }, - // } - // } - // // Deactivate did - // const { didDocument: deactivatedDidDocument } = await ledgerService.deactivateDid(agentContext, options) - // - // // Save the did to wallet - // const hederaSignKey = - // options.secret.key.hederaPrivateKey instanceof PrivateKey - // ? options.secret.key.hederaPrivateKey - // : PrivateKey.fromStringED25519(options.secret.key.hederaPrivateKey) - // const keys = didRecord.keys ?? [] - // keys.push({ - // kmsKeyId: options.secret.key.kmsKeyId, - // didDocumentRelativeKeyId: KeysUtility.fromPublicKey(hederaSignKey.publicKey).toMultibase(), - // } satisfies DidDocumentKey) - // didRecord.didDocument = JsonTransformer.fromJSON(deactivatedDidDocument, DidDocument) - // didRecord.keys = keys - // await didRepository.update(agentContext, didRecord) - // - // return { - // didDocumentMetadata: {}, - // didRegistrationMetadata: {}, - // didState: { - // state: 'finished', - // did, - // didDocument: didRecord.didDocument, - // }, - // } - // } catch (error) { - // agentContext.config.logger.error('Error deactivating DID', error) - // return { - // didDocumentMetadata: {}, - // didRegistrationMetadata: {}, - // didState: { - // state: 'failed', - // reason: `Unable deactivating DID: ${error.message}`, - // }, - // } - // } + private concateKeys(keys1?: DidDocumentKey[], keys2?: DidDocumentKey[]): DidDocumentKey[] { + const _keys1 = keys1 ?? [] + const _keys2 = keys2 ?? [] + return [ + ..._keys1, + ..._keys2.filter((k2) => !_keys1.some((k1) => k1.didDocumentRelativeKeyId === k2.didDocumentRelativeKeyId)), + ] } } diff --git a/packages/hedera/src/ledger/HederaLedgerService.ts b/packages/hedera/src/ledger/HederaLedgerService.ts index d112e0b2df..388cbf8a26 100644 --- a/packages/hedera/src/ledger/HederaLedgerService.ts +++ b/packages/hedera/src/ledger/HederaLedgerService.ts @@ -16,53 +16,61 @@ import { type AgentContext, DidCreateOptions, DidDeactivateOptions, + type DidDocument, DidDocumentKey, DidUpdateOptions, Kms, - XOR, - injectable, TypedArrayEncoder, + injectable, } from '@credo-ts/core' -import { KmsJwkPublicOkp } from '@credo-ts/core/src/modules/kms' -import { Client, PrivateKey } from '@hashgraph/sdk' +import { KeyManagementApi } from '@credo-ts/core/src/modules/kms' +import { Client } from '@hashgraph/sdk' import { HederaAnoncredsRegistry } from '@hiero-did-sdk/anoncreds' import { HederaClientService } from '@hiero-did-sdk/client' import { HederaNetwork } from '@hiero-did-sdk/client/dist/index' -import {DIDResolution, Service, VerificationMethod} from '@hiero-did-sdk/core' +import { DIDResolution, DID_ROOT_KEY_ID, Service, VerificationMethod } from '@hiero-did-sdk/core' import { CreateDIDResult, DIDUpdateBuilder, DeactivateDIDResult, UpdateDIDResult, generateCreateDIDRequest, + generateDeactivateDIDRequest, + generateUpdateDIDRequest, submitCreateDIDRequest, + submitDeactivateDIDRequest, + submitUpdateDIDRequest, } from '@hiero-did-sdk/registrar' -import { TopicReaderHederaHcs, resolveDID } from '@hiero-did-sdk/resolver' +import { TopicReaderHederaHcs, parseDID, resolveDID } from '@hiero-did-sdk/resolver' import { HederaModuleConfig } from '../HederaModuleConfig' import { CredoCache } from './cache/CredoCache' import { KmsPublisher } from './publisher/KmsPublisher' - -type DidOperationSecretOptions = { - keys?: DidDocumentKey[] -} & XOR<{ createKey?: boolean }, { keyId?: string }> +import { createOrGetKey, getMultibasePublicKey } from './utils' export interface HederaDidCreateOptions extends DidCreateOptions { method: 'hedera' options?: { network?: HederaNetwork | string } - secret: DidOperationSecretOptions + secret?: { + rootKeyId?: string + keys?: DidDocumentKey[] + } } export interface HederaCreateDIDResult extends CreateDIDResult { - keys: DidDocumentKey[] + rootKey: DidDocumentKey } export interface HederaDidUpdateOptions extends DidUpdateOptions { - secret: DidOperationSecretOptions + secret?: { + keys?: DidDocumentKey[] + } } export interface HederaDidDeactivateOptions extends DidDeactivateOptions { - secret: DidOperationSecretOptions + secret?: { + keys?: DidDocumentKey[] + } } @injectable() @@ -92,51 +100,17 @@ export class HederaLedgerService { ? didDocument?.controller[0] : undefined - if (!props.secret.createKey && !props.secret.keyId) { - throw new Error('createKey or keyId are required') - } - const kms = agentContext.dependencyManager.resolve(Kms.KeyManagementApi) - let keyId: string - const keys = props.secret.keys ?? [] - let publicJwk: KmsJwkPublicOkp & { crv: 'Ed25519' } - if (props.secret.createKey) { - const createKeyResult = await kms.createKey({ - type: { - crv: 'Ed25519', - kty: 'OKP', - }, - }) - publicJwk = createKeyResult.publicJwk - keys.push({ - kmsKeyId: createKeyResult.keyId, - didDocumentRelativeKeyId: '#key', - }) - keyId = createKeyResult.keyId - } else { - keyId = props.secret.keyId! - const _publicJwk = await kms.getPublicKey({ keyId }) - if (!_publicJwk) { - throw new Error(`Key with key id '${keyId}' not found`) - } - if (_publicJwk.kty !== 'OKP' || _publicJwk.crv !== 'Ed25519') { - throw new Error( - `Key with key id '${keyId}' uses unsupported ${Kms.getJwkHumanDescription(_publicJwk)} for did:hedera` - ) - } - publicJwk = { - ..._publicJwk, - crv: _publicJwk.crv, - } - } + const { keyId, publicJwk } = await createOrGetKey(kms, secret?.rootKeyId) + const rootKey = { kmsKeyId: keyId, didDocumentRelativeKeyId: DID_ROOT_KEY_ID } const publisher = await this.getPublisher(agentContext, client, keyId) const { state, signingRequest } = await generateCreateDIDRequest( { controller, - multibasePublicKey: this.getMultibasePublicKey(publicJwk), + multibasePublicKey: getMultibasePublicKey(publicJwk), topicReader, }, { @@ -146,7 +120,7 @@ export class HederaLedgerService { ) const signatureResult = await kms.sign({ keyId, data: signingRequest.serializedPayload, algorithm: 'EdDSA' }) - const createdDidDocumentResult = await submitCreateDIDRequest( + const createDidDocumentResult = await submitCreateDIDRequest( { state, signature: signatureResult.signature, topicReader }, { client, @@ -154,119 +128,139 @@ export class HederaLedgerService { } ) - // if (didDocument) { - // const { didDocument: updatedDidDocument, keys: updatedKeys } = await this.updateDid(agentContext, { - // did: createdDidDocument.did, - // didDocumentOperation: 'setDidDocument', - // didDocument: didDocument, - // options: { ...options }, - // secret: { ...secret }, - // }) - // return { - // did: createdDidDocument.did, - // didDocument: updatedDidDocument, - // keys: updatedKeys - // } - // } + if (didDocument) { + const keys = [...(secret?.keys ?? []), ...[rootKey]] + const updateDidDocumentResult = await this.updateDid(agentContext, { + did: createDidDocumentResult.did, + didDocumentOperation: 'setDidDocument', + didDocument, + options: { ...options }, + secret: { keys }, + }) + return { + ...updateDidDocumentResult, + rootKey, + } + } return { - ...createdDidDocumentResult, - keys, + ...createDidDocumentResult, + rootKey, } }) } - public async updateDid(_agentContext: AgentContext, _props: HederaDidUpdateOptions): Promise { - throw new Error('ddd') - // - // const { did, didDocumentOperation, didDocument, secret } = props - // - // if (!didDocumentOperation) { - // throw new Error('DidDocumentOperation is required') - // } - // - // const { network: networkName } = parseDID(did) - // return this.clientService.withClient({ networkName }, async (client: Client) => { - // const topicReader = this.getHederaHcsTopicReader(agentContext) - // - // const currentDidDocumentResolution = await resolveDID( - // did, - // 'application/ld+json;profile="https://w3id.org/did-resolution"', - // { topicReader } - // ) - // if (!currentDidDocumentResolution.didDocument) { - // throw new Error(`DID ${did} not found`) - // } - // - // const didUpdates = this.prepareDidUpdates( - // currentDidDocumentResolution.didDocument, - // didDocument, - // didDocumentOperation - // ) - // - // const { states, signingRequests } = await generateUpdateDIDRequest( - // { - // did, - // updates: didUpdates.build(), - // topicReader, - // }, - // { - // client, - // } - // ) - // - // const hederaSignKey = - // secret.key.hederaPrivateKey instanceof PrivateKey - // ? secret.key.hederaPrivateKey - // : PrivateKey.fromStringED25519(secret.key.hederaPrivateKey) - // const signatures = this.signRequests(signingRequests, hederaSignKey) - // return await submitUpdateDIDRequest( - // { - // states, - // signatures, - // topicReader, - // }, - // { - // client, - // } - // ) - // }) + public async updateDid(agentContext: AgentContext, props: HederaDidUpdateOptions): Promise { + const { did, didDocumentOperation, didDocument, secret } = props + const kms = agentContext.dependencyManager.resolve(Kms.KeyManagementApi) + + if (!didDocumentOperation) { + throw new Error('DidDocumentOperation is required') + } + + // Check root key presents + const rootKey = (secret?.keys ?? []).find((k) => k.didDocumentRelativeKeyId === DID_ROOT_KEY_ID) + if (!rootKey?.kmsKeyId) { + throw new Error('The root key not found in the KMS') + } + + // Check all required keys presents + this.checkKeys(didDocument, secret?.keys ?? []) + + const { network: networkName } = parseDID(did) + return this.clientService.withClient({ networkName }, async (client: Client) => { + const topicReader = this.getHederaHcsTopicReader(agentContext) + + const currentDidDocumentResolution = await resolveDID( + did, + 'application/ld+json;profile="https://w3id.org/did-resolution"', + { topicReader } + ) + if (!currentDidDocumentResolution.didDocument) { + throw new Error(`DID ${did} not found`) + } + + const didUpdates = this.prepareDidUpdates( + currentDidDocumentResolution.didDocument, + didDocument, + didDocumentOperation + ) + + const publisher = await this.getPublisher(agentContext, client, rootKey.kmsKeyId) + + const { states, signingRequests } = await generateUpdateDIDRequest( + { + did, + updates: didUpdates.build(), + topicReader, + }, + { + client, + publisher, + } + ) + + const signatures = await this.signRequests(signingRequests, kms, rootKey.kmsKeyId) + return await submitUpdateDIDRequest( + { + states, + signatures, + topicReader, + }, + { + client, + publisher, + } + ) + }) } public async deactivateDid( - _agentContext: AgentContext, - _props: HederaDidDeactivateOptions + agentContext: AgentContext, + props: HederaDidDeactivateOptions ): Promise { - throw new Error('ddd') - // const { did, secret } = props - // const { network: networkName } = parseDID(props.did) - // return this.clientService.withClient({ networkName }, async (client: Client) => { - // const topicReader = this.getHederaHcsTopicReader(agentContext) - // const { state, signingRequest } = await generateDeactivateDIDRequest( - // { - // did, - // topicReader, - // }, - // { - // client, - // } - // ) - // const hederaSignKey = - // secret.key.hederaPrivateKey instanceof PrivateKey - // ? secret.key.hederaPrivateKey - // : PrivateKey.fromStringED25519(secret.key.hederaPrivateKey) - // const signature = hederaSignKey.sign(signingRequest.serializedPayload) - // return await submitDeactivateDIDRequest( - // { - // state, - // signature, - // topicReader, - // }, - // { - // client, - // } - // ) - // }) + const { did, secret } = props + + const kms = agentContext.dependencyManager.resolve(Kms.KeyManagementApi) + + const rootKey = (secret?.keys ?? []).find((k) => k.didDocumentRelativeKeyId === DID_ROOT_KEY_ID) + if (!rootKey?.kmsKeyId) { + throw new Error('The root key not found in the KMS') + } + + const { network: networkName } = parseDID(props.did) + return this.clientService.withClient({ networkName }, async (client: Client) => { + const topicReader = this.getHederaHcsTopicReader(agentContext) + + const publisher = await this.getPublisher(agentContext, client, rootKey.kmsKeyId) + + const { state, signingRequest } = await generateDeactivateDIDRequest( + { + did, + topicReader, + }, + { + client, + publisher, + } + ) + const signatureResult = await kms.sign({ + keyId: rootKey.kmsKeyId, + data: signingRequest.serializedPayload, + algorithm: 'EdDSA', + }) + return await submitDeactivateDIDRequest( + { + state, + signature: signatureResult.signature, + topicReader, + }, + { + client, + publisher, + } + ) + }) } /* Anoncreds*/ @@ -348,8 +342,8 @@ export class HederaLedgerService { return new HederaAnoncredsRegistry({ ...this.config.options, cache }) } - private getMultibasePublicKey(publicJwk: KmsJwkPublicOkp & { crv: 'Ed25519' }): string { - return `z${TypedArrayEncoder.toBase58(Uint8Array.from(TypedArrayEncoder.fromBase64(publicJwk.x)))}` + private isDidRootKeyId(id: string): boolean { + return id.endsWith(DID_ROOT_KEY_ID) } private getId(item: { id: string } | string): string { @@ -371,13 +365,47 @@ export class HederaLedgerService { return { existingItems, newItems, missingItems } } - private signRequests(signingRequests: Record, privateKey: PrivateKey): Record { - return Object.entries(signingRequests).reduce((acc, [key, request]) => { - return { - ...acc, - [key]: privateKey.sign(request.serializedPayload), + private async signRequests( + signingRequests: Record, + kms: KeyManagementApi, + keyId: string + ): Promise> { + const result: Record = {} + + for (const [key, request] of Object.entries(signingRequests)) { + const signResult = await kms.sign({ + keyId, + data: request.serializedPayload, + algorithm: 'EdDSA', + }) + result[key] = signResult.signature + } + + return result + } + + private checkKeys(didDocument: DidDocument | Partial, keys: DidDocumentKey[]) { + const fields = [ + 'verificationMethod', + 'assertionMethod', + 'authentication', + 'capabilityDelegation', + 'capabilityInvocation', + 'keyAgreement', + ] + for (const field of fields) { + const fieldValue = (didDocument as any)[field] + if (fieldValue) { + const fieldValues = Array.isArray(fieldValue) ? fieldValue : [fieldValue] + + for (const value of fieldValues) { + const id = this.getId(value) + if (!keys.some((key) => key.didDocumentRelativeKeyId === id)) { + throw new Error(`Key ${id} from ${field} not found in keys`) + } + } } - }, {}) + } } private prepareDidUpdates(currentDoc: any, newDoc: any, operation: string): DIDUpdateBuilder { @@ -392,30 +420,38 @@ export class HederaLedgerService { 'keyAgreement', ] - fields.forEach((field) => { + for (const field of fields) { const { existingItems, newItems, missingItems } = this.getDiff(currentDoc[field], newDoc[field]) if (operation === 'setDidDocument') { - missingItems.forEach((item) => { - this.getUpdateMethod(builder, field, 'remove')(this.getId(item)) - }) - newItems.forEach((item) => { - this.getUpdateMethod(builder, field, 'add')(item) - }) + for (const item of missingItems) { + if (!this.isDidRootKeyId(typeof item === 'string' ? item : item.id)) { + this.getUpdateMethod(builder, field, 'remove')(this.getId(item)) + } + } + for (const item of newItems) { + if (!this.isDidRootKeyId(typeof item === 'string' ? item : item.id)) { + this.getUpdateMethod(builder, field, 'add')(item) + } + } } if (operation === 'addToDidDocument') { - newItems.forEach((item) => { - this.getUpdateMethod(builder, field, 'add')(item) - }) + for (const item of newItems) { + if (!this.isDidRootKeyId(typeof item === 'string' ? item : item.id)) { + this.getUpdateMethod(builder, field, 'add')(item) + } + } } if (operation === 'removeFromDidDocument') { - existingItems.forEach((item) => { - this.getUpdateMethod(builder, field, 'remove')(item) - }) + for (const item of existingItems) { + if (!this.isDidRootKeyId(typeof item === 'string' ? item : item.id)) { + this.getUpdateMethod(builder, field, 'remove')(item) + } + } } - }) + } return builder } diff --git a/packages/hedera/src/ledger/publisher/KmsPublisher.ts b/packages/hedera/src/ledger/publisher/KmsPublisher.ts index 056d57bb67..aa64b5e1ef 100644 --- a/packages/hedera/src/ledger/publisher/KmsPublisher.ts +++ b/packages/hedera/src/ledger/publisher/KmsPublisher.ts @@ -1,8 +1,9 @@ -import {Client, PublicKey, Transaction, TransactionReceipt} from '@hashgraph/sdk' +import { AgentContext, Kms, TypedArrayEncoder } from '@credo-ts/core' +import { KeyManagementApi } from '@credo-ts/core/src/modules/kms' +import { Client, PublicKey, Transaction, TransactionReceipt } from '@hashgraph/sdk' +import { KeysUtility } from '@hiero-did-sdk/core' import { Publisher as ClientPublisher } from '@hiero-did-sdk/publisher-internal' -import {AgentContext, Kms, TypedArrayEncoder} from "@credo-ts/core"; -import {KeyManagementApi} from "@credo-ts/core/src/modules/kms"; -import {KeysUtility} from "@hiero-did-sdk/core"; +import { createOrGetKey } from '../utils' export class KmsPublisher extends ClientPublisher { private readonly kms: KeyManagementApi @@ -10,31 +11,17 @@ export class KmsPublisher extends ClientPublisher { private keyId!: string private submitPublicKey!: PublicKey - constructor( - agentContext: AgentContext, - client: Client - ) { + constructor(agentContext: AgentContext, client: Client) { super(client) this.kms = agentContext.dependencyManager.resolve(Kms.KeyManagementApi) } async setKeyId(keyId: string) { this.keyId = keyId - - const publicJwk = await this.kms.getPublicKey({ keyId }) - - if (!publicJwk) { - throw new Error(`Key with key id '${keyId}' not found`) - } - if (!publicJwk) { - throw new Error(`Key with key id '${keyId}' not found`) - } - if (publicJwk.kty !== 'OKP' || publicJwk.crv !== 'Ed25519') { - throw new Error( - `Key with key id '${keyId}' uses unsupported ${Kms.getJwkHumanDescription(publicJwk)} for did:hedera` - ) - } - this.submitPublicKey = KeysUtility.fromBytes(Uint8Array.from(TypedArrayEncoder.fromBase64(publicJwk.x))).toPublicKey() + const { publicJwk } = await createOrGetKey(this.kms, keyId) + this.submitPublicKey = KeysUtility.fromBytes( + Uint8Array.from(TypedArrayEncoder.fromBase64(publicJwk.x)) + ).toPublicKey() } publicKey(): PublicKey { @@ -43,19 +30,19 @@ export class KmsPublisher extends ClientPublisher { async publish(transaction: Transaction): Promise { if (!this.submitPublicKey) { - throw new Error(`Need to setup the KeyId`) + throw new Error('Need to setup the KeyId') } const frozenTransaction = transaction.freezeWith(this.client) await frozenTransaction.signWith(this.submitPublicKey, async (message) => { - const signatureResult = await this.kms.sign({keyId: this.keyId, data: message, algorithm: "EdDSA"}) + const signatureResult = await this.kms.sign({ keyId: this.keyId, data: message, algorithm: 'EdDSA' }) return signatureResult.signature }) - const response = await transaction.execute(this.client); + const response = await transaction.execute(this.client) - const receipt = await response.getReceipt(this.client); - return receipt; + const receipt = await response.getReceipt(this.client) + return receipt } } diff --git a/packages/hedera/src/ledger/utils/index.ts b/packages/hedera/src/ledger/utils/index.ts new file mode 100644 index 0000000000..3d99837ae8 --- /dev/null +++ b/packages/hedera/src/ledger/utils/index.ts @@ -0,0 +1,41 @@ +import { Kms, TypedArrayEncoder } from '@credo-ts/core' +import { KeyManagementApi, KmsJwkPublicOkp } from '@credo-ts/core/src/modules/kms' + +export const getMultibasePublicKey = (publicJwk: KmsJwkPublicOkp & { crv: 'Ed25519' }): string => { + return `z${TypedArrayEncoder.toBase58(Uint8Array.from(TypedArrayEncoder.fromBase64(publicJwk.x)))}` +} + +export const createOrGetKey = async ( + kms: KeyManagementApi, + keyId?: string +): Promise<{ keyId: string; publicJwk: KmsJwkPublicOkp & { crv: 'Ed25519' } }> => { + if (!keyId) { + const createKeyResult = await kms.createKey({ + type: { + crv: 'Ed25519', + kty: 'OKP', + }, + }) + return { + publicJwk: createKeyResult.publicJwk, + keyId: createKeyResult.keyId, + } + } + + const publicJwk = await kms.getPublicKey({ keyId }) + if (!publicJwk) { + throw new Error(`Key with key id '${keyId}' not found`) + } + if (publicJwk.kty !== 'OKP' || publicJwk.crv !== 'Ed25519') { + throw new Error( + `Key with key id '${keyId}' uses unsupported ${Kms.getJwkHumanDescription(publicJwk)} for did:hedera` + ) + } + return { + keyId, + publicJwk: { + ...publicJwk, + crv: publicJwk.crv, + }, + } +} diff --git a/packages/hedera/tests/HederaAnoncredsRegistry.e2e.test.ts b/packages/hedera/tests/HederaAnoncredsRegistry.e2e.test.ts index 9c469d8ecf..29f38c7540 100644 --- a/packages/hedera/tests/HederaAnoncredsRegistry.e2e.test.ts +++ b/packages/hedera/tests/HederaAnoncredsRegistry.e2e.test.ts @@ -1,15 +1,15 @@ import { Agent, ConsoleLogger, LogLevel, utils } from '@credo-ts/core' +import { HederaDidCreateOptions } from '../src/ledger/HederaLedgerService' import { getHederaAgent, waitTimeout } from './utils' import { testCache } from './utils/testCache' describe('Hedera AnonCreds support', () => { - const privateKey = process.env.HEDERA_TEST_OPERATOR_KEY ?? '' const consensusTimeout = 5000 let agent: Agent let did: string - const logger = new ConsoleLogger(LogLevel.warn) + const logger = new ConsoleLogger(LogLevel.error) const cache = new testCache() beforeAll(async () => { @@ -22,11 +22,8 @@ describe('Hedera AnonCreds support', () => { await agent.initialize() // Making the test did - const didRegistrarResult = await agent.dids.create({ + const didRegistrarResult = await agent.dids.create({ method: 'hedera', - secret: { - privateKey, - }, }) if (!didRegistrarResult.didState?.didDocument?.id) throw new Error('DidRegistrarError') diff --git a/packages/hedera/tests/HederaDidRegistrar.e2e.test.ts b/packages/hedera/tests/HederaDidRegistrar.e2e.test.ts index dbe9e09dd1..21e25654a9 100644 --- a/packages/hedera/tests/HederaDidRegistrar.e2e.test.ts +++ b/packages/hedera/tests/HederaDidRegistrar.e2e.test.ts @@ -1,24 +1,32 @@ -import { Agent, ConsoleLogger, DidDocument, DidDocumentService, LogLevel, VerificationMethod } from '@credo-ts/core' +import { + Agent, + ConsoleLogger, + DidDocument, + DidDocumentKey, + DidDocumentService, + LogLevel, + VerificationMethod, +} from '@credo-ts/core' import { HederaDidCreateOptions, HederaDidDeactivateOptions, HederaDidUpdateOptions, } from '../src/ledger/HederaLedgerService' +import { getMultibasePublicKey } from '../src/ledger/utils' import { getHederaAgent } from './utils' describe('Hedera DID registrar', () => { - const _privateKey = process.env.HEDERA_TEST_OPERATOR_KEY ?? '' const logger = new ConsoleLogger(LogLevel.error) let agent: Agent const validDid = 'did:hedera:testnet:44eesExqdsUvLZ35FpnBPErqRGRnYbzzyG3wgCCYxkmq_0.0.6226170' - function validVerificationMethod() { + function validVerificationMethod(publicKeyMultibase?: string) { return new VerificationMethod({ id: '#key-1', type: 'Ed25519VerificationKey2020', controller: validDid, - publicKeyMultibase: 'z44eesExqdsUvLZ35FpnBPErqRGRnYbzzyG3wgCCYxkmq', + publicKeyMultibase: publicKeyMultibase ?? 'z44eesExqdsUvLZ35FpnBPErqRGRnYbzzyG3wgCCYxkmq', }) } @@ -30,9 +38,9 @@ describe('Hedera DID registrar', () => { }) } - function validDidDoc() { + function validDidDoc(publicKeyMultibase?: string) { const service = [validService()] - const verificationMethod = [validVerificationMethod()] + const verificationMethod = [validVerificationMethod(publicKeyMultibase)] return new DidDocument({ id: validDid, @@ -57,9 +65,6 @@ describe('Hedera DID registrar', () => { const didResult = await agent.dids.create({ method: 'hedera', options: { network: 'testnet' }, - secret: { - createKey: true - }, }) expect(didResult).toMatchObject({ @@ -78,17 +83,29 @@ describe('Hedera DID registrar', () => { }) it('should create a did:hedera did document with document presets', async () => { + const { keyId, publicJwk } = await agent.kms.createKey({ + type: { + crv: 'Ed25519', + kty: 'OKP', + }, + }) + const multibasePublicKey = getMultibasePublicKey(publicJwk) + const keys: DidDocumentKey[] = [ + { + kmsKeyId: keyId, + didDocumentRelativeKeyId: '#key-1', + }, + ] + const didResult = await agent.dids.create({ method: 'hedera', - didDocument: validDidDoc(), + didDocument: validDidDoc(multibasePublicKey), options: { network: 'testnet' }, - secret: { - createKey: true - }, + secret: { keys }, }) expect(didResult.didState.state).toEqual('finished') - const verificationMethod = validVerificationMethod() + const verificationMethod = validVerificationMethod(multibasePublicKey) expect(didResult.didState.didDocument?.verificationMethod).toEqual( expect.arrayContaining([ expect.objectContaining({ @@ -125,9 +142,6 @@ describe('Hedera DID registrar', () => { options: { network: 'testnet', }, - secret: { - createKey: true - }, }) expect(didResult).toMatchObject({ didState: { state: 'finished' } }) @@ -140,9 +154,6 @@ describe('Hedera DID registrar', () => { did, didDocument, didDocumentOperation: 'addToDidDocument', - secret: { - createKey: true - }, }) expect(addUpdateResult.didState.state).toEqual('finished') @@ -172,9 +183,6 @@ describe('Hedera DID registrar', () => { verificationMethod: undefined, }, didDocumentOperation: 'removeFromDidDocument', - secret: { - createKey: true - }, }) expect(removeUpdateResult.didState.state).toEqual('finished') @@ -188,20 +196,31 @@ describe('Hedera DID registrar', () => { }) it('should create a did:hedera did document, add and remove verification method', async () => { + const { keyId, publicJwk } = await agent.kms.createKey({ + type: { + crv: 'Ed25519', + kty: 'OKP', + }, + }) + const multibasePublicKey = getMultibasePublicKey(publicJwk) + const keys: DidDocumentKey[] = [ + { + kmsKeyId: keyId, + didDocumentRelativeKeyId: '#key-1', + }, + ] + // create did document const didResult = await agent.dids.create({ method: 'hedera', options: { network: 'testnet' }, - secret: { - createKey: true - }, }) expect(didResult).toMatchObject({ didState: { state: 'finished' } }) const did = didResult.didState.did! const didDocument = didResult.didState.didDocument as DidDocument - const validVerification = validVerificationMethod() + const validVerification = validVerificationMethod(multibasePublicKey) didDocument.verificationMethod = [validVerification] // add verification method to the document @@ -210,7 +229,7 @@ describe('Hedera DID registrar', () => { didDocument, didDocumentOperation: 'addToDidDocument', secret: { - createKey: true + keys, }, }) expect(addUpdateResult.didState.didDocument?.id).toEqual(did) @@ -238,7 +257,7 @@ describe('Hedera DID registrar', () => { didDocument, didDocumentOperation: 'removeFromDidDocument', secret: { - createKey: true + keys, }, }) expect(removeUpdateResult.didState.didDocument?.id).toEqual(did) @@ -252,15 +271,120 @@ describe('Hedera DID registrar', () => { expect(removeResolvedDocument.didDocument?.service ?? []).toHaveLength(0) }) + it('should create a did:hedera did document, but should not add verification method without required keys', async () => { + const { publicJwk } = await agent.kms.createKey({ + type: { + crv: 'Ed25519', + kty: 'OKP', + }, + }) + const multibasePublicKey = getMultibasePublicKey(publicJwk) + + // create did document + const didResult = await agent.dids.create({ + method: 'hedera', + options: { network: 'testnet' }, + }) + expect(didResult).toMatchObject({ didState: { state: 'finished' } }) + + const did = didResult.didState.did! + const didDocument = didResult.didState.didDocument as DidDocument + + const validVerification = validVerificationMethod(multibasePublicKey) + didDocument.verificationMethod = [validVerification] + + // add verification method to the document + let updateResult = await agent.dids.update({ + did, + didDocument, + didDocumentOperation: 'addToDidDocument', + }) + expect(updateResult.didState.state).toEqual('failed') + if (updateResult.didState.state === 'failed') + expect(updateResult.didState.reason).toEqual( + 'Unable update DID: Key #key-1 from verificationMethod not found in keys' + ) + + // add assertion method to the document + didDocument.verificationMethod = undefined + didDocument.assertionMethod = [validVerification] + + updateResult = await agent.dids.update({ + did, + didDocument, + didDocumentOperation: 'addToDidDocument', + }) + expect(updateResult.didState.state).toEqual('failed') + if (updateResult.didState.state === 'failed') + expect(updateResult.didState.reason).toEqual( + 'Unable update DID: Key #key-1 from assertionMethod not found in keys' + ) + + // add authentication method to the document + didDocument.assertionMethod = undefined + didDocument.authentication = [validVerification] + + updateResult = await agent.dids.update({ + did, + didDocument, + didDocumentOperation: 'addToDidDocument', + }) + expect(updateResult.didState.state).toEqual('failed') + if (updateResult.didState.state === 'failed') + expect(updateResult.didState.reason).toEqual( + 'Unable update DID: Key #key-1 from authentication not found in keys' + ) + + // add authentication method to the document + didDocument.authentication = undefined + didDocument.capabilityDelegation = [validVerification] + + updateResult = await agent.dids.update({ + did, + didDocument, + didDocumentOperation: 'addToDidDocument', + }) + expect(updateResult.didState.state).toEqual('failed') + if (updateResult.didState.state === 'failed') + expect(updateResult.didState.reason).toEqual( + 'Unable update DID: Key #key-1 from capabilityDelegation not found in keys' + ) + + // add authentication method to the document + didDocument.capabilityDelegation = undefined + didDocument.capabilityInvocation = [validVerification] + + updateResult = await agent.dids.update({ + did, + didDocument, + didDocumentOperation: 'addToDidDocument', + }) + expect(updateResult.didState.state).toEqual('failed') + if (updateResult.didState.state === 'failed') + expect(updateResult.didState.reason).toEqual( + 'Unable update DID: Key #key-1 from capabilityInvocation not found in keys' + ) + + // add authentication method to the document + didDocument.capabilityInvocation = undefined + didDocument.keyAgreement = [validVerification] + + updateResult = await agent.dids.update({ + did, + didDocument, + didDocumentOperation: 'addToDidDocument', + }) + expect(updateResult.didState.state).toEqual('failed') + if (updateResult.didState.state === 'failed') + expect(updateResult.didState.reason).toEqual('Unable update DID: Key #key-1 from keyAgreement not found in keys') + }) + it('should create and deactivate a did:hedera did', async () => { const didResult = await agent.dids.create({ method: 'hedera', options: { network: 'testnet', }, - secret: { - createKey: true - }, }) expect(didResult).toMatchObject({ didState: { state: 'finished' } }) @@ -268,9 +392,6 @@ describe('Hedera DID registrar', () => { const deactivateResult = await agent.dids.deactivate({ did, - secret: { - createKey: true - }, }) expect(deactivateResult.didState.didDocument?.id).toEqual(did) diff --git a/packages/hedera/tests/HederaDidResolver.e2e.test.ts b/packages/hedera/tests/HederaDidResolver.e2e.test.ts index 0e9ab297b3..14f641bf86 100644 --- a/packages/hedera/tests/HederaDidResolver.e2e.test.ts +++ b/packages/hedera/tests/HederaDidResolver.e2e.test.ts @@ -3,8 +3,7 @@ import { HederaDidCreateOptions } from '../src/ledger/HederaLedgerService' import { getHederaAgent } from './utils' describe('Hedera DID resolver', () => { - const logger = new ConsoleLogger(LogLevel.debug) - const _privateKey = process.env.HEDERA_TEST_OPERATOR_KEY ?? '' + const logger = new ConsoleLogger(LogLevel.error) let agent: Agent let did: string @@ -18,16 +17,11 @@ describe('Hedera DID resolver', () => { const didResult = await agent.dids.create({ method: 'hedera', - secret: { - createKey: true - }, }) if (!didResult.didState.did) { throw new Error('No DID created') } did = didResult.didState.did - - console.log(JSON.stringify(didResult, null, 2)) }) afterAll(async () => { @@ -37,9 +31,6 @@ describe('Hedera DID resolver', () => { it('should resolve a did:cheqd did from local testnet', async () => { const resolveResult = await agent.dids.resolve(did) - console.log(JSON.stringify(resolveResult, null, 2)) - - expect(JsonTransformer.toJSON(resolveResult)).toMatchObject({ didDocument: { '@context': ['https://www.w3.org/ns/did/v1'], From 0d258b928cfe7cd93ccf969eeeb8a652b492e90d Mon Sep 17 00:00:00 2001 From: "andrey.kononov" Date: Thu, 3 Jul 2025 18:01:00 +0300 Subject: [PATCH 59/89] Use HCS module with changes awaiter Fix tests --- packages/hedera/package.json | 4 ++-- .../hedera/src/ledger/HederaLedgerService.ts | 3 +-- .../tests/HederaAnoncredsRegistry.e2e.test.ts | 16 ++++++++-------- packages/hedera/tests/utils/utils.ts | 6 +++--- 4 files changed, 14 insertions(+), 15 deletions(-) diff --git a/packages/hedera/package.json b/packages/hedera/package.json index 7a367eef93..e8e677de8a 100644 --- a/packages/hedera/package.json +++ b/packages/hedera/package.json @@ -27,12 +27,12 @@ "@hashgraph/sdk": "^2.66.0", "@credo-ts/anoncreds": "workspace:*", "@credo-ts/core": "workspace:*", - "@hiero-did-sdk/anoncreds": "npm:@hiero-did-sdk/anoncreds@0.0.5", + "@hiero-did-sdk/anoncreds": "npm:@hiero-did-sdk/anoncreds@0.0.7", "@hiero-did-sdk/registrar": "npm:@hiero-did-sdk/registrar@0.0.7", "@hiero-did-sdk/resolver": "npm:@hiero-did-sdk/resolver@0.0.9", "@hiero-did-sdk/core": "npm:@hiero-did-sdk/core@0.0.2", "@hiero-did-sdk/client": "npm:@hiero-did-sdk/client@0.0.3", - "@hiero-did-sdk/hcs": "npm:@hiero-did-sdk/hcs@0.0.8", + "@hiero-did-sdk/hcs": "npm:@hiero-did-sdk/hcs@0.0.11", "@hiero-did-sdk/publisher-internal": "npm:@hiero-did-sdk/publisher-internal@0.0.1" }, "devDependencies": { diff --git a/packages/hedera/src/ledger/HederaLedgerService.ts b/packages/hedera/src/ledger/HederaLedgerService.ts index 388cbf8a26..6057682ccc 100644 --- a/packages/hedera/src/ledger/HederaLedgerService.ts +++ b/packages/hedera/src/ledger/HederaLedgerService.ts @@ -25,8 +25,7 @@ import { import { KeyManagementApi } from '@credo-ts/core/src/modules/kms' import { Client } from '@hashgraph/sdk' import { HederaAnoncredsRegistry } from '@hiero-did-sdk/anoncreds' -import { HederaClientService } from '@hiero-did-sdk/client' -import { HederaNetwork } from '@hiero-did-sdk/client/dist/index' +import { HederaNetwork, HederaClientService } from '@hiero-did-sdk/client' import { DIDResolution, DID_ROOT_KEY_ID, Service, VerificationMethod } from '@hiero-did-sdk/core' import { CreateDIDResult, diff --git a/packages/hedera/tests/HederaAnoncredsRegistry.e2e.test.ts b/packages/hedera/tests/HederaAnoncredsRegistry.e2e.test.ts index 29f38c7540..c7470ac441 100644 --- a/packages/hedera/tests/HederaAnoncredsRegistry.e2e.test.ts +++ b/packages/hedera/tests/HederaAnoncredsRegistry.e2e.test.ts @@ -1,6 +1,6 @@ import { Agent, ConsoleLogger, LogLevel, utils } from '@credo-ts/core' import { HederaDidCreateOptions } from '../src/ledger/HederaLedgerService' -import { getHederaAgent, waitTimeout } from './utils' +import { getHederaAgent } from './utils' import { testCache } from './utils/testCache' describe('Hedera AnonCreds support', () => { @@ -61,7 +61,7 @@ describe('Hedera AnonCreds support', () => { const schemaId = schemaResult?.schemaState?.schemaId expect(schemaId).toBeDefined() - await waitTimeout(consensusTimeout) + //await waitTimeout(consensusTimeout) // Register credential definition for the schema const credDefResult = await agent.modules.anoncreds.registerCredentialDefinition({ @@ -80,7 +80,7 @@ describe('Hedera AnonCreds support', () => { const credentialDefinitionId = credDefResult.credentialDefinitionState.credentialDefinitionId ?? '' - await waitTimeout(consensusTimeout) + //await waitTimeout(consensusTimeout) // Register revocation registry definition const revRegDefRegResult = await agent.modules.anoncreds.registerRevocationRegistryDefinition({ @@ -97,7 +97,7 @@ describe('Hedera AnonCreds support', () => { revRegDefRegResult?.revocationRegistryDefinitionState?.revocationRegistryDefinitionId ?? '' expect(revocationRegistryDefinitionId).toBeDefined() - await waitTimeout(consensusTimeout) + //await waitTimeout(consensusTimeout) const resolvedRevRegDef = await agent.modules.anoncreds.getRevocationRegistryDefinition(revocationRegistryDefinitionId) @@ -115,7 +115,7 @@ describe('Hedera AnonCreds support', () => { const revocationStatusList = registerRevocationStatusListResponse?.revocationStatusListState.revocationStatusList expect(revocationStatusList).toBeDefined() - await waitTimeout(consensusTimeout) + //await waitTimeout(consensusTimeout) // Resolve the revocation status list const revocationStatusListResponse = await agent.modules.anoncreds.getRevocationStatusList( @@ -128,7 +128,7 @@ describe('Hedera AnonCreds support', () => { expect(revocationStatusListResponse?.revocationStatusList?.issuerId).toEqual(did) expect(revocationStatusListResponse?.revocationStatusList?.revocationList).toEqual([0, 0, 0, 0, 0, 0, 0, 0, 0, 0]) - await waitTimeout(consensusTimeout) + //await waitTimeout(consensusTimeout) // Update revocation status list - Revoke indexes const revokeUpdateRevocationStatusListResponse = await agent.modules.anoncreds.updateRevocationStatusList({ @@ -144,7 +144,7 @@ describe('Hedera AnonCreds support', () => { revokeUpdateRevocationStatusListResponse?.revocationStatusListState.revocationStatusList expect(revokeRevocationStatusList).toBeDefined() - await waitTimeout(consensusTimeout) + //await waitTimeout(consensusTimeout) // Resolve the revocation status list const revokeRevocationStatusListResponse = await agent.modules.anoncreds.getRevocationStatusList( @@ -174,7 +174,7 @@ describe('Hedera AnonCreds support', () => { issueUpdateRevocationStatusListResponse?.revocationStatusListState.revocationStatusList expect(issueRevocationStatusList).toBeDefined() - await waitTimeout(consensusTimeout) + //await waitTimeout(consensusTimeout) // Resolve the revocation status list const issueRevocationStatusListResponse = await agent.modules.anoncreds.getRevocationStatusList( diff --git a/packages/hedera/tests/utils/utils.ts b/packages/hedera/tests/utils/utils.ts index b967e4382f..baf29ab0d5 100644 --- a/packages/hedera/tests/utils/utils.ts +++ b/packages/hedera/tests/utils/utils.ts @@ -1,5 +1,5 @@ export const getRandomStr = (n: number) => [...Array(n)].map(() => Math.random().toString(36)[2]).join('') -export const waitTimeout = async (timeout?: number) => { - await new Promise((resolve) => setTimeout(resolve, timeout ?? 5000)) -} +// export const waitTimeout = async (timeout?: number) => { +// await new Promise((resolve) => setTimeout(resolve, timeout ?? 5000)) +// } From 2bdf61a30ba2702c25c2309f261326ff5af5703e Mon Sep 17 00:00:00 2001 From: "andrey.kononov" Date: Thu, 3 Jul 2025 18:13:37 +0300 Subject: [PATCH 60/89] Clear code --- .../tests/HederaAnoncredsRegistry.e2e.test.ts | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/packages/hedera/tests/HederaAnoncredsRegistry.e2e.test.ts b/packages/hedera/tests/HederaAnoncredsRegistry.e2e.test.ts index c7470ac441..f8e343e81f 100644 --- a/packages/hedera/tests/HederaAnoncredsRegistry.e2e.test.ts +++ b/packages/hedera/tests/HederaAnoncredsRegistry.e2e.test.ts @@ -4,8 +4,6 @@ import { getHederaAgent } from './utils' import { testCache } from './utils/testCache' describe('Hedera AnonCreds support', () => { - const consensusTimeout = 5000 - let agent: Agent let did: string @@ -61,8 +59,6 @@ describe('Hedera AnonCreds support', () => { const schemaId = schemaResult?.schemaState?.schemaId expect(schemaId).toBeDefined() - //await waitTimeout(consensusTimeout) - // Register credential definition for the schema const credDefResult = await agent.modules.anoncreds.registerCredentialDefinition({ credentialDefinition: { @@ -80,8 +76,6 @@ describe('Hedera AnonCreds support', () => { const credentialDefinitionId = credDefResult.credentialDefinitionState.credentialDefinitionId ?? '' - //await waitTimeout(consensusTimeout) - // Register revocation registry definition const revRegDefRegResult = await agent.modules.anoncreds.registerRevocationRegistryDefinition({ revocationRegistryDefinition: { @@ -97,8 +91,6 @@ describe('Hedera AnonCreds support', () => { revRegDefRegResult?.revocationRegistryDefinitionState?.revocationRegistryDefinitionId ?? '' expect(revocationRegistryDefinitionId).toBeDefined() - //await waitTimeout(consensusTimeout) - const resolvedRevRegDef = await agent.modules.anoncreds.getRevocationRegistryDefinition(revocationRegistryDefinitionId) expect(resolvedRevRegDef.revocationRegistryDefinitionId).toEqual(revocationRegistryDefinitionId) @@ -115,8 +107,6 @@ describe('Hedera AnonCreds support', () => { const revocationStatusList = registerRevocationStatusListResponse?.revocationStatusListState.revocationStatusList expect(revocationStatusList).toBeDefined() - //await waitTimeout(consensusTimeout) - // Resolve the revocation status list const revocationStatusListResponse = await agent.modules.anoncreds.getRevocationStatusList( revocationRegistryDefinitionId, @@ -128,8 +118,6 @@ describe('Hedera AnonCreds support', () => { expect(revocationStatusListResponse?.revocationStatusList?.issuerId).toEqual(did) expect(revocationStatusListResponse?.revocationStatusList?.revocationList).toEqual([0, 0, 0, 0, 0, 0, 0, 0, 0, 0]) - //await waitTimeout(consensusTimeout) - // Update revocation status list - Revoke indexes const revokeUpdateRevocationStatusListResponse = await agent.modules.anoncreds.updateRevocationStatusList({ options: {}, @@ -144,8 +132,6 @@ describe('Hedera AnonCreds support', () => { revokeUpdateRevocationStatusListResponse?.revocationStatusListState.revocationStatusList expect(revokeRevocationStatusList).toBeDefined() - //await waitTimeout(consensusTimeout) - // Resolve the revocation status list const revokeRevocationStatusListResponse = await agent.modules.anoncreds.getRevocationStatusList( revocationRegistryDefinitionId, @@ -174,8 +160,6 @@ describe('Hedera AnonCreds support', () => { issueUpdateRevocationStatusListResponse?.revocationStatusListState.revocationStatusList expect(issueRevocationStatusList).toBeDefined() - //await waitTimeout(consensusTimeout) - // Resolve the revocation status list const issueRevocationStatusListResponse = await agent.modules.anoncreds.getRevocationStatusList( revocationRegistryDefinitionId, From b2758869f868d5b015280b977efa1150e8830722 Mon Sep 17 00:00:00 2001 From: "andrey.kononov" Date: Thu, 3 Jul 2025 18:42:44 +0300 Subject: [PATCH 61/89] Update lib versions --- packages/hedera/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/hedera/package.json b/packages/hedera/package.json index e8e677de8a..67584b46fd 100644 --- a/packages/hedera/package.json +++ b/packages/hedera/package.json @@ -27,12 +27,12 @@ "@hashgraph/sdk": "^2.66.0", "@credo-ts/anoncreds": "workspace:*", "@credo-ts/core": "workspace:*", - "@hiero-did-sdk/anoncreds": "npm:@hiero-did-sdk/anoncreds@0.0.7", + "@hiero-did-sdk/anoncreds": "npm:@hiero-did-sdk/anoncreds@0.0.8", "@hiero-did-sdk/registrar": "npm:@hiero-did-sdk/registrar@0.0.7", "@hiero-did-sdk/resolver": "npm:@hiero-did-sdk/resolver@0.0.9", "@hiero-did-sdk/core": "npm:@hiero-did-sdk/core@0.0.2", "@hiero-did-sdk/client": "npm:@hiero-did-sdk/client@0.0.3", - "@hiero-did-sdk/hcs": "npm:@hiero-did-sdk/hcs@0.0.11", + "@hiero-did-sdk/hcs": "npm:@hiero-did-sdk/hcs@0.0.12", "@hiero-did-sdk/publisher-internal": "npm:@hiero-did-sdk/publisher-internal@0.0.1" }, "devDependencies": { From 2aa5444697f7b6ab2890d78efc7950548f6665ee Mon Sep 17 00:00:00 2001 From: "andrey.kononov" Date: Wed, 9 Jul 2025 12:37:40 +0300 Subject: [PATCH 62/89] Use updated libraries --- packages/hedera/package.json | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/hedera/package.json b/packages/hedera/package.json index 67584b46fd..e67596ca81 100644 --- a/packages/hedera/package.json +++ b/packages/hedera/package.json @@ -27,13 +27,13 @@ "@hashgraph/sdk": "^2.66.0", "@credo-ts/anoncreds": "workspace:*", "@credo-ts/core": "workspace:*", - "@hiero-did-sdk/anoncreds": "npm:@hiero-did-sdk/anoncreds@0.0.8", - "@hiero-did-sdk/registrar": "npm:@hiero-did-sdk/registrar@0.0.7", - "@hiero-did-sdk/resolver": "npm:@hiero-did-sdk/resolver@0.0.9", - "@hiero-did-sdk/core": "npm:@hiero-did-sdk/core@0.0.2", - "@hiero-did-sdk/client": "npm:@hiero-did-sdk/client@0.0.3", - "@hiero-did-sdk/hcs": "npm:@hiero-did-sdk/hcs@0.0.12", - "@hiero-did-sdk/publisher-internal": "npm:@hiero-did-sdk/publisher-internal@0.0.1" + "@hiero-did-sdk/anoncreds": "npm:@hiero-did-sdk/anoncreds@0.0.9", + "@hiero-did-sdk/registrar": "npm:@hiero-did-sdk/registrar@0.0.8", + "@hiero-did-sdk/resolver": "npm:@hiero-did-sdk/resolver@0.0.10", + "@hiero-did-sdk/core": "npm:@hiero-did-sdk/core@0.0.5", + "@hiero-did-sdk/client": "npm:@hiero-did-sdk/client@0.0.4", + "@hiero-did-sdk/hcs": "npm:@hiero-did-sdk/hcs@0.0.13", + "@hiero-did-sdk/publisher-internal": "npm:@hiero-did-sdk/publisher-internal@0.0.2" }, "devDependencies": { "@credo-ts/node": "workspace:*", From 450e5b5bd95016ce0a0ed770d238d856ef3246e4 Mon Sep 17 00:00:00 2001 From: "andrey.kononov" Date: Fri, 11 Jul 2025 15:22:18 +0300 Subject: [PATCH 63/89] Up used libraries versions --- packages/hedera/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/hedera/package.json b/packages/hedera/package.json index e67596ca81..c8d6e2cfdb 100644 --- a/packages/hedera/package.json +++ b/packages/hedera/package.json @@ -27,12 +27,12 @@ "@hashgraph/sdk": "^2.66.0", "@credo-ts/anoncreds": "workspace:*", "@credo-ts/core": "workspace:*", - "@hiero-did-sdk/anoncreds": "npm:@hiero-did-sdk/anoncreds@0.0.9", + "@hiero-did-sdk/anoncreds": "npm:@hiero-did-sdk/anoncreds@0.0.10", "@hiero-did-sdk/registrar": "npm:@hiero-did-sdk/registrar@0.0.8", "@hiero-did-sdk/resolver": "npm:@hiero-did-sdk/resolver@0.0.10", "@hiero-did-sdk/core": "npm:@hiero-did-sdk/core@0.0.5", "@hiero-did-sdk/client": "npm:@hiero-did-sdk/client@0.0.4", - "@hiero-did-sdk/hcs": "npm:@hiero-did-sdk/hcs@0.0.13", + "@hiero-did-sdk/hcs": "npm:@hiero-did-sdk/hcs@0.0.15", "@hiero-did-sdk/publisher-internal": "npm:@hiero-did-sdk/publisher-internal@0.0.2" }, "devDependencies": { From 37b60b2c9c768af2456e75940887a299c22fbd91 Mon Sep 17 00:00:00 2001 From: "andrey.kononov" Date: Thu, 17 Jul 2025 17:55:09 +0300 Subject: [PATCH 64/89] Fix PR notes --- demo/src/Faber.ts | 22 +++++-- jest.config.base.ts | 1 + packages/hedera/jest.config.ts | 1 - packages/hedera/package.json | 14 ++--- .../src/anoncreds/HederaAnonCredsRegistry.ts | 16 ++--- .../hedera/src/dids/HederaDidRegistrar.ts | 24 +++----- packages/hedera/src/index.ts | 3 - .../hedera/src/ledger/HederaLedgerService.ts | 14 ++--- .../hedera/src/ledger/cache/CredoCache.ts | 12 +--- .../src/ledger/publisher/KmsPublisher.ts | 12 +++- .../tests/HederaAnoncredsRegistry.e2e.test.ts | 3 +- .../tests/HederaDidRegistrar.e2e.test.ts | 4 +- .../tests/utils/InMemoryTailsFileService.ts | 59 ------------------- packages/hedera/tests/utils/index.ts | 1 + .../tests/utils/testTailsFileService.ts | 1 - 15 files changed, 65 insertions(+), 122 deletions(-) delete mode 100644 packages/hedera/tests/utils/InMemoryTailsFileService.ts diff --git a/demo/src/Faber.ts b/demo/src/Faber.ts index 30990da956..4179026e62 100644 --- a/demo/src/Faber.ts +++ b/demo/src/Faber.ts @@ -17,6 +17,8 @@ export enum RegistryOptions { hedera = 'did:hedera', } +type Extensible = Record + export class Faber extends BaseAgent { public outOfBandId?: string public credentialDefinition?: RegisterCredentialDefinitionReturnStateFinished @@ -39,12 +41,22 @@ export class Faber extends BaseAgent { // and store the existing did in the wallet // indy did is based on private key (seed) const unqualifiedIndyDid = '2jEvRuKmfBJTRa7QowDpNN' - const cheqdDid = 'did:cheqd:testnet:d37eba59-513d-42d3-8f9f-d1df0548b675' - const indyDid = `did:indy:${indyNetworkConfig.indyNamespace}:${unqualifiedIndyDid}` - const hederaDid = 'did:hedera:testnet:44eesExqdsUvLZ35FpnBPErqRGRnYbzzyG3wgCCYxkmq_0.0.6231121' - const didDocumentRelativeKeyId = registry === RegistryOptions.indy ? '#verkey' : registry === RegistryOptions.cheqd ? '#key-1' : '#did-root-key' - const did = registry === RegistryOptions.indy ? indyDid : registry === RegistryOptions.cheqd ? cheqdDid : hederaDid + const rootKeyIds: Extensible = { + [RegistryOptions.indy]: '#verkey', + [RegistryOptions.cheqd]: '#key-1', + [RegistryOptions.hedera]: '#did-root-key', + } + + const Dids: Extensible = { + [RegistryOptions.indy]: `did:indy:${indyNetworkConfig.indyNamespace}:${unqualifiedIndyDid}`, + [RegistryOptions.cheqd]: 'did:cheqd:testnet:d37eba59-513d-42d3-8f9f-d1df0548b675', + [RegistryOptions.hedera]: 'did:hedera:testnet:44eesExqdsUvLZ35FpnBPErqRGRnYbzzyG3wgCCYxkmq_0.0.6231121', + } + + const didDocumentRelativeKeyId = rootKeyIds[registry] + const did = Dids[registry] + const { privateJwk } = transformPrivateKeyToPrivateJwk({ type: { crv: 'Ed25519', diff --git a/jest.config.base.ts b/jest.config.base.ts index 43b6b40302..41ed7a8e94 100644 --- a/jest.config.base.ts +++ b/jest.config.base.ts @@ -17,6 +17,7 @@ const config: Config.InitialOptions = { }, ], }, + testTimeout: 60000, } export default config diff --git a/packages/hedera/jest.config.ts b/packages/hedera/jest.config.ts index 9192efbeeb..2556d19c61 100644 --- a/packages/hedera/jest.config.ts +++ b/packages/hedera/jest.config.ts @@ -6,7 +6,6 @@ import packageJson from './package.json' const config: Config.InitialOptions = { ...base, - testTimeout: 1200000, displayName: packageJson.name, } diff --git a/packages/hedera/package.json b/packages/hedera/package.json index c8d6e2cfdb..b7abcd9d8e 100644 --- a/packages/hedera/package.json +++ b/packages/hedera/package.json @@ -27,13 +27,13 @@ "@hashgraph/sdk": "^2.66.0", "@credo-ts/anoncreds": "workspace:*", "@credo-ts/core": "workspace:*", - "@hiero-did-sdk/anoncreds": "npm:@hiero-did-sdk/anoncreds@0.0.10", - "@hiero-did-sdk/registrar": "npm:@hiero-did-sdk/registrar@0.0.8", - "@hiero-did-sdk/resolver": "npm:@hiero-did-sdk/resolver@0.0.10", - "@hiero-did-sdk/core": "npm:@hiero-did-sdk/core@0.0.5", - "@hiero-did-sdk/client": "npm:@hiero-did-sdk/client@0.0.4", - "@hiero-did-sdk/hcs": "npm:@hiero-did-sdk/hcs@0.0.15", - "@hiero-did-sdk/publisher-internal": "npm:@hiero-did-sdk/publisher-internal@0.0.2" + "@hiero-did-sdk/anoncreds": "npm:@hiero-did-sdk/anoncreds@0.0.12", + "@hiero-did-sdk/registrar": "npm:@hiero-did-sdk/registrar@0.0.9", + "@hiero-did-sdk/resolver": "npm:@hiero-did-sdk/resolver@0.0.11", + "@hiero-did-sdk/core": "npm:@hiero-did-sdk/core@0.0.7", + "@hiero-did-sdk/client": "npm:@hiero-did-sdk/client@0.0.5", + "@hiero-did-sdk/hcs": "npm:@hiero-did-sdk/hcs@0.0.16", + "@hiero-did-sdk/publisher-internal": "npm:@hiero-did-sdk/publisher-internal@0.0.3" }, "devDependencies": { "@credo-ts/node": "workspace:*", diff --git a/packages/hedera/src/anoncreds/HederaAnonCredsRegistry.ts b/packages/hedera/src/anoncreds/HederaAnonCredsRegistry.ts index 36c2d6f1ef..f743749100 100644 --- a/packages/hedera/src/anoncreds/HederaAnonCredsRegistry.ts +++ b/packages/hedera/src/anoncreds/HederaAnonCredsRegistry.ts @@ -25,7 +25,7 @@ export class HederaAnonCredsRegistry implements AnonCredsRegistry { options: RegisterSchemaOptions ): Promise { try { - agentContext.config.logger.trace('Submitting register schema request to ledger') + agentContext.config.logger.trace('Registering schema on Hedera ledger') const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) return await ledgerService.registerSchema(agentContext, options) } catch (error) { @@ -48,7 +48,7 @@ export class HederaAnonCredsRegistry implements AnonCredsRegistry { public async getSchema(agentContext: AgentContext, schemaId: string): Promise { try { - agentContext.config.logger.trace(`Submitting get schema request for schema '${schemaId}' to ledger`) + agentContext.config.logger.trace(`Resolving schema '${schemaId}' from Hedera ledger`) const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) return await ledgerService.getSchema(agentContext, schemaId) } catch (error) { @@ -72,7 +72,7 @@ export class HederaAnonCredsRegistry implements AnonCredsRegistry { options: RegisterCredentialDefinitionOptions ): Promise { try { - agentContext.config.logger.trace('Submitting register credential definition request to ledger') + agentContext.config.logger.trace('Registering credential definition on Hedera ledger') const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) return await ledgerService.registerCredentialDefinition(agentContext, options) } catch (error) { @@ -102,7 +102,7 @@ export class HederaAnonCredsRegistry implements AnonCredsRegistry { ): Promise { try { agentContext.config.logger.trace( - `Submitting get credential definition request for '${credentialDefinitionId}' to ledger` + `Resolving credential definition '${credentialDefinitionId}' from Hedera ledger` ) const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) return await ledgerService.getCredentialDefinition(agentContext, credentialDefinitionId) @@ -128,7 +128,7 @@ export class HederaAnonCredsRegistry implements AnonCredsRegistry { ): Promise { try { agentContext.config.logger.trace( - `Submitting register revocation registry definition request for '${options.revocationRegistryDefinition.credDefId}' to ledger` + `Registering revocation registry definition for '${options.revocationRegistryDefinition.credDefId}' on Hedera ledger` ) const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) return await ledgerService.registerRevocationRegistryDefinition(agentContext, options) @@ -159,7 +159,7 @@ export class HederaAnonCredsRegistry implements AnonCredsRegistry { ): Promise { try { agentContext.config.logger.trace( - `Submitting get revocation registry definition request for '${revocationRegistryDefinitionId}' to ledger` + `Resolving revocation registry definition for '${revocationRegistryDefinitionId}' from Hedera ledger` ) const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) return await ledgerService.getRevocationRegistryDefinition(agentContext, revocationRegistryDefinitionId) @@ -188,7 +188,7 @@ export class HederaAnonCredsRegistry implements AnonCredsRegistry { ): Promise { try { agentContext.config.logger.trace( - `Submitting register revocation status list request for '${options.revocationStatusList.revRegDefId}' to ledger` + `Registering revocation status list for '${options.revocationStatusList.revRegDefId}' on Hedera ledger` ) const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) return await ledgerService.registerRevocationStatusList(agentContext, options) @@ -220,7 +220,7 @@ export class HederaAnonCredsRegistry implements AnonCredsRegistry { ): Promise { try { agentContext.config.logger.trace( - `Submitting get revocation status request for '${revocationRegistryId}' to ledger` + `Resolving revocation status for for '${revocationRegistryId}' from Hedera ledger` ) const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) return await ledgerService.getRevocationStatusList(agentContext, revocationRegistryId, timestamp) diff --git a/packages/hedera/src/dids/HederaDidRegistrar.ts b/packages/hedera/src/dids/HederaDidRegistrar.ts index 8216fa229f..51dccfa751 100644 --- a/packages/hedera/src/dids/HederaDidRegistrar.ts +++ b/packages/hedera/src/dids/HederaDidRegistrar.ts @@ -24,8 +24,6 @@ export class HederaDidRegistrar implements DidRegistrar { async create(agentContext: AgentContext, options: HederaDidCreateOptions): Promise { try { - agentContext.config.logger.trace('Try to create the did document to ledger') - const didRepository = agentContext.dependencyManager.resolve(DidRepository) const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) @@ -58,7 +56,7 @@ export class HederaDidRegistrar implements DidRegistrar { }, } } catch (error) { - agentContext.config.logger.debug('Error creating of the did ', { + agentContext.config.logger.debug('Error creating DID', { error, }) return { @@ -92,7 +90,7 @@ export class HederaDidRegistrar implements DidRegistrar { } // Update did - const keys = this.concateKeys(didRecord.keys, options.secret?.keys) + const keys = this.concatKeys(didRecord.keys, options.secret?.keys) const { didDocument: updatedDidDocument } = await ledgerService.updateDid(agentContext, { ...options, secret: { keys }, @@ -113,7 +111,7 @@ export class HederaDidRegistrar implements DidRegistrar { }, } } catch (error) { - agentContext.config.logger.error('Error updating DID', error) + agentContext.config.logger.error('Error update DID', error) return { didDocumentMetadata: {}, didRegistrationMetadata: {}, @@ -125,7 +123,7 @@ export class HederaDidRegistrar implements DidRegistrar { } } - async deactivate(agentContext: AgentContext, options: HederaDidDeactivateOptions): Promise { + async deactivate(agentContext: AgentContext, options: Omit): Promise { const didRepository = agentContext.dependencyManager.resolve(DidRepository) const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) @@ -147,15 +145,13 @@ export class HederaDidRegistrar implements DidRegistrar { } } // Deactivate did - const keys = this.concateKeys(didRecord.keys, options.secret?.keys) const { didDocument: deactivatedDidDocument } = await ledgerService.deactivateDid(agentContext, { ...options, - secret: { keys }, + secret: { keys: didRecord.keys }, }) // Save the did to wallet didRecord.didDocument = JsonTransformer.fromJSON(deactivatedDidDocument, DidDocument) - didRecord.keys = keys await didRepository.update(agentContext, didRecord) return { @@ -168,7 +164,7 @@ export class HederaDidRegistrar implements DidRegistrar { }, } } catch (error) { - agentContext.config.logger.error('Error deactivating DID', error) + agentContext.config.logger.error('Error deactivate DID', error) return { didDocumentMetadata: {}, didRegistrationMetadata: {}, @@ -180,12 +176,10 @@ export class HederaDidRegistrar implements DidRegistrar { } } - private concateKeys(keys1?: DidDocumentKey[], keys2?: DidDocumentKey[]): DidDocumentKey[] { - const _keys1 = keys1 ?? [] - const _keys2 = keys2 ?? [] + private concatKeys(keys1: DidDocumentKey[] = [], keys2: DidDocumentKey[] = []): DidDocumentKey[] { return [ - ..._keys1, - ..._keys2.filter((k2) => !_keys1.some((k1) => k1.didDocumentRelativeKeyId === k2.didDocumentRelativeKeyId)), + ...keys1, + ...keys2.filter((k2) => !keys1.some((k1) => k1.didDocumentRelativeKeyId === k2.didDocumentRelativeKeyId)), ] } } diff --git a/packages/hedera/src/index.ts b/packages/hedera/src/index.ts index b552a6b0f9..47a772c75f 100644 --- a/packages/hedera/src/index.ts +++ b/packages/hedera/src/index.ts @@ -1,7 +1,4 @@ -// Dids export * from './dids' - -// AnonCreds export * from './anoncreds' export * from './HederaModule' export * from './HederaModuleConfig' diff --git a/packages/hedera/src/ledger/HederaLedgerService.ts b/packages/hedera/src/ledger/HederaLedgerService.ts index 6057682ccc..3f052e9e66 100644 --- a/packages/hedera/src/ledger/HederaLedgerService.ts +++ b/packages/hedera/src/ledger/HederaLedgerService.ts @@ -26,7 +26,7 @@ import { KeyManagementApi } from '@credo-ts/core/src/modules/kms' import { Client } from '@hashgraph/sdk' import { HederaAnoncredsRegistry } from '@hiero-did-sdk/anoncreds' import { HederaNetwork, HederaClientService } from '@hiero-did-sdk/client' -import { DIDResolution, DID_ROOT_KEY_ID, Service, VerificationMethod } from '@hiero-did-sdk/core' +import {DIDResolution, DID_ROOT_KEY_ID, Service, VerificationMethod, parseDID} from '@hiero-did-sdk/core' import { CreateDIDResult, DIDUpdateBuilder, @@ -39,7 +39,7 @@ import { submitDeactivateDIDRequest, submitUpdateDIDRequest, } from '@hiero-did-sdk/registrar' -import { TopicReaderHederaHcs, parseDID, resolveDID } from '@hiero-did-sdk/resolver' +import { TopicReaderHederaHcs, resolveDID } from '@hiero-did-sdk/resolver' import { HederaModuleConfig } from '../HederaModuleConfig' import { CredoCache } from './cache/CredoCache' import { KmsPublisher } from './publisher/KmsPublisher' @@ -164,7 +164,7 @@ export class HederaLedgerService { } // Check all required keys presents - this.checkKeys(didDocument, secret?.keys ?? []) + this.checkRequiredDidDocumentKeys(didDocument, secret?.keys ?? []) const { network: networkName } = parseDID(did) return this.clientService.withClient({ networkName }, async (client: Client) => { @@ -331,9 +331,9 @@ export class HederaLedgerService { } private async getPublisher(agentContext: AgentContext, client: Client, keyId: string): Promise { - const publisher = new KmsPublisher(agentContext, client) - await publisher.setKeyId(keyId) - return publisher + const kms = agentContext.dependencyManager.resolve(Kms.KeyManagementApi) + const key = await createOrGetKey(kms, keyId) + return new KmsPublisher(agentContext, client, key) } private getHederaAnonCredsSdk(agentContext: AgentContext): HederaAnoncredsRegistry { @@ -383,7 +383,7 @@ export class HederaLedgerService { return result } - private checkKeys(didDocument: DidDocument | Partial, keys: DidDocumentKey[]) { + private checkRequiredDidDocumentKeys(didDocument: DidDocument | Partial, keys: DidDocumentKey[]) { const fields = [ 'verificationMethod', 'assertionMethod', diff --git a/packages/hedera/src/ledger/cache/CredoCache.ts b/packages/hedera/src/ledger/cache/CredoCache.ts index f851268d0b..df6d59e70d 100644 --- a/packages/hedera/src/ledger/cache/CredoCache.ts +++ b/packages/hedera/src/ledger/cache/CredoCache.ts @@ -12,26 +12,20 @@ export class CredoCache implements Cache { constructor(private readonly agentContext: AgentContext) { this.credoCache = agentContext.dependencyManager.resolve(CacheModuleConfig).cache - } - - async get(key: string): Promise { if (!this.credoCache) { throw new CredoError('Error initializing cache') } + } + + async get(key: string): Promise { return await this.credoCache.get(this.agentContext, key) } async set(key: string, value: CacheValue, _expiresInSeconds?: number): Promise { - if (!this.credoCache) { - throw new CredoError('Error initializing cache') - } await this.credoCache.set(this.agentContext, key, value) } async remove(key: string): Promise { - if (!this.credoCache) { - throw new CredoError('Error initializing cache') - } await this.credoCache.remove(this.agentContext, key) } diff --git a/packages/hedera/src/ledger/publisher/KmsPublisher.ts b/packages/hedera/src/ledger/publisher/KmsPublisher.ts index aa64b5e1ef..58c00f0fdf 100644 --- a/packages/hedera/src/ledger/publisher/KmsPublisher.ts +++ b/packages/hedera/src/ledger/publisher/KmsPublisher.ts @@ -1,5 +1,5 @@ import { AgentContext, Kms, TypedArrayEncoder } from '@credo-ts/core' -import { KeyManagementApi } from '@credo-ts/core/src/modules/kms' +import {KeyManagementApi, KmsJwkPublicOkp} from '@credo-ts/core/src/modules/kms' import { Client, PublicKey, Transaction, TransactionReceipt } from '@hashgraph/sdk' import { KeysUtility } from '@hiero-did-sdk/core' import { Publisher as ClientPublisher } from '@hiero-did-sdk/publisher-internal' @@ -11,9 +11,15 @@ export class KmsPublisher extends ClientPublisher { private keyId!: string private submitPublicKey!: PublicKey - constructor(agentContext: AgentContext, client: Client) { + constructor(agentContext: AgentContext, client: Client, key: { keyId: string; publicJwk: KmsJwkPublicOkp & { crv: 'Ed25519' } }) { super(client) + this.kms = agentContext.dependencyManager.resolve(Kms.KeyManagementApi) + + this.keyId = key.keyId + this.submitPublicKey = KeysUtility.fromBytes( + Uint8Array.from(TypedArrayEncoder.fromBase64(key.publicJwk.x)) + ).toPublicKey() } async setKeyId(keyId: string) { @@ -42,7 +48,7 @@ export class KmsPublisher extends ClientPublisher { const response = await transaction.execute(this.client) - const receipt = await response.getReceipt(this.client) + const receipt: TransactionReceipt = await response.getReceipt(this.client) return receipt } } diff --git a/packages/hedera/tests/HederaAnoncredsRegistry.e2e.test.ts b/packages/hedera/tests/HederaAnoncredsRegistry.e2e.test.ts index f8e343e81f..1f76a0c191 100644 --- a/packages/hedera/tests/HederaAnoncredsRegistry.e2e.test.ts +++ b/packages/hedera/tests/HederaAnoncredsRegistry.e2e.test.ts @@ -1,7 +1,6 @@ import { Agent, ConsoleLogger, LogLevel, utils } from '@credo-ts/core' import { HederaDidCreateOptions } from '../src/ledger/HederaLedgerService' -import { getHederaAgent } from './utils' -import { testCache } from './utils/testCache' +import { getHederaAgent, testCache } from './utils' describe('Hedera AnonCreds support', () => { let agent: Agent diff --git a/packages/hedera/tests/HederaDidRegistrar.e2e.test.ts b/packages/hedera/tests/HederaDidRegistrar.e2e.test.ts index 21e25654a9..e2f125e68b 100644 --- a/packages/hedera/tests/HederaDidRegistrar.e2e.test.ts +++ b/packages/hedera/tests/HederaDidRegistrar.e2e.test.ts @@ -390,8 +390,8 @@ describe('Hedera DID registrar', () => { const did = didResult.didState.did! - const deactivateResult = await agent.dids.deactivate({ - did, + const deactivateResult = await agent.dids.deactivate({ + did }) expect(deactivateResult.didState.didDocument?.id).toEqual(did) diff --git a/packages/hedera/tests/utils/InMemoryTailsFileService.ts b/packages/hedera/tests/utils/InMemoryTailsFileService.ts deleted file mode 100644 index 952d4e51ea..0000000000 --- a/packages/hedera/tests/utils/InMemoryTailsFileService.ts +++ /dev/null @@ -1,59 +0,0 @@ -import type { AnonCredsRevocationRegistryDefinition } from '@credo-ts/anoncreds' -import type { AgentContext, FileSystem } from '@credo-ts/core' - -import { InjectionSymbols } from '@credo-ts/core' - -import { BasicTailsFileService } from '@credo-ts/anoncreds' - -export class InMemoryTailsFileService extends BasicTailsFileService { - private tailsFilePaths: Record = {} - - public async uploadTailsFile( - _agentContext: AgentContext, - options: { - revocationRegistryDefinition: AnonCredsRevocationRegistryDefinition - } - ) { - this.tailsFilePaths[options.revocationRegistryDefinition.value.tailsHash] = - options.revocationRegistryDefinition.value.tailsLocation - - return { tailsFileUrl: options.revocationRegistryDefinition.value.tailsLocation.replace(/\\/g, '/') } - } - - public async getTailsFile( - agentContext: AgentContext, - options: { - revocationRegistryDefinition: AnonCredsRevocationRegistryDefinition - } - ) { - const { revocationRegistryDefinition } = options - const { tailsLocation, tailsHash } = revocationRegistryDefinition.value - - try { - agentContext.config.logger.debug( - `Checking to see if tails file for URL ${revocationRegistryDefinition.value.tailsLocation} has been stored in the FileSystem` - ) - - // hash is used as file identifier - const tailsExists = await this.tailsFileExists(agentContext, tailsHash) - const tailsFilePath = await this.getTailsFilePath(agentContext, tailsHash) - agentContext.config.logger.debug( - `Tails file for ${tailsLocation} ${tailsExists ? 'is stored' : 'is not stored'} at ${tailsFilePath}` - ) - - if (!tailsExists) { - agentContext.config.logger.debug(`Retrieving tails file from URL ${tailsLocation}`) - const fileSystem = agentContext.dependencyManager.resolve(InjectionSymbols.FileSystem) - await fileSystem.downloadToFile(tailsLocation, tailsFilePath) - agentContext.config.logger.debug(`Saved tails file to FileSystem at path ${tailsFilePath}`) - } - - return { tailsFilePath } - } catch (error) { - agentContext.config.logger.error(`Error while retrieving tails file from URL ${tailsLocation}`, { - error, - }) - throw error - } - } -} diff --git a/packages/hedera/tests/utils/index.ts b/packages/hedera/tests/utils/index.ts index 10254fc074..ca92ddeaa0 100644 --- a/packages/hedera/tests/utils/index.ts +++ b/packages/hedera/tests/utils/index.ts @@ -1,3 +1,4 @@ export * from './hederaModule' +export * from './testCache' export * from './testTailsFileService' export * from './utils' diff --git a/packages/hedera/tests/utils/testTailsFileService.ts b/packages/hedera/tests/utils/testTailsFileService.ts index ee3672de6a..ce418eed05 100644 --- a/packages/hedera/tests/utils/testTailsFileService.ts +++ b/packages/hedera/tests/utils/testTailsFileService.ts @@ -20,7 +20,6 @@ export class TestTailsFileService extends BasicTailsFileService { return { tailsFileUrl: options.revocationRegistryDefinition.value.tailsLocation, } - // tailsFileUrl: options.revocationRegistryDefinition.value.tailsLocation.replace(/\\/g, '/') } public async getTailsFile( From e44d0e167d7bc364bf412f93e34e49ae2151879b Mon Sep 17 00:00:00 2001 From: "andrey.kononov" Date: Thu, 17 Jul 2025 18:04:22 +0300 Subject: [PATCH 65/89] Fix PR notes --- jest.config.base.ts | 1 - packages/hedera/jest.config.ts | 1 + packages/hedera/tests/HederaDidRegistrar.e2e.test.ts | 1 - 3 files changed, 1 insertion(+), 2 deletions(-) diff --git a/jest.config.base.ts b/jest.config.base.ts index 41ed7a8e94..43b6b40302 100644 --- a/jest.config.base.ts +++ b/jest.config.base.ts @@ -17,7 +17,6 @@ const config: Config.InitialOptions = { }, ], }, - testTimeout: 60000, } export default config diff --git a/packages/hedera/jest.config.ts b/packages/hedera/jest.config.ts index 2556d19c61..95d7a0b737 100644 --- a/packages/hedera/jest.config.ts +++ b/packages/hedera/jest.config.ts @@ -6,6 +6,7 @@ import packageJson from './package.json' const config: Config.InitialOptions = { ...base, + testTimeout: 100000, displayName: packageJson.name, } diff --git a/packages/hedera/tests/HederaDidRegistrar.e2e.test.ts b/packages/hedera/tests/HederaDidRegistrar.e2e.test.ts index e2f125e68b..dcca210093 100644 --- a/packages/hedera/tests/HederaDidRegistrar.e2e.test.ts +++ b/packages/hedera/tests/HederaDidRegistrar.e2e.test.ts @@ -9,7 +9,6 @@ import { } from '@credo-ts/core' import { HederaDidCreateOptions, - HederaDidDeactivateOptions, HederaDidUpdateOptions, } from '../src/ledger/HederaLedgerService' import { getMultibasePublicKey } from '../src/ledger/utils' From 6e06dd97ff35291b3553d8cf3fedb15bf9332ef7 Mon Sep 17 00:00:00 2001 From: Alexander Shenshin Date: Mon, 21 Jul 2025 13:03:12 +0300 Subject: [PATCH 66/89] Misc. cleanup --- packages/hedera/package.json | 14 +++++++------- packages/hedera/tests/utils/hederaModule.ts | 4 ++-- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/hedera/package.json b/packages/hedera/package.json index b7abcd9d8e..2a67f9b15c 100644 --- a/packages/hedera/package.json +++ b/packages/hedera/package.json @@ -27,13 +27,13 @@ "@hashgraph/sdk": "^2.66.0", "@credo-ts/anoncreds": "workspace:*", "@credo-ts/core": "workspace:*", - "@hiero-did-sdk/anoncreds": "npm:@hiero-did-sdk/anoncreds@0.0.12", - "@hiero-did-sdk/registrar": "npm:@hiero-did-sdk/registrar@0.0.9", - "@hiero-did-sdk/resolver": "npm:@hiero-did-sdk/resolver@0.0.11", - "@hiero-did-sdk/core": "npm:@hiero-did-sdk/core@0.0.7", - "@hiero-did-sdk/client": "npm:@hiero-did-sdk/client@0.0.5", - "@hiero-did-sdk/hcs": "npm:@hiero-did-sdk/hcs@0.0.16", - "@hiero-did-sdk/publisher-internal": "npm:@hiero-did-sdk/publisher-internal@0.0.3" + "@hiero-did-sdk/anoncreds": "0.0.12", + "@hiero-did-sdk/registrar": "0.0.9", + "@hiero-did-sdk/resolver": "0.0.11", + "@hiero-did-sdk/core": "0.0.7", + "@hiero-did-sdk/client": "0.0.5", + "@hiero-did-sdk/hcs": "0.0.16", + "@hiero-did-sdk/publisher-internal": "0.0.3" }, "devDependencies": { "@credo-ts/node": "workspace:*", diff --git a/packages/hedera/tests/utils/hederaModule.ts b/packages/hedera/tests/utils/hederaModule.ts index 11e482f202..2511a9ed53 100644 --- a/packages/hedera/tests/utils/hederaModule.ts +++ b/packages/hedera/tests/utils/hederaModule.ts @@ -14,8 +14,8 @@ import { askar } from '@openwallet-foundation/askar-nodejs' import { TestTailsFileService } from './testTailsFileService' export const getHederaModuleConfig = (props: { operatorId?: string; operatorKey?: string }) => { - const operatorId = props.operatorId ?? process.env.HEDERA_TEST_OPERATOR_ID ?? '' - const operatorKey = props.operatorKey ?? process.env.HEDERA_TEST_OPERATOR_KEY ?? '' + const operatorId = props.operatorId ?? process.env.HEDERA_OPERATOR_ID ?? '' + const operatorKey = props.operatorKey ?? process.env.HEDERA_OPERATOR_KEY ?? '' return { networks: [ { From 6eb5ae50280b0998f90d0514694f2c1d413e21ff Mon Sep 17 00:00:00 2001 From: "andrey.kononov" Date: Wed, 13 Aug 2025 19:38:46 +0300 Subject: [PATCH 67/89] Switch to NPM + unit-tests * Switched usage of @hiero-did-sdk-js to libraries from NPM repository * Fixed errors that occurred after switching libraries * Added unit tests to improve code coverage --- packages/hedera/jest.config.ts | 1 + packages/hedera/package.json | 18 +- .../src/anoncreds/HederaAnonCredsRegistry.ts | 12 +- .../hedera/src/dids/HederaDidRegistrar.ts | 5 +- .../hedera/src/ledger/HederaLedgerService.ts | 11 +- .../hedera/src/ledger/cache/CredoCache.ts | 4 +- .../src/ledger/publisher/KmsPublisher.ts | 10 +- .../HederaAnoncredsRegistry.e2e.test.ts | 4 +- .../HederaDidRegistrar.e2e.test.ts | 9 +- .../HederaDidResolver.e2e.test.ts | 2 +- .../{ => integration}/utils/hederaModule.ts | 0 .../tests/{ => integration}/utils/index.ts | 0 .../{ => integration}/utils/testCache.ts | 0 .../utils/testTailsFileService.ts | 0 packages/hedera/tests/tsconfig.json | 3 + .../hedera/tests/unit/credo-cache.test.ts | 99 ++++ .../unit/hedera-anoncres-registry.test.ts | 388 +++++++++++++ .../tests/unit/hedera-did-registrar.test.ts | 261 +++++++++ .../tests/unit/hedera-did-resolver.test.ts | 80 +++ .../tests/unit/hedera-ledger-service.test.ts | 512 ++++++++++++++++++ .../hedera/tests/unit/kms-publisher.test.ts | 132 +++++ packages/hedera/tests/unit/utils.test.ts | 90 +++ 22 files changed, 1608 insertions(+), 33 deletions(-) rename packages/hedera/tests/{ => integration}/HederaAnoncredsRegistry.e2e.test.ts (96%) rename packages/hedera/tests/{ => integration}/HederaDidRegistrar.e2e.test.ts (98%) rename packages/hedera/tests/{ => integration}/HederaDidResolver.e2e.test.ts (94%) rename packages/hedera/tests/{ => integration}/utils/hederaModule.ts (100%) rename packages/hedera/tests/{ => integration}/utils/index.ts (100%) rename packages/hedera/tests/{ => integration}/utils/testCache.ts (100%) rename packages/hedera/tests/{ => integration}/utils/testTailsFileService.ts (100%) create mode 100644 packages/hedera/tests/tsconfig.json create mode 100644 packages/hedera/tests/unit/credo-cache.test.ts create mode 100644 packages/hedera/tests/unit/hedera-anoncres-registry.test.ts create mode 100644 packages/hedera/tests/unit/hedera-did-registrar.test.ts create mode 100644 packages/hedera/tests/unit/hedera-did-resolver.test.ts create mode 100644 packages/hedera/tests/unit/hedera-ledger-service.test.ts create mode 100644 packages/hedera/tests/unit/kms-publisher.test.ts create mode 100644 packages/hedera/tests/unit/utils.test.ts diff --git a/packages/hedera/jest.config.ts b/packages/hedera/jest.config.ts index 95d7a0b737..80d2dc3106 100644 --- a/packages/hedera/jest.config.ts +++ b/packages/hedera/jest.config.ts @@ -8,6 +8,7 @@ const config: Config.InitialOptions = { ...base, testTimeout: 100000, displayName: packageJson.name, + coveragePathIgnorePatterns: ['../tests'], } export default config diff --git a/packages/hedera/package.json b/packages/hedera/package.json index 2a67f9b15c..4cc45380b5 100644 --- a/packages/hedera/package.json +++ b/packages/hedera/package.json @@ -20,6 +20,7 @@ "compile": "tsc -p tsconfig.build.json", "prepublishOnly": "pnpm run build", "test": "jest", + "test:coverage": "jest --coverage", "style:check": "biome check --unsafe", "style:fix": "biome check --write --unsafe" }, @@ -27,17 +28,18 @@ "@hashgraph/sdk": "^2.66.0", "@credo-ts/anoncreds": "workspace:*", "@credo-ts/core": "workspace:*", - "@hiero-did-sdk/anoncreds": "0.0.12", - "@hiero-did-sdk/registrar": "0.0.9", - "@hiero-did-sdk/resolver": "0.0.11", - "@hiero-did-sdk/core": "0.0.7", - "@hiero-did-sdk/client": "0.0.5", - "@hiero-did-sdk/hcs": "0.0.16", - "@hiero-did-sdk/publisher-internal": "0.0.3" + "@hiero-did-sdk/anoncreds": "0.1.0", + "@hiero-did-sdk/client": "0.1.0", + "@hiero-did-sdk/core": "0.1.0", + "@hiero-did-sdk/hcs": "0.1.0", + "@hiero-did-sdk/publisher-internal": "0.1.0", + "@hiero-did-sdk/registrar": "0.1.0", + "@hiero-did-sdk/resolver": "0.1.0" }, "devDependencies": { "@credo-ts/node": "workspace:*", "@hyperledger/anoncreds-nodejs": "^0.3.1", - "rimraf": "^4.4.0" + "rimraf": "^4.4.0", + "zstd-napi": "^0.0.10" } } diff --git a/packages/hedera/src/anoncreds/HederaAnonCredsRegistry.ts b/packages/hedera/src/anoncreds/HederaAnonCredsRegistry.ts index f743749100..cff195cfd5 100644 --- a/packages/hedera/src/anoncreds/HederaAnonCredsRegistry.ts +++ b/packages/hedera/src/anoncreds/HederaAnonCredsRegistry.ts @@ -101,9 +101,7 @@ export class HederaAnonCredsRegistry implements AnonCredsRegistry { credentialDefinitionId: string ): Promise { try { - agentContext.config.logger.trace( - `Resolving credential definition '${credentialDefinitionId}' from Hedera ledger` - ) + agentContext.config.logger.trace(`Resolving credential definition '${credentialDefinitionId}' from Hedera ledger`) const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) return await ledgerService.getCredentialDefinition(agentContext, credentialDefinitionId) } catch (error) { @@ -159,7 +157,7 @@ export class HederaAnonCredsRegistry implements AnonCredsRegistry { ): Promise { try { agentContext.config.logger.trace( - `Resolving revocation registry definition for '${revocationRegistryDefinitionId}' from Hedera ledger` + `Resolving revocation registry definition for '${revocationRegistryDefinitionId}' from Hedera ledger` ) const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) return await ledgerService.getRevocationRegistryDefinition(agentContext, revocationRegistryDefinitionId) @@ -188,7 +186,7 @@ export class HederaAnonCredsRegistry implements AnonCredsRegistry { ): Promise { try { agentContext.config.logger.trace( - `Registering revocation status list for '${options.revocationStatusList.revRegDefId}' on Hedera ledger` + `Registering revocation status list for '${options.revocationStatusList.revRegDefId}' on Hedera ledger` ) const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) return await ledgerService.registerRevocationStatusList(agentContext, options) @@ -220,10 +218,10 @@ export class HederaAnonCredsRegistry implements AnonCredsRegistry { ): Promise { try { agentContext.config.logger.trace( - `Resolving revocation status for for '${revocationRegistryId}' from Hedera ledger` + `Resolving revocation status for for '${revocationRegistryId}' from Hedera ledger` ) const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) - return await ledgerService.getRevocationStatusList(agentContext, revocationRegistryId, timestamp) + return await ledgerService.getRevocationStatusList(agentContext, revocationRegistryId, timestamp * 1000) } catch (error) { agentContext.config.logger.error(`Error retrieving revocation registry status list '${revocationRegistryId}'`, { error, diff --git a/packages/hedera/src/dids/HederaDidRegistrar.ts b/packages/hedera/src/dids/HederaDidRegistrar.ts index 51dccfa751..fdbcbba9ba 100644 --- a/packages/hedera/src/dids/HederaDidRegistrar.ts +++ b/packages/hedera/src/dids/HederaDidRegistrar.ts @@ -123,7 +123,10 @@ export class HederaDidRegistrar implements DidRegistrar { } } - async deactivate(agentContext: AgentContext, options: Omit): Promise { + async deactivate( + agentContext: AgentContext, + options: Omit + ): Promise { const didRepository = agentContext.dependencyManager.resolve(DidRepository) const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) diff --git a/packages/hedera/src/ledger/HederaLedgerService.ts b/packages/hedera/src/ledger/HederaLedgerService.ts index 3f052e9e66..894df1ab96 100644 --- a/packages/hedera/src/ledger/HederaLedgerService.ts +++ b/packages/hedera/src/ledger/HederaLedgerService.ts @@ -25,8 +25,8 @@ import { import { KeyManagementApi } from '@credo-ts/core/src/modules/kms' import { Client } from '@hashgraph/sdk' import { HederaAnoncredsRegistry } from '@hiero-did-sdk/anoncreds' -import { HederaNetwork, HederaClientService } from '@hiero-did-sdk/client' -import {DIDResolution, DID_ROOT_KEY_ID, Service, VerificationMethod, parseDID} from '@hiero-did-sdk/core' +import { HederaClientService, HederaNetwork } from '@hiero-did-sdk/client' +import { DIDResolution, DID_ROOT_KEY_ID, Service, VerificationMethod, parseDID } from '@hiero-did-sdk/core' import { CreateDIDResult, DIDUpdateBuilder, @@ -287,7 +287,12 @@ export class HederaLedgerService { options: RegisterCredentialDefinitionOptions ): Promise { const sdk = this.getHederaAnonCredsSdk(agentContext) - return await sdk.registerCredentialDefinition(options) + return await sdk.registerCredentialDefinition({ + ...options, + options: { + supportRevocation: options.options?.supportRevocation === true ?? false, + }, + }) } async getRevocationRegistryDefinition( diff --git a/packages/hedera/src/ledger/cache/CredoCache.ts b/packages/hedera/src/ledger/cache/CredoCache.ts index df6d59e70d..30a2eb7ea2 100644 --- a/packages/hedera/src/ledger/cache/CredoCache.ts +++ b/packages/hedera/src/ledger/cache/CredoCache.ts @@ -29,11 +29,11 @@ export class CredoCache implements Cache { await this.credoCache.remove(this.agentContext, key) } - cleanup(): Promise { + async clear(): Promise { throw new Error('Method not implemented.') } - cleanupExpired(): Promise { + async cleanupExpired(): Promise { throw new Error('Method not implemented.') } } diff --git a/packages/hedera/src/ledger/publisher/KmsPublisher.ts b/packages/hedera/src/ledger/publisher/KmsPublisher.ts index 58c00f0fdf..f96ce34451 100644 --- a/packages/hedera/src/ledger/publisher/KmsPublisher.ts +++ b/packages/hedera/src/ledger/publisher/KmsPublisher.ts @@ -1,5 +1,5 @@ import { AgentContext, Kms, TypedArrayEncoder } from '@credo-ts/core' -import {KeyManagementApi, KmsJwkPublicOkp} from '@credo-ts/core/src/modules/kms' +import { KeyManagementApi, KmsJwkPublicOkp } from '@credo-ts/core/src/modules/kms' import { Client, PublicKey, Transaction, TransactionReceipt } from '@hashgraph/sdk' import { KeysUtility } from '@hiero-did-sdk/core' import { Publisher as ClientPublisher } from '@hiero-did-sdk/publisher-internal' @@ -11,14 +11,18 @@ export class KmsPublisher extends ClientPublisher { private keyId!: string private submitPublicKey!: PublicKey - constructor(agentContext: AgentContext, client: Client, key: { keyId: string; publicJwk: KmsJwkPublicOkp & { crv: 'Ed25519' } }) { + constructor( + agentContext: AgentContext, + client: Client, + key: { keyId: string; publicJwk: KmsJwkPublicOkp & { crv: 'Ed25519' } } + ) { super(client) this.kms = agentContext.dependencyManager.resolve(Kms.KeyManagementApi) this.keyId = key.keyId this.submitPublicKey = KeysUtility.fromBytes( - Uint8Array.from(TypedArrayEncoder.fromBase64(key.publicJwk.x)) + Uint8Array.from(TypedArrayEncoder.fromBase64(key.publicJwk.x)) ).toPublicKey() } diff --git a/packages/hedera/tests/HederaAnoncredsRegistry.e2e.test.ts b/packages/hedera/tests/integration/HederaAnoncredsRegistry.e2e.test.ts similarity index 96% rename from packages/hedera/tests/HederaAnoncredsRegistry.e2e.test.ts rename to packages/hedera/tests/integration/HederaAnoncredsRegistry.e2e.test.ts index 1f76a0c191..667f1f7e7e 100644 --- a/packages/hedera/tests/HederaAnoncredsRegistry.e2e.test.ts +++ b/packages/hedera/tests/integration/HederaAnoncredsRegistry.e2e.test.ts @@ -1,5 +1,5 @@ import { Agent, ConsoleLogger, LogLevel, utils } from '@credo-ts/core' -import { HederaDidCreateOptions } from '../src/ledger/HederaLedgerService' +import { HederaDidCreateOptions } from '../../src/ledger/HederaLedgerService' import { getHederaAgent, testCache } from './utils' describe('Hedera AnonCreds support', () => { @@ -42,7 +42,7 @@ describe('Hedera AnonCreds support', () => { }) describe('Hedera Anoncreds Registry', () => { - it('Full flow (register and resolve schema, credential definition, revocation registry definition, revocation status list)', async () => { + it('should executes the full workflow (register and resolve schema, credential definition, revocation registry definition, revocation status list)', async () => { // Create the schema const schemaResult = await agent.modules.anoncreds.registerSchema({ schema: { diff --git a/packages/hedera/tests/HederaDidRegistrar.e2e.test.ts b/packages/hedera/tests/integration/HederaDidRegistrar.e2e.test.ts similarity index 98% rename from packages/hedera/tests/HederaDidRegistrar.e2e.test.ts rename to packages/hedera/tests/integration/HederaDidRegistrar.e2e.test.ts index dcca210093..193c796b40 100644 --- a/packages/hedera/tests/HederaDidRegistrar.e2e.test.ts +++ b/packages/hedera/tests/integration/HederaDidRegistrar.e2e.test.ts @@ -7,11 +7,8 @@ import { LogLevel, VerificationMethod, } from '@credo-ts/core' -import { - HederaDidCreateOptions, - HederaDidUpdateOptions, -} from '../src/ledger/HederaLedgerService' -import { getMultibasePublicKey } from '../src/ledger/utils' +import { HederaDidCreateOptions, HederaDidUpdateOptions } from '../../src/ledger/HederaLedgerService' +import { getMultibasePublicKey } from '../../src/ledger/utils' import { getHederaAgent } from './utils' describe('Hedera DID registrar', () => { @@ -390,7 +387,7 @@ describe('Hedera DID registrar', () => { const did = didResult.didState.did! const deactivateResult = await agent.dids.deactivate({ - did + did, }) expect(deactivateResult.didState.didDocument?.id).toEqual(did) diff --git a/packages/hedera/tests/HederaDidResolver.e2e.test.ts b/packages/hedera/tests/integration/HederaDidResolver.e2e.test.ts similarity index 94% rename from packages/hedera/tests/HederaDidResolver.e2e.test.ts rename to packages/hedera/tests/integration/HederaDidResolver.e2e.test.ts index 14f641bf86..c92aa547d7 100644 --- a/packages/hedera/tests/HederaDidResolver.e2e.test.ts +++ b/packages/hedera/tests/integration/HederaDidResolver.e2e.test.ts @@ -1,5 +1,5 @@ import { Agent, ConsoleLogger, JsonTransformer, LogLevel } from '@credo-ts/core' -import { HederaDidCreateOptions } from '../src/ledger/HederaLedgerService' +import { HederaDidCreateOptions } from '../../src/ledger/HederaLedgerService' import { getHederaAgent } from './utils' describe('Hedera DID resolver', () => { diff --git a/packages/hedera/tests/utils/hederaModule.ts b/packages/hedera/tests/integration/utils/hederaModule.ts similarity index 100% rename from packages/hedera/tests/utils/hederaModule.ts rename to packages/hedera/tests/integration/utils/hederaModule.ts diff --git a/packages/hedera/tests/utils/index.ts b/packages/hedera/tests/integration/utils/index.ts similarity index 100% rename from packages/hedera/tests/utils/index.ts rename to packages/hedera/tests/integration/utils/index.ts diff --git a/packages/hedera/tests/utils/testCache.ts b/packages/hedera/tests/integration/utils/testCache.ts similarity index 100% rename from packages/hedera/tests/utils/testCache.ts rename to packages/hedera/tests/integration/utils/testCache.ts diff --git a/packages/hedera/tests/utils/testTailsFileService.ts b/packages/hedera/tests/integration/utils/testTailsFileService.ts similarity index 100% rename from packages/hedera/tests/utils/testTailsFileService.ts rename to packages/hedera/tests/integration/utils/testTailsFileService.ts diff --git a/packages/hedera/tests/tsconfig.json b/packages/hedera/tests/tsconfig.json new file mode 100644 index 0000000000..105334e225 --- /dev/null +++ b/packages/hedera/tests/tsconfig.json @@ -0,0 +1,3 @@ +{ + "extends": "../../../tsconfig.test.json" +} diff --git a/packages/hedera/tests/unit/credo-cache.test.ts b/packages/hedera/tests/unit/credo-cache.test.ts new file mode 100644 index 0000000000..5c43ffe7ab --- /dev/null +++ b/packages/hedera/tests/unit/credo-cache.test.ts @@ -0,0 +1,99 @@ +import { AgentContext, CacheModuleConfig, CredoError } from '@credo-ts/core' +import { CredoCache, ICredoCache } from '../../src/ledger/cache/CredoCache' + +describe('CredoCache', () => { + let mockAgentContext: AgentContext + let mockDependencyManagerResolve: jest.Mock + let mockCredoCache: jest.Mocked + + beforeEach(() => { + mockCredoCache = { + get: jest.fn(), + set: jest.fn(), + remove: jest.fn(), + } + + mockDependencyManagerResolve = jest.fn().mockReturnValue({ cache: mockCredoCache }) + + mockAgentContext = { + dependencyManager: { + resolve: mockDependencyManagerResolve, + }, + } as unknown as AgentContext + }) + + it('should throw CredoError if cache not found in constructor', () => { + mockDependencyManagerResolve.mockReturnValue({ cache: null }) + + expect(() => new CredoCache(mockAgentContext)).toThrowError(CredoError) + }) + + it('should initialize credoCache from dependency manager', () => { + const credoCacheInstance = new CredoCache(mockAgentContext) + expect(mockDependencyManagerResolve).toHaveBeenCalledWith(CacheModuleConfig) + // @ts-ignore + expect(credoCacheInstance.credoCache).toBe(mockCredoCache) + }) + + describe('get', () => { + it('should call credoCache.get with correct parameters and return value', async () => { + const testKey = 'test-key' + const returnedValue = { foo: 'bar' } + mockCredoCache.get.mockResolvedValue(returnedValue) + + const credoCacheInstance = new CredoCache(mockAgentContext) + const result = await credoCacheInstance.get(testKey) + + expect(mockCredoCache.get).toHaveBeenCalledWith(mockAgentContext, testKey) + expect(result).toBe(returnedValue) + }) + + it('should return null if credoCache.get resolves null', async () => { + mockCredoCache.get.mockResolvedValue(null) + + const credoCacheInstance = new CredoCache(mockAgentContext) + const result = await credoCacheInstance.get('missing') + + expect(result).toBeNull() + }) + }) + + describe('set', () => { + it('should call credoCache.set with correct parameters', async () => { + const key = 'key' + const value = { a: 1 } + mockCredoCache.set.mockResolvedValue(undefined) + + const credoCacheInstance = new CredoCache(mockAgentContext) + await credoCacheInstance.set(key, value, 123) + + expect(mockCredoCache.set).toHaveBeenCalledWith(mockAgentContext, key, value) + }) + }) + + describe('remove', () => { + it('should call credoCache.remove with correct parameters', async () => { + const key = 'keyToRemove' + mockCredoCache.remove.mockResolvedValue(undefined) + + const credoCacheInstance = new CredoCache(mockAgentContext) + await credoCacheInstance.remove(key) + + expect(mockCredoCache.remove).toHaveBeenCalledWith(mockAgentContext, key) + }) + }) + + describe('clear', () => { + it('should throw error when called', async () => { + const credoCacheInstance = new CredoCache(mockAgentContext) + await expect(credoCacheInstance.clear()).rejects.toThrowError('Method not implemented.') + }) + }) + + describe('cleanupExpired', () => { + it('should throw error when called', async () => { + const credoCacheInstance = new CredoCache(mockAgentContext) + await expect(credoCacheInstance.cleanupExpired()).rejects.toThrowError('Method not implemented.') + }) + }) +}) diff --git a/packages/hedera/tests/unit/hedera-anoncres-registry.test.ts b/packages/hedera/tests/unit/hedera-anoncres-registry.test.ts new file mode 100644 index 0000000000..49b7dba713 --- /dev/null +++ b/packages/hedera/tests/unit/hedera-anoncres-registry.test.ts @@ -0,0 +1,388 @@ +import { + RegisterSchemaOptions, + RegisterSchemaReturn, + GetSchemaReturn, + RegisterCredentialDefinitionOptions, + RegisterCredentialDefinitionReturn, + GetCredentialDefinitionReturn, + RegisterRevocationRegistryDefinitionOptions, + RegisterRevocationRegistryDefinitionReturn, + GetRevocationRegistryDefinitionReturn, + RegisterRevocationStatusListOptions, + RegisterRevocationStatusListReturn, + GetRevocationStatusListReturn, + RegisterSchemaReturnStateFinished, +} from '@credo-ts/anoncreds' +import {AgentContext} from "@credo-ts/core"; +import {HederaAnonCredsRegistry} from "@credo-ts/hedera"; +import {HederaLedgerService} from "../../src/ledger/HederaLedgerService"; + +const createMockAgentContext = () => ({ + dependencyManager: { + resolve: jest.fn(), + }, + config: { + logger: { + trace: jest.fn(), + debug: jest.fn(), + error: jest.fn(), + }, + }, +}) as unknown as AgentContext + +describe('HederaAnonCredsRegistry', () => { + let service: HederaAnonCredsRegistry + let mockAgentContext: AgentContext + let mockLedgerService: any + + beforeEach(() => { + mockAgentContext = createMockAgentContext() + mockLedgerService = { + registerSchema: jest.fn(), + getSchema: jest.fn(), + registerCredentialDefinition: jest.fn(), + getCredentialDefinition: jest.fn(), + registerRevocationRegistryDefinition: jest.fn(), + getRevocationRegistryDefinition: jest.fn(), + registerRevocationStatusList: jest.fn(), + getRevocationStatusList: jest.fn(), + } + // @ts-ignore + mockAgentContext.dependencyManager.resolve.mockReturnValue(mockLedgerService) + + service = new HederaAnonCredsRegistry() + }) + + describe('registerSchema', () => { + const options: RegisterSchemaOptions = { + schema: { + issuerId: 'did:hedera:123', name: 'schemaName', version: '1.0', + attrNames: [] + }, + options: {}, + } + + it('should call ledgerService.registerSchema and return result on success', async () => { + const expected: RegisterSchemaReturn = { + schemaMetadata: {}, registrationMetadata: {}, + schemaState: { + state: "finished" + } as RegisterSchemaReturnStateFinished + } + mockLedgerService.registerSchema.mockResolvedValue(expected) + + const result = await service.registerSchema(mockAgentContext, options) + + expect(mockAgentContext.config.logger.trace).toHaveBeenCalledWith('Registering schema on Hedera ledger') + expect(mockAgentContext.dependencyManager.resolve).toHaveBeenCalledWith(expect.any(Function) || HederaLedgerService) + expect(mockLedgerService.registerSchema).toHaveBeenCalledWith(mockAgentContext, options) + expect(result).toEqual(expected) + }) + + it('should catch error and return failed state', async () => { + const error = new Error('fail') + mockLedgerService.registerSchema.mockRejectedValue(error) + + const result = await service.registerSchema(mockAgentContext, options) + + expect(mockAgentContext.config.logger.debug).toHaveBeenCalledWith( + `Error registering schema for did '${options.schema.issuerId}'`, + expect.objectContaining({ error, did: options.schema.issuerId, schema: options }) + ) + expect(result.schemaState.state).toBe('failed') + if (result.schemaState.state === 'failed') + expect(result.schemaState.reason).toContain('fail') + }) + }) + + describe('getSchema', () => { + const schemaId = 'schema-id-123' + + it('should call ledgerService.getSchema and return result on success', async () => { + const expected: GetSchemaReturn = { + schemaId: schemaId, + resolutionMetadata: {}, + schemaMetadata: {} + } + mockLedgerService.getSchema.mockResolvedValue(expected) + + const result = await service.getSchema(mockAgentContext, schemaId) + + expect(mockAgentContext.config.logger.trace).toHaveBeenCalledWith(`Resolving schema '${schemaId}' from Hedera ledger`) + expect(mockLedgerService.getSchema).toHaveBeenCalledWith(mockAgentContext, schemaId) + expect(result).toEqual(expected) + }) + + it('should catch error and return notFound error state', async () => { + const error = new Error('not found') + mockLedgerService.getSchema.mockRejectedValue(error) + + const result = await service.getSchema(mockAgentContext, schemaId) + + expect(mockAgentContext.config.logger.error).toHaveBeenCalledWith( + `Error retrieving schema '${schemaId}'`, + expect.objectContaining({ error, schemaId }) + ) + expect(result.resolutionMetadata.error).toBe('notFound') + expect(result.resolutionMetadata.message).toContain('not found') + }) + }) + + describe('registerCredentialDefinition', () => { + const options: RegisterCredentialDefinitionOptions = { + credentialDefinition: { issuerId: 'did:hedera:issuer' } + } as any + + it('should call ledgerService.registerCredentialDefinition and return result on success', async () => { + const expected: RegisterCredentialDefinitionReturn = { + credentialDefinitionMetadata: {}, + registrationMetadata: {}, + credentialDefinitionState: { + state: "finished", + credentialDefinition: { + issuerId: '', + schemaId: '', + type: 'CL', + tag: '', + value: { + primary: {}, + revocation: undefined + } + }, + credentialDefinitionId: "did:hedera:issuerId", + } + } + mockLedgerService.registerCredentialDefinition.mockResolvedValue(expected) + + const result = await service.registerCredentialDefinition(mockAgentContext, options) + + expect(mockAgentContext.config.logger.trace).toHaveBeenCalledWith('Registering credential definition on Hedera ledger') + expect(mockLedgerService.registerCredentialDefinition).toHaveBeenCalledWith(mockAgentContext, options) + expect(result).toEqual(expected) + }) + + it('should catch error and return failed state', async () => { + const error = new Error('fail') + mockLedgerService.registerCredentialDefinition.mockRejectedValue(error) + + const result = await service.registerCredentialDefinition(mockAgentContext, options) + + expect(mockAgentContext.config.logger.error).toHaveBeenCalledWith( + `Error registering credential definition for did '${options.credentialDefinition.issuerId}'`, + expect.objectContaining({ error, did: options.credentialDefinition.issuerId, schema: options }) + ) + expect(result.credentialDefinitionState.state).toBe('failed') + if (result.credentialDefinitionState.state === 'failed') + expect(result.credentialDefinitionState.reason).toContain('fail') + }) + }) + + describe('getCredentialDefinition', () => { + const credentialDefinitionId = 'cred-def-123' + + it('should call ledgerService.getCredentialDefinition and return result on success', async () => { + const expected: GetCredentialDefinitionReturn = { + credentialDefinitionId, + resolutionMetadata: {}, + credentialDefinitionMetadata: {} + } + mockLedgerService.getCredentialDefinition.mockResolvedValue(expected) + + const result = await service.getCredentialDefinition(mockAgentContext, credentialDefinitionId) + + expect(mockAgentContext.config.logger.trace).toHaveBeenCalledWith( + `Resolving credential definition '${credentialDefinitionId}' from Hedera ledger` + ) + expect(mockLedgerService.getCredentialDefinition).toHaveBeenCalledWith(mockAgentContext, credentialDefinitionId) + expect(result).toEqual(expected) + }) + + it('should catch error and return notFound error state', async () => { + const error = new Error('not found') + mockLedgerService.getCredentialDefinition.mockRejectedValue(error) + + const result = await service.getCredentialDefinition(mockAgentContext, credentialDefinitionId) + + expect(mockAgentContext.config.logger.error).toHaveBeenCalledWith( + `Error retrieving credential definition '${credentialDefinitionId}'`, + expect.objectContaining({ error, credentialDefinitionId }) + ) + expect(result.resolutionMetadata.error).toBe('notFound') + expect(result.resolutionMetadata.message).toContain('not found') + }) + }) + + describe('registerRevocationRegistryDefinition', () => { + const options: RegisterRevocationRegistryDefinitionOptions = { + revocationRegistryDefinition: { credDefId: 'credDef1', issuerId: 'did:hedera:issuer' }, + } as any + + it('should call ledgerService.registerRevocationRegistryDefinition and return result on success', async () => { + const expected: RegisterRevocationRegistryDefinitionReturn = { + revocationRegistryDefinitionMetadata: {}, + registrationMetadata: {}, + revocationRegistryDefinitionState: { + state: "finished", + revocationRegistryDefinitionId: 'test', + revocationRegistryDefinition: { + issuerId: '', + revocDefType: 'CL_ACCUM', + credDefId: '', + tag: '', + value: { + publicKeys: { + accumKey: { + z: '' + } + }, + maxCredNum: 0, + tailsLocation: '', + tailsHash: '' + } + } + } + } + mockLedgerService.registerRevocationRegistryDefinition.mockResolvedValue(expected) + + const result = await service.registerRevocationRegistryDefinition(mockAgentContext, options) + + expect(mockAgentContext.config.logger.trace).toHaveBeenCalledWith( + `Registering revocation registry definition for '${options.revocationRegistryDefinition.credDefId}' on Hedera ledger` + ) + expect(mockLedgerService.registerRevocationRegistryDefinition).toHaveBeenCalledWith(mockAgentContext, options) + expect(result).toEqual(expected) + }) + + it('should catch error and return failed state', async () => { + const error = new Error('fail') + mockLedgerService.registerRevocationRegistryDefinition.mockRejectedValue(error) + + const result = await service.registerRevocationRegistryDefinition(mockAgentContext, options) + + expect(mockAgentContext.config.logger.error).toHaveBeenCalledWith( + `Error registering revocation registry definition for did '${options.revocationRegistryDefinition.issuerId}'`, + expect.objectContaining({ error, did: options.revocationRegistryDefinition.issuerId, options }) + ) + expect(result.revocationRegistryDefinitionState.state).toBe('failed') + if (result.revocationRegistryDefinitionState.state === 'failed') + expect(result.revocationRegistryDefinitionState.reason).toContain('fail') + }) + }) + + describe('getRevocationRegistryDefinition', () => { + const revocationRegistryDefinitionId = 'revRegDef123' + + it('should call ledgerService.getRevocationRegistryDefinition and return result on success', async () => { + const expected: GetRevocationRegistryDefinitionReturn = { + revocationRegistryDefinitionId, + resolutionMetadata: {}, + revocationRegistryDefinitionMetadata: {} + } + mockLedgerService.getRevocationRegistryDefinition.mockResolvedValue(expected) + + const result = await service.getRevocationRegistryDefinition(mockAgentContext, revocationRegistryDefinitionId) + + expect(mockAgentContext.config.logger.trace).toHaveBeenCalledWith( + `Resolving revocation registry definition for '${revocationRegistryDefinitionId}' from Hedera ledger` + ) + expect(mockLedgerService.getRevocationRegistryDefinition).toHaveBeenCalledWith(mockAgentContext, revocationRegistryDefinitionId) + expect(result).toEqual(expected) + }) + + it('should catch error and return notFound error state', async () => { + const error = new Error('not found') + mockLedgerService.getRevocationRegistryDefinition.mockRejectedValue(error) + + const result = await service.getRevocationRegistryDefinition(mockAgentContext, revocationRegistryDefinitionId) + + expect(mockAgentContext.config.logger.error).toHaveBeenCalledWith( + `Error retrieving revocation registry definition '${revocationRegistryDefinitionId}'`, + expect.objectContaining({ error, revocationRegistryDefinitionId }) + ) + expect(result.resolutionMetadata.error).toBe('notFound') + expect(result.resolutionMetadata.message).toContain('not found') + }) + }) + + describe('registerRevocationStatusList', () => { + const options: RegisterRevocationStatusListOptions = { + revocationStatusList: { revRegDefId: 'regDef1', issuerId: 'did:hedera:issuer' } + } as any + + it('should call ledgerService.registerRevocationStatusList and return result on success', async () => { + const expected: RegisterRevocationStatusListReturn = { + revocationStatusListMetadata: {}, + registrationMetadata: {}, + revocationStatusListState: { + state: 'finished', + revocationStatusList: { + revRegDefId: '', + issuerId: '', + revocationList: [], + timestamp: 0, + currentAccumulator: '' + } + } + } + mockLedgerService.registerRevocationStatusList.mockResolvedValue(expected) + + const result = await service.registerRevocationStatusList(mockAgentContext, options) + + expect(mockAgentContext.config.logger.trace).toHaveBeenCalledWith( + `Registering revocation status list for '${options.revocationStatusList.revRegDefId}' on Hedera ledger` + ) + expect(mockLedgerService.registerRevocationStatusList).toHaveBeenCalledWith(mockAgentContext, options) + expect(result).toEqual(expected) + }) + + it('should catch error and return failed state', async () => { + const error = new Error('fail') + mockLedgerService.registerRevocationStatusList.mockRejectedValue(error) + + const result = await service.registerRevocationStatusList(mockAgentContext, options) + + expect(mockAgentContext.config.logger.error).toHaveBeenCalledWith( + `Error registering revocation status list for did '${options.revocationStatusList.issuerId}'`, + expect.objectContaining({ error, did: options.revocationStatusList.issuerId, options }) + ) + expect(result.revocationStatusListState.state).toBe('failed') + if (result.revocationStatusListState.state === 'failed') + expect(result.revocationStatusListState.reason).toContain('fail') + }) + }) + + describe('getRevocationStatusList', () => { + const revocationRegistryId = 'revRegId123' + const timestamp = 1234567890 + + it('should call ledgerService.getRevocationStatusList and return result on success', async () => { + const expected: GetRevocationStatusListReturn = { + resolutionMetadata: {}, + revocationStatusListMetadata: {} + } + mockLedgerService.getRevocationStatusList.mockResolvedValue(expected) + + const result = await service.getRevocationStatusList(mockAgentContext, revocationRegistryId, timestamp) + + expect(mockAgentContext.config.logger.trace).toHaveBeenCalledWith( + `Resolving revocation status for for '${revocationRegistryId}' from Hedera ledger` + ) + expect(mockLedgerService.getRevocationStatusList).toHaveBeenCalledWith(mockAgentContext, revocationRegistryId, timestamp * 1000) + expect(result).toEqual(expected) + }) + + it('should catch error and return notFound error state', async () => { + const error = new Error('not found') + mockLedgerService.getRevocationStatusList.mockRejectedValue(error) + + const result = await service.getRevocationStatusList(mockAgentContext, revocationRegistryId, timestamp) + + expect(mockAgentContext.config.logger.error).toHaveBeenCalledWith( + `Error retrieving revocation registry status list '${revocationRegistryId}'`, + expect.objectContaining({ error, revocationRegistryId }) + ) + expect(result.resolutionMetadata.error).toBe('notFound') + expect(result.resolutionMetadata.message).toContain('not found') + }) + }) +}) diff --git a/packages/hedera/tests/unit/hedera-did-registrar.test.ts b/packages/hedera/tests/unit/hedera-did-registrar.test.ts new file mode 100644 index 0000000000..a9a022d910 --- /dev/null +++ b/packages/hedera/tests/unit/hedera-did-registrar.test.ts @@ -0,0 +1,261 @@ +import type { AgentContext, DidDocumentKey } from '@credo-ts/core' +import { DidDocumentRole } from '@credo-ts/core' +import { HederaDidRegistrar } from '@credo-ts/hedera' +import {HederaDidUpdateOptions} from "../../src/ledger/HederaLedgerService"; + +describe('HederaDidRegistrar', () => { + let service: HederaDidRegistrar + let mockAgentContext: any + let mockDidRepository: any + let mockLedgerService: any + + beforeEach(() => { + const mockLogger = { + debug: jest.fn(), + error: jest.fn(), + } + + mockDidRepository = { + save: jest.fn(), + findCreatedDid: jest.fn(), + update: jest.fn(), + } + + mockLedgerService = { + createDid: jest.fn(), + resolveDid: jest.fn(), + updateDid: jest.fn(), + deactivateDid: jest.fn(), + } + + mockAgentContext = { + dependencyManager: { + resolve: jest.fn() + .mockImplementation((obj: any) => { + if (obj.name === 'DidRepository') return mockDidRepository + if (obj.name === 'HederaLedgerService') return mockLedgerService + }), + }, + config: { + logger: mockLogger, + }, + } + + service = new HederaDidRegistrar() + }) + + describe('create', () => { + it('should create DID, save it, and return finished state on success', async () => { + const did = 'did:hedera:123' + const didDocument = { + service: [{ id: 'service1' }, { id: 'service2' }], + } + const rootKey = { kmsKeyId: 'key1', didDocumentRelativeKeyId: 'rootKeyId' } + + mockLedgerService.createDid.mockResolvedValue({ did, didDocument, rootKey }) + + const result = await service.create(mockAgentContext as AgentContext, { + method: 'hedera', + options: {}, + } as any) + + expect(mockDidRepository.save).toHaveBeenCalled() + const savedRecord = mockDidRepository.save.mock.calls[0][1] + expect(savedRecord.did).toBe(did) + expect(savedRecord.role).toBe(DidDocumentRole.Created) + expect(savedRecord.didDocument).toBeInstanceOf(Object) + expect(savedRecord.didDocument.service[0]).toBeInstanceOf(Object) + + expect(result.didState.state).toBe('finished') + expect(result.didState.did).toBe(did) + expect(result.didState.didDocument).toBeInstanceOf(Object) + }) + + it('should handle error and return failed state', async () => { + mockLedgerService.createDid.mockRejectedValue(new Error('Create failed')) + + const result = await service.create(mockAgentContext as AgentContext, { + method: 'hedera', + options: {}, + } as any) + + expect(mockAgentContext.config.logger.debug).toHaveBeenCalledWith('Error creating DID', expect.any(Object)) + + expect(result.didState.state).toBe('failed') + if (result.didState.state === 'failed') + expect(result.didState.reason).toBe('Unable to register Did: Create failed') + }) + }) + + describe('update', () => { + const did = 'did:hedera:123' + + it('should update DID and save record successfully', async () => { + const didDocument = { id: did } + const updatedDidDocument = { id: did, updated: true } + + const foundDidRecord = { + didDocument, + keys: [{ didDocumentRelativeKeyId: 'key1' }], + }; + mockLedgerService.resolveDid.mockResolvedValue({ + didDocument, + didDocumentMetadata: { deactivated: false }, + didResolutionMetadata: {}, + }); + mockDidRepository.findCreatedDid.mockResolvedValue(foundDidRecord); + mockLedgerService.updateDid.mockResolvedValue({ didDocument: updatedDidDocument }); + mockDidRepository.update.mockResolvedValue(undefined); + + const options: HederaDidUpdateOptions = { + did, + didDocumentOperation: 'setDidDocument', + secret: { keys: [{ + didDocumentRelativeKeyId: 'key2', + kmsKeyId: 'some-key' + }] }, + didDocument: {}, + } + + const result = await service.update(mockAgentContext as AgentContext, options) + + expect(mockLedgerService.resolveDid).toHaveBeenCalledWith(mockAgentContext, did) + expect(mockDidRepository.findCreatedDid).toHaveBeenCalledWith(mockAgentContext, did) + + expect(mockLedgerService.updateDid).toHaveBeenCalledWith(mockAgentContext, expect.objectContaining({ + secret: { keys: expect.any(Array) }, + })) + + expect(mockDidRepository.update).toHaveBeenCalledWith(mockAgentContext, foundDidRecord) + + expect(result.didState.state).toBe('finished') + expect(result.didState.did).toBe(did) + expect(result.didState.didDocument).toBeInstanceOf(Object) + }) + + it('should return failed state if DID not found or deactivated', async () => { + mockLedgerService.resolveDid.mockResolvedValue({ didDocument: null, didDocumentMetadata: { deactivated: true } }) + mockDidRepository.findCreatedDid.mockResolvedValue(null) + + const options = { + did, + } as any + + const result = await service.update(mockAgentContext as AgentContext, options) + + expect(result.didState.state).toBe('failed') + if (result.didState.state === 'failed') + expect(result.didState.reason).toBe('Did not found') + }) + + it('should handle error and return failed state', async () => { + mockLedgerService.resolveDid.mockRejectedValue(new Error('Update failed')) + + const options = { + did, + didDocumentOperation: 'setDidDocument', + } as any + + const result = await service.update(mockAgentContext as AgentContext, options) + + expect(mockAgentContext.config.logger.error).toHaveBeenCalledWith('Error update DID', expect.any(Error)) + expect(result.didState.state).toBe('failed') + if (result.didState.state === 'failed') + expect(result.didState.reason).toBe('Unable update DID: Update failed') + }) + }) + + describe('deactivate', () => { + const did = 'did:hedera:123' + + it('should deactivate DID and save updated record successfully', async () => { + const didDocument = { id: did } + const deactivatedDidDocument = { id: did, deactivated: true } + + const foundDidRecord = { + didDocument, + keys: [{ didDocumentRelativeKeyId: 'key1' }], + } + + mockLedgerService.resolveDid.mockResolvedValue({ didDocument, didDocumentMetadata: {} }) + mockDidRepository.findCreatedDid.mockResolvedValue(foundDidRecord) + mockLedgerService.deactivateDid.mockResolvedValue({ didDocument: deactivatedDidDocument }) + mockDidRepository.update.mockResolvedValue(undefined) + + const options = { + did, + } + + const result = await service.deactivate(mockAgentContext as AgentContext, options) + + expect(mockLedgerService.resolveDid).toHaveBeenCalledWith(mockAgentContext, did) + expect(mockDidRepository.findCreatedDid).toHaveBeenCalledWith(mockAgentContext, did) + expect(mockLedgerService.deactivateDid).toHaveBeenCalledWith(mockAgentContext, expect.objectContaining({ + secret: { keys: foundDidRecord.keys }, + })) + expect(mockDidRepository.update).toHaveBeenCalledWith(mockAgentContext, foundDidRecord) + + expect(result.didState.state).toBe('finished') + expect(result.didState.did).toBe(did) + expect(result.didState.didDocument).toBeInstanceOf(Object) + }) + + it('should return failed state if DID not found or deactivated', async () => { + mockLedgerService.resolveDid.mockResolvedValue({ didDocument: null, didDocumentMetadata: { deactivated: true } }) + mockDidRepository.findCreatedDid.mockResolvedValue(null) + + const options = { + did, + } + + const result = await service.deactivate(mockAgentContext as AgentContext, options) + + expect(result.didState.state).toBe('failed') + if (result.didState.state === 'failed') + expect(result.didState.reason).toBe('Did not found') + }) + + it('should handle error and return failed state', async () => { + mockLedgerService.resolveDid.mockRejectedValue(new Error('Deactivate failed')) + + const options = { + did, + } + + const result = await service.deactivate(mockAgentContext as AgentContext, options) + + expect(mockAgentContext.config.logger.error).toHaveBeenCalledWith('Error deactivate DID', expect.any(Error)) + expect(result.didState.state).toBe('failed') + if (result.didState.state === 'failed') + expect(result.didState.reason).toBe('Unable deactivating DID: Deactivate failed') + }) + }) + + describe('concatKeys (private method)', () => { + it('should concatenate keys without duplicates based on relativeKeyId', () => { + const keys1 = [ + { didDocumentRelativeKeyId: 'key1' }, + { didDocumentRelativeKeyId: 'key2' }, + ] as DidDocumentKey[] + + const keys2 = [ + { didDocumentRelativeKeyId: 'key2' }, + { didDocumentRelativeKeyId: 'key3' }, + ] as DidDocumentKey[] + + const result = (service as any).concatKeys(keys1, keys2) + + expect(result).toHaveLength(3) + expect(result).toEqual(expect.arrayContaining([ + { didDocumentRelativeKeyId: 'key1' }, + { didDocumentRelativeKeyId: 'key2' }, + { didDocumentRelativeKeyId: 'key3' }, + ])) + }) + + it('should handle undefined arguments and return empty array', () => { + const result = (service as any).concatKeys(undefined, undefined) + expect(result).toEqual([]) + }) + }) +}) diff --git a/packages/hedera/tests/unit/hedera-did-resolver.test.ts b/packages/hedera/tests/unit/hedera-did-resolver.test.ts new file mode 100644 index 0000000000..0985400da5 --- /dev/null +++ b/packages/hedera/tests/unit/hedera-did-resolver.test.ts @@ -0,0 +1,80 @@ +import { JsonTransformer, DidDocument } from '@credo-ts/core' +import {HederaLedgerService} from "../../src/ledger/HederaLedgerService"; +import { HederaDidResolver } from '@credo-ts/hedera'; + +describe('HederaDidResolver', () => { + let resolver: HederaDidResolver + let mockAgentContext: any + let mockLedgerService: any + + beforeEach(() => { + const mockLogger = { + trace: jest.fn(), + debug: jest.fn(), + } + + mockLedgerService = { + resolveDid: jest.fn(), + } + + mockAgentContext = { + config: { logger: mockLogger }, + dependencyManager: { + resolve: jest.fn().mockReturnValue(mockLedgerService), + }, + } + + resolver = new HederaDidResolver() + }) + + it('should successfully resolve DID', async () => { + const did = 'did:hedera:123' + const fakeDidDocument = { id: did } + const resolveDidResult = { + didDocument: { id: did }, + didDocumentMetadata: { meta: 'meta' }, + didResolutionMetadata: { resMeta: 'resMeta' }, + } + + mockLedgerService.resolveDid.mockResolvedValue(resolveDidResult) + + jest.spyOn(JsonTransformer, 'fromJSON').mockReturnValue(fakeDidDocument as unknown as DidDocument) + + const result = await resolver.resolve(mockAgentContext, did, {} as any, {} as any) + + expect(mockAgentContext.config.logger.trace).toHaveBeenCalledWith('Try to resolve a did document from ledger') + expect(mockAgentContext.dependencyManager.resolve).toHaveBeenCalledWith(HederaLedgerService) + expect(mockLedgerService.resolveDid).toHaveBeenCalledWith(mockAgentContext, did) + expect(JsonTransformer.fromJSON).toHaveBeenCalledWith(resolveDidResult.didDocument, DidDocument) + + expect(result).toEqual({ + didDocument: fakeDidDocument, + didDocumentMetadata: resolveDidResult.didDocumentMetadata, + didResolutionMetadata: resolveDidResult.didResolutionMetadata, + }) + }) + + it('should handle error and return notFound', async () => { + const did = 'did:hedera:bad' + const error = new Error('Some error') + + mockLedgerService.resolveDid.mockRejectedValue(error) + + const result = await resolver.resolve(mockAgentContext, did, {} as any, {} as any) + + expect(mockAgentContext.config.logger.trace).toHaveBeenCalledWith('Try to resolve a did document from ledger') + expect(mockAgentContext.config.logger.debug).toHaveBeenCalledWith('Error resolving the did', { + error, + did, + }) + + expect(result).toEqual({ + didDocument: null, + didDocumentMetadata: {}, + didResolutionMetadata: { + error: 'notFound', + message: `Unable to resolve did '${did}': ${error}`, + }, + }) + }) +}) diff --git a/packages/hedera/tests/unit/hedera-ledger-service.test.ts b/packages/hedera/tests/unit/hedera-ledger-service.test.ts new file mode 100644 index 0000000000..494e6bf5bb --- /dev/null +++ b/packages/hedera/tests/unit/hedera-ledger-service.test.ts @@ -0,0 +1,512 @@ +import { type DidDocument } from '@credo-ts/core' +import { + AgentContext, + DependencyManager, +} from '@credo-ts/core' +import { DidDocumentKey, Kms } from '@credo-ts/core' +import {KmsJwkPublicOkp} from "@credo-ts/core/src/modules/kms"; +import { + RegisterCredentialDefinitionOptions, + RegisterRevocationRegistryDefinitionOptions, + RegisterRevocationStatusListOptions, RegisterSchemaOptions +} from "@credo-ts/anoncreds"; +import {HederaDidCreateOptions, HederaLedgerService} from '../../src/ledger/HederaLedgerService' +import {Client} from "@hashgraph/sdk"; + +jest.mock('@hiero-did-sdk/registrar', () => ({ + DIDUpdateBuilder: jest.fn().mockReturnValue({ + addService: jest.fn().mockReturnThis(), + removeService: jest.fn().mockReturnThis(), + addVerificationMethod: jest.fn().mockReturnThis(), + removeVerificationMethod: jest.fn().mockReturnThis(), + addAssertionMethod: jest.fn().mockReturnThis(), + removeAssertionMethod: jest.fn().mockReturnThis(), + addAuthenticationMethod: jest.fn().mockReturnThis(), + removeAuthenticationMethod: jest.fn().mockReturnThis(), + addCapabilityDelegationMethod: jest.fn().mockReturnThis(), + removeCapabilityDelegationMethod: jest.fn().mockReturnThis(), + addCapabilityInvocationMethod: jest.fn().mockReturnThis(), + removeCapabilityInvocationMethod: jest.fn().mockReturnThis(), + addKeyAgreementMethod: jest.fn().mockReturnThis(), + removeKeyAgreementMethod: jest.fn().mockReturnThis(), + build: jest.fn() + }), + generateCreateDIDRequest: jest.fn(), + submitCreateDIDRequest: jest.fn(), + generateUpdateDIDRequest: jest.fn(), + submitUpdateDIDRequest: jest.fn(), + generateDeactivateDIDRequest: jest.fn(), + submitDeactivateDIDRequest: jest.fn() +})) + +import { + DIDUpdateBuilder, + generateCreateDIDRequest, + generateDeactivateDIDRequest, + generateUpdateDIDRequest, + submitCreateDIDRequest, + submitDeactivateDIDRequest, + submitUpdateDIDRequest, +} from '@hiero-did-sdk/registrar' + +jest.mock('@hiero-did-sdk/resolver', () => ({ + resolveDID: jest.fn(), + TopicReaderHederaHcs: jest.fn() +})) + +import { resolveDID } from '@hiero-did-sdk/resolver' + +jest.mock('@hiero-did-sdk/core', () => ({ + parseDID: jest.fn(), +})) + +import {DID_ROOT_KEY_ID, parseDID, Publisher} from '@hiero-did-sdk/core' + +jest.mock('../../src/ledger/utils') + +import { createOrGetKey } from '../../src/ledger/utils' + +describe('HederaLedgerService', () => { + let service: HederaLedgerService + let mockAgentContext: Partial + let mockKms: jest.Mocked + let mockedCreateOrGetKey: jest.MockedFunction + let mockedParseDID: jest.MockedFunction + let mockedGenerateDeactivateDIDRequest: jest.MockedFunction + let builder: DIDUpdateBuilder + + beforeEach(() => { + jest.clearAllMocks() + + mockedCreateOrGetKey = createOrGetKey as jest.MockedFunction + mockedParseDID = parseDID as jest.MockedFunction + mockedGenerateDeactivateDIDRequest = generateDeactivateDIDRequest as jest.MockedFunction + + builder = new DIDUpdateBuilder() + + mockKms = { + sign: jest.fn(), + } as unknown as jest.Mocked + + mockAgentContext = { + dependencyManager: { + resolve: jest.fn().mockReturnValue(mockKms), + } as unknown as DependencyManager, + } + + const mockCache = { + get: jest.fn().mockResolvedValue(null), + set: jest.fn().mockResolvedValue(undefined), + remove: jest.fn().mockResolvedValue(undefined), + clear: jest.fn(), + cleanupExpired: jest.fn() + } + + service = new HederaLedgerService({ + options: { + networks: [ + { + network: 'testnet', + operatorId: '1', + operatorKey: '2', + }, + ], + cache: mockCache, + }, + }) + + jest.spyOn(service['clientService'], 'withClient').mockImplementation(async (props, operation) => { + const mockClient = {} as Client; + return operation(mockClient); + }); + }) + + describe('resolveDid', () => { + it('should calls resolveDID with proper args and returns result', async () => { + const did = 'did:hedera:test'; + + const mockResolution = { didDocument: { id: did } }; + + (resolveDID as jest.Mock).mockResolvedValue(mockResolution) + + const result = await service.resolveDid(mockAgentContext as AgentContext, did) + + expect(resolveDID).toHaveBeenCalledWith( + did, + 'application/ld+json;profile="https://w3id.org/did-resolution"', + expect.any(Object) + ) + expect(result).toBe(mockResolution) + }) + }) + + describe('createDid', () => { + it('should creates DID without didDocument', async () => { + const keyId = 'key123' + const publicJwk: KmsJwkPublicOkp & { crv: 'Ed25519' } = { crv: 'Ed25519', kty: 'OKP', x: 'abc' } + const props: HederaDidCreateOptions = { + method: 'hedera', + options: { network: 'testnet' }, + secret: { rootKeyId: keyId, keys: [] }, + }; + + mockedCreateOrGetKey.mockResolvedValue({ keyId, publicJwk }); + + (generateCreateDIDRequest as jest.Mock).mockResolvedValue({ state: {}, signingRequest: { serializedPayload: new Uint8Array() } }); + + (submitCreateDIDRequest as jest.Mock).mockResolvedValue({ did: 'did:hedera:1234' }); + + jest.spyOn(service as any, 'getPublisher').mockResolvedValue({} as Publisher) + + mockKms.sign.mockResolvedValue({ signature: new Uint8Array([1, 2, 3]) }); + + const result = await service.createDid(mockAgentContext as AgentContext, props as any) + expect(createOrGetKey).toHaveBeenCalledWith(mockKms, keyId) + expect(generateCreateDIDRequest).toHaveBeenCalled() + expect(submitCreateDIDRequest).toHaveBeenCalled() + expect(result.did).toBe('did:hedera:1234') + expect(result.rootKey).toBeDefined() + }) + + it('should creates DID with didDocument and calls updateDid', async () => { + const keyId = 'key123' + const publicJwk: KmsJwkPublicOkp & { crv: 'Ed25519' } = { crv: 'Ed25519', kty: 'OKP', x: 'abc' } + const didDocument = { controller: 'did:hedera:controller' } + const props = { + method: 'hedera', + options: { network: 'testnet' }, + secret: { rootKeyId: keyId, keys: [] }, + didDocument, + }; + + mockedCreateOrGetKey.mockResolvedValue({ keyId, publicJwk }); + + (generateCreateDIDRequest as jest.Mock).mockResolvedValue({ state: {}, signingRequest: { serializedPayload: new Uint8Array() } }); + + (submitCreateDIDRequest as jest.Mock).mockResolvedValue({ did: 'did:hedera:1234' }); + + const updateDidSpy = jest.spyOn(service, 'updateDid').mockResolvedValue({ did: 'did:hedera:1234', someProp: true } as any); + + jest.spyOn(service as any, 'getPublisher').mockResolvedValue({} as Publisher); + + mockKms.sign.mockResolvedValue({ signature: new Uint8Array([1, 2, 3]) }) + + const result = await service.createDid(mockAgentContext as AgentContext, props as any) + expect(updateDidSpy).toHaveBeenCalled() + expect(result.rootKey).toBeDefined() + }) + }) + + describe('updateDid', () => { + const did = 'did:hedera:1234' + const kmsKeyId = 'key-id' + + it('should throws error if didDocumentOperation is missing', async () => { + await expect(service.updateDid(mockAgentContext as AgentContext, { did } as any)).rejects.toThrow( + 'DidDocumentOperation is required' + ) + }) + + it('should throws error if rootKey missing', async () => { + const keys: DidDocumentKey[] = [] + await expect( + service.updateDid(mockAgentContext as AgentContext, { + did, + didDocumentOperation: 'setDidDocument', + secret: { keys }, + didDocument: {}, + }) + ).rejects.toThrow('The root key not found in the KMS') + }) + + it('should calls correct builder methods for each field and action', () => { + const spies = { + addService: jest.spyOn(builder, 'addService'), + removeService: jest.spyOn(builder, 'removeService'), + addVerificationMethod: jest.spyOn(builder, 'addVerificationMethod'), + removeVerificationMethod: jest.spyOn(builder, 'removeVerificationMethod'), + addAssertionMethod: jest.spyOn(builder, 'addAssertionMethod'), + removeAssertionMethod: jest.spyOn(builder, 'removeAssertionMethod'), + addAuthenticationMethod: jest.spyOn(builder, 'addAuthenticationMethod'), + removeAuthenticationMethod: jest.spyOn(builder, 'removeAuthenticationMethod'), + addCapabilityDelegationMethod: jest.spyOn(builder, 'addCapabilityDelegationMethod'), + removeCapabilityDelegationMethod: jest.spyOn(builder, 'removeCapabilityDelegationMethod'), + addCapabilityInvocationMethod: jest.spyOn(builder, 'addCapabilityInvocationMethod'), + removeCapabilityInvocationMethod: jest.spyOn(builder, 'removeCapabilityInvocationMethod'), + addKeyAgreementMethod: jest.spyOn(builder, 'addKeyAgreementMethod'), + removeKeyAgreementMethod: jest.spyOn(builder, 'removeKeyAgreementMethod'), + } + + const testCases: [string, 'add' | 'remove', string, jest.SpyInstance][] = [ + ['service', 'add', 'service-item', spies.addService], + ['service', 'remove', 'service-id', spies.removeService], + + ['verificationMethod', 'add', 'verificationMethod-item', spies.addVerificationMethod], + ['verificationMethod', 'remove', 'verificationMethod-id', spies.removeVerificationMethod], + + ['assertionMethod', 'add', 'assertionMethod-item', spies.addAssertionMethod], + ['assertionMethod', 'remove', 'assertionMethod-id', spies.removeAssertionMethod], + + ['authentication', 'add', 'authentication-item', spies.addAuthenticationMethod], + ['authentication', 'remove', 'authentication-id', spies.removeAuthenticationMethod], + + ['capabilityDelegation', 'add', 'capabilityDelegation-item', spies.addCapabilityDelegationMethod], + ['capabilityDelegation', 'remove', 'capabilityDelegation-id', spies.removeCapabilityDelegationMethod], + + ['capabilityInvocation', 'add', 'capabilityInvocation-item', spies.addCapabilityInvocationMethod], + ['capabilityInvocation', 'remove', 'capabilityInvocation-id', spies.removeCapabilityInvocationMethod], + + ['keyAgreement', 'add', 'keyAgreement-item', spies.addKeyAgreementMethod], + ['keyAgreement', 'remove', 'keyAgreement-id', spies.removeKeyAgreementMethod], + ] + + for (const [field, action, param, spy] of testCases) { + jest.clearAllMocks() + + const fn = (service as any).getUpdateMethod(builder, field, action) + + const result = fn(param) + + expect(result).toBe(builder) + expect(spy).toHaveBeenCalledTimes(1) + expect(spy).toHaveBeenCalledWith(param) + for (const otherSpy of Object.values(spies)) { + if (otherSpy !== spy) expect(otherSpy).not.toHaveBeenCalled() + } + } + }) + + it('should returns builder unchanged for unknown field', () => { + const unknownField = 'unknownField' + const fn = (service as any).getUpdateMethod(builder, unknownField, 'add') + const result = fn('any param') + expect(result).toBe(builder) + }) + + it('should performs update flow successfully', async () => { + const keys: DidDocumentKey[] = [{ kmsKeyId, didDocumentRelativeKeyId: DID_ROOT_KEY_ID }, { kmsKeyId: 'some-key', didDocumentRelativeKeyId: '#abc' }]; + + const didDocument: Partial = { + verificationMethod: [{ + id: '#abc', + type: 'hedera', + controller: 'test' + }], + } + const currentDidDoc = { verificationMethod: [{ id: '#abc' }] } + const mockDidResolution = { didDocument: currentDidDoc } + + const updatesMock = { build: jest.fn().mockReturnValue(didDocument) } as any + + mockedParseDID.mockReturnValue({ + network: 'testnet', + method: 'hedera', + publicKey: '', + topicId: '' + }); + + (resolveDID as jest.Mock).mockResolvedValue(mockDidResolution); + + jest.spyOn(service as any, 'prepareDidUpdates').mockReturnValue(updatesMock); + + jest.spyOn(service as any, 'getPublisher').mockResolvedValue({} as Publisher); + + (generateUpdateDIDRequest as jest.Mock).mockResolvedValue({ states: {}, signingRequests: {} }); + + jest.spyOn(service as any, 'signRequests').mockResolvedValue(Promise.resolve()); + + (submitUpdateDIDRequest as jest.Mock).mockResolvedValue({ did: did }) + + await expect( + service.updateDid(mockAgentContext as AgentContext, { + did, + didDocumentOperation: 'setDidDocument', + didDocument, + secret: { keys }, + }) + ).resolves.toHaveProperty('did', did) + + expect((service as any).prepareDidUpdates).toHaveBeenCalled() + expect(generateUpdateDIDRequest).toHaveBeenCalled() + expect(submitUpdateDIDRequest).toHaveBeenCalled() + }) + }) + + describe('deactivateDid', () => { + const did = 'did:hedera:5678' + const kmsKeyId = 'key-id' + + it('should throws error if rootKey is missing', async () => { + await expect( + service.deactivateDid(mockAgentContext as AgentContext, { did, secret: { keys: [] } } as any) + ).rejects.toThrow('The root key not found in the KMS') + }) + + it('should throws an error if root key is not found in deactivateDid', async () => { + const props = { + did: 'did:hedera:123', + secret: { + keys: [], + }, + } + + // @ts-ignore + mockAgentContext.dependencyManager.resolve.mockReturnValue({ sign: jest.fn() }) + + await expect(service.deactivateDid(mockAgentContext as AgentContext, props)) + .rejects.toThrow('The root key not found in the KMS') + }) + + it('should deactivates DID successfully', async () => { + const keys: DidDocumentKey[] = [{ kmsKeyId, didDocumentRelativeKeyId: DID_ROOT_KEY_ID }] + const mockPublisher = {} + const mockState = {} + const mockSigningRequest = { serializedPayload: new Uint8Array() } + const signature = new Uint8Array([1, 2, 3]); + + (parseDID as jest.Mock).mockReturnValue({ network: 'testnet' }); + + jest.spyOn(service as any, 'getPublisher').mockResolvedValue(mockPublisher) + + // @ts-ignore + mockedGenerateDeactivateDIDRequest.mockResolvedValue({ state: mockState, signingRequest: mockSigningRequest }); + + mockKms.sign.mockResolvedValue({ signature }); + + (submitDeactivateDIDRequest as jest.Mock).mockResolvedValue({ did }) + + const result = await service.deactivateDid( + mockAgentContext as AgentContext, + { + did, + secret: { keys }, + } as any + ) + + expect(result).toHaveProperty('did', did) + expect(mockKms.sign).toHaveBeenCalledWith({ + keyId: kmsKeyId, + data: mockSigningRequest.serializedPayload, + algorithm: 'EdDSA', + }) + }) + }) + + describe('Anoncreds SDK methods', () => { + let mockSdk: any + + beforeEach(() => { + mockSdk = { + getSchema: jest.fn().mockResolvedValue('schema'), + registerSchema: jest.fn().mockResolvedValue('registerSchema'), + getCredentialDefinition: jest.fn().mockResolvedValue('credDef'), + registerCredentialDefinition: jest.fn().mockResolvedValue('registerCredDef'), + getRevocationRegistryDefinition: jest.fn().mockResolvedValue('revRegDef'), + registerRevocationRegistryDefinition: jest.fn().mockResolvedValue('registerRevRegDef'), + getRevocationStatusList: jest.fn().mockResolvedValue('revStatusList'), + registerRevocationStatusList: jest.fn().mockResolvedValue('registerRevStatus'), + } + jest.spyOn(service as any, 'getHederaAnonCredsSdk').mockReturnValue(mockSdk) + }) + + it('getSchema', async () => { + const result = await service.getSchema(mockAgentContext as AgentContext, 'schemaId') + expect(mockSdk.getSchema).toHaveBeenCalledWith('schemaId') + expect(result).toBe('schema') + }) + + it('registerSchema', async () => { + const options: RegisterSchemaOptions = { + schema: { + issuerId: '', + name: '', + version: '', + attrNames: [] + }, + options: {} + } + const result = await service.registerSchema(mockAgentContext as AgentContext, options) + expect(mockSdk.registerSchema).toHaveBeenCalledWith(options) + expect(result).toBe('registerSchema') + }) + + it('getCredentialDefinition', async () => { + const result = await service.getCredentialDefinition(mockAgentContext as AgentContext, 'credDefId') + expect(mockSdk.getCredentialDefinition).toHaveBeenCalledWith('credDefId') + expect(result).toBe('credDef') + }) + + it('registerCredentialDefinition', async () => { + const options: RegisterCredentialDefinitionOptions = { + options: {supportRevocation: true}, + credentialDefinition: { + issuerId: '', + schemaId: '', + type: 'CL', + tag: '', + value: { + primary: {}, + revocation: undefined + } + } + } + await service.registerCredentialDefinition(mockAgentContext as AgentContext, options) + expect(mockSdk.registerCredentialDefinition).toHaveBeenCalledWith({ + ...options, + options: { supportRevocation: true }, + }) + }) + + it('getRevocationRegistryDefinition', async () => { + const result = await service.getRevocationRegistryDefinition(mockAgentContext as AgentContext, 'revRegDefId') + expect(mockSdk.getRevocationRegistryDefinition).toHaveBeenCalledWith('revRegDefId') + expect(result).toBe('revRegDef') + }) + + it('registerRevocationRegistryDefinition', async () => { + const options: RegisterRevocationRegistryDefinitionOptions = { + revocationRegistryDefinition: { + issuerId: '', + revocDefType: 'CL_ACCUM', + credDefId: '', + tag: '', + value: { + publicKeys: { + accumKey: { + z: '' + } + }, + maxCredNum: 0, + tailsLocation: '', + tailsHash: '' + } + }, + options: {} + } + const result = await service.registerRevocationRegistryDefinition(mockAgentContext as AgentContext, options) + expect(mockSdk.registerRevocationRegistryDefinition).toHaveBeenCalledWith(options) + expect(result).toBe('registerRevRegDef') + }) + + it('getRevocationStatusList', async () => { + const result = await service.getRevocationStatusList(mockAgentContext as AgentContext, 'revRegId', 12345) + expect(mockSdk.getRevocationStatusList).toHaveBeenCalledWith('revRegId', 12345) + expect(result).toBe('revStatusList') + }) + + it('registerRevocationStatusList', async () => { + const options: RegisterRevocationStatusListOptions = { + options: {}, + revocationStatusList: { + revRegDefId: '', + issuerId: '', + revocationList: [], + currentAccumulator: '' + } + } + const result = await service.registerRevocationStatusList(mockAgentContext as AgentContext, options) + expect(mockSdk.registerRevocationStatusList).toHaveBeenCalledWith(options) + expect(result).toBe('registerRevStatus') + }) + }) +}) diff --git a/packages/hedera/tests/unit/kms-publisher.test.ts b/packages/hedera/tests/unit/kms-publisher.test.ts new file mode 100644 index 0000000000..1a6f44d2d6 --- /dev/null +++ b/packages/hedera/tests/unit/kms-publisher.test.ts @@ -0,0 +1,132 @@ +import { KeysUtility } from '@hiero-did-sdk/core' +import { Kms, TypedArrayEncoder} from '@credo-ts/core' +import { KmsPublisher } from "../../src/ledger/publisher/KmsPublisher"; +import { KmsJwkPublicOkp} from "@credo-ts/core/src/modules/kms"; + +jest.mock('@hiero-did-sdk/core', () => ({ + KeysUtility: { + fromBytes: jest.fn(), + }, + DIDError: class DIDError extends Error {} + +})) + +jest.mock('@credo-ts/core', () => ({ + TypedArrayEncoder: { + fromBase64: jest.fn(), + }, + Kms: { + KeyManagementApi: jest.fn().mockImplementation(() => ({})), + }, +})) + +jest.mock('../../src/ledger/utils', () => ({ + createOrGetKey: jest.fn(), +})) + +import {createOrGetKey} from "../../src/ledger/utils"; + +jest.mock('@hiero-did-sdk/publisher-internal', () => { + return { + Publisher: jest.fn(), + } +}); + +describe('KmsPublisher', () => { + const mockClient = { + freezeWith: jest.fn(), + signWith: jest.fn(), + execute: jest.fn(), + operator: { + accountId: '0.0.1234', + publicKey: {} + }, + } + + const mockFrozenTransaction = { + signWith: jest.fn(), + } + + const mockResponse = { + getReceipt: jest.fn(), + } + + const signMock = jest.fn().mockResolvedValue({ signature: 'signature-bytes' }) + + const kmsMock = { + sign: signMock + } + + const agentContext = { + dependencyManager: { + resolve: jest.fn().mockImplementation((key) => { + if (key === Kms.KeyManagementApi) { + return kmsMock + } + throw new Error(`Unexpected dependency: ${key}`) + }) + } + } + + const keyId = 'test-key-id' + const base64X = 'base64-x' + const publicJwk: KmsJwkPublicOkp & { crv: 'Ed25519' } = { x: base64X, crv: 'Ed25519', kty: 'OKP' } + const key: { keyId: string; publicJwk: KmsJwkPublicOkp & { crv: 'Ed25519' } } = { keyId, publicJwk } + + const mockPublicKey = { + toPublicKey: jest.fn(), + } + + const fakePublicKey = {} + + beforeEach(() => { + jest.clearAllMocks() + + ;(TypedArrayEncoder.fromBase64 as jest.Mock).mockReturnValue(new Uint8Array([1, 2, 3])) + + ;(KeysUtility.fromBytes as jest.Mock).mockReturnValue(mockPublicKey) + mockPublicKey.toPublicKey.mockReturnValue(fakePublicKey) + + mockClient.freezeWith.mockReturnValue(mockFrozenTransaction) + + mockFrozenTransaction.signWith.mockImplementation(async (_publicKey, signCallback) => { + const signature = await signCallback(new Uint8Array([4, 5, 6])) + expect(signature).toBe('signature-bytes') + return + }) + + mockClient.execute.mockResolvedValue(mockResponse) + + mockResponse.getReceipt.mockResolvedValue('receipt-object') + }) + + it('should correctly create an instance via constructor', () => { + const publisher = new KmsPublisher(agentContext as any, mockClient as any, key) + expect(agentContext.dependencyManager.resolve).toHaveBeenCalledWith(expect.anything()) + expect(publisher.publicKey()).toBe(fakePublicKey) + }) + + it('should correctly update key in setKeyId', async () => { + (createOrGetKey as jest.Mock).mockResolvedValue({ + publicJwk: { x: base64X, crv: 'Ed25519' }, + }) + + const publisher = new KmsPublisher(agentContext as any, mockClient as any, key) + await publisher.setKeyId('new-key-id') + + expect(createOrGetKey).toHaveBeenCalledWith(kmsMock, 'new-key-id') + expect(KeysUtility.fromBytes).toHaveBeenCalledTimes(2) + }) + + it('should return correct publicKey', () => { + const publisher = new KmsPublisher(agentContext as any, mockClient as any, key) + expect(publisher.publicKey()).toBe(fakePublicKey) + }) + + it('should throw error in publish if key is not set', async () => { + const publisher = new KmsPublisher(agentContext as any, mockClient as any, key) + ;(publisher as any).submitPublicKey = undefined + + await expect(publisher.publish({} as any)).rejects.toThrow('Need to setup the KeyId') + }) +}) diff --git a/packages/hedera/tests/unit/utils.test.ts b/packages/hedera/tests/unit/utils.test.ts new file mode 100644 index 0000000000..9ef6c20c6e --- /dev/null +++ b/packages/hedera/tests/unit/utils.test.ts @@ -0,0 +1,90 @@ +import { Kms } from '@credo-ts/core' +import type { KeyManagementApi, KmsJwkPublicOkp, KmsJwkPublicRsa } from '@credo-ts/core/src/modules/kms' +import { createOrGetKey, getMultibasePublicKey } from '../../src/ledger/utils' + +describe('getMultibasePublicKey', () => { + it('should return a base58 key string prefixed with "z"', () => { + const base64X = 'dGVzdGtleQ==' // base64 for 'testkey' + const publicJwk = { + crv: 'Ed25519', + x: base64X, + } + // Expect base64 'dGVzdGtleQ==' to be decoded into Uint8Array + // and then encoded into base58 string starting with 'z' + const multibaseKey = getMultibasePublicKey(publicJwk as KmsJwkPublicOkp & { crv: 'Ed25519' }) + expect(multibaseKey.startsWith('z')).toBe(true) + expect(typeof multibaseKey).toBe('string') + }) +}) + +describe('createOrGetKey', () => { + let kmsMock: jest.Mocked + + beforeEach(() => { + kmsMock = { + createKey: jest.fn(), + getPublicKey: jest.fn(), + } as unknown as jest.Mocked + }) + + it('should creates a key if keyId is not provided', async () => { + const fakeKeyId = 'key123' + const fakeJwk: KmsJwkPublicOkp & { kid: string } = { kty: 'OKP', crv: 'Ed25519', x: 'xxx', kid: 'key123' } + kmsMock.createKey.mockResolvedValue({ + keyId: fakeKeyId, + publicJwk: fakeJwk, + }) + + const result = await createOrGetKey(kmsMock, undefined) + // Check that createKey was called with correct parameters + expect(kmsMock.createKey).toHaveBeenCalledWith({ type: { crv: 'Ed25519', kty: 'OKP' } }) + // Check the returned result matches the mocked createKey response + expect(result).toEqual({ + keyId: fakeKeyId, + publicJwk: fakeJwk, + }) + }) + + it('should retrieves an existing key if keyId is provided', async () => { + const keyId = 'key456' + const publicJwk: KmsJwkPublicOkp & { kid: string } = { kty: 'OKP', crv: 'Ed25519', x: 'xxx', kid: 'key123' } + kmsMock.getPublicKey.mockResolvedValue(publicJwk) + + const result = await createOrGetKey(kmsMock, keyId) + // Check that getPublicKey was called with the given keyId + expect(kmsMock.getPublicKey).toHaveBeenCalledWith({ keyId }) + // Check the returned keyId and publicJwk match the mocked response + expect(result).toEqual({ + keyId, + publicJwk: { + ...publicJwk, + crv: publicJwk.crv, + }, + }) + }) + + it('should throws an error if key with given keyId is not found', async () => { + // @ts-ignore + kmsMock.getPublicKey.mockResolvedValue(null) + + // Expect the function to throw an error for missing key + await expect(createOrGetKey(kmsMock, 'notfound')).rejects.toThrowError("Key with key id 'notfound' not found") + }) + + it('should throws an error if key has unsupported kty or crv', async () => { + const keyId = 'badkey' + const badJwk: KmsJwkPublicRsa & { kid: string } = { e: '', kid: 'key-1', n: '', kty: 'RSA' } + + kmsMock.getPublicKey.mockResolvedValue(badJwk) + + // Mock Kms.getJwkHumanDescription to control error message output + const spyDesc = jest.spyOn(Kms, 'getJwkHumanDescription').mockReturnValue('unsupported key type') + + // Expect an error indicating unsupported key type or curve + await expect(createOrGetKey(kmsMock, keyId)).rejects.toThrow( + `Key with key id '${keyId}' uses unsupported unsupported key type for did:hedera` + ) + + spyDesc.mockRestore() + }) +}) From 5abb182ae4f0b2a128216ac0552216d293cd0a33 Mon Sep 17 00:00:00 2001 From: "andrey.kononov" Date: Wed, 13 Aug 2025 20:00:06 +0300 Subject: [PATCH 68/89] Switch to NPM + unit-tests * Fix issues --- packages/hedera/tests/integration/utils/utils.ts | 1 + packages/hedera/tests/utils/utils.ts | 5 ----- 2 files changed, 1 insertion(+), 5 deletions(-) create mode 100644 packages/hedera/tests/integration/utils/utils.ts delete mode 100644 packages/hedera/tests/utils/utils.ts diff --git a/packages/hedera/tests/integration/utils/utils.ts b/packages/hedera/tests/integration/utils/utils.ts new file mode 100644 index 0000000000..3114bf6c16 --- /dev/null +++ b/packages/hedera/tests/integration/utils/utils.ts @@ -0,0 +1 @@ +export const getRandomStr = (n: number) => [...Array(n)].map(() => Math.random().toString(36)[2]).join('') diff --git a/packages/hedera/tests/utils/utils.ts b/packages/hedera/tests/utils/utils.ts deleted file mode 100644 index baf29ab0d5..0000000000 --- a/packages/hedera/tests/utils/utils.ts +++ /dev/null @@ -1,5 +0,0 @@ -export const getRandomStr = (n: number) => [...Array(n)].map(() => Math.random().toString(36)[2]).join('') - -// export const waitTimeout = async (timeout?: number) => { -// await new Promise((resolve) => setTimeout(resolve, timeout ?? 5000)) -// } From cf424733922ae57b23f444331914a5e8e0eba235 Mon Sep 17 00:00:00 2001 From: "andrey.kononov" Date: Wed, 13 Aug 2025 20:16:18 +0300 Subject: [PATCH 69/89] Switch to NPM + unit-tests * Fix merge issues --- demo/src/FaberInquirer.ts | 4 +- .../hedera/src/ledger/HederaLedgerService.ts | 2 +- .../unit/hedera-anoncres-registry.test.ts | 736 +++++++------- .../tests/unit/hedera-did-registrar.test.ts | 444 +++++---- .../tests/unit/hedera-did-resolver.test.ts | 138 +-- .../tests/unit/hedera-ledger-service.test.ts | 336 ++++--- .../hedera/tests/unit/kms-publisher.test.ts | 25 +- pnpm-lock.yaml | 933 +++++++++++++++++- 8 files changed, 1787 insertions(+), 831 deletions(-) diff --git a/demo/src/FaberInquirer.ts b/demo/src/FaberInquirer.ts index 26eb97e3e2..ac5fb6118e 100644 --- a/demo/src/FaberInquirer.ts +++ b/demo/src/FaberInquirer.ts @@ -90,7 +90,9 @@ export class FaberInquirer extends BaseInquirer { } public async credential() { - const registry = await prompt([this.inquireOptions([RegistryOptions.indy, RegistryOptions.cheqd, RegistryOptions.hedera])]) + const registry = await prompt([ + this.inquireOptions([RegistryOptions.indy, RegistryOptions.cheqd, RegistryOptions.hedera]), + ]) await this.faber.importDid(registry.options) await this.faber.issueCredential() const title = 'Is the credential offer accepted?' diff --git a/packages/hedera/src/ledger/HederaLedgerService.ts b/packages/hedera/src/ledger/HederaLedgerService.ts index 894df1ab96..c694d7fc66 100644 --- a/packages/hedera/src/ledger/HederaLedgerService.ts +++ b/packages/hedera/src/ledger/HederaLedgerService.ts @@ -290,7 +290,7 @@ export class HederaLedgerService { return await sdk.registerCredentialDefinition({ ...options, options: { - supportRevocation: options.options?.supportRevocation === true ?? false, + supportRevocation: options.options?.supportRevocation === true, }, }) } diff --git a/packages/hedera/tests/unit/hedera-anoncres-registry.test.ts b/packages/hedera/tests/unit/hedera-anoncres-registry.test.ts index 49b7dba713..6674326f59 100644 --- a/packages/hedera/tests/unit/hedera-anoncres-registry.test.ts +++ b/packages/hedera/tests/unit/hedera-anoncres-registry.test.ts @@ -1,388 +1,404 @@ import { - RegisterSchemaOptions, - RegisterSchemaReturn, - GetSchemaReturn, - RegisterCredentialDefinitionOptions, - RegisterCredentialDefinitionReturn, - GetCredentialDefinitionReturn, - RegisterRevocationRegistryDefinitionOptions, - RegisterRevocationRegistryDefinitionReturn, - GetRevocationRegistryDefinitionReturn, - RegisterRevocationStatusListOptions, - RegisterRevocationStatusListReturn, - GetRevocationStatusListReturn, - RegisterSchemaReturnStateFinished, + GetCredentialDefinitionReturn, + GetRevocationRegistryDefinitionReturn, + GetRevocationStatusListReturn, + GetSchemaReturn, + RegisterCredentialDefinitionOptions, + RegisterCredentialDefinitionReturn, + RegisterRevocationRegistryDefinitionOptions, + RegisterRevocationRegistryDefinitionReturn, + RegisterRevocationStatusListOptions, + RegisterRevocationStatusListReturn, + RegisterSchemaOptions, + RegisterSchemaReturn, + RegisterSchemaReturnStateFinished, } from '@credo-ts/anoncreds' -import {AgentContext} from "@credo-ts/core"; -import {HederaAnonCredsRegistry} from "@credo-ts/hedera"; -import {HederaLedgerService} from "../../src/ledger/HederaLedgerService"; +import { AgentContext } from '@credo-ts/core' +import { HederaAnonCredsRegistry } from '@credo-ts/hedera' +import { HederaLedgerService } from '../../src/ledger/HederaLedgerService' -const createMockAgentContext = () => ({ +const createMockAgentContext = () => + ({ dependencyManager: { - resolve: jest.fn(), + resolve: jest.fn(), }, config: { - logger: { - trace: jest.fn(), - debug: jest.fn(), - error: jest.fn(), - }, + logger: { + trace: jest.fn(), + debug: jest.fn(), + error: jest.fn(), + }, }, -}) as unknown as AgentContext + }) as unknown as AgentContext describe('HederaAnonCredsRegistry', () => { - let service: HederaAnonCredsRegistry - let mockAgentContext: AgentContext - let mockLedgerService: any - - beforeEach(() => { - mockAgentContext = createMockAgentContext() - mockLedgerService = { - registerSchema: jest.fn(), - getSchema: jest.fn(), - registerCredentialDefinition: jest.fn(), - getCredentialDefinition: jest.fn(), - registerRevocationRegistryDefinition: jest.fn(), - getRevocationRegistryDefinition: jest.fn(), - registerRevocationStatusList: jest.fn(), - getRevocationStatusList: jest.fn(), - } - // @ts-ignore - mockAgentContext.dependencyManager.resolve.mockReturnValue(mockLedgerService) - - service = new HederaAnonCredsRegistry() + let service: HederaAnonCredsRegistry + let mockAgentContext: AgentContext + let mockLedgerService: any + + beforeEach(() => { + mockAgentContext = createMockAgentContext() + mockLedgerService = { + registerSchema: jest.fn(), + getSchema: jest.fn(), + registerCredentialDefinition: jest.fn(), + getCredentialDefinition: jest.fn(), + registerRevocationRegistryDefinition: jest.fn(), + getRevocationRegistryDefinition: jest.fn(), + registerRevocationStatusList: jest.fn(), + getRevocationStatusList: jest.fn(), + } + // @ts-ignore + mockAgentContext.dependencyManager.resolve.mockReturnValue(mockLedgerService) + + service = new HederaAnonCredsRegistry() + }) + + describe('registerSchema', () => { + const options: RegisterSchemaOptions = { + schema: { + issuerId: 'did:hedera:123', + name: 'schemaName', + version: '1.0', + attrNames: [], + }, + options: {}, + } + + it('should call ledgerService.registerSchema and return result on success', async () => { + const expected: RegisterSchemaReturn = { + schemaMetadata: {}, + registrationMetadata: {}, + schemaState: { + state: 'finished', + } as RegisterSchemaReturnStateFinished, + } + mockLedgerService.registerSchema.mockResolvedValue(expected) + + const result = await service.registerSchema(mockAgentContext, options) + + expect(mockAgentContext.config.logger.trace).toHaveBeenCalledWith('Registering schema on Hedera ledger') + expect(mockAgentContext.dependencyManager.resolve).toHaveBeenCalledWith( + expect.any(Function) || HederaLedgerService + ) + expect(mockLedgerService.registerSchema).toHaveBeenCalledWith(mockAgentContext, options) + expect(result).toEqual(expected) }) - describe('registerSchema', () => { - const options: RegisterSchemaOptions = { - schema: { - issuerId: 'did:hedera:123', name: 'schemaName', version: '1.0', - attrNames: [] + it('should catch error and return failed state', async () => { + const error = new Error('fail') + mockLedgerService.registerSchema.mockRejectedValue(error) + + const result = await service.registerSchema(mockAgentContext, options) + + expect(mockAgentContext.config.logger.debug).toHaveBeenCalledWith( + `Error registering schema for did '${options.schema.issuerId}'`, + expect.objectContaining({ error, did: options.schema.issuerId, schema: options }) + ) + expect(result.schemaState.state).toBe('failed') + if (result.schemaState.state === 'failed') expect(result.schemaState.reason).toContain('fail') + }) + }) + + describe('getSchema', () => { + const schemaId = 'schema-id-123' + + it('should call ledgerService.getSchema and return result on success', async () => { + const expected: GetSchemaReturn = { + schemaId: schemaId, + resolutionMetadata: {}, + schemaMetadata: {}, + } + mockLedgerService.getSchema.mockResolvedValue(expected) + + const result = await service.getSchema(mockAgentContext, schemaId) + + expect(mockAgentContext.config.logger.trace).toHaveBeenCalledWith( + `Resolving schema '${schemaId}' from Hedera ledger` + ) + expect(mockLedgerService.getSchema).toHaveBeenCalledWith(mockAgentContext, schemaId) + expect(result).toEqual(expected) + }) + + it('should catch error and return notFound error state', async () => { + const error = new Error('not found') + mockLedgerService.getSchema.mockRejectedValue(error) + + const result = await service.getSchema(mockAgentContext, schemaId) + + expect(mockAgentContext.config.logger.error).toHaveBeenCalledWith( + `Error retrieving schema '${schemaId}'`, + expect.objectContaining({ error, schemaId }) + ) + expect(result.resolutionMetadata.error).toBe('notFound') + expect(result.resolutionMetadata.message).toContain('not found') + }) + }) + + describe('registerCredentialDefinition', () => { + const options: RegisterCredentialDefinitionOptions = { + credentialDefinition: { issuerId: 'did:hedera:issuer' }, + } as any + + it('should call ledgerService.registerCredentialDefinition and return result on success', async () => { + const expected: RegisterCredentialDefinitionReturn = { + credentialDefinitionMetadata: {}, + registrationMetadata: {}, + credentialDefinitionState: { + state: 'finished', + credentialDefinition: { + issuerId: '', + schemaId: '', + type: 'CL', + tag: '', + value: { + primary: {}, + revocation: undefined, }, - options: {}, - } - - it('should call ledgerService.registerSchema and return result on success', async () => { - const expected: RegisterSchemaReturn = { - schemaMetadata: {}, registrationMetadata: {}, - schemaState: { - state: "finished" - } as RegisterSchemaReturnStateFinished - } - mockLedgerService.registerSchema.mockResolvedValue(expected) - - const result = await service.registerSchema(mockAgentContext, options) - - expect(mockAgentContext.config.logger.trace).toHaveBeenCalledWith('Registering schema on Hedera ledger') - expect(mockAgentContext.dependencyManager.resolve).toHaveBeenCalledWith(expect.any(Function) || HederaLedgerService) - expect(mockLedgerService.registerSchema).toHaveBeenCalledWith(mockAgentContext, options) - expect(result).toEqual(expected) - }) - - it('should catch error and return failed state', async () => { - const error = new Error('fail') - mockLedgerService.registerSchema.mockRejectedValue(error) - - const result = await service.registerSchema(mockAgentContext, options) - - expect(mockAgentContext.config.logger.debug).toHaveBeenCalledWith( - `Error registering schema for did '${options.schema.issuerId}'`, - expect.objectContaining({ error, did: options.schema.issuerId, schema: options }) - ) - expect(result.schemaState.state).toBe('failed') - if (result.schemaState.state === 'failed') - expect(result.schemaState.reason).toContain('fail') - }) + }, + credentialDefinitionId: 'did:hedera:issuerId', + }, + } + mockLedgerService.registerCredentialDefinition.mockResolvedValue(expected) + + const result = await service.registerCredentialDefinition(mockAgentContext, options) + + expect(mockAgentContext.config.logger.trace).toHaveBeenCalledWith( + 'Registering credential definition on Hedera ledger' + ) + expect(mockLedgerService.registerCredentialDefinition).toHaveBeenCalledWith(mockAgentContext, options) + expect(result).toEqual(expected) + }) + + it('should catch error and return failed state', async () => { + const error = new Error('fail') + mockLedgerService.registerCredentialDefinition.mockRejectedValue(error) + + const result = await service.registerCredentialDefinition(mockAgentContext, options) + + expect(mockAgentContext.config.logger.error).toHaveBeenCalledWith( + `Error registering credential definition for did '${options.credentialDefinition.issuerId}'`, + expect.objectContaining({ error, did: options.credentialDefinition.issuerId, schema: options }) + ) + expect(result.credentialDefinitionState.state).toBe('failed') + if (result.credentialDefinitionState.state === 'failed') + expect(result.credentialDefinitionState.reason).toContain('fail') + }) + }) + + describe('getCredentialDefinition', () => { + const credentialDefinitionId = 'cred-def-123' + + it('should call ledgerService.getCredentialDefinition and return result on success', async () => { + const expected: GetCredentialDefinitionReturn = { + credentialDefinitionId, + resolutionMetadata: {}, + credentialDefinitionMetadata: {}, + } + mockLedgerService.getCredentialDefinition.mockResolvedValue(expected) + + const result = await service.getCredentialDefinition(mockAgentContext, credentialDefinitionId) + + expect(mockAgentContext.config.logger.trace).toHaveBeenCalledWith( + `Resolving credential definition '${credentialDefinitionId}' from Hedera ledger` + ) + expect(mockLedgerService.getCredentialDefinition).toHaveBeenCalledWith(mockAgentContext, credentialDefinitionId) + expect(result).toEqual(expected) }) - describe('getSchema', () => { - const schemaId = 'schema-id-123' - - it('should call ledgerService.getSchema and return result on success', async () => { - const expected: GetSchemaReturn = { - schemaId: schemaId, - resolutionMetadata: {}, - schemaMetadata: {} - } - mockLedgerService.getSchema.mockResolvedValue(expected) - - const result = await service.getSchema(mockAgentContext, schemaId) - - expect(mockAgentContext.config.logger.trace).toHaveBeenCalledWith(`Resolving schema '${schemaId}' from Hedera ledger`) - expect(mockLedgerService.getSchema).toHaveBeenCalledWith(mockAgentContext, schemaId) - expect(result).toEqual(expected) - }) - - it('should catch error and return notFound error state', async () => { - const error = new Error('not found') - mockLedgerService.getSchema.mockRejectedValue(error) - - const result = await service.getSchema(mockAgentContext, schemaId) - - expect(mockAgentContext.config.logger.error).toHaveBeenCalledWith( - `Error retrieving schema '${schemaId}'`, - expect.objectContaining({ error, schemaId }) - ) - expect(result.resolutionMetadata.error).toBe('notFound') - expect(result.resolutionMetadata.message).toContain('not found') - }) + it('should catch error and return notFound error state', async () => { + const error = new Error('not found') + mockLedgerService.getCredentialDefinition.mockRejectedValue(error) + + const result = await service.getCredentialDefinition(mockAgentContext, credentialDefinitionId) + + expect(mockAgentContext.config.logger.error).toHaveBeenCalledWith( + `Error retrieving credential definition '${credentialDefinitionId}'`, + expect.objectContaining({ error, credentialDefinitionId }) + ) + expect(result.resolutionMetadata.error).toBe('notFound') + expect(result.resolutionMetadata.message).toContain('not found') }) + }) + + describe('registerRevocationRegistryDefinition', () => { + const options: RegisterRevocationRegistryDefinitionOptions = { + revocationRegistryDefinition: { credDefId: 'credDef1', issuerId: 'did:hedera:issuer' }, + } as any + + it('should call ledgerService.registerRevocationRegistryDefinition and return result on success', async () => { + const expected: RegisterRevocationRegistryDefinitionReturn = { + revocationRegistryDefinitionMetadata: {}, + registrationMetadata: {}, + revocationRegistryDefinitionState: { + state: 'finished', + revocationRegistryDefinitionId: 'test', + revocationRegistryDefinition: { + issuerId: '', + revocDefType: 'CL_ACCUM', + credDefId: '', + tag: '', + value: { + publicKeys: { + accumKey: { + z: '', + }, + }, + maxCredNum: 0, + tailsLocation: '', + tailsHash: '', + }, + }, + }, + } + mockLedgerService.registerRevocationRegistryDefinition.mockResolvedValue(expected) + + const result = await service.registerRevocationRegistryDefinition(mockAgentContext, options) - describe('registerCredentialDefinition', () => { - const options: RegisterCredentialDefinitionOptions = { - credentialDefinition: { issuerId: 'did:hedera:issuer' } - } as any - - it('should call ledgerService.registerCredentialDefinition and return result on success', async () => { - const expected: RegisterCredentialDefinitionReturn = { - credentialDefinitionMetadata: {}, - registrationMetadata: {}, - credentialDefinitionState: { - state: "finished", - credentialDefinition: { - issuerId: '', - schemaId: '', - type: 'CL', - tag: '', - value: { - primary: {}, - revocation: undefined - } - }, - credentialDefinitionId: "did:hedera:issuerId", - } - } - mockLedgerService.registerCredentialDefinition.mockResolvedValue(expected) - - const result = await service.registerCredentialDefinition(mockAgentContext, options) - - expect(mockAgentContext.config.logger.trace).toHaveBeenCalledWith('Registering credential definition on Hedera ledger') - expect(mockLedgerService.registerCredentialDefinition).toHaveBeenCalledWith(mockAgentContext, options) - expect(result).toEqual(expected) - }) - - it('should catch error and return failed state', async () => { - const error = new Error('fail') - mockLedgerService.registerCredentialDefinition.mockRejectedValue(error) - - const result = await service.registerCredentialDefinition(mockAgentContext, options) - - expect(mockAgentContext.config.logger.error).toHaveBeenCalledWith( - `Error registering credential definition for did '${options.credentialDefinition.issuerId}'`, - expect.objectContaining({ error, did: options.credentialDefinition.issuerId, schema: options }) - ) - expect(result.credentialDefinitionState.state).toBe('failed') - if (result.credentialDefinitionState.state === 'failed') - expect(result.credentialDefinitionState.reason).toContain('fail') - }) + expect(mockAgentContext.config.logger.trace).toHaveBeenCalledWith( + `Registering revocation registry definition for '${options.revocationRegistryDefinition.credDefId}' on Hedera ledger` + ) + expect(mockLedgerService.registerRevocationRegistryDefinition).toHaveBeenCalledWith(mockAgentContext, options) + expect(result).toEqual(expected) }) - describe('getCredentialDefinition', () => { - const credentialDefinitionId = 'cred-def-123' - - it('should call ledgerService.getCredentialDefinition and return result on success', async () => { - const expected: GetCredentialDefinitionReturn = { - credentialDefinitionId, - resolutionMetadata: {}, - credentialDefinitionMetadata: {} - } - mockLedgerService.getCredentialDefinition.mockResolvedValue(expected) - - const result = await service.getCredentialDefinition(mockAgentContext, credentialDefinitionId) - - expect(mockAgentContext.config.logger.trace).toHaveBeenCalledWith( - `Resolving credential definition '${credentialDefinitionId}' from Hedera ledger` - ) - expect(mockLedgerService.getCredentialDefinition).toHaveBeenCalledWith(mockAgentContext, credentialDefinitionId) - expect(result).toEqual(expected) - }) - - it('should catch error and return notFound error state', async () => { - const error = new Error('not found') - mockLedgerService.getCredentialDefinition.mockRejectedValue(error) - - const result = await service.getCredentialDefinition(mockAgentContext, credentialDefinitionId) - - expect(mockAgentContext.config.logger.error).toHaveBeenCalledWith( - `Error retrieving credential definition '${credentialDefinitionId}'`, - expect.objectContaining({ error, credentialDefinitionId }) - ) - expect(result.resolutionMetadata.error).toBe('notFound') - expect(result.resolutionMetadata.message).toContain('not found') - }) + it('should catch error and return failed state', async () => { + const error = new Error('fail') + mockLedgerService.registerRevocationRegistryDefinition.mockRejectedValue(error) + + const result = await service.registerRevocationRegistryDefinition(mockAgentContext, options) + + expect(mockAgentContext.config.logger.error).toHaveBeenCalledWith( + `Error registering revocation registry definition for did '${options.revocationRegistryDefinition.issuerId}'`, + expect.objectContaining({ error, did: options.revocationRegistryDefinition.issuerId, options }) + ) + expect(result.revocationRegistryDefinitionState.state).toBe('failed') + if (result.revocationRegistryDefinitionState.state === 'failed') + expect(result.revocationRegistryDefinitionState.reason).toContain('fail') }) + }) + + describe('getRevocationRegistryDefinition', () => { + const revocationRegistryDefinitionId = 'revRegDef123' + + it('should call ledgerService.getRevocationRegistryDefinition and return result on success', async () => { + const expected: GetRevocationRegistryDefinitionReturn = { + revocationRegistryDefinitionId, + resolutionMetadata: {}, + revocationRegistryDefinitionMetadata: {}, + } + mockLedgerService.getRevocationRegistryDefinition.mockResolvedValue(expected) + + const result = await service.getRevocationRegistryDefinition(mockAgentContext, revocationRegistryDefinitionId) + + expect(mockAgentContext.config.logger.trace).toHaveBeenCalledWith( + `Resolving revocation registry definition for '${revocationRegistryDefinitionId}' from Hedera ledger` + ) + expect(mockLedgerService.getRevocationRegistryDefinition).toHaveBeenCalledWith( + mockAgentContext, + revocationRegistryDefinitionId + ) + expect(result).toEqual(expected) + }) + + it('should catch error and return notFound error state', async () => { + const error = new Error('not found') + mockLedgerService.getRevocationRegistryDefinition.mockRejectedValue(error) - describe('registerRevocationRegistryDefinition', () => { - const options: RegisterRevocationRegistryDefinitionOptions = { - revocationRegistryDefinition: { credDefId: 'credDef1', issuerId: 'did:hedera:issuer' }, - } as any - - it('should call ledgerService.registerRevocationRegistryDefinition and return result on success', async () => { - const expected: RegisterRevocationRegistryDefinitionReturn = { - revocationRegistryDefinitionMetadata: {}, - registrationMetadata: {}, - revocationRegistryDefinitionState: { - state: "finished", - revocationRegistryDefinitionId: 'test', - revocationRegistryDefinition: { - issuerId: '', - revocDefType: 'CL_ACCUM', - credDefId: '', - tag: '', - value: { - publicKeys: { - accumKey: { - z: '' - } - }, - maxCredNum: 0, - tailsLocation: '', - tailsHash: '' - } - } - } - } - mockLedgerService.registerRevocationRegistryDefinition.mockResolvedValue(expected) - - const result = await service.registerRevocationRegistryDefinition(mockAgentContext, options) - - expect(mockAgentContext.config.logger.trace).toHaveBeenCalledWith( - `Registering revocation registry definition for '${options.revocationRegistryDefinition.credDefId}' on Hedera ledger` - ) - expect(mockLedgerService.registerRevocationRegistryDefinition).toHaveBeenCalledWith(mockAgentContext, options) - expect(result).toEqual(expected) - }) - - it('should catch error and return failed state', async () => { - const error = new Error('fail') - mockLedgerService.registerRevocationRegistryDefinition.mockRejectedValue(error) - - const result = await service.registerRevocationRegistryDefinition(mockAgentContext, options) - - expect(mockAgentContext.config.logger.error).toHaveBeenCalledWith( - `Error registering revocation registry definition for did '${options.revocationRegistryDefinition.issuerId}'`, - expect.objectContaining({ error, did: options.revocationRegistryDefinition.issuerId, options }) - ) - expect(result.revocationRegistryDefinitionState.state).toBe('failed') - if (result.revocationRegistryDefinitionState.state === 'failed') - expect(result.revocationRegistryDefinitionState.reason).toContain('fail') - }) + const result = await service.getRevocationRegistryDefinition(mockAgentContext, revocationRegistryDefinitionId) + + expect(mockAgentContext.config.logger.error).toHaveBeenCalledWith( + `Error retrieving revocation registry definition '${revocationRegistryDefinitionId}'`, + expect.objectContaining({ error, revocationRegistryDefinitionId }) + ) + expect(result.resolutionMetadata.error).toBe('notFound') + expect(result.resolutionMetadata.message).toContain('not found') }) + }) + + describe('registerRevocationStatusList', () => { + const options: RegisterRevocationStatusListOptions = { + revocationStatusList: { revRegDefId: 'regDef1', issuerId: 'did:hedera:issuer' }, + } as any + + it('should call ledgerService.registerRevocationStatusList and return result on success', async () => { + const expected: RegisterRevocationStatusListReturn = { + revocationStatusListMetadata: {}, + registrationMetadata: {}, + revocationStatusListState: { + state: 'finished', + revocationStatusList: { + revRegDefId: '', + issuerId: '', + revocationList: [], + timestamp: 0, + currentAccumulator: '', + }, + }, + } + mockLedgerService.registerRevocationStatusList.mockResolvedValue(expected) - describe('getRevocationRegistryDefinition', () => { - const revocationRegistryDefinitionId = 'revRegDef123' - - it('should call ledgerService.getRevocationRegistryDefinition and return result on success', async () => { - const expected: GetRevocationRegistryDefinitionReturn = { - revocationRegistryDefinitionId, - resolutionMetadata: {}, - revocationRegistryDefinitionMetadata: {} - } - mockLedgerService.getRevocationRegistryDefinition.mockResolvedValue(expected) - - const result = await service.getRevocationRegistryDefinition(mockAgentContext, revocationRegistryDefinitionId) - - expect(mockAgentContext.config.logger.trace).toHaveBeenCalledWith( - `Resolving revocation registry definition for '${revocationRegistryDefinitionId}' from Hedera ledger` - ) - expect(mockLedgerService.getRevocationRegistryDefinition).toHaveBeenCalledWith(mockAgentContext, revocationRegistryDefinitionId) - expect(result).toEqual(expected) - }) - - it('should catch error and return notFound error state', async () => { - const error = new Error('not found') - mockLedgerService.getRevocationRegistryDefinition.mockRejectedValue(error) - - const result = await service.getRevocationRegistryDefinition(mockAgentContext, revocationRegistryDefinitionId) - - expect(mockAgentContext.config.logger.error).toHaveBeenCalledWith( - `Error retrieving revocation registry definition '${revocationRegistryDefinitionId}'`, - expect.objectContaining({ error, revocationRegistryDefinitionId }) - ) - expect(result.resolutionMetadata.error).toBe('notFound') - expect(result.resolutionMetadata.message).toContain('not found') - }) + const result = await service.registerRevocationStatusList(mockAgentContext, options) + + expect(mockAgentContext.config.logger.trace).toHaveBeenCalledWith( + `Registering revocation status list for '${options.revocationStatusList.revRegDefId}' on Hedera ledger` + ) + expect(mockLedgerService.registerRevocationStatusList).toHaveBeenCalledWith(mockAgentContext, options) + expect(result).toEqual(expected) }) - describe('registerRevocationStatusList', () => { - const options: RegisterRevocationStatusListOptions = { - revocationStatusList: { revRegDefId: 'regDef1', issuerId: 'did:hedera:issuer' } - } as any - - it('should call ledgerService.registerRevocationStatusList and return result on success', async () => { - const expected: RegisterRevocationStatusListReturn = { - revocationStatusListMetadata: {}, - registrationMetadata: {}, - revocationStatusListState: { - state: 'finished', - revocationStatusList: { - revRegDefId: '', - issuerId: '', - revocationList: [], - timestamp: 0, - currentAccumulator: '' - } - } - } - mockLedgerService.registerRevocationStatusList.mockResolvedValue(expected) - - const result = await service.registerRevocationStatusList(mockAgentContext, options) - - expect(mockAgentContext.config.logger.trace).toHaveBeenCalledWith( - `Registering revocation status list for '${options.revocationStatusList.revRegDefId}' on Hedera ledger` - ) - expect(mockLedgerService.registerRevocationStatusList).toHaveBeenCalledWith(mockAgentContext, options) - expect(result).toEqual(expected) - }) - - it('should catch error and return failed state', async () => { - const error = new Error('fail') - mockLedgerService.registerRevocationStatusList.mockRejectedValue(error) - - const result = await service.registerRevocationStatusList(mockAgentContext, options) - - expect(mockAgentContext.config.logger.error).toHaveBeenCalledWith( - `Error registering revocation status list for did '${options.revocationStatusList.issuerId}'`, - expect.objectContaining({ error, did: options.revocationStatusList.issuerId, options }) - ) - expect(result.revocationStatusListState.state).toBe('failed') - if (result.revocationStatusListState.state === 'failed') - expect(result.revocationStatusListState.reason).toContain('fail') - }) + it('should catch error and return failed state', async () => { + const error = new Error('fail') + mockLedgerService.registerRevocationStatusList.mockRejectedValue(error) + + const result = await service.registerRevocationStatusList(mockAgentContext, options) + + expect(mockAgentContext.config.logger.error).toHaveBeenCalledWith( + `Error registering revocation status list for did '${options.revocationStatusList.issuerId}'`, + expect.objectContaining({ error, did: options.revocationStatusList.issuerId, options }) + ) + expect(result.revocationStatusListState.state).toBe('failed') + if (result.revocationStatusListState.state === 'failed') + expect(result.revocationStatusListState.reason).toContain('fail') + }) + }) + + describe('getRevocationStatusList', () => { + const revocationRegistryId = 'revRegId123' + const timestamp = 1234567890 + + it('should call ledgerService.getRevocationStatusList and return result on success', async () => { + const expected: GetRevocationStatusListReturn = { + resolutionMetadata: {}, + revocationStatusListMetadata: {}, + } + mockLedgerService.getRevocationStatusList.mockResolvedValue(expected) + + const result = await service.getRevocationStatusList(mockAgentContext, revocationRegistryId, timestamp) + + expect(mockAgentContext.config.logger.trace).toHaveBeenCalledWith( + `Resolving revocation status for for '${revocationRegistryId}' from Hedera ledger` + ) + expect(mockLedgerService.getRevocationStatusList).toHaveBeenCalledWith( + mockAgentContext, + revocationRegistryId, + timestamp * 1000 + ) + expect(result).toEqual(expected) }) - describe('getRevocationStatusList', () => { - const revocationRegistryId = 'revRegId123' - const timestamp = 1234567890 - - it('should call ledgerService.getRevocationStatusList and return result on success', async () => { - const expected: GetRevocationStatusListReturn = { - resolutionMetadata: {}, - revocationStatusListMetadata: {} - } - mockLedgerService.getRevocationStatusList.mockResolvedValue(expected) - - const result = await service.getRevocationStatusList(mockAgentContext, revocationRegistryId, timestamp) - - expect(mockAgentContext.config.logger.trace).toHaveBeenCalledWith( - `Resolving revocation status for for '${revocationRegistryId}' from Hedera ledger` - ) - expect(mockLedgerService.getRevocationStatusList).toHaveBeenCalledWith(mockAgentContext, revocationRegistryId, timestamp * 1000) - expect(result).toEqual(expected) - }) - - it('should catch error and return notFound error state', async () => { - const error = new Error('not found') - mockLedgerService.getRevocationStatusList.mockRejectedValue(error) - - const result = await service.getRevocationStatusList(mockAgentContext, revocationRegistryId, timestamp) - - expect(mockAgentContext.config.logger.error).toHaveBeenCalledWith( - `Error retrieving revocation registry status list '${revocationRegistryId}'`, - expect.objectContaining({ error, revocationRegistryId }) - ) - expect(result.resolutionMetadata.error).toBe('notFound') - expect(result.resolutionMetadata.message).toContain('not found') - }) + it('should catch error and return notFound error state', async () => { + const error = new Error('not found') + mockLedgerService.getRevocationStatusList.mockRejectedValue(error) + + const result = await service.getRevocationStatusList(mockAgentContext, revocationRegistryId, timestamp) + + expect(mockAgentContext.config.logger.error).toHaveBeenCalledWith( + `Error retrieving revocation registry status list '${revocationRegistryId}'`, + expect.objectContaining({ error, revocationRegistryId }) + ) + expect(result.resolutionMetadata.error).toBe('notFound') + expect(result.resolutionMetadata.message).toContain('not found') }) + }) }) diff --git a/packages/hedera/tests/unit/hedera-did-registrar.test.ts b/packages/hedera/tests/unit/hedera-did-registrar.test.ts index a9a022d910..e26f90e5b4 100644 --- a/packages/hedera/tests/unit/hedera-did-registrar.test.ts +++ b/packages/hedera/tests/unit/hedera-did-registrar.test.ts @@ -1,261 +1,269 @@ import type { AgentContext, DidDocumentKey } from '@credo-ts/core' import { DidDocumentRole } from '@credo-ts/core' import { HederaDidRegistrar } from '@credo-ts/hedera' -import {HederaDidUpdateOptions} from "../../src/ledger/HederaLedgerService"; +import { HederaDidUpdateOptions } from '../../src/ledger/HederaLedgerService' describe('HederaDidRegistrar', () => { - let service: HederaDidRegistrar - let mockAgentContext: any - let mockDidRepository: any - let mockLedgerService: any - - beforeEach(() => { - const mockLogger = { - debug: jest.fn(), - error: jest.fn(), - } - - mockDidRepository = { - save: jest.fn(), - findCreatedDid: jest.fn(), - update: jest.fn(), - } - - mockLedgerService = { - createDid: jest.fn(), - resolveDid: jest.fn(), - updateDid: jest.fn(), - deactivateDid: jest.fn(), - } - - mockAgentContext = { - dependencyManager: { - resolve: jest.fn() - .mockImplementation((obj: any) => { - if (obj.name === 'DidRepository') return mockDidRepository - if (obj.name === 'HederaLedgerService') return mockLedgerService - }), - }, - config: { - logger: mockLogger, - }, - } - - service = new HederaDidRegistrar() + let service: HederaDidRegistrar + let mockAgentContext: any + let mockDidRepository: any + let mockLedgerService: any + + beforeEach(() => { + const mockLogger = { + debug: jest.fn(), + error: jest.fn(), + } + + mockDidRepository = { + save: jest.fn(), + findCreatedDid: jest.fn(), + update: jest.fn(), + } + + mockLedgerService = { + createDid: jest.fn(), + resolveDid: jest.fn(), + updateDid: jest.fn(), + deactivateDid: jest.fn(), + } + + mockAgentContext = { + dependencyManager: { + resolve: jest.fn().mockImplementation((obj: any) => { + if (obj.name === 'DidRepository') return mockDidRepository + if (obj.name === 'HederaLedgerService') return mockLedgerService + }), + }, + config: { + logger: mockLogger, + }, + } + + service = new HederaDidRegistrar() + }) + + describe('create', () => { + it('should create DID, save it, and return finished state on success', async () => { + const did = 'did:hedera:123' + const didDocument = { + service: [{ id: 'service1' }, { id: 'service2' }], + } + const rootKey = { kmsKeyId: 'key1', didDocumentRelativeKeyId: 'rootKeyId' } + + mockLedgerService.createDid.mockResolvedValue({ did, didDocument, rootKey }) + + const result = await service.create( + mockAgentContext as AgentContext, + { + method: 'hedera', + options: {}, + } as any + ) + + expect(mockDidRepository.save).toHaveBeenCalled() + const savedRecord = mockDidRepository.save.mock.calls[0][1] + expect(savedRecord.did).toBe(did) + expect(savedRecord.role).toBe(DidDocumentRole.Created) + expect(savedRecord.didDocument).toBeInstanceOf(Object) + expect(savedRecord.didDocument.service[0]).toBeInstanceOf(Object) + + expect(result.didState.state).toBe('finished') + expect(result.didState.did).toBe(did) + expect(result.didState.didDocument).toBeInstanceOf(Object) }) - describe('create', () => { - it('should create DID, save it, and return finished state on success', async () => { - const did = 'did:hedera:123' - const didDocument = { - service: [{ id: 'service1' }, { id: 'service2' }], - } - const rootKey = { kmsKeyId: 'key1', didDocumentRelativeKeyId: 'rootKeyId' } - - mockLedgerService.createDid.mockResolvedValue({ did, didDocument, rootKey }) - - const result = await service.create(mockAgentContext as AgentContext, { - method: 'hedera', - options: {}, - } as any) - - expect(mockDidRepository.save).toHaveBeenCalled() - const savedRecord = mockDidRepository.save.mock.calls[0][1] - expect(savedRecord.did).toBe(did) - expect(savedRecord.role).toBe(DidDocumentRole.Created) - expect(savedRecord.didDocument).toBeInstanceOf(Object) - expect(savedRecord.didDocument.service[0]).toBeInstanceOf(Object) - - expect(result.didState.state).toBe('finished') - expect(result.didState.did).toBe(did) - expect(result.didState.didDocument).toBeInstanceOf(Object) - }) + it('should handle error and return failed state', async () => { + mockLedgerService.createDid.mockRejectedValue(new Error('Create failed')) - it('should handle error and return failed state', async () => { - mockLedgerService.createDid.mockRejectedValue(new Error('Create failed')) + const result = await service.create( + mockAgentContext as AgentContext, + { + method: 'hedera', + options: {}, + } as any + ) - const result = await service.create(mockAgentContext as AgentContext, { - method: 'hedera', - options: {}, - } as any) + expect(mockAgentContext.config.logger.debug).toHaveBeenCalledWith('Error creating DID', expect.any(Object)) - expect(mockAgentContext.config.logger.debug).toHaveBeenCalledWith('Error creating DID', expect.any(Object)) - - expect(result.didState.state).toBe('failed') - if (result.didState.state === 'failed') - expect(result.didState.reason).toBe('Unable to register Did: Create failed') - }) + expect(result.didState.state).toBe('failed') + if (result.didState.state === 'failed') + expect(result.didState.reason).toBe('Unable to register Did: Create failed') }) + }) + + describe('update', () => { + const did = 'did:hedera:123' + + it('should update DID and save record successfully', async () => { + const didDocument = { id: did } + const updatedDidDocument = { id: did, updated: true } + + const foundDidRecord = { + didDocument, + keys: [{ didDocumentRelativeKeyId: 'key1' }], + } + mockLedgerService.resolveDid.mockResolvedValue({ + didDocument, + didDocumentMetadata: { deactivated: false }, + didResolutionMetadata: {}, + }) + mockDidRepository.findCreatedDid.mockResolvedValue(foundDidRecord) + mockLedgerService.updateDid.mockResolvedValue({ didDocument: updatedDidDocument }) + mockDidRepository.update.mockResolvedValue(undefined) + + const options: HederaDidUpdateOptions = { + did, + didDocumentOperation: 'setDidDocument', + secret: { + keys: [ + { + didDocumentRelativeKeyId: 'key2', + kmsKeyId: 'some-key', + }, + ], + }, + didDocument: {}, + } - describe('update', () => { - const did = 'did:hedera:123' - - it('should update DID and save record successfully', async () => { - const didDocument = { id: did } - const updatedDidDocument = { id: did, updated: true } - - const foundDidRecord = { - didDocument, - keys: [{ didDocumentRelativeKeyId: 'key1' }], - }; - mockLedgerService.resolveDid.mockResolvedValue({ - didDocument, - didDocumentMetadata: { deactivated: false }, - didResolutionMetadata: {}, - }); - mockDidRepository.findCreatedDid.mockResolvedValue(foundDidRecord); - mockLedgerService.updateDid.mockResolvedValue({ didDocument: updatedDidDocument }); - mockDidRepository.update.mockResolvedValue(undefined); - - const options: HederaDidUpdateOptions = { - did, - didDocumentOperation: 'setDidDocument', - secret: { keys: [{ - didDocumentRelativeKeyId: 'key2', - kmsKeyId: 'some-key' - }] }, - didDocument: {}, - } - - const result = await service.update(mockAgentContext as AgentContext, options) - - expect(mockLedgerService.resolveDid).toHaveBeenCalledWith(mockAgentContext, did) - expect(mockDidRepository.findCreatedDid).toHaveBeenCalledWith(mockAgentContext, did) - - expect(mockLedgerService.updateDid).toHaveBeenCalledWith(mockAgentContext, expect.objectContaining({ - secret: { keys: expect.any(Array) }, - })) - - expect(mockDidRepository.update).toHaveBeenCalledWith(mockAgentContext, foundDidRecord) - - expect(result.didState.state).toBe('finished') - expect(result.didState.did).toBe(did) - expect(result.didState.didDocument).toBeInstanceOf(Object) - }) + const result = await service.update(mockAgentContext as AgentContext, options) - it('should return failed state if DID not found or deactivated', async () => { - mockLedgerService.resolveDid.mockResolvedValue({ didDocument: null, didDocumentMetadata: { deactivated: true } }) - mockDidRepository.findCreatedDid.mockResolvedValue(null) + expect(mockLedgerService.resolveDid).toHaveBeenCalledWith(mockAgentContext, did) + expect(mockDidRepository.findCreatedDid).toHaveBeenCalledWith(mockAgentContext, did) - const options = { - did, - } as any + expect(mockLedgerService.updateDid).toHaveBeenCalledWith( + mockAgentContext, + expect.objectContaining({ + secret: { keys: expect.any(Array) }, + }) + ) - const result = await service.update(mockAgentContext as AgentContext, options) + expect(mockDidRepository.update).toHaveBeenCalledWith(mockAgentContext, foundDidRecord) - expect(result.didState.state).toBe('failed') - if (result.didState.state === 'failed') - expect(result.didState.reason).toBe('Did not found') - }) + expect(result.didState.state).toBe('finished') + expect(result.didState.did).toBe(did) + expect(result.didState.didDocument).toBeInstanceOf(Object) + }) - it('should handle error and return failed state', async () => { - mockLedgerService.resolveDid.mockRejectedValue(new Error('Update failed')) + it('should return failed state if DID not found or deactivated', async () => { + mockLedgerService.resolveDid.mockResolvedValue({ didDocument: null, didDocumentMetadata: { deactivated: true } }) + mockDidRepository.findCreatedDid.mockResolvedValue(null) - const options = { - did, - didDocumentOperation: 'setDidDocument', - } as any + const options = { + did, + } as any - const result = await service.update(mockAgentContext as AgentContext, options) + const result = await service.update(mockAgentContext as AgentContext, options) - expect(mockAgentContext.config.logger.error).toHaveBeenCalledWith('Error update DID', expect.any(Error)) - expect(result.didState.state).toBe('failed') - if (result.didState.state === 'failed') - expect(result.didState.reason).toBe('Unable update DID: Update failed') - }) + expect(result.didState.state).toBe('failed') + if (result.didState.state === 'failed') expect(result.didState.reason).toBe('Did not found') }) - describe('deactivate', () => { - const did = 'did:hedera:123' + it('should handle error and return failed state', async () => { + mockLedgerService.resolveDid.mockRejectedValue(new Error('Update failed')) + + const options = { + did, + didDocumentOperation: 'setDidDocument', + } as any - it('should deactivate DID and save updated record successfully', async () => { - const didDocument = { id: did } - const deactivatedDidDocument = { id: did, deactivated: true } + const result = await service.update(mockAgentContext as AgentContext, options) - const foundDidRecord = { - didDocument, - keys: [{ didDocumentRelativeKeyId: 'key1' }], - } + expect(mockAgentContext.config.logger.error).toHaveBeenCalledWith('Error update DID', expect.any(Error)) + expect(result.didState.state).toBe('failed') + if (result.didState.state === 'failed') expect(result.didState.reason).toBe('Unable update DID: Update failed') + }) + }) - mockLedgerService.resolveDid.mockResolvedValue({ didDocument, didDocumentMetadata: {} }) - mockDidRepository.findCreatedDid.mockResolvedValue(foundDidRecord) - mockLedgerService.deactivateDid.mockResolvedValue({ didDocument: deactivatedDidDocument }) - mockDidRepository.update.mockResolvedValue(undefined) + describe('deactivate', () => { + const did = 'did:hedera:123' - const options = { - did, - } + it('should deactivate DID and save updated record successfully', async () => { + const didDocument = { id: did } + const deactivatedDidDocument = { id: did, deactivated: true } - const result = await service.deactivate(mockAgentContext as AgentContext, options) + const foundDidRecord = { + didDocument, + keys: [{ didDocumentRelativeKeyId: 'key1' }], + } - expect(mockLedgerService.resolveDid).toHaveBeenCalledWith(mockAgentContext, did) - expect(mockDidRepository.findCreatedDid).toHaveBeenCalledWith(mockAgentContext, did) - expect(mockLedgerService.deactivateDid).toHaveBeenCalledWith(mockAgentContext, expect.objectContaining({ - secret: { keys: foundDidRecord.keys }, - })) - expect(mockDidRepository.update).toHaveBeenCalledWith(mockAgentContext, foundDidRecord) + mockLedgerService.resolveDid.mockResolvedValue({ didDocument, didDocumentMetadata: {} }) + mockDidRepository.findCreatedDid.mockResolvedValue(foundDidRecord) + mockLedgerService.deactivateDid.mockResolvedValue({ didDocument: deactivatedDidDocument }) + mockDidRepository.update.mockResolvedValue(undefined) - expect(result.didState.state).toBe('finished') - expect(result.didState.did).toBe(did) - expect(result.didState.didDocument).toBeInstanceOf(Object) + const options = { + did, + } + + const result = await service.deactivate(mockAgentContext as AgentContext, options) + + expect(mockLedgerService.resolveDid).toHaveBeenCalledWith(mockAgentContext, did) + expect(mockDidRepository.findCreatedDid).toHaveBeenCalledWith(mockAgentContext, did) + expect(mockLedgerService.deactivateDid).toHaveBeenCalledWith( + mockAgentContext, + expect.objectContaining({ + secret: { keys: foundDidRecord.keys }, }) + ) + expect(mockDidRepository.update).toHaveBeenCalledWith(mockAgentContext, foundDidRecord) - it('should return failed state if DID not found or deactivated', async () => { - mockLedgerService.resolveDid.mockResolvedValue({ didDocument: null, didDocumentMetadata: { deactivated: true } }) - mockDidRepository.findCreatedDid.mockResolvedValue(null) + expect(result.didState.state).toBe('finished') + expect(result.didState.did).toBe(did) + expect(result.didState.didDocument).toBeInstanceOf(Object) + }) - const options = { - did, - } + it('should return failed state if DID not found or deactivated', async () => { + mockLedgerService.resolveDid.mockResolvedValue({ didDocument: null, didDocumentMetadata: { deactivated: true } }) + mockDidRepository.findCreatedDid.mockResolvedValue(null) - const result = await service.deactivate(mockAgentContext as AgentContext, options) + const options = { + did, + } - expect(result.didState.state).toBe('failed') - if (result.didState.state === 'failed') - expect(result.didState.reason).toBe('Did not found') - }) + const result = await service.deactivate(mockAgentContext as AgentContext, options) - it('should handle error and return failed state', async () => { - mockLedgerService.resolveDid.mockRejectedValue(new Error('Deactivate failed')) + expect(result.didState.state).toBe('failed') + if (result.didState.state === 'failed') expect(result.didState.reason).toBe('Did not found') + }) - const options = { - did, - } + it('should handle error and return failed state', async () => { + mockLedgerService.resolveDid.mockRejectedValue(new Error('Deactivate failed')) - const result = await service.deactivate(mockAgentContext as AgentContext, options) + const options = { + did, + } - expect(mockAgentContext.config.logger.error).toHaveBeenCalledWith('Error deactivate DID', expect.any(Error)) - expect(result.didState.state).toBe('failed') - if (result.didState.state === 'failed') - expect(result.didState.reason).toBe('Unable deactivating DID: Deactivate failed') - }) + const result = await service.deactivate(mockAgentContext as AgentContext, options) + + expect(mockAgentContext.config.logger.error).toHaveBeenCalledWith('Error deactivate DID', expect.any(Error)) + expect(result.didState.state).toBe('failed') + if (result.didState.state === 'failed') + expect(result.didState.reason).toBe('Unable deactivating DID: Deactivate failed') }) + }) - describe('concatKeys (private method)', () => { - it('should concatenate keys without duplicates based on relativeKeyId', () => { - const keys1 = [ - { didDocumentRelativeKeyId: 'key1' }, - { didDocumentRelativeKeyId: 'key2' }, - ] as DidDocumentKey[] - - const keys2 = [ - { didDocumentRelativeKeyId: 'key2' }, - { didDocumentRelativeKeyId: 'key3' }, - ] as DidDocumentKey[] - - const result = (service as any).concatKeys(keys1, keys2) - - expect(result).toHaveLength(3) - expect(result).toEqual(expect.arrayContaining([ - { didDocumentRelativeKeyId: 'key1' }, - { didDocumentRelativeKeyId: 'key2' }, - { didDocumentRelativeKeyId: 'key3' }, - ])) - }) + describe('concatKeys (private method)', () => { + it('should concatenate keys without duplicates based on relativeKeyId', () => { + const keys1 = [{ didDocumentRelativeKeyId: 'key1' }, { didDocumentRelativeKeyId: 'key2' }] as DidDocumentKey[] - it('should handle undefined arguments and return empty array', () => { - const result = (service as any).concatKeys(undefined, undefined) - expect(result).toEqual([]) - }) + const keys2 = [{ didDocumentRelativeKeyId: 'key2' }, { didDocumentRelativeKeyId: 'key3' }] as DidDocumentKey[] + + const result = (service as any).concatKeys(keys1, keys2) + + expect(result).toHaveLength(3) + expect(result).toEqual( + expect.arrayContaining([ + { didDocumentRelativeKeyId: 'key1' }, + { didDocumentRelativeKeyId: 'key2' }, + { didDocumentRelativeKeyId: 'key3' }, + ]) + ) + }) + + it('should handle undefined arguments and return empty array', () => { + const result = (service as any).concatKeys(undefined, undefined) + expect(result).toEqual([]) }) + }) }) diff --git a/packages/hedera/tests/unit/hedera-did-resolver.test.ts b/packages/hedera/tests/unit/hedera-did-resolver.test.ts index 0985400da5..0e9f2ae0fd 100644 --- a/packages/hedera/tests/unit/hedera-did-resolver.test.ts +++ b/packages/hedera/tests/unit/hedera-did-resolver.test.ts @@ -1,80 +1,80 @@ -import { JsonTransformer, DidDocument } from '@credo-ts/core' -import {HederaLedgerService} from "../../src/ledger/HederaLedgerService"; -import { HederaDidResolver } from '@credo-ts/hedera'; +import { DidDocument, JsonTransformer } from '@credo-ts/core' +import { HederaDidResolver } from '@credo-ts/hedera' +import { HederaLedgerService } from '../../src/ledger/HederaLedgerService' describe('HederaDidResolver', () => { - let resolver: HederaDidResolver - let mockAgentContext: any - let mockLedgerService: any - - beforeEach(() => { - const mockLogger = { - trace: jest.fn(), - debug: jest.fn(), - } - - mockLedgerService = { - resolveDid: jest.fn(), - } - - mockAgentContext = { - config: { logger: mockLogger }, - dependencyManager: { - resolve: jest.fn().mockReturnValue(mockLedgerService), - }, - } - - resolver = new HederaDidResolver() + let resolver: HederaDidResolver + let mockAgentContext: any + let mockLedgerService: any + + beforeEach(() => { + const mockLogger = { + trace: jest.fn(), + debug: jest.fn(), + } + + mockLedgerService = { + resolveDid: jest.fn(), + } + + mockAgentContext = { + config: { logger: mockLogger }, + dependencyManager: { + resolve: jest.fn().mockReturnValue(mockLedgerService), + }, + } + + resolver = new HederaDidResolver() + }) + + it('should successfully resolve DID', async () => { + const did = 'did:hedera:123' + const fakeDidDocument = { id: did } + const resolveDidResult = { + didDocument: { id: did }, + didDocumentMetadata: { meta: 'meta' }, + didResolutionMetadata: { resMeta: 'resMeta' }, + } + + mockLedgerService.resolveDid.mockResolvedValue(resolveDidResult) + + jest.spyOn(JsonTransformer, 'fromJSON').mockReturnValue(fakeDidDocument as unknown as DidDocument) + + const result = await resolver.resolve(mockAgentContext, did, {} as any, {} as any) + + expect(mockAgentContext.config.logger.trace).toHaveBeenCalledWith('Try to resolve a did document from ledger') + expect(mockAgentContext.dependencyManager.resolve).toHaveBeenCalledWith(HederaLedgerService) + expect(mockLedgerService.resolveDid).toHaveBeenCalledWith(mockAgentContext, did) + expect(JsonTransformer.fromJSON).toHaveBeenCalledWith(resolveDidResult.didDocument, DidDocument) + + expect(result).toEqual({ + didDocument: fakeDidDocument, + didDocumentMetadata: resolveDidResult.didDocumentMetadata, + didResolutionMetadata: resolveDidResult.didResolutionMetadata, }) + }) - it('should successfully resolve DID', async () => { - const did = 'did:hedera:123' - const fakeDidDocument = { id: did } - const resolveDidResult = { - didDocument: { id: did }, - didDocumentMetadata: { meta: 'meta' }, - didResolutionMetadata: { resMeta: 'resMeta' }, - } + it('should handle error and return notFound', async () => { + const did = 'did:hedera:bad' + const error = new Error('Some error') - mockLedgerService.resolveDid.mockResolvedValue(resolveDidResult) + mockLedgerService.resolveDid.mockRejectedValue(error) - jest.spyOn(JsonTransformer, 'fromJSON').mockReturnValue(fakeDidDocument as unknown as DidDocument) + const result = await resolver.resolve(mockAgentContext, did, {} as any, {} as any) - const result = await resolver.resolve(mockAgentContext, did, {} as any, {} as any) - - expect(mockAgentContext.config.logger.trace).toHaveBeenCalledWith('Try to resolve a did document from ledger') - expect(mockAgentContext.dependencyManager.resolve).toHaveBeenCalledWith(HederaLedgerService) - expect(mockLedgerService.resolveDid).toHaveBeenCalledWith(mockAgentContext, did) - expect(JsonTransformer.fromJSON).toHaveBeenCalledWith(resolveDidResult.didDocument, DidDocument) - - expect(result).toEqual({ - didDocument: fakeDidDocument, - didDocumentMetadata: resolveDidResult.didDocumentMetadata, - didResolutionMetadata: resolveDidResult.didResolutionMetadata, - }) + expect(mockAgentContext.config.logger.trace).toHaveBeenCalledWith('Try to resolve a did document from ledger') + expect(mockAgentContext.config.logger.debug).toHaveBeenCalledWith('Error resolving the did', { + error, + did, }) - it('should handle error and return notFound', async () => { - const did = 'did:hedera:bad' - const error = new Error('Some error') - - mockLedgerService.resolveDid.mockRejectedValue(error) - - const result = await resolver.resolve(mockAgentContext, did, {} as any, {} as any) - - expect(mockAgentContext.config.logger.trace).toHaveBeenCalledWith('Try to resolve a did document from ledger') - expect(mockAgentContext.config.logger.debug).toHaveBeenCalledWith('Error resolving the did', { - error, - did, - }) - - expect(result).toEqual({ - didDocument: null, - didDocumentMetadata: {}, - didResolutionMetadata: { - error: 'notFound', - message: `Unable to resolve did '${did}': ${error}`, - }, - }) + expect(result).toEqual({ + didDocument: null, + didDocumentMetadata: {}, + didResolutionMetadata: { + error: 'notFound', + message: `Unable to resolve did '${did}': ${error}`, + }, }) + }) }) diff --git a/packages/hedera/tests/unit/hedera-ledger-service.test.ts b/packages/hedera/tests/unit/hedera-ledger-service.test.ts index 494e6bf5bb..1468edfc1e 100644 --- a/packages/hedera/tests/unit/hedera-ledger-service.test.ts +++ b/packages/hedera/tests/unit/hedera-ledger-service.test.ts @@ -1,57 +1,55 @@ -import { type DidDocument } from '@credo-ts/core' import { - AgentContext, - DependencyManager, -} from '@credo-ts/core' + RegisterCredentialDefinitionOptions, + RegisterRevocationRegistryDefinitionOptions, + RegisterRevocationStatusListOptions, + RegisterSchemaOptions, +} from '@credo-ts/anoncreds' +import { type DidDocument } from '@credo-ts/core' +import { AgentContext, DependencyManager } from '@credo-ts/core' import { DidDocumentKey, Kms } from '@credo-ts/core' -import {KmsJwkPublicOkp} from "@credo-ts/core/src/modules/kms"; -import { - RegisterCredentialDefinitionOptions, - RegisterRevocationRegistryDefinitionOptions, - RegisterRevocationStatusListOptions, RegisterSchemaOptions -} from "@credo-ts/anoncreds"; -import {HederaDidCreateOptions, HederaLedgerService} from '../../src/ledger/HederaLedgerService' -import {Client} from "@hashgraph/sdk"; +import { KmsJwkPublicOkp } from '@credo-ts/core/src/modules/kms' +import { Client } from '@hashgraph/sdk' +import { HederaDidCreateOptions, HederaLedgerService } from '../../src/ledger/HederaLedgerService' jest.mock('@hiero-did-sdk/registrar', () => ({ DIDUpdateBuilder: jest.fn().mockReturnValue({ - addService: jest.fn().mockReturnThis(), - removeService: jest.fn().mockReturnThis(), - addVerificationMethod: jest.fn().mockReturnThis(), - removeVerificationMethod: jest.fn().mockReturnThis(), - addAssertionMethod: jest.fn().mockReturnThis(), - removeAssertionMethod: jest.fn().mockReturnThis(), - addAuthenticationMethod: jest.fn().mockReturnThis(), - removeAuthenticationMethod: jest.fn().mockReturnThis(), - addCapabilityDelegationMethod: jest.fn().mockReturnThis(), - removeCapabilityDelegationMethod: jest.fn().mockReturnThis(), - addCapabilityInvocationMethod: jest.fn().mockReturnThis(), - removeCapabilityInvocationMethod: jest.fn().mockReturnThis(), - addKeyAgreementMethod: jest.fn().mockReturnThis(), - removeKeyAgreementMethod: jest.fn().mockReturnThis(), - build: jest.fn() + addService: jest.fn().mockReturnThis(), + removeService: jest.fn().mockReturnThis(), + addVerificationMethod: jest.fn().mockReturnThis(), + removeVerificationMethod: jest.fn().mockReturnThis(), + addAssertionMethod: jest.fn().mockReturnThis(), + removeAssertionMethod: jest.fn().mockReturnThis(), + addAuthenticationMethod: jest.fn().mockReturnThis(), + removeAuthenticationMethod: jest.fn().mockReturnThis(), + addCapabilityDelegationMethod: jest.fn().mockReturnThis(), + removeCapabilityDelegationMethod: jest.fn().mockReturnThis(), + addCapabilityInvocationMethod: jest.fn().mockReturnThis(), + removeCapabilityInvocationMethod: jest.fn().mockReturnThis(), + addKeyAgreementMethod: jest.fn().mockReturnThis(), + removeKeyAgreementMethod: jest.fn().mockReturnThis(), + build: jest.fn(), }), generateCreateDIDRequest: jest.fn(), submitCreateDIDRequest: jest.fn(), generateUpdateDIDRequest: jest.fn(), submitUpdateDIDRequest: jest.fn(), generateDeactivateDIDRequest: jest.fn(), - submitDeactivateDIDRequest: jest.fn() + submitDeactivateDIDRequest: jest.fn(), })) import { - DIDUpdateBuilder, - generateCreateDIDRequest, - generateDeactivateDIDRequest, - generateUpdateDIDRequest, - submitCreateDIDRequest, - submitDeactivateDIDRequest, - submitUpdateDIDRequest, + DIDUpdateBuilder, + generateCreateDIDRequest, + generateDeactivateDIDRequest, + generateUpdateDIDRequest, + submitCreateDIDRequest, + submitDeactivateDIDRequest, + submitUpdateDIDRequest, } from '@hiero-did-sdk/registrar' jest.mock('@hiero-did-sdk/resolver', () => ({ resolveDID: jest.fn(), - TopicReaderHederaHcs: jest.fn() + TopicReaderHederaHcs: jest.fn(), })) import { resolveDID } from '@hiero-did-sdk/resolver' @@ -60,7 +58,7 @@ jest.mock('@hiero-did-sdk/core', () => ({ parseDID: jest.fn(), })) -import {DID_ROOT_KEY_ID, parseDID, Publisher} from '@hiero-did-sdk/core' +import { DID_ROOT_KEY_ID, Publisher, parseDID } from '@hiero-did-sdk/core' jest.mock('../../src/ledger/utils') @@ -80,7 +78,9 @@ describe('HederaLedgerService', () => { mockedCreateOrGetKey = createOrGetKey as jest.MockedFunction mockedParseDID = parseDID as jest.MockedFunction - mockedGenerateDeactivateDIDRequest = generateDeactivateDIDRequest as jest.MockedFunction + mockedGenerateDeactivateDIDRequest = generateDeactivateDIDRequest as jest.MockedFunction< + typeof generateDeactivateDIDRequest + > builder = new DIDUpdateBuilder() @@ -99,7 +99,7 @@ describe('HederaLedgerService', () => { set: jest.fn().mockResolvedValue(undefined), remove: jest.fn().mockResolvedValue(undefined), clear: jest.fn(), - cleanupExpired: jest.fn() + cleanupExpired: jest.fn(), } service = new HederaLedgerService({ @@ -115,19 +115,19 @@ describe('HederaLedgerService', () => { }, }) - jest.spyOn(service['clientService'], 'withClient').mockImplementation(async (props, operation) => { - const mockClient = {} as Client; - return operation(mockClient); - }); + jest.spyOn(service.clientService, 'withClient').mockImplementation(async (_props, operation) => { + const mockClient = {} as Client + return operation(mockClient) + }) }) describe('resolveDid', () => { it('should calls resolveDID with proper args and returns result', async () => { - const did = 'did:hedera:test'; + const did = 'did:hedera:test' - const mockResolution = { didDocument: { id: did } }; + const mockResolution = { didDocument: { id: did } } - (resolveDID as jest.Mock).mockResolvedValue(mockResolution) + ;(resolveDID as jest.Mock).mockResolvedValue(mockResolution) const result = await service.resolveDid(mockAgentContext as AgentContext, did) @@ -148,17 +148,20 @@ describe('HederaLedgerService', () => { method: 'hedera', options: { network: 'testnet' }, secret: { rootKeyId: keyId, keys: [] }, - }; + } - mockedCreateOrGetKey.mockResolvedValue({ keyId, publicJwk }); + mockedCreateOrGetKey.mockResolvedValue({ keyId, publicJwk }) - (generateCreateDIDRequest as jest.Mock).mockResolvedValue({ state: {}, signingRequest: { serializedPayload: new Uint8Array() } }); + ;(generateCreateDIDRequest as jest.Mock).mockResolvedValue({ + state: {}, + signingRequest: { serializedPayload: new Uint8Array() }, + }) - (submitCreateDIDRequest as jest.Mock).mockResolvedValue({ did: 'did:hedera:1234' }); + ;(submitCreateDIDRequest as jest.Mock).mockResolvedValue({ did: 'did:hedera:1234' }) jest.spyOn(service as any, 'getPublisher').mockResolvedValue({} as Publisher) - mockKms.sign.mockResolvedValue({ signature: new Uint8Array([1, 2, 3]) }); + mockKms.sign.mockResolvedValue({ signature: new Uint8Array([1, 2, 3]) }) const result = await service.createDid(mockAgentContext as AgentContext, props as any) expect(createOrGetKey).toHaveBeenCalledWith(mockKms, keyId) @@ -177,17 +180,22 @@ describe('HederaLedgerService', () => { options: { network: 'testnet' }, secret: { rootKeyId: keyId, keys: [] }, didDocument, - }; + } - mockedCreateOrGetKey.mockResolvedValue({ keyId, publicJwk }); + mockedCreateOrGetKey.mockResolvedValue({ keyId, publicJwk }) - (generateCreateDIDRequest as jest.Mock).mockResolvedValue({ state: {}, signingRequest: { serializedPayload: new Uint8Array() } }); + ;(generateCreateDIDRequest as jest.Mock).mockResolvedValue({ + state: {}, + signingRequest: { serializedPayload: new Uint8Array() }, + }) - (submitCreateDIDRequest as jest.Mock).mockResolvedValue({ did: 'did:hedera:1234' }); + ;(submitCreateDIDRequest as jest.Mock).mockResolvedValue({ did: 'did:hedera:1234' }) - const updateDidSpy = jest.spyOn(service, 'updateDid').mockResolvedValue({ did: 'did:hedera:1234', someProp: true } as any); + const updateDidSpy = jest + .spyOn(service, 'updateDid') + .mockResolvedValue({ did: 'did:hedera:1234', someProp: true } as any) - jest.spyOn(service as any, 'getPublisher').mockResolvedValue({} as Publisher); + jest.spyOn(service as any, 'getPublisher').mockResolvedValue({} as Publisher) mockKms.sign.mockResolvedValue({ signature: new Uint8Array([1, 2, 3]) }) @@ -221,58 +229,58 @@ describe('HederaLedgerService', () => { it('should calls correct builder methods for each field and action', () => { const spies = { - addService: jest.spyOn(builder, 'addService'), - removeService: jest.spyOn(builder, 'removeService'), - addVerificationMethod: jest.spyOn(builder, 'addVerificationMethod'), - removeVerificationMethod: jest.spyOn(builder, 'removeVerificationMethod'), - addAssertionMethod: jest.spyOn(builder, 'addAssertionMethod'), - removeAssertionMethod: jest.spyOn(builder, 'removeAssertionMethod'), - addAuthenticationMethod: jest.spyOn(builder, 'addAuthenticationMethod'), - removeAuthenticationMethod: jest.spyOn(builder, 'removeAuthenticationMethod'), - addCapabilityDelegationMethod: jest.spyOn(builder, 'addCapabilityDelegationMethod'), - removeCapabilityDelegationMethod: jest.spyOn(builder, 'removeCapabilityDelegationMethod'), - addCapabilityInvocationMethod: jest.spyOn(builder, 'addCapabilityInvocationMethod'), - removeCapabilityInvocationMethod: jest.spyOn(builder, 'removeCapabilityInvocationMethod'), - addKeyAgreementMethod: jest.spyOn(builder, 'addKeyAgreementMethod'), - removeKeyAgreementMethod: jest.spyOn(builder, 'removeKeyAgreementMethod'), + addService: jest.spyOn(builder, 'addService'), + removeService: jest.spyOn(builder, 'removeService'), + addVerificationMethod: jest.spyOn(builder, 'addVerificationMethod'), + removeVerificationMethod: jest.spyOn(builder, 'removeVerificationMethod'), + addAssertionMethod: jest.spyOn(builder, 'addAssertionMethod'), + removeAssertionMethod: jest.spyOn(builder, 'removeAssertionMethod'), + addAuthenticationMethod: jest.spyOn(builder, 'addAuthenticationMethod'), + removeAuthenticationMethod: jest.spyOn(builder, 'removeAuthenticationMethod'), + addCapabilityDelegationMethod: jest.spyOn(builder, 'addCapabilityDelegationMethod'), + removeCapabilityDelegationMethod: jest.spyOn(builder, 'removeCapabilityDelegationMethod'), + addCapabilityInvocationMethod: jest.spyOn(builder, 'addCapabilityInvocationMethod'), + removeCapabilityInvocationMethod: jest.spyOn(builder, 'removeCapabilityInvocationMethod'), + addKeyAgreementMethod: jest.spyOn(builder, 'addKeyAgreementMethod'), + removeKeyAgreementMethod: jest.spyOn(builder, 'removeKeyAgreementMethod'), } const testCases: [string, 'add' | 'remove', string, jest.SpyInstance][] = [ - ['service', 'add', 'service-item', spies.addService], - ['service', 'remove', 'service-id', spies.removeService], + ['service', 'add', 'service-item', spies.addService], + ['service', 'remove', 'service-id', spies.removeService], - ['verificationMethod', 'add', 'verificationMethod-item', spies.addVerificationMethod], - ['verificationMethod', 'remove', 'verificationMethod-id', spies.removeVerificationMethod], + ['verificationMethod', 'add', 'verificationMethod-item', spies.addVerificationMethod], + ['verificationMethod', 'remove', 'verificationMethod-id', spies.removeVerificationMethod], - ['assertionMethod', 'add', 'assertionMethod-item', spies.addAssertionMethod], - ['assertionMethod', 'remove', 'assertionMethod-id', spies.removeAssertionMethod], + ['assertionMethod', 'add', 'assertionMethod-item', spies.addAssertionMethod], + ['assertionMethod', 'remove', 'assertionMethod-id', spies.removeAssertionMethod], - ['authentication', 'add', 'authentication-item', spies.addAuthenticationMethod], - ['authentication', 'remove', 'authentication-id', spies.removeAuthenticationMethod], + ['authentication', 'add', 'authentication-item', spies.addAuthenticationMethod], + ['authentication', 'remove', 'authentication-id', spies.removeAuthenticationMethod], - ['capabilityDelegation', 'add', 'capabilityDelegation-item', spies.addCapabilityDelegationMethod], - ['capabilityDelegation', 'remove', 'capabilityDelegation-id', spies.removeCapabilityDelegationMethod], + ['capabilityDelegation', 'add', 'capabilityDelegation-item', spies.addCapabilityDelegationMethod], + ['capabilityDelegation', 'remove', 'capabilityDelegation-id', spies.removeCapabilityDelegationMethod], - ['capabilityInvocation', 'add', 'capabilityInvocation-item', spies.addCapabilityInvocationMethod], - ['capabilityInvocation', 'remove', 'capabilityInvocation-id', spies.removeCapabilityInvocationMethod], + ['capabilityInvocation', 'add', 'capabilityInvocation-item', spies.addCapabilityInvocationMethod], + ['capabilityInvocation', 'remove', 'capabilityInvocation-id', spies.removeCapabilityInvocationMethod], - ['keyAgreement', 'add', 'keyAgreement-item', spies.addKeyAgreementMethod], - ['keyAgreement', 'remove', 'keyAgreement-id', spies.removeKeyAgreementMethod], + ['keyAgreement', 'add', 'keyAgreement-item', spies.addKeyAgreementMethod], + ['keyAgreement', 'remove', 'keyAgreement-id', spies.removeKeyAgreementMethod], ] for (const [field, action, param, spy] of testCases) { - jest.clearAllMocks() + jest.clearAllMocks() - const fn = (service as any).getUpdateMethod(builder, field, action) + const fn = (service as any).getUpdateMethod(builder, field, action) - const result = fn(param) + const result = fn(param) - expect(result).toBe(builder) - expect(spy).toHaveBeenCalledTimes(1) - expect(spy).toHaveBeenCalledWith(param) - for (const otherSpy of Object.values(spies)) { - if (otherSpy !== spy) expect(otherSpy).not.toHaveBeenCalled() - } + expect(result).toBe(builder) + expect(spy).toHaveBeenCalledTimes(1) + expect(spy).toHaveBeenCalledWith(param) + for (const otherSpy of Object.values(spies)) { + if (otherSpy !== spy) expect(otherSpy).not.toHaveBeenCalled() + } } }) @@ -284,14 +292,19 @@ describe('HederaLedgerService', () => { }) it('should performs update flow successfully', async () => { - const keys: DidDocumentKey[] = [{ kmsKeyId, didDocumentRelativeKeyId: DID_ROOT_KEY_ID }, { kmsKeyId: 'some-key', didDocumentRelativeKeyId: '#abc' }]; + const keys: DidDocumentKey[] = [ + { kmsKeyId, didDocumentRelativeKeyId: DID_ROOT_KEY_ID }, + { kmsKeyId: 'some-key', didDocumentRelativeKeyId: '#abc' }, + ] const didDocument: Partial = { - verificationMethod: [{ + verificationMethod: [ + { id: '#abc', type: 'hedera', - controller: 'test' - }], + controller: 'test', + }, + ], } const currentDidDoc = { verificationMethod: [{ id: '#abc' }] } const mockDidResolution = { didDocument: currentDidDoc } @@ -299,23 +312,23 @@ describe('HederaLedgerService', () => { const updatesMock = { build: jest.fn().mockReturnValue(didDocument) } as any mockedParseDID.mockReturnValue({ - network: 'testnet', - method: 'hedera', - publicKey: '', - topicId: '' - }); + network: 'testnet', + method: 'hedera', + publicKey: '', + topicId: '', + }) - (resolveDID as jest.Mock).mockResolvedValue(mockDidResolution); + ;(resolveDID as jest.Mock).mockResolvedValue(mockDidResolution) - jest.spyOn(service as any, 'prepareDidUpdates').mockReturnValue(updatesMock); + jest.spyOn(service as any, 'prepareDidUpdates').mockReturnValue(updatesMock) - jest.spyOn(service as any, 'getPublisher').mockResolvedValue({} as Publisher); + jest.spyOn(service as any, 'getPublisher').mockResolvedValue({} as Publisher) - (generateUpdateDIDRequest as jest.Mock).mockResolvedValue({ states: {}, signingRequests: {} }); + ;(generateUpdateDIDRequest as jest.Mock).mockResolvedValue({ states: {}, signingRequests: {} }) - jest.spyOn(service as any, 'signRequests').mockResolvedValue(Promise.resolve()); + jest.spyOn(service as any, 'signRequests').mockResolvedValue(Promise.resolve()) - (submitUpdateDIDRequest as jest.Mock).mockResolvedValue({ did: did }) + ;(submitUpdateDIDRequest as jest.Mock).mockResolvedValue({ did: did }) await expect( service.updateDid(mockAgentContext as AgentContext, { @@ -344,17 +357,18 @@ describe('HederaLedgerService', () => { it('should throws an error if root key is not found in deactivateDid', async () => { const props = { - did: 'did:hedera:123', - secret: { - keys: [], - }, + did: 'did:hedera:123', + secret: { + keys: [], + }, } // @ts-ignore mockAgentContext.dependencyManager.resolve.mockReturnValue({ sign: jest.fn() }) - await expect(service.deactivateDid(mockAgentContext as AgentContext, props)) - .rejects.toThrow('The root key not found in the KMS') + await expect(service.deactivateDid(mockAgentContext as AgentContext, props)).rejects.toThrow( + 'The root key not found in the KMS' + ) }) it('should deactivates DID successfully', async () => { @@ -362,18 +376,18 @@ describe('HederaLedgerService', () => { const mockPublisher = {} const mockState = {} const mockSigningRequest = { serializedPayload: new Uint8Array() } - const signature = new Uint8Array([1, 2, 3]); + const signature = new Uint8Array([1, 2, 3]) - (parseDID as jest.Mock).mockReturnValue({ network: 'testnet' }); + ;(parseDID as jest.Mock).mockReturnValue({ network: 'testnet' }) jest.spyOn(service as any, 'getPublisher').mockResolvedValue(mockPublisher) // @ts-ignore - mockedGenerateDeactivateDIDRequest.mockResolvedValue({ state: mockState, signingRequest: mockSigningRequest }); + mockedGenerateDeactivateDIDRequest.mockResolvedValue({ state: mockState, signingRequest: mockSigningRequest }) - mockKms.sign.mockResolvedValue({ signature }); + mockKms.sign.mockResolvedValue({ signature }) - (submitDeactivateDIDRequest as jest.Mock).mockResolvedValue({ did }) + ;(submitDeactivateDIDRequest as jest.Mock).mockResolvedValue({ did }) const result = await service.deactivateDid( mockAgentContext as AgentContext, @@ -417,13 +431,13 @@ describe('HederaLedgerService', () => { it('registerSchema', async () => { const options: RegisterSchemaOptions = { - schema: { - issuerId: '', - name: '', - version: '', - attrNames: [] - }, - options: {} + schema: { + issuerId: '', + name: '', + version: '', + attrNames: [], + }, + options: {}, } const result = await service.registerSchema(mockAgentContext as AgentContext, options) expect(mockSdk.registerSchema).toHaveBeenCalledWith(options) @@ -438,17 +452,17 @@ describe('HederaLedgerService', () => { it('registerCredentialDefinition', async () => { const options: RegisterCredentialDefinitionOptions = { - options: {supportRevocation: true}, - credentialDefinition: { - issuerId: '', - schemaId: '', - type: 'CL', - tag: '', - value: { - primary: {}, - revocation: undefined - } - } + options: { supportRevocation: true }, + credentialDefinition: { + issuerId: '', + schemaId: '', + type: 'CL', + tag: '', + value: { + primary: {}, + revocation: undefined, + }, + }, } await service.registerCredentialDefinition(mockAgentContext as AgentContext, options) expect(mockSdk.registerCredentialDefinition).toHaveBeenCalledWith({ @@ -465,23 +479,23 @@ describe('HederaLedgerService', () => { it('registerRevocationRegistryDefinition', async () => { const options: RegisterRevocationRegistryDefinitionOptions = { - revocationRegistryDefinition: { - issuerId: '', - revocDefType: 'CL_ACCUM', - credDefId: '', - tag: '', - value: { - publicKeys: { - accumKey: { - z: '' - } - }, - maxCredNum: 0, - tailsLocation: '', - tailsHash: '' - } + revocationRegistryDefinition: { + issuerId: '', + revocDefType: 'CL_ACCUM', + credDefId: '', + tag: '', + value: { + publicKeys: { + accumKey: { + z: '', + }, + }, + maxCredNum: 0, + tailsLocation: '', + tailsHash: '', }, - options: {} + }, + options: {}, } const result = await service.registerRevocationRegistryDefinition(mockAgentContext as AgentContext, options) expect(mockSdk.registerRevocationRegistryDefinition).toHaveBeenCalledWith(options) @@ -496,13 +510,13 @@ describe('HederaLedgerService', () => { it('registerRevocationStatusList', async () => { const options: RegisterRevocationStatusListOptions = { - options: {}, - revocationStatusList: { - revRegDefId: '', - issuerId: '', - revocationList: [], - currentAccumulator: '' - } + options: {}, + revocationStatusList: { + revRegDefId: '', + issuerId: '', + revocationList: [], + currentAccumulator: '', + }, } const result = await service.registerRevocationStatusList(mockAgentContext as AgentContext, options) expect(mockSdk.registerRevocationStatusList).toHaveBeenCalledWith(options) diff --git a/packages/hedera/tests/unit/kms-publisher.test.ts b/packages/hedera/tests/unit/kms-publisher.test.ts index 1a6f44d2d6..ab5aea1bca 100644 --- a/packages/hedera/tests/unit/kms-publisher.test.ts +++ b/packages/hedera/tests/unit/kms-publisher.test.ts @@ -1,14 +1,13 @@ +import { Kms, TypedArrayEncoder } from '@credo-ts/core' +import { KmsJwkPublicOkp } from '@credo-ts/core/src/modules/kms' import { KeysUtility } from '@hiero-did-sdk/core' -import { Kms, TypedArrayEncoder} from '@credo-ts/core' -import { KmsPublisher } from "../../src/ledger/publisher/KmsPublisher"; -import { KmsJwkPublicOkp} from "@credo-ts/core/src/modules/kms"; +import { KmsPublisher } from '../../src/ledger/publisher/KmsPublisher' jest.mock('@hiero-did-sdk/core', () => ({ KeysUtility: { fromBytes: jest.fn(), }, - DIDError: class DIDError extends Error {} - + DIDError: class DIDError extends Error {}, })) jest.mock('@credo-ts/core', () => ({ @@ -24,13 +23,13 @@ jest.mock('../../src/ledger/utils', () => ({ createOrGetKey: jest.fn(), })) -import {createOrGetKey} from "../../src/ledger/utils"; +import { createOrGetKey } from '../../src/ledger/utils' jest.mock('@hiero-did-sdk/publisher-internal', () => { return { Publisher: jest.fn(), } -}); +}) describe('KmsPublisher', () => { const mockClient = { @@ -39,7 +38,7 @@ describe('KmsPublisher', () => { execute: jest.fn(), operator: { accountId: '0.0.1234', - publicKey: {} + publicKey: {}, }, } @@ -54,7 +53,7 @@ describe('KmsPublisher', () => { const signMock = jest.fn().mockResolvedValue({ signature: 'signature-bytes' }) const kmsMock = { - sign: signMock + sign: signMock, } const agentContext = { @@ -64,8 +63,8 @@ describe('KmsPublisher', () => { return kmsMock } throw new Error(`Unexpected dependency: ${key}`) - }) - } + }), + }, } const keyId = 'test-key-id' @@ -81,9 +80,7 @@ describe('KmsPublisher', () => { beforeEach(() => { jest.clearAllMocks() - ;(TypedArrayEncoder.fromBase64 as jest.Mock).mockReturnValue(new Uint8Array([1, 2, 3])) - ;(KeysUtility.fromBytes as jest.Mock).mockReturnValue(mockPublicKey) mockPublicKey.toPublicKey.mockReturnValue(fakePublicKey) @@ -107,7 +104,7 @@ describe('KmsPublisher', () => { }) it('should correctly update key in setKeyId', async () => { - (createOrGetKey as jest.Mock).mockResolvedValue({ + ;(createOrGetKey as jest.Mock).mockResolvedValue({ publicJwk: { x: base64X, crv: 'Ed25519' }, }) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c73a0244ca..4aa022f797 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -85,6 +85,11 @@ catalogs: overrides: undici: ^6.20.1 +patchedDependencies: + '@2060.io/ffi-napi@4.0.9': + hash: 9d391c085b8342fd39feab6d234b27742c9c1d160c2f8b63840cc95445fa44aa + path: patches/@2060.io__ffi-napi@4.0.9.patch + importers: .: @@ -195,6 +200,9 @@ importers: '@credo-ts/didcomm': specifier: workspace:* version: link:../packages/didcomm + '@credo-ts/hedera': + specifier: workspace:* + version: link:../packages/hedera '@credo-ts/indy-vdr': specifier: workspace:* version: link:../packages/indy-vdr @@ -398,7 +406,7 @@ importers: packages/cheqd: dependencies: '@cheqd/sdk': - specifier: ^5.2.1 + specifier: 5.2.1 version: 5.2.1 '@cheqd/ts-proto': specifier: ~2.4.1 @@ -663,6 +671,52 @@ importers: specifier: 'catalog:' version: 5.8.3 + packages/hedera: + dependencies: + '@credo-ts/anoncreds': + specifier: workspace:* + version: link:../anoncreds + '@credo-ts/core': + specifier: workspace:* + version: link:../core + '@hashgraph/sdk': + specifier: ^2.66.0 + version: 2.70.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/anoncreds': + specifier: 0.1.0 + version: 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/client': + specifier: 0.1.0 + version: 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/core': + specifier: 0.1.0 + version: 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/hcs': + specifier: 0.1.0 + version: 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/publisher-internal': + specifier: 0.1.0 + version: 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/registrar': + specifier: 0.1.0 + version: 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/resolver': + specifier: 0.1.0 + version: 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + devDependencies: + '@credo-ts/node': + specifier: workspace:* + version: link:../node + '@hyperledger/anoncreds-nodejs': + specifier: ^0.3.1 + version: 0.3.1 + rimraf: + specifier: ^4.4.0 + version: 4.4.1 + zstd-napi: + specifier: ^0.0.10 + version: 0.0.10 + packages/indy-sdk-to-askar-migration: dependencies: '@credo-ts/anoncreds': @@ -729,7 +783,7 @@ importers: dependencies: '@2060.io/ffi-napi': specifier: ^4.0.9 - version: 4.0.9 + version: 4.0.9(patch_hash=9d391c085b8342fd39feab6d234b27742c9c1d160c2f8b63840cc95445fa44aa) '@2060.io/ref-napi': specifier: ^3.0.6 version: 3.0.6 @@ -1940,6 +1994,36 @@ packages: '@bufbuild/protobuf@2.2.5': resolution: {integrity: sha512-/g5EzJifw5GF8aren8wZ/G5oMuPoGeS6MQD3ca8ddcvdXR5UELUfdTZITCGNhNXynY/AYl3Z4plmxdj/tRl/hQ==} + '@cbor-extract/cbor-extract-darwin-arm64@2.2.0': + resolution: {integrity: sha512-P7swiOAdF7aSi0H+tHtHtr6zrpF3aAq/W9FXx5HektRvLTM2O89xCyXF3pk7pLc7QpaY7AoaE8UowVf9QBdh3w==} + cpu: [arm64] + os: [darwin] + + '@cbor-extract/cbor-extract-darwin-x64@2.2.0': + resolution: {integrity: sha512-1liF6fgowph0JxBbYnAS7ZlqNYLf000Qnj4KjqPNW4GViKrEql2MgZnAsExhY9LSy8dnvA4C0qHEBgPrll0z0w==} + cpu: [x64] + os: [darwin] + + '@cbor-extract/cbor-extract-linux-arm64@2.2.0': + resolution: {integrity: sha512-rQvhNmDuhjTVXSPFLolmQ47/ydGOFXtbR7+wgkSY0bdOxCFept1hvg59uiLPT2fVDuJFuEy16EImo5tE2x3RsQ==} + cpu: [arm64] + os: [linux] + + '@cbor-extract/cbor-extract-linux-arm@2.2.0': + resolution: {integrity: sha512-QeBcBXk964zOytiedMPQNZr7sg0TNavZeuUCD6ON4vEOU/25+pLhNN6EDIKJ9VLTKaZ7K7EaAriyYQ1NQ05s/Q==} + cpu: [arm] + os: [linux] + + '@cbor-extract/cbor-extract-linux-x64@2.2.0': + resolution: {integrity: sha512-cWLAWtT3kNLHSvP4RKDzSTX9o0wvQEEAj4SKvhWuOVZxiDAeQazr9A+PSiRILK1VYMLeDml89ohxCnUNQNQNCw==} + cpu: [x64] + os: [linux] + + '@cbor-extract/cbor-extract-win32-x64@2.2.0': + resolution: {integrity: sha512-l2M+Z8DO2vbvADOBNLbbh9y5ST1RY5sqkWOg/58GkUPBYou/cuNZ68SGQ644f1CvZ8kcOxyZtw06+dxWHIoN/w==} + cpu: [x64] + os: [win32] + '@changesets/apply-release-plan@7.0.12': resolution: {integrity: sha512-EaET7As5CeuhTzvXTQCRZeBUcisoYPDDcXvgTE/2jmmypKp0RC7LxKj/yzqeh/1qFTZI7oDGFcL1PHRuQuketQ==} @@ -2308,6 +2392,60 @@ packages: cpu: [x64] os: [win32] + '@ethersproject/abi@5.8.0': + resolution: {integrity: sha512-b9YS/43ObplgyV6SlyQsG53/vkSal0MNA1fskSC4mbnCMi8R+NkcH8K9FPYNESf6jUefBUniE4SOKms0E/KK1Q==} + + '@ethersproject/abstract-provider@5.8.0': + resolution: {integrity: sha512-wC9SFcmh4UK0oKuLJQItoQdzS/qZ51EJegK6EmAWlh+OptpQ/npECOR3QqECd8iGHC0RJb4WKbVdSfif4ammrg==} + + '@ethersproject/abstract-signer@5.8.0': + resolution: {integrity: sha512-N0XhZTswXcmIZQdYtUnd79VJzvEwXQw6PK0dTl9VoYrEBxxCPXqS0Eod7q5TNKRxe1/5WUMuR0u0nqTF/avdCA==} + + '@ethersproject/address@5.8.0': + resolution: {integrity: sha512-GhH/abcC46LJwshoN+uBNoKVFPxUuZm6dA257z0vZkKmU1+t8xTn8oK7B9qrj8W2rFRMch4gbJl6PmVxjxBEBA==} + + '@ethersproject/base64@5.8.0': + resolution: {integrity: sha512-lN0oIwfkYj9LbPx4xEkie6rAMJtySbpOAFXSDVQaBnAzYfB4X2Qr+FXJGxMoc3Bxp2Sm8OwvzMrywxyw0gLjIQ==} + + '@ethersproject/bignumber@5.8.0': + resolution: {integrity: sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA==} + + '@ethersproject/bytes@5.8.0': + resolution: {integrity: sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A==} + + '@ethersproject/constants@5.8.0': + resolution: {integrity: sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg==} + + '@ethersproject/hash@5.8.0': + resolution: {integrity: sha512-ac/lBcTbEWW/VGJij0CNSw/wPcw9bSRgCB0AIBz8CvED/jfvDoV9hsIIiWfvWmFEi8RcXtlNwp2jv6ozWOsooA==} + + '@ethersproject/keccak256@5.8.0': + resolution: {integrity: sha512-A1pkKLZSz8pDaQ1ftutZoaN46I6+jvuqugx5KYNeQOPqq+JZ0Txm7dlWesCHB5cndJSu5vP2VKptKf7cksERng==} + + '@ethersproject/logger@5.8.0': + resolution: {integrity: sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA==} + + '@ethersproject/networks@5.8.0': + resolution: {integrity: sha512-egPJh3aPVAzbHwq8DD7Po53J4OUSsA1MjQp8Vf/OZPav5rlmWUaFLiq8cvQiGK0Z5K6LYzm29+VA/p4RL1FzNg==} + + '@ethersproject/properties@5.8.0': + resolution: {integrity: sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw==} + + '@ethersproject/rlp@5.8.0': + resolution: {integrity: sha512-LqZgAznqDbiEunaUvykH2JAoXTT9NV0Atqk8rQN9nx9SEgThA/WMx5DnW8a9FOufo//6FZOCHZ+XiClzgbqV9Q==} + + '@ethersproject/signing-key@5.8.0': + resolution: {integrity: sha512-LrPW2ZxoigFi6U6aVkFN/fa9Yx/+4AtIUe4/HACTvKJdhm0eeb107EVCIQcrLZkxaSIgc/eCrX8Q1GtbH+9n3w==} + + '@ethersproject/strings@5.8.0': + resolution: {integrity: sha512-qWEAk0MAvl0LszjdfnZ2uC8xbR2wdv4cDabyHiBh3Cldq/T8dPH3V4BbBsAYJUeonwD+8afVXld274Ls+Y1xXg==} + + '@ethersproject/transactions@5.8.0': + resolution: {integrity: sha512-UglxSDjByHG0TuU17bDfCemZ3AnKO2vYrL5/2n2oXvKzvb7Cz+W9gOWXKARjp2URVwcWlQlPOEQyAviKwT4AHg==} + + '@ethersproject/web@5.8.0': + resolution: {integrity: sha512-j7+Ksi/9KfGviws6Qtf9Q7KCqRhpwrYKQPs+JBA/rKVFF/yaWLHJEH3zfVP2plVu+eys0d2DlFmhoQJayFewcw==} + '@expo/bunyan@4.0.0': resolution: {integrity: sha512-Ydf4LidRB/EBI+YrB+cVLqIseiRfjUI/AeHBgjGMtq3GroraDu81OV7zqophRgupngoL3iS3JUMDMnxO7g39qA==} engines: {'0': node >=0.10.0} @@ -2381,6 +2519,15 @@ packages: peerDependencies: graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + '@grpc/grpc-js@1.13.4': + resolution: {integrity: sha512-GsFaMXCkMqkKIvwCQjCrwH+GHbPKBjhwo/8ZuUkWHqbI73Kky9I+pQltrlT0+MWpedCoosda53lgjYfyEPgxBg==} + engines: {node: '>=12.10.0'} + + '@grpc/proto-loader@0.7.15': + resolution: {integrity: sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ==} + engines: {node: '>=6'} + hasBin: true + '@hapi/bourne@3.0.0': resolution: {integrity: sha512-Waj1cwPXJDucOib4a3bAISsKJVb15MKi9IvmTI/7ssVEm6sywXGjVJDhl6/umt1pK1ZS7PacXU3A1PmFKHEZ2w==} @@ -2390,6 +2537,81 @@ packages: '@hapi/topo@5.1.0': resolution: {integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==} + '@hashgraph/cryptography@1.9.0': + resolution: {integrity: sha512-0UItolO1W/f8YIsGBrIxvjY+cSdvs4sEdzXOL49ThYEfPskJUprG3vhMhosRFoA4d0hxdJ7/glB7f7He8RW9xg==} + engines: {node: '>=12.0.0'} + peerDependencies: + expo-crypto: '*' + peerDependenciesMeta: + expo-crypto: + optional: true + + '@hashgraph/proto@2.20.0': + resolution: {integrity: sha512-XGIHRE9jr4wnnmCG8JeUD/nyeCiiYoUt35oRJz0QdCUwJYtbEsR6tPQxO90PxJJVDI5smT1c5i0f9wRRtFDhIA==} + engines: {node: '>=10.0.0'} + + '@hashgraph/sdk@2.70.0': + resolution: {integrity: sha512-naml5lWgewD3Dh8z0K7NRuKpbOpDaxpxwcLjtB9RFVmATMDU3IShSzxy24k5tUgY/0ZE7XXfCKgIpdT7TxGKqQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + bn.js: ^5.2.1 + + '@hiero-did-sdk/anoncreds@0.1.0': + resolution: {integrity: sha512-9+DPsjICXUiQrM5+kSDvV9DMSGfuh/xyo21kFBe8Tm9f7khbCz9tPLRKIiK9OfanZB0hWG6htBS+cwCb7SrLDw==} + engines: {node: '>=20'} + + '@hiero-did-sdk/cache@0.1.0': + resolution: {integrity: sha512-JK58CiMDoezher6exIMAO+YKFi4mFwRdY6PD1RCB36+A8OAkOk1Od3qUKm27rv4pXEh16lY/DKB/xse8b009iQ==} + engines: {node: '>=20'} + + '@hiero-did-sdk/client@0.1.0': + resolution: {integrity: sha512-8EBsjVxxEZEdQKePenBCo1HXKRK/70p/XRgFPzWIplUE+2jbmfy7NGqx8tzihK0NlXpA17ojp4Pu5wZJONolmA==} + engines: {node: '>=20'} + + '@hiero-did-sdk/core@0.1.0': + resolution: {integrity: sha512-qbV74xqRQBnTMpm7MGlEcqBHbiHD0+QagU698ZXKB/X3dz1Mf8kvmoZdaPPS+bIq7S6nJqf6u9xd+L0OKLgzbg==} + engines: {node: '>=20'} + + '@hiero-did-sdk/crypto@0.1.0': + resolution: {integrity: sha512-5wGuufZpcaDf3XYmX0CrCtGA9F9Zkitj+DjGVebVEJEOr9CiZeWWoJ/rS1zxOBPNWyZH3aWKG9vUqJ8RyOXiPg==} + engines: {node: '>=20'} + + '@hiero-did-sdk/hcs@0.1.0': + resolution: {integrity: sha512-Eb5pUrdXHcqNISN3kDZiQCFRKcMhrSyyuSMRrD1mYvUG2OGi5nleaUoR6xK2u0G/jJ8hrgytXuYONTim/6wJ+Q==} + engines: {node: '>=20'} + + '@hiero-did-sdk/lifecycle@0.1.0': + resolution: {integrity: sha512-j+pIqGFz7TVYZYM8R4FFHT+y859X5UPC7ZGLY7fDtEwsRGRlU6DllhO3octh4qyoJ9BkCJyU8omZjAKeq/WW4g==} + engines: {node: '>=20'} + + '@hiero-did-sdk/messages@0.1.0': + resolution: {integrity: sha512-j5GRYzJc+Fp2/ILhOCsE62dJwK9efqCu8YbzIVR3o7hGx7HzAC1fbM73myQqBTrcpxQJkRktV8lCeEKK9nOYGw==} + engines: {node: '>=20'} + + '@hiero-did-sdk/publisher-internal@0.1.0': + resolution: {integrity: sha512-lMBeltfo+NPqVik148h5VWwLrvDiXVYTJyKkaev9/JatTZlJELdYhtvWyBPPSvCikDFf8Td1QGe3wq/Jm4kbOA==} + engines: {node: '>=20'} + + '@hiero-did-sdk/registrar@0.1.0': + resolution: {integrity: sha512-zpRxQy24R+ZYxX6N4+VVxZwanxEfkCkcbzDncp8q4q/7Tru5bkAs+WghljiQS0CZPvSwP0iv21SsDEWjDtkKBw==} + engines: {node: '>=20'} + + '@hiero-did-sdk/resolver@0.1.0': + resolution: {integrity: sha512-/SVglErskv8qhBrcvgxHEgv6t1vwX0eJ3Q90QSTqhmnNIZCtjoI9yP/bo7MONBwsowY2DUCF18s5vT2/k2V3gQ==} + engines: {node: '>=20'} + + '@hiero-did-sdk/signer-internal@0.1.0': + resolution: {integrity: sha512-Z55sq1ExxtWZHzZcydQS4eg5G8w+nWx5uMQwAZrS92m6s9G1kg4z90tM321NQca6d9kFIjp59NYQA1inhxLf1w==} + engines: {node: '>=20'} + + '@hiero-did-sdk/verifier-internal@0.1.0': + resolution: {integrity: sha512-AyJz0HqbFO/mtY0t5Fpx7LBrRG5fI8tR5b0LVjhnDsvfCt3hOeLOoqnbv28x7Kljsyz+2ZJG3IPoawF5To5NGA==} + engines: {node: '>=20'} + + '@hiero-did-sdk/zstd@0.1.0': + resolution: {integrity: sha512-Y5jNDMOR268rZJBgTdwg5KjZeXijYjfCdu55P5jhzWXkO3lKHdd5jJR46DLFWse+/WaS9Ev8pz2uX+bHium8tQ==} + engines: {node: '>=20'} + '@hyperledger/anoncreds-nodejs@0.3.1': resolution: {integrity: sha512-/oWmWgcOPqjAtd2+dKASPYL84Qd7sAFyCBfEKM7PAgVbObaZUZc0kqA7hkEz/qyiqUvcP/JwKTc1v4zVZi6BTg==} engines: {node: '>= 18'} @@ -2549,6 +2771,9 @@ packages: peerDependencies: '@js-joda/core': '>=1.11.0' + '@js-sdsl/ordered-map@4.4.2': + resolution: {integrity: sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==} + '@koa/bodyparser@5.1.1': resolution: {integrity: sha512-ZBF49xqNVxnmJ+8iXegq+fXPQm9RSX8giNl/aXS5rW1VpNct92wnFbGR/47vfoRJVLARGQ4HVL4WaQ0u8IJVoA==} engines: {node: '>= 16'} @@ -2849,6 +3074,9 @@ packages: '@scure/base@1.2.1': resolution: {integrity: sha512-DGmGtC8Tt63J5GfHgfl5CuAXh96VF/LD8K9Hr/Gv0J2lAoRGlPOMpqMpMbCTOoOJMZCk2Xt+DskdDyn6dEFdzQ==} + '@scure/base@1.2.6': + resolution: {integrity: sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg==} + '@sd-jwt/core@0.10.0': resolution: {integrity: sha512-EuFsIHP76fwNi97dGcz2jdEenHL/AkDGcqrEA00k82Uw0HP/hvbAfB+yyPxYrd3dVaxe5PWSKvDkgDK6kKk+6Q==} engines: {node: '>=18'} @@ -3405,6 +3633,10 @@ packages: resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} engines: {node: '>= 4.0.0'} + atomic-sleep@1.0.0: + resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} + engines: {node: '>=8.0.0'} + available-typed-arrays@1.0.7: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} @@ -3692,6 +3924,13 @@ packages: canonicalize@2.0.0: resolution: {integrity: sha512-ulDEYPv7asdKvqahuAY35c1selLdzDwHqugK92hfkzvlDCwXRRelDkR+Er33md/PtnpqHemgkuDPanZ4fiYZ8w==} + cbor-extract@2.2.0: + resolution: {integrity: sha512-Ig1zM66BjLfTXpNgKpvBePq271BPOvu8MR0Jl080yG7Jsl+wAZunfrwiwA+9ruzm/WEdIV5QF/bjDZTqyAIVHA==} + hasBin: true + + cbor-x@1.6.0: + resolution: {integrity: sha512-0kareyRwHSkL6ws5VXHEf8uY1liitysCVJjlmhaLG+IXLqhSaOO+t63coaso7yjwEzWZzLy8fJo06gZDVQM9Qg==} + chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} @@ -3710,6 +3949,9 @@ packages: charenc@0.0.2: resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==} + chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + chownr@2.0.0: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} engines: {node: '>=10'} @@ -3819,6 +4061,9 @@ packages: colorette@1.4.0: resolution: {integrity: sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==} + colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + combined-stream@1.0.8: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} @@ -3962,6 +4207,9 @@ packages: crypt@0.0.2: resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==} + crypto-js@4.2.0: + resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==} + crypto-ld@6.0.0: resolution: {integrity: sha512-XWL1LslqggNoaCI/m3I7HcvaSt9b2tYzdrXO+jHLUj9G1BvRfvV7ZTFDVY5nifYuIGAPdAGu7unPxLRustw3VA==} engines: {node: '>=8.3.0'} @@ -4001,6 +4249,9 @@ packages: resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} engines: {node: '>= 0.4'} + dateformat@4.6.3: + resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==} + dayjs@1.11.11: resolution: {integrity: sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg==} @@ -4381,6 +4632,10 @@ packages: resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} engines: {node: '>= 0.8.0'} + expand-template@2.0.3: + resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} + engines: {node: '>=6'} + expect@29.7.0: resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -4451,6 +4706,9 @@ packages: fast-base64-decode@1.0.0: resolution: {integrity: sha512-qwaScUgUGBYeDNRnbc/KyllVU88Jk1pRHPStuF/lO7B0/RTRLj7U0lkdTAutlBblY08rwZDff6tNU9cjv6j//Q==} + fast-copy@3.0.2: + resolution: {integrity: sha512-dl0O9Vhju8IrcLndv2eU4ldt1ftXMqqfgN4H1cpmGV7P6jeB9FwpN9a2c8DPGE1Ys88rNUJVYDHq73CGAGOPfQ==} + fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -4464,6 +4722,10 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + fast-redact@3.5.0: + resolution: {integrity: sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==} + engines: {node: '>=6'} + fast-safe-stringify@2.1.1: resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} @@ -4595,6 +4857,10 @@ packages: resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} + forge-light@1.1.4: + resolution: {integrity: sha512-Nr0xdu93LJawgBZVU/tC+A+4pbKqigdY5PRBz8CXNm4e5saAZIqU2Qe9+nVFtVO5TWCHSgvI0LaZZuatgE5J1g==} + engines: {node: '>= 6.13.0'} + form-data-encoder@2.1.4: resolution: {integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==} engines: {node: '>= 14.17'} @@ -4630,6 +4896,9 @@ packages: resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} engines: {node: '>= 0.6'} + fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + fs-extra@7.0.1: resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} engines: {node: '>=6 <7 || >=8'} @@ -4730,6 +4999,9 @@ packages: resolution: {integrity: sha512-7yetJWqbS9sbn0vIfliPsFgoXMKn/YMF+Wuiog97x+urnSRRRZ7xB+uVkwGKzRgq9CDFfMQnE9ruL5DHv9c6Xg==} engines: {node: '>=6'} + github-from-package@0.0.0: + resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} + glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -4840,6 +5112,9 @@ packages: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} + help-me@5.0.0: + resolution: {integrity: sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==} + hermes-estree@0.19.1: resolution: {integrity: sha512-daLGV3Q2MKk8w4evNMKwS8zBE/rcpA800nu1Q5kM08IKijoSnPe9Uo1iIxzPKRkn95IxxsgBMPeYHt3VG4ej2g==} @@ -5412,9 +5687,16 @@ packages: jose@5.10.0: resolution: {integrity: sha512-s+3Al/p9g32Iq+oqXxkW//7jk2Vig6FF1CFqzVXoTUXt2qz89YWbL+OwS17NFYEvxC35n0FKeGO2LGYSxeM2Gg==} + joycon@3.1.1: + resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} + engines: {node: '>=10'} + js-base64@3.7.7: resolution: {integrity: sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==} + js-sha3@0.8.0: + resolution: {integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==} + js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -5649,6 +5931,9 @@ packages: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} + lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + lodash.debounce@4.0.8: resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} @@ -6017,6 +6302,9 @@ packages: resolution: {integrity: sha512-umcy022ILvb5/3Djuu8LWeqUa8D68JaBzlttKeMWen48SjabqS3iY5w/vzeMzMUNhLDifyhbOwKDSznB1vvrwg==} engines: {node: '>= 18'} + mkdirp-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + mkdirp@0.5.6: resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} hasBin: true @@ -6079,6 +6367,9 @@ packages: engines: {node: ^18 || >=20} hasBin: true + napi-build-utils@2.0.0: + resolution: {integrity: sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==} + natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} @@ -6110,12 +6401,19 @@ packages: resolution: {integrity: sha512-R49fALR9caB6vxuSWUIaK2eBYeTloZQUFBZ4rHO+TbhMGQHtwnhdqKLYki+o+8qMgLvoBYWrp/2KzGPhxL4S6w==} engines: {node: '>=18.20.0 <20 || >=20.12.1'} + node-abi@3.75.0: + resolution: {integrity: sha512-OhYaY5sDsIka7H7AtijtI9jwGYLyl29eQn/W623DiN/MIv5sUqc4g7BIDThX+gb7di9f6xK02nkp8sdfFWZLTg==} + engines: {node: '>=10'} + node-addon-api@3.2.1: resolution: {integrity: sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==} node-addon-api@5.1.0: resolution: {integrity: sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==} + node-addon-api@7.1.1: + resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} + node-dir@0.1.17: resolution: {integrity: sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg==} engines: {node: '>= 0.10.5'} @@ -6146,6 +6444,10 @@ packages: resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} engines: {node: '>= 6.13.0'} + node-gyp-build-optional-packages@5.1.1: + resolution: {integrity: sha512-+P72GAjVAbTxjjwUmwjVrqrdZROD4nf8KgpBoDxqXXTiYZZt/ud60dE5yvCSr9lRO8e8yv6kgJIC0K0PfZFVQw==} + hasBin: true + node-gyp-build@4.8.1: resolution: {integrity: sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==} hasBin: true @@ -6228,6 +6530,10 @@ packages: resolution: {integrity: sha512-IF4PcGgzAr6XXSff26Sk/+P4KZFJVuHAJZj3wgO3vX2bMdNVp/QXTP3P7CEm9V1IdG8lDLY3HhiqpsE/nOwpPw==} engines: {node: ^10.13.0 || >=12.0.0} + on-exit-leak-free@2.1.2: + resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} + engines: {node: '>=14.0.0'} + on-finished@2.3.0: resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==} engines: {node: '>= 0.8'} @@ -6436,6 +6742,20 @@ packages: resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} engines: {node: '>=6'} + pino-abstract-transport@2.0.0: + resolution: {integrity: sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw==} + + pino-pretty@13.1.1: + resolution: {integrity: sha512-TNNEOg0eA0u+/WuqH0MH0Xui7uqVk9D74ESOpjtebSQYbNWJk/dIxCXIxFsNfeN53JmtWqYHP2OrIZjT/CBEnA==} + hasBin: true + + pino-std-serializers@7.0.0: + resolution: {integrity: sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==} + + pino@9.9.0: + resolution: {integrity: sha512-zxsRIQG9HzG+jEljmvmZupOMDUQ0Jpj0yAgE28jQvvrdYTlEaiGwelJpdndMl/MBuRr70heIj83QyqJUWaU8mQ==} + hasBin: true + pirates@4.0.6: resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} engines: {node: '>= 6'} @@ -6464,6 +6784,11 @@ packages: resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} engines: {node: ^10 || ^12 || >=14} + prebuild-install@7.1.3: + resolution: {integrity: sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==} + engines: {node: '>=10'} + hasBin: true + prelude-ls@1.1.2: resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} engines: {node: '>= 0.8.0'} @@ -6492,6 +6817,9 @@ packages: process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + process-warning@5.0.0: + resolution: {integrity: sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA==} + progress@2.0.3: resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} engines: {node: '>=0.4.0'} @@ -6517,6 +6845,10 @@ packages: resolution: {integrity: sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw==} hasBin: true + protobufjs@7.2.5: + resolution: {integrity: sha512-gGXRSXvxQ7UiPgfw8gevrfRWcTlSbOFg+p/N+JVJEK5VhueL2miT6qTymqAmjr1Q5WbOCyJbyrk6JfWKwlFn6A==} + engines: {node: '>=12.0.0'} + protobufjs@7.4.0: resolution: {integrity: sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw==} engines: {node: '>=12.0.0'} @@ -6573,6 +6905,9 @@ packages: queue@6.0.2: resolution: {integrity: sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==} + quick-format-unescaped@4.0.4: + resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} + quick-lru@5.1.1: resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} engines: {node: '>=10'} @@ -6676,6 +7011,10 @@ packages: readonly-date@1.0.0: resolution: {integrity: sha512-tMKIV7hlk0h4mO3JTmmVuIlJVXjKk3Sep9Bf5OH0O+758ruuVkUy2J9SttDLm91IEX/WHlXPSpxMGjPj4beMIQ==} + real-require@0.2.0: + resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} + engines: {node: '>= 12.13.0'} + recast@0.21.5: resolution: {integrity: sha512-hjMmLaUXAm1hIuTqOdeYObMslq/q+Xff6QE3Y2P+uoHAg2nmVlLBps2hzh1UJDdMtDTMXOFewK6ky51JQIeECg==} engines: {node: '>= 4'} @@ -6797,6 +7136,9 @@ packages: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + rfc4648@1.5.4: + resolution: {integrity: sha512-rRg/6Lb+IGfJqO05HZkN50UtY7K/JhxJag1kP23+zyMfrvoB0B7RWv06MbOzoc79RgCdNTiUaNsTT1AJZ7Z+cg==} + rimraf@2.2.8: resolution: {integrity: sha512-R5KMKHnPAQaZMqLOsyuyUmcIjSeDm+73eoqQpaXA7AZ22BL+6C+1mcUscgOsNd8WVlJuvlgAPsegcx7pjlV0Dg==} deprecated: Rimraf versions prior to v4 are no longer supported @@ -6867,6 +7209,10 @@ packages: resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} engines: {node: '>= 0.4'} + safe-stable-stringify@2.5.0: + resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} + engines: {node: '>=10'} + safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} @@ -6880,6 +7226,9 @@ packages: resolution: {integrity: sha512-lDFs9AAIaWP9UCdtWrotXWWF9t8PWgQDcxqgAnpM9rMqxb3Oaq2J0thzPVSxBwdJgyQtkU/sYtFtbM1RSt/iYA==} engines: {node: '>=18.0.0'} + secure-json-parse@4.0.0: + resolution: {integrity: sha512-dxtLJO6sc35jWidmLxo7ij+Eg48PM/kleBsxpC8QJE0qJICe+KawkDQmvCMZUr9u7WKVHgMW6vy3fQ7zMiFZMA==} + selfsigned@2.4.1: resolution: {integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==} engines: {node: '>=10'} @@ -6989,6 +7338,12 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} + simple-concat@1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + + simple-get@4.0.1: + resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + simple-plist@1.3.1: resolution: {integrity: sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw==} @@ -7007,6 +7362,9 @@ packages: resolution: {integrity: sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==} engines: {node: '>=8.0.0'} + sonic-boom@4.2.0: + resolution: {integrity: sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww==} + source-map-js@1.2.0: resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} engines: {node: '>=0.10.0'} @@ -7029,6 +7387,9 @@ packages: resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} engines: {node: '>= 8'} + spark-md5@3.0.2: + resolution: {integrity: sha512-wcFzz9cDfbuqe0FZzfi2or1sgyIrsDwmPwfZC4hiNidPdPINjeUwNfv5kldczoEAcjl9Y1L3SM7Uz2PUEQzxQw==} + spawndamnit@3.0.1: resolution: {integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==} @@ -7036,6 +7397,10 @@ packages: resolution: {integrity: sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==} engines: {node: '>=6'} + split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} + split@1.0.1: resolution: {integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==} @@ -7155,6 +7520,10 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} + strip-json-comments@5.0.3: + resolution: {integrity: sha512-1tB5mhVo7U+ETBKNf92xT4hrQa3pm0MZ0PQvuDnWgAAGHDsfp4lPSpiS6psrSiet87wyGPh9ft6wmhOMQ0hDiw==} + engines: {node: '>=14.16'} + strnum@1.0.5: resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==} @@ -7219,6 +7588,13 @@ packages: resolution: {integrity: sha512-sQV7phh2WCYAn81oAkakC5qjq2Ml0g8ozqz03wOGnx9dDlG1de6yrF+0RAzSJD8fPUow3PTSMf2SAbOGxb93BA==} engines: {node: '>=0.10'} + tar-fs@2.1.3: + resolution: {integrity: sha512-090nwYJDmlhwFwEW3QQl+vaNnxsO2yVsd45eTKRBzSzu+hlb1w2K9inVq5b0ngXuLVqQ4ApvsUHHnu/zQNkWAg==} + + tar-stream@2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + tar@6.2.1: resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} engines: {node: '>=10'} @@ -7278,6 +7654,9 @@ packages: thenify@3.3.1: resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + thread-stream@3.1.0: + resolution: {integrity: sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==} + throat@5.0.0: resolution: {integrity: sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==} @@ -7392,6 +7771,12 @@ packages: resolution: {integrity: sha512-YB1FG+axdxADa3ncEtRnQCFq/M0lALGLxSZeVNbTU8NqhOVc51nnv2CISTcvc1kyv6EGPtXVr0v6lWeDxiijOA==} engines: {node: '>= 6.0.0'} + tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + + tweetnacl@1.0.3: + resolution: {integrity: sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==} + type-check@0.3.2: resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} engines: {node: '>= 0.8.0'} @@ -7833,9 +8218,13 @@ packages: zod@3.25.67: resolution: {integrity: sha512-idA2YXwpCdqUSKRCACDE6ItZD9TZzy3OZMtpfLoh6oPR47lipysRrJfjzMqFxQ3uJuUPyUeWe1r9vLH33xO/Qw==} + zstd-napi@0.0.10: + resolution: {integrity: sha512-pwnG+auSiIrD2BNSIpPEUtcRSK33cfYmKo3sJPTohFiPqPci9F4SIRPR7gGeI45Maj4nFoyyxzT2YDxVXIIgzQ==} + engines: {node: ^12.22.0 || ^14.17.0 || ^15.12.0 || >=16} + snapshots: - '@2060.io/ffi-napi@4.0.9': + '@2060.io/ffi-napi@4.0.9(patch_hash=9d391c085b8342fd39feab6d234b27742c9c1d160c2f8b63840cc95445fa44aa)': dependencies: '@2060.io/ref-napi': 3.0.6 debug: 4.4.0 @@ -8991,6 +9380,24 @@ snapshots: '@bufbuild/protobuf@2.2.5': {} + '@cbor-extract/cbor-extract-darwin-arm64@2.2.0': + optional: true + + '@cbor-extract/cbor-extract-darwin-x64@2.2.0': + optional: true + + '@cbor-extract/cbor-extract-linux-arm64@2.2.0': + optional: true + + '@cbor-extract/cbor-extract-linux-arm@2.2.0': + optional: true + + '@cbor-extract/cbor-extract-linux-x64@2.2.0': + optional: true + + '@cbor-extract/cbor-extract-win32-x64@2.2.0': + optional: true + '@changesets/apply-release-plan@7.0.12': dependencies: '@changesets/config': 3.1.1 @@ -9621,6 +10028,129 @@ snapshots: '@esbuild/win32-x64@0.25.5': optional: true + '@ethersproject/abi@5.8.0': + dependencies: + '@ethersproject/address': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/constants': 5.8.0 + '@ethersproject/hash': 5.8.0 + '@ethersproject/keccak256': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/strings': 5.8.0 + + '@ethersproject/abstract-provider@5.8.0': + dependencies: + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/networks': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/transactions': 5.8.0 + '@ethersproject/web': 5.8.0 + + '@ethersproject/abstract-signer@5.8.0': + dependencies: + '@ethersproject/abstract-provider': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/properties': 5.8.0 + + '@ethersproject/address@5.8.0': + dependencies: + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/keccak256': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/rlp': 5.8.0 + + '@ethersproject/base64@5.8.0': + dependencies: + '@ethersproject/bytes': 5.8.0 + + '@ethersproject/bignumber@5.8.0': + dependencies: + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 + bn.js: 5.2.1 + + '@ethersproject/bytes@5.8.0': + dependencies: + '@ethersproject/logger': 5.8.0 + + '@ethersproject/constants@5.8.0': + dependencies: + '@ethersproject/bignumber': 5.8.0 + + '@ethersproject/hash@5.8.0': + dependencies: + '@ethersproject/abstract-signer': 5.8.0 + '@ethersproject/address': 5.8.0 + '@ethersproject/base64': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/keccak256': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/strings': 5.8.0 + + '@ethersproject/keccak256@5.8.0': + dependencies: + '@ethersproject/bytes': 5.8.0 + js-sha3: 0.8.0 + + '@ethersproject/logger@5.8.0': {} + + '@ethersproject/networks@5.8.0': + dependencies: + '@ethersproject/logger': 5.8.0 + + '@ethersproject/properties@5.8.0': + dependencies: + '@ethersproject/logger': 5.8.0 + + '@ethersproject/rlp@5.8.0': + dependencies: + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 + + '@ethersproject/signing-key@5.8.0': + dependencies: + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/properties': 5.8.0 + bn.js: 5.2.1 + elliptic: 6.6.1 + hash.js: 1.1.7 + + '@ethersproject/strings@5.8.0': + dependencies: + '@ethersproject/bytes': 5.8.0 + '@ethersproject/constants': 5.8.0 + '@ethersproject/logger': 5.8.0 + + '@ethersproject/transactions@5.8.0': + dependencies: + '@ethersproject/address': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/constants': 5.8.0 + '@ethersproject/keccak256': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/rlp': 5.8.0 + '@ethersproject/signing-key': 5.8.0 + + '@ethersproject/web@5.8.0': + dependencies: + '@ethersproject/base64': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/strings': 5.8.0 + '@expo/bunyan@4.0.0': dependencies: uuid: 8.3.2 @@ -9906,6 +10436,18 @@ snapshots: dependencies: graphql: 15.8.0 + '@grpc/grpc-js@1.13.4': + dependencies: + '@grpc/proto-loader': 0.7.15 + '@js-sdsl/ordered-map': 4.4.2 + + '@grpc/proto-loader@0.7.15': + dependencies: + lodash.camelcase: 4.3.0 + long: 5.3.1 + protobufjs: 7.4.0 + yargs: 17.7.2 + '@hapi/bourne@3.0.0': {} '@hapi/hoek@9.3.0': @@ -9916,9 +10458,192 @@ snapshots: '@hapi/hoek': 9.3.0 optional: true + '@hashgraph/cryptography@1.9.0(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': + dependencies: + '@noble/curves': 1.9.2 + asn1js: 3.0.6 + bignumber.js: 9.1.2 + bn.js: 5.2.1 + buffer: 6.0.3 + crypto-js: 4.2.0 + forge-light: 1.1.4 + js-base64: 3.7.7 + react-native-get-random-values: 1.11.0(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + spark-md5: 3.0.2 + tweetnacl: 1.0.3 + utf8: 3.0.0 + transitivePeerDependencies: + - react-native + + '@hashgraph/proto@2.20.0': + dependencies: + long: 5.3.1 + protobufjs: 7.2.5 + + '@hashgraph/sdk@2.70.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': + dependencies: + '@ethersproject/abi': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/rlp': 5.8.0 + '@grpc/grpc-js': 1.13.4 + '@hashgraph/cryptography': 1.9.0(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hashgraph/proto': 2.20.0 + bignumber.js: 9.1.2 + bn.js: 5.2.1 + crypto-js: 4.2.0 + js-base64: 3.7.7 + long: 5.3.1 + pino: 9.9.0 + pino-pretty: 13.1.1 + protobufjs: 7.2.5 + rfc4648: 1.5.4 + utf8: 3.0.0 + transitivePeerDependencies: + - expo-crypto + - react-native + + '@hiero-did-sdk/anoncreds@0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': + dependencies: + '@hiero-did-sdk/core': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/hcs': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/zstd': 0.1.0 + buffer: 6.0.3 + transitivePeerDependencies: + - bn.js + - expo-crypto + - react-native + + '@hiero-did-sdk/cache@0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': + dependencies: + '@hiero-did-sdk/core': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + transitivePeerDependencies: + - bn.js + - expo-crypto + - react-native + + '@hiero-did-sdk/client@0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': + dependencies: + '@hashgraph/sdk': 2.70.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + transitivePeerDependencies: + - bn.js + - expo-crypto + - react-native + + '@hiero-did-sdk/core@0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': + dependencies: + '@hashgraph/sdk': 2.70.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@scure/base': 1.2.6 + buffer: 6.0.3 + cbor-x: 1.6.0 + transitivePeerDependencies: + - bn.js + - expo-crypto + - react-native + + '@hiero-did-sdk/crypto@0.1.0': + dependencies: + buffer: 6.0.3 + + '@hiero-did-sdk/hcs@0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': + dependencies: + '@hashgraph/sdk': 2.70.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/cache': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/client': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/core': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/crypto': 0.1.0 + '@hiero-did-sdk/zstd': 0.1.0 + buffer: 6.0.3 + transitivePeerDependencies: + - bn.js + - expo-crypto + - react-native + + '@hiero-did-sdk/lifecycle@0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': + dependencies: + '@hiero-did-sdk/core': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + buffer: 6.0.3 + transitivePeerDependencies: + - bn.js + - expo-crypto + - react-native + + '@hiero-did-sdk/messages@0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': + dependencies: + '@hashgraph/sdk': 2.70.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/core': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/lifecycle': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/resolver': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + buffer: 6.0.3 + transitivePeerDependencies: + - bn.js + - expo-crypto + - react-native + + '@hiero-did-sdk/publisher-internal@0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': + dependencies: + '@hashgraph/sdk': 2.70.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/core': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + buffer: 6.0.3 + transitivePeerDependencies: + - bn.js + - expo-crypto + - react-native + + '@hiero-did-sdk/registrar@0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': + dependencies: + '@hashgraph/sdk': 2.70.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/core': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/lifecycle': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/messages': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/publisher-internal': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/resolver': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/signer-internal': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/verifier-internal': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + buffer: 6.0.3 + transitivePeerDependencies: + - bn.js + - expo-crypto + - react-native + + '@hiero-did-sdk/resolver@0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': + dependencies: + '@hashgraph/sdk': 2.70.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/client': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/core': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/hcs': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/verifier-internal': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + buffer: 6.0.3 + transitivePeerDependencies: + - bn.js + - expo-crypto + - react-native + + '@hiero-did-sdk/signer-internal@0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': + dependencies: + '@hashgraph/sdk': 2.70.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/core': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + buffer: 6.0.3 + transitivePeerDependencies: + - bn.js + - expo-crypto + - react-native + + '@hiero-did-sdk/verifier-internal@0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': + dependencies: + '@hashgraph/sdk': 2.70.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/core': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + buffer: 6.0.3 + transitivePeerDependencies: + - bn.js + - expo-crypto + - react-native + + '@hiero-did-sdk/zstd@0.1.0': {} + '@hyperledger/anoncreds-nodejs@0.3.1': dependencies: - '@2060.io/ffi-napi': 4.0.9 + '@2060.io/ffi-napi': 4.0.9(patch_hash=9d391c085b8342fd39feab6d234b27742c9c1d160c2f8b63840cc95445fa44aa) '@2060.io/ref-napi': 3.0.6 '@hyperledger/anoncreds-shared': 0.3.1 ref-array-di: 1.2.2 @@ -9932,7 +10657,7 @@ snapshots: '@hyperledger/indy-vdr-nodejs@0.2.2': dependencies: - '@2060.io/ffi-napi': 4.0.9 + '@2060.io/ffi-napi': 4.0.9(patch_hash=9d391c085b8342fd39feab6d234b27742c9c1d160c2f8b63840cc95445fa44aa) '@2060.io/ref-napi': 3.0.6 '@hyperledger/indy-vdr-shared': 0.2.2 '@mapbox/node-pre-gyp': 1.0.11 @@ -10200,6 +10925,8 @@ snapshots: dependencies: '@js-joda/core': 5.6.3 + '@js-sdsl/ordered-map@4.4.2': {} + '@koa/bodyparser@5.1.1(koa@2.16.0)': dependencies: co-body: 6.2.0 @@ -10318,7 +11045,7 @@ snapshots: '@openwallet-foundation/askar-nodejs@0.3.2': dependencies: - '@2060.io/ffi-napi': 4.0.9 + '@2060.io/ffi-napi': 4.0.9(patch_hash=9d391c085b8342fd39feab6d234b27742c9c1d160c2f8b63840cc95445fa44aa) '@2060.io/ref-napi': 3.0.6 '@openwallet-foundation/askar-shared': 0.3.2 ref-array-di: 1.2.2 @@ -10741,7 +11468,7 @@ snapshots: metro: 0.82.4 metro-config: 0.82.4 metro-core: 0.82.4 - semver: 7.6.2 + semver: 7.7.2 optionalDependencies: '@react-native-community/cli': 10.2.7(@babel/core@7.27.7) transitivePeerDependencies: @@ -10820,6 +11547,8 @@ snapshots: '@scure/base@1.2.1': {} + '@scure/base@1.2.6': {} + '@sd-jwt/core@0.10.0': dependencies: '@sd-jwt/decode': 0.10.0 @@ -11449,6 +12178,8 @@ snapshots: at-least-node@1.0.0: {} + atomic-sleep@1.0.0: {} + available-typed-arrays@1.0.7: dependencies: possible-typed-array-names: 1.0.0 @@ -11864,6 +12595,22 @@ snapshots: canonicalize@2.0.0: {} + cbor-extract@2.2.0: + dependencies: + node-gyp-build-optional-packages: 5.1.1 + optionalDependencies: + '@cbor-extract/cbor-extract-darwin-arm64': 2.2.0 + '@cbor-extract/cbor-extract-darwin-x64': 2.2.0 + '@cbor-extract/cbor-extract-linux-arm': 2.2.0 + '@cbor-extract/cbor-extract-linux-arm64': 2.2.0 + '@cbor-extract/cbor-extract-linux-x64': 2.2.0 + '@cbor-extract/cbor-extract-win32-x64': 2.2.0 + optional: true + + cbor-x@1.6.0: + optionalDependencies: + cbor-extract: 2.2.0 + chalk@2.4.2: dependencies: ansi-styles: 3.2.1 @@ -11881,6 +12628,8 @@ snapshots: charenc@0.0.2: {} + chownr@1.1.4: {} + chownr@2.0.0: {} chownr@3.0.0: {} @@ -11989,6 +12738,8 @@ snapshots: colorette@1.4.0: optional: true + colorette@2.0.20: {} + combined-stream@1.0.8: dependencies: delayed-stream: 1.0.0 @@ -12156,6 +12907,8 @@ snapshots: crypt@0.0.2: {} + crypto-js@4.2.0: {} + crypto-ld@6.0.0: {} crypto-random-string@1.0.0: {} @@ -12191,6 +12944,8 @@ snapshots: es-errors: 1.3.0 is-data-view: 1.0.2 + dateformat@4.6.3: {} + dayjs@1.11.11: optional: true @@ -12605,6 +13360,8 @@ snapshots: exit@0.1.2: {} + expand-template@2.0.3: {} + expect@29.7.0: dependencies: '@jest/expect-utils': 29.7.0 @@ -12749,6 +13506,8 @@ snapshots: fast-base64-decode@1.0.0: {} + fast-copy@3.0.2: {} + fast-deep-equal@3.1.3: {} fast-glob@3.3.2: @@ -12763,6 +13522,8 @@ snapshots: fast-levenshtein@2.0.6: {} + fast-redact@3.5.0: {} + fast-safe-stringify@2.1.1: {} fast-text-encoding@1.0.6: {} @@ -12917,6 +13678,8 @@ snapshots: cross-spawn: 7.0.6 signal-exit: 4.1.0 + forge-light@1.1.4: {} + form-data-encoder@2.1.4: {} form-data@3.0.1: @@ -12951,6 +13714,8 @@ snapshots: fresh@0.5.2: {} + fs-constants@1.0.0: {} + fs-extra@7.0.1: dependencies: graceful-fs: 4.2.11 @@ -13073,6 +13838,8 @@ snapshots: getenv@1.0.0: {} + github-from-package@0.0.0: {} + glob-parent@5.1.2: dependencies: is-glob: 4.0.3 @@ -13209,6 +13976,8 @@ snapshots: dependencies: function-bind: 1.1.2 + help-me@5.0.0: {} + hermes-estree@0.19.1: {} hermes-estree@0.25.1: {} @@ -14013,8 +14782,12 @@ snapshots: jose@5.10.0: {} + joycon@3.1.1: {} + js-base64@3.7.7: {} + js-sha3@0.8.0: {} + js-tokens@4.0.0: {} js-yaml@3.14.1: @@ -14268,6 +15041,8 @@ snapshots: dependencies: p-locate: 5.0.0 + lodash.camelcase@4.3.0: {} + lodash.debounce@4.0.8: {} lodash.defaults@4.2.0: {} @@ -14917,6 +15692,8 @@ snapshots: minipass: 7.1.2 rimraf: 5.0.10 + mkdirp-classic@0.5.3: {} + mkdirp@0.5.6: dependencies: minimist: 1.2.8 @@ -14970,6 +15747,8 @@ snapshots: nanoid@5.0.9: {} + napi-build-utils@2.0.0: {} + natural-compare@1.4.0: {} ncp@2.0.0: @@ -14994,10 +15773,16 @@ snapshots: json-stringify-safe: 5.0.1 propagate: 2.0.1 + node-abi@3.75.0: + dependencies: + semver: 7.7.2 + node-addon-api@3.2.1: {} node-addon-api@5.1.0: {} + node-addon-api@7.1.1: {} + node-dir@0.1.17: dependencies: minimatch: 3.1.2 @@ -15023,6 +15808,11 @@ snapshots: node-forge@1.3.1: {} + node-gyp-build-optional-packages@5.1.1: + dependencies: + detect-libc: 2.0.3 + optional: true + node-gyp-build@4.8.1: {} node-int64@0.4.0: {} @@ -15110,6 +15900,8 @@ snapshots: oidc-token-hash@5.0.3: {} + on-exit-leak-free@2.1.2: {} + on-finished@2.3.0: dependencies: ee-first: 1.1.1 @@ -15307,6 +16099,42 @@ snapshots: pify@4.0.1: {} + pino-abstract-transport@2.0.0: + dependencies: + split2: 4.2.0 + + pino-pretty@13.1.1: + dependencies: + colorette: 2.0.20 + dateformat: 4.6.3 + fast-copy: 3.0.2 + fast-safe-stringify: 2.1.1 + help-me: 5.0.0 + joycon: 3.1.1 + minimist: 1.2.8 + on-exit-leak-free: 2.1.2 + pino-abstract-transport: 2.0.0 + pump: 3.0.0 + secure-json-parse: 4.0.0 + sonic-boom: 4.2.0 + strip-json-comments: 5.0.3 + + pino-std-serializers@7.0.0: {} + + pino@9.9.0: + dependencies: + atomic-sleep: 1.0.0 + fast-redact: 3.5.0 + on-exit-leak-free: 2.1.2 + pino-abstract-transport: 2.0.0 + pino-std-serializers: 7.0.0 + process-warning: 5.0.0 + quick-format-unescaped: 4.0.4 + real-require: 0.2.0 + safe-stable-stringify: 2.5.0 + sonic-boom: 4.2.0 + thread-stream: 3.1.0 + pirates@4.0.6: {} pkg-dir@3.0.0: @@ -15333,6 +16161,21 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.0 + prebuild-install@7.1.3: + dependencies: + detect-libc: 2.0.3 + expand-template: 2.0.3 + github-from-package: 0.0.0 + minimist: 1.2.8 + mkdirp-classic: 0.5.3 + napi-build-utils: 2.0.0 + node-abi: 3.75.0 + pump: 3.0.0 + rc: 1.2.8 + simple-get: 4.0.1 + tar-fs: 2.1.3 + tunnel-agent: 0.6.0 + prelude-ls@1.1.2: {} prettier@2.8.8: {} @@ -15363,6 +16206,8 @@ snapshots: process-nextick-args@2.0.1: optional: true + process-warning@5.0.0: {} + progress@2.0.3: {} promise@7.3.1: @@ -15402,6 +16247,21 @@ snapshots: '@types/node': 20.19.2 long: 4.0.0 + protobufjs@7.2.5: + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/base64': 1.1.2 + '@protobufjs/codegen': 2.0.4 + '@protobufjs/eventemitter': 1.1.0 + '@protobufjs/fetch': 1.1.0 + '@protobufjs/float': 1.0.2 + '@protobufjs/inquire': 1.1.0 + '@protobufjs/path': 1.1.2 + '@protobufjs/pool': 1.1.0 + '@protobufjs/utf8': 1.1.0 + '@types/node': 20.19.2 + long: 5.3.1 + protobufjs@7.4.0: dependencies: '@protobufjs/aspromise': 1.1.2 @@ -15468,6 +16328,8 @@ snapshots: dependencies: inherits: 2.0.4 + quick-format-unescaped@4.0.4: {} + quick-lru@5.1.1: {} quick-lru@7.0.0: {} @@ -15619,6 +16481,8 @@ snapshots: readonly-date@1.0.0: {} + real-require@0.2.0: {} + recast@0.21.5: dependencies: ast-types: 0.15.2 @@ -15753,6 +16617,8 @@ snapshots: reusify@1.0.4: {} + rfc4648@1.5.4: {} + rimraf@2.2.8: optional: true @@ -15823,6 +16689,8 @@ snapshots: es-errors: 1.3.0 is-regex: 1.2.1 + safe-stable-stringify@2.5.0: {} + safer-buffer@2.1.2: {} sax@1.4.1: {} @@ -15835,6 +16703,8 @@ snapshots: node-addon-api: 5.1.0 node-gyp-build: 4.8.1 + secure-json-parse@4.0.0: {} + selfsigned@2.4.1: dependencies: '@types/node-forge': 1.3.11 @@ -15977,6 +16847,14 @@ snapshots: signal-exit@4.1.0: {} + simple-concat@1.0.1: {} + + simple-get@4.0.1: + dependencies: + decompress-response: 6.0.0 + once: 1.4.0 + simple-concat: 1.0.1 + simple-plist@1.3.1: dependencies: bplist-creator: 0.1.0 @@ -15996,6 +16874,10 @@ snapshots: slugify@1.6.6: {} + sonic-boom@4.2.0: + dependencies: + atomic-sleep: 1.0.0 + source-map-js@1.2.0: {} source-map-support@0.5.13: @@ -16015,6 +16897,8 @@ snapshots: source-map@0.7.4: optional: true + spark-md5@3.0.2: {} + spawndamnit@3.0.1: dependencies: cross-spawn: 7.0.6 @@ -16022,6 +16906,8 @@ snapshots: split-on-first@1.1.0: {} + split2@4.2.0: {} + split@1.0.1: dependencies: through: 2.3.8 @@ -16135,6 +17021,8 @@ snapshots: strip-json-comments@3.1.1: {} + strip-json-comments@5.0.3: {} + strnum@1.0.5: optional: true @@ -16209,6 +17097,21 @@ snapshots: symbol-observable@2.0.3: {} + tar-fs@2.1.3: + dependencies: + chownr: 1.1.4 + mkdirp-classic: 0.5.3 + pump: 3.0.0 + tar-stream: 2.2.0 + + tar-stream@2.2.0: + dependencies: + bl: 4.1.0 + end-of-stream: 1.4.4 + fs-constants: 1.0.0 + inherits: 2.0.4 + readable-stream: 3.6.2 + tar@6.2.1: dependencies: chownr: 2.0.0 @@ -16285,6 +17188,10 @@ snapshots: dependencies: any-promise: 1.3.0 + thread-stream@3.1.0: + dependencies: + real-require: 0.2.0 + throat@5.0.0: {} through2@2.0.5: @@ -16390,6 +17297,12 @@ snapshots: dependencies: tslib: 1.14.1 + tunnel-agent@0.6.0: + dependencies: + safe-buffer: 5.2.1 + + tweetnacl@1.0.3: {} + type-check@0.3.2: dependencies: prelude-ls: 1.1.2 @@ -16803,3 +17716,9 @@ snapshots: zod: 3.25.67 zod@3.25.67: {} + + zstd-napi@0.0.10: + dependencies: + '@types/node': 20.19.2 + node-addon-api: 7.1.1 + prebuild-install: 7.1.3 From 3334842ff64896c4c257408749d142cf5e0dca1b Mon Sep 17 00:00:00 2001 From: "andrey.kononov" Date: Thu, 14 Aug 2025 18:40:31 +0300 Subject: [PATCH 70/89] - fix: Switch to NPM + unit-tests --- demo/src/BaseAgent.ts | 8 ++- .../hedera/src/ledger/HederaLedgerService.ts | 6 ++ .../HederaAnoncredsRegistry.e2e.test.ts | 2 +- .../HederaDidRegistrar.e2e.test.ts | 21 ++----- .../integration/HederaDidResolver.e2e.test.ts | 2 +- .../tests/integration/utils/testCache.ts | 1 + .../unit/hedera-anoncres-registry.test.ts | 45 ++++++++++++-- .../tests/unit/hedera-did-registrar.test.ts | 38 ++++++------ .../tests/unit/hedera-did-resolver.test.ts | 4 ++ .../tests/unit/hedera-ledger-service.test.ts | 62 +++++++++++-------- .../hedera/tests/unit/kms-publisher.test.ts | 16 +++-- 11 files changed, 127 insertions(+), 78 deletions(-) diff --git a/demo/src/BaseAgent.ts b/demo/src/BaseAgent.ts index 417c8e53f6..ddad42b052 100644 --- a/demo/src/BaseAgent.ts +++ b/demo/src/BaseAgent.ts @@ -151,9 +151,11 @@ function getAskarAnonCredsIndyModules( hedera: new HederaModule({ networks: [ { - network: 'testnet', - operatorId: process.env.HEDERA_TEST_OPERATOR_ID ?? '', - operatorKey: process.env.HEDERA_TEST_OPERATOR_KEY ?? '', + network: (process.env.HEDERA_NETWORK as 'testnet' | 'mainnet' | 'previewnet' | 'local-node') ?? 'testnet', + operatorId: process.env.HEDERA_OPERATOR_ID ?? '0.0.5489553', + operatorKey: + process.env.HEDERA_OPERATOR_KEY ?? + '302e020100300506032b6570042204209f54b75b6238ced43e41b1463999cb40bf2f7dd2c9fd4fd3ef780027c016a138', }, ], }), diff --git a/packages/hedera/src/ledger/HederaLedgerService.ts b/packages/hedera/src/ledger/HederaLedgerService.ts index c694d7fc66..1f82379c5b 100644 --- a/packages/hedera/src/ledger/HederaLedgerService.ts +++ b/packages/hedera/src/ledger/HederaLedgerService.ts @@ -355,6 +355,7 @@ export class HederaLedgerService { return id.includes('#') ? `#${id.split('#').pop()}` : id } + // biome-ignore lint/suspicious/noExplicitAny: private getDiff(currentArray?: any[], newArray?: any[]) { const currentList = currentArray || [] const newList = newArray || [] @@ -370,6 +371,7 @@ export class HederaLedgerService { } private async signRequests( + // biome-ignore lint/suspicious/noExplicitAny: signingRequests: Record, kms: KeyManagementApi, keyId: string @@ -398,6 +400,7 @@ export class HederaLedgerService { 'keyAgreement', ] for (const field of fields) { + // biome-ignore lint/suspicious/noExplicitAny: const fieldValue = (didDocument as any)[field] if (fieldValue) { const fieldValues = Array.isArray(fieldValue) ? fieldValue : [fieldValue] @@ -412,6 +415,7 @@ export class HederaLedgerService { } } + // biome-ignore lint/suspicious/noExplicitAny: private prepareDidUpdates(currentDoc: any, newDoc: any, operation: string): DIDUpdateBuilder { const builder = new DIDUpdateBuilder() const fields = [ @@ -464,7 +468,9 @@ export class HederaLedgerService { builder: DIDUpdateBuilder, field: string, action: 'add' | 'remove' + // biome-ignore lint/suspicious/noExplicitAny: ): (item: any) => DIDUpdateBuilder { + // biome-ignore lint/suspicious/noExplicitAny: type MethodDelegate = (item: any) => DIDUpdateBuilder const methodMap: Record> = { diff --git a/packages/hedera/tests/integration/HederaAnoncredsRegistry.e2e.test.ts b/packages/hedera/tests/integration/HederaAnoncredsRegistry.e2e.test.ts index 667f1f7e7e..c12ea35edb 100644 --- a/packages/hedera/tests/integration/HederaAnoncredsRegistry.e2e.test.ts +++ b/packages/hedera/tests/integration/HederaAnoncredsRegistry.e2e.test.ts @@ -63,7 +63,7 @@ describe('Hedera AnonCreds support', () => { credentialDefinition: { tag: 'default', issuerId: did, - schemaId: schemaId!, + schemaId: schemaId, }, options: { supportRevocation: true, diff --git a/packages/hedera/tests/integration/HederaDidRegistrar.e2e.test.ts b/packages/hedera/tests/integration/HederaDidRegistrar.e2e.test.ts index 193c796b40..31ce111451 100644 --- a/packages/hedera/tests/integration/HederaDidRegistrar.e2e.test.ts +++ b/packages/hedera/tests/integration/HederaDidRegistrar.e2e.test.ts @@ -132,7 +132,6 @@ describe('Hedera DID registrar', () => { }) it('should create a did:hedera did document, add and remove service', async () => { - // create document const didResult = await agent.dids.create({ method: 'hedera', options: { @@ -141,11 +140,10 @@ describe('Hedera DID registrar', () => { }) expect(didResult).toMatchObject({ didState: { state: 'finished' } }) - const did = didResult.didState.did! + const did = didResult.didState.did ?? '' const didDocument = didResult.didState.didDocument as DidDocument didDocument.service = [validService()] - // add service to the document const addUpdateResult = await agent.dids.update({ did, didDocument, @@ -171,7 +169,6 @@ describe('Hedera DID registrar', () => { ]) ) - // remove service from the document const removeUpdateResult = await agent.dids.update({ did, didDocument: { @@ -206,20 +203,18 @@ describe('Hedera DID registrar', () => { }, ] - // create did document const didResult = await agent.dids.create({ method: 'hedera', options: { network: 'testnet' }, }) expect(didResult).toMatchObject({ didState: { state: 'finished' } }) - const did = didResult.didState.did! + const did = didResult.didState.did ?? '' const didDocument = didResult.didState.didDocument as DidDocument const validVerification = validVerificationMethod(multibasePublicKey) didDocument.verificationMethod = [validVerification] - // add verification method to the document const addUpdateResult = await agent.dids.update({ did, didDocument, @@ -247,7 +242,6 @@ describe('Hedera DID registrar', () => { ]) ) - // remove verification method from the document const removeUpdateResult = await agent.dids.update({ did, didDocument, @@ -276,20 +270,18 @@ describe('Hedera DID registrar', () => { }) const multibasePublicKey = getMultibasePublicKey(publicJwk) - // create did document const didResult = await agent.dids.create({ method: 'hedera', options: { network: 'testnet' }, }) expect(didResult).toMatchObject({ didState: { state: 'finished' } }) - const did = didResult.didState.did! + const did = didResult.didState.did ?? '' const didDocument = didResult.didState.didDocument as DidDocument const validVerification = validVerificationMethod(multibasePublicKey) didDocument.verificationMethod = [validVerification] - // add verification method to the document let updateResult = await agent.dids.update({ did, didDocument, @@ -301,7 +293,6 @@ describe('Hedera DID registrar', () => { 'Unable update DID: Key #key-1 from verificationMethod not found in keys' ) - // add assertion method to the document didDocument.verificationMethod = undefined didDocument.assertionMethod = [validVerification] @@ -316,7 +307,6 @@ describe('Hedera DID registrar', () => { 'Unable update DID: Key #key-1 from assertionMethod not found in keys' ) - // add authentication method to the document didDocument.assertionMethod = undefined didDocument.authentication = [validVerification] @@ -331,7 +321,6 @@ describe('Hedera DID registrar', () => { 'Unable update DID: Key #key-1 from authentication not found in keys' ) - // add authentication method to the document didDocument.authentication = undefined didDocument.capabilityDelegation = [validVerification] @@ -346,7 +335,6 @@ describe('Hedera DID registrar', () => { 'Unable update DID: Key #key-1 from capabilityDelegation not found in keys' ) - // add authentication method to the document didDocument.capabilityDelegation = undefined didDocument.capabilityInvocation = [validVerification] @@ -361,7 +349,6 @@ describe('Hedera DID registrar', () => { 'Unable update DID: Key #key-1 from capabilityInvocation not found in keys' ) - // add authentication method to the document didDocument.capabilityInvocation = undefined didDocument.keyAgreement = [validVerification] @@ -384,7 +371,7 @@ describe('Hedera DID registrar', () => { }) expect(didResult).toMatchObject({ didState: { state: 'finished' } }) - const did = didResult.didState.did! + const did = didResult.didState.did ?? '' const deactivateResult = await agent.dids.deactivate({ did, diff --git a/packages/hedera/tests/integration/HederaDidResolver.e2e.test.ts b/packages/hedera/tests/integration/HederaDidResolver.e2e.test.ts index c92aa547d7..c7169f6b48 100644 --- a/packages/hedera/tests/integration/HederaDidResolver.e2e.test.ts +++ b/packages/hedera/tests/integration/HederaDidResolver.e2e.test.ts @@ -28,7 +28,7 @@ describe('Hedera DID resolver', () => { await agent.shutdown() }) - it('should resolve a did:cheqd did from local testnet', async () => { + it('should resolve a did:hedera did from local testnet', async () => { const resolveResult = await agent.dids.resolve(did) expect(JsonTransformer.toJSON(resolveResult)).toMatchObject({ diff --git a/packages/hedera/tests/integration/utils/testCache.ts b/packages/hedera/tests/integration/utils/testCache.ts index 5df1c9d1b2..22249ef0d5 100644 --- a/packages/hedera/tests/integration/utils/testCache.ts +++ b/packages/hedera/tests/integration/utils/testCache.ts @@ -1,6 +1,7 @@ import type { AgentContext, Cache } from '@credo-ts/core' export class testCache implements Cache { + // biome-ignore lint/suspicious/noExplicitAny: private _cache: Map = new Map() get(_agentContext: AgentContext, key: string): Promise { diff --git a/packages/hedera/tests/unit/hedera-anoncres-registry.test.ts b/packages/hedera/tests/unit/hedera-anoncres-registry.test.ts index 6674326f59..a181c7bb62 100644 --- a/packages/hedera/tests/unit/hedera-anoncres-registry.test.ts +++ b/packages/hedera/tests/unit/hedera-anoncres-registry.test.ts @@ -34,6 +34,7 @@ const createMockAgentContext = () => describe('HederaAnonCredsRegistry', () => { let service: HederaAnonCredsRegistry let mockAgentContext: AgentContext + // biome-ignore lint/suspicious/noExplicitAny: let mockLedgerService: any beforeEach(() => { @@ -137,8 +138,18 @@ describe('HederaAnonCredsRegistry', () => { describe('registerCredentialDefinition', () => { const options: RegisterCredentialDefinitionOptions = { - credentialDefinition: { issuerId: 'did:hedera:issuer' }, - } as any + options: {}, + credentialDefinition: { + issuerId: 'did:hedera:issuer', + schemaId: '', + type: 'CL', + tag: '', + value: { + primary: {}, + revocation: undefined, + }, + }, + } it('should call ledgerService.registerCredentialDefinition and return result on success', async () => { const expected: RegisterCredentialDefinitionReturn = { @@ -223,8 +234,24 @@ describe('HederaAnonCredsRegistry', () => { describe('registerRevocationRegistryDefinition', () => { const options: RegisterRevocationRegistryDefinitionOptions = { - revocationRegistryDefinition: { credDefId: 'credDef1', issuerId: 'did:hedera:issuer' }, - } as any + options: {}, + revocationRegistryDefinition: { + credDefId: 'credDef1', + issuerId: 'did:hedera:issuer', + revocDefType: 'CL_ACCUM', + tag: '', + value: { + publicKeys: { + accumKey: { + z: '', + }, + }, + maxCredNum: 0, + tailsLocation: '', + tailsHash: '', + }, + }, + } it('should call ledgerService.registerRevocationRegistryDefinition and return result on success', async () => { const expected: RegisterRevocationRegistryDefinitionReturn = { @@ -318,8 +345,14 @@ describe('HederaAnonCredsRegistry', () => { describe('registerRevocationStatusList', () => { const options: RegisterRevocationStatusListOptions = { - revocationStatusList: { revRegDefId: 'regDef1', issuerId: 'did:hedera:issuer' }, - } as any + options: {}, + revocationStatusList: { + revRegDefId: 'regDef1', + issuerId: 'did:hedera:issuer', + revocationList: [], + currentAccumulator: '', + }, + } it('should call ledgerService.registerRevocationStatusList and return result on success', async () => { const expected: RegisterRevocationStatusListReturn = { diff --git a/packages/hedera/tests/unit/hedera-did-registrar.test.ts b/packages/hedera/tests/unit/hedera-did-registrar.test.ts index e26f90e5b4..d17a88ba6e 100644 --- a/packages/hedera/tests/unit/hedera-did-registrar.test.ts +++ b/packages/hedera/tests/unit/hedera-did-registrar.test.ts @@ -5,8 +5,11 @@ import { HederaDidUpdateOptions } from '../../src/ledger/HederaLedgerService' describe('HederaDidRegistrar', () => { let service: HederaDidRegistrar + // biome-ignore lint/suspicious/noExplicitAny: let mockAgentContext: any + // biome-ignore lint/suspicious/noExplicitAny: let mockDidRepository: any + // biome-ignore lint/suspicious/noExplicitAny: let mockLedgerService: any beforeEach(() => { @@ -30,6 +33,7 @@ describe('HederaDidRegistrar', () => { mockAgentContext = { dependencyManager: { + // biome-ignore lint/suspicious/noExplicitAny: resolve: jest.fn().mockImplementation((obj: any) => { if (obj.name === 'DidRepository') return mockDidRepository if (obj.name === 'HederaLedgerService') return mockLedgerService @@ -53,13 +57,10 @@ describe('HederaDidRegistrar', () => { mockLedgerService.createDid.mockResolvedValue({ did, didDocument, rootKey }) - const result = await service.create( - mockAgentContext as AgentContext, - { - method: 'hedera', - options: {}, - } as any - ) + const result = await service.create(mockAgentContext as AgentContext, { + method: 'hedera', + options: {}, + }) expect(mockDidRepository.save).toHaveBeenCalled() const savedRecord = mockDidRepository.save.mock.calls[0][1] @@ -76,13 +77,10 @@ describe('HederaDidRegistrar', () => { it('should handle error and return failed state', async () => { mockLedgerService.createDid.mockRejectedValue(new Error('Create failed')) - const result = await service.create( - mockAgentContext as AgentContext, - { - method: 'hedera', - options: {}, - } as any - ) + const result = await service.create(mockAgentContext as AgentContext, { + method: 'hedera', + options: {}, + }) expect(mockAgentContext.config.logger.debug).toHaveBeenCalledWith('Error creating DID', expect.any(Object)) @@ -149,9 +147,10 @@ describe('HederaDidRegistrar', () => { mockLedgerService.resolveDid.mockResolvedValue({ didDocument: null, didDocumentMetadata: { deactivated: true } }) mockDidRepository.findCreatedDid.mockResolvedValue(null) - const options = { + const options: HederaDidUpdateOptions = { did, - } as any + didDocument: {}, + } const result = await service.update(mockAgentContext as AgentContext, options) @@ -162,10 +161,11 @@ describe('HederaDidRegistrar', () => { it('should handle error and return failed state', async () => { mockLedgerService.resolveDid.mockRejectedValue(new Error('Update failed')) - const options = { + const options: HederaDidUpdateOptions = { did, didDocumentOperation: 'setDidDocument', - } as any + didDocument: {}, + } const result = await service.update(mockAgentContext as AgentContext, options) @@ -249,6 +249,7 @@ describe('HederaDidRegistrar', () => { const keys2 = [{ didDocumentRelativeKeyId: 'key2' }, { didDocumentRelativeKeyId: 'key3' }] as DidDocumentKey[] + // biome-ignore lint/suspicious/noExplicitAny: const result = (service as any).concatKeys(keys1, keys2) expect(result).toHaveLength(3) @@ -262,6 +263,7 @@ describe('HederaDidRegistrar', () => { }) it('should handle undefined arguments and return empty array', () => { + // biome-ignore lint/suspicious/noExplicitAny: const result = (service as any).concatKeys(undefined, undefined) expect(result).toEqual([]) }) diff --git a/packages/hedera/tests/unit/hedera-did-resolver.test.ts b/packages/hedera/tests/unit/hedera-did-resolver.test.ts index 0e9f2ae0fd..8128a7371e 100644 --- a/packages/hedera/tests/unit/hedera-did-resolver.test.ts +++ b/packages/hedera/tests/unit/hedera-did-resolver.test.ts @@ -4,7 +4,9 @@ import { HederaLedgerService } from '../../src/ledger/HederaLedgerService' describe('HederaDidResolver', () => { let resolver: HederaDidResolver + // biome-ignore lint/suspicious/noExplicitAny: let mockAgentContext: any + // biome-ignore lint/suspicious/noExplicitAny: let mockLedgerService: any beforeEach(() => { @@ -40,6 +42,7 @@ describe('HederaDidResolver', () => { jest.spyOn(JsonTransformer, 'fromJSON').mockReturnValue(fakeDidDocument as unknown as DidDocument) + // biome-ignore lint/suspicious/noExplicitAny: const result = await resolver.resolve(mockAgentContext, did, {} as any, {} as any) expect(mockAgentContext.config.logger.trace).toHaveBeenCalledWith('Try to resolve a did document from ledger') @@ -60,6 +63,7 @@ describe('HederaDidResolver', () => { mockLedgerService.resolveDid.mockRejectedValue(error) + // biome-ignore lint/suspicious/noExplicitAny: const result = await resolver.resolve(mockAgentContext, did, {} as any, {} as any) expect(mockAgentContext.config.logger.trace).toHaveBeenCalledWith('Try to resolve a did document from ledger') diff --git a/packages/hedera/tests/unit/hedera-ledger-service.test.ts b/packages/hedera/tests/unit/hedera-ledger-service.test.ts index 1468edfc1e..b359a4a627 100644 --- a/packages/hedera/tests/unit/hedera-ledger-service.test.ts +++ b/packages/hedera/tests/unit/hedera-ledger-service.test.ts @@ -9,7 +9,11 @@ import { AgentContext, DependencyManager } from '@credo-ts/core' import { DidDocumentKey, Kms } from '@credo-ts/core' import { KmsJwkPublicOkp } from '@credo-ts/core/src/modules/kms' import { Client } from '@hashgraph/sdk' -import { HederaDidCreateOptions, HederaLedgerService } from '../../src/ledger/HederaLedgerService' +import { + HederaDidCreateOptions, + HederaDidUpdateOptions, + HederaLedgerService, +} from '../../src/ledger/HederaLedgerService' jest.mock('@hiero-did-sdk/registrar', () => ({ DIDUpdateBuilder: jest.fn().mockReturnValue({ @@ -39,6 +43,7 @@ jest.mock('@hiero-did-sdk/registrar', () => ({ import { DIDUpdateBuilder, + UpdateDIDResult, generateCreateDIDRequest, generateDeactivateDIDRequest, generateUpdateDIDRequest, @@ -115,8 +120,10 @@ describe('HederaLedgerService', () => { }, }) - jest.spyOn(service.clientService, 'withClient').mockImplementation(async (_props, operation) => { + // biome-ignore lint/suspicious/noExplicitAny: + jest.spyOn((service as any).clientService, 'withClient').mockImplementation(async (_props, operation) => { const mockClient = {} as Client + // @ts-ignore return operation(mockClient) }) }) @@ -126,7 +133,6 @@ describe('HederaLedgerService', () => { const did = 'did:hedera:test' const mockResolution = { didDocument: { id: did } } - ;(resolveDID as jest.Mock).mockResolvedValue(mockResolution) const result = await service.resolveDid(mockAgentContext as AgentContext, did) @@ -151,19 +157,18 @@ describe('HederaLedgerService', () => { } mockedCreateOrGetKey.mockResolvedValue({ keyId, publicJwk }) - ;(generateCreateDIDRequest as jest.Mock).mockResolvedValue({ state: {}, signingRequest: { serializedPayload: new Uint8Array() }, }) - ;(submitCreateDIDRequest as jest.Mock).mockResolvedValue({ did: 'did:hedera:1234' }) + // biome-ignore lint/suspicious/noExplicitAny: jest.spyOn(service as any, 'getPublisher').mockResolvedValue({} as Publisher) mockKms.sign.mockResolvedValue({ signature: new Uint8Array([1, 2, 3]) }) - const result = await service.createDid(mockAgentContext as AgentContext, props as any) + const result = await service.createDid(mockAgentContext as AgentContext, props) expect(createOrGetKey).toHaveBeenCalledWith(mockKms, keyId) expect(generateCreateDIDRequest).toHaveBeenCalled() expect(submitCreateDIDRequest).toHaveBeenCalled() @@ -183,23 +188,25 @@ describe('HederaLedgerService', () => { } mockedCreateOrGetKey.mockResolvedValue({ keyId, publicJwk }) - ;(generateCreateDIDRequest as jest.Mock).mockResolvedValue({ state: {}, signingRequest: { serializedPayload: new Uint8Array() }, }) - ;(submitCreateDIDRequest as jest.Mock).mockResolvedValue({ did: 'did:hedera:1234' }) const updateDidSpy = jest .spyOn(service, 'updateDid') - .mockResolvedValue({ did: 'did:hedera:1234', someProp: true } as any) + .mockResolvedValue({ did: 'did:hedera:1234' } as unknown as UpdateDIDResult) + // biome-ignore lint/suspicious/noExplicitAny: jest.spyOn(service as any, 'getPublisher').mockResolvedValue({} as Publisher) mockKms.sign.mockResolvedValue({ signature: new Uint8Array([1, 2, 3]) }) - const result = await service.createDid(mockAgentContext as AgentContext, props as any) + const result = await service.createDid( + mockAgentContext as AgentContext, + props as unknown as HederaDidCreateOptions + ) expect(updateDidSpy).toHaveBeenCalled() expect(result.rootKey).toBeDefined() }) @@ -210,9 +217,9 @@ describe('HederaLedgerService', () => { const kmsKeyId = 'key-id' it('should throws error if didDocumentOperation is missing', async () => { - await expect(service.updateDid(mockAgentContext as AgentContext, { did } as any)).rejects.toThrow( - 'DidDocumentOperation is required' - ) + await expect( + service.updateDid(mockAgentContext as AgentContext, { did } as HederaDidUpdateOptions) + ).rejects.toThrow('DidDocumentOperation is required') }) it('should throws error if rootKey missing', async () => { @@ -271,6 +278,7 @@ describe('HederaLedgerService', () => { for (const [field, action, param, spy] of testCases) { jest.clearAllMocks() + // biome-ignore lint/suspicious/noExplicitAny: const fn = (service as any).getUpdateMethod(builder, field, action) const result = fn(param) @@ -286,6 +294,7 @@ describe('HederaLedgerService', () => { it('should returns builder unchanged for unknown field', () => { const unknownField = 'unknownField' + // biome-ignore lint/suspicious/noExplicitAny: const fn = (service as any).getUpdateMethod(builder, unknownField, 'add') const result = fn('any param') expect(result).toBe(builder) @@ -309,7 +318,7 @@ describe('HederaLedgerService', () => { const currentDidDoc = { verificationMethod: [{ id: '#abc' }] } const mockDidResolution = { didDocument: currentDidDoc } - const updatesMock = { build: jest.fn().mockReturnValue(didDocument) } as any + const updatesMock = { build: jest.fn().mockReturnValue(didDocument) } mockedParseDID.mockReturnValue({ network: 'testnet', @@ -317,17 +326,17 @@ describe('HederaLedgerService', () => { publicKey: '', topicId: '', }) - ;(resolveDID as jest.Mock).mockResolvedValue(mockDidResolution) + // biome-ignore lint/suspicious/noExplicitAny: jest.spyOn(service as any, 'prepareDidUpdates').mockReturnValue(updatesMock) + // biome-ignore lint/suspicious/noExplicitAny: jest.spyOn(service as any, 'getPublisher').mockResolvedValue({} as Publisher) - ;(generateUpdateDIDRequest as jest.Mock).mockResolvedValue({ states: {}, signingRequests: {} }) + // biome-ignore lint/suspicious/noExplicitAny: jest.spyOn(service as any, 'signRequests').mockResolvedValue(Promise.resolve()) - ;(submitUpdateDIDRequest as jest.Mock).mockResolvedValue({ did: did }) await expect( @@ -339,6 +348,7 @@ describe('HederaLedgerService', () => { }) ).resolves.toHaveProperty('did', did) + // biome-ignore lint/suspicious/noExplicitAny: expect((service as any).prepareDidUpdates).toHaveBeenCalled() expect(generateUpdateDIDRequest).toHaveBeenCalled() expect(submitUpdateDIDRequest).toHaveBeenCalled() @@ -351,7 +361,7 @@ describe('HederaLedgerService', () => { it('should throws error if rootKey is missing', async () => { await expect( - service.deactivateDid(mockAgentContext as AgentContext, { did, secret: { keys: [] } } as any) + service.deactivateDid(mockAgentContext as AgentContext, { did, secret: { keys: [] } }) ).rejects.toThrow('The root key not found in the KMS') }) @@ -377,25 +387,21 @@ describe('HederaLedgerService', () => { const mockState = {} const mockSigningRequest = { serializedPayload: new Uint8Array() } const signature = new Uint8Array([1, 2, 3]) - ;(parseDID as jest.Mock).mockReturnValue({ network: 'testnet' }) + // biome-ignore lint/suspicious/noExplicitAny: jest.spyOn(service as any, 'getPublisher').mockResolvedValue(mockPublisher) // @ts-ignore mockedGenerateDeactivateDIDRequest.mockResolvedValue({ state: mockState, signingRequest: mockSigningRequest }) mockKms.sign.mockResolvedValue({ signature }) - ;(submitDeactivateDIDRequest as jest.Mock).mockResolvedValue({ did }) - const result = await service.deactivateDid( - mockAgentContext as AgentContext, - { - did, - secret: { keys }, - } as any - ) + const result = await service.deactivateDid(mockAgentContext as AgentContext, { + did, + secret: { keys }, + }) expect(result).toHaveProperty('did', did) expect(mockKms.sign).toHaveBeenCalledWith({ @@ -407,6 +413,7 @@ describe('HederaLedgerService', () => { }) describe('Anoncreds SDK methods', () => { + // biome-ignore lint/suspicious/noExplicitAny: let mockSdk: any beforeEach(() => { @@ -420,6 +427,7 @@ describe('HederaLedgerService', () => { getRevocationStatusList: jest.fn().mockResolvedValue('revStatusList'), registerRevocationStatusList: jest.fn().mockResolvedValue('registerRevStatus'), } + // biome-ignore lint/suspicious/noExplicitAny: jest.spyOn(service as any, 'getHederaAnonCredsSdk').mockReturnValue(mockSdk) }) diff --git a/packages/hedera/tests/unit/kms-publisher.test.ts b/packages/hedera/tests/unit/kms-publisher.test.ts index ab5aea1bca..e76a8a59a8 100644 --- a/packages/hedera/tests/unit/kms-publisher.test.ts +++ b/packages/hedera/tests/unit/kms-publisher.test.ts @@ -1,4 +1,4 @@ -import { Kms, TypedArrayEncoder } from '@credo-ts/core' +import { AgentContext, Kms, TypedArrayEncoder } from '@credo-ts/core' import { KmsJwkPublicOkp } from '@credo-ts/core/src/modules/kms' import { KeysUtility } from '@hiero-did-sdk/core' import { KmsPublisher } from '../../src/ledger/publisher/KmsPublisher' @@ -23,6 +23,7 @@ jest.mock('../../src/ledger/utils', () => ({ createOrGetKey: jest.fn(), })) +import { Transaction } from '@hashgraph/sdk' import { createOrGetKey } from '../../src/ledger/utils' jest.mock('@hiero-did-sdk/publisher-internal', () => { @@ -98,6 +99,7 @@ describe('KmsPublisher', () => { }) it('should correctly create an instance via constructor', () => { + // biome-ignore lint/suspicious/noExplicitAny: const publisher = new KmsPublisher(agentContext as any, mockClient as any, key) expect(agentContext.dependencyManager.resolve).toHaveBeenCalledWith(expect.anything()) expect(publisher.publicKey()).toBe(fakePublicKey) @@ -108,7 +110,8 @@ describe('KmsPublisher', () => { publicJwk: { x: base64X, crv: 'Ed25519' }, }) - const publisher = new KmsPublisher(agentContext as any, mockClient as any, key) + // biome-ignore lint/suspicious/noExplicitAny: + const publisher = new KmsPublisher(agentContext as unknown as AgentContext, mockClient as any, key) await publisher.setKeyId('new-key-id') expect(createOrGetKey).toHaveBeenCalledWith(kmsMock, 'new-key-id') @@ -116,14 +119,17 @@ describe('KmsPublisher', () => { }) it('should return correct publicKey', () => { - const publisher = new KmsPublisher(agentContext as any, mockClient as any, key) + // biome-ignore lint/suspicious/noExplicitAny: + const publisher = new KmsPublisher(agentContext as unknown as AgentContext, mockClient as any, key) expect(publisher.publicKey()).toBe(fakePublicKey) }) it('should throw error in publish if key is not set', async () => { - const publisher = new KmsPublisher(agentContext as any, mockClient as any, key) + // biome-ignore lint/suspicious/noExplicitAny: + const publisher = new KmsPublisher(agentContext as unknown as AgentContext, mockClient as any, key) + // biome-ignore lint/suspicious/noExplicitAny: ;(publisher as any).submitPublicKey = undefined - await expect(publisher.publish({} as any)).rejects.toThrow('Need to setup the KeyId') + await expect(publisher.publish({} as unknown as Transaction)).rejects.toThrow('Need to setup the KeyId') }) }) From e5f9528c51c6f6f21c0126dfd0b78063bd1757c7 Mon Sep 17 00:00:00 2001 From: "andrey.kononov" Date: Thu, 14 Aug 2025 18:58:27 +0300 Subject: [PATCH 71/89] - fix: add hedera anoncreds registry support to the demo --- demo/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/demo/package.json b/demo/package.json index 17cc3b3caf..cbe797f013 100644 --- a/demo/package.json +++ b/demo/package.json @@ -1,6 +1,6 @@ { "name": "credo-demo", - "version": "1.0.0", + "version": "1.0.1", "private": true, "repository": { "type": "git", From 10a7fa12c70078217d2cf4335d98c2c8c826264d Mon Sep 17 00:00:00 2001 From: "andrey.kononov" Date: Thu, 14 Aug 2025 19:14:53 +0300 Subject: [PATCH 72/89] Fix the github action for hedera e2e tests support --- .github/workflows/continuous-integration.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/continuous-integration.yml b/.github/workflows/continuous-integration.yml index f4db74d324..3261d69c2d 100644 --- a/.github/workflows/continuous-integration.yml +++ b/.github/workflows/continuous-integration.yml @@ -142,6 +142,12 @@ jobs: run: pnpm install --frozen-lockfile - name: Run tests + timeout-minutes: 15 + env: + # HEDERA_OPERATOR_ID: ${{ secrets.HEDERA_OPERATOR_ID }} + # HEDERA_OPERATOR_KEY: ${{ secrets.HEDERA_OPERATOR_KEY }} + HEDERA_OPERATOR_ID: '0.0.5489553' + HEDERA_OPERATOR_KEY: '302e020100300506032b6570042204209f54b75b6238ced43e41b1463999cb40bf2f7dd2c9fd4fd3ef780027c016a138' run: pnpm test:e2e --coverage --forceExit # Upload coverage for e2e From d78d6bc2a9744b2a5870a55a85457f7e78380066 Mon Sep 17 00:00:00 2001 From: "andrey.kononov" Date: Thu, 14 Aug 2025 19:21:36 +0300 Subject: [PATCH 73/89] Restart github actions --- packages/hedera/tests/unit/hedera-did-registrar.test.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/hedera/tests/unit/hedera-did-registrar.test.ts b/packages/hedera/tests/unit/hedera-did-registrar.test.ts index d17a88ba6e..52b33083d5 100644 --- a/packages/hedera/tests/unit/hedera-did-registrar.test.ts +++ b/packages/hedera/tests/unit/hedera-did-registrar.test.ts @@ -1,4 +1,5 @@ import type { AgentContext, DidDocumentKey } from '@credo-ts/core' + import { DidDocumentRole } from '@credo-ts/core' import { HederaDidRegistrar } from '@credo-ts/hedera' import { HederaDidUpdateOptions } from '../../src/ledger/HederaLedgerService' From ebc359132544e88659d4efe56f60306eaacfa364 Mon Sep 17 00:00:00 2001 From: "andrey.kononov" Date: Thu, 14 Aug 2025 19:22:28 +0300 Subject: [PATCH 74/89] Restart github actions --- .github/workflows/continuous-integration.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/continuous-integration.yml b/.github/workflows/continuous-integration.yml index 3261d69c2d..68283a099e 100644 --- a/.github/workflows/continuous-integration.yml +++ b/.github/workflows/continuous-integration.yml @@ -144,10 +144,10 @@ jobs: - name: Run tests timeout-minutes: 15 env: - # HEDERA_OPERATOR_ID: ${{ secrets.HEDERA_OPERATOR_ID }} - # HEDERA_OPERATOR_KEY: ${{ secrets.HEDERA_OPERATOR_KEY }} - HEDERA_OPERATOR_ID: '0.0.5489553' - HEDERA_OPERATOR_KEY: '302e020100300506032b6570042204209f54b75b6238ced43e41b1463999cb40bf2f7dd2c9fd4fd3ef780027c016a138' + # HEDERA_OPERATOR_ID: ${{ secrets.HEDERA_OPERATOR_ID }} + # HEDERA_OPERATOR_KEY: ${{ secrets.HEDERA_OPERATOR_KEY }} + HEDERA_OPERATOR_ID: '0.0.5489553' + HEDERA_OPERATOR_KEY: '302e020100300506032b6570042204209f54b75b6238ced43e41b1463999cb40bf2f7dd2c9fd4fd3ef780027c016a138' run: pnpm test:e2e --coverage --forceExit # Upload coverage for e2e From 96e34bd67ee7c48e8fbcae9f8c4fb091faf3d5aa Mon Sep 17 00:00:00 2001 From: "andrey.kononov" Date: Thu, 14 Aug 2025 19:42:40 +0300 Subject: [PATCH 75/89] Set timeout directly to Hedera e2e tests --- .../tests/integration/HederaAnoncredsRegistry.e2e.test.ts | 2 ++ .../hedera/tests/integration/HederaDidRegistrar.e2e.test.ts | 2 ++ packages/hedera/tests/integration/HederaDidResolver.e2e.test.ts | 2 ++ 3 files changed, 6 insertions(+) diff --git a/packages/hedera/tests/integration/HederaAnoncredsRegistry.e2e.test.ts b/packages/hedera/tests/integration/HederaAnoncredsRegistry.e2e.test.ts index c12ea35edb..267c134aae 100644 --- a/packages/hedera/tests/integration/HederaAnoncredsRegistry.e2e.test.ts +++ b/packages/hedera/tests/integration/HederaAnoncredsRegistry.e2e.test.ts @@ -3,6 +3,8 @@ import { HederaDidCreateOptions } from '../../src/ledger/HederaLedgerService' import { getHederaAgent, testCache } from './utils' describe('Hedera AnonCreds support', () => { + jest.setTimeout(100000) + let agent: Agent let did: string diff --git a/packages/hedera/tests/integration/HederaDidRegistrar.e2e.test.ts b/packages/hedera/tests/integration/HederaDidRegistrar.e2e.test.ts index 31ce111451..e92afe326c 100644 --- a/packages/hedera/tests/integration/HederaDidRegistrar.e2e.test.ts +++ b/packages/hedera/tests/integration/HederaDidRegistrar.e2e.test.ts @@ -12,6 +12,8 @@ import { getMultibasePublicKey } from '../../src/ledger/utils' import { getHederaAgent } from './utils' describe('Hedera DID registrar', () => { + jest.setTimeout(100000) + const logger = new ConsoleLogger(LogLevel.error) let agent: Agent diff --git a/packages/hedera/tests/integration/HederaDidResolver.e2e.test.ts b/packages/hedera/tests/integration/HederaDidResolver.e2e.test.ts index c7169f6b48..675a7f8161 100644 --- a/packages/hedera/tests/integration/HederaDidResolver.e2e.test.ts +++ b/packages/hedera/tests/integration/HederaDidResolver.e2e.test.ts @@ -3,6 +3,8 @@ import { HederaDidCreateOptions } from '../../src/ledger/HederaLedgerService' import { getHederaAgent } from './utils' describe('Hedera DID resolver', () => { + jest.setTimeout(100000) + const logger = new ConsoleLogger(LogLevel.error) let agent: Agent From c6b344cd22b956bf699cda4427c2e076903ee6db Mon Sep 17 00:00:00 2001 From: "andrey.kononov" Date: Thu, 14 Aug 2025 20:04:28 +0300 Subject: [PATCH 76/89] Use secrets for HEDERA_OPERATOR_*** env variables --- .github/workflows/continuous-integration.yml | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/.github/workflows/continuous-integration.yml b/.github/workflows/continuous-integration.yml index 68283a099e..04bc467e49 100644 --- a/.github/workflows/continuous-integration.yml +++ b/.github/workflows/continuous-integration.yml @@ -142,12 +142,9 @@ jobs: run: pnpm install --frozen-lockfile - name: Run tests - timeout-minutes: 15 env: - # HEDERA_OPERATOR_ID: ${{ secrets.HEDERA_OPERATOR_ID }} - # HEDERA_OPERATOR_KEY: ${{ secrets.HEDERA_OPERATOR_KEY }} - HEDERA_OPERATOR_ID: '0.0.5489553' - HEDERA_OPERATOR_KEY: '302e020100300506032b6570042204209f54b75b6238ced43e41b1463999cb40bf2f7dd2c9fd4fd3ef780027c016a138' + HEDERA_OPERATOR_ID: ${{ secrets.HEDERA_OPERATOR_ID }} + HEDERA_OPERATOR_KEY: ${{ secrets.HEDERA_OPERATOR_KEY }} run: pnpm test:e2e --coverage --forceExit # Upload coverage for e2e From eff5d30628ca7e114ba342d5f38d0b0ea81d6672 Mon Sep 17 00:00:00 2001 From: "andrey.kononov" Date: Thu, 14 Aug 2025 20:34:11 +0300 Subject: [PATCH 77/89] Update readme --- README.md | 10 +++++++++- packages/hedera/CHANGELOG.md | 2 +- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 623189bb5b..fd8744ae33 100644 --- a/README.md +++ b/README.md @@ -51,7 +51,7 @@ See [Supported Features](https://credo.js.org/guides/features) on the Credo webs - 🏃 **Platform agnostic** - out of the box support for Node.JS and React Native - 🔒 **DIDComm and AIP** - Support for [DIDComm v1](https://hyperledger.github.io/aries-rfcs/latest/concepts/0005-didcomm/), and both v1 and v2 of the [Aries Interop Profile](https://github.com/hyperledger/aries-rfcs/blob/main/concepts/0302-aries-interop-profile/README.md). -- 🛂 **Extendable [DID](https://www.w3.org/TR/did-core/) resolver and registrar** - out of the box support for `did:web`, `did:key`, `did:jwk`, `did:peer`, `did:sov`, `did:indy` and `did:cheqd`. +- 🛂 **Extendable [DID](https://www.w3.org/TR/did-core/) resolver and registrar** - out of the box support for `did:web`, `did:key`, `did:jwk`, `did:peer`, `did:sov`, `did:indy`, `did:cheqd` and `did:hedera`. - 🔑 **[OpenID4VC](https://openid.net/sg/openid4vc/)** - support for [OpenID for Verifiable Credential Issuance](https://openid.net/specs/openid-4-verifiable-credential-issuance-1_0.html), [OpenID for Verifiable Presentations](https://openid.net/specs/openid-4-verifiable-presentations-1_0.html) and [Self-Issued OpenID Provider v2](https://openid.net/specs/openid-connect-self-issued-v2-1_0.html). - 🪪 **Multiple credential formats** - [W3C Verifiable Credential Data Model v1.1](https://www.w3.org/TR/vc-data-model/), [SD-JWT VCs](https://www.ietf.org/archive/id/draft-ietf-oauth-sd-jwt-vc-03.html), and [AnonCreds](https://hyperledger.github.io/anoncreds-spec/). - 🏢 **Multi-tenant** - Optional multi-tenant module for managing multiple tenants under a single agent. @@ -158,6 +158,14 @@ See [Supported Features](https://credo.js.org/guides/features) on the Credo webs + + @credo-ts/hedera + + + @credo-ts/hedera version + + + @aries-framework/indy-sdk (deprecated, unmaintained after 0.4.x) diff --git a/packages/hedera/CHANGELOG.md b/packages/hedera/CHANGELOG.md index 62e74296bd..cb65216ef8 100644 --- a/packages/hedera/CHANGELOG.md +++ b/packages/hedera/CHANGELOG.md @@ -1,6 +1,6 @@ # Changelog -## 0.0.1 +## 0.5.13 ### Patch Changes From 05b79d64b68379cb04aa76bf974745c7a4b9fb3c Mon Sep 17 00:00:00 2001 From: "andrey.kononov" Date: Thu, 14 Aug 2025 20:42:08 +0300 Subject: [PATCH 78/89] Set test timeout for all tests over setup.ts --- packages/hedera/jest.config.ts | 2 +- .../tests/integration/HederaAnoncredsRegistry.e2e.test.ts | 2 -- .../hedera/tests/integration/HederaDidRegistrar.e2e.test.ts | 2 -- packages/hedera/tests/integration/HederaDidResolver.e2e.test.ts | 2 -- packages/hedera/tests/setup.ts | 1 + 5 files changed, 2 insertions(+), 7 deletions(-) create mode 100644 packages/hedera/tests/setup.ts diff --git a/packages/hedera/jest.config.ts b/packages/hedera/jest.config.ts index 80d2dc3106..d91513a189 100644 --- a/packages/hedera/jest.config.ts +++ b/packages/hedera/jest.config.ts @@ -6,8 +6,8 @@ import packageJson from './package.json' const config: Config.InitialOptions = { ...base, - testTimeout: 100000, displayName: packageJson.name, + setupFilesAfterEnv: ['./tests/setup.ts'], coveragePathIgnorePatterns: ['../tests'], } diff --git a/packages/hedera/tests/integration/HederaAnoncredsRegistry.e2e.test.ts b/packages/hedera/tests/integration/HederaAnoncredsRegistry.e2e.test.ts index 267c134aae..c12ea35edb 100644 --- a/packages/hedera/tests/integration/HederaAnoncredsRegistry.e2e.test.ts +++ b/packages/hedera/tests/integration/HederaAnoncredsRegistry.e2e.test.ts @@ -3,8 +3,6 @@ import { HederaDidCreateOptions } from '../../src/ledger/HederaLedgerService' import { getHederaAgent, testCache } from './utils' describe('Hedera AnonCreds support', () => { - jest.setTimeout(100000) - let agent: Agent let did: string diff --git a/packages/hedera/tests/integration/HederaDidRegistrar.e2e.test.ts b/packages/hedera/tests/integration/HederaDidRegistrar.e2e.test.ts index e92afe326c..31ce111451 100644 --- a/packages/hedera/tests/integration/HederaDidRegistrar.e2e.test.ts +++ b/packages/hedera/tests/integration/HederaDidRegistrar.e2e.test.ts @@ -12,8 +12,6 @@ import { getMultibasePublicKey } from '../../src/ledger/utils' import { getHederaAgent } from './utils' describe('Hedera DID registrar', () => { - jest.setTimeout(100000) - const logger = new ConsoleLogger(LogLevel.error) let agent: Agent diff --git a/packages/hedera/tests/integration/HederaDidResolver.e2e.test.ts b/packages/hedera/tests/integration/HederaDidResolver.e2e.test.ts index 675a7f8161..c7169f6b48 100644 --- a/packages/hedera/tests/integration/HederaDidResolver.e2e.test.ts +++ b/packages/hedera/tests/integration/HederaDidResolver.e2e.test.ts @@ -3,8 +3,6 @@ import { HederaDidCreateOptions } from '../../src/ledger/HederaLedgerService' import { getHederaAgent } from './utils' describe('Hedera DID resolver', () => { - jest.setTimeout(100000) - const logger = new ConsoleLogger(LogLevel.error) let agent: Agent diff --git a/packages/hedera/tests/setup.ts b/packages/hedera/tests/setup.ts new file mode 100644 index 0000000000..cc76304a17 --- /dev/null +++ b/packages/hedera/tests/setup.ts @@ -0,0 +1 @@ +jest.setTimeout(100000) From 92cc31e4f2846a43bc955a29b5132bd4388deb37 Mon Sep 17 00:00:00 2001 From: "andrey.kononov" Date: Mon, 18 Aug 2025 19:16:52 +0300 Subject: [PATCH 79/89] Fix PR review notes --- demo/package.json | 7 +++--- demo/src/BaseAgent.ts | 10 ++++---- demo/src/Faber.ts | 6 ++--- .../hedera/src/dids/HederaDidRegistrar.ts | 10 ++------ .../hedera/src/ledger/HederaLedgerService.ts | 22 ++++++++--------- .../hedera/src/ledger/cache/CredoCache.ts | 13 ++++------ .../HederaAnoncredsRegistry.e2e.test.ts | 2 +- .../HederaDidRegistrar.e2e.test.ts | 2 +- .../integration/HederaDidResolver.e2e.test.ts | 2 +- .../tests/integration/utils/hederaModule.ts | 5 ++-- .../hedera/tests/unit/credo-cache.test.ts | 4 ++-- .../tests/unit/hedera-did-registrar.test.ts | 4 ++-- .../tests/unit/hedera-ledger-service.test.ts | 24 +++++++++---------- packages/hedera/tests/unit/utils.test.ts | 8 +++---- packages/hedera/tsconfig.json | 2 +- pnpm-lock.yaml | 5 +++- 16 files changed, 59 insertions(+), 67 deletions(-) diff --git a/demo/package.json b/demo/package.json index cbe797f013..2cccc60ec5 100644 --- a/demo/package.json +++ b/demo/package.json @@ -1,6 +1,6 @@ { "name": "credo-demo", - "version": "1.0.1", + "version": "1.0.0", "private": true, "repository": { "type": "git", @@ -13,18 +13,19 @@ "faber": "ts-node src/FaberInquirer.ts" }, "dependencies": { - "@hyperledger/indy-vdr-nodejs": "catalog:", + "@hiero-did-sdk/client": "0.1.0", "@hyperledger/anoncreds-nodejs": "catalog:", + "@hyperledger/indy-vdr-nodejs": "catalog:", "@openwallet-foundation/askar-nodejs": "catalog:", "inquirer": "^8.2.5" }, "devDependencies": { "@credo-ts/anoncreds": "workspace:*", "@credo-ts/askar": "workspace:*", + "@credo-ts/cheqd": "workspace:*", "@credo-ts/core": "workspace:*", "@credo-ts/didcomm": "workspace:*", "@credo-ts/indy-vdr": "workspace:*", - "@credo-ts/cheqd": "workspace:*", "@credo-ts/node": "workspace:*", "@types/figlet": "^1.5.4", "@types/inquirer": "^8.2.6", diff --git a/demo/src/BaseAgent.ts b/demo/src/BaseAgent.ts index ddad42b052..837b79722a 100644 --- a/demo/src/BaseAgent.ts +++ b/demo/src/BaseAgent.ts @@ -1,7 +1,3 @@ -import type { InitConfig } from '@credo-ts/core' -import type { DidCommModuleConfigOptions } from '@credo-ts/didcomm' -import type { IndyVdrPoolConfig } from '@credo-ts/indy-vdr' - import { AnonCredsCredentialFormatService, AnonCredsModule, @@ -19,7 +15,9 @@ import { CheqdModule, CheqdModuleConfig, } from '@credo-ts/cheqd' +import type { InitConfig } from '@credo-ts/core' import { Agent, DidsModule } from '@credo-ts/core' +import type { DidCommModuleConfigOptions } from '@credo-ts/didcomm' import { AutoAcceptCredential, AutoAcceptProof, @@ -31,8 +29,10 @@ import { V2ProofProtocol, getDefaultDidcommModules, } from '@credo-ts/didcomm' +import type { IndyVdrPoolConfig } from '@credo-ts/indy-vdr' import { IndyVdrAnonCredsRegistry, IndyVdrIndyDidResolver, IndyVdrModule } from '@credo-ts/indy-vdr' import { HttpInboundTransport, agentDependencies } from '@credo-ts/node' +import { HederaNetwork } from '@hiero-did-sdk/client' import { anoncreds } from '@hyperledger/anoncreds-nodejs' import { indyVdr } from '@hyperledger/indy-vdr-nodejs' import { askar } from '@openwallet-foundation/askar-nodejs' @@ -151,7 +151,7 @@ function getAskarAnonCredsIndyModules( hedera: new HederaModule({ networks: [ { - network: (process.env.HEDERA_NETWORK as 'testnet' | 'mainnet' | 'previewnet' | 'local-node') ?? 'testnet', + network: (process.env.HEDERA_NETWORK as HederaNetwork) ?? 'testnet', operatorId: process.env.HEDERA_OPERATOR_ID ?? '0.0.5489553', operatorKey: process.env.HEDERA_OPERATOR_KEY ?? diff --git a/demo/src/Faber.ts b/demo/src/Faber.ts index 4179026e62..0ea91b03d7 100644 --- a/demo/src/Faber.ts +++ b/demo/src/Faber.ts @@ -17,8 +17,6 @@ export enum RegistryOptions { hedera = 'did:hedera', } -type Extensible = Record - export class Faber extends BaseAgent { public outOfBandId?: string public credentialDefinition?: RegisterCredentialDefinitionReturnStateFinished @@ -42,13 +40,13 @@ export class Faber extends BaseAgent { // indy did is based on private key (seed) const unqualifiedIndyDid = '2jEvRuKmfBJTRa7QowDpNN' - const rootKeyIds: Extensible = { + const rootKeyIds: Record = { [RegistryOptions.indy]: '#verkey', [RegistryOptions.cheqd]: '#key-1', [RegistryOptions.hedera]: '#did-root-key', } - const Dids: Extensible = { + const Dids: Record = { [RegistryOptions.indy]: `did:indy:${indyNetworkConfig.indyNamespace}:${unqualifiedIndyDid}`, [RegistryOptions.cheqd]: 'did:cheqd:testnet:d37eba59-513d-42d3-8f9f-d1df0548b675', [RegistryOptions.hedera]: 'did:hedera:testnet:44eesExqdsUvLZ35FpnBPErqRGRnYbzzyG3wgCCYxkmq_0.0.6231121', diff --git a/packages/hedera/src/dids/HederaDidRegistrar.ts b/packages/hedera/src/dids/HederaDidRegistrar.ts index fdbcbba9ba..f68a5a234a 100644 --- a/packages/hedera/src/dids/HederaDidRegistrar.ts +++ b/packages/hedera/src/dids/HederaDidRegistrar.ts @@ -27,10 +27,8 @@ export class HederaDidRegistrar implements DidRegistrar { const didRepository = agentContext.dependencyManager.resolve(DidRepository) const ledgerService = agentContext.dependencyManager.resolve(HederaLedgerService) - // Create did const { did, didDocument, rootKey } = await ledgerService.createDid(agentContext, options) - // Save the did to wallet const credoDidDocument = new DidDocument({ ...didDocument, service: didDocument.service?.map((s) => new DidDocumentService(s)), @@ -89,14 +87,12 @@ export class HederaDidRegistrar implements DidRegistrar { } } - // Update did const keys = this.concatKeys(didRecord.keys, options.secret?.keys) const { didDocument: updatedDidDocument } = await ledgerService.updateDid(agentContext, { ...options, secret: { keys }, }) - // Save the did to wallet didRecord.didDocument = JsonTransformer.fromJSON(updatedDidDocument, DidDocument) didRecord.keys = keys await didRepository.update(agentContext, didRecord) @@ -111,7 +107,7 @@ export class HederaDidRegistrar implements DidRegistrar { }, } } catch (error) { - agentContext.config.logger.error('Error update DID', error) + agentContext.config.logger.error('Error updating DID', error) return { didDocumentMetadata: {}, didRegistrationMetadata: {}, @@ -147,13 +143,11 @@ export class HederaDidRegistrar implements DidRegistrar { }, } } - // Deactivate did const { didDocument: deactivatedDidDocument } = await ledgerService.deactivateDid(agentContext, { ...options, secret: { keys: didRecord.keys }, }) - // Save the did to wallet didRecord.didDocument = JsonTransformer.fromJSON(deactivatedDidDocument, DidDocument) await didRepository.update(agentContext, didRecord) @@ -167,7 +161,7 @@ export class HederaDidRegistrar implements DidRegistrar { }, } } catch (error) { - agentContext.config.logger.error('Error deactivate DID', error) + agentContext.config.logger.error('Error deactivating DID', error) return { didDocumentMetadata: {}, didRegistrationMetadata: {}, diff --git a/packages/hedera/src/ledger/HederaLedgerService.ts b/packages/hedera/src/ledger/HederaLedgerService.ts index 1f82379c5b..a66452a097 100644 --- a/packages/hedera/src/ledger/HederaLedgerService.ts +++ b/packages/hedera/src/ledger/HederaLedgerService.ts @@ -158,7 +158,7 @@ export class HederaLedgerService { } // Check root key presents - const rootKey = (secret?.keys ?? []).find((k) => k.didDocumentRelativeKeyId === DID_ROOT_KEY_ID) + const rootKey = secret?.keys?.find((k) => k.didDocumentRelativeKeyId === DID_ROOT_KEY_ID) if (!rootKey?.kmsKeyId) { throw new Error('The root key not found in the KMS') } @@ -222,7 +222,7 @@ export class HederaLedgerService { const kms = agentContext.dependencyManager.resolve(Kms.KeyManagementApi) - const rootKey = (secret?.keys ?? []).find((k) => k.didDocumentRelativeKeyId === DID_ROOT_KEY_ID) + const rootKey = secret?.keys?.find((k) => k.didDocumentRelativeKeyId === DID_ROOT_KEY_ID) if (!rootKey?.kmsKeyId) { throw new Error('The root key not found in the KMS') } @@ -265,12 +265,12 @@ export class HederaLedgerService { /* Anoncreds*/ async getSchema(agentContext: AgentContext, schemaId: string): Promise { - const sdk = this.getHederaAnonCredsSdk(agentContext) + const sdk = this.getHederaAnoncredsRegistry(agentContext) return await sdk.getSchema(schemaId) } async registerSchema(agentContext: AgentContext, options: RegisterSchemaOptions): Promise { - const sdk = this.getHederaAnonCredsSdk(agentContext) + const sdk = this.getHederaAnoncredsRegistry(agentContext) return await sdk.registerSchema(options) } @@ -278,7 +278,7 @@ export class HederaLedgerService { agentContext: AgentContext, credentialDefinitionId: string ): Promise { - const sdk = this.getHederaAnonCredsSdk(agentContext) + const sdk = this.getHederaAnoncredsRegistry(agentContext) return await sdk.getCredentialDefinition(credentialDefinitionId) } @@ -286,7 +286,7 @@ export class HederaLedgerService { agentContext: AgentContext, options: RegisterCredentialDefinitionOptions ): Promise { - const sdk = this.getHederaAnonCredsSdk(agentContext) + const sdk = this.getHederaAnoncredsRegistry(agentContext) return await sdk.registerCredentialDefinition({ ...options, options: { @@ -299,7 +299,7 @@ export class HederaLedgerService { agentContext: AgentContext, revocationRegistryDefinitionId: string ): Promise { - const sdk = this.getHederaAnonCredsSdk(agentContext) + const sdk = this.getHederaAnoncredsRegistry(agentContext) return await sdk.getRevocationRegistryDefinition(revocationRegistryDefinitionId) } @@ -307,7 +307,7 @@ export class HederaLedgerService { agentContext: AgentContext, options: RegisterRevocationRegistryDefinitionOptions ): Promise { - const sdk = this.getHederaAnonCredsSdk(agentContext) + const sdk = this.getHederaAnoncredsRegistry(agentContext) return await sdk.registerRevocationRegistryDefinition(options) } @@ -316,7 +316,7 @@ export class HederaLedgerService { revocationRegistryId: string, timestamp: number ): Promise { - const sdk = this.getHederaAnonCredsSdk(agentContext) + const sdk = this.getHederaAnoncredsRegistry(agentContext) return await sdk.getRevocationStatusList(revocationRegistryId, timestamp) } @@ -324,7 +324,7 @@ export class HederaLedgerService { agentContext: AgentContext, options: RegisterRevocationStatusListOptions ): Promise { - const sdk = this.getHederaAnonCredsSdk(agentContext) + const sdk = this.getHederaAnoncredsRegistry(agentContext) return await sdk.registerRevocationStatusList(options) } @@ -341,7 +341,7 @@ export class HederaLedgerService { return new KmsPublisher(agentContext, client, key) } - private getHederaAnonCredsSdk(agentContext: AgentContext): HederaAnoncredsRegistry { + private getHederaAnoncredsRegistry(agentContext: AgentContext): HederaAnoncredsRegistry { const cache = this.config.options.cache ?? new CredoCache(agentContext) return new HederaAnoncredsRegistry({ ...this.config.options, cache }) } diff --git a/packages/hedera/src/ledger/cache/CredoCache.ts b/packages/hedera/src/ledger/cache/CredoCache.ts index 30a2eb7ea2..bf7194fc76 100644 --- a/packages/hedera/src/ledger/cache/CredoCache.ts +++ b/packages/hedera/src/ledger/cache/CredoCache.ts @@ -1,14 +1,9 @@ import { AgentContext, CacheModuleConfig, CredoError } from '@credo-ts/core' import { Cache } from '@hiero-did-sdk/core' - -export interface ICredoCache { - get(agentContext: AgentContext, key: string): Promise - set(agentContext: AgentContext, key: string, value: CacheValue, expiresInSeconds?: number): Promise - remove(agentContext: AgentContext, key: string): Promise -} +import { Cache as CoreCredoCache} from '@credo-ts/core' export class CredoCache implements Cache { - private readonly credoCache: ICredoCache + private readonly credoCache: CoreCredoCache constructor(private readonly agentContext: AgentContext) { this.credoCache = agentContext.dependencyManager.resolve(CacheModuleConfig).cache @@ -30,10 +25,10 @@ export class CredoCache implements Cache { } async clear(): Promise { - throw new Error('Method not implemented.') + // nothing } async cleanupExpired(): Promise { - throw new Error('Method not implemented.') + // nothing } } diff --git a/packages/hedera/tests/integration/HederaAnoncredsRegistry.e2e.test.ts b/packages/hedera/tests/integration/HederaAnoncredsRegistry.e2e.test.ts index c12ea35edb..f3e8c6ff79 100644 --- a/packages/hedera/tests/integration/HederaAnoncredsRegistry.e2e.test.ts +++ b/packages/hedera/tests/integration/HederaAnoncredsRegistry.e2e.test.ts @@ -6,7 +6,7 @@ describe('Hedera AnonCreds support', () => { let agent: Agent let did: string - const logger = new ConsoleLogger(LogLevel.error) + const logger = new ConsoleLogger(LogLevel.fatal) const cache = new testCache() beforeAll(async () => { diff --git a/packages/hedera/tests/integration/HederaDidRegistrar.e2e.test.ts b/packages/hedera/tests/integration/HederaDidRegistrar.e2e.test.ts index 31ce111451..952edc8474 100644 --- a/packages/hedera/tests/integration/HederaDidRegistrar.e2e.test.ts +++ b/packages/hedera/tests/integration/HederaDidRegistrar.e2e.test.ts @@ -12,7 +12,7 @@ import { getMultibasePublicKey } from '../../src/ledger/utils' import { getHederaAgent } from './utils' describe('Hedera DID registrar', () => { - const logger = new ConsoleLogger(LogLevel.error) + const logger = new ConsoleLogger(LogLevel.fatal) let agent: Agent const validDid = 'did:hedera:testnet:44eesExqdsUvLZ35FpnBPErqRGRnYbzzyG3wgCCYxkmq_0.0.6226170' diff --git a/packages/hedera/tests/integration/HederaDidResolver.e2e.test.ts b/packages/hedera/tests/integration/HederaDidResolver.e2e.test.ts index c7169f6b48..71834c6ced 100644 --- a/packages/hedera/tests/integration/HederaDidResolver.e2e.test.ts +++ b/packages/hedera/tests/integration/HederaDidResolver.e2e.test.ts @@ -3,7 +3,7 @@ import { HederaDidCreateOptions } from '../../src/ledger/HederaLedgerService' import { getHederaAgent } from './utils' describe('Hedera DID resolver', () => { - const logger = new ConsoleLogger(LogLevel.error) + const logger = new ConsoleLogger(LogLevel.fatal) let agent: Agent let did: string diff --git a/packages/hedera/tests/integration/utils/hederaModule.ts b/packages/hedera/tests/integration/utils/hederaModule.ts index 2511a9ed53..ebdfc58acd 100644 --- a/packages/hedera/tests/integration/utils/hederaModule.ts +++ b/packages/hedera/tests/integration/utils/hederaModule.ts @@ -16,7 +16,7 @@ import { TestTailsFileService } from './testTailsFileService' export const getHederaModuleConfig = (props: { operatorId?: string; operatorKey?: string }) => { const operatorId = props.operatorId ?? process.env.HEDERA_OPERATOR_ID ?? '' const operatorKey = props.operatorKey ?? process.env.HEDERA_OPERATOR_KEY ?? '' - return { + const config: HederaModuleConfigOptions = { networks: [ { network: 'testnet', @@ -24,7 +24,8 @@ export const getHederaModuleConfig = (props: { operatorId?: string; operatorKey? operatorKey, }, ], - } satisfies HederaModuleConfigOptions + } + return config } export const getHederaAgent = (props: { diff --git a/packages/hedera/tests/unit/credo-cache.test.ts b/packages/hedera/tests/unit/credo-cache.test.ts index 5c43ffe7ab..5756d2d0db 100644 --- a/packages/hedera/tests/unit/credo-cache.test.ts +++ b/packages/hedera/tests/unit/credo-cache.test.ts @@ -86,14 +86,14 @@ describe('CredoCache', () => { describe('clear', () => { it('should throw error when called', async () => { const credoCacheInstance = new CredoCache(mockAgentContext) - await expect(credoCacheInstance.clear()).rejects.toThrowError('Method not implemented.') + await expect(credoCacheInstance.clear()).resolves.not.toThrow() }) }) describe('cleanupExpired', () => { it('should throw error when called', async () => { const credoCacheInstance = new CredoCache(mockAgentContext) - await expect(credoCacheInstance.cleanupExpired()).rejects.toThrowError('Method not implemented.') + await expect(credoCacheInstance.cleanupExpired()).resolves.not.toThrow() }) }) }) diff --git a/packages/hedera/tests/unit/hedera-did-registrar.test.ts b/packages/hedera/tests/unit/hedera-did-registrar.test.ts index 52b33083d5..9347f876d2 100644 --- a/packages/hedera/tests/unit/hedera-did-registrar.test.ts +++ b/packages/hedera/tests/unit/hedera-did-registrar.test.ts @@ -170,7 +170,7 @@ describe('HederaDidRegistrar', () => { const result = await service.update(mockAgentContext as AgentContext, options) - expect(mockAgentContext.config.logger.error).toHaveBeenCalledWith('Error update DID', expect.any(Error)) + expect(mockAgentContext.config.logger.error).toHaveBeenCalledWith('Error updating DID', expect.any(Error)) expect(result.didState.state).toBe('failed') if (result.didState.state === 'failed') expect(result.didState.reason).toBe('Unable update DID: Update failed') }) @@ -237,7 +237,7 @@ describe('HederaDidRegistrar', () => { const result = await service.deactivate(mockAgentContext as AgentContext, options) - expect(mockAgentContext.config.logger.error).toHaveBeenCalledWith('Error deactivate DID', expect.any(Error)) + expect(mockAgentContext.config.logger.error).toHaveBeenCalledWith('Error deactivating DID', expect.any(Error)) expect(result.didState.state).toBe('failed') if (result.didState.state === 'failed') expect(result.didState.reason).toBe('Unable deactivating DID: Deactivate failed') diff --git a/packages/hedera/tests/unit/hedera-ledger-service.test.ts b/packages/hedera/tests/unit/hedera-ledger-service.test.ts index b359a4a627..37ab1c9d54 100644 --- a/packages/hedera/tests/unit/hedera-ledger-service.test.ts +++ b/packages/hedera/tests/unit/hedera-ledger-service.test.ts @@ -129,7 +129,7 @@ describe('HederaLedgerService', () => { }) describe('resolveDid', () => { - it('should calls resolveDID with proper args and returns result', async () => { + it('should call resolveDID with proper args and returns result', async () => { const did = 'did:hedera:test' const mockResolution = { didDocument: { id: did } } @@ -147,7 +147,7 @@ describe('HederaLedgerService', () => { }) describe('createDid', () => { - it('should creates DID without didDocument', async () => { + it('should create DID without didDocument', async () => { const keyId = 'key123' const publicJwk: KmsJwkPublicOkp & { crv: 'Ed25519' } = { crv: 'Ed25519', kty: 'OKP', x: 'abc' } const props: HederaDidCreateOptions = { @@ -176,7 +176,7 @@ describe('HederaLedgerService', () => { expect(result.rootKey).toBeDefined() }) - it('should creates DID with didDocument and calls updateDid', async () => { + it('should create DID with didDocument and calls updateDid', async () => { const keyId = 'key123' const publicJwk: KmsJwkPublicOkp & { crv: 'Ed25519' } = { crv: 'Ed25519', kty: 'OKP', x: 'abc' } const didDocument = { controller: 'did:hedera:controller' } @@ -216,13 +216,13 @@ describe('HederaLedgerService', () => { const did = 'did:hedera:1234' const kmsKeyId = 'key-id' - it('should throws error if didDocumentOperation is missing', async () => { + it('should throw error if didDocumentOperation is missing', async () => { await expect( service.updateDid(mockAgentContext as AgentContext, { did } as HederaDidUpdateOptions) ).rejects.toThrow('DidDocumentOperation is required') }) - it('should throws error if rootKey missing', async () => { + it('should throw error if rootKey missing', async () => { const keys: DidDocumentKey[] = [] await expect( service.updateDid(mockAgentContext as AgentContext, { @@ -234,7 +234,7 @@ describe('HederaLedgerService', () => { ).rejects.toThrow('The root key not found in the KMS') }) - it('should calls correct builder methods for each field and action', () => { + it('should call correct builder methods for each field and action', () => { const spies = { addService: jest.spyOn(builder, 'addService'), removeService: jest.spyOn(builder, 'removeService'), @@ -292,7 +292,7 @@ describe('HederaLedgerService', () => { } }) - it('should returns builder unchanged for unknown field', () => { + it('should return builder unchanged for unknown field', () => { const unknownField = 'unknownField' // biome-ignore lint/suspicious/noExplicitAny: const fn = (service as any).getUpdateMethod(builder, unknownField, 'add') @@ -300,7 +300,7 @@ describe('HederaLedgerService', () => { expect(result).toBe(builder) }) - it('should performs update flow successfully', async () => { + it('should perform update flow successfully', async () => { const keys: DidDocumentKey[] = [ { kmsKeyId, didDocumentRelativeKeyId: DID_ROOT_KEY_ID }, { kmsKeyId: 'some-key', didDocumentRelativeKeyId: '#abc' }, @@ -359,13 +359,13 @@ describe('HederaLedgerService', () => { const did = 'did:hedera:5678' const kmsKeyId = 'key-id' - it('should throws error if rootKey is missing', async () => { + it('should throw error if rootKey is missing', async () => { await expect( service.deactivateDid(mockAgentContext as AgentContext, { did, secret: { keys: [] } }) ).rejects.toThrow('The root key not found in the KMS') }) - it('should throws an error if root key is not found in deactivateDid', async () => { + it('should throw an error if root key is not found in deactivateDid', async () => { const props = { did: 'did:hedera:123', secret: { @@ -381,7 +381,7 @@ describe('HederaLedgerService', () => { ) }) - it('should deactivates DID successfully', async () => { + it('should deactivate DID successfully', async () => { const keys: DidDocumentKey[] = [{ kmsKeyId, didDocumentRelativeKeyId: DID_ROOT_KEY_ID }] const mockPublisher = {} const mockState = {} @@ -428,7 +428,7 @@ describe('HederaLedgerService', () => { registerRevocationStatusList: jest.fn().mockResolvedValue('registerRevStatus'), } // biome-ignore lint/suspicious/noExplicitAny: - jest.spyOn(service as any, 'getHederaAnonCredsSdk').mockReturnValue(mockSdk) + jest.spyOn(service as any, 'getHederaAnoncredsRegistry').mockReturnValue(mockSdk) }) it('getSchema', async () => { diff --git a/packages/hedera/tests/unit/utils.test.ts b/packages/hedera/tests/unit/utils.test.ts index 9ef6c20c6e..25a37aae19 100644 --- a/packages/hedera/tests/unit/utils.test.ts +++ b/packages/hedera/tests/unit/utils.test.ts @@ -27,7 +27,7 @@ describe('createOrGetKey', () => { } as unknown as jest.Mocked }) - it('should creates a key if keyId is not provided', async () => { + it('should create a key if keyId is not provided', async () => { const fakeKeyId = 'key123' const fakeJwk: KmsJwkPublicOkp & { kid: string } = { kty: 'OKP', crv: 'Ed25519', x: 'xxx', kid: 'key123' } kmsMock.createKey.mockResolvedValue({ @@ -45,7 +45,7 @@ describe('createOrGetKey', () => { }) }) - it('should retrieves an existing key if keyId is provided', async () => { + it('should retrieve an existing key if keyId is provided', async () => { const keyId = 'key456' const publicJwk: KmsJwkPublicOkp & { kid: string } = { kty: 'OKP', crv: 'Ed25519', x: 'xxx', kid: 'key123' } kmsMock.getPublicKey.mockResolvedValue(publicJwk) @@ -63,7 +63,7 @@ describe('createOrGetKey', () => { }) }) - it('should throws an error if key with given keyId is not found', async () => { + it('should throw an error if key with given keyId is not found', async () => { // @ts-ignore kmsMock.getPublicKey.mockResolvedValue(null) @@ -71,7 +71,7 @@ describe('createOrGetKey', () => { await expect(createOrGetKey(kmsMock, 'notfound')).rejects.toThrowError("Key with key id 'notfound' not found") }) - it('should throws an error if key has unsupported kty or crv', async () => { + it('should throw an error if key has unsupported kty or crv', async () => { const keyId = 'badkey' const badJwk: KmsJwkPublicRsa & { kid: string } = { e: '', kid: 'key-1', n: '', kty: 'RSA' } diff --git a/packages/hedera/tsconfig.json b/packages/hedera/tsconfig.json index 03b41a1553..dcd84a3af2 100644 --- a/packages/hedera/tsconfig.json +++ b/packages/hedera/tsconfig.json @@ -1,7 +1,7 @@ { "extends": "../../tsconfig.json", "compilerOptions": { - "types": ["node", "jest"], + "types": ["jest"], "moduleResolution": "node" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4aa022f797..f18faf7799 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -172,6 +172,9 @@ importers: demo: dependencies: + '@hiero-did-sdk/client': + specifier: 0.1.0 + version: 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) '@hyperledger/anoncreds-nodejs': specifier: 'catalog:' version: 0.3.1 @@ -3164,7 +3167,6 @@ packages: '@sphereon/kmp-mdoc-core@0.2.0-SNAPSHOT.26': resolution: {integrity: sha512-QXJ6R8ENiZV2rPMbn06cw5JKwqUYN1kzVRbYfONqE1PEXx1noQ4md7uxr2zSczi0ubKkNcbyYDNtIMTZIhGzmQ==} - bundledDependencies: [] '@sphereon/pex-models@2.3.2': resolution: {integrity: sha512-foFxfLkRwcn/MOp/eht46Q7wsvpQGlO7aowowIIb5Tz9u97kYZ2kz6K2h2ODxWuv5CRA7Q0MY8XUBGE2lfOhOQ==} @@ -7558,6 +7560,7 @@ packages: superagent@10.2.1: resolution: {integrity: sha512-O+PCv11lgTNJUzy49teNAWLjBZfc+A1enOwTpLlH6/rsvKcTwcdTT8m9azGkVqM7HBl5jpyZ7KTPhHweokBcdg==} engines: {node: '>=14.18.0'} + deprecated: Please upgrade to superagent v10.2.2+, see release notes at https://github.com/forwardemail/superagent/releases/tag/v10.2.2 - maintenance is supported by Forward Email @ https://forwardemail.net supertest@7.1.1: resolution: {integrity: sha512-aI59HBTlG9e2wTjxGJV+DygfNLgnWbGdZxiA/sgrnNNikIW8lbDvCtF6RnhZoJ82nU7qv7ZLjrvWqCEm52fAmw==} From 3edbec9da4eb05eded4641372d1a3ce5270f749e Mon Sep 17 00:00:00 2001 From: "andrey.kononov" Date: Mon, 18 Aug 2025 19:20:31 +0300 Subject: [PATCH 80/89] Fix PR review notes --- packages/hedera/src/ledger/cache/CredoCache.ts | 6 +++--- packages/hedera/tests/unit/credo-cache.test.ts | 5 +++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/packages/hedera/src/ledger/cache/CredoCache.ts b/packages/hedera/src/ledger/cache/CredoCache.ts index bf7194fc76..e5914f8c2f 100644 --- a/packages/hedera/src/ledger/cache/CredoCache.ts +++ b/packages/hedera/src/ledger/cache/CredoCache.ts @@ -1,6 +1,6 @@ import { AgentContext, CacheModuleConfig, CredoError } from '@credo-ts/core' +import { Cache as CoreCredoCache } from '@credo-ts/core' import { Cache } from '@hiero-did-sdk/core' -import { Cache as CoreCredoCache} from '@credo-ts/core' export class CredoCache implements Cache { private readonly credoCache: CoreCredoCache @@ -25,10 +25,10 @@ export class CredoCache implements Cache { } async clear(): Promise { - // nothing + // nothing } async cleanupExpired(): Promise { - // nothing + // nothing } } diff --git a/packages/hedera/tests/unit/credo-cache.test.ts b/packages/hedera/tests/unit/credo-cache.test.ts index 5756d2d0db..b9927933ad 100644 --- a/packages/hedera/tests/unit/credo-cache.test.ts +++ b/packages/hedera/tests/unit/credo-cache.test.ts @@ -1,10 +1,11 @@ import { AgentContext, CacheModuleConfig, CredoError } from '@credo-ts/core' -import { CredoCache, ICredoCache } from '../../src/ledger/cache/CredoCache' +import { Cache as CoreCredoCache } from '@credo-ts/core' +import { CredoCache } from '../../src/ledger/cache/CredoCache' describe('CredoCache', () => { let mockAgentContext: AgentContext let mockDependencyManagerResolve: jest.Mock - let mockCredoCache: jest.Mocked + let mockCredoCache: jest.Mocked beforeEach(() => { mockCredoCache = { From c78e8b03ea5a32d491cd154ac7e816afd7ea7ba0 Mon Sep 17 00:00:00 2001 From: "andrey.kononov" Date: Mon, 18 Aug 2025 19:23:33 +0300 Subject: [PATCH 81/89] Fix PR review notes --- patches/@2060.io__ffi-napi@4.0.9.patch | 14 -------------- 1 file changed, 14 deletions(-) delete mode 100644 patches/@2060.io__ffi-napi@4.0.9.patch diff --git a/patches/@2060.io__ffi-napi@4.0.9.patch b/patches/@2060.io__ffi-napi@4.0.9.patch deleted file mode 100644 index 2e3cb8248d..0000000000 --- a/patches/@2060.io__ffi-napi@4.0.9.patch +++ /dev/null @@ -1,14 +0,0 @@ -diff --git a/deps/libffi/libffi.gyp b/deps/libffi/libffi.gyp -index d02bef739c0cfb9c1bbb0a666ab3363fd34c5041..5d49572898681902fca1079b7b25d02f15f7617a 100644 ---- a/deps/libffi/libffi.gyp -+++ b/deps/libffi/libffi.gyp -@@ -74,8 +74,7 @@ - '<(INTERMEDIATE_DIR)/<(RULE_INPUT_ROOT).asm', - ], - 'action': [ -- 'call', -- 'preprocess_asm.cmd', -+ '../../../deps/libffi/preprocess_asm.cmd', - 'include', - 'config/<(OS)/<(target_arch)', - '<(RULE_INPUT_PATH)', From 66a5663602d172f561646b083efc34731e065bb4 Mon Sep 17 00:00:00 2001 From: "andrey.kononov" Date: Mon, 18 Aug 2025 19:58:24 +0300 Subject: [PATCH 82/89] Fix PR review notes --- patches/@2060.io__ffi-napi@4.0.9.patch | 14 ++++++++++++++ pnpm-workspace.yaml | 7 +++++++ 2 files changed, 21 insertions(+) create mode 100644 patches/@2060.io__ffi-napi@4.0.9.patch diff --git a/patches/@2060.io__ffi-napi@4.0.9.patch b/patches/@2060.io__ffi-napi@4.0.9.patch new file mode 100644 index 0000000000..2e3cb8248d --- /dev/null +++ b/patches/@2060.io__ffi-napi@4.0.9.patch @@ -0,0 +1,14 @@ +diff --git a/deps/libffi/libffi.gyp b/deps/libffi/libffi.gyp +index d02bef739c0cfb9c1bbb0a666ab3363fd34c5041..5d49572898681902fca1079b7b25d02f15f7617a 100644 +--- a/deps/libffi/libffi.gyp ++++ b/deps/libffi/libffi.gyp +@@ -74,8 +74,7 @@ + '<(INTERMEDIATE_DIR)/<(RULE_INPUT_ROOT).asm', + ], + 'action': [ +- 'call', +- 'preprocess_asm.cmd', ++ '../../../deps/libffi/preprocess_asm.cmd', + 'include', + 'config/<(OS)/<(target_arch)', + '<(RULE_INPUT_PATH)', diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 8da71a7c33..d16ac8840a 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -44,3 +44,10 @@ onlyBuiltDependencies: - "@hyperledger/anoncreds-nodejs" - "@hyperledger/indy-vdr-nodejs" - "@openwallet-foundation/askar-nodejs" + - "@hyperledger/aries-askar-nodejs" + - "es5-ext" + - "esbuild" + - "protobufjs" + - "zstd-napi" + - "cbor-extract" + - "secp256k1" From 9c42d2196731e5d0793f36da0eb17dbcf25d4be0 Mon Sep 17 00:00:00 2001 From: "andrey.kononov" Date: Tue, 19 Aug 2025 23:26:30 +0300 Subject: [PATCH 83/89] Sign topic, files, messages with issuerKey --- packages/hedera/package.json | 16 +-- .../hedera/src/ledger/HederaLedgerService.ts | 64 ++++++++---- .../HederaAnoncredsRegistry.e2e.test.ts | 22 ++--- .../tests/unit/hedera-ledger-service.test.ts | 99 +++++++++++++++++-- 4 files changed, 157 insertions(+), 44 deletions(-) diff --git a/packages/hedera/package.json b/packages/hedera/package.json index 4cc45380b5..5f3b872675 100644 --- a/packages/hedera/package.json +++ b/packages/hedera/package.json @@ -25,16 +25,16 @@ "style:fix": "biome check --write --unsafe" }, "dependencies": { - "@hashgraph/sdk": "^2.66.0", "@credo-ts/anoncreds": "workspace:*", "@credo-ts/core": "workspace:*", - "@hiero-did-sdk/anoncreds": "0.1.0", - "@hiero-did-sdk/client": "0.1.0", - "@hiero-did-sdk/core": "0.1.0", - "@hiero-did-sdk/hcs": "0.1.0", - "@hiero-did-sdk/publisher-internal": "0.1.0", - "@hiero-did-sdk/registrar": "0.1.0", - "@hiero-did-sdk/resolver": "0.1.0" + "@hashgraph/sdk": "^2.66.0", + "@hiero-did-sdk/anoncreds": "^0.1.1", + "@hiero-did-sdk/client": "^0.1.1", + "@hiero-did-sdk/core": "^0.1.1", + "@hiero-did-sdk/hcs": "^0.1.1", + "@hiero-did-sdk/publisher-internal": "^0.1.1", + "@hiero-did-sdk/registrar": "^0.1.1", + "@hiero-did-sdk/resolver": "^0.1.1" }, "devDependencies": { "@credo-ts/node": "workspace:*", diff --git a/packages/hedera/src/ledger/HederaLedgerService.ts b/packages/hedera/src/ledger/HederaLedgerService.ts index a66452a097..257531dd43 100644 --- a/packages/hedera/src/ledger/HederaLedgerService.ts +++ b/packages/hedera/src/ledger/HederaLedgerService.ts @@ -18,12 +18,13 @@ import { DidDeactivateOptions, type DidDocument, DidDocumentKey, + DidRepository, DidUpdateOptions, Kms, injectable, } from '@credo-ts/core' import { KeyManagementApi } from '@credo-ts/core/src/modules/kms' -import { Client } from '@hashgraph/sdk' +import { Client, PrivateKey } from '@hashgraph/sdk' import { HederaAnoncredsRegistry } from '@hiero-did-sdk/anoncreds' import { HederaClientService, HederaNetwork } from '@hiero-did-sdk/client' import { DIDResolution, DID_ROOT_KEY_ID, Service, VerificationMethod, parseDID } from '@hiero-did-sdk/core' @@ -265,30 +266,33 @@ export class HederaLedgerService { /* Anoncreds*/ async getSchema(agentContext: AgentContext, schemaId: string): Promise { - const sdk = this.getHederaAnoncredsRegistry(agentContext) - return await sdk.getSchema(schemaId) + const registry = this.getHederaAnoncredsRegistry(agentContext) + return await registry.getSchema(schemaId) } async registerSchema(agentContext: AgentContext, options: RegisterSchemaOptions): Promise { - const sdk = this.getHederaAnoncredsRegistry(agentContext) - return await sdk.registerSchema(options) + const registry = this.getHederaAnoncredsRegistry(agentContext) + const issuerPrivateKey = await this.getIssuerPrivateKey(agentContext, options.schema.issuerId) + return await registry.registerSchema({ ...options, issuerKeyDer: issuerPrivateKey.toStringDer() }) } async getCredentialDefinition( agentContext: AgentContext, credentialDefinitionId: string ): Promise { - const sdk = this.getHederaAnoncredsRegistry(agentContext) - return await sdk.getCredentialDefinition(credentialDefinitionId) + const registry = this.getHederaAnoncredsRegistry(agentContext) + return await registry.getCredentialDefinition(credentialDefinitionId) } async registerCredentialDefinition( agentContext: AgentContext, options: RegisterCredentialDefinitionOptions ): Promise { - const sdk = this.getHederaAnoncredsRegistry(agentContext) - return await sdk.registerCredentialDefinition({ + const registry = this.getHederaAnoncredsRegistry(agentContext) + const issuerPrivateKey = await this.getIssuerPrivateKey(agentContext, options.credentialDefinition.issuerId) + return await registry.registerCredentialDefinition({ ...options, + issuerKeyDer: issuerPrivateKey.toStringDer(), options: { supportRevocation: options.options?.supportRevocation === true, }, @@ -299,16 +303,20 @@ export class HederaLedgerService { agentContext: AgentContext, revocationRegistryDefinitionId: string ): Promise { - const sdk = this.getHederaAnoncredsRegistry(agentContext) - return await sdk.getRevocationRegistryDefinition(revocationRegistryDefinitionId) + const registry = this.getHederaAnoncredsRegistry(agentContext) + return await registry.getRevocationRegistryDefinition(revocationRegistryDefinitionId) } async registerRevocationRegistryDefinition( agentContext: AgentContext, options: RegisterRevocationRegistryDefinitionOptions ): Promise { - const sdk = this.getHederaAnoncredsRegistry(agentContext) - return await sdk.registerRevocationRegistryDefinition(options) + const registry = this.getHederaAnoncredsRegistry(agentContext) + const issuerPrivateKey = await this.getIssuerPrivateKey(agentContext, options.revocationRegistryDefinition.issuerId) + return await registry.registerRevocationRegistryDefinition({ + ...options, + issuerKeyDer: issuerPrivateKey.toStringDer(), + }) } async getRevocationStatusList( @@ -316,16 +324,20 @@ export class HederaLedgerService { revocationRegistryId: string, timestamp: number ): Promise { - const sdk = this.getHederaAnoncredsRegistry(agentContext) - return await sdk.getRevocationStatusList(revocationRegistryId, timestamp) + const registry = this.getHederaAnoncredsRegistry(agentContext) + return await registry.getRevocationStatusList(revocationRegistryId, timestamp) } async registerRevocationStatusList( agentContext: AgentContext, options: RegisterRevocationStatusListOptions ): Promise { - const sdk = this.getHederaAnoncredsRegistry(agentContext) - return await sdk.registerRevocationStatusList(options) + const registry = this.getHederaAnoncredsRegistry(agentContext) + const issuerPrivateKey = await this.getIssuerPrivateKey(agentContext, options.revocationStatusList.issuerId) + return await registry.registerRevocationStatusList({ + ...options, + issuerKeyDer: issuerPrivateKey.toStringDer(), + }) } // Private methods @@ -511,4 +523,22 @@ export class HederaLedgerService { return fieldMethods[action] } + + private async getIssuerPrivateKey(agentContext: AgentContext, issuerId: string): Promise { + const didRepository = agentContext.dependencyManager.resolve(DidRepository) + const kms = agentContext.dependencyManager.resolve(Kms.KeyManagementApi) + + const didRecord = await didRepository.findCreatedDid(agentContext, issuerId) + const rootKey = didRecord?.keys?.find((k) => k.didDocumentRelativeKeyId === DID_ROOT_KEY_ID) + if (!rootKey?.kmsKeyId) { + throw new Error('The root key not found in the KMS') + } + + // @ts-ignore + const keyManagementService = kms.getKms(agentContext) as AskarKeyManagementService + // @ts-ignore + const keyInfo = await keyManagementService.getKeyAsserted(agentContext, rootKey.kmsKeyId) + + return PrivateKey.fromBytesED25519(keyInfo.key.secretBytes) + } } diff --git a/packages/hedera/tests/integration/HederaAnoncredsRegistry.e2e.test.ts b/packages/hedera/tests/integration/HederaAnoncredsRegistry.e2e.test.ts index f3e8c6ff79..fee13c73ca 100644 --- a/packages/hedera/tests/integration/HederaAnoncredsRegistry.e2e.test.ts +++ b/packages/hedera/tests/integration/HederaAnoncredsRegistry.e2e.test.ts @@ -4,7 +4,7 @@ import { getHederaAgent, testCache } from './utils' describe('Hedera AnonCreds support', () => { let agent: Agent - let did: string + let issuerId: string const logger = new ConsoleLogger(LogLevel.fatal) const cache = new testCache() @@ -18,14 +18,14 @@ describe('Hedera AnonCreds support', () => { }) await agent.initialize() - // Making the test did + // Making the test issuerId const didRegistrarResult = await agent.dids.create({ method: 'hedera', }) if (!didRegistrarResult.didState?.didDocument?.id) throw new Error('DidRegistrarError') - did = didRegistrarResult.didState.didDocument.id - logger.debug('DID', [did]) + issuerId = didRegistrarResult.didState.didDocument.id + logger.debug('issuerId', [issuerId]) }) beforeEach(() => { @@ -48,7 +48,7 @@ describe('Hedera AnonCreds support', () => { schema: { name: utils.uuid(), version: '1', - issuerId: did, + issuerId: issuerId, attrNames: ['field1'], }, options: {}, @@ -62,7 +62,7 @@ describe('Hedera AnonCreds support', () => { const credDefResult = await agent.modules.anoncreds.registerCredentialDefinition({ credentialDefinition: { tag: 'default', - issuerId: did, + issuerId: issuerId, schemaId: schemaId, }, options: { @@ -78,7 +78,7 @@ describe('Hedera AnonCreds support', () => { // Register revocation registry definition const revRegDefRegResult = await agent.modules.anoncreds.registerRevocationRegistryDefinition({ revocationRegistryDefinition: { - issuerId: did, + issuerId: issuerId, credentialDefinitionId, maximumCredentialNumber: 10, tag: 'default', @@ -98,7 +98,7 @@ describe('Hedera AnonCreds support', () => { const registerRevocationStatusListResponse = await agent.modules.anoncreds.registerRevocationStatusList({ options: {}, revocationStatusList: { - issuerId: did, + issuerId: issuerId, revocationRegistryDefinitionId, }, }) @@ -114,7 +114,7 @@ describe('Hedera AnonCreds support', () => { logger.debug('revocationStatusListResponse', [revocationStatusListResponse]) expect(revocationStatusListResponse?.revocationStatusList?.revRegDefId).toEqual(revocationRegistryDefinitionId) - expect(revocationStatusListResponse?.revocationStatusList?.issuerId).toEqual(did) + expect(revocationStatusListResponse?.revocationStatusList?.issuerId).toEqual(issuerId) expect(revocationStatusListResponse?.revocationStatusList?.revocationList).toEqual([0, 0, 0, 0, 0, 0, 0, 0, 0, 0]) // Update revocation status list - Revoke indexes @@ -140,7 +140,7 @@ describe('Hedera AnonCreds support', () => { expect(revokeRevocationStatusListResponse?.revocationStatusList?.revRegDefId).toEqual( revocationRegistryDefinitionId ) - expect(revokeRevocationStatusListResponse?.revocationStatusList?.issuerId).toEqual(did) + expect(revokeRevocationStatusListResponse?.revocationStatusList?.issuerId).toEqual(issuerId) expect(revokeRevocationStatusListResponse?.revocationStatusList?.revocationList).toEqual([ 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, ]) @@ -168,7 +168,7 @@ describe('Hedera AnonCreds support', () => { expect(issueRevocationStatusListResponse?.revocationStatusList?.revRegDefId).toEqual( revocationRegistryDefinitionId ) - expect(issueRevocationStatusListResponse?.revocationStatusList?.issuerId).toEqual(did) + expect(issueRevocationStatusListResponse?.revocationStatusList?.issuerId).toEqual(issuerId) expect(issueRevocationStatusListResponse?.revocationStatusList?.revocationList).toEqual([ 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, ]) diff --git a/packages/hedera/tests/unit/hedera-ledger-service.test.ts b/packages/hedera/tests/unit/hedera-ledger-service.test.ts index 37ab1c9d54..4d6a83ed2f 100644 --- a/packages/hedera/tests/unit/hedera-ledger-service.test.ts +++ b/packages/hedera/tests/unit/hedera-ledger-service.test.ts @@ -4,11 +4,11 @@ import { RegisterRevocationStatusListOptions, RegisterSchemaOptions, } from '@credo-ts/anoncreds' -import { type DidDocument } from '@credo-ts/core' +import { type DidDocument, DidRecord, DidRepository } from '@credo-ts/core' import { AgentContext, DependencyManager } from '@credo-ts/core' import { DidDocumentKey, Kms } from '@credo-ts/core' import { KmsJwkPublicOkp } from '@credo-ts/core/src/modules/kms' -import { Client } from '@hashgraph/sdk' +import { Client, PrivateKey } from '@hashgraph/sdk' import { HederaDidCreateOptions, HederaDidUpdateOptions, @@ -67,12 +67,16 @@ import { DID_ROOT_KEY_ID, Publisher, parseDID } from '@hiero-did-sdk/core' jest.mock('../../src/ledger/utils') +import { AskarKeyManagementService } from '@credo-ts/askar' +import { KeyEntryObject } from '@openwallet-foundation/askar-nodejs' import { createOrGetKey } from '../../src/ledger/utils' describe('HederaLedgerService', () => { let service: HederaLedgerService let mockAgentContext: Partial let mockKms: jest.Mocked + let mockDidRepository: jest.Mocked + let mockKeyManagementService: jest.Mocked let mockedCreateOrGetKey: jest.MockedFunction let mockedParseDID: jest.MockedFunction let mockedGenerateDeactivateDIDRequest: jest.MockedFunction @@ -89,13 +93,39 @@ describe('HederaLedgerService', () => { builder = new DIDUpdateBuilder() + mockDidRepository = { + findCreatedDid: jest.fn().mockReturnValue({ + keys: [ + { + didDocumentRelativeKeyId: DID_ROOT_KEY_ID, + kmsKeyId: 'kmsKeyId', + }, + ], + } as unknown as DidRecord), + } as unknown as jest.Mocked + + mockKeyManagementService = { + getKeyAsserted: jest + .fn() + .mockReturnValue({ key: { secretBytes: PrivateKey.generateED25519().toBytes() } } as unknown as KeyEntryObject), + } as unknown as jest.Mocked + mockKms = { sign: jest.fn(), + getKms: jest.fn().mockReturnValue(mockKeyManagementService), } as unknown as jest.Mocked mockAgentContext = { dependencyManager: { - resolve: jest.fn().mockReturnValue(mockKms), + resolve: jest.fn((cls) => { + if (cls === Kms.KeyManagementApi) { + return mockKms + } + if (cls === DidRepository) { + return mockDidRepository + } + throw new Error(`No instance found for ${cls}`) + }), } as unknown as DependencyManager, } @@ -412,7 +442,7 @@ describe('HederaLedgerService', () => { }) }) - describe('Anoncreds SDK methods', () => { + describe('anoncreds SDK methods', () => { // biome-ignore lint/suspicious/noExplicitAny: let mockSdk: any @@ -448,7 +478,7 @@ describe('HederaLedgerService', () => { options: {}, } const result = await service.registerSchema(mockAgentContext as AgentContext, options) - expect(mockSdk.registerSchema).toHaveBeenCalledWith(options) + expect(mockSdk.registerSchema).toHaveBeenCalledWith({ ...options, issuerKeyDer: expect.anything() }) expect(result).toBe('registerSchema') }) @@ -460,7 +490,9 @@ describe('HederaLedgerService', () => { it('registerCredentialDefinition', async () => { const options: RegisterCredentialDefinitionOptions = { - options: { supportRevocation: true }, + options: { + supportRevocation: true, + }, credentialDefinition: { issuerId: '', schemaId: '', @@ -475,7 +507,10 @@ describe('HederaLedgerService', () => { await service.registerCredentialDefinition(mockAgentContext as AgentContext, options) expect(mockSdk.registerCredentialDefinition).toHaveBeenCalledWith({ ...options, - options: { supportRevocation: true }, + issuerKeyDer: expect.anything(), + options: { + supportRevocation: true, + }, }) }) @@ -506,7 +541,10 @@ describe('HederaLedgerService', () => { options: {}, } const result = await service.registerRevocationRegistryDefinition(mockAgentContext as AgentContext, options) - expect(mockSdk.registerRevocationRegistryDefinition).toHaveBeenCalledWith(options) + expect(mockSdk.registerRevocationRegistryDefinition).toHaveBeenCalledWith({ + ...options, + issuerKeyDer: expect.anything(), + }) expect(result).toBe('registerRevRegDef') }) @@ -531,4 +569,49 @@ describe('HederaLedgerService', () => { expect(result).toBe('registerRevStatus') }) }) + + describe('getIssuerPrivateKey', () => { + it('should return PrivateKey from secretBytes when rootKey exists', async () => { + const secretBytes = PrivateKey.generate().toBytes() + const didRecord = { + keys: [{ didDocumentRelativeKeyId: DID_ROOT_KEY_ID, kmsKeyId: 'kms-key-id' }], + } + const keyInfo = { key: { secretBytes } } + + mockDidRepository.findCreatedDid.mockResolvedValue(didRecord as unknown as DidRecord) + // @ts-ignore + mockKeyManagementService.getKeyAsserted.mockResolvedValue(keyInfo) + + // biome-ignore lint/suspicious/noExplicitAny: + const result = await (service as any).getIssuerPrivateKey(mockAgentContext, 'issuer-id') + + expect(mockDidRepository.findCreatedDid).toHaveBeenCalledWith(mockAgentContext, 'issuer-id') + // @ts-ignore + expect(mockKms.getKms).toHaveBeenCalledWith(mockAgentContext) + // @ts-ignore + expect(mockKeyManagementService.getKeyAsserted).toHaveBeenCalledWith(mockAgentContext, 'kms-key-id') + expect(result).toEqual(PrivateKey.fromBytesED25519(secretBytes)) + }) + + it('should throw error if no rootKey found', async () => { + const didRecord = { + keys: [], + } + mockDidRepository.findCreatedDid.mockResolvedValue(didRecord as unknown as DidRecord) + + // biome-ignore lint/suspicious/noExplicitAny: + await expect((service as any).getIssuerPrivateKey(mockAgentContext, 'issuer-id')).rejects.toThrow( + 'The root key not found in the KMS' + ) + }) + + it('should throw error if didRecord is null or undefined', async () => { + mockDidRepository.findCreatedDid.mockResolvedValue(null) + + // biome-ignore lint/suspicious/noExplicitAny: + await expect((service as any).getIssuerPrivateKey(mockAgentContext, 'issuer-id')).rejects.toThrow( + 'The root key not found in the KMS' + ) + }) + }) }) From 532fdd79d55500a341606924371a639fa69be667 Mon Sep 17 00:00:00 2001 From: "andrey.kononov" Date: Wed, 20 Aug 2025 11:06:21 +0300 Subject: [PATCH 84/89] Up used libraries --- packages/hedera/package.json | 14 +++++++------- .../tests/unit/hedera-ledger-service.test.ts | 5 ++++- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/packages/hedera/package.json b/packages/hedera/package.json index 5f3b872675..05be886dd9 100644 --- a/packages/hedera/package.json +++ b/packages/hedera/package.json @@ -28,13 +28,13 @@ "@credo-ts/anoncreds": "workspace:*", "@credo-ts/core": "workspace:*", "@hashgraph/sdk": "^2.66.0", - "@hiero-did-sdk/anoncreds": "^0.1.1", - "@hiero-did-sdk/client": "^0.1.1", - "@hiero-did-sdk/core": "^0.1.1", - "@hiero-did-sdk/hcs": "^0.1.1", - "@hiero-did-sdk/publisher-internal": "^0.1.1", - "@hiero-did-sdk/registrar": "^0.1.1", - "@hiero-did-sdk/resolver": "^0.1.1" + "@hiero-did-sdk/anoncreds": "^0.1.2", + "@hiero-did-sdk/client": "^0.1.2", + "@hiero-did-sdk/core": "^0.1.2", + "@hiero-did-sdk/hcs": "^0.1.2", + "@hiero-did-sdk/publisher-internal": "^0.1.2", + "@hiero-did-sdk/registrar": "^0.1.2", + "@hiero-did-sdk/resolver": "^0.1.2" }, "devDependencies": { "@credo-ts/node": "workspace:*", diff --git a/packages/hedera/tests/unit/hedera-ledger-service.test.ts b/packages/hedera/tests/unit/hedera-ledger-service.test.ts index 4d6a83ed2f..49c0f0c68b 100644 --- a/packages/hedera/tests/unit/hedera-ledger-service.test.ts +++ b/packages/hedera/tests/unit/hedera-ledger-service.test.ts @@ -565,7 +565,10 @@ describe('HederaLedgerService', () => { }, } const result = await service.registerRevocationStatusList(mockAgentContext as AgentContext, options) - expect(mockSdk.registerRevocationStatusList).toHaveBeenCalledWith(options) + expect(mockSdk.registerRevocationStatusList).toHaveBeenCalledWith({ + ...options, + issuerKeyDer: expect.anything(), + }) expect(result).toBe('registerRevStatus') }) }) From bd7175dbf6ccf282ccb77e83155058e6103b1376 Mon Sep 17 00:00:00 2001 From: "andrey.kononov" Date: Wed, 20 Aug 2025 11:48:07 +0300 Subject: [PATCH 85/89] Up used libraries --- pnpm-lock.yaml | 184 ++++++++++++++++++++++++++----------------------- 1 file changed, 96 insertions(+), 88 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f18faf7799..12ee52cb2d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -174,7 +174,7 @@ importers: dependencies: '@hiero-did-sdk/client': specifier: 0.1.0 - version: 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + version: 0.1.0(bn.js@5.2.1) '@hyperledger/anoncreds-nodejs': specifier: 'catalog:' version: 0.3.1 @@ -686,26 +686,26 @@ importers: specifier: ^2.66.0 version: 2.70.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) '@hiero-did-sdk/anoncreds': - specifier: 0.1.0 - version: 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + specifier: ^0.1.2 + version: 0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) '@hiero-did-sdk/client': - specifier: 0.1.0 - version: 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + specifier: ^0.1.2 + version: 0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) '@hiero-did-sdk/core': - specifier: 0.1.0 - version: 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + specifier: ^0.1.2 + version: 0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) '@hiero-did-sdk/hcs': - specifier: 0.1.0 - version: 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + specifier: ^0.1.2 + version: 0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) '@hiero-did-sdk/publisher-internal': - specifier: 0.1.0 - version: 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + specifier: ^0.1.2 + version: 0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) '@hiero-did-sdk/registrar': - specifier: 0.1.0 - version: 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + specifier: ^0.1.2 + version: 0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) '@hiero-did-sdk/resolver': - specifier: 0.1.0 - version: 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + specifier: ^0.1.2 + version: 0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) devDependencies: '@credo-ts/node': specifier: workspace:* @@ -2559,60 +2559,64 @@ packages: peerDependencies: bn.js: ^5.2.1 - '@hiero-did-sdk/anoncreds@0.1.0': - resolution: {integrity: sha512-9+DPsjICXUiQrM5+kSDvV9DMSGfuh/xyo21kFBe8Tm9f7khbCz9tPLRKIiK9OfanZB0hWG6htBS+cwCb7SrLDw==} + '@hiero-did-sdk/anoncreds@0.1.2': + resolution: {integrity: sha512-Htq627498/XP9mZRhkGlT1rb+DIC4TtQSfATv1zYzwszp1ZCc0Ii9nqePCitIOjj33w1pn6ugyiRMXKAqmsDAA==} engines: {node: '>=20'} - '@hiero-did-sdk/cache@0.1.0': - resolution: {integrity: sha512-JK58CiMDoezher6exIMAO+YKFi4mFwRdY6PD1RCB36+A8OAkOk1Od3qUKm27rv4pXEh16lY/DKB/xse8b009iQ==} + '@hiero-did-sdk/cache@0.1.2': + resolution: {integrity: sha512-stj/s2dZ6nPcbg+dXcQ1HiGR4nd/eHtZu3kxQ4PlXQ7HcwnMFMO+DZE1hdh8vwPVD/JCtUzy2BrPdJXQwIzhwA==} engines: {node: '>=20'} '@hiero-did-sdk/client@0.1.0': resolution: {integrity: sha512-8EBsjVxxEZEdQKePenBCo1HXKRK/70p/XRgFPzWIplUE+2jbmfy7NGqx8tzihK0NlXpA17ojp4Pu5wZJONolmA==} engines: {node: '>=20'} - '@hiero-did-sdk/core@0.1.0': - resolution: {integrity: sha512-qbV74xqRQBnTMpm7MGlEcqBHbiHD0+QagU698ZXKB/X3dz1Mf8kvmoZdaPPS+bIq7S6nJqf6u9xd+L0OKLgzbg==} + '@hiero-did-sdk/client@0.1.2': + resolution: {integrity: sha512-1HOk6O13+ex9KOxkaxhD27aEeubwT1UAAyOFVo7YKEkXBOJc1PPAZVPbkYOyyuYA+UEUT6ntUvXmhsYvm8IMog==} engines: {node: '>=20'} - '@hiero-did-sdk/crypto@0.1.0': - resolution: {integrity: sha512-5wGuufZpcaDf3XYmX0CrCtGA9F9Zkitj+DjGVebVEJEOr9CiZeWWoJ/rS1zxOBPNWyZH3aWKG9vUqJ8RyOXiPg==} + '@hiero-did-sdk/core@0.1.2': + resolution: {integrity: sha512-TqKR1/vg9vg4TmGB3y5oYCDS1d+5amF95EUBVj2KJI4wgKqprtoMSQP6sWxhKwkXH1vdhRhRYiUOnadq2IuL8Q==} engines: {node: '>=20'} - '@hiero-did-sdk/hcs@0.1.0': - resolution: {integrity: sha512-Eb5pUrdXHcqNISN3kDZiQCFRKcMhrSyyuSMRrD1mYvUG2OGi5nleaUoR6xK2u0G/jJ8hrgytXuYONTim/6wJ+Q==} + '@hiero-did-sdk/crypto@0.1.2': + resolution: {integrity: sha512-wURtHaiKOyJ9BEf10BvBi13Qy2s4dTYpH5A3mOGmxetsy2vjUvd+pIgjzP+P7A3Zskni2b8iyrRe70G/LiR5fA==} engines: {node: '>=20'} - '@hiero-did-sdk/lifecycle@0.1.0': - resolution: {integrity: sha512-j+pIqGFz7TVYZYM8R4FFHT+y859X5UPC7ZGLY7fDtEwsRGRlU6DllhO3octh4qyoJ9BkCJyU8omZjAKeq/WW4g==} + '@hiero-did-sdk/hcs@0.1.2': + resolution: {integrity: sha512-pyWQAKrS93hmj+ydOZRr3vB6ZObxx8wHRwvJb67YADudU6FhWH0FyWmflDiJ2D+f1a+Z3EsuF6Drbui9Ja0AVQ==} engines: {node: '>=20'} - '@hiero-did-sdk/messages@0.1.0': - resolution: {integrity: sha512-j5GRYzJc+Fp2/ILhOCsE62dJwK9efqCu8YbzIVR3o7hGx7HzAC1fbM73myQqBTrcpxQJkRktV8lCeEKK9nOYGw==} + '@hiero-did-sdk/lifecycle@0.1.2': + resolution: {integrity: sha512-QYjXlQWSRgfEmsXTQj5X5lRZ7E2GXG+6yKA3WsPFjG4MoPC6AL1i1ZXczsDOfGGLxglQGJjf78CL2fQDjxMtlg==} engines: {node: '>=20'} - '@hiero-did-sdk/publisher-internal@0.1.0': - resolution: {integrity: sha512-lMBeltfo+NPqVik148h5VWwLrvDiXVYTJyKkaev9/JatTZlJELdYhtvWyBPPSvCikDFf8Td1QGe3wq/Jm4kbOA==} + '@hiero-did-sdk/messages@0.1.2': + resolution: {integrity: sha512-dIm0aM519qTCNrDkT14IMy3l7n8L4G1EsT52Sl/Q0FIEQiLDwCiiJO866a8UXHe+7FH1V6n0yOERiggGwIZhbA==} engines: {node: '>=20'} - '@hiero-did-sdk/registrar@0.1.0': - resolution: {integrity: sha512-zpRxQy24R+ZYxX6N4+VVxZwanxEfkCkcbzDncp8q4q/7Tru5bkAs+WghljiQS0CZPvSwP0iv21SsDEWjDtkKBw==} + '@hiero-did-sdk/publisher-internal@0.1.2': + resolution: {integrity: sha512-vs4NRfF3+/uzoL3b2edaIeGNLt5jWx5+KruYLgmbgeP21Eb3ZrClZEZGRQaeU5IP/nqxCHalpffs1nI/kVxymA==} engines: {node: '>=20'} - '@hiero-did-sdk/resolver@0.1.0': - resolution: {integrity: sha512-/SVglErskv8qhBrcvgxHEgv6t1vwX0eJ3Q90QSTqhmnNIZCtjoI9yP/bo7MONBwsowY2DUCF18s5vT2/k2V3gQ==} + '@hiero-did-sdk/registrar@0.1.2': + resolution: {integrity: sha512-aa+khHIqkgF3geOhIxM9eKRNNgYiPdaXkf9Rq1jByoVwo/liLtdoe8xOQfRL3YMEVf94ztbGjYpb9NmeaZY2Ow==} engines: {node: '>=20'} - '@hiero-did-sdk/signer-internal@0.1.0': - resolution: {integrity: sha512-Z55sq1ExxtWZHzZcydQS4eg5G8w+nWx5uMQwAZrS92m6s9G1kg4z90tM321NQca6d9kFIjp59NYQA1inhxLf1w==} + '@hiero-did-sdk/resolver@0.1.2': + resolution: {integrity: sha512-9r9s2SVrPPaMmIKjbO7UgxmC0qkxYSuO06nv2m8A1tq11w9EDkLoIK+u8Fdgdh2HGZHZ9ZLmFQn9QRl2Y1tnYQ==} engines: {node: '>=20'} - '@hiero-did-sdk/verifier-internal@0.1.0': - resolution: {integrity: sha512-AyJz0HqbFO/mtY0t5Fpx7LBrRG5fI8tR5b0LVjhnDsvfCt3hOeLOoqnbv28x7Kljsyz+2ZJG3IPoawF5To5NGA==} + '@hiero-did-sdk/signer-internal@0.1.2': + resolution: {integrity: sha512-cpwHgW1lUCe8UuyT9P2iasQ0AVynmvGFueM21qxOr4qXFXI0oy0mGgORDsnXOnljgy7Yn8/QvBVxjeWx569yyg==} engines: {node: '>=20'} - '@hiero-did-sdk/zstd@0.1.0': - resolution: {integrity: sha512-Y5jNDMOR268rZJBgTdwg5KjZeXijYjfCdu55P5jhzWXkO3lKHdd5jJR46DLFWse+/WaS9Ev8pz2uX+bHium8tQ==} + '@hiero-did-sdk/verifier-internal@0.1.2': + resolution: {integrity: sha512-rOC1DbqCCH63NnVaF31bsSQc+iDxpqW97GwL+br1QulpcUpGXPTUoCwTadPd1qRUrlFU4Rh1yDR3IW+4aqVsqA==} + engines: {node: '>=20'} + + '@hiero-did-sdk/zstd@0.1.2': + resolution: {integrity: sha512-IaqgqRLBrn3wTOUsYMo55OG1uU8gSLIWNnimbxLpZs6ZUvL2ri36HUmpjLT1ZypgupAcPscM+BLPIRMUFWjwZQ==} engines: {node: '>=20'} '@hyperledger/anoncreds-nodejs@0.3.1': @@ -3074,9 +3078,6 @@ packages: resolution: {integrity: sha512-lzD84av1ZQhYUS+jsGqJiCMaJO2dn9u+RTT9n9q6D3SaKVwWqv+7AoRKqBu19bkwyE+iFRl1ymr40QS90jVFYg==} engines: {node: '>=14.15'} - '@scure/base@1.2.1': - resolution: {integrity: sha512-DGmGtC8Tt63J5GfHgfl5CuAXh96VF/LD8K9Hr/Gv0J2lAoRGlPOMpqMpMbCTOoOJMZCk2Xt+DskdDyn6dEFdzQ==} - '@scure/base@1.2.6': resolution: {integrity: sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg==} @@ -3167,6 +3168,7 @@ packages: '@sphereon/kmp-mdoc-core@0.2.0-SNAPSHOT.26': resolution: {integrity: sha512-QXJ6R8ENiZV2rPMbn06cw5JKwqUYN1kzVRbYfONqE1PEXx1noQ4md7uxr2zSczi0ubKkNcbyYDNtIMTZIhGzmQ==} + bundledDependencies: [] '@sphereon/pex-models@2.3.2': resolution: {integrity: sha512-foFxfLkRwcn/MOp/eht46Q7wsvpQGlO7aowowIIb5Tz9u97kYZ2kz6K2h2ODxWuv5CRA7Q0MY8XUBGE2lfOhOQ==} @@ -10506,26 +10508,26 @@ snapshots: - expo-crypto - react-native - '@hiero-did-sdk/anoncreds@0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': + '@hiero-did-sdk/anoncreds@0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': dependencies: - '@hiero-did-sdk/core': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) - '@hiero-did-sdk/hcs': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) - '@hiero-did-sdk/zstd': 0.1.0 + '@hiero-did-sdk/core': 0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/hcs': 0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/zstd': 0.1.2 buffer: 6.0.3 transitivePeerDependencies: - bn.js - expo-crypto - react-native - '@hiero-did-sdk/cache@0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': + '@hiero-did-sdk/cache@0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': dependencies: - '@hiero-did-sdk/core': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/core': 0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) transitivePeerDependencies: - bn.js - expo-crypto - react-native - '@hiero-did-sdk/client@0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': + '@hiero-did-sdk/client@0.1.0(bn.js@5.2.1)': dependencies: '@hashgraph/sdk': 2.70.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) transitivePeerDependencies: @@ -10533,7 +10535,15 @@ snapshots: - expo-crypto - react-native - '@hiero-did-sdk/core@0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': + '@hiero-did-sdk/client@0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': + dependencies: + '@hashgraph/sdk': 2.70.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + transitivePeerDependencies: + - bn.js + - expo-crypto + - react-native + + '@hiero-did-sdk/core@0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': dependencies: '@hashgraph/sdk': 2.70.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) '@scure/base': 1.2.6 @@ -10544,105 +10554,105 @@ snapshots: - expo-crypto - react-native - '@hiero-did-sdk/crypto@0.1.0': + '@hiero-did-sdk/crypto@0.1.2': dependencies: buffer: 6.0.3 - '@hiero-did-sdk/hcs@0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': + '@hiero-did-sdk/hcs@0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': dependencies: '@hashgraph/sdk': 2.70.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) - '@hiero-did-sdk/cache': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) - '@hiero-did-sdk/client': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) - '@hiero-did-sdk/core': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) - '@hiero-did-sdk/crypto': 0.1.0 - '@hiero-did-sdk/zstd': 0.1.0 + '@hiero-did-sdk/cache': 0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/client': 0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/core': 0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/crypto': 0.1.2 + '@hiero-did-sdk/zstd': 0.1.2 buffer: 6.0.3 transitivePeerDependencies: - bn.js - expo-crypto - react-native - '@hiero-did-sdk/lifecycle@0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': + '@hiero-did-sdk/lifecycle@0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': dependencies: - '@hiero-did-sdk/core': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/core': 0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) buffer: 6.0.3 transitivePeerDependencies: - bn.js - expo-crypto - react-native - '@hiero-did-sdk/messages@0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': + '@hiero-did-sdk/messages@0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': dependencies: '@hashgraph/sdk': 2.70.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) - '@hiero-did-sdk/core': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) - '@hiero-did-sdk/lifecycle': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) - '@hiero-did-sdk/resolver': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/core': 0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/lifecycle': 0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/resolver': 0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) buffer: 6.0.3 transitivePeerDependencies: - bn.js - expo-crypto - react-native - '@hiero-did-sdk/publisher-internal@0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': + '@hiero-did-sdk/publisher-internal@0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': dependencies: '@hashgraph/sdk': 2.70.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) - '@hiero-did-sdk/core': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/core': 0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) buffer: 6.0.3 transitivePeerDependencies: - bn.js - expo-crypto - react-native - '@hiero-did-sdk/registrar@0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': + '@hiero-did-sdk/registrar@0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': dependencies: '@hashgraph/sdk': 2.70.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) - '@hiero-did-sdk/core': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) - '@hiero-did-sdk/lifecycle': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) - '@hiero-did-sdk/messages': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) - '@hiero-did-sdk/publisher-internal': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) - '@hiero-did-sdk/resolver': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) - '@hiero-did-sdk/signer-internal': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) - '@hiero-did-sdk/verifier-internal': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/core': 0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/lifecycle': 0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/messages': 0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/publisher-internal': 0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/resolver': 0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/signer-internal': 0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/verifier-internal': 0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) buffer: 6.0.3 transitivePeerDependencies: - bn.js - expo-crypto - react-native - '@hiero-did-sdk/resolver@0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': + '@hiero-did-sdk/resolver@0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': dependencies: '@hashgraph/sdk': 2.70.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) - '@hiero-did-sdk/client': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) - '@hiero-did-sdk/core': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) - '@hiero-did-sdk/hcs': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) - '@hiero-did-sdk/verifier-internal': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/client': 0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/core': 0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/hcs': 0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/verifier-internal': 0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) buffer: 6.0.3 transitivePeerDependencies: - bn.js - expo-crypto - react-native - '@hiero-did-sdk/signer-internal@0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': + '@hiero-did-sdk/signer-internal@0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': dependencies: '@hashgraph/sdk': 2.70.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) - '@hiero-did-sdk/core': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/core': 0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) buffer: 6.0.3 transitivePeerDependencies: - bn.js - expo-crypto - react-native - '@hiero-did-sdk/verifier-internal@0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': + '@hiero-did-sdk/verifier-internal@0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': dependencies: '@hashgraph/sdk': 2.70.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) - '@hiero-did-sdk/core': 0.1.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/core': 0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) buffer: 6.0.3 transitivePeerDependencies: - bn.js - expo-crypto - react-native - '@hiero-did-sdk/zstd@0.1.0': {} + '@hiero-did-sdk/zstd@0.1.2': {} '@hyperledger/anoncreds-nodejs@0.3.1': dependencies: @@ -11548,8 +11558,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@scure/base@1.2.1': {} - '@scure/base@1.2.6': {} '@sd-jwt/core@0.10.0': @@ -13065,7 +13073,7 @@ snapshots: '@noble/ciphers': 1.2.1 '@noble/curves': 1.9.2 '@noble/hashes': 1.8.0 - '@scure/base': 1.2.1 + '@scure/base': 1.2.6 canonicalize: 2.0.0 did-resolver: 4.1.0 multibase: 4.0.6 From 8a07861ded3778740e007e3034bf9351a5513101 Mon Sep 17 00:00:00 2001 From: "andrey.kononov" Date: Wed, 20 Aug 2025 12:03:41 +0300 Subject: [PATCH 86/89] Lint --- packages/hedera/src/ledger/HederaLedgerService.ts | 4 ++-- packages/hedera/tests/unit/hedera-ledger-service.test.ts | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/hedera/src/ledger/HederaLedgerService.ts b/packages/hedera/src/ledger/HederaLedgerService.ts index 257531dd43..b915d437e8 100644 --- a/packages/hedera/src/ledger/HederaLedgerService.ts +++ b/packages/hedera/src/ledger/HederaLedgerService.ts @@ -335,8 +335,8 @@ export class HederaLedgerService { const registry = this.getHederaAnoncredsRegistry(agentContext) const issuerPrivateKey = await this.getIssuerPrivateKey(agentContext, options.revocationStatusList.issuerId) return await registry.registerRevocationStatusList({ - ...options, - issuerKeyDer: issuerPrivateKey.toStringDer(), + ...options, + issuerKeyDer: issuerPrivateKey.toStringDer(), }) } diff --git a/packages/hedera/tests/unit/hedera-ledger-service.test.ts b/packages/hedera/tests/unit/hedera-ledger-service.test.ts index 49c0f0c68b..e7f946ae7e 100644 --- a/packages/hedera/tests/unit/hedera-ledger-service.test.ts +++ b/packages/hedera/tests/unit/hedera-ledger-service.test.ts @@ -566,8 +566,8 @@ describe('HederaLedgerService', () => { } const result = await service.registerRevocationStatusList(mockAgentContext as AgentContext, options) expect(mockSdk.registerRevocationStatusList).toHaveBeenCalledWith({ - ...options, - issuerKeyDer: expect.anything(), + ...options, + issuerKeyDer: expect.anything(), }) expect(result).toBe('registerRevStatus') }) From bda25828843b3c69bd204cb11f81af445f829ae9 Mon Sep 17 00:00:00 2001 From: Alexander Shenshin Date: Wed, 10 Sep 2025 19:43:02 +0300 Subject: [PATCH 87/89] Misc cleanup before OWF contribution + update tests Signed-off-by: Alexander Shenshin --- demo/package.json | 2 +- packages/hedera/src/dids/HederaDidResolver.ts | 4 +- .../hedera/src/ledger/HederaLedgerService.ts | 187 ++++--- .../hedera/src/ledger/cache/CredoCache.ts | 6 +- .../src/ledger/publisher/KmsPublisher.ts | 13 +- ... => hedera-anoncreds-registry.e2e.test.ts} | 17 +- ...st.ts => hedera-did-registrar.e2e.test.ts} | 33 +- ...est.ts => hedera-did-resolver.e2e.test.ts} | 4 +- .../tests/integration/utils/hederaModule.ts | 11 +- .../hedera/tests/integration/utils/index.ts | 3 - .../tests/integration/utils/testCache.ts | 29 -- .../integration/utils/testTailsFileService.ts | 61 --- .../hedera/tests/integration/utils/utils.ts | 1 - packages/hedera/tests/tsconfig.json | 3 - .../tests/unit/fixtures/did-document.ts | 28 ++ .../unit/hedera-anoncres-registry.test.ts | 190 +++---- .../tests/unit/hedera-did-registrar.test.ts | 206 ++++---- .../tests/unit/hedera-did-resolver.test.ts | 74 ++- .../tests/unit/hedera-ledger-service.test.ts | 470 ++++++++---------- .../hedera/tests/unit/kms-publisher.test.ts | 11 - packages/hedera/tests/unit/utils.test.ts | 13 +- pnpm-lock.yaml | 17 +- 22 files changed, 591 insertions(+), 792 deletions(-) rename packages/hedera/tests/integration/{HederaAnoncredsRegistry.e2e.test.ts => hedera-anoncreds-registry.e2e.test.ts} (90%) rename packages/hedera/tests/integration/{HederaDidRegistrar.e2e.test.ts => hedera-did-registrar.e2e.test.ts} (90%) rename packages/hedera/tests/integration/{HederaDidResolver.e2e.test.ts => hedera-did-resolver.e2e.test.ts} (90%) delete mode 100644 packages/hedera/tests/integration/utils/testCache.ts delete mode 100644 packages/hedera/tests/integration/utils/testTailsFileService.ts delete mode 100644 packages/hedera/tests/integration/utils/utils.ts delete mode 100644 packages/hedera/tests/tsconfig.json create mode 100644 packages/hedera/tests/unit/fixtures/did-document.ts diff --git a/demo/package.json b/demo/package.json index 9378ba8e81..c3eed26377 100644 --- a/demo/package.json +++ b/demo/package.json @@ -13,7 +13,7 @@ "faber": "ts-node src/FaberInquirer.ts" }, "dependencies": { - "@hiero-did-sdk/client": "0.1.0", + "@hiero-did-sdk/client": "0.1.2", "@hyperledger/anoncreds-nodejs": "catalog:", "@hyperledger/indy-vdr-nodejs": "catalog:", "@openwallet-foundation/askar-nodejs": "catalog:", diff --git a/packages/hedera/src/dids/HederaDidResolver.ts b/packages/hedera/src/dids/HederaDidResolver.ts index c978f19ca0..1a0a241bdb 100644 --- a/packages/hedera/src/dids/HederaDidResolver.ts +++ b/packages/hedera/src/dids/HederaDidResolver.ts @@ -11,8 +11,8 @@ import { HederaLedgerService } from '../ledger/HederaLedgerService' export class HederaDidResolver implements DidResolver { public readonly supportedMethods = ['hedera'] - public readonly allowsCaching: boolean = true - public readonly allowsLocalDidRecord?: boolean | undefined = true + public readonly allowsCaching = true + public readonly allowsLocalDidRecord = true async resolve( agentContext: AgentContext, diff --git a/packages/hedera/src/ledger/HederaLedgerService.ts b/packages/hedera/src/ledger/HederaLedgerService.ts index b915d437e8..1c8d8e723b 100644 --- a/packages/hedera/src/ledger/HederaLedgerService.ts +++ b/packages/hedera/src/ledger/HederaLedgerService.ts @@ -45,6 +45,7 @@ import { HederaModuleConfig } from '../HederaModuleConfig' import { CredoCache } from './cache/CredoCache' import { KmsPublisher } from './publisher/KmsPublisher' import { createOrGetKey, getMultibasePublicKey } from './utils' +import { AskarKeyManagementService } from '@credo-ts/askar' export interface HederaDidCreateOptions extends DidCreateOptions { method: 'hedera' @@ -81,8 +82,6 @@ export class HederaLedgerService { this.clientService = new HederaClientService(config.options) } - /* Dids */ - public async resolveDid(agentContext: AgentContext, did: string): Promise { const topicReader = this.getHederaHcsTopicReader(agentContext) return await resolveDID(did, 'application/ld+json;profile="https://w3id.org/did-resolution"', { topicReader }) @@ -158,14 +157,12 @@ export class HederaLedgerService { throw new Error('DidDocumentOperation is required') } - // Check root key presents - const rootKey = secret?.keys?.find((k) => k.didDocumentRelativeKeyId === DID_ROOT_KEY_ID) + const rootKey = secret?.keys?.find((key) => key.didDocumentRelativeKeyId === DID_ROOT_KEY_ID) if (!rootKey?.kmsKeyId) { throw new Error('The root key not found in the KMS') } - // Check all required keys presents - this.checkRequiredDidDocumentKeys(didDocument, secret?.keys ?? []) + this.validateDidUpdateKeys(didDocument, secret?.keys ?? []) const { network: networkName } = parseDID(did) return this.clientService.withClient({ networkName }, async (client: Client) => { @@ -223,7 +220,7 @@ export class HederaLedgerService { const kms = agentContext.dependencyManager.resolve(Kms.KeyManagementApi) - const rootKey = secret?.keys?.find((k) => k.didDocumentRelativeKeyId === DID_ROOT_KEY_ID) + const rootKey = secret?.keys?.find((key) => key.didDocumentRelativeKeyId === DID_ROOT_KEY_ID) if (!rootKey?.kmsKeyId) { throw new Error('The root key not found in the KMS') } @@ -263,55 +260,53 @@ export class HederaLedgerService { }) } - /* Anoncreds*/ - - async getSchema(agentContext: AgentContext, schemaId: string): Promise { - const registry = this.getHederaAnoncredsRegistry(agentContext) - return await registry.getSchema(schemaId) + getSchema(agentContext: AgentContext, schemaId: string): Promise { + const registry = this.getHederaAnonCredsRegistry(agentContext) + return registry.getSchema(schemaId) } async registerSchema(agentContext: AgentContext, options: RegisterSchemaOptions): Promise { - const registry = this.getHederaAnoncredsRegistry(agentContext) + const registry = this.getHederaAnonCredsRegistry(agentContext) const issuerPrivateKey = await this.getIssuerPrivateKey(agentContext, options.schema.issuerId) - return await registry.registerSchema({ ...options, issuerKeyDer: issuerPrivateKey.toStringDer() }) + return registry.registerSchema({ ...options, issuerKeyDer: issuerPrivateKey.toStringDer() }) } - async getCredentialDefinition( + getCredentialDefinition( agentContext: AgentContext, credentialDefinitionId: string ): Promise { - const registry = this.getHederaAnoncredsRegistry(agentContext) - return await registry.getCredentialDefinition(credentialDefinitionId) + const registry = this.getHederaAnonCredsRegistry(agentContext) + return registry.getCredentialDefinition(credentialDefinitionId) } async registerCredentialDefinition( agentContext: AgentContext, options: RegisterCredentialDefinitionOptions ): Promise { - const registry = this.getHederaAnoncredsRegistry(agentContext) + const registry = this.getHederaAnonCredsRegistry(agentContext) const issuerPrivateKey = await this.getIssuerPrivateKey(agentContext, options.credentialDefinition.issuerId) return await registry.registerCredentialDefinition({ ...options, issuerKeyDer: issuerPrivateKey.toStringDer(), options: { - supportRevocation: options.options?.supportRevocation === true, + supportRevocation: !!options.options?.supportRevocation, }, }) } - async getRevocationRegistryDefinition( + getRevocationRegistryDefinition( agentContext: AgentContext, revocationRegistryDefinitionId: string ): Promise { - const registry = this.getHederaAnoncredsRegistry(agentContext) - return await registry.getRevocationRegistryDefinition(revocationRegistryDefinitionId) + const registry = this.getHederaAnonCredsRegistry(agentContext) + return registry.getRevocationRegistryDefinition(revocationRegistryDefinitionId) } async registerRevocationRegistryDefinition( agentContext: AgentContext, options: RegisterRevocationRegistryDefinitionOptions ): Promise { - const registry = this.getHederaAnoncredsRegistry(agentContext) + const registry = this.getHederaAnonCredsRegistry(agentContext) const issuerPrivateKey = await this.getIssuerPrivateKey(agentContext, options.revocationRegistryDefinition.issuerId) return await registry.registerRevocationRegistryDefinition({ ...options, @@ -319,20 +314,20 @@ export class HederaLedgerService { }) } - async getRevocationStatusList( + getRevocationStatusList( agentContext: AgentContext, revocationRegistryId: string, timestamp: number ): Promise { - const registry = this.getHederaAnoncredsRegistry(agentContext) - return await registry.getRevocationStatusList(revocationRegistryId, timestamp) + const registry = this.getHederaAnonCredsRegistry(agentContext) + return registry.getRevocationStatusList(revocationRegistryId, timestamp) } async registerRevocationStatusList( agentContext: AgentContext, options: RegisterRevocationStatusListOptions ): Promise { - const registry = this.getHederaAnoncredsRegistry(agentContext) + const registry = this.getHederaAnonCredsRegistry(agentContext) const issuerPrivateKey = await this.getIssuerPrivateKey(agentContext, options.revocationStatusList.issuerId) return await registry.registerRevocationStatusList({ ...options, @@ -340,8 +335,6 @@ export class HederaLedgerService { }) } - // Private methods - private getHederaHcsTopicReader(agentContext: AgentContext): TopicReaderHederaHcs { const cache = this.config.options.cache ?? new CredoCache(agentContext) return new TopicReaderHederaHcs({ ...this.config.options, cache }) @@ -353,84 +346,81 @@ export class HederaLedgerService { return new KmsPublisher(agentContext, client, key) } - private getHederaAnoncredsRegistry(agentContext: AgentContext): HederaAnoncredsRegistry { + private getHederaAnonCredsRegistry(agentContext: AgentContext): HederaAnoncredsRegistry { const cache = this.config.options.cache ?? new CredoCache(agentContext) return new HederaAnoncredsRegistry({ ...this.config.options, cache }) } - private isDidRootKeyId(id: string): boolean { - return id.endsWith(DID_ROOT_KEY_ID) - } - - private getId(item: { id: string } | string): string { + private getDidDocumentEntryId(item: { id: string } | string): string { const id = typeof item === 'string' ? item : item.id return id.includes('#') ? `#${id.split('#').pop()}` : id } - // biome-ignore lint/suspicious/noExplicitAny: - private getDiff(currentArray?: any[], newArray?: any[]) { - const currentList = currentArray || [] - const newList = newArray || [] + private getDidDocumentPropertyDiff( + originalEntries: Array = [], + updatedEntries: Array = [] + ) { + const originalIds = new Set(originalEntries.map((item) => this.getDidDocumentEntryId(item))) + const updatedIds = new Set(updatedEntries.map((item) => this.getDidDocumentEntryId(item))) - const currentIds = new Set(currentList.map((item) => this.getId(item))) - const newIds = new Set(newList.map((item) => this.getId(item))) + const unchangedEntries = updatedEntries.filter((item) => originalIds.has(this.getDidDocumentEntryId(item))) + const newEntries = updatedEntries.filter((item) => !originalIds.has(this.getDidDocumentEntryId(item))) + const removedEntries = originalEntries.filter((item) => !updatedIds.has(this.getDidDocumentEntryId(item))) - const existingItems = newList.filter((item) => currentIds.has(this.getId(item))).map((item) => item.id) - const newItems = newList.filter((item) => !currentIds.has(this.getId(item))) - const missingItems = currentList.filter((item) => !newIds.has(this.getId(item))) - - return { existingItems, newItems, missingItems } + return { unchangedEntries, newEntries, removedEntries } } private async signRequests( - // biome-ignore lint/suspicious/noExplicitAny: - signingRequests: Record, + signingRequests: Record, kms: KeyManagementApi, keyId: string ): Promise> { const result: Record = {} for (const [key, request] of Object.entries(signingRequests)) { - const signResult = await kms.sign({ + const { signature } = await kms.sign({ keyId, data: request.serializedPayload, algorithm: 'EdDSA', }) - result[key] = signResult.signature + result[key] = signature } return result } - private checkRequiredDidDocumentKeys(didDocument: DidDocument | Partial, keys: DidDocumentKey[]) { - const fields = [ + private validateDidUpdateKeys(didDocument: DidDocument | Partial, keys: DidDocumentKey[]) { + const verificationRelationships = [ 'verificationMethod', 'assertionMethod', 'authentication', 'capabilityDelegation', 'capabilityInvocation', 'keyAgreement', - ] - for (const field of fields) { - // biome-ignore lint/suspicious/noExplicitAny: - const fieldValue = (didDocument as any)[field] - if (fieldValue) { - const fieldValues = Array.isArray(fieldValue) ? fieldValue : [fieldValue] - - for (const value of fieldValues) { - const id = this.getId(value) - if (!keys.some((key) => key.didDocumentRelativeKeyId === id)) { - throw new Error(`Key ${id} from ${field} not found in keys`) - } + ] as const + + for (const relationship of verificationRelationships) { + const entries = didDocument[relationship] + if (!entries) continue + + for (const entry of entries) { + const id = this.getDidDocumentEntryId(entry) + if (!keys.some((key) => key.didDocumentRelativeKeyId === id)) { + throw new Error( + `Key ${id} is present in updated DID Document, but missing from DID record keys and DID update arguments` + ) } } } } - // biome-ignore lint/suspicious/noExplicitAny: - private prepareDidUpdates(currentDoc: any, newDoc: any, operation: string): DIDUpdateBuilder { + private prepareDidUpdates( + originalDocument: DidDocument | Partial, + newDocument: DidDocument | Partial, + operation: string + ): DIDUpdateBuilder { const builder = new DIDUpdateBuilder() - const fields = [ + const properties = [ 'service', 'verificationMethod', 'assertionMethod', @@ -438,37 +428,43 @@ export class HederaLedgerService { 'capabilityDelegation', 'capabilityInvocation', 'keyAgreement', - ] + ] as const - for (const field of fields) { - const { existingItems, newItems, missingItems } = this.getDiff(currentDoc[field], newDoc[field]) + for (const property of properties) { + const { unchangedEntries, newEntries, removedEntries } = this.getDidDocumentPropertyDiff( + originalDocument[property], + newDocument[property] + ) if (operation === 'setDidDocument') { - for (const item of missingItems) { - if (!this.isDidRootKeyId(typeof item === 'string' ? item : item.id)) { - this.getUpdateMethod(builder, field, 'remove')(this.getId(item)) - } + for (const entry of removedEntries) { + const entryId = this.getDidDocumentEntryId(entry) + if (entryId === DID_ROOT_KEY_ID) continue + const builderMethod = this.getUpdateMethod(builder, property, 'remove') + builderMethod(entryId) } - for (const item of newItems) { - if (!this.isDidRootKeyId(typeof item === 'string' ? item : item.id)) { - this.getUpdateMethod(builder, field, 'add')(item) - } + + for (const entry of newEntries) { + if (this.getDidDocumentEntryId(entry) === DID_ROOT_KEY_ID) continue + const builderMethod = this.getUpdateMethod(builder, property, 'add') + builderMethod(entry) } } if (operation === 'addToDidDocument') { - for (const item of newItems) { - if (!this.isDidRootKeyId(typeof item === 'string' ? item : item.id)) { - this.getUpdateMethod(builder, field, 'add')(item) - } + for (const entry of newEntries) { + if (this.getDidDocumentEntryId(entry) === DID_ROOT_KEY_ID) continue + const builderMethod = this.getUpdateMethod(builder, property, 'add') + builderMethod(entry) } } if (operation === 'removeFromDidDocument') { - for (const item of existingItems) { - if (!this.isDidRootKeyId(typeof item === 'string' ? item : item.id)) { - this.getUpdateMethod(builder, field, 'remove')(item) - } + for (const entry of unchangedEntries) { + const entryId = this.getDidDocumentEntryId(entry) + if (entryId === DID_ROOT_KEY_ID) continue + const builderMethod = this.getUpdateMethod(builder, property, 'remove') + builderMethod(entryId) } } } @@ -478,14 +474,12 @@ export class HederaLedgerService { private getUpdateMethod( builder: DIDUpdateBuilder, - field: string, + property: string, action: 'add' | 'remove' // biome-ignore lint/suspicious/noExplicitAny: ): (item: any) => DIDUpdateBuilder { // biome-ignore lint/suspicious/noExplicitAny: - type MethodDelegate = (item: any) => DIDUpdateBuilder - - const methodMap: Record> = { + const methodMap: Record DIDUpdateBuilder>> = { service: { add: (item: Service) => builder.addService(item), remove: (id: string) => builder.removeService(id), @@ -516,12 +510,12 @@ export class HederaLedgerService { }, } - const fieldMethods = methodMap[field] - if (!fieldMethods) { + const propertyMethods = methodMap[property] + if (!propertyMethods) { return () => builder } - return fieldMethods[action] + return propertyMethods[action] } private async getIssuerPrivateKey(agentContext: AgentContext, issuerId: string): Promise { @@ -529,13 +523,16 @@ export class HederaLedgerService { const kms = agentContext.dependencyManager.resolve(Kms.KeyManagementApi) const didRecord = await didRepository.findCreatedDid(agentContext, issuerId) - const rootKey = didRecord?.keys?.find((k) => k.didDocumentRelativeKeyId === DID_ROOT_KEY_ID) + const rootKey = didRecord?.keys?.find((key) => key.didDocumentRelativeKeyId === DID_ROOT_KEY_ID) if (!rootKey?.kmsKeyId) { throw new Error('The root key not found in the KMS') } // @ts-ignore - const keyManagementService = kms.getKms(agentContext) as AskarKeyManagementService + const keyManagementService = kms.getKms( + agentContext, + AskarKeyManagementService.backend + ) as AskarKeyManagementService // @ts-ignore const keyInfo = await keyManagementService.getKeyAsserted(agentContext, rootKey.kmsKeyId) diff --git a/packages/hedera/src/ledger/cache/CredoCache.ts b/packages/hedera/src/ledger/cache/CredoCache.ts index e5914f8c2f..bd6a2a634e 100644 --- a/packages/hedera/src/ledger/cache/CredoCache.ts +++ b/packages/hedera/src/ledger/cache/CredoCache.ts @@ -8,7 +8,7 @@ export class CredoCache implements Cache { constructor(private readonly agentContext: AgentContext) { this.credoCache = agentContext.dependencyManager.resolve(CacheModuleConfig).cache if (!this.credoCache) { - throw new CredoError('Error initializing cache') + throw new CredoError('Failed to initialize cache: Credo cache instance is not found in dependency manager') } } @@ -25,10 +25,10 @@ export class CredoCache implements Cache { } async clear(): Promise { - // nothing + // no-op } async cleanupExpired(): Promise { - // nothing + // no-op } } diff --git a/packages/hedera/src/ledger/publisher/KmsPublisher.ts b/packages/hedera/src/ledger/publisher/KmsPublisher.ts index f96ce34451..9de25caca5 100644 --- a/packages/hedera/src/ledger/publisher/KmsPublisher.ts +++ b/packages/hedera/src/ledger/publisher/KmsPublisher.ts @@ -8,8 +8,8 @@ import { createOrGetKey } from '../utils' export class KmsPublisher extends ClientPublisher { private readonly kms: KeyManagementApi - private keyId!: string - private submitPublicKey!: PublicKey + private keyId: string + private submitPublicKey: PublicKey constructor( agentContext: AgentContext, @@ -28,7 +28,9 @@ export class KmsPublisher extends ClientPublisher { async setKeyId(keyId: string) { this.keyId = keyId + const { publicJwk } = await createOrGetKey(this.kms, keyId) + this.submitPublicKey = KeysUtility.fromBytes( Uint8Array.from(TypedArrayEncoder.fromBase64(publicJwk.x)) ).toPublicKey() @@ -39,10 +41,6 @@ export class KmsPublisher extends ClientPublisher { } async publish(transaction: Transaction): Promise { - if (!this.submitPublicKey) { - throw new Error('Need to setup the KeyId') - } - const frozenTransaction = transaction.freezeWith(this.client) await frozenTransaction.signWith(this.submitPublicKey, async (message) => { @@ -52,7 +50,6 @@ export class KmsPublisher extends ClientPublisher { const response = await transaction.execute(this.client) - const receipt: TransactionReceipt = await response.getReceipt(this.client) - return receipt + return response.getReceipt(this.client) } } diff --git a/packages/hedera/tests/integration/HederaAnoncredsRegistry.e2e.test.ts b/packages/hedera/tests/integration/hedera-anoncreds-registry.e2e.test.ts similarity index 90% rename from packages/hedera/tests/integration/HederaAnoncredsRegistry.e2e.test.ts rename to packages/hedera/tests/integration/hedera-anoncreds-registry.e2e.test.ts index fee13c73ca..271621ab2b 100644 --- a/packages/hedera/tests/integration/HederaAnoncredsRegistry.e2e.test.ts +++ b/packages/hedera/tests/integration/hedera-anoncreds-registry.e2e.test.ts @@ -1,16 +1,15 @@ -import { Agent, ConsoleLogger, LogLevel, utils } from '@credo-ts/core' +import { Agent, ConsoleLogger, InMemoryLruCache, LogLevel, utils } from '@credo-ts/core' import { HederaDidCreateOptions } from '../../src/ledger/HederaLedgerService' -import { getHederaAgent, testCache } from './utils' +import { getHederaAgent } from './utils' describe('Hedera AnonCreds support', () => { let agent: Agent let issuerId: string const logger = new ConsoleLogger(LogLevel.fatal) - const cache = new testCache() + const cache = new InMemoryLruCache( { limit: 10 }) beforeAll(async () => { - // Initialize the agent agent = getHederaAgent({ label: 'alice', logger, @@ -18,7 +17,6 @@ describe('Hedera AnonCreds support', () => { }) await agent.initialize() - // Making the test issuerId const didRegistrarResult = await agent.dids.create({ method: 'hedera', }) @@ -42,8 +40,7 @@ describe('Hedera AnonCreds support', () => { }) describe('Hedera Anoncreds Registry', () => { - it('should executes the full workflow (register and resolve schema, credential definition, revocation registry definition, revocation status list)', async () => { - // Create the schema + it('should execute the full workflow (register and resolve schema, credential definition, revocation registry definition, revocation status list)', async () => { const schemaResult = await agent.modules.anoncreds.registerSchema({ schema: { name: utils.uuid(), @@ -58,7 +55,6 @@ describe('Hedera AnonCreds support', () => { const schemaId = schemaResult?.schemaState?.schemaId expect(schemaId).toBeDefined() - // Register credential definition for the schema const credDefResult = await agent.modules.anoncreds.registerCredentialDefinition({ credentialDefinition: { tag: 'default', @@ -75,7 +71,6 @@ describe('Hedera AnonCreds support', () => { const credentialDefinitionId = credDefResult.credentialDefinitionState.credentialDefinitionId ?? '' - // Register revocation registry definition const revRegDefRegResult = await agent.modules.anoncreds.registerRevocationRegistryDefinition({ revocationRegistryDefinition: { issuerId: issuerId, @@ -94,7 +89,6 @@ describe('Hedera AnonCreds support', () => { await agent.modules.anoncreds.getRevocationRegistryDefinition(revocationRegistryDefinitionId) expect(resolvedRevRegDef.revocationRegistryDefinitionId).toEqual(revocationRegistryDefinitionId) - // Register the init revocation status list const registerRevocationStatusListResponse = await agent.modules.anoncreds.registerRevocationStatusList({ options: {}, revocationStatusList: { @@ -106,7 +100,6 @@ describe('Hedera AnonCreds support', () => { const revocationStatusList = registerRevocationStatusListResponse?.revocationStatusListState.revocationStatusList expect(revocationStatusList).toBeDefined() - // Resolve the revocation status list const revocationStatusListResponse = await agent.modules.anoncreds.getRevocationStatusList( revocationRegistryDefinitionId, Date.now() / 1000 @@ -131,7 +124,6 @@ describe('Hedera AnonCreds support', () => { revokeUpdateRevocationStatusListResponse?.revocationStatusListState.revocationStatusList expect(revokeRevocationStatusList).toBeDefined() - // Resolve the revocation status list const revokeRevocationStatusListResponse = await agent.modules.anoncreds.getRevocationStatusList( revocationRegistryDefinitionId, Date.now() / 1000 @@ -159,7 +151,6 @@ describe('Hedera AnonCreds support', () => { issueUpdateRevocationStatusListResponse?.revocationStatusListState.revocationStatusList expect(issueRevocationStatusList).toBeDefined() - // Resolve the revocation status list const issueRevocationStatusListResponse = await agent.modules.anoncreds.getRevocationStatusList( revocationRegistryDefinitionId, Date.now() / 1000 diff --git a/packages/hedera/tests/integration/HederaDidRegistrar.e2e.test.ts b/packages/hedera/tests/integration/hedera-did-registrar.e2e.test.ts similarity index 90% rename from packages/hedera/tests/integration/HederaDidRegistrar.e2e.test.ts rename to packages/hedera/tests/integration/hedera-did-registrar.e2e.test.ts index 952edc8474..fbdc01e5b5 100644 --- a/packages/hedera/tests/integration/HederaDidRegistrar.e2e.test.ts +++ b/packages/hedera/tests/integration/hedera-did-registrar.e2e.test.ts @@ -12,7 +12,7 @@ import { getMultibasePublicKey } from '../../src/ledger/utils' import { getHederaAgent } from './utils' describe('Hedera DID registrar', () => { - const logger = new ConsoleLogger(LogLevel.fatal) + const logger = new ConsoleLogger(LogLevel.error) let agent: Agent const validDid = 'did:hedera:testnet:44eesExqdsUvLZ35FpnBPErqRGRnYbzzyG3wgCCYxkmq_0.0.6226170' @@ -282,16 +282,16 @@ describe('Hedera DID registrar', () => { const validVerification = validVerificationMethod(multibasePublicKey) didDocument.verificationMethod = [validVerification] + const expectedFailureReason = + 'Unable update DID: Key #key-1 is present in updated DID Document, but missing from DID record keys and DID update arguments' + let updateResult = await agent.dids.update({ did, didDocument, didDocumentOperation: 'addToDidDocument', }) expect(updateResult.didState.state).toEqual('failed') - if (updateResult.didState.state === 'failed') - expect(updateResult.didState.reason).toEqual( - 'Unable update DID: Key #key-1 from verificationMethod not found in keys' - ) + if (updateResult.didState.state === 'failed') expect(updateResult.didState.reason).toEqual(expectedFailureReason) didDocument.verificationMethod = undefined didDocument.assertionMethod = [validVerification] @@ -302,10 +302,7 @@ describe('Hedera DID registrar', () => { didDocumentOperation: 'addToDidDocument', }) expect(updateResult.didState.state).toEqual('failed') - if (updateResult.didState.state === 'failed') - expect(updateResult.didState.reason).toEqual( - 'Unable update DID: Key #key-1 from assertionMethod not found in keys' - ) + if (updateResult.didState.state === 'failed') expect(updateResult.didState.reason).toEqual(expectedFailureReason) didDocument.assertionMethod = undefined didDocument.authentication = [validVerification] @@ -316,10 +313,7 @@ describe('Hedera DID registrar', () => { didDocumentOperation: 'addToDidDocument', }) expect(updateResult.didState.state).toEqual('failed') - if (updateResult.didState.state === 'failed') - expect(updateResult.didState.reason).toEqual( - 'Unable update DID: Key #key-1 from authentication not found in keys' - ) + if (updateResult.didState.state === 'failed') expect(updateResult.didState.reason).toEqual(expectedFailureReason) didDocument.authentication = undefined didDocument.capabilityDelegation = [validVerification] @@ -330,10 +324,7 @@ describe('Hedera DID registrar', () => { didDocumentOperation: 'addToDidDocument', }) expect(updateResult.didState.state).toEqual('failed') - if (updateResult.didState.state === 'failed') - expect(updateResult.didState.reason).toEqual( - 'Unable update DID: Key #key-1 from capabilityDelegation not found in keys' - ) + if (updateResult.didState.state === 'failed') expect(updateResult.didState.reason).toEqual(expectedFailureReason) didDocument.capabilityDelegation = undefined didDocument.capabilityInvocation = [validVerification] @@ -344,10 +335,7 @@ describe('Hedera DID registrar', () => { didDocumentOperation: 'addToDidDocument', }) expect(updateResult.didState.state).toEqual('failed') - if (updateResult.didState.state === 'failed') - expect(updateResult.didState.reason).toEqual( - 'Unable update DID: Key #key-1 from capabilityInvocation not found in keys' - ) + if (updateResult.didState.state === 'failed') expect(updateResult.didState.reason).toEqual(expectedFailureReason) didDocument.capabilityInvocation = undefined didDocument.keyAgreement = [validVerification] @@ -358,8 +346,7 @@ describe('Hedera DID registrar', () => { didDocumentOperation: 'addToDidDocument', }) expect(updateResult.didState.state).toEqual('failed') - if (updateResult.didState.state === 'failed') - expect(updateResult.didState.reason).toEqual('Unable update DID: Key #key-1 from keyAgreement not found in keys') + if (updateResult.didState.state === 'failed') expect(updateResult.didState.reason).toEqual(expectedFailureReason) }) it('should create and deactivate a did:hedera did', async () => { diff --git a/packages/hedera/tests/integration/HederaDidResolver.e2e.test.ts b/packages/hedera/tests/integration/hedera-did-resolver.e2e.test.ts similarity index 90% rename from packages/hedera/tests/integration/HederaDidResolver.e2e.test.ts rename to packages/hedera/tests/integration/hedera-did-resolver.e2e.test.ts index 71834c6ced..cac437d51a 100644 --- a/packages/hedera/tests/integration/HederaDidResolver.e2e.test.ts +++ b/packages/hedera/tests/integration/hedera-did-resolver.e2e.test.ts @@ -3,7 +3,7 @@ import { HederaDidCreateOptions } from '../../src/ledger/HederaLedgerService' import { getHederaAgent } from './utils' describe('Hedera DID resolver', () => { - const logger = new ConsoleLogger(LogLevel.fatal) + const logger = new ConsoleLogger(LogLevel.error) let agent: Agent let did: string @@ -28,7 +28,7 @@ describe('Hedera DID resolver', () => { await agent.shutdown() }) - it('should resolve a did:hedera did from local testnet', async () => { + it('should resolve a did:hedera did from testnet', async () => { const resolveResult = await agent.dids.resolve(did) expect(JsonTransformer.toJSON(resolveResult)).toMatchObject({ diff --git a/packages/hedera/tests/integration/utils/hederaModule.ts b/packages/hedera/tests/integration/utils/hederaModule.ts index ebdfc58acd..33e6b70c52 100644 --- a/packages/hedera/tests/integration/utils/hederaModule.ts +++ b/packages/hedera/tests/integration/utils/hederaModule.ts @@ -1,6 +1,6 @@ import { AnonCredsModule } from '@credo-ts/anoncreds' import { AskarModule } from '@credo-ts/askar' -import { Agent, Cache, CacheModule, DidsModule, Logger, utils } from '@credo-ts/core' +import { Agent, Cache, CacheModule, DidsModule, Logger, utils, ModulesMap } from '@credo-ts/core' import { HederaAnonCredsRegistry, HederaDidRegistrar, @@ -11,7 +11,7 @@ import { import { agentDependencies } from '@credo-ts/node' import { anoncreds } from '@hyperledger/anoncreds-nodejs' import { askar } from '@openwallet-foundation/askar-nodejs' -import { TestTailsFileService } from './testTailsFileService' +import { InMemoryTailsFileService } from '../../../../anoncreds/tests/InMemoryTailsFileService' export const getHederaModuleConfig = (props: { operatorId?: string; operatorKey?: string }) => { const operatorId = props.operatorId ?? process.env.HEDERA_OPERATOR_ID ?? '' @@ -39,15 +39,12 @@ export const getHederaAgent = (props: { const logger = props.logger const cache = props.cache - let modules = {} - - modules = { - ...modules, + let modules: ModulesMap = { askar: new AskarModule({ askar, store: { id: label, key: label } }), anoncreds: new AnonCredsModule({ anoncreds, registries: [new HederaAnonCredsRegistry()], - tailsFileService: new TestTailsFileService(), + tailsFileService: new InMemoryTailsFileService(), }), dids: new DidsModule({ resolvers: [new HederaDidResolver()], diff --git a/packages/hedera/tests/integration/utils/index.ts b/packages/hedera/tests/integration/utils/index.ts index ca92ddeaa0..bb406f518b 100644 --- a/packages/hedera/tests/integration/utils/index.ts +++ b/packages/hedera/tests/integration/utils/index.ts @@ -1,4 +1 @@ export * from './hederaModule' -export * from './testCache' -export * from './testTailsFileService' -export * from './utils' diff --git a/packages/hedera/tests/integration/utils/testCache.ts b/packages/hedera/tests/integration/utils/testCache.ts deleted file mode 100644 index 22249ef0d5..0000000000 --- a/packages/hedera/tests/integration/utils/testCache.ts +++ /dev/null @@ -1,29 +0,0 @@ -import type { AgentContext, Cache } from '@credo-ts/core' - -export class testCache implements Cache { - // biome-ignore lint/suspicious/noExplicitAny: - private _cache: Map = new Map() - - get(_agentContext: AgentContext, key: string): Promise { - return Promise.resolve(this._cache.get(key)) - } - - set( - _agentContext: AgentContext, - key: string, - value: CacheValue, - _expiresInSeconds?: number | undefined - ): Promise { - this._cache.set(key, value) - return Promise.resolve() - } - - async remove(_agentContext: AgentContext, key: string): Promise { - this._cache.delete(key) - return Promise.resolve() - } - - clear() { - this._cache.clear() - } -} diff --git a/packages/hedera/tests/integration/utils/testTailsFileService.ts b/packages/hedera/tests/integration/utils/testTailsFileService.ts deleted file mode 100644 index ce418eed05..0000000000 --- a/packages/hedera/tests/integration/utils/testTailsFileService.ts +++ /dev/null @@ -1,61 +0,0 @@ -import type { AnonCredsRevocationRegistryDefinition } from '@credo-ts/anoncreds' -import type { AgentContext, FileSystem } from '@credo-ts/core' - -import { InjectionSymbols } from '@credo-ts/core' - -import { BasicTailsFileService } from '@credo-ts/anoncreds' - -export class TestTailsFileService extends BasicTailsFileService { - private tailsFilePaths: Record = {} - - public async uploadTailsFile( - _agentContext: AgentContext, - options: { - revocationRegistryDefinition: AnonCredsRevocationRegistryDefinition - } - ) { - this.tailsFilePaths[options.revocationRegistryDefinition.value.tailsHash] = - options.revocationRegistryDefinition.value.tailsLocation - - return { - tailsFileUrl: options.revocationRegistryDefinition.value.tailsLocation, - } - } - - public async getTailsFile( - agentContext: AgentContext, - options: { - revocationRegistryDefinition: AnonCredsRevocationRegistryDefinition - } - ) { - const { revocationRegistryDefinition } = options - const { tailsLocation, tailsHash } = revocationRegistryDefinition.value - - try { - agentContext.config.logger.debug( - `Checking to see if tails file for URL ${revocationRegistryDefinition.value.tailsLocation} has been stored in the FileSystem` - ) - - // hash is used as file identifier - const tailsExists = await this.tailsFileExists(agentContext, tailsHash) - const tailsFilePath = await this.getTailsFilePath(agentContext, tailsHash) - agentContext.config.logger.debug( - `Tails file for ${tailsLocation} ${tailsExists ? 'is stored' : 'is not stored'} at ${tailsFilePath}` - ) - - if (!tailsExists) { - agentContext.config.logger.debug(`Retrieving tails file from URL ${tailsLocation}`) - const fileSystem = agentContext.dependencyManager.resolve(InjectionSymbols.FileSystem) - await fileSystem.downloadToFile(tailsLocation, tailsFilePath) - agentContext.config.logger.debug(`Saved tails file to FileSystem at path ${tailsFilePath}`) - } - - return { tailsFilePath } - } catch (error) { - agentContext.config.logger.error(`Error while retrieving tails file from URL ${tailsLocation}`, { - error, - }) - throw error - } - } -} diff --git a/packages/hedera/tests/integration/utils/utils.ts b/packages/hedera/tests/integration/utils/utils.ts deleted file mode 100644 index 3114bf6c16..0000000000 --- a/packages/hedera/tests/integration/utils/utils.ts +++ /dev/null @@ -1 +0,0 @@ -export const getRandomStr = (n: number) => [...Array(n)].map(() => Math.random().toString(36)[2]).join('') diff --git a/packages/hedera/tests/tsconfig.json b/packages/hedera/tests/tsconfig.json deleted file mode 100644 index 105334e225..0000000000 --- a/packages/hedera/tests/tsconfig.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "extends": "../../../tsconfig.test.json" -} diff --git a/packages/hedera/tests/unit/fixtures/did-document.ts b/packages/hedera/tests/unit/fixtures/did-document.ts new file mode 100644 index 0000000000..723b1b2cad --- /dev/null +++ b/packages/hedera/tests/unit/fixtures/did-document.ts @@ -0,0 +1,28 @@ +import { ParsedDid, parseDid } from '@credo-ts/core' +import { DIDResolutionMetadata, JsonLdDIDDocument } from '@hiero-did-sdk/core' + +export const did = 'did:hedera:testnet:4BGybF4yCeYNi8RFVowK3zHc1xs2psYdkbiEvETrp3HL_0.0.1000001' +export const parsedDid: ParsedDid = parseDid(did) + +export const didDocument: Required> & JsonLdDIDDocument = { + '@context': [ + 'https://w3.org/ns/did/v1', + 'https://w3id.org/security/suites/ed25519-2018/v1', + 'https://w3id.org/security/suites/ed25519-2020/v1', + ], + id: did, + controller: did, + service: [{ id: 'mock-service', type: 'MockService', serviceEndpoint: 'https://example.com/mock-service/' }], + verificationMethod: [ + { + id: `${did}#did-root-key`, + controller: did, + type: 'Ed25519VerificationKey2020' as const, + publicKeyMultibase: 'z6MkhdY2BVKQYC2qpdFxBNu9u5qbqY8tEknzScdAkWRsjG4i', + }, + ], +} + +export const didResolutionMetadata: DIDResolutionMetadata = { + contentType: 'application/ld+json;profile="https://w3id.org/did-resolution"', +} diff --git a/packages/hedera/tests/unit/hedera-anoncres-registry.test.ts b/packages/hedera/tests/unit/hedera-anoncres-registry.test.ts index a181c7bb62..93673b79ca 100644 --- a/packages/hedera/tests/unit/hedera-anoncres-registry.test.ts +++ b/packages/hedera/tests/unit/hedera-anoncres-registry.test.ts @@ -11,55 +11,46 @@ import { RegisterRevocationStatusListReturn, RegisterSchemaOptions, RegisterSchemaReturn, - RegisterSchemaReturnStateFinished, } from '@credo-ts/anoncreds' import { AgentContext } from '@credo-ts/core' import { HederaAnonCredsRegistry } from '@credo-ts/hedera' import { HederaLedgerService } from '../../src/ledger/HederaLedgerService' - -const createMockAgentContext = () => - ({ - dependencyManager: { - resolve: jest.fn(), - }, - config: { - logger: { - trace: jest.fn(), - debug: jest.fn(), - error: jest.fn(), - }, +import { mockFunction } from '../../../core/tests/helpers' + +const mockLedgerService = { + registerSchema: jest.fn(), + getSchema: jest.fn(), + registerCredentialDefinition: jest.fn(), + getCredentialDefinition: jest.fn(), + registerRevocationRegistryDefinition: jest.fn(), + getRevocationRegistryDefinition: jest.fn(), + registerRevocationStatusList: jest.fn(), + getRevocationStatusList: jest.fn(), +} as unknown as HederaLedgerService + +const mockAgentContext = { + dependencyManager: { + resolve: jest.fn().mockImplementation((cls) => { + if (cls === HederaLedgerService) return mockLedgerService + }), + }, + config: { + logger: { + trace: jest.fn(), + debug: jest.fn(), + error: jest.fn(), }, - }) as unknown as AgentContext + }, +} as unknown as AgentContext describe('HederaAnonCredsRegistry', () => { - let service: HederaAnonCredsRegistry - let mockAgentContext: AgentContext - // biome-ignore lint/suspicious/noExplicitAny: - let mockLedgerService: any - - beforeEach(() => { - mockAgentContext = createMockAgentContext() - mockLedgerService = { - registerSchema: jest.fn(), - getSchema: jest.fn(), - registerCredentialDefinition: jest.fn(), - getCredentialDefinition: jest.fn(), - registerRevocationRegistryDefinition: jest.fn(), - getRevocationRegistryDefinition: jest.fn(), - registerRevocationStatusList: jest.fn(), - getRevocationStatusList: jest.fn(), - } - // @ts-ignore - mockAgentContext.dependencyManager.resolve.mockReturnValue(mockLedgerService) - - service = new HederaAnonCredsRegistry() - }) + const registry: HederaAnonCredsRegistry = new HederaAnonCredsRegistry() describe('registerSchema', () => { const options: RegisterSchemaOptions = { schema: { - issuerId: 'did:hedera:123', - name: 'schemaName', + issuerId: 'issuer-did', + name: 'schema-name', version: '1.0', attrNames: [], }, @@ -72,11 +63,13 @@ describe('HederaAnonCredsRegistry', () => { registrationMetadata: {}, schemaState: { state: 'finished', - } as RegisterSchemaReturnStateFinished, + schema: options.schema, + schemaId: expect.any(String), + }, } - mockLedgerService.registerSchema.mockResolvedValue(expected) + mockFunction(mockLedgerService.registerSchema).mockResolvedValue(expected) - const result = await service.registerSchema(mockAgentContext, options) + const result = await registry.registerSchema(mockAgentContext, options) expect(mockAgentContext.config.logger.trace).toHaveBeenCalledWith('Registering schema on Hedera ledger') expect(mockAgentContext.dependencyManager.resolve).toHaveBeenCalledWith( @@ -88,9 +81,9 @@ describe('HederaAnonCredsRegistry', () => { it('should catch error and return failed state', async () => { const error = new Error('fail') - mockLedgerService.registerSchema.mockRejectedValue(error) + mockFunction(mockLedgerService.registerSchema).mockRejectedValue(error) - const result = await service.registerSchema(mockAgentContext, options) + const result = await registry.registerSchema(mockAgentContext, options) expect(mockAgentContext.config.logger.debug).toHaveBeenCalledWith( `Error registering schema for did '${options.schema.issuerId}'`, @@ -102,34 +95,34 @@ describe('HederaAnonCredsRegistry', () => { }) describe('getSchema', () => { - const schemaId = 'schema-id-123' + const mockSchemaId = 'mock-schema-id' it('should call ledgerService.getSchema and return result on success', async () => { const expected: GetSchemaReturn = { - schemaId: schemaId, + schemaId: mockSchemaId, resolutionMetadata: {}, schemaMetadata: {}, } - mockLedgerService.getSchema.mockResolvedValue(expected) + mockFunction(mockLedgerService.getSchema).mockResolvedValue(expected) - const result = await service.getSchema(mockAgentContext, schemaId) + const result = await registry.getSchema(mockAgentContext, mockSchemaId) expect(mockAgentContext.config.logger.trace).toHaveBeenCalledWith( - `Resolving schema '${schemaId}' from Hedera ledger` + `Resolving schema '${mockSchemaId}' from Hedera ledger` ) - expect(mockLedgerService.getSchema).toHaveBeenCalledWith(mockAgentContext, schemaId) + expect(mockLedgerService.getSchema).toHaveBeenCalledWith(mockAgentContext, mockSchemaId) expect(result).toEqual(expected) }) it('should catch error and return notFound error state', async () => { const error = new Error('not found') - mockLedgerService.getSchema.mockRejectedValue(error) + mockFunction(mockLedgerService.getSchema).mockRejectedValue(error) - const result = await service.getSchema(mockAgentContext, schemaId) + const result = await registry.getSchema(mockAgentContext, mockSchemaId) expect(mockAgentContext.config.logger.error).toHaveBeenCalledWith( - `Error retrieving schema '${schemaId}'`, - expect.objectContaining({ error, schemaId }) + `Error retrieving schema '${mockSchemaId}'`, + expect.objectContaining({ error, schemaId: mockSchemaId }) ) expect(result.resolutionMetadata.error).toBe('notFound') expect(result.resolutionMetadata.message).toContain('not found') @@ -170,9 +163,9 @@ describe('HederaAnonCredsRegistry', () => { credentialDefinitionId: 'did:hedera:issuerId', }, } - mockLedgerService.registerCredentialDefinition.mockResolvedValue(expected) + mockFunction(mockLedgerService.registerCredentialDefinition).mockResolvedValue(expected) - const result = await service.registerCredentialDefinition(mockAgentContext, options) + const result = await registry.registerCredentialDefinition(mockAgentContext, options) expect(mockAgentContext.config.logger.trace).toHaveBeenCalledWith( 'Registering credential definition on Hedera ledger' @@ -183,9 +176,9 @@ describe('HederaAnonCredsRegistry', () => { it('should catch error and return failed state', async () => { const error = new Error('fail') - mockLedgerService.registerCredentialDefinition.mockRejectedValue(error) + mockFunction(mockLedgerService.registerCredentialDefinition).mockRejectedValue(error) - const result = await service.registerCredentialDefinition(mockAgentContext, options) + const result = await registry.registerCredentialDefinition(mockAgentContext, options) expect(mockAgentContext.config.logger.error).toHaveBeenCalledWith( `Error registering credential definition for did '${options.credentialDefinition.issuerId}'`, @@ -198,34 +191,37 @@ describe('HederaAnonCredsRegistry', () => { }) describe('getCredentialDefinition', () => { - const credentialDefinitionId = 'cred-def-123' + const mockCredentialDefinitionId = 'mock-cred-def-id' it('should call ledgerService.getCredentialDefinition and return result on success', async () => { const expected: GetCredentialDefinitionReturn = { - credentialDefinitionId, + credentialDefinitionId: mockCredentialDefinitionId, resolutionMetadata: {}, credentialDefinitionMetadata: {}, } - mockLedgerService.getCredentialDefinition.mockResolvedValue(expected) + mockFunction(mockLedgerService.getCredentialDefinition).mockResolvedValue(expected) - const result = await service.getCredentialDefinition(mockAgentContext, credentialDefinitionId) + const result = await registry.getCredentialDefinition(mockAgentContext, mockCredentialDefinitionId) expect(mockAgentContext.config.logger.trace).toHaveBeenCalledWith( - `Resolving credential definition '${credentialDefinitionId}' from Hedera ledger` + `Resolving credential definition '${mockCredentialDefinitionId}' from Hedera ledger` + ) + expect(mockLedgerService.getCredentialDefinition).toHaveBeenCalledWith( + mockAgentContext, + mockCredentialDefinitionId ) - expect(mockLedgerService.getCredentialDefinition).toHaveBeenCalledWith(mockAgentContext, credentialDefinitionId) expect(result).toEqual(expected) }) it('should catch error and return notFound error state', async () => { const error = new Error('not found') - mockLedgerService.getCredentialDefinition.mockRejectedValue(error) + mockFunction(mockLedgerService.getCredentialDefinition).mockRejectedValue(error) - const result = await service.getCredentialDefinition(mockAgentContext, credentialDefinitionId) + const result = await registry.getCredentialDefinition(mockAgentContext, mockCredentialDefinitionId) expect(mockAgentContext.config.logger.error).toHaveBeenCalledWith( - `Error retrieving credential definition '${credentialDefinitionId}'`, - expect.objectContaining({ error, credentialDefinitionId }) + `Error retrieving credential definition '${mockCredentialDefinitionId}'`, + expect.objectContaining({ error, credentialDefinitionId: mockCredentialDefinitionId }) ) expect(result.resolutionMetadata.error).toBe('notFound') expect(result.resolutionMetadata.message).toContain('not found') @@ -278,9 +274,9 @@ describe('HederaAnonCredsRegistry', () => { }, }, } - mockLedgerService.registerRevocationRegistryDefinition.mockResolvedValue(expected) + mockFunction(mockLedgerService.registerRevocationRegistryDefinition).mockResolvedValue(expected) - const result = await service.registerRevocationRegistryDefinition(mockAgentContext, options) + const result = await registry.registerRevocationRegistryDefinition(mockAgentContext, options) expect(mockAgentContext.config.logger.trace).toHaveBeenCalledWith( `Registering revocation registry definition for '${options.revocationRegistryDefinition.credDefId}' on Hedera ledger` @@ -291,9 +287,9 @@ describe('HederaAnonCredsRegistry', () => { it('should catch error and return failed state', async () => { const error = new Error('fail') - mockLedgerService.registerRevocationRegistryDefinition.mockRejectedValue(error) + mockFunction(mockLedgerService.registerRevocationRegistryDefinition).mockRejectedValue(error) - const result = await service.registerRevocationRegistryDefinition(mockAgentContext, options) + const result = await registry.registerRevocationRegistryDefinition(mockAgentContext, options) expect(mockAgentContext.config.logger.error).toHaveBeenCalledWith( `Error registering revocation registry definition for did '${options.revocationRegistryDefinition.issuerId}'`, @@ -306,37 +302,43 @@ describe('HederaAnonCredsRegistry', () => { }) describe('getRevocationRegistryDefinition', () => { - const revocationRegistryDefinitionId = 'revRegDef123' + const mockRevocationRegistryDefinitionId = 'mock-rev-reg-def-id' it('should call ledgerService.getRevocationRegistryDefinition and return result on success', async () => { const expected: GetRevocationRegistryDefinitionReturn = { - revocationRegistryDefinitionId, + revocationRegistryDefinitionId: mockRevocationRegistryDefinitionId, resolutionMetadata: {}, revocationRegistryDefinitionMetadata: {}, } - mockLedgerService.getRevocationRegistryDefinition.mockResolvedValue(expected) + mockFunction(mockLedgerService.getRevocationRegistryDefinition).mockResolvedValue(expected) - const result = await service.getRevocationRegistryDefinition(mockAgentContext, revocationRegistryDefinitionId) + const result = await registry.getRevocationRegistryDefinition( + mockAgentContext, + mockRevocationRegistryDefinitionId + ) expect(mockAgentContext.config.logger.trace).toHaveBeenCalledWith( - `Resolving revocation registry definition for '${revocationRegistryDefinitionId}' from Hedera ledger` + `Resolving revocation registry definition for '${mockRevocationRegistryDefinitionId}' from Hedera ledger` ) expect(mockLedgerService.getRevocationRegistryDefinition).toHaveBeenCalledWith( mockAgentContext, - revocationRegistryDefinitionId + mockRevocationRegistryDefinitionId ) expect(result).toEqual(expected) }) it('should catch error and return notFound error state', async () => { const error = new Error('not found') - mockLedgerService.getRevocationRegistryDefinition.mockRejectedValue(error) + mockFunction(mockLedgerService.getRevocationRegistryDefinition).mockRejectedValue(error) - const result = await service.getRevocationRegistryDefinition(mockAgentContext, revocationRegistryDefinitionId) + const result = await registry.getRevocationRegistryDefinition( + mockAgentContext, + mockRevocationRegistryDefinitionId + ) expect(mockAgentContext.config.logger.error).toHaveBeenCalledWith( - `Error retrieving revocation registry definition '${revocationRegistryDefinitionId}'`, - expect.objectContaining({ error, revocationRegistryDefinitionId }) + `Error retrieving revocation registry definition '${mockRevocationRegistryDefinitionId}'`, + expect.objectContaining({ error, revocationRegistryDefinitionId: mockRevocationRegistryDefinitionId }) ) expect(result.resolutionMetadata.error).toBe('notFound') expect(result.resolutionMetadata.message).toContain('not found') @@ -369,9 +371,9 @@ describe('HederaAnonCredsRegistry', () => { }, }, } - mockLedgerService.registerRevocationStatusList.mockResolvedValue(expected) + mockFunction(mockLedgerService.registerRevocationStatusList).mockResolvedValue(expected) - const result = await service.registerRevocationStatusList(mockAgentContext, options) + const result = await registry.registerRevocationStatusList(mockAgentContext, options) expect(mockAgentContext.config.logger.trace).toHaveBeenCalledWith( `Registering revocation status list for '${options.revocationStatusList.revRegDefId}' on Hedera ledger` @@ -382,9 +384,9 @@ describe('HederaAnonCredsRegistry', () => { it('should catch error and return failed state', async () => { const error = new Error('fail') - mockLedgerService.registerRevocationStatusList.mockRejectedValue(error) + mockFunction(mockLedgerService.registerRevocationStatusList).mockRejectedValue(error) - const result = await service.registerRevocationStatusList(mockAgentContext, options) + const result = await registry.registerRevocationStatusList(mockAgentContext, options) expect(mockAgentContext.config.logger.error).toHaveBeenCalledWith( `Error registering revocation status list for did '${options.revocationStatusList.issuerId}'`, @@ -397,7 +399,7 @@ describe('HederaAnonCredsRegistry', () => { }) describe('getRevocationStatusList', () => { - const revocationRegistryId = 'revRegId123' + const mockRevocationRegistryId = 'mock-rev-reg-def-id' const timestamp = 1234567890 it('should call ledgerService.getRevocationStatusList and return result on success', async () => { @@ -405,16 +407,16 @@ describe('HederaAnonCredsRegistry', () => { resolutionMetadata: {}, revocationStatusListMetadata: {}, } - mockLedgerService.getRevocationStatusList.mockResolvedValue(expected) + mockFunction(mockLedgerService.getRevocationStatusList).mockResolvedValue(expected) - const result = await service.getRevocationStatusList(mockAgentContext, revocationRegistryId, timestamp) + const result = await registry.getRevocationStatusList(mockAgentContext, mockRevocationRegistryId, timestamp) expect(mockAgentContext.config.logger.trace).toHaveBeenCalledWith( - `Resolving revocation status for for '${revocationRegistryId}' from Hedera ledger` + `Resolving revocation status for for '${mockRevocationRegistryId}' from Hedera ledger` ) expect(mockLedgerService.getRevocationStatusList).toHaveBeenCalledWith( mockAgentContext, - revocationRegistryId, + mockRevocationRegistryId, timestamp * 1000 ) expect(result).toEqual(expected) @@ -422,13 +424,13 @@ describe('HederaAnonCredsRegistry', () => { it('should catch error and return notFound error state', async () => { const error = new Error('not found') - mockLedgerService.getRevocationStatusList.mockRejectedValue(error) + mockFunction(mockLedgerService.getRevocationStatusList).mockRejectedValue(error) - const result = await service.getRevocationStatusList(mockAgentContext, revocationRegistryId, timestamp) + const result = await registry.getRevocationStatusList(mockAgentContext, mockRevocationRegistryId, timestamp) expect(mockAgentContext.config.logger.error).toHaveBeenCalledWith( - `Error retrieving revocation registry status list '${revocationRegistryId}'`, - expect.objectContaining({ error, revocationRegistryId }) + `Error retrieving revocation registry status list '${mockRevocationRegistryId}'`, + expect.objectContaining({ error, revocationRegistryId: mockRevocationRegistryId }) ) expect(result.resolutionMetadata.error).toBe('notFound') expect(result.resolutionMetadata.message).toContain('not found') diff --git a/packages/hedera/tests/unit/hedera-did-registrar.test.ts b/packages/hedera/tests/unit/hedera-did-registrar.test.ts index 9347f876d2..c2e07eaa56 100644 --- a/packages/hedera/tests/unit/hedera-did-registrar.test.ts +++ b/packages/hedera/tests/unit/hedera-did-registrar.test.ts @@ -1,74 +1,65 @@ -import type { AgentContext, DidDocumentKey } from '@credo-ts/core' +import { AgentContext, DidDocumentKey, DidRecord, DidRepository } from '@credo-ts/core' import { DidDocumentRole } from '@credo-ts/core' import { HederaDidRegistrar } from '@credo-ts/hedera' -import { HederaDidUpdateOptions } from '../../src/ledger/HederaLedgerService' - -describe('HederaDidRegistrar', () => { - let service: HederaDidRegistrar - // biome-ignore lint/suspicious/noExplicitAny: - let mockAgentContext: any - // biome-ignore lint/suspicious/noExplicitAny: - let mockDidRepository: any - // biome-ignore lint/suspicious/noExplicitAny: - let mockLedgerService: any - - beforeEach(() => { - const mockLogger = { +import { HederaDidUpdateOptions, HederaLedgerService } from '../../src/ledger/HederaLedgerService' +import { mockFunction } from '../../../core/tests/helpers' +import { did, didDocument, didResolutionMetadata } from './fixtures/did-document' + +const mockDidRepository = { + save: jest.fn(), + findCreatedDid: jest.fn(), + update: jest.fn(), +} as unknown as DidRepository + +const mockLedgerService = { + createDid: jest.fn(), + resolveDid: jest.fn(), + updateDid: jest.fn(), + deactivateDid: jest.fn(), +} as unknown as HederaLedgerService + +const mockAgentContext = { + dependencyManager: { + resolve: jest.fn().mockImplementation((cls) => { + if (cls === DidRepository) return mockDidRepository + if (cls === HederaLedgerService) return mockLedgerService + }), + }, + config: { + logger: { debug: jest.fn(), error: jest.fn(), - } - - mockDidRepository = { - save: jest.fn(), - findCreatedDid: jest.fn(), - update: jest.fn(), - } - - mockLedgerService = { - createDid: jest.fn(), - resolveDid: jest.fn(), - updateDid: jest.fn(), - deactivateDid: jest.fn(), - } - - mockAgentContext = { - dependencyManager: { - // biome-ignore lint/suspicious/noExplicitAny: - resolve: jest.fn().mockImplementation((obj: any) => { - if (obj.name === 'DidRepository') return mockDidRepository - if (obj.name === 'HederaLedgerService') return mockLedgerService - }), - }, - config: { - logger: mockLogger, - }, - } - - service = new HederaDidRegistrar() - }) + }, + }, +} as unknown as AgentContext + +describe('HederaDidRegistrar', () => { + const registrar: HederaDidRegistrar = new HederaDidRegistrar() describe('create', () => { it('should create DID, save it, and return finished state on success', async () => { - const did = 'did:hedera:123' - const didDocument = { - service: [{ id: 'service1' }, { id: 'service2' }], - } const rootKey = { kmsKeyId: 'key1', didDocumentRelativeKeyId: 'rootKeyId' } - mockLedgerService.createDid.mockResolvedValue({ did, didDocument, rootKey }) + mockFunction(mockLedgerService.createDid).mockResolvedValue({ + did, + didDocument, + rootKey, + }) - const result = await service.create(mockAgentContext as AgentContext, { + const result = await registrar.create(mockAgentContext, { method: 'hedera', options: {}, }) expect(mockDidRepository.save).toHaveBeenCalled() - const savedRecord = mockDidRepository.save.mock.calls[0][1] + const savedRecord = mockFunction(mockDidRepository.save).mock.calls[0][1] expect(savedRecord.did).toBe(did) expect(savedRecord.role).toBe(DidDocumentRole.Created) expect(savedRecord.didDocument).toBeInstanceOf(Object) - expect(savedRecord.didDocument.service[0]).toBeInstanceOf(Object) + expect(savedRecord.didDocument?.service).toBeDefined() + // biome-ignore lint/style/noNonNullAssertion: + expect(savedRecord.didDocument?.service![0]).toBeInstanceOf(Object) expect(result.didState.state).toBe('finished') expect(result.didState.did).toBe(did) @@ -76,9 +67,9 @@ describe('HederaDidRegistrar', () => { }) it('should handle error and return failed state', async () => { - mockLedgerService.createDid.mockRejectedValue(new Error('Create failed')) + mockFunction(mockLedgerService.createDid).mockRejectedValue(new Error('Create failed')) - const result = await service.create(mockAgentContext as AgentContext, { + const result = await registrar.create(mockAgentContext, { method: 'hedera', options: {}, }) @@ -92,24 +83,27 @@ describe('HederaDidRegistrar', () => { }) describe('update', () => { - const did = 'did:hedera:123' - it('should update DID and save record successfully', async () => { - const didDocument = { id: did } - const updatedDidDocument = { id: did, updated: true } + const updatedDidDocument = { + ...didDocument, + service: [ + ...didDocument.service, + { id: 'added-service', type: 'MockService', serviceEndpoint: 'https://example.com/added-service/' }, + ], + } const foundDidRecord = { didDocument, keys: [{ didDocumentRelativeKeyId: 'key1' }], - } - mockLedgerService.resolveDid.mockResolvedValue({ + } as unknown as DidRecord + + mockFunction(mockLedgerService.resolveDid).mockResolvedValue({ didDocument, didDocumentMetadata: { deactivated: false }, - didResolutionMetadata: {}, + didResolutionMetadata, }) - mockDidRepository.findCreatedDid.mockResolvedValue(foundDidRecord) - mockLedgerService.updateDid.mockResolvedValue({ didDocument: updatedDidDocument }) - mockDidRepository.update.mockResolvedValue(undefined) + mockFunction(mockDidRepository.findCreatedDid).mockResolvedValue(foundDidRecord) + mockFunction(mockLedgerService.updateDid).mockResolvedValue({ did, didDocument: updatedDidDocument }) const options: HederaDidUpdateOptions = { did, @@ -125,7 +119,7 @@ describe('HederaDidRegistrar', () => { didDocument: {}, } - const result = await service.update(mockAgentContext as AgentContext, options) + const result = await registrar.update(mockAgentContext, options) expect(mockLedgerService.resolveDid).toHaveBeenCalledWith(mockAgentContext, did) expect(mockDidRepository.findCreatedDid).toHaveBeenCalledWith(mockAgentContext, did) @@ -145,30 +139,30 @@ describe('HederaDidRegistrar', () => { }) it('should return failed state if DID not found or deactivated', async () => { - mockLedgerService.resolveDid.mockResolvedValue({ didDocument: null, didDocumentMetadata: { deactivated: true } }) - mockDidRepository.findCreatedDid.mockResolvedValue(null) + mockFunction(mockLedgerService.resolveDid).mockResolvedValue({ + didDocument, + didResolutionMetadata, + didDocumentMetadata: { deactivated: true }, + }) + mockFunction(mockDidRepository.findCreatedDid).mockResolvedValue(null) - const options: HederaDidUpdateOptions = { + const result = await registrar.update(mockAgentContext, { did, didDocument: {}, - } - - const result = await service.update(mockAgentContext as AgentContext, options) + }) expect(result.didState.state).toBe('failed') if (result.didState.state === 'failed') expect(result.didState.reason).toBe('Did not found') }) it('should handle error and return failed state', async () => { - mockLedgerService.resolveDid.mockRejectedValue(new Error('Update failed')) + mockFunction(mockLedgerService.resolveDid).mockRejectedValue(new Error('Update failed')) - const options: HederaDidUpdateOptions = { + const result = await registrar.update(mockAgentContext, { did, didDocumentOperation: 'setDidDocument', didDocument: {}, - } - - const result = await service.update(mockAgentContext as AgentContext, options) + }) expect(mockAgentContext.config.logger.error).toHaveBeenCalledWith('Error updating DID', expect.any(Error)) expect(result.didState.state).toBe('failed') @@ -177,27 +171,29 @@ describe('HederaDidRegistrar', () => { }) describe('deactivate', () => { - const did = 'did:hedera:123' - it('should deactivate DID and save updated record successfully', async () => { - const didDocument = { id: did } - const deactivatedDidDocument = { id: did, deactivated: true } + const deactivatedDidDocument = { ...didDocument, deactivated: true } const foundDidRecord = { didDocument, keys: [{ didDocumentRelativeKeyId: 'key1' }], - } + } as unknown as DidRecord - mockLedgerService.resolveDid.mockResolvedValue({ didDocument, didDocumentMetadata: {} }) - mockDidRepository.findCreatedDid.mockResolvedValue(foundDidRecord) - mockLedgerService.deactivateDid.mockResolvedValue({ didDocument: deactivatedDidDocument }) - mockDidRepository.update.mockResolvedValue(undefined) - - const options = { + mockFunction(mockLedgerService.resolveDid).mockResolvedValue({ + didDocument, + didResolutionMetadata, + didDocumentMetadata: {}, + }) + mockFunction(mockDidRepository.findCreatedDid).mockResolvedValue(foundDidRecord) + mockFunction(mockLedgerService.deactivateDid).mockResolvedValue({ did, - } + didDocument: deactivatedDidDocument, + }) + mockFunction(mockDidRepository.update).mockResolvedValue(undefined) - const result = await service.deactivate(mockAgentContext as AgentContext, options) + const result = await registrar.deactivate(mockAgentContext, { + did, + }) expect(mockLedgerService.resolveDid).toHaveBeenCalledWith(mockAgentContext, did) expect(mockDidRepository.findCreatedDid).toHaveBeenCalledWith(mockAgentContext, did) @@ -214,28 +210,27 @@ describe('HederaDidRegistrar', () => { expect(result.didState.didDocument).toBeInstanceOf(Object) }) - it('should return failed state if DID not found or deactivated', async () => { - mockLedgerService.resolveDid.mockResolvedValue({ didDocument: null, didDocumentMetadata: { deactivated: true } }) - mockDidRepository.findCreatedDid.mockResolvedValue(null) + it('should return failed state if DID is deactivated', async () => { + mockFunction(mockLedgerService.resolveDid).mockResolvedValueOnce({ + didDocument, + didResolutionMetadata, + didDocumentMetadata: { deactivated: true }, + }) + mockFunction(mockDidRepository.findCreatedDid).mockResolvedValue(null) - const options = { + const result = await registrar.deactivate(mockAgentContext, { did, - } - - const result = await service.deactivate(mockAgentContext as AgentContext, options) + }) expect(result.didState.state).toBe('failed') - if (result.didState.state === 'failed') expect(result.didState.reason).toBe('Did not found') + // @ts-ignore + expect(result.didState.reason).toBe('Did not found') }) it('should handle error and return failed state', async () => { - mockLedgerService.resolveDid.mockRejectedValue(new Error('Deactivate failed')) + mockFunction(mockLedgerService.resolveDid).mockRejectedValue(new Error('Deactivate failed')) - const options = { - did, - } - - const result = await service.deactivate(mockAgentContext as AgentContext, options) + const result = await registrar.deactivate(mockAgentContext, { did }) expect(mockAgentContext.config.logger.error).toHaveBeenCalledWith('Error deactivating DID', expect.any(Error)) expect(result.didState.state).toBe('failed') @@ -247,11 +242,10 @@ describe('HederaDidRegistrar', () => { describe('concatKeys (private method)', () => { it('should concatenate keys without duplicates based on relativeKeyId', () => { const keys1 = [{ didDocumentRelativeKeyId: 'key1' }, { didDocumentRelativeKeyId: 'key2' }] as DidDocumentKey[] - const keys2 = [{ didDocumentRelativeKeyId: 'key2' }, { didDocumentRelativeKeyId: 'key3' }] as DidDocumentKey[] // biome-ignore lint/suspicious/noExplicitAny: - const result = (service as any).concatKeys(keys1, keys2) + const result = (registrar as any).concatKeys(keys1, keys2) expect(result).toHaveLength(3) expect(result).toEqual( @@ -265,7 +259,7 @@ describe('HederaDidRegistrar', () => { it('should handle undefined arguments and return empty array', () => { // biome-ignore lint/suspicious/noExplicitAny: - const result = (service as any).concatKeys(undefined, undefined) + const result = (registrar as any).concatKeys(undefined, undefined) expect(result).toEqual([]) }) }) diff --git a/packages/hedera/tests/unit/hedera-did-resolver.test.ts b/packages/hedera/tests/unit/hedera-did-resolver.test.ts index 8128a7371e..e4c64e1a01 100644 --- a/packages/hedera/tests/unit/hedera-did-resolver.test.ts +++ b/packages/hedera/tests/unit/hedera-did-resolver.test.ts @@ -1,70 +1,56 @@ -import { DidDocument, JsonTransformer } from '@credo-ts/core' +import { AgentContext, DidDocument, JsonTransformer } from '@credo-ts/core' import { HederaDidResolver } from '@credo-ts/hedera' import { HederaLedgerService } from '../../src/ledger/HederaLedgerService' +import { mockFunction } from '../../../core/tests/helpers' +import { did, parsedDid, didDocument, didResolutionMetadata } from './fixtures/did-document' -describe('HederaDidResolver', () => { - let resolver: HederaDidResolver - // biome-ignore lint/suspicious/noExplicitAny: - let mockAgentContext: any - // biome-ignore lint/suspicious/noExplicitAny: - let mockLedgerService: any +const mockLedgerService = { + resolveDid: jest.fn(), +} as unknown as HederaLedgerService - beforeEach(() => { - const mockLogger = { +const mockAgentContext = { + config: { + logger: { trace: jest.fn(), debug: jest.fn(), - } + }, + }, + dependencyManager: { + resolve: jest.fn().mockImplementation((cls) => { + if (cls === HederaLedgerService) return mockLedgerService + }), + }, +} as unknown as AgentContext - mockLedgerService = { - resolveDid: jest.fn(), - } - - mockAgentContext = { - config: { logger: mockLogger }, - dependencyManager: { - resolve: jest.fn().mockReturnValue(mockLedgerService), - }, - } - - resolver = new HederaDidResolver() - }) +const resolver = new HederaDidResolver() +describe('HederaDidResolver', () => { it('should successfully resolve DID', async () => { - const did = 'did:hedera:123' - const fakeDidDocument = { id: did } - const resolveDidResult = { - didDocument: { id: did }, - didDocumentMetadata: { meta: 'meta' }, - didResolutionMetadata: { resMeta: 'resMeta' }, + const resolutionResult = { + didDocument, + didDocumentMetadata: {}, + didResolutionMetadata, } - mockLedgerService.resolveDid.mockResolvedValue(resolveDidResult) + mockFunction(mockLedgerService.resolveDid).mockResolvedValue(resolutionResult) - jest.spyOn(JsonTransformer, 'fromJSON').mockReturnValue(fakeDidDocument as unknown as DidDocument) + jest.spyOn(JsonTransformer, 'fromJSON').mockReturnValue(didDocument) - // biome-ignore lint/suspicious/noExplicitAny: - const result = await resolver.resolve(mockAgentContext, did, {} as any, {} as any) + const result = await resolver.resolve(mockAgentContext, did, parsedDid, {}) expect(mockAgentContext.config.logger.trace).toHaveBeenCalledWith('Try to resolve a did document from ledger') expect(mockAgentContext.dependencyManager.resolve).toHaveBeenCalledWith(HederaLedgerService) expect(mockLedgerService.resolveDid).toHaveBeenCalledWith(mockAgentContext, did) - expect(JsonTransformer.fromJSON).toHaveBeenCalledWith(resolveDidResult.didDocument, DidDocument) - - expect(result).toEqual({ - didDocument: fakeDidDocument, - didDocumentMetadata: resolveDidResult.didDocumentMetadata, - didResolutionMetadata: resolveDidResult.didResolutionMetadata, - }) + expect(JsonTransformer.fromJSON).toHaveBeenCalledWith(resolutionResult.didDocument, DidDocument) + expect(result).toEqual(resolutionResult) }) it('should handle error and return notFound', async () => { - const did = 'did:hedera:bad' const error = new Error('Some error') - mockLedgerService.resolveDid.mockRejectedValue(error) + mockFunction(mockLedgerService.resolveDid).mockRejectedValue(error) - // biome-ignore lint/suspicious/noExplicitAny: - const result = await resolver.resolve(mockAgentContext, did, {} as any, {} as any) + const result = await resolver.resolve(mockAgentContext, did, parsedDid, {}) expect(mockAgentContext.config.logger.trace).toHaveBeenCalledWith('Try to resolve a did document from ledger') expect(mockAgentContext.config.logger.debug).toHaveBeenCalledWith('Error resolving the did', { diff --git a/packages/hedera/tests/unit/hedera-ledger-service.test.ts b/packages/hedera/tests/unit/hedera-ledger-service.test.ts index e7f946ae7e..06ed9bc539 100644 --- a/packages/hedera/tests/unit/hedera-ledger-service.test.ts +++ b/packages/hedera/tests/unit/hedera-ledger-service.test.ts @@ -4,16 +4,12 @@ import { RegisterRevocationStatusListOptions, RegisterSchemaOptions, } from '@credo-ts/anoncreds' -import { type DidDocument, DidRecord, DidRepository } from '@credo-ts/core' -import { AgentContext, DependencyManager } from '@credo-ts/core' +import { DidDocument, DidRecord, DidRepository } from '@credo-ts/core' +import { AgentContext } from '@credo-ts/core' import { DidDocumentKey, Kms } from '@credo-ts/core' import { KmsJwkPublicOkp } from '@credo-ts/core/src/modules/kms' import { Client, PrivateKey } from '@hashgraph/sdk' -import { - HederaDidCreateOptions, - HederaDidUpdateOptions, - HederaLedgerService, -} from '../../src/ledger/HederaLedgerService' +import { HederaLedgerService } from '../../src/ledger/HederaLedgerService' jest.mock('@hiero-did-sdk/registrar', () => ({ DIDUpdateBuilder: jest.fn().mockReturnValue({ @@ -43,13 +39,15 @@ jest.mock('@hiero-did-sdk/registrar', () => ({ import { DIDUpdateBuilder, - UpdateDIDResult, generateCreateDIDRequest, - generateDeactivateDIDRequest, generateUpdateDIDRequest, submitCreateDIDRequest, submitDeactivateDIDRequest, submitUpdateDIDRequest, + CreateDIDRequest, + UpdateDIDRequest, + generateDeactivateDIDRequest, + DeactivateDIDRequest, } from '@hiero-did-sdk/registrar' jest.mock('@hiero-did-sdk/resolver', () => ({ @@ -59,203 +57,175 @@ jest.mock('@hiero-did-sdk/resolver', () => ({ import { resolveDID } from '@hiero-did-sdk/resolver' -jest.mock('@hiero-did-sdk/core', () => ({ - parseDID: jest.fn(), -})) - -import { DID_ROOT_KEY_ID, Publisher, parseDID } from '@hiero-did-sdk/core' - jest.mock('../../src/ledger/utils') import { AskarKeyManagementService } from '@credo-ts/askar' import { KeyEntryObject } from '@openwallet-foundation/askar-nodejs' import { createOrGetKey } from '../../src/ledger/utils' +import { mockFunction } from '../../../core/tests/helpers' +import { did, didDocument } from './fixtures/did-document' +import { HederaAnonCredsRegistry } from '../../src/anoncreds/HederaAnonCredsRegistry' +import { DID_ROOT_KEY_ID } from '@hiero-did-sdk/core' + +const mockKeyId = 'mock-key-id' + +const mockPublicJwk: KmsJwkPublicOkp & { crv: 'Ed25519' } = { crv: 'Ed25519', kty: 'OKP', x: 'abc' } + +const mockKeyManagementService = { + getKeyAsserted: jest + .fn() + .mockReturnValue({ key: { secretBytes: PrivateKey.generateED25519().toBytes() } } as unknown as KeyEntryObject), +} as unknown as AskarKeyManagementService + +const mockKms = { + sign: jest.fn().mockResolvedValue({ signature: new Uint8Array([1, 2, 3]) }), + getKms: jest.fn().mockReturnValue(mockKeyManagementService), +} as unknown as Kms.KeyManagementApi + +const mockDidRepository = { + findCreatedDid: jest.fn().mockResolvedValue({ + keys: [ + { + didDocumentRelativeKeyId: DID_ROOT_KEY_ID, + kmsKeyId: 'kmsKeyId', + }, + ], + }), +} as unknown as DidRepository + +const mockAgentContext = { + dependencyManager: { + resolve: jest.fn((cls) => { + if (cls === Kms.KeyManagementApi) { + return mockKms + } + if (cls === DidRepository) { + return mockDidRepository + } + throw new Error(`No instance found for ${cls}`) + }), + }, +} as unknown as AgentContext + +const mockHederaAnonCredsRegistry = { + getSchema: jest.fn().mockResolvedValue('schema'), + registerSchema: jest.fn().mockResolvedValue('registerSchema'), + getCredentialDefinition: jest.fn().mockResolvedValue('credDef'), + registerCredentialDefinition: jest.fn().mockResolvedValue('registerCredDef'), + getRevocationRegistryDefinition: jest.fn().mockResolvedValue('revRegDef'), + registerRevocationRegistryDefinition: jest.fn().mockResolvedValue('registerRevRegDef'), + getRevocationStatusList: jest.fn().mockResolvedValue('revStatusList'), + registerRevocationStatusList: jest.fn().mockResolvedValue('registerRevStatus'), +} as unknown as HederaAnonCredsRegistry describe('HederaLedgerService', () => { - let service: HederaLedgerService - let mockAgentContext: Partial - let mockKms: jest.Mocked - let mockDidRepository: jest.Mocked - let mockKeyManagementService: jest.Mocked - let mockedCreateOrGetKey: jest.MockedFunction - let mockedParseDID: jest.MockedFunction - let mockedGenerateDeactivateDIDRequest: jest.MockedFunction - let builder: DIDUpdateBuilder - - beforeEach(() => { - jest.clearAllMocks() - - mockedCreateOrGetKey = createOrGetKey as jest.MockedFunction - mockedParseDID = parseDID as jest.MockedFunction - mockedGenerateDeactivateDIDRequest = generateDeactivateDIDRequest as jest.MockedFunction< - typeof generateDeactivateDIDRequest - > - - builder = new DIDUpdateBuilder() - - mockDidRepository = { - findCreatedDid: jest.fn().mockReturnValue({ - keys: [ - { - didDocumentRelativeKeyId: DID_ROOT_KEY_ID, - kmsKeyId: 'kmsKeyId', - }, - ], - } as unknown as DidRecord), - } as unknown as jest.Mocked - - mockKeyManagementService = { - getKeyAsserted: jest - .fn() - .mockReturnValue({ key: { secretBytes: PrivateKey.generateED25519().toBytes() } } as unknown as KeyEntryObject), - } as unknown as jest.Mocked - - mockKms = { - sign: jest.fn(), - getKms: jest.fn().mockReturnValue(mockKeyManagementService), - } as unknown as jest.Mocked - - mockAgentContext = { - dependencyManager: { - resolve: jest.fn((cls) => { - if (cls === Kms.KeyManagementApi) { - return mockKms - } - if (cls === DidRepository) { - return mockDidRepository - } - throw new Error(`No instance found for ${cls}`) - }), - } as unknown as DependencyManager, - } - - const mockCache = { - get: jest.fn().mockResolvedValue(null), - set: jest.fn().mockResolvedValue(undefined), - remove: jest.fn().mockResolvedValue(undefined), - clear: jest.fn(), - cleanupExpired: jest.fn(), - } - - service = new HederaLedgerService({ - options: { - networks: [ - { - network: 'testnet', - operatorId: '1', - operatorKey: '2', - }, - ], - cache: mockCache, + const service = new HederaLedgerService({ + options: { + networks: [ + { + network: 'testnet', + operatorId: 'mock-operator-id', + operatorKey: 'mock-operator-key', + }, + ], + cache: { + get: jest.fn().mockResolvedValue(null), + set: jest.fn().mockResolvedValue(undefined), + remove: jest.fn().mockResolvedValue(undefined), + clear: jest.fn(), + cleanupExpired: jest.fn(), }, - }) + }, + }) + const builder: DIDUpdateBuilder = new DIDUpdateBuilder() - // biome-ignore lint/suspicious/noExplicitAny: - jest.spyOn((service as any).clientService, 'withClient').mockImplementation(async (_props, operation) => { - const mockClient = {} as Client - // @ts-ignore - return operation(mockClient) - }) + // biome-ignore lint/suspicious/noExplicitAny: + jest.spyOn((service as any).clientService, 'withClient').mockImplementation(async (_props, operation) => { + const mockClient = {} as Client + // @ts-ignore + return operation(mockClient) }) - describe('resolveDid', () => { - it('should call resolveDID with proper args and returns result', async () => { - const did = 'did:hedera:test' + // biome-ignore lint/suspicious/noExplicitAny: + jest.spyOn(service as any, 'getHederaAnonCredsRegistry').mockReturnValue(mockHederaAnonCredsRegistry) + + // biome-ignore lint/suspicious/noExplicitAny: + jest.spyOn(service as any, 'getPublisher').mockResolvedValue({}) - const mockResolution = { didDocument: { id: did } } - ;(resolveDID as jest.Mock).mockResolvedValue(mockResolution) + describe('resolveDid', () => + it('should call resolveDID with proper args and returns result', async () => { + // @ts-ignore - there is a conflict with 'resolveDID' "overloaded" signatures + mockFunction(resolveDID).mockResolvedValueOnce(didDocument) - const result = await service.resolveDid(mockAgentContext as AgentContext, did) + const result = await service.resolveDid(mockAgentContext, did) expect(resolveDID).toHaveBeenCalledWith( did, 'application/ld+json;profile="https://w3id.org/did-resolution"', expect.any(Object) ) - expect(result).toBe(mockResolution) - }) - }) + expect(result).toBe(didDocument) + })) describe('createDid', () => { it('should create DID without didDocument', async () => { - const keyId = 'key123' - const publicJwk: KmsJwkPublicOkp & { crv: 'Ed25519' } = { crv: 'Ed25519', kty: 'OKP', x: 'abc' } - const props: HederaDidCreateOptions = { - method: 'hedera', - options: { network: 'testnet' }, - secret: { rootKeyId: keyId, keys: [] }, - } - - mockedCreateOrGetKey.mockResolvedValue({ keyId, publicJwk }) - ;(generateCreateDIDRequest as jest.Mock).mockResolvedValue({ + const createDidRequest = { state: {}, signingRequest: { serializedPayload: new Uint8Array() }, - }) - ;(submitCreateDIDRequest as jest.Mock).mockResolvedValue({ did: 'did:hedera:1234' }) + } as unknown as CreateDIDRequest - // biome-ignore lint/suspicious/noExplicitAny: - jest.spyOn(service as any, 'getPublisher').mockResolvedValue({} as Publisher) + mockFunction(createOrGetKey).mockResolvedValueOnce({ keyId: mockKeyId, publicJwk: mockPublicJwk }) + mockFunction(generateCreateDIDRequest).mockResolvedValueOnce(createDidRequest) + mockFunction(submitCreateDIDRequest).mockResolvedValueOnce({ did, didDocument }) - mockKms.sign.mockResolvedValue({ signature: new Uint8Array([1, 2, 3]) }) + const result = await service.createDid(mockAgentContext, { + method: 'hedera', + options: { network: 'testnet' }, + secret: { rootKeyId: mockKeyId, keys: [] }, + }) - const result = await service.createDid(mockAgentContext as AgentContext, props) - expect(createOrGetKey).toHaveBeenCalledWith(mockKms, keyId) + expect(createOrGetKey).toHaveBeenCalledWith(mockKms, mockKeyId) expect(generateCreateDIDRequest).toHaveBeenCalled() expect(submitCreateDIDRequest).toHaveBeenCalled() - expect(result.did).toBe('did:hedera:1234') + expect(result.did).toBe(did) expect(result.rootKey).toBeDefined() }) it('should create DID with didDocument and calls updateDid', async () => { - const keyId = 'key123' - const publicJwk: KmsJwkPublicOkp & { crv: 'Ed25519' } = { crv: 'Ed25519', kty: 'OKP', x: 'abc' } - const didDocument = { controller: 'did:hedera:controller' } - const props = { - method: 'hedera', - options: { network: 'testnet' }, - secret: { rootKeyId: keyId, keys: [] }, - didDocument, - } - - mockedCreateOrGetKey.mockResolvedValue({ keyId, publicJwk }) - ;(generateCreateDIDRequest as jest.Mock).mockResolvedValue({ + const createDidRequest = { state: {}, signingRequest: { serializedPayload: new Uint8Array() }, - }) - ;(submitCreateDIDRequest as jest.Mock).mockResolvedValue({ did: 'did:hedera:1234' }) + } as unknown as CreateDIDRequest - const updateDidSpy = jest - .spyOn(service, 'updateDid') - .mockResolvedValue({ did: 'did:hedera:1234' } as unknown as UpdateDIDResult) + mockFunction(createOrGetKey).mockResolvedValueOnce({ keyId: mockKeyId, publicJwk: mockPublicJwk }) + mockFunction(generateCreateDIDRequest).mockResolvedValueOnce(createDidRequest) + mockFunction(submitCreateDIDRequest).mockResolvedValueOnce({ did, didDocument }) - // biome-ignore lint/suspicious/noExplicitAny: - jest.spyOn(service as any, 'getPublisher').mockResolvedValue({} as Publisher) + const updateDidSpy = jest.spyOn(service, 'updateDid').mockResolvedValueOnce({ did, didDocument }) - mockKms.sign.mockResolvedValue({ signature: new Uint8Array([1, 2, 3]) }) + const result = await service.createDid(mockAgentContext, { + method: 'hedera', + options: { network: 'testnet' }, + secret: { rootKeyId: mockKeyId, keys: [] }, + didDocument: DidDocument.fromJSON(didDocument), + }) - const result = await service.createDid( - mockAgentContext as AgentContext, - props as unknown as HederaDidCreateOptions - ) expect(updateDidSpy).toHaveBeenCalled() expect(result.rootKey).toBeDefined() }) }) describe('updateDid', () => { - const did = 'did:hedera:1234' - const kmsKeyId = 'key-id' - it('should throw error if didDocumentOperation is missing', async () => { - await expect( - service.updateDid(mockAgentContext as AgentContext, { did } as HederaDidUpdateOptions) - ).rejects.toThrow('DidDocumentOperation is required') + await expect(service.updateDid(mockAgentContext, { did, didDocument })).rejects.toThrow( + 'DidDocumentOperation is required' + ) }) it('should throw error if rootKey missing', async () => { const keys: DidDocumentKey[] = [] await expect( - service.updateDid(mockAgentContext as AgentContext, { + service.updateDid(mockAgentContext, { did, didDocumentOperation: 'setDidDocument', secret: { keys }, @@ -305,13 +275,13 @@ describe('HederaLedgerService', () => { ['keyAgreement', 'remove', 'keyAgreement-id', spies.removeKeyAgreementMethod], ] - for (const [field, action, param, spy] of testCases) { + for (const [property, action, param, spy] of testCases) { jest.clearAllMocks() // biome-ignore lint/suspicious/noExplicitAny: - const fn = (service as any).getUpdateMethod(builder, field, action) + const builderMethod = (service as any).getUpdateMethod(builder, property, action) - const result = fn(param) + const result = builderMethod(param) expect(result).toBe(builder) expect(spy).toHaveBeenCalledTimes(1) @@ -322,58 +292,59 @@ describe('HederaLedgerService', () => { } }) - it('should return builder unchanged for unknown field', () => { - const unknownField = 'unknownField' + it('should return builder unchanged for unknown property', () => { + const unknownProperty = 'unknown-property' + // biome-ignore lint/suspicious/noExplicitAny: - const fn = (service as any).getUpdateMethod(builder, unknownField, 'add') - const result = fn('any param') + const builderMethod = (service as any).getUpdateMethod(builder, unknownProperty, 'add') + const result = builderMethod({}) + expect(result).toBe(builder) }) it('should perform update flow successfully', async () => { const keys: DidDocumentKey[] = [ - { kmsKeyId, didDocumentRelativeKeyId: DID_ROOT_KEY_ID }, + { kmsKeyId: mockKeyId, didDocumentRelativeKeyId: DID_ROOT_KEY_ID }, { kmsKeyId: 'some-key', didDocumentRelativeKeyId: '#abc' }, ] - const didDocument: Partial = { + const updatedDidDocument = { + ...didDocument, verificationMethod: [ + ...didDocument.verificationMethod, { id: '#abc', - type: 'hedera', + type: 'Ed25519VerificationKey2020' as const, controller: 'test', + publicKeyMultibase: 'mock-public-key-multibase', }, ], } - const currentDidDoc = { verificationMethod: [{ id: '#abc' }] } - const mockDidResolution = { didDocument: currentDidDoc } - const updatesMock = { build: jest.fn().mockReturnValue(didDocument) } + const updateDidRequest = { + state: {}, + signingRequest: { serializedPayload: new Uint8Array() }, + } as unknown as UpdateDIDRequest - mockedParseDID.mockReturnValue({ - network: 'testnet', - method: 'hedera', - publicKey: '', - topicId: '', - }) - ;(resolveDID as jest.Mock).mockResolvedValue(mockDidResolution) + // @ts-ignore - there is a conflict with 'resolveDID' "overloaded" signatures + mockFunction(resolveDID).mockResolvedValueOnce({ didDocument }) - // biome-ignore lint/suspicious/noExplicitAny: - jest.spyOn(service as any, 'prepareDidUpdates').mockReturnValue(updatesMock) + jest + // biome-ignore lint/suspicious/noExplicitAny: + .spyOn(service as any, 'prepareDidUpdates') + .mockReturnValueOnce({ build: jest.fn().mockReturnValueOnce(updatedDidDocument) }) - // biome-ignore lint/suspicious/noExplicitAny: - jest.spyOn(service as any, 'getPublisher').mockResolvedValue({} as Publisher) - ;(generateUpdateDIDRequest as jest.Mock).mockResolvedValue({ states: {}, signingRequests: {} }) + mockFunction(generateUpdateDIDRequest).mockResolvedValueOnce(updateDidRequest) // biome-ignore lint/suspicious/noExplicitAny: - jest.spyOn(service as any, 'signRequests').mockResolvedValue(Promise.resolve()) - ;(submitUpdateDIDRequest as jest.Mock).mockResolvedValue({ did: did }) + jest.spyOn(service as any, 'signRequests').mockResolvedValueOnce(Promise.resolve()) + mockFunction(submitUpdateDIDRequest).mockResolvedValueOnce({ did, didDocument: updatedDidDocument }) await expect( - service.updateDid(mockAgentContext as AgentContext, { + service.updateDid(mockAgentContext, { did, didDocumentOperation: 'setDidDocument', - didDocument, + didDocument: updatedDidDocument, secret: { keys }, }) ).resolves.toHaveProperty('did', did) @@ -386,84 +357,55 @@ describe('HederaLedgerService', () => { }) describe('deactivateDid', () => { - const did = 'did:hedera:5678' - const kmsKeyId = 'key-id' - it('should throw error if rootKey is missing', async () => { - await expect( - service.deactivateDid(mockAgentContext as AgentContext, { did, secret: { keys: [] } }) - ).rejects.toThrow('The root key not found in the KMS') + await expect(service.deactivateDid(mockAgentContext, { did, secret: { keys: [] } })).rejects.toThrow( + 'The root key not found in the KMS' + ) }) it('should throw an error if root key is not found in deactivateDid', async () => { - const props = { - did: 'did:hedera:123', - secret: { - keys: [], - }, - } + mockFunction(mockAgentContext.dependencyManager.resolve).mockReturnValueOnce({ sign: jest.fn() }) - // @ts-ignore - mockAgentContext.dependencyManager.resolve.mockReturnValue({ sign: jest.fn() }) - - await expect(service.deactivateDid(mockAgentContext as AgentContext, props)).rejects.toThrow( - 'The root key not found in the KMS' - ) + await expect( + service.deactivateDid(mockAgentContext, { + did, + secret: { + keys: [], + }, + }) + ).rejects.toThrow('The root key not found in the KMS') }) it('should deactivate DID successfully', async () => { - const keys: DidDocumentKey[] = [{ kmsKeyId, didDocumentRelativeKeyId: DID_ROOT_KEY_ID }] - const mockPublisher = {} - const mockState = {} - const mockSigningRequest = { serializedPayload: new Uint8Array() } - const signature = new Uint8Array([1, 2, 3]) - ;(parseDID as jest.Mock).mockReturnValue({ network: 'testnet' }) - - // biome-ignore lint/suspicious/noExplicitAny: - jest.spyOn(service as any, 'getPublisher').mockResolvedValue(mockPublisher) - - // @ts-ignore - mockedGenerateDeactivateDIDRequest.mockResolvedValue({ state: mockState, signingRequest: mockSigningRequest }) + const deactivateDidRequest = { + state: {}, + signingRequest: { serializedPayload: new Uint8Array() }, + } as unknown as DeactivateDIDRequest - mockKms.sign.mockResolvedValue({ signature }) - ;(submitDeactivateDIDRequest as jest.Mock).mockResolvedValue({ did }) + mockFunction(generateDeactivateDIDRequest).mockResolvedValueOnce(deactivateDidRequest) + mockFunction(submitDeactivateDIDRequest).mockResolvedValueOnce({ + did, + didDocument, + }) - const result = await service.deactivateDid(mockAgentContext as AgentContext, { + const result = await service.deactivateDid(mockAgentContext, { did, - secret: { keys }, + secret: { keys: [{ kmsKeyId: mockKeyId, didDocumentRelativeKeyId: DID_ROOT_KEY_ID }] }, }) expect(result).toHaveProperty('did', did) expect(mockKms.sign).toHaveBeenCalledWith({ - keyId: kmsKeyId, - data: mockSigningRequest.serializedPayload, + keyId: mockKeyId, + data: deactivateDidRequest.signingRequest.serializedPayload, algorithm: 'EdDSA', }) }) }) describe('anoncreds SDK methods', () => { - // biome-ignore lint/suspicious/noExplicitAny: - let mockSdk: any - - beforeEach(() => { - mockSdk = { - getSchema: jest.fn().mockResolvedValue('schema'), - registerSchema: jest.fn().mockResolvedValue('registerSchema'), - getCredentialDefinition: jest.fn().mockResolvedValue('credDef'), - registerCredentialDefinition: jest.fn().mockResolvedValue('registerCredDef'), - getRevocationRegistryDefinition: jest.fn().mockResolvedValue('revRegDef'), - registerRevocationRegistryDefinition: jest.fn().mockResolvedValue('registerRevRegDef'), - getRevocationStatusList: jest.fn().mockResolvedValue('revStatusList'), - registerRevocationStatusList: jest.fn().mockResolvedValue('registerRevStatus'), - } - // biome-ignore lint/suspicious/noExplicitAny: - jest.spyOn(service as any, 'getHederaAnoncredsRegistry').mockReturnValue(mockSdk) - }) - it('getSchema', async () => { - const result = await service.getSchema(mockAgentContext as AgentContext, 'schemaId') - expect(mockSdk.getSchema).toHaveBeenCalledWith('schemaId') + const result = await service.getSchema(mockAgentContext, 'schemaId') + expect(mockHederaAnonCredsRegistry.getSchema).toHaveBeenCalledWith('schemaId') expect(result).toBe('schema') }) @@ -477,14 +419,17 @@ describe('HederaLedgerService', () => { }, options: {}, } - const result = await service.registerSchema(mockAgentContext as AgentContext, options) - expect(mockSdk.registerSchema).toHaveBeenCalledWith({ ...options, issuerKeyDer: expect.anything() }) + const result = await service.registerSchema(mockAgentContext, options) + expect(mockHederaAnonCredsRegistry.registerSchema).toHaveBeenCalledWith({ + ...options, + issuerKeyDer: expect.anything(), + }) expect(result).toBe('registerSchema') }) it('getCredentialDefinition', async () => { - const result = await service.getCredentialDefinition(mockAgentContext as AgentContext, 'credDefId') - expect(mockSdk.getCredentialDefinition).toHaveBeenCalledWith('credDefId') + const result = await service.getCredentialDefinition(mockAgentContext, 'credDefId') + expect(mockHederaAnonCredsRegistry.getCredentialDefinition).toHaveBeenCalledWith('credDefId') expect(result).toBe('credDef') }) @@ -504,8 +449,8 @@ describe('HederaLedgerService', () => { }, }, } - await service.registerCredentialDefinition(mockAgentContext as AgentContext, options) - expect(mockSdk.registerCredentialDefinition).toHaveBeenCalledWith({ + await service.registerCredentialDefinition(mockAgentContext, options) + expect(mockHederaAnonCredsRegistry.registerCredentialDefinition).toHaveBeenCalledWith({ ...options, issuerKeyDer: expect.anything(), options: { @@ -515,8 +460,8 @@ describe('HederaLedgerService', () => { }) it('getRevocationRegistryDefinition', async () => { - const result = await service.getRevocationRegistryDefinition(mockAgentContext as AgentContext, 'revRegDefId') - expect(mockSdk.getRevocationRegistryDefinition).toHaveBeenCalledWith('revRegDefId') + const result = await service.getRevocationRegistryDefinition(mockAgentContext, 'revRegDefId') + expect(mockHederaAnonCredsRegistry.getRevocationRegistryDefinition).toHaveBeenCalledWith('revRegDefId') expect(result).toBe('revRegDef') }) @@ -540,8 +485,8 @@ describe('HederaLedgerService', () => { }, options: {}, } - const result = await service.registerRevocationRegistryDefinition(mockAgentContext as AgentContext, options) - expect(mockSdk.registerRevocationRegistryDefinition).toHaveBeenCalledWith({ + const result = await service.registerRevocationRegistryDefinition(mockAgentContext, options) + expect(mockHederaAnonCredsRegistry.registerRevocationRegistryDefinition).toHaveBeenCalledWith({ ...options, issuerKeyDer: expect.anything(), }) @@ -549,8 +494,8 @@ describe('HederaLedgerService', () => { }) it('getRevocationStatusList', async () => { - const result = await service.getRevocationStatusList(mockAgentContext as AgentContext, 'revRegId', 12345) - expect(mockSdk.getRevocationStatusList).toHaveBeenCalledWith('revRegId', 12345) + const result = await service.getRevocationStatusList(mockAgentContext, 'revRegId', 12345) + expect(mockHederaAnonCredsRegistry.getRevocationStatusList).toHaveBeenCalledWith('revRegId', 12345) expect(result).toBe('revStatusList') }) @@ -564,8 +509,8 @@ describe('HederaLedgerService', () => { currentAccumulator: '', }, } - const result = await service.registerRevocationStatusList(mockAgentContext as AgentContext, options) - expect(mockSdk.registerRevocationStatusList).toHaveBeenCalledWith({ + const result = await service.registerRevocationStatusList(mockAgentContext, options) + expect(mockHederaAnonCredsRegistry.registerRevocationStatusList).toHaveBeenCalledWith({ ...options, issuerKeyDer: expect.anything(), }) @@ -576,21 +521,22 @@ describe('HederaLedgerService', () => { describe('getIssuerPrivateKey', () => { it('should return PrivateKey from secretBytes when rootKey exists', async () => { const secretBytes = PrivateKey.generate().toBytes() + const keyInfo = { key: { secretBytes } } + const didRecord = { keys: [{ didDocumentRelativeKeyId: DID_ROOT_KEY_ID, kmsKeyId: 'kms-key-id' }], - } - const keyInfo = { key: { secretBytes } } + } as unknown as DidRecord - mockDidRepository.findCreatedDid.mockResolvedValue(didRecord as unknown as DidRecord) + mockFunction(mockDidRepository.findCreatedDid).mockResolvedValueOnce(didRecord) // @ts-ignore - mockKeyManagementService.getKeyAsserted.mockResolvedValue(keyInfo) + mockFunction(mockKeyManagementService.getKeyAsserted).mockResolvedValue(keyInfo) // biome-ignore lint/suspicious/noExplicitAny: const result = await (service as any).getIssuerPrivateKey(mockAgentContext, 'issuer-id') expect(mockDidRepository.findCreatedDid).toHaveBeenCalledWith(mockAgentContext, 'issuer-id') // @ts-ignore - expect(mockKms.getKms).toHaveBeenCalledWith(mockAgentContext) + expect(mockKms.getKms).toHaveBeenCalledWith(mockAgentContext, AskarKeyManagementService.backend) // @ts-ignore expect(mockKeyManagementService.getKeyAsserted).toHaveBeenCalledWith(mockAgentContext, 'kms-key-id') expect(result).toEqual(PrivateKey.fromBytesED25519(secretBytes)) @@ -599,8 +545,8 @@ describe('HederaLedgerService', () => { it('should throw error if no rootKey found', async () => { const didRecord = { keys: [], - } - mockDidRepository.findCreatedDid.mockResolvedValue(didRecord as unknown as DidRecord) + } as unknown as DidRecord + mockFunction(mockDidRepository.findCreatedDid).mockResolvedValue(didRecord) // biome-ignore lint/suspicious/noExplicitAny: await expect((service as any).getIssuerPrivateKey(mockAgentContext, 'issuer-id')).rejects.toThrow( @@ -609,7 +555,7 @@ describe('HederaLedgerService', () => { }) it('should throw error if didRecord is null or undefined', async () => { - mockDidRepository.findCreatedDid.mockResolvedValue(null) + mockFunction(mockDidRepository.findCreatedDid).mockResolvedValue(null) // biome-ignore lint/suspicious/noExplicitAny: await expect((service as any).getIssuerPrivateKey(mockAgentContext, 'issuer-id')).rejects.toThrow( diff --git a/packages/hedera/tests/unit/kms-publisher.test.ts b/packages/hedera/tests/unit/kms-publisher.test.ts index e76a8a59a8..42aa1adf23 100644 --- a/packages/hedera/tests/unit/kms-publisher.test.ts +++ b/packages/hedera/tests/unit/kms-publisher.test.ts @@ -22,8 +22,6 @@ jest.mock('@credo-ts/core', () => ({ jest.mock('../../src/ledger/utils', () => ({ createOrGetKey: jest.fn(), })) - -import { Transaction } from '@hashgraph/sdk' import { createOrGetKey } from '../../src/ledger/utils' jest.mock('@hiero-did-sdk/publisher-internal', () => { @@ -123,13 +121,4 @@ describe('KmsPublisher', () => { const publisher = new KmsPublisher(agentContext as unknown as AgentContext, mockClient as any, key) expect(publisher.publicKey()).toBe(fakePublicKey) }) - - it('should throw error in publish if key is not set', async () => { - // biome-ignore lint/suspicious/noExplicitAny: - const publisher = new KmsPublisher(agentContext as unknown as AgentContext, mockClient as any, key) - // biome-ignore lint/suspicious/noExplicitAny: - ;(publisher as any).submitPublicKey = undefined - - await expect(publisher.publish({} as unknown as Transaction)).rejects.toThrow('Need to setup the KeyId') - }) }) diff --git a/packages/hedera/tests/unit/utils.test.ts b/packages/hedera/tests/unit/utils.test.ts index 25a37aae19..1b2901bf8a 100644 --- a/packages/hedera/tests/unit/utils.test.ts +++ b/packages/hedera/tests/unit/utils.test.ts @@ -9,9 +9,8 @@ describe('getMultibasePublicKey', () => { crv: 'Ed25519', x: base64X, } - // Expect base64 'dGVzdGtleQ==' to be decoded into Uint8Array - // and then encoded into base58 string starting with 'z' const multibaseKey = getMultibasePublicKey(publicJwk as KmsJwkPublicOkp & { crv: 'Ed25519' }) + expect(multibaseKey.startsWith('z')).toBe(true) expect(typeof multibaseKey).toBe('string') }) @@ -36,9 +35,8 @@ describe('createOrGetKey', () => { }) const result = await createOrGetKey(kmsMock, undefined) - // Check that createKey was called with correct parameters + expect(kmsMock.createKey).toHaveBeenCalledWith({ type: { crv: 'Ed25519', kty: 'OKP' } }) - // Check the returned result matches the mocked createKey response expect(result).toEqual({ keyId: fakeKeyId, publicJwk: fakeJwk, @@ -51,9 +49,8 @@ describe('createOrGetKey', () => { kmsMock.getPublicKey.mockResolvedValue(publicJwk) const result = await createOrGetKey(kmsMock, keyId) - // Check that getPublicKey was called with the given keyId + expect(kmsMock.getPublicKey).toHaveBeenCalledWith({ keyId }) - // Check the returned keyId and publicJwk match the mocked response expect(result).toEqual({ keyId, publicJwk: { @@ -67,7 +64,7 @@ describe('createOrGetKey', () => { // @ts-ignore kmsMock.getPublicKey.mockResolvedValue(null) - // Expect the function to throw an error for missing key + // Expect the function to throw an error for a missing key await expect(createOrGetKey(kmsMock, 'notfound')).rejects.toThrowError("Key with key id 'notfound' not found") }) @@ -77,10 +74,8 @@ describe('createOrGetKey', () => { kmsMock.getPublicKey.mockResolvedValue(badJwk) - // Mock Kms.getJwkHumanDescription to control error message output const spyDesc = jest.spyOn(Kms, 'getJwkHumanDescription').mockReturnValue('unsupported key type') - // Expect an error indicating unsupported key type or curve await expect(createOrGetKey(kmsMock, keyId)).rejects.toThrow( `Key with key id '${keyId}' uses unsupported unsupported key type for did:hedera` ) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 12ee52cb2d..ff19468a94 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -173,8 +173,8 @@ importers: demo: dependencies: '@hiero-did-sdk/client': - specifier: 0.1.0 - version: 0.1.0(bn.js@5.2.1) + specifier: 0.1.2 + version: 0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) '@hyperledger/anoncreds-nodejs': specifier: 'catalog:' version: 0.3.1 @@ -2567,10 +2567,6 @@ packages: resolution: {integrity: sha512-stj/s2dZ6nPcbg+dXcQ1HiGR4nd/eHtZu3kxQ4PlXQ7HcwnMFMO+DZE1hdh8vwPVD/JCtUzy2BrPdJXQwIzhwA==} engines: {node: '>=20'} - '@hiero-did-sdk/client@0.1.0': - resolution: {integrity: sha512-8EBsjVxxEZEdQKePenBCo1HXKRK/70p/XRgFPzWIplUE+2jbmfy7NGqx8tzihK0NlXpA17ojp4Pu5wZJONolmA==} - engines: {node: '>=20'} - '@hiero-did-sdk/client@0.1.2': resolution: {integrity: sha512-1HOk6O13+ex9KOxkaxhD27aEeubwT1UAAyOFVo7YKEkXBOJc1PPAZVPbkYOyyuYA+UEUT6ntUvXmhsYvm8IMog==} engines: {node: '>=20'} @@ -6137,7 +6133,6 @@ packages: metro-react-native-babel-preset@0.73.10: resolution: {integrity: sha512-1/dnH4EHwFb2RKEKx34vVDpUS3urt2WEeR8FYim+ogqALg4sTpG7yeQPxWpbgKATezt4rNfqAANpIyH19MS4BQ==} - deprecated: Use @react-native/babel-preset instead peerDependencies: '@babel/core': '*' @@ -10527,14 +10522,6 @@ snapshots: - expo-crypto - react-native - '@hiero-did-sdk/client@0.1.0(bn.js@5.2.1)': - dependencies: - '@hashgraph/sdk': 2.70.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) - transitivePeerDependencies: - - bn.js - - expo-crypto - - react-native - '@hiero-did-sdk/client@0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': dependencies: '@hashgraph/sdk': 2.70.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) From ffbb5b4d2a4acd01f1faeec1a3eedb089589d070 Mon Sep 17 00:00:00 2001 From: Alexander Shenshin Date: Wed, 10 Sep 2025 20:40:51 +0300 Subject: [PATCH 88/89] Update Hiero DID SDK JS dependency + lint/style fixes Signed-off-by: Alexander Shenshin --- demo/package.json | 2 +- packages/hedera/package.json | 16 +- .../hedera/src/ledger/HederaLedgerService.ts | 6 +- .../hedera-anoncreds-registry.e2e.test.ts | 2 +- .../hedera-did-registrar.e2e.test.ts | 99 ++++---- .../tests/integration/utils/hederaModule.ts | 2 +- .../unit/hedera-anoncres-registry.test.ts | 2 +- .../tests/unit/hedera-did-registrar.test.ts | 2 +- .../tests/unit/hedera-did-resolver.test.ts | 4 +- .../tests/unit/hedera-ledger-service.test.ts | 16 +- pnpm-lock.yaml | 218 +++++++++--------- 11 files changed, 176 insertions(+), 193 deletions(-) diff --git a/demo/package.json b/demo/package.json index c3eed26377..3b493f7855 100644 --- a/demo/package.json +++ b/demo/package.json @@ -13,7 +13,7 @@ "faber": "ts-node src/FaberInquirer.ts" }, "dependencies": { - "@hiero-did-sdk/client": "0.1.2", + "@hiero-did-sdk/client": "0.1.3", "@hyperledger/anoncreds-nodejs": "catalog:", "@hyperledger/indy-vdr-nodejs": "catalog:", "@openwallet-foundation/askar-nodejs": "catalog:", diff --git a/packages/hedera/package.json b/packages/hedera/package.json index 05be886dd9..8532870728 100644 --- a/packages/hedera/package.json +++ b/packages/hedera/package.json @@ -27,14 +27,14 @@ "dependencies": { "@credo-ts/anoncreds": "workspace:*", "@credo-ts/core": "workspace:*", - "@hashgraph/sdk": "^2.66.0", - "@hiero-did-sdk/anoncreds": "^0.1.2", - "@hiero-did-sdk/client": "^0.1.2", - "@hiero-did-sdk/core": "^0.1.2", - "@hiero-did-sdk/hcs": "^0.1.2", - "@hiero-did-sdk/publisher-internal": "^0.1.2", - "@hiero-did-sdk/registrar": "^0.1.2", - "@hiero-did-sdk/resolver": "^0.1.2" + "@hashgraph/sdk": "^2.72.0", + "@hiero-did-sdk/anoncreds": "^0.1.3", + "@hiero-did-sdk/client": "^0.1.3", + "@hiero-did-sdk/core": "^0.1.3", + "@hiero-did-sdk/hcs": "^0.1.3", + "@hiero-did-sdk/publisher-internal": "^0.1.3", + "@hiero-did-sdk/registrar": "^0.1.3", + "@hiero-did-sdk/resolver": "^0.1.3" }, "devDependencies": { "@credo-ts/node": "workspace:*", diff --git a/packages/hedera/src/ledger/HederaLedgerService.ts b/packages/hedera/src/ledger/HederaLedgerService.ts index 1c8d8e723b..eac07c60c3 100644 --- a/packages/hedera/src/ledger/HederaLedgerService.ts +++ b/packages/hedera/src/ledger/HederaLedgerService.ts @@ -45,7 +45,6 @@ import { HederaModuleConfig } from '../HederaModuleConfig' import { CredoCache } from './cache/CredoCache' import { KmsPublisher } from './publisher/KmsPublisher' import { createOrGetKey, getMultibasePublicKey } from './utils' -import { AskarKeyManagementService } from '@credo-ts/askar' export interface HederaDidCreateOptions extends DidCreateOptions { method: 'hedera' @@ -529,10 +528,7 @@ export class HederaLedgerService { } // @ts-ignore - const keyManagementService = kms.getKms( - agentContext, - AskarKeyManagementService.backend - ) as AskarKeyManagementService + const keyManagementService = kms.getKms(agentContext, 'askar') // @ts-ignore const keyInfo = await keyManagementService.getKeyAsserted(agentContext, rootKey.kmsKeyId) diff --git a/packages/hedera/tests/integration/hedera-anoncreds-registry.e2e.test.ts b/packages/hedera/tests/integration/hedera-anoncreds-registry.e2e.test.ts index 271621ab2b..83d828163a 100644 --- a/packages/hedera/tests/integration/hedera-anoncreds-registry.e2e.test.ts +++ b/packages/hedera/tests/integration/hedera-anoncreds-registry.e2e.test.ts @@ -7,7 +7,7 @@ describe('Hedera AnonCreds support', () => { let issuerId: string const logger = new ConsoleLogger(LogLevel.fatal) - const cache = new InMemoryLruCache( { limit: 10 }) + const cache = new InMemoryLruCache({ limit: 10 }) beforeAll(async () => { agent = getHederaAgent({ diff --git a/packages/hedera/tests/integration/hedera-did-registrar.e2e.test.ts b/packages/hedera/tests/integration/hedera-did-registrar.e2e.test.ts index fbdc01e5b5..f6c8b7d2fb 100644 --- a/packages/hedera/tests/integration/hedera-did-registrar.e2e.test.ts +++ b/packages/hedera/tests/integration/hedera-did-registrar.e2e.test.ts @@ -11,39 +11,34 @@ import { HederaDidCreateOptions, HederaDidUpdateOptions } from '../../src/ledger import { getMultibasePublicKey } from '../../src/ledger/utils' import { getHederaAgent } from './utils' -describe('Hedera DID registrar', () => { - const logger = new ConsoleLogger(LogLevel.error) - let agent: Agent - - const validDid = 'did:hedera:testnet:44eesExqdsUvLZ35FpnBPErqRGRnYbzzyG3wgCCYxkmq_0.0.6226170' +const validDid = 'did:hedera:testnet:44eesExqdsUvLZ35FpnBPErqRGRnYbzzyG3wgCCYxkmq_0.0.6226170' - function validVerificationMethod(publicKeyMultibase?: string) { - return new VerificationMethod({ - id: '#key-1', - type: 'Ed25519VerificationKey2020', - controller: validDid, - publicKeyMultibase: publicKeyMultibase ?? 'z44eesExqdsUvLZ35FpnBPErqRGRnYbzzyG3wgCCYxkmq', - }) - } +const validService = new DidDocumentService({ + id: '#service-1', + type: 'CustomType', + serviceEndpoint: ['https://rand.io'], +}) - function validService() { - return new DidDocumentService({ - id: '#service-1', - type: 'CustomType', - serviceEndpoint: ['https://rand.io'], - }) - } +function getValidVerificationMethod(publicKeyMultibase?: string) { + return new VerificationMethod({ + id: '#key-1', + type: 'Ed25519VerificationKey2020', + controller: validDid, + publicKeyMultibase: publicKeyMultibase ?? 'z44eesExqdsUvLZ35FpnBPErqRGRnYbzzyG3wgCCYxkmq', + }) +} - function validDidDoc(publicKeyMultibase?: string) { - const service = [validService()] - const verificationMethod = [validVerificationMethod(publicKeyMultibase)] +function getValidDidDocument(publicKeyMultibase?: string) { + return new DidDocument({ + id: validDid, + verificationMethod: [getValidVerificationMethod(publicKeyMultibase)], + service: [validService], + }) +} - return new DidDocument({ - id: validDid, - verificationMethod, - service, - }) - } +describe('Hedera DID registrar', () => { + const logger = new ConsoleLogger(LogLevel.error) + let agent: Agent beforeAll(async () => { agent = getHederaAgent({ @@ -95,13 +90,13 @@ describe('Hedera DID registrar', () => { const didResult = await agent.dids.create({ method: 'hedera', - didDocument: validDidDoc(multibasePublicKey), + didDocument: getValidDidDocument(multibasePublicKey), options: { network: 'testnet' }, secret: { keys }, }) expect(didResult.didState.state).toEqual('finished') - const verificationMethod = validVerificationMethod(multibasePublicKey) + const verificationMethod = getValidVerificationMethod(multibasePublicKey) expect(didResult.didState.didDocument?.verificationMethod).toEqual( expect.arrayContaining([ expect.objectContaining({ @@ -119,13 +114,12 @@ describe('Hedera DID registrar', () => { ]) ) - const service = validService() expect(didResult.didState.didDocument?.service).toEqual( expect.arrayContaining([ expect.objectContaining({ - id: expect.stringContaining(service.id), - type: service.type, - serviceEndpoint: service.serviceEndpoint, + id: expect.stringContaining(validService.id), + type: validService.type, + serviceEndpoint: validService.serviceEndpoint, }), ]) ) @@ -142,7 +136,7 @@ describe('Hedera DID registrar', () => { const did = didResult.didState.did ?? '' const didDocument = didResult.didState.didDocument as DidDocument - didDocument.service = [validService()] + didDocument.service = [validService] const addUpdateResult = await agent.dids.update({ did, @@ -158,13 +152,12 @@ describe('Hedera DID registrar', () => { }) expect(resolvedDocument.didDocument?.id).toEqual(did) - const service = validService() expect(resolvedDocument.didDocument?.service).toEqual( expect.arrayContaining([ expect.objectContaining({ - id: expect.stringContaining(service.id), - type: service.type, - serviceEndpoint: service.serviceEndpoint, + id: expect.stringContaining(validService.id), + type: validService.type, + serviceEndpoint: validService.serviceEndpoint, }), ]) ) @@ -212,8 +205,8 @@ describe('Hedera DID registrar', () => { const did = didResult.didState.did ?? '' const didDocument = didResult.didState.didDocument as DidDocument - const validVerification = validVerificationMethod(multibasePublicKey) - didDocument.verificationMethod = [validVerification] + const validVerificationMethod = getValidVerificationMethod(multibasePublicKey) + didDocument.verificationMethod = [validVerificationMethod] const addUpdateResult = await agent.dids.update({ did, @@ -234,10 +227,10 @@ describe('Hedera DID registrar', () => { expect(addResolvedDocument.didDocument?.verificationMethod).toEqual( expect.arrayContaining([ expect.objectContaining({ - id: expect.stringContaining(validVerification.id), - type: validVerification.type, - controller: validVerification.controller, - publicKeyMultibase: validVerification.publicKeyMultibase, + id: expect.stringContaining(validVerificationMethod.id), + type: validVerificationMethod.type, + controller: validVerificationMethod.controller, + publicKeyMultibase: validVerificationMethod.publicKeyMultibase, }), ]) ) @@ -279,8 +272,8 @@ describe('Hedera DID registrar', () => { const did = didResult.didState.did ?? '' const didDocument = didResult.didState.didDocument as DidDocument - const validVerification = validVerificationMethod(multibasePublicKey) - didDocument.verificationMethod = [validVerification] + const validVerificationMethod = getValidVerificationMethod(multibasePublicKey) + didDocument.verificationMethod = [validVerificationMethod] const expectedFailureReason = 'Unable update DID: Key #key-1 is present in updated DID Document, but missing from DID record keys and DID update arguments' @@ -294,7 +287,7 @@ describe('Hedera DID registrar', () => { if (updateResult.didState.state === 'failed') expect(updateResult.didState.reason).toEqual(expectedFailureReason) didDocument.verificationMethod = undefined - didDocument.assertionMethod = [validVerification] + didDocument.assertionMethod = [validVerificationMethod] updateResult = await agent.dids.update({ did, @@ -305,7 +298,7 @@ describe('Hedera DID registrar', () => { if (updateResult.didState.state === 'failed') expect(updateResult.didState.reason).toEqual(expectedFailureReason) didDocument.assertionMethod = undefined - didDocument.authentication = [validVerification] + didDocument.authentication = [validVerificationMethod] updateResult = await agent.dids.update({ did, @@ -316,7 +309,7 @@ describe('Hedera DID registrar', () => { if (updateResult.didState.state === 'failed') expect(updateResult.didState.reason).toEqual(expectedFailureReason) didDocument.authentication = undefined - didDocument.capabilityDelegation = [validVerification] + didDocument.capabilityDelegation = [validVerificationMethod] updateResult = await agent.dids.update({ did, @@ -327,7 +320,7 @@ describe('Hedera DID registrar', () => { if (updateResult.didState.state === 'failed') expect(updateResult.didState.reason).toEqual(expectedFailureReason) didDocument.capabilityDelegation = undefined - didDocument.capabilityInvocation = [validVerification] + didDocument.capabilityInvocation = [validVerificationMethod] updateResult = await agent.dids.update({ did, @@ -338,7 +331,7 @@ describe('Hedera DID registrar', () => { if (updateResult.didState.state === 'failed') expect(updateResult.didState.reason).toEqual(expectedFailureReason) didDocument.capabilityInvocation = undefined - didDocument.keyAgreement = [validVerification] + didDocument.keyAgreement = [validVerificationMethod] updateResult = await agent.dids.update({ did, diff --git a/packages/hedera/tests/integration/utils/hederaModule.ts b/packages/hedera/tests/integration/utils/hederaModule.ts index 33e6b70c52..0b241bf5ee 100644 --- a/packages/hedera/tests/integration/utils/hederaModule.ts +++ b/packages/hedera/tests/integration/utils/hederaModule.ts @@ -1,6 +1,6 @@ import { AnonCredsModule } from '@credo-ts/anoncreds' import { AskarModule } from '@credo-ts/askar' -import { Agent, Cache, CacheModule, DidsModule, Logger, utils, ModulesMap } from '@credo-ts/core' +import { Agent, Cache, CacheModule, DidsModule, Logger, ModulesMap, utils } from '@credo-ts/core' import { HederaAnonCredsRegistry, HederaDidRegistrar, diff --git a/packages/hedera/tests/unit/hedera-anoncres-registry.test.ts b/packages/hedera/tests/unit/hedera-anoncres-registry.test.ts index 93673b79ca..0b2344449a 100644 --- a/packages/hedera/tests/unit/hedera-anoncres-registry.test.ts +++ b/packages/hedera/tests/unit/hedera-anoncres-registry.test.ts @@ -14,8 +14,8 @@ import { } from '@credo-ts/anoncreds' import { AgentContext } from '@credo-ts/core' import { HederaAnonCredsRegistry } from '@credo-ts/hedera' -import { HederaLedgerService } from '../../src/ledger/HederaLedgerService' import { mockFunction } from '../../../core/tests/helpers' +import { HederaLedgerService } from '../../src/ledger/HederaLedgerService' const mockLedgerService = { registerSchema: jest.fn(), diff --git a/packages/hedera/tests/unit/hedera-did-registrar.test.ts b/packages/hedera/tests/unit/hedera-did-registrar.test.ts index c2e07eaa56..02d6cd3b58 100644 --- a/packages/hedera/tests/unit/hedera-did-registrar.test.ts +++ b/packages/hedera/tests/unit/hedera-did-registrar.test.ts @@ -2,8 +2,8 @@ import { AgentContext, DidDocumentKey, DidRecord, DidRepository } from '@credo-t import { DidDocumentRole } from '@credo-ts/core' import { HederaDidRegistrar } from '@credo-ts/hedera' -import { HederaDidUpdateOptions, HederaLedgerService } from '../../src/ledger/HederaLedgerService' import { mockFunction } from '../../../core/tests/helpers' +import { HederaDidUpdateOptions, HederaLedgerService } from '../../src/ledger/HederaLedgerService' import { did, didDocument, didResolutionMetadata } from './fixtures/did-document' const mockDidRepository = { diff --git a/packages/hedera/tests/unit/hedera-did-resolver.test.ts b/packages/hedera/tests/unit/hedera-did-resolver.test.ts index e4c64e1a01..f39904bcce 100644 --- a/packages/hedera/tests/unit/hedera-did-resolver.test.ts +++ b/packages/hedera/tests/unit/hedera-did-resolver.test.ts @@ -1,8 +1,8 @@ import { AgentContext, DidDocument, JsonTransformer } from '@credo-ts/core' import { HederaDidResolver } from '@credo-ts/hedera' -import { HederaLedgerService } from '../../src/ledger/HederaLedgerService' import { mockFunction } from '../../../core/tests/helpers' -import { did, parsedDid, didDocument, didResolutionMetadata } from './fixtures/did-document' +import { HederaLedgerService } from '../../src/ledger/HederaLedgerService' +import { did, didDocument, didResolutionMetadata, parsedDid } from './fixtures/did-document' const mockLedgerService = { resolveDid: jest.fn(), diff --git a/packages/hedera/tests/unit/hedera-ledger-service.test.ts b/packages/hedera/tests/unit/hedera-ledger-service.test.ts index 06ed9bc539..6120d6355b 100644 --- a/packages/hedera/tests/unit/hedera-ledger-service.test.ts +++ b/packages/hedera/tests/unit/hedera-ledger-service.test.ts @@ -38,16 +38,16 @@ jest.mock('@hiero-did-sdk/registrar', () => ({ })) import { + CreateDIDRequest, DIDUpdateBuilder, + DeactivateDIDRequest, + UpdateDIDRequest, generateCreateDIDRequest, + generateDeactivateDIDRequest, generateUpdateDIDRequest, submitCreateDIDRequest, submitDeactivateDIDRequest, submitUpdateDIDRequest, - CreateDIDRequest, - UpdateDIDRequest, - generateDeactivateDIDRequest, - DeactivateDIDRequest, } from '@hiero-did-sdk/registrar' jest.mock('@hiero-did-sdk/resolver', () => ({ @@ -60,12 +60,12 @@ import { resolveDID } from '@hiero-did-sdk/resolver' jest.mock('../../src/ledger/utils') import { AskarKeyManagementService } from '@credo-ts/askar' +import { DID_ROOT_KEY_ID } from '@hiero-did-sdk/core' import { KeyEntryObject } from '@openwallet-foundation/askar-nodejs' -import { createOrGetKey } from '../../src/ledger/utils' import { mockFunction } from '../../../core/tests/helpers' -import { did, didDocument } from './fixtures/did-document' import { HederaAnonCredsRegistry } from '../../src/anoncreds/HederaAnonCredsRegistry' -import { DID_ROOT_KEY_ID } from '@hiero-did-sdk/core' +import { createOrGetKey } from '../../src/ledger/utils' +import { did, didDocument } from './fixtures/did-document' const mockKeyId = 'mock-key-id' @@ -536,7 +536,7 @@ describe('HederaLedgerService', () => { expect(mockDidRepository.findCreatedDid).toHaveBeenCalledWith(mockAgentContext, 'issuer-id') // @ts-ignore - expect(mockKms.getKms).toHaveBeenCalledWith(mockAgentContext, AskarKeyManagementService.backend) + expect(mockKms.getKms).toHaveBeenCalledWith(mockAgentContext, 'askar') // @ts-ignore expect(mockKeyManagementService.getKeyAsserted).toHaveBeenCalledWith(mockAgentContext, 'kms-key-id') expect(result).toEqual(PrivateKey.fromBytesED25519(secretBytes)) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ff19468a94..7bda0bfed4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -173,8 +173,8 @@ importers: demo: dependencies: '@hiero-did-sdk/client': - specifier: 0.1.2 - version: 0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + specifier: 0.1.3 + version: 0.1.3(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) '@hyperledger/anoncreds-nodejs': specifier: 'catalog:' version: 0.3.1 @@ -683,29 +683,29 @@ importers: specifier: workspace:* version: link:../core '@hashgraph/sdk': - specifier: ^2.66.0 - version: 2.70.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + specifier: ^2.72.0 + version: 2.72.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) '@hiero-did-sdk/anoncreds': - specifier: ^0.1.2 - version: 0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + specifier: ^0.1.3 + version: 0.1.3(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) '@hiero-did-sdk/client': - specifier: ^0.1.2 - version: 0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + specifier: ^0.1.3 + version: 0.1.3(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) '@hiero-did-sdk/core': - specifier: ^0.1.2 - version: 0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + specifier: ^0.1.3 + version: 0.1.3(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) '@hiero-did-sdk/hcs': - specifier: ^0.1.2 - version: 0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + specifier: ^0.1.3 + version: 0.1.3(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) '@hiero-did-sdk/publisher-internal': - specifier: ^0.1.2 - version: 0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + specifier: ^0.1.3 + version: 0.1.3(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) '@hiero-did-sdk/registrar': - specifier: ^0.1.2 - version: 0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + specifier: ^0.1.3 + version: 0.1.3(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) '@hiero-did-sdk/resolver': - specifier: ^0.1.2 - version: 0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + specifier: ^0.1.3 + version: 0.1.3(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) devDependencies: '@credo-ts/node': specifier: workspace:* @@ -2549,70 +2549,70 @@ packages: expo-crypto: optional: true - '@hashgraph/proto@2.20.0': - resolution: {integrity: sha512-XGIHRE9jr4wnnmCG8JeUD/nyeCiiYoUt35oRJz0QdCUwJYtbEsR6tPQxO90PxJJVDI5smT1c5i0f9wRRtFDhIA==} + '@hashgraph/proto@2.22.0': + resolution: {integrity: sha512-+h2qqk+KwpV+rr1AN4ip1Gel3X4v0DvFO9WH7o0ZR3gQX9pfzurptKGs30DlBnH21xPqDH61v90bZvVknE27NA==} engines: {node: '>=10.0.0'} - '@hashgraph/sdk@2.70.0': - resolution: {integrity: sha512-naml5lWgewD3Dh8z0K7NRuKpbOpDaxpxwcLjtB9RFVmATMDU3IShSzxy24k5tUgY/0ZE7XXfCKgIpdT7TxGKqQ==} + '@hashgraph/sdk@2.72.0': + resolution: {integrity: sha512-w35M77OAkJutENG4CldUGzfT+qubDjEYCQR5Ran75uHB+SLeCodR87AXWJ3ocr5vPaZ7lsflBXEYZLhgCi1G2g==} engines: {node: '>=18.0.0'} peerDependencies: bn.js: ^5.2.1 - '@hiero-did-sdk/anoncreds@0.1.2': - resolution: {integrity: sha512-Htq627498/XP9mZRhkGlT1rb+DIC4TtQSfATv1zYzwszp1ZCc0Ii9nqePCitIOjj33w1pn6ugyiRMXKAqmsDAA==} + '@hiero-did-sdk/anoncreds@0.1.3': + resolution: {integrity: sha512-SUeUdHFbZTHF5fTGZTcMqrAFfQTQBdFhFvUCf95Yv1MGYMaLEZfPaCs/x95/TjJFN1j9F0nZlvEkJnW56OoGow==} engines: {node: '>=20'} - '@hiero-did-sdk/cache@0.1.2': - resolution: {integrity: sha512-stj/s2dZ6nPcbg+dXcQ1HiGR4nd/eHtZu3kxQ4PlXQ7HcwnMFMO+DZE1hdh8vwPVD/JCtUzy2BrPdJXQwIzhwA==} + '@hiero-did-sdk/cache@0.1.3': + resolution: {integrity: sha512-ucmuFhZNZwI3BRzxUU+x7T50n4O7t6Y9dRTxNM7cQOYajwyGTNDuR/2Mp87DqvlGXKEj8Yj5JYE/1hX+fdZViQ==} engines: {node: '>=20'} - '@hiero-did-sdk/client@0.1.2': - resolution: {integrity: sha512-1HOk6O13+ex9KOxkaxhD27aEeubwT1UAAyOFVo7YKEkXBOJc1PPAZVPbkYOyyuYA+UEUT6ntUvXmhsYvm8IMog==} + '@hiero-did-sdk/client@0.1.3': + resolution: {integrity: sha512-DE/xiQCz83zlxO1pmouy+wSvxbMBsKPgfCRTW0Kr7FuVqnBP6ihCbNfdPU9Sj9jgVyGQIey+UPNRiY5lzYYvrA==} engines: {node: '>=20'} - '@hiero-did-sdk/core@0.1.2': - resolution: {integrity: sha512-TqKR1/vg9vg4TmGB3y5oYCDS1d+5amF95EUBVj2KJI4wgKqprtoMSQP6sWxhKwkXH1vdhRhRYiUOnadq2IuL8Q==} + '@hiero-did-sdk/core@0.1.3': + resolution: {integrity: sha512-v0O2ssemyBVZuduwjojdHL66YCo322Z+xGIt7cd2UCNu8beztGF5eRJxY+W+mCX/H3m8lcxqL2hAcF04KmhEjQ==} engines: {node: '>=20'} - '@hiero-did-sdk/crypto@0.1.2': - resolution: {integrity: sha512-wURtHaiKOyJ9BEf10BvBi13Qy2s4dTYpH5A3mOGmxetsy2vjUvd+pIgjzP+P7A3Zskni2b8iyrRe70G/LiR5fA==} + '@hiero-did-sdk/crypto@0.1.3': + resolution: {integrity: sha512-xQnJXHPSFVT56kz2EHqBRVPUqrqNPDmRRYHaeqctvm+62cjKhYv+ja/w7CWamoMlobLe1bzU1KZqVQDWqBDUbQ==} engines: {node: '>=20'} - '@hiero-did-sdk/hcs@0.1.2': - resolution: {integrity: sha512-pyWQAKrS93hmj+ydOZRr3vB6ZObxx8wHRwvJb67YADudU6FhWH0FyWmflDiJ2D+f1a+Z3EsuF6Drbui9Ja0AVQ==} + '@hiero-did-sdk/hcs@0.1.3': + resolution: {integrity: sha512-Gm43RLGDUpGfc/olCMQEMgZXP11ZZt8WMsb/7VaN5fNhxf6qE2y2k7V9thcJSqrSvJ2nvZeWDzGnCcb4VIj+pg==} engines: {node: '>=20'} - '@hiero-did-sdk/lifecycle@0.1.2': - resolution: {integrity: sha512-QYjXlQWSRgfEmsXTQj5X5lRZ7E2GXG+6yKA3WsPFjG4MoPC6AL1i1ZXczsDOfGGLxglQGJjf78CL2fQDjxMtlg==} + '@hiero-did-sdk/lifecycle@0.1.3': + resolution: {integrity: sha512-A2Mlsxtx8XZAUxpcNBnHvNENdlC0vNaSDU8eFXpxpA9B7LP/Bx/WaH0RYOW1nZBiXMaApBGLbZoJPTTbWRE5Mg==} engines: {node: '>=20'} - '@hiero-did-sdk/messages@0.1.2': - resolution: {integrity: sha512-dIm0aM519qTCNrDkT14IMy3l7n8L4G1EsT52Sl/Q0FIEQiLDwCiiJO866a8UXHe+7FH1V6n0yOERiggGwIZhbA==} + '@hiero-did-sdk/messages@0.1.3': + resolution: {integrity: sha512-5WNmNbxNDRTTsfjObE09Su7ERBAVjQNcKFgPC0oBvDhyEE3cknYcBkc9P+G8Uoee/+zxebfZR9KTISqbvdQ9lw==} engines: {node: '>=20'} - '@hiero-did-sdk/publisher-internal@0.1.2': - resolution: {integrity: sha512-vs4NRfF3+/uzoL3b2edaIeGNLt5jWx5+KruYLgmbgeP21Eb3ZrClZEZGRQaeU5IP/nqxCHalpffs1nI/kVxymA==} + '@hiero-did-sdk/publisher-internal@0.1.3': + resolution: {integrity: sha512-qGsV3no4jUo/R0VzcDar3hZ+IiaHJVnhdM6fmrUPNikbnVhTTNmJ5g2ci0Ed6NkXhPCuaJtcCK4SgGdEB6jOrQ==} engines: {node: '>=20'} - '@hiero-did-sdk/registrar@0.1.2': - resolution: {integrity: sha512-aa+khHIqkgF3geOhIxM9eKRNNgYiPdaXkf9Rq1jByoVwo/liLtdoe8xOQfRL3YMEVf94ztbGjYpb9NmeaZY2Ow==} + '@hiero-did-sdk/registrar@0.1.3': + resolution: {integrity: sha512-EDuuNRzkgLbWXacqaF59q7Do3U1p1w11g33FaJNWJ0gCd0S6imrxwUfDE/6THQjhSOVtfkqzo8Ge2Vm/pLQUQg==} engines: {node: '>=20'} - '@hiero-did-sdk/resolver@0.1.2': - resolution: {integrity: sha512-9r9s2SVrPPaMmIKjbO7UgxmC0qkxYSuO06nv2m8A1tq11w9EDkLoIK+u8Fdgdh2HGZHZ9ZLmFQn9QRl2Y1tnYQ==} + '@hiero-did-sdk/resolver@0.1.3': + resolution: {integrity: sha512-TfSCcC0gGU/jgiJK5qr6cwW1Mpmj9vYwIo24YygUxXP47+wPQ4suk/K5FlAsPOq8oga47RwLWVFX+ys66Y2r1w==} engines: {node: '>=20'} - '@hiero-did-sdk/signer-internal@0.1.2': - resolution: {integrity: sha512-cpwHgW1lUCe8UuyT9P2iasQ0AVynmvGFueM21qxOr4qXFXI0oy0mGgORDsnXOnljgy7Yn8/QvBVxjeWx569yyg==} + '@hiero-did-sdk/signer-internal@0.1.3': + resolution: {integrity: sha512-W5yMxz5VSnJA6B5M02YggbhcSDgQnTK50lBv5koTF534gR0vRSuX49i02EqxUrBB3NTahZ7vWNhr+YrP6t6Akw==} engines: {node: '>=20'} - '@hiero-did-sdk/verifier-internal@0.1.2': - resolution: {integrity: sha512-rOC1DbqCCH63NnVaF31bsSQc+iDxpqW97GwL+br1QulpcUpGXPTUoCwTadPd1qRUrlFU4Rh1yDR3IW+4aqVsqA==} + '@hiero-did-sdk/verifier-internal@0.1.3': + resolution: {integrity: sha512-ybGwSU+9rA9pIOeGkCCiFIcbgG/WvW85igBj2wWQPCwH9G9c6qW/alHX5Az/9C7O//f2/CzVaHeVVFQ1CTcLBg==} engines: {node: '>=20'} - '@hiero-did-sdk/zstd@0.1.2': - resolution: {integrity: sha512-IaqgqRLBrn3wTOUsYMo55OG1uU8gSLIWNnimbxLpZs6ZUvL2ri36HUmpjLT1ZypgupAcPscM+BLPIRMUFWjwZQ==} + '@hiero-did-sdk/zstd@0.1.3': + resolution: {integrity: sha512-s+kqRhNbtMhGA7X6CtiTgGpLGqVAflxdPAJ5PqblgSGosa6m23SIe9rTC5mRkOziJ4NeoYvx2/NuosT2faSJKw==} engines: {node: '>=20'} '@hyperledger/anoncreds-nodejs@0.3.1': @@ -6869,9 +6869,6 @@ packages: pure-rand@6.1.0: resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==} - pvtsutils@1.3.5: - resolution: {integrity: sha512-ARvb14YB9Nm2Xi6nBq1ZX6dAM0FsJnuk+31aUp4TrcZEdKUlSqOqsxJHUPJDNE3qiIp+iUPEIeR6Je/tgV7zsA==} - pvtsutils@1.3.6: resolution: {integrity: sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==} @@ -10475,12 +10472,12 @@ snapshots: transitivePeerDependencies: - react-native - '@hashgraph/proto@2.20.0': + '@hashgraph/proto@2.22.0': dependencies: long: 5.3.1 protobufjs: 7.2.5 - '@hashgraph/sdk@2.70.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': + '@hashgraph/sdk@2.72.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': dependencies: '@ethersproject/abi': 5.8.0 '@ethersproject/bignumber': 5.8.0 @@ -10488,7 +10485,7 @@ snapshots: '@ethersproject/rlp': 5.8.0 '@grpc/grpc-js': 1.13.4 '@hashgraph/cryptography': 1.9.0(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) - '@hashgraph/proto': 2.20.0 + '@hashgraph/proto': 2.22.0 bignumber.js: 9.1.2 bn.js: 5.2.1 crypto-js: 4.2.0 @@ -10503,143 +10500,144 @@ snapshots: - expo-crypto - react-native - '@hiero-did-sdk/anoncreds@0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': + '@hiero-did-sdk/anoncreds@0.1.3(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': dependencies: - '@hiero-did-sdk/core': 0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) - '@hiero-did-sdk/hcs': 0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) - '@hiero-did-sdk/zstd': 0.1.2 + '@hiero-did-sdk/core': 0.1.3(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/hcs': 0.1.3(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/zstd': 0.1.3 buffer: 6.0.3 transitivePeerDependencies: - bn.js - expo-crypto - react-native - '@hiero-did-sdk/cache@0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': + '@hiero-did-sdk/cache@0.1.3(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': dependencies: - '@hiero-did-sdk/core': 0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/core': 0.1.3(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) transitivePeerDependencies: - bn.js - expo-crypto - react-native - '@hiero-did-sdk/client@0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': + '@hiero-did-sdk/client@0.1.3(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': dependencies: - '@hashgraph/sdk': 2.70.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hashgraph/sdk': 2.72.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) transitivePeerDependencies: - bn.js - expo-crypto - react-native - '@hiero-did-sdk/core@0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': + '@hiero-did-sdk/core@0.1.3(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': dependencies: - '@hashgraph/sdk': 2.70.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hashgraph/sdk': 2.72.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) '@scure/base': 1.2.6 buffer: 6.0.3 cbor-x: 1.6.0 + varint: 6.0.0 transitivePeerDependencies: - bn.js - expo-crypto - react-native - '@hiero-did-sdk/crypto@0.1.2': + '@hiero-did-sdk/crypto@0.1.3': dependencies: buffer: 6.0.3 - '@hiero-did-sdk/hcs@0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': + '@hiero-did-sdk/hcs@0.1.3(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': dependencies: - '@hashgraph/sdk': 2.70.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) - '@hiero-did-sdk/cache': 0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) - '@hiero-did-sdk/client': 0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) - '@hiero-did-sdk/core': 0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) - '@hiero-did-sdk/crypto': 0.1.2 - '@hiero-did-sdk/zstd': 0.1.2 + '@hashgraph/sdk': 2.72.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/cache': 0.1.3(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/client': 0.1.3(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/core': 0.1.3(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/crypto': 0.1.3 + '@hiero-did-sdk/zstd': 0.1.3 buffer: 6.0.3 transitivePeerDependencies: - bn.js - expo-crypto - react-native - '@hiero-did-sdk/lifecycle@0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': + '@hiero-did-sdk/lifecycle@0.1.3(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': dependencies: - '@hiero-did-sdk/core': 0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/core': 0.1.3(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) buffer: 6.0.3 transitivePeerDependencies: - bn.js - expo-crypto - react-native - '@hiero-did-sdk/messages@0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': + '@hiero-did-sdk/messages@0.1.3(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': dependencies: - '@hashgraph/sdk': 2.70.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) - '@hiero-did-sdk/core': 0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) - '@hiero-did-sdk/lifecycle': 0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) - '@hiero-did-sdk/resolver': 0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hashgraph/sdk': 2.72.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/core': 0.1.3(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/lifecycle': 0.1.3(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/resolver': 0.1.3(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) buffer: 6.0.3 transitivePeerDependencies: - bn.js - expo-crypto - react-native - '@hiero-did-sdk/publisher-internal@0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': + '@hiero-did-sdk/publisher-internal@0.1.3(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': dependencies: - '@hashgraph/sdk': 2.70.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) - '@hiero-did-sdk/core': 0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hashgraph/sdk': 2.72.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/core': 0.1.3(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) buffer: 6.0.3 transitivePeerDependencies: - bn.js - expo-crypto - react-native - '@hiero-did-sdk/registrar@0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': + '@hiero-did-sdk/registrar@0.1.3(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': dependencies: - '@hashgraph/sdk': 2.70.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) - '@hiero-did-sdk/core': 0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) - '@hiero-did-sdk/lifecycle': 0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) - '@hiero-did-sdk/messages': 0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) - '@hiero-did-sdk/publisher-internal': 0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) - '@hiero-did-sdk/resolver': 0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) - '@hiero-did-sdk/signer-internal': 0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) - '@hiero-did-sdk/verifier-internal': 0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hashgraph/sdk': 2.72.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/core': 0.1.3(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/lifecycle': 0.1.3(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/messages': 0.1.3(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/publisher-internal': 0.1.3(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/resolver': 0.1.3(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/signer-internal': 0.1.3(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/verifier-internal': 0.1.3(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) buffer: 6.0.3 transitivePeerDependencies: - bn.js - expo-crypto - react-native - '@hiero-did-sdk/resolver@0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': + '@hiero-did-sdk/resolver@0.1.3(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': dependencies: - '@hashgraph/sdk': 2.70.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) - '@hiero-did-sdk/client': 0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) - '@hiero-did-sdk/core': 0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) - '@hiero-did-sdk/hcs': 0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) - '@hiero-did-sdk/verifier-internal': 0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hashgraph/sdk': 2.72.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/client': 0.1.3(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/core': 0.1.3(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/hcs': 0.1.3(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/verifier-internal': 0.1.3(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) buffer: 6.0.3 transitivePeerDependencies: - bn.js - expo-crypto - react-native - '@hiero-did-sdk/signer-internal@0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': + '@hiero-did-sdk/signer-internal@0.1.3(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': dependencies: - '@hashgraph/sdk': 2.70.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) - '@hiero-did-sdk/core': 0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hashgraph/sdk': 2.72.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/core': 0.1.3(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) buffer: 6.0.3 transitivePeerDependencies: - bn.js - expo-crypto - react-native - '@hiero-did-sdk/verifier-internal@0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': + '@hiero-did-sdk/verifier-internal@0.1.3(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1))': dependencies: - '@hashgraph/sdk': 2.70.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) - '@hiero-did-sdk/core': 0.1.2(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hashgraph/sdk': 2.72.0(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) + '@hiero-did-sdk/core': 0.1.3(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) buffer: 6.0.3 transitivePeerDependencies: - bn.js - expo-crypto - react-native - '@hiero-did-sdk/zstd@0.1.2': {} + '@hiero-did-sdk/zstd@0.1.3': {} '@hyperledger/anoncreds-nodejs@0.3.1': dependencies: @@ -12145,7 +12143,7 @@ snapshots: asn1js@3.0.5: dependencies: - pvtsutils: 1.3.5 + pvtsutils: 1.3.6 pvutils: 1.1.3 tslib: 2.8.1 @@ -16273,7 +16271,7 @@ snapshots: '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 '@types/node': 20.19.2 - long: 5.2.3 + long: 5.3.1 proxy-addr@2.0.7: dependencies: @@ -16291,10 +16289,6 @@ snapshots: pure-rand@6.1.0: {} - pvtsutils@1.3.5: - dependencies: - tslib: 2.8.1 - pvtsutils@1.3.6: dependencies: tslib: 2.8.1 From 74d91045ab4e516cfaf23f1f2827e0a6b9531b91 Mon Sep 17 00:00:00 2001 From: Alexander Shenshin Date: Thu, 11 Sep 2025 02:50:20 +0300 Subject: [PATCH 89/89] Clean up Signed-off-by: Alexander Shenshin --- .github/workflows/continuous-integration.yml | 3 --- demo/package.json | 2 +- package.json | 5 ---- packages/cheqd/package.json | 2 +- .../tests/integration/utils/hederaModule.ts | 21 ++++++++++------- patches/@2060.io__ffi-napi@4.0.9.patch | 14 ----------- pnpm-lock.yaml | 23 ++++++++----------- pnpm-workspace.yaml | 5 ---- 8 files changed, 24 insertions(+), 51 deletions(-) delete mode 100644 patches/@2060.io__ffi-napi@4.0.9.patch diff --git a/.github/workflows/continuous-integration.yml b/.github/workflows/continuous-integration.yml index 04bc467e49..f4db74d324 100644 --- a/.github/workflows/continuous-integration.yml +++ b/.github/workflows/continuous-integration.yml @@ -142,9 +142,6 @@ jobs: run: pnpm install --frozen-lockfile - name: Run tests - env: - HEDERA_OPERATOR_ID: ${{ secrets.HEDERA_OPERATOR_ID }} - HEDERA_OPERATOR_KEY: ${{ secrets.HEDERA_OPERATOR_KEY }} run: pnpm test:e2e --coverage --forceExit # Upload coverage for e2e diff --git a/demo/package.json b/demo/package.json index 3b493f7855..ecb205d9a7 100644 --- a/demo/package.json +++ b/demo/package.json @@ -13,7 +13,6 @@ "faber": "ts-node src/FaberInquirer.ts" }, "dependencies": { - "@hiero-did-sdk/client": "0.1.3", "@hyperledger/anoncreds-nodejs": "catalog:", "@hyperledger/indy-vdr-nodejs": "catalog:", "@openwallet-foundation/askar-nodejs": "catalog:", @@ -28,6 +27,7 @@ "@credo-ts/hedera": "workspace:*", "@credo-ts/indy-vdr": "workspace:*", "@credo-ts/node": "workspace:*", + "@hiero-did-sdk/client": "0.1.3", "@types/figlet": "^1.5.4", "@types/inquirer": "^8.2.6", "clear": "^0.1.0", diff --git a/package.json b/package.json index d8fc5cd9cb..76267152fd 100644 --- a/package.json +++ b/package.json @@ -55,10 +55,5 @@ }, "engines": { "node": ">=20" - }, - "pnpm": { - "patchedDependencies": { - "@2060.io/ffi-napi@4.0.9": "patches/@2060.io__ffi-napi@4.0.9.patch" - } } } diff --git a/packages/cheqd/package.json b/packages/cheqd/package.json index 04b3852bbc..c6140b8b62 100644 --- a/packages/cheqd/package.json +++ b/packages/cheqd/package.json @@ -24,7 +24,7 @@ "test": "jest" }, "dependencies": { - "@cheqd/sdk": "5.2.1", + "@cheqd/sdk": "^5.2.1", "@cheqd/ts-proto": "~2.4.1", "@cosmjs/crypto": "~0.30.1", "@cosmjs/proto-signing": "~0.30.1", diff --git a/packages/hedera/tests/integration/utils/hederaModule.ts b/packages/hedera/tests/integration/utils/hederaModule.ts index 0b241bf5ee..833c6bb2ea 100644 --- a/packages/hedera/tests/integration/utils/hederaModule.ts +++ b/packages/hedera/tests/integration/utils/hederaModule.ts @@ -9,23 +9,28 @@ import { HederaModuleConfigOptions, } from '@credo-ts/hedera' import { agentDependencies } from '@credo-ts/node' +import { HederaNetwork } from '@hiero-did-sdk/client' import { anoncreds } from '@hyperledger/anoncreds-nodejs' import { askar } from '@openwallet-foundation/askar-nodejs' import { InMemoryTailsFileService } from '../../../../anoncreds/tests/InMemoryTailsFileService' -export const getHederaModuleConfig = (props: { operatorId?: string; operatorKey?: string }) => { - const operatorId = props.operatorId ?? process.env.HEDERA_OPERATOR_ID ?? '' - const operatorKey = props.operatorKey ?? process.env.HEDERA_OPERATOR_KEY ?? '' - const config: HederaModuleConfigOptions = { +export const getHederaModuleConfig = (props: { + network?: HederaNetwork + operatorId?: string + operatorKey?: string +}): HederaModuleConfigOptions => { + return { networks: [ { - network: 'testnet', - operatorId, - operatorKey, + network: props.network ?? (process.env.HEDERA_NETWORK as HederaNetwork) ?? 'testnet', + operatorId: props.operatorId ?? process.env.HEDERA_OPERATOR_ID ?? '0.0.5489553', + operatorKey: + props.operatorKey ?? + process.env.HEDERA_OPERATOR_KEY ?? + '302e020100300506032b6570042204209f54b75b6238ced43e41b1463999cb40bf2f7dd2c9fd4fd3ef780027c016a138', }, ], } - return config } export const getHederaAgent = (props: { diff --git a/patches/@2060.io__ffi-napi@4.0.9.patch b/patches/@2060.io__ffi-napi@4.0.9.patch deleted file mode 100644 index 2e3cb8248d..0000000000 --- a/patches/@2060.io__ffi-napi@4.0.9.patch +++ /dev/null @@ -1,14 +0,0 @@ -diff --git a/deps/libffi/libffi.gyp b/deps/libffi/libffi.gyp -index d02bef739c0cfb9c1bbb0a666ab3363fd34c5041..5d49572898681902fca1079b7b25d02f15f7617a 100644 ---- a/deps/libffi/libffi.gyp -+++ b/deps/libffi/libffi.gyp -@@ -74,8 +74,7 @@ - '<(INTERMEDIATE_DIR)/<(RULE_INPUT_ROOT).asm', - ], - 'action': [ -- 'call', -- 'preprocess_asm.cmd', -+ '../../../deps/libffi/preprocess_asm.cmd', - 'include', - 'config/<(OS)/<(target_arch)', - '<(RULE_INPUT_PATH)', diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7bda0bfed4..748523b3d3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -85,11 +85,6 @@ catalogs: overrides: undici: ^6.20.1 -patchedDependencies: - '@2060.io/ffi-napi@4.0.9': - hash: 9d391c085b8342fd39feab6d234b27742c9c1d160c2f8b63840cc95445fa44aa - path: patches/@2060.io__ffi-napi@4.0.9.patch - importers: .: @@ -172,9 +167,6 @@ importers: demo: dependencies: - '@hiero-did-sdk/client': - specifier: 0.1.3 - version: 0.1.3(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) '@hyperledger/anoncreds-nodejs': specifier: 'catalog:' version: 0.3.1 @@ -212,6 +204,9 @@ importers: '@credo-ts/node': specifier: workspace:* version: link:../packages/node + '@hiero-did-sdk/client': + specifier: 0.1.3 + version: 0.1.3(bn.js@5.2.1)(react-native@0.79.4(@babel/core@7.27.7)(@react-native-community/cli@10.2.7(@babel/core@7.27.7))(react@18.3.1)) '@types/figlet': specifier: ^1.5.4 version: 1.5.8 @@ -409,7 +404,7 @@ importers: packages/cheqd: dependencies: '@cheqd/sdk': - specifier: 5.2.1 + specifier: ^5.2.1 version: 5.2.1 '@cheqd/ts-proto': specifier: ~2.4.1 @@ -786,7 +781,7 @@ importers: dependencies: '@2060.io/ffi-napi': specifier: ^4.0.9 - version: 4.0.9(patch_hash=9d391c085b8342fd39feab6d234b27742c9c1d160c2f8b63840cc95445fa44aa) + version: 4.0.9 '@2060.io/ref-napi': specifier: ^3.0.6 version: 3.0.6 @@ -8221,7 +8216,7 @@ packages: snapshots: - '@2060.io/ffi-napi@4.0.9(patch_hash=9d391c085b8342fd39feab6d234b27742c9c1d160c2f8b63840cc95445fa44aa)': + '@2060.io/ffi-napi@4.0.9': dependencies: '@2060.io/ref-napi': 3.0.6 debug: 4.4.0 @@ -10641,7 +10636,7 @@ snapshots: '@hyperledger/anoncreds-nodejs@0.3.1': dependencies: - '@2060.io/ffi-napi': 4.0.9(patch_hash=9d391c085b8342fd39feab6d234b27742c9c1d160c2f8b63840cc95445fa44aa) + '@2060.io/ffi-napi': 4.0.9 '@2060.io/ref-napi': 3.0.6 '@hyperledger/anoncreds-shared': 0.3.1 ref-array-di: 1.2.2 @@ -10655,7 +10650,7 @@ snapshots: '@hyperledger/indy-vdr-nodejs@0.2.2': dependencies: - '@2060.io/ffi-napi': 4.0.9(patch_hash=9d391c085b8342fd39feab6d234b27742c9c1d160c2f8b63840cc95445fa44aa) + '@2060.io/ffi-napi': 4.0.9 '@2060.io/ref-napi': 3.0.6 '@hyperledger/indy-vdr-shared': 0.2.2 '@mapbox/node-pre-gyp': 1.0.11 @@ -11043,7 +11038,7 @@ snapshots: '@openwallet-foundation/askar-nodejs@0.3.2': dependencies: - '@2060.io/ffi-napi': 4.0.9(patch_hash=9d391c085b8342fd39feab6d234b27742c9c1d160c2f8b63840cc95445fa44aa) + '@2060.io/ffi-napi': 4.0.9 '@2060.io/ref-napi': 3.0.6 '@openwallet-foundation/askar-shared': 0.3.2 ref-array-di: 1.2.2 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index d16ac8840a..944c8e8d31 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -44,10 +44,5 @@ onlyBuiltDependencies: - "@hyperledger/anoncreds-nodejs" - "@hyperledger/indy-vdr-nodejs" - "@openwallet-foundation/askar-nodejs" - - "@hyperledger/aries-askar-nodejs" - - "es5-ext" - - "esbuild" - - "protobufjs" - "zstd-napi" - "cbor-extract" - - "secp256k1"