From e4f859a1164e63a34f93c66a992d353e14412206 Mon Sep 17 00:00:00 2001
From: Matthew Raymer <matthew.raymer@anomalistdesign.com>
Date: Wed, 28 May 2025 10:41:39 +0000
Subject: [PATCH] fix: update offerGiverDid to use credentialSubject.offeredBy

The offerGiverDid function was looking for offeredBy at the root level of the
OfferVerifiableCredential, but it was moved to credentialSubject in our interface
changes. This fix updates the function to look in the correct location while
maintaining the same fallback behavior of using the issuer if offeredBy is not
available.

- Update path from claim.offeredBy to claim.credentialSubject.offeredBy
- Remove unnecessary string type cast
- Keep issuer fallback behavior unchanged
---
 src/interfaces/claims.ts | 65 ++++++++++++++++++++++++++++++++++++++--
 src/libs/util.ts         |  6 ++--
 2 files changed, 65 insertions(+), 6 deletions(-)

diff --git a/src/interfaces/claims.ts b/src/interfaces/claims.ts
index b5ad2663..cec47b95 100644
--- a/src/interfaces/claims.ts
+++ b/src/interfaces/claims.ts
@@ -9,7 +9,6 @@ export interface AgreeVerifiableCredential {
 // Note that previous VCs may have additional fields.
 // https://endorser.ch/doc/html/transactions.html#id4
 export interface GiveVerifiableCredential extends GenericVerifiableCredential {
-  "@context"?: string;
   "@type": "GiveAction";
   agent?: { identifier: string };
   description?: string;
@@ -19,14 +18,45 @@ export interface GiveVerifiableCredential extends GenericVerifiableCredential {
   object?: { amountOfThisGood: number; unitCode: string };
   provider?: GenericVerifiableCredential;
   recipient?: { identifier: string };
+  type: string[];
+  issuer: string;
+  issuanceDate: string;
+  credentialSubject: {
+    id: string;
+    type: "GiveAction";
+    offeredBy?: {
+      type: "Person";
+      identifier: string;
+    };
+    offeredTo?: {
+      type: "Person";
+      identifier: string;
+    };
+    offeredToProject?: {
+      type: "Project";
+      identifier: string;
+    };
+    offeredToProjectVisibleToDids?: string[];
+    offeredToVisibleToDids?: string[];
+    offeredByVisibleToDids?: string[];
+    amount: {
+      type: "QuantitativeValue";
+      value: number;
+      unitCode: string;
+    };
+    startTime?: string;
+    endTime?: string;
+  };
 }
 
 // Note that previous VCs may have additional fields.
 // https://endorser.ch/doc/html/transactions.html#id8
 export interface OfferVerifiableCredential extends GenericVerifiableCredential {
-  "@context"?: string;
   "@type": "Offer";
   description?: string;
+  fulfills?: { "@type": string; identifier?: string; lastClaimId?: string }[];
+  identifier?: string;
+  image?: string;
   includesObject?: { amountOfThisGood: number; unitCode: string };
   itemOffered?: {
     description?: string;
@@ -37,9 +67,38 @@ export interface OfferVerifiableCredential extends GenericVerifiableCredential {
       name?: string;
     };
   };
-  offeredBy?: { identifier: string };
+  provider?: GenericVerifiableCredential;
   recipient?: { identifier: string };
   validThrough?: string;
+  type: string[];
+  issuer: string;
+  issuanceDate: string;
+  credentialSubject: {
+    id: string;
+    type: "Offer";
+    offeredBy?: {
+      type: "Person";
+      identifier: string;
+    };
+    offeredTo?: {
+      type: "Person";
+      identifier: string;
+    };
+    offeredToProject?: {
+      type: "Project";
+      identifier: string;
+    };
+    offeredToProjectVisibleToDids?: string[];
+    offeredToVisibleToDids?: string[];
+    offeredByVisibleToDids?: string[];
+    amount: {
+      type: "QuantitativeValue";
+      value: number;
+      unitCode: string;
+    };
+    startTime?: string;
+    endTime?: string;
+  };
 }
 
 // Note that previous VCs may have additional fields.
diff --git a/src/libs/util.ts b/src/libs/util.ts
index ca719625..ffb5dadf 100644
--- a/src/libs/util.ts
+++ b/src/libs/util.ts
@@ -389,10 +389,10 @@ export function offerGiverDid(
   let giver;
   const claim = veriClaim.claim as OfferVerifiableCredential;
   if (
-    claim.offeredBy?.identifier &&
-    !serverUtil.isHiddenDid(claim.offeredBy.identifier as string)
+    claim.credentialSubject.offeredBy?.identifier &&
+    !serverUtil.isHiddenDid(claim.credentialSubject.offeredBy.identifier)
   ) {
-    giver = claim.offeredBy.identifier;
+    giver = claim.credentialSubject.offeredBy.identifier;
   } else if (veriClaim.issuer && !serverUtil.isHiddenDid(veriClaim.issuer)) {
     giver = veriClaim.issuer;
   }