From c3ff3fbdd0aa304f3b53413bd0a00231f7d296b9 Mon Sep 17 00:00:00 2001 From: Maycon Mello Date: Mon, 20 Jul 2026 14:35:25 -0300 Subject: [PATCH] preserve credential schema in re-delegation --- integration-tests/delegation-offer.test.ts | 7 +++++++ packages/core/src/delegation/delegation-issuance.ts | 3 +++ 2 files changed, 10 insertions(+) diff --git a/integration-tests/delegation-offer.test.ts b/integration-tests/delegation-offer.test.ts index f8e26380..3f4c65d2 100644 --- a/integration-tests/delegation-offer.test.ts +++ b/integration-tests/delegation-offer.test.ts @@ -28,6 +28,10 @@ async function issueRootCredential(walletClient) { id: 'did:test:root-issuer', name: 'Travel Agency', }, + credentialSchema: { + id: 'https://schema.truvera.io/travel-agency-credential.json', + type: 'JsonSchemaValidator2018', + }, credentialSubject: { id: 'did:test:travel-agency', allowedRoutes: ['US-NYC-LAX', 'US-SFO-SEA', 'US-ORD-MIA'], @@ -181,6 +185,9 @@ describe('Credential Distribution', () => { expect(issuedCredential.rootCredentialId).toBe(rootCredential.id); expect(issuedCredential.delegationRoleId).toBe('e79c0d16-8739-4e54-94d7-53d9f1c97c71'); + // Re-delegated credential must carry the same credentialSchema as the root credential. + expect(issuedCredential.credentialSchema).toEqual(rootCredential.credentialSchema); + const delegationChain = delegatableCredential.body.delegationChain; expect(Array.isArray(delegationChain)).toBe(true); expect(delegationChain.length).toBeGreaterThan(0); diff --git a/packages/core/src/delegation/delegation-issuance.ts b/packages/core/src/delegation/delegation-issuance.ts index 6d82c257..0528a412 100644 --- a/packages/core/src/delegation/delegation-issuance.ts +++ b/packages/core/src/delegation/delegation-issuance.ts @@ -101,6 +101,9 @@ export async function delegateCredential({ }, issuanceDate: new Date().toISOString(), credentialSubject: credential.credentialSubject, + ...(credential.credentialSchema + ? {credentialSchema: credential.credentialSchema} + : {}), }; return issueCredential(