diff --git a/demo/package.json b/demo/package.json index 9a686b3e75..4cb9fe150f 100644 --- a/demo/package.json +++ b/demo/package.json @@ -14,7 +14,7 @@ "refresh": "rm -rf ./node_modules ./yarn.lock && yarn" }, "dependencies": { - "@hyperledger/indy-vdr-nodejs": "^0.2.0-dev.5", + "@hyperledger/indy-vdr-nodejs": "^0.2.0-dev.6", "@hyperledger/anoncreds-nodejs": "^0.2.0-dev.5", "@hyperledger/aries-askar-nodejs": "^0.2.0-dev.5", "inquirer": "^8.2.5" diff --git a/packages/anoncreds/src/models/registry.ts b/packages/anoncreds/src/models/registry.ts index 0b9f059048..883fd859fe 100644 --- a/packages/anoncreds/src/models/registry.ts +++ b/packages/anoncreds/src/models/registry.ts @@ -39,7 +39,5 @@ export interface AnonCredsRevocationStatusList { revRegDefId: string revocationList: Array currentAccumulator: string - issued?: Array - revoked?: Array timestamp: number } diff --git a/packages/anoncreds/src/utils/indyIdentifiers.ts b/packages/anoncreds/src/utils/indyIdentifiers.ts index 1b23711430..51c36a53b6 100644 --- a/packages/anoncreds/src/utils/indyIdentifiers.ts +++ b/packages/anoncreds/src/utils/indyIdentifiers.ts @@ -50,15 +50,6 @@ export function getUnqualifiedRevocationRegistryDefinitionId( return `${unqualifiedDid}:4:${unqualifiedDid}:3:CL:${schemaSeqNo}:${credentialDefinitionTag}:CL_ACCUM:${revocationRegistryTag}` } -export function getUnqualifiedRevocationRegistryEntryId( - unqualifiedDid: string, - schemaSeqNo: string | number, - credentialDefinitionTag: string, - revocationRegistryTag: string -) { - return `${unqualifiedDid}:5:${unqualifiedDid}:3:CL:${schemaSeqNo}:${credentialDefinitionTag}:CL_ACCUM:${revocationRegistryTag}` -} - export function isUnqualifiedCredentialDefinitionId(credentialDefinitionId: string) { return unqualifiedCredentialDefinitionIdRegex.test(credentialDefinitionId) } diff --git a/packages/anoncreds/tests/InMemoryAnonCredsRegistry.ts b/packages/anoncreds/tests/InMemoryAnonCredsRegistry.ts index 0163a3a80b..5cf01c058e 100644 --- a/packages/anoncreds/tests/InMemoryAnonCredsRegistry.ts +++ b/packages/anoncreds/tests/InMemoryAnonCredsRegistry.ts @@ -25,7 +25,7 @@ import BigNumber from 'bn.js' import { getDidIndyCredentialDefinitionId, - getDidIndyRevocationRegistryId, + getDidIndyRevocationRegistryDefinitionId, getDidIndySchemaId, } from '../../indy-sdk/src/anoncreds/utils/identifiers' import { @@ -249,7 +249,7 @@ export class InMemoryAnonCredsRegistry implements AnonCredsRegistry { const { namespace, namespaceIdentifier } = parseIndyDid(options.revocationRegistryDefinition.issuerId) const legacyIssuerId = namespaceIdentifier - const didIndyRevocationRegistryDefinitionId = getDidIndyRevocationRegistryId( + const didIndyRevocationRegistryDefinitionId = getDidIndyRevocationRegistryDefinitionId( namespace, namespaceIdentifier, indyLedgerSeqNo, diff --git a/packages/indy-sdk/src/anoncreds/utils/__tests__/identifiers.test.ts b/packages/indy-sdk/src/anoncreds/utils/__tests__/identifiers.test.ts index 9b9a54ba83..546579330b 100644 --- a/packages/indy-sdk/src/anoncreds/utils/__tests__/identifiers.test.ts +++ b/packages/indy-sdk/src/anoncreds/utils/__tests__/identifiers.test.ts @@ -1,6 +1,6 @@ import { getDidIndyCredentialDefinitionId, - getDidIndyRevocationRegistryId, + getDidIndyRevocationRegistryDefinitionId, getDidIndySchemaId, indySdkAnonCredsRegistryIdentifierRegex, } from '../identifiers' @@ -72,7 +72,7 @@ describe('identifiers', () => { const credentialDefinitionTag = 'someTag' const tag = 'anotherTag' - expect(getDidIndyRevocationRegistryId(namespace, did, seqNo, credentialDefinitionTag, tag)).toEqual( + expect(getDidIndyRevocationRegistryDefinitionId(namespace, did, seqNo, credentialDefinitionTag, tag)).toEqual( 'did:indy:sovrin:test:12345/anoncreds/v0/REV_REG_DEF/420/someTag/anotherTag' ) }) diff --git a/packages/indy-sdk/src/anoncreds/utils/identifiers.ts b/packages/indy-sdk/src/anoncreds/utils/identifiers.ts index 4cedb11ff4..ccc7433e34 100644 --- a/packages/indy-sdk/src/anoncreds/utils/identifiers.ts +++ b/packages/indy-sdk/src/anoncreds/utils/identifiers.ts @@ -46,18 +46,18 @@ export function getDidIndySchemaId(namespace: string, unqualifiedDid: string, na export function getDidIndyCredentialDefinitionId( namespace: string, unqualifiedDid: string, - seqNo: string | number, + schemaSeqNo: string | number, tag: string ) { - return `did:indy:${namespace}:${unqualifiedDid}/anoncreds/v0/CLAIM_DEF/${seqNo}/${tag}` + return `did:indy:${namespace}:${unqualifiedDid}/anoncreds/v0/CLAIM_DEF/${schemaSeqNo}/${tag}` } -export function getDidIndyRevocationRegistryId( +export function getDidIndyRevocationRegistryDefinitionId( namespace: string, unqualifiedDid: string, - seqNo: string | number, + schemaSeqNo: string | number, credentialDefinitionTag: string, revocationRegistryTag: string ) { - return `did:indy:${namespace}:${unqualifiedDid}/anoncreds/v0/REV_REG_DEF/${seqNo}/${credentialDefinitionTag}/${revocationRegistryTag}` + return `did:indy:${namespace}:${unqualifiedDid}/anoncreds/v0/REV_REG_DEF/${schemaSeqNo}/${credentialDefinitionTag}/${revocationRegistryTag}` } diff --git a/packages/indy-sdk/src/anoncreds/utils/transform.ts b/packages/indy-sdk/src/anoncreds/utils/transform.ts index 4ef12dc5c1..73b5441c93 100644 --- a/packages/indy-sdk/src/anoncreds/utils/transform.ts +++ b/packages/indy-sdk/src/anoncreds/utils/transform.ts @@ -103,8 +103,6 @@ export function anonCredsRevocationStatusListFromIndySdk( return { issuerId: revocationRegistryDefinition.issuerId, currentAccumulator: delta.value.accum, - revoked: delta.value.revoked, - issued: delta.value.issued, revRegDefId: revocationRegistryDefinitionId, revocationList, timestamp, diff --git a/packages/indy-vdr/package.json b/packages/indy-vdr/package.json index e49286f040..d558c83dd0 100644 --- a/packages/indy-vdr/package.json +++ b/packages/indy-vdr/package.json @@ -28,8 +28,8 @@ "@aries-framework/core": "0.4.2" }, "devDependencies": { - "@hyperledger/indy-vdr-nodejs": "^0.2.0-dev.5", - "@hyperledger/indy-vdr-shared": "^0.2.0-dev.5", + "@hyperledger/indy-vdr-nodejs": "^0.2.0-dev.6", + "@hyperledger/indy-vdr-shared": "^0.2.0-dev.6", "@stablelib/ed25519": "^1.0.2", "@types/ref-array-di": "^1.2.6", "@types/ref-struct-di": "^1.1.10", @@ -38,6 +38,6 @@ "typescript": "~4.9.5" }, "peerDependencies": { - "@hyperledger/indy-vdr-shared": "^0.2.0-dev.5" + "@hyperledger/indy-vdr-shared": "^0.2.0-dev.6" } } diff --git a/packages/indy-vdr/src/anoncreds/IndyVdrAnonCredsRegistry.ts b/packages/indy-vdr/src/anoncreds/IndyVdrAnonCredsRegistry.ts index abba4aafd1..c713ec8ff3 100644 --- a/packages/indy-vdr/src/anoncreds/IndyVdrAnonCredsRegistry.ts +++ b/packages/indy-vdr/src/anoncreds/IndyVdrAnonCredsRegistry.ts @@ -1,4 +1,6 @@ -import { +/* eslint-disable no-console */ +import type { RevocationRegistryDelta } from './utils/transform' +import type { AnonCredsRegistry, GetCredentialDefinitionReturn, GetSchemaReturn, @@ -28,8 +30,6 @@ import { RegisterRevocationStatusListReturnStateFailed, RegisterRevocationStatusListReturnStateWait, RegisterRevocationStatusListReturnStateAction, - getUnqualifiedRevocationRegistryEntryId, - unqualifiedIndyDidRegex, } from '@aries-framework/anoncreds' import type { AgentContext } from '@aries-framework/core' import type { SchemaResponse } from '@hyperledger/indy-vdr-shared' @@ -67,7 +67,7 @@ import { getDidIndyRevocationRegistryDefinitionId, getDidIndyRevocationRegistryEntryId, } from './utils/identifiers' -import { anonCredsRevocationStatusListFromIndyVdr } from './utils/transform' +import { indyVdrCreateLatestRevocationDelta, anonCredsRevocationStatusListFromIndyVdr } from './utils/transform' export class IndyVdrAnonCredsRegistry implements AnonCredsRegistry { public readonly methodName = 'indy' @@ -291,7 +291,7 @@ export class IndyVdrAnonCredsRegistry implements AnonCredsRegistry { : schema.schema.schemaId return { - credentialDefinitionId: credentialDefinitionId, + credentialDefinitionId, credentialDefinition: { issuerId: did, schemaId, @@ -395,8 +395,8 @@ export class IndyVdrAnonCredsRegistry implements AnonCredsRegistry { id: legacyCredentialDefinitionId, schemaId: schemaSeqNo.toString(), type: 'CL', - tag: tag, - value: value, + tag, + value, }, }) @@ -594,7 +594,6 @@ export class IndyVdrAnonCredsRegistry implements AnonCredsRegistry { let writeRequest: CustomRequest let didIndyRevocationRegistryDefinitionId: string - let schemaSeqNo: number // TODO: this will bypass caching if done on a higher level. const { credentialDefinition, resolutionMetadata } = await this.getCredentialDefinition( @@ -615,6 +614,24 @@ export class IndyVdrAnonCredsRegistry implements AnonCredsRegistry { } } + const { schemaMetadata } = await this.getSchema(agentContext, credentialDefinition.schemaId) + + if (!schemaMetadata?.indyLedgerSeqNo || typeof schemaMetadata.indyLedgerSeqNo !== 'number') { + return { + registrationMetadata: {}, + revocationRegistryDefinitionMetadata: { + didIndyNamespace: pool.indyNamespace, + }, + revocationRegistryDefinitionState: { + revocationRegistryDefinition, + state: 'failed', + reason: `error resolving schema with id ${credentialDefinition.schemaId}: ${resolutionMetadata.error} ${resolutionMetadata.message}`, + }, + } + } + + const schemaSeqNo = schemaMetadata.indyLedgerSeqNo + const { endorsedTransaction, endorserDid, endorserMode } = options if (endorsedTransaction) { agentContext.config.logger.debug( @@ -622,9 +639,6 @@ export class IndyVdrAnonCredsRegistry implements AnonCredsRegistry { revocationRegistryDefinition ) writeRequest = new CustomRequest({ customRequest: endorsedTransaction }) - const operation = JSON.parse(endorsedTransaction)?.operation - // extract the seqNo from the endorsed transaction, which is contained in the ref field of the operation - schemaSeqNo = Number(operation?.ref) didIndyRevocationRegistryDefinitionId = getDidIndyRevocationRegistryDefinitionId( namespace, namespaceIdentifier, @@ -633,23 +647,6 @@ export class IndyVdrAnonCredsRegistry implements AnonCredsRegistry { revocationRegistryDefinition.tag ) } else { - const { schemaMetadata } = await this.getSchema(agentContext, credentialDefinition.schemaId) - - if (!schemaMetadata?.indyLedgerSeqNo || typeof schemaMetadata.indyLedgerSeqNo !== 'number') { - return { - registrationMetadata: {}, - revocationRegistryDefinitionMetadata: { - didIndyNamespace: pool.indyNamespace, - }, - revocationRegistryDefinitionState: { - revocationRegistryDefinition, - state: 'failed', - reason: `error resolving schema with id ${credentialDefinition.schemaId}: ${resolutionMetadata.error} ${resolutionMetadata.message}`, - }, - } - } - schemaSeqNo = schemaMetadata.indyLedgerSeqNo - const legacyRevocationRegistryDefinitionId = getUnqualifiedRevocationRegistryDefinitionId( namespaceIdentifier, schemaSeqNo, @@ -665,20 +662,23 @@ export class IndyVdrAnonCredsRegistry implements AnonCredsRegistry { revocationRegistryDefinition.tag ) + const legacyCredentialDefinitionId = getUnqualifiedCredentialDefinitionId( + namespaceIdentifier, + schemaSeqNo, + credentialDefinition.tag + ) + const revocationRegistryDefinitionRequest = new RevocationRegistryDefinitionRequest({ submitterDid: namespaceIdentifier, revocationRegistryDefinitionV1: { id: legacyRevocationRegistryDefinitionId, ver: '1.0', - credDefId: revocationRegistryDefinition.credDefId, + credDefId: legacyCredentialDefinitionId, tag: revocationRegistryDefinition.tag, revocDefType: revocationRegistryDefinition.revocDefType, value: { - tailsHash: revocationRegistryDefinition.value.tailsHash, - maxCredNum: revocationRegistryDefinition.value.maxCredNum, - publicKeys: revocationRegistryDefinition.value.publicKeys, issuanceType: 'ISSUANCE_BY_DEFAULT', - tailsLocation: revocationRegistryDefinition.value.tailsLocation, + ...revocationRegistryDefinition.value, }, }, }) @@ -754,42 +754,33 @@ export class IndyVdrAnonCredsRegistry implements AnonCredsRegistry { public async getRevocationStatusList( agentContext: AgentContext, - revocationRegistryId: string, + revocationRegistryDefinitionId: string, timestamp: number ): Promise { try { - const indySdkPoolService = agentContext.dependencyManager.resolve(IndyVdrPoolService) - - const { did, namespaceIdentifier, schemaSeqNo, credentialDefinitionTag, revocationRegistryTag } = - parseIndyRevocationRegistryId(revocationRegistryId) - const { pool } = await indySdkPoolService.getPoolForDid(agentContext, did) - - agentContext.config.logger.debug( - `Using ledger '${pool.indyNamespace}' to retrieve revocation registry deltas with revocation registry definition id '${revocationRegistryId}' until ${timestamp}` - ) + const indyVdrPoolService = agentContext.dependencyManager.resolve(IndyVdrPoolService) - const legacyRevocationRegistryId = getUnqualifiedRevocationRegistryDefinitionId( - namespaceIdentifier, - schemaSeqNo, - credentialDefinitionTag, - revocationRegistryTag - ) - const request = new GetRevocationRegistryDeltaRequest({ - revocationRegistryId: legacyRevocationRegistryId, - toTs: timestamp, - }) + const { did } = parseIndyRevocationRegistryId(revocationRegistryDefinitionId) + const { pool } = await indyVdrPoolService.getPoolForDid(agentContext, did) - agentContext.config.logger.trace( - `Submitting get revocation registry delta request for revocation registry '${revocationRegistryId}' to ledger` + const revocationDelta = await this.fetchIndyRevocationDelta( + agentContext, + revocationRegistryDefinitionId, + timestamp ) - const response = await pool.submitRequest(request) - agentContext.config.logger.debug( - `Got revocation registry deltas '${revocationRegistryId}' until timestamp ${timestamp} from ledger` - ) + if (!revocationDelta) { + return { + resolutionMetadata: { + error: 'notFound', + message: `Error retrieving revocation registry delta '${revocationRegistryDefinitionId}' from ledger, potentially revocation interval ends before revocation registry creation`, + }, + revocationStatusListMetadata: {}, + } + } const { revocationRegistryDefinition, resolutionMetadata, revocationRegistryDefinitionMetadata } = - await this.getRevocationRegistryDefinition(agentContext, revocationRegistryId) + await this.getRevocationRegistryDefinition(agentContext, revocationRegistryDefinitionId) if ( !revocationRegistryDefinition || @@ -798,7 +789,7 @@ export class IndyVdrAnonCredsRegistry implements AnonCredsRegistry { ) { return { resolutionMetadata: { - error: `error resolving revocation registry definition with id ${revocationRegistryId}: ${resolutionMetadata.error} ${resolutionMetadata.message}`, + error: `error resolving revocation registry definition with id ${revocationRegistryDefinitionId}: ${resolutionMetadata.error} ${resolutionMetadata.message}`, }, revocationStatusListMetadata: { didIndyNamespace: pool.indyNamespace, @@ -808,29 +799,12 @@ export class IndyVdrAnonCredsRegistry implements AnonCredsRegistry { const isIssuanceByDefault = revocationRegistryDefinitionMetadata.issuanceType === 'ISSUANCE_BY_DEFAULT' - if (!response.result.data) { - return { - resolutionMetadata: { - error: 'notFound', - message: `Error retrieving revocation registry delta '${revocationRegistryId}' from ledger, potentially revocation interval ends before revocation registry creation`, - }, - revocationStatusListMetadata: {}, - } - } - - const revocationRegistryDelta = { - accum: response.result.data.value.accum_to.value.accum, - issued: response.result.data.value.issued, - revoked: response.result.data.value.revoked, - } - return { resolutionMetadata: {}, revocationStatusList: anonCredsRevocationStatusListFromIndyVdr( - revocationRegistryId, + revocationRegistryDefinitionId, revocationRegistryDefinition, - revocationRegistryDelta, - response.result.data.value.accum_to.txnTime, + revocationDelta, isIssuanceByDefault ), revocationStatusListMetadata: { @@ -839,17 +813,17 @@ export class IndyVdrAnonCredsRegistry implements AnonCredsRegistry { } } catch (error) { agentContext.config.logger.error( - `Error retrieving revocation registry delta '${revocationRegistryId}' from ledger, potentially revocation interval ends before revocation registry creation?"`, + `Error retrieving revocation registry delta '${revocationRegistryDefinitionId}' from ledger, potentially revocation interval ends before revocation registry creation?"`, { error, - revocationRegistryId: revocationRegistryId, + revocationRegistryId: revocationRegistryDefinitionId, } ) return { resolutionMetadata: { error: 'notFound', - message: `Error retrieving revocation registry delta '${revocationRegistryId}' from ledger, potentially revocation interval ends before revocation registry creation: ${error.message}`, + message: `Error retrieving revocation registry delta '${revocationRegistryDefinitionId}' from ledger, potentially revocation interval ends before revocation registry creation: ${error.message}`, }, revocationStatusListMetadata: {}, } @@ -859,10 +833,12 @@ export class IndyVdrAnonCredsRegistry implements AnonCredsRegistry { public async registerRevocationStatusList( agentContext: AgentContext, { options, revocationStatusList }: IndyVdrRegisterRevocationStatusList - ): Promise { + ): Promise { try { // This will throw an error if trying to register a credential definition with a legacy indy identifier. We only support did:indy // identifiers for registering, that will allow us to extract the namespace and means all stored records will use did:indy identifiers. + + const { endorsedTransaction, endorserDid, endorserMode } = options const { namespaceIdentifier, namespace } = parseIndyDid(revocationStatusList.issuerId) const indyVdrPoolService = agentContext.dependencyManager.resolve(IndyVdrPoolService) const pool = indyVdrPoolService.getPoolForNamespace(namespace) @@ -908,21 +884,23 @@ export class IndyVdrAnonCredsRegistry implements AnonCredsRegistry { } } - const { schemaMetadata } = await this.getSchema(agentContext, credentialDefinition.schemaId) + const { schemaMetadata, resolutionMetadata } = await this.getSchema(agentContext, credentialDefinition.schemaId) if (!schemaMetadata?.indyLedgerSeqNo || typeof schemaMetadata.indyLedgerSeqNo !== 'number') { return { registrationMetadata: {}, - revocationStatusListMetadata: {}, + revocationStatusListMetadata: { + didIndyNamespace: pool.indyNamespace, + }, revocationStatusListState: { revocationStatusList, state: 'failed', - reason: `Unable to resolve schema '${credentialDefinition.schemaId}'`, + reason: `error resolving schema with id ${credentialDefinition.schemaId}: ${resolutionMetadata.error} ${resolutionMetadata.message}`, }, } } + const schemaSeqNo = schemaMetadata.indyLedgerSeqNo - const schemaSeqNo = Number(schemaMetadata.indyLegderSeqNo) const didIndyRevocationRegistryEntryId = getDidIndyRevocationRegistryEntryId( namespace, namespaceIdentifier, @@ -931,29 +909,41 @@ export class IndyVdrAnonCredsRegistry implements AnonCredsRegistry { revocationRegistryDefinition.tag ) - const { endorsedTransaction, endorserDid, endorserMode } = options + const legacyRevocationRegistryDefinitionId = getUnqualifiedRevocationRegistryDefinitionId( + namespaceIdentifier, + schemaSeqNo, + credentialDefinition.tag, + revocationRegistryDefinition.tag + ) + if (endorsedTransaction) { agentContext.config.logger.debug( `Preparing endorsed tx '${endorsedTransaction}' for submission on ledger '${namespace}' with did '${revocationStatusList.issuerId}'`, revocationStatusList ) + writeRequest = new CustomRequest({ customRequest: endorsedTransaction }) - // extract the seqNo from the endorsed transaction, which is contained in the ref field of the operation } else { + const previousDelta = await this.fetchIndyRevocationDelta( + agentContext, + legacyRevocationRegistryDefinitionId, + revocationStatusList.timestamp + ) + + const revocationRegistryDefinitionEntryValue = indyVdrCreateLatestRevocationDelta( + revocationStatusList.currentAccumulator, + revocationStatusList.revocationList, + previousDelta ?? undefined + ) + const revocationRegistryDefinitionRequest = new RevocationRegistryEntryRequest({ submitterDid: namespaceIdentifier, revocationRegistryEntry: { ver: '1.0', - value: { - accum: revocationStatusList.currentAccumulator, - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-expect-error - issued: revocationStatusList.issued ?? [], - revoked: revocationStatusList.revoked ?? [], - }, + value: revocationRegistryDefinitionEntryValue, }, revocationRegistryDefinitionType: 'CL_ACCUM', - revocationRegistryDefinitionId: revocationStatusList.revRegDefId, + revocationRegistryDefinitionId: legacyRevocationRegistryDefinitionId, }) const submitterKey = await verificationKeyForIndyDid(agentContext, revocationStatusList.issuerId) @@ -972,6 +962,7 @@ export class IndyVdrAnonCredsRegistry implements AnonCredsRegistry { action: 'endorseIndyTransaction', revocationStatusList, timestamp: revocationStatusList.timestamp.toString(), + revocationStatusListRequest: writeRequest.body, }, registrationMetadata: {}, revocationStatusListMetadata: {}, @@ -1004,7 +995,7 @@ export class IndyVdrAnonCredsRegistry implements AnonCredsRegistry { } } catch (error) { agentContext.config.logger.error( - `Error registering revocation status list for revocation status list '${getDidIndyRevocationRegistryEntryId}'`, + `Error registering revocation status list for revocation registry definition '${revocationStatusList.revRegDefId}}'`, { error, did: revocationStatusList.issuerId, @@ -1056,6 +1047,59 @@ export class IndyVdrAnonCredsRegistry implements AnonCredsRegistry { indyNamespace: pool.indyNamespace, } } + + private async fetchIndyRevocationDelta( + agentContext: AgentContext, + revocationRegistryDefinitionId: string, + toTs: number + ): Promise { + const indyVdrPoolService = agentContext.dependencyManager.resolve(IndyVdrPoolService) + + const { did, namespaceIdentifier, schemaSeqNo, credentialDefinitionTag, revocationRegistryTag } = + parseIndyRevocationRegistryId(revocationRegistryDefinitionId) + + const { pool } = await indyVdrPoolService.getPoolForDid(agentContext, did) + + agentContext.config.logger.debug( + `Using ledger '${pool.indyNamespace}' to retrieve revocation registry deltas with revocation registry definition id '${revocationRegistryDefinitionId}' until ${toTs}` + ) + + const legacyRevocationRegistryDefinitionId = getUnqualifiedRevocationRegistryDefinitionId( + namespaceIdentifier, + schemaSeqNo, + credentialDefinitionTag, + revocationRegistryTag + ) + + const deltaRequest = new GetRevocationRegistryDeltaRequest({ + toTs, + submitterDid: did, + revocationRegistryId: legacyRevocationRegistryDefinitionId, + }) + + agentContext.config.logger.trace(`Submitting get transaction request to ledger '${pool.indyNamespace}'`) + const response = await pool.submitRequest(deltaRequest) + const { + result: { data, type, txnTime }, + } = response + + console.log(JSON.stringify(response)) + + // Indicating there are no deltas + if (type !== '117' || data === null || !txnTime) { + agentContext.config.logger.warn( + `Could not get any deltas from ledger for revocation registry defintion '${revocationRegistryDefinitionId}' from ledger '${pool.indyNamespace}'` + ) + return null + } + + return { + revoked: data.value.revoked, + issued: data.value.issued, + accum: data.value.accum_to.value.accum, + txnTime, + } + } } interface SchemaType { diff --git a/packages/indy-vdr/src/anoncreds/utils/transform.ts b/packages/indy-vdr/src/anoncreds/utils/transform.ts index fb9df9ce33..bf126561d7 100644 --- a/packages/indy-vdr/src/anoncreds/utils/transform.ts +++ b/packages/indy-vdr/src/anoncreds/utils/transform.ts @@ -1,32 +1,37 @@ import type { AnonCredsRevocationStatusList, AnonCredsRevocationRegistryDefinition } from '@aries-framework/anoncreds' -type RevocRegDelta = { +export type RevocationRegistryDelta = { accum: string issued: number[] revoked: number[] + txnTime: number +} + +enum RevocationState { + Active, + Revoked, } export function anonCredsRevocationStatusListFromIndyVdr( revocationRegistryDefinitionId: string, revocationRegistryDefinition: AnonCredsRevocationRegistryDefinition, - delta: RevocRegDelta, - timestamp: number, + delta: RevocationRegistryDelta, isIssuanceByDefault: boolean ): AnonCredsRevocationStatusList { // 0 means unrevoked, 1 means revoked - const defaultState = isIssuanceByDefault ? 0 : 1 + const defaultState = isIssuanceByDefault ? RevocationState.Active : RevocationState.Revoked // Fill with default value const revocationList = new Array(revocationRegistryDefinition.value.maxCredNum).fill(defaultState) // Set all `issuer` indexes to 0 (not revoked) for (const issued of delta.issued ?? []) { - revocationList[issued] = 0 + revocationList[issued] = RevocationState.Active } // Set all `revoked` indexes to 1 (revoked) for (const revoked of delta.revoked ?? []) { - revocationList[revoked] = 1 + revocationList[revoked] = RevocationState.Revoked } return { @@ -34,8 +39,59 @@ export function anonCredsRevocationStatusListFromIndyVdr( currentAccumulator: delta.accum, revRegDefId: revocationRegistryDefinitionId, revocationList, - revoked: delta.revoked, - issued: delta.issued, - timestamp, + timestamp: delta.txnTime, + } +} + +/** + * + * Transforms the previous deltas and the full revocation status list into the latest delta + * + * ## Example + * + * input: + * + * revocationStatusList: [0, 1, 1, 1, 0, 0, 0, 1, 1, 0] + * previousDelta: + * - issued: [1, 2, 5, 8, 9] + * - revoked: [0, 3, 4, 6, 7] + * + * output: + * - issued: [5, 9] + * - revoked: [3, 7] + * + */ +export function indyVdrCreateLatestRevocationDelta( + currentAccumulator: string, + revocationStatusList: Array, + previousDelta?: RevocationRegistryDelta +) { + const issued: Array = [] + const revoked: Array = [] + + if (previousDelta) { + for (const issuedIdx of previousDelta.issued) { + if (revocationStatusList[issuedIdx] !== RevocationState.Active) { + issued.push(issuedIdx) + } + } + + for (const revokedIdx of previousDelta.revoked) { + if (revocationStatusList[revokedIdx] !== RevocationState.Revoked) { + revoked.push(revokedIdx) + } + } + } else { + revocationStatusList.forEach((revocationStatus, idx) => { + if (revocationStatus === RevocationState.Active) issued.push(idx) + if (revocationStatus === RevocationState.Revoked) revoked.push(idx) + }) + } + + return { + issued, + revoked, + accum: currentAccumulator, + prevAccum: previousDelta?.accum, } } diff --git a/packages/indy-vdr/tests/indy-vdr-anoncreds-registry.e2e.test.ts b/packages/indy-vdr/tests/indy-vdr-anoncreds-registry.e2e.test.ts index c98a807b91..e11f04ab41 100644 --- a/packages/indy-vdr/tests/indy-vdr-anoncreds-registry.e2e.test.ts +++ b/packages/indy-vdr/tests/indy-vdr-anoncreds-registry.e2e.test.ts @@ -1,7 +1,9 @@ +/* eslint-disable no-console */ +/* eslint-disable @typescript-eslint/no-non-null-assertion */ import type { IndyVdrDidCreateOptions, IndyVdrDidCreateResult } from '../src/dids/IndyVdrIndyDidRegistrar' import type { RevocationRegistryEntryResponse } from '@hyperledger/indy-vdr-shared' -import { parseIndyDid } from '@aries-framework/anoncreds' +import { getUnqualifiedRevocationRegistryDefinitionId, parseIndyDid } from '@aries-framework/anoncreds' import { Agent, DidsModule, TypedArrayEncoder } from '@aries-framework/core' import { indyVdr } from '@hyperledger/indy-vdr-nodejs' import { @@ -90,7 +92,7 @@ describe('IndyVdrAnonCredsRegistry', () => { await agent.wallet.delete() }) - test('register and resolve a schema and credential definition (internal, issuerDid != endorserDid)', async () => { + xtest('register and resolve a schema and credential definition (internal, issuerDid != endorserDid)', async () => { const didCreateResult = (await endorser.dids.create({ method: 'indy', options: { @@ -424,7 +426,7 @@ describe('IndyVdrAnonCredsRegistry', () => { }) }) - test('register and resolve a schema and credential definition (internal, issuerDid == endorserDid)', async () => { + xtest('register and resolve a schema and credential definition (internal, issuerDid == endorserDid)', async () => { const dynamicVersion = `1.${Math.random() * 100}` const legacyIssuerId = 'DJKobikPAaYWAu9vfhEEo5' @@ -773,7 +775,6 @@ describe('IndyVdrAnonCredsRegistry', () => { const legacyIssuerId = namespaceIdentifier const didIndyIssuerId = agentDid - const signingKey = await verificationKeyForIndyDid(agent.context, didIndyIssuerId) const legacySchemaId = `${namespaceIdentifier}:2:test:${dynamicVersion}` const didIndySchemaId = `did:indy:pool:localtest:${namespaceIdentifier}/anoncreds/v0/SCHEMA/test/${dynamicVersion}` @@ -879,13 +880,13 @@ describe('IndyVdrAnonCredsRegistry', () => { const { credentialDefinitionState } = createCredDefTxResult if (credentialDefinitionState.state !== 'action' || credentialDefinitionState.action !== 'endorseIndyTransaction') - throw Error('unexpected schema state') + throw Error('unexpected credential definition state') const endorsedCredDefTx = await endorser.modules.indyVdr.endorseTransaction( credentialDefinitionState.credentialDefinitionRequest, endorserDid ) - const SubmitCredDefTxResult = await indyVdrAnonCredsRegistry.registerCredentialDefinition(agent.context, { + const submitCredDefTxResult = await indyVdrAnonCredsRegistry.registerCredentialDefinition(agent.context, { credentialDefinition: credentialDefinitionState.credentialDefinition, options: { endorserMode: 'external', @@ -893,7 +894,7 @@ describe('IndyVdrAnonCredsRegistry', () => { }, }) - expect(SubmitCredDefTxResult).toMatchObject({ + expect(submitCredDefTxResult).toMatchObject({ credentialDefinitionMetadata: {}, credentialDefinitionState: { credentialDefinition: { @@ -953,92 +954,90 @@ describe('IndyVdrAnonCredsRegistry', () => { resolutionMetadata: {}, }) - // We don't support creating a revocation registry using AFJ yet, so we directly use indy-vdr to create the revocation registry - const legacyRevocationRegistryId = `${namespaceIdentifier}:4:${namespaceIdentifier}:3:CL:${submitSchemaTxResult.schemaMetadata.indyLedgerSeqNo}:TAG:CL_ACCUM:tag` - const didIndyRevocationRegistryId = `did:indy:pool:localtest:${namespaceIdentifier}/anoncreds/v0/REV_REG_DEF/${submitSchemaTxResult.schemaMetadata.indyLedgerSeqNo}/TAG/tag` - const revocationRegistryRequest = new RevocationRegistryDefinitionRequest({ - submitterDid: namespaceIdentifier, - revocationRegistryDefinitionV1: { - credDefId: legacyCredentialDefinitionId, - id: legacyRevocationRegistryId, - revocDefType: 'CL_ACCUM', - tag: 'tag', - value: { - issuanceType: 'ISSUANCE_BY_DEFAULT', - maxCredNum: 100, - publicKeys: { - accumKey: { - z: '1 1812B206EB395D3AEBD4BBF53EBB0FFC3371D8BD6175316AB32C1C5F65452051 1 22A079D49C5351EFDC1410C81A1F6D8B2E3B79CFF20A30690C118FE2050F72CB 1 0FFC28B923A4654E261DB4CB5B9BABEFCB4DB189B20F52412B0CC9CCCBB8A3B2 1 1EE967C43EF1A3F487061D21B07076A26C126AAF7712E7B5CF5A53688DDD5CC0 1 009ED4D65879CA81DA8227D34CEA3B759B4627E1E2FFB273E9645CD4F3B10F19 1 1CF070212E1E213AEB472F56EDFC9D48009796C77B2D8CC16F2836E37B8715C2 1 04954F0B7B468781BAAE3291DD0E6FFA7F1AF66CAA4094D37B24363CC34606FB 1 115367CB755E9DB18781B3825CB1AEE2C334558B2C038E13DF57BB57CE1CF847 1 110D37EC05862EE2757A7DF39E814876FC97376FF8105D2D29619CB575537BDE 1 13C559A9563FCE083B3B39AE7E8FCA4099BEF3A4C8C6672E543D521F9DA88F96 1 137D87CC22ACC1B6B8C20EABE59F6ED456A58FE4CBEEFDFC4FA9B87E3EF32D17 1 00A2A9711737AAF0404F35AE502887AC6172B2B57D236BD4A40B45F659BFC696', - }, - }, - tailsHash: 'HLKresYcDSZYSKogq8wive4zyXNY84669MygftLFBG1i', - tailsLocation: - '/var/folders/l3/xy8jzyvj4p5_d9g1123rt4bw0000gn/T/HLKresYcDSZYSKogq8wive4zyXNY84669MygftLFBG1i', + const revocationRegistryDefinitionValue = { + maxCredNum: 100, + publicKeys: { + accumKey: { + z: '1 1812B206EB395D3AEBD4BBF53EBB0FFC3371D8BD6175316AB32C1C5F65452051 1 22A079D49C5351EFDC1410C81A1F6D8B2E3B79CFF20A30690C118FE2050F72CB 1 0FFC28B923A4654E261DB4CB5B9BABEFCB4DB189B20F52412B0CC9CCCBB8A3B2 1 1EE967C43EF1A3F487061D21B07076A26C126AAF7712E7B5CF5A53688DDD5CC0 1 009ED4D65879CA81DA8227D34CEA3B759B4627E1E2FFB273E9645CD4F3B10F19 1 1CF070212E1E213AEB472F56EDFC9D48009796C77B2D8CC16F2836E37B8715C2 1 04954F0B7B468781BAAE3291DD0E6FFA7F1AF66CAA4094D37B24363CC34606FB 1 115367CB755E9DB18781B3825CB1AEE2C334558B2C038E13DF57BB57CE1CF847 1 110D37EC05862EE2757A7DF39E814876FC97376FF8105D2D29619CB575537BDE 1 13C559A9563FCE083B3B39AE7E8FCA4099BEF3A4C8C6672E543D521F9DA88F96 1 137D87CC22ACC1B6B8C20EABE59F6ED456A58FE4CBEEFDFC4FA9B87E3EF32D17 1 00A2A9711737AAF0404F35AE502887AC6172B2B57D236BD4A40B45F659BFC696', }, - ver: '1.0', + }, + tailsHash: 'HLKresYcDSZYSKogq8wive4zyXNY84669MygftLFBG1i', + tailsLocation: '/var/folders/l3/xy8jzyvj4p5_d9g1123rt4bw0000gn/T/HLKresYcDSZYSKogq8wive4zyXNY84669MygftLFBG1i', + } + + const revRegDefResp = await indyVdrAnonCredsRegistry.registerRevocationRegistryDefinition(agent.context, { + revocationRegistryDefinition: { + tag: 'REV_TAG', + revocDefType: 'CL_ACCUM', + credDefId: didIndyCredentialDefinitionId, + issuerId: didIndyIssuerId, + value: revocationRegistryDefinitionValue, + }, + options: { + endorserMode: 'external', + endorserDid, }, }) - // After this call, the revocation registry should now be resolvable - const writeRequest = await pool.prepareWriteRequest( - agent.context, - revocationRegistryRequest, - signingKey, + if ( + revRegDefResp.revocationRegistryDefinitionState.state !== 'action' || + revRegDefResp.revocationRegistryDefinitionState.action !== 'endorseIndyTransaction' + ) { + throw Error('unexpected revocation registry definition state') + } + + const didIndyRevocationRegistryDefinitionId = + revRegDefResp.revocationRegistryDefinitionState.revocationRegistryDefinitionId + + const endorsedRevRegDefTx = await endorser.modules.indyVdr.endorseTransaction( + revRegDefResp.revocationRegistryDefinitionState.revocationRegistryDefinitionRequest, endorserDid ) - const endorsedRequest = await endorser.modules.indyVdr.endorseTransaction(writeRequest.body, endorserDid) - await pool.submitRequest(new CustomRequest({ customRequest: endorsedRequest })) - // Also create a revocation registry entry - const revocationEntryRequest = new RevocationRegistryEntryRequest({ - revocationRegistryDefinitionId: legacyRevocationRegistryId, - revocationRegistryDefinitionType: 'CL_ACCUM', - revocationRegistryEntry: { - ver: '1.0', - value: { - accum: '1', + const submitRevRegDefTxResult = await indyVdrAnonCredsRegistry.registerRevocationRegistryDefinition(agent.context, { + revocationRegistryDefinition: revRegDefResp.revocationRegistryDefinitionState.revocationRegistryDefinition, + options: { + endorserMode: 'external', + endorsedTransaction: endorsedRevRegDefTx, + }, + }) + + expect(submitRevRegDefTxResult).toMatchObject({ + revocationRegistryDefinitionMetadata: {}, + revocationRegistryDefinitionState: { + revocationRegistryDefinition: { + credDefId: didIndyCredentialDefinitionId, + issuerId: didIndyIssuerId, + tag: 'REV_TAG', + value: revocationRegistryDefinitionValue, }, + revocationRegistryDefinitionId: didIndyRevocationRegistryDefinitionId, + state: 'finished', }, - submitterDid: legacyIssuerId, + registrationMetadata: {}, }) - // After this call we can query the revocation registry entries (using timestamp now) + await new Promise((res) => setTimeout(res, 1000)) - const revocationEntryWriteRequest = await pool.prepareWriteRequest( - agent.context, - revocationEntryRequest, - signingKey, - endorserDid + const legacyRevocationRegistryDefinitionId = getUnqualifiedRevocationRegistryDefinitionId( + legacyIssuerId, + legacySchema.schemaMetadata.indyLedgerSeqNo as string, + 'TAG', + 'REV_TAG' ) - const endorsedRevEntryWriteRequest = await endorser.modules.indyVdr.endorseTransaction( - revocationEntryWriteRequest.body, - endorserDid - ) - const entryResponse = (await pool.submitRequest( - new CustomRequest({ customRequest: endorsedRevEntryWriteRequest }) - )) as RevocationRegistryEntryResponse const legacyRevocationRegistryDefinition = await indyVdrAnonCredsRegistry.getRevocationRegistryDefinition( agent.context, - legacyRevocationRegistryId + legacyRevocationRegistryDefinitionId ) + expect(legacyRevocationRegistryDefinition).toMatchObject({ - revocationRegistryDefinitionId: legacyRevocationRegistryId, + revocationRegistryDefinitionId: legacyRevocationRegistryDefinitionId, revocationRegistryDefinition: { issuerId: legacyIssuerId, revocDefType: 'CL_ACCUM', - value: { - maxCredNum: 100, - tailsHash: 'HLKresYcDSZYSKogq8wive4zyXNY84669MygftLFBG1i', - tailsLocation: - '/var/folders/l3/xy8jzyvj4p5_d9g1123rt4bw0000gn/T/HLKresYcDSZYSKogq8wive4zyXNY84669MygftLFBG1i', - publicKeys: { - accumKey: { - z: '1 1812B206EB395D3AEBD4BBF53EBB0FFC3371D8BD6175316AB32C1C5F65452051 1 22A079D49C5351EFDC1410C81A1F6D8B2E3B79CFF20A30690C118FE2050F72CB 1 0FFC28B923A4654E261DB4CB5B9BABEFCB4DB189B20F52412B0CC9CCCBB8A3B2 1 1EE967C43EF1A3F487061D21B07076A26C126AAF7712E7B5CF5A53688DDD5CC0 1 009ED4D65879CA81DA8227D34CEA3B759B4627E1E2FFB273E9645CD4F3B10F19 1 1CF070212E1E213AEB472F56EDFC9D48009796C77B2D8CC16F2836E37B8715C2 1 04954F0B7B468781BAAE3291DD0E6FFA7F1AF66CAA4094D37B24363CC34606FB 1 115367CB755E9DB18781B3825CB1AEE2C334558B2C038E13DF57BB57CE1CF847 1 110D37EC05862EE2757A7DF39E814876FC97376FF8105D2D29619CB575537BDE 1 13C559A9563FCE083B3B39AE7E8FCA4099BEF3A4C8C6672E543D521F9DA88F96 1 137D87CC22ACC1B6B8C20EABE59F6ED456A58FE4CBEEFDFC4FA9B87E3EF32D17 1 00A2A9711737AAF0404F35AE502887AC6172B2B57D236BD4A40B45F659BFC696', - }, - }, - }, - tag: 'tag', + value: revocationRegistryDefinitionValue, + tag: 'REV_TAG', credDefId: legacyCredentialDefinitionId, }, revocationRegistryDefinitionMetadata: { @@ -1048,78 +1047,70 @@ describe('IndyVdrAnonCredsRegistry', () => { resolutionMetadata: {}, }) - const didIndyRevocationRegistryDefinition = await indyVdrAnonCredsRegistry.getRevocationRegistryDefinition( - agent.context, - didIndyRevocationRegistryId - ) - expect(didIndyRevocationRegistryDefinition).toMatchObject({ - revocationRegistryDefinitionId: didIndyRevocationRegistryId, - revocationRegistryDefinition: { - issuerId: didIndyIssuerId, - revocDefType: 'CL_ACCUM', - value: { - maxCredNum: 100, - tailsHash: 'HLKresYcDSZYSKogq8wive4zyXNY84669MygftLFBG1i', - tailsLocation: - '/var/folders/l3/xy8jzyvj4p5_d9g1123rt4bw0000gn/T/HLKresYcDSZYSKogq8wive4zyXNY84669MygftLFBG1i', - publicKeys: { - accumKey: { - z: '1 1812B206EB395D3AEBD4BBF53EBB0FFC3371D8BD6175316AB32C1C5F65452051 1 22A079D49C5351EFDC1410C81A1F6D8B2E3B79CFF20A30690C118FE2050F72CB 1 0FFC28B923A4654E261DB4CB5B9BABEFCB4DB189B20F52412B0CC9CCCBB8A3B2 1 1EE967C43EF1A3F487061D21B07076A26C126AAF7712E7B5CF5A53688DDD5CC0 1 009ED4D65879CA81DA8227D34CEA3B759B4627E1E2FFB273E9645CD4F3B10F19 1 1CF070212E1E213AEB472F56EDFC9D48009796C77B2D8CC16F2836E37B8715C2 1 04954F0B7B468781BAAE3291DD0E6FFA7F1AF66CAA4094D37B24363CC34606FB 1 115367CB755E9DB18781B3825CB1AEE2C334558B2C038E13DF57BB57CE1CF847 1 110D37EC05862EE2757A7DF39E814876FC97376FF8105D2D29619CB575537BDE 1 13C559A9563FCE083B3B39AE7E8FCA4099BEF3A4C8C6672E543D521F9DA88F96 1 137D87CC22ACC1B6B8C20EABE59F6ED456A58FE4CBEEFDFC4FA9B87E3EF32D17 1 00A2A9711737AAF0404F35AE502887AC6172B2B57D236BD4A40B45F659BFC696', - }, - }, - }, - tag: 'tag', - credDefId: didIndyCredentialDefinitionId, - }, - revocationRegistryDefinitionMetadata: { - issuanceType: 'ISSUANCE_BY_DEFAULT', - didIndyNamespace: 'pool:localtest', + const revocationStatusListValue = { + issuerId: didIndyIssuerId, + revRegDefId: didIndyRevocationRegistryDefinitionId, + revocationList: [1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0], + currentAccumulator: '1', + timestamp: 1, + } + + const revStatusListResp = await indyVdrAnonCredsRegistry.registerRevocationStatusList(agent.context, { + options: { + endorserMode: 'external', + endorserDid, }, - resolutionMetadata: {}, + revocationStatusList: revocationStatusListValue, }) - const legacyRevocationStatusList = await indyVdrAnonCredsRegistry.getRevocationStatusList( - agent.context, - legacyRevocationRegistryId, - entryResponse.result.txnMetadata.txnTime + if ( + revStatusListResp.revocationStatusListState.state !== 'action' || + revStatusListResp.revocationStatusListState.action !== 'endorseIndyTransaction' + ) { + throw Error('unexpected revocation status list state') + } + + const endorsedRevStatusListTx = await endorser.modules.indyVdr.endorseTransaction( + revStatusListResp.revocationStatusListState.revocationStatusListRequest, + endorserDid ) - expect(legacyRevocationStatusList).toMatchObject({ - resolutionMetadata: {}, - revocationStatusList: { - issuerId: legacyIssuerId, - currentAccumulator: '1', - revRegDefId: legacyRevocationRegistryId, - revocationList: [ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - ], - timestamp: entryResponse.result.txnMetadata.txnTime, + const submitRevStatusListTxResult = await indyVdrAnonCredsRegistry.registerRevocationStatusList(agent.context, { + revocationStatusList: revStatusListResp.revocationStatusListState.revocationStatusList, + options: { + endorserMode: 'external', + endorsedTransaction: endorsedRevStatusListTx, }, - revocationStatusListMetadata: { - didIndyNamespace: 'pool:localtest', + }) + + expect(submitRevStatusListTxResult).toMatchObject({ + revocationStatusListMetadata: {}, + revocationStatusListState: { + timestamp: '1', + revocationStatusList: revocationStatusListValue, + state: 'finished', }, + registrationMetadata: {}, }) - const didIndyRevocationStatusList = await indyVdrAnonCredsRegistry.getRevocationStatusList( + await new Promise((res) => setTimeout(res, 5000)) + + const legacyRevocationStatusList = await indyVdrAnonCredsRegistry.getRevocationStatusList( agent.context, - didIndyRevocationRegistryId, - entryResponse.result.txnMetadata.txnTime + legacyRevocationRegistryDefinitionId, + 1 ) - expect(didIndyRevocationStatusList).toMatchObject({ + console.log(JSON.stringify(legacyRevocationStatusList)) + + expect(legacyRevocationStatusList).toMatchObject({ resolutionMetadata: {}, revocationStatusList: { - issuerId: didIndyIssuerId, + issuerId: legacyIssuerId, currentAccumulator: '1', - revRegDefId: didIndyRevocationRegistryId, - revocationList: [ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - ], - timestamp: entryResponse.result.txnMetadata.txnTime, + revRegDefId: legacyRevocationRegistryDefinitionId, + revocationList: revocationStatusListValue.revocationList, + timestamp: '1', }, revocationStatusListMetadata: { didIndyNamespace: 'pool:localtest', diff --git a/yarn.lock b/yarn.lock index e6a6a40e34..09b428fd9c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1261,11 +1261,28 @@ ref-array-di "^1.2.2" ref-struct-di "^1.1.1" -"@hyperledger/indy-vdr-shared@0.2.0-dev.5", "@hyperledger/indy-vdr-shared@^0.2.0-dev.5": +"@hyperledger/indy-vdr-nodejs@^0.2.0-dev.6": + version "0.2.0-dev.6" + resolved "https://registry.yarnpkg.com/@hyperledger/indy-vdr-nodejs/-/indy-vdr-nodejs-0.2.0-dev.6.tgz#c21916600e17cf6ee46fc78a054cb904f9156594" + integrity sha512-yOmfOqJJJapJRWdKSJQG7q/frKGUrntoae4fiYnwdQEWy4rdRiyZPo0ht9R6uuZ/AQwxtNMMRylvQZBfHA+vKA== + dependencies: + "@2060.io/ffi-napi" "4.0.8" + "@2060.io/ref-napi" "3.0.6" + "@hyperledger/indy-vdr-shared" "0.2.0-dev.6" + "@mapbox/node-pre-gyp" "^1.0.10" + ref-array-di "^1.2.2" + ref-struct-di "^1.1.1" + +"@hyperledger/indy-vdr-shared@0.2.0-dev.5": version "0.2.0-dev.5" resolved "https://registry.yarnpkg.com/@hyperledger/indy-vdr-shared/-/indy-vdr-shared-0.2.0-dev.5.tgz#ab33feda90dcbf457f3ff59da266ab32968ab48c" integrity sha512-oPvNG5ePvtuz3H+KxWdCdxWXeo3Jxs8AFAAuG8qLPSlicEHpWchbT1amun8ccp1lk7pIBx9J0aLf08yrM5H8iw== +"@hyperledger/indy-vdr-shared@0.2.0-dev.6", "@hyperledger/indy-vdr-shared@^0.2.0-dev.6": + version "0.2.0-dev.6" + resolved "https://registry.yarnpkg.com/@hyperledger/indy-vdr-shared/-/indy-vdr-shared-0.2.0-dev.6.tgz#4954ee06fa8a2e4545b35cd525b7b86e0f10b6fe" + integrity sha512-pNLq0zkqv5rFCpU9tzyJ5DPvED5YE+UFP8iKwVD7fe+mAD6/VpweOunYNKgIBT4K1DYI21q7bs3SzxQZ0hLlKw== + "@isaacs/string-locale-compare@^1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@isaacs/string-locale-compare/-/string-locale-compare-1.1.0.tgz#291c227e93fd407a96ecd59879a35809120e432b"