@ -1,4 +1,4 @@ 
			
		
	
		
			
				
					import  {  Axios ,  AxiosRequestConfig ,  AxiosResponse }  from  "axios" ;  
			
		
	
		
			
				
					import  {  Axios ,  AxiosRequestConfig  }  from  "axios" ;  
			
		
	
		
			
				
					import  {  Buffer  }  from  "buffer" ;  
			
		
	
		
			
				
					import  {  sha256  }  from  "ethereum-cryptography/sha256" ;  
			
		
	
		
			
				
					import  {  LRUCache  }  from  "lru-cache" ;  
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -17,10 +17,20 @@ import { 
			
		
	
		
			
				
					  retrieveAccountMetadata ,  
			
		
	
		
			
				
					  retrieveFullyDecryptedAccount ,  
			
		
	
		
			
				
					  getPasskeyExpirationSeconds ,  
			
		
	
		
			
				
					  GiverReceiverInputInfo ,  
			
		
	
		
			
				
					}  from  "../libs/util" ;  
			
		
	
		
			
				
					import  {  createEndorserJwtForKey ,  KeyMeta  }  from  "../libs/crypto/vc" ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					import  {  
			
		
	
		
			
				
					  GiveVerifiableCredential ,  
			
		
	
		
			
				
					  OfferVerifiableCredential ,  
			
		
	
		
			
				
					  RegisterVerifiableCredential ,  
			
		
	
		
			
				
					  GenericVerifiableCredential ,  
			
		
	
		
			
				
					  GenericCredWrapper ,  
			
		
	
		
			
				
					  PlanSummaryRecord ,  
			
		
	
		
			
				
					  UserInfo ,  
			
		
	
		
			
				
					  CreateAndSubmitClaimResult ,  
			
		
	
		
			
				
					}  from  "../interfaces" ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					export  const  SCHEMA_ORG_CONTEXT  =  "https://schema.org" ;  
			
		
	
		
			
				
					// the object in RegisterAction claims
  
			
		
	
		
			
				
					export  const  SERVICE_ID  =  "endorser.ch" ;  
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -36,44 +46,6 @@ export const CONTACT_URL_PATH_ENDORSER_CH_OLD = "/contact?jwt="; 
			
		
	
		
			
				
					//export const CONTACT_URL_PREFIX_ENDORSER_CH_OLD = "https://endorser.ch";
  
			
		
	
		
			
				
					// the prefix for handle IDs, the permanent ID for claims on Endorser
  
			
		
	
		
			
				
					export  const  ENDORSER_CH_HANDLE_PREFIX  =  "https://endorser.ch/entity/" ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					export  interface  AgreeVerifiableCredential  {  
			
		
	
		
			
				
					  "@context" :  string ;  
			
		
	
		
			
				
					  "@type" :  string ;  
			
		
	
		
			
				
					  // "any" because arbitrary objects can be subject of agreement
  
			
		
	
		
			
				
					  // eslint-disable-next-line @typescript-eslint/no-explicit-any
  
			
		
	
		
			
				
					  object :  Record < string ,  any > ;  
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					export  interface  GiverOutputInfo  {  
			
		
	
		
			
				
					  action : string ;  
			
		
	
		
			
				
					  giver? : GiverReceiverInputInfo ;  
			
		
	
		
			
				
					  description? : string ;  
			
		
	
		
			
				
					  amount? : number ;  
			
		
	
		
			
				
					  unitCode? : string ;  
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					export  interface  ClaimResult  {  
			
		
	
		
			
				
					  success :  {  claimId : string ;  handleId : string  } ;  
			
		
	
		
			
				
					  error :  {  code : string ;  message : string  } ;  
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					// similar to VerifiableCredentialSubject... maybe rename this
  
			
		
	
		
			
				
					export  interface  GenericVerifiableCredential  {  
			
		
	
		
			
				
					  "@context" ? :  string ;  // optional when embedded, eg. in an Agree
  
			
		
	
		
			
				
					  "@type" :  string ;  
			
		
	
		
			
				
					  [ key : string ] :  any ;  // eslint-disable-line @typescript-eslint/no-explicit-any
  
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					export  interface  GenericCredWrapper < T  extends  GenericVerifiableCredential >  {  
			
		
	
		
			
				
					  claim : T ;  
			
		
	
		
			
				
					  claimType? : string ;  
			
		
	
		
			
				
					  handleId : string ;  
			
		
	
		
			
				
					  id : string ;  
			
		
	
		
			
				
					  issuedAt : string ;  
			
		
	
		
			
				
					  issuer : string ;  
			
		
	
		
			
				
					  publicUrls? : Record < string ,  string > ;  // only for IDs that want to be public
  
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					export  const  BLANK_GENERIC_SERVER_RECORD : GenericCredWrapper < GenericVerifiableCredential >  =  
			
		
	
		
			
				
					  {  
			
		
	
		
			
				
					    claim :  {  "@type" :  ""  } ,  
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -82,232 +54,6 @@ export const BLANK_GENERIC_SERVER_RECORD: GenericCredWrapper<GenericVerifiableCr 
			
		
	
		
			
				
					    issuedAt :  "" ,  
			
		
	
		
			
				
					    issuer :  "" ,  
			
		
	
		
			
				
					  } ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					// a summary record; the VC is found the fullClaim field
  
			
		
	
		
			
				
					export  interface  GiveSummaryRecord  {  
			
		
	
		
			
				
					  agentDid : string ;  
			
		
	
		
			
				
					  amount : number ;  
			
		
	
		
			
				
					  amountConfirmed : number ;  
			
		
	
		
			
				
					  description : string ;  
			
		
	
		
			
				
					  fullClaim : GiveVerifiableCredential ;  
			
		
	
		
			
				
					  fulfillsHandleId : string ;  
			
		
	
		
			
				
					  fulfillsPlanHandleId? : string ;  
			
		
	
		
			
				
					  fulfillsType? : string ;  
			
		
	
		
			
				
					  handleId : string ;  
			
		
	
		
			
				
					  issuedAt : string ;  
			
		
	
		
			
				
					  issuerDid : string ;  
			
		
	
		
			
				
					  jwtId : string ;  
			
		
	
		
			
				
					  providerPlanHandleId? : string ;  
			
		
	
		
			
				
					  recipientDid : string ;  
			
		
	
		
			
				
					  unit : string ;  
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					// a summary record; the VC is found the fullClaim field
  
			
		
	
		
			
				
					export  interface  OfferSummaryRecord  {  
			
		
	
		
			
				
					  amount : number ;  
			
		
	
		
			
				
					  amountGiven : number ;  
			
		
	
		
			
				
					  amountGivenConfirmed : number ;  
			
		
	
		
			
				
					  fullClaim : OfferVerifiableCredential ;  
			
		
	
		
			
				
					  fulfillsPlanHandleId : string ;  
			
		
	
		
			
				
					  handleId : string ;  
			
		
	
		
			
				
					  issuerDid : string ;  
			
		
	
		
			
				
					  jwtId : string ;  
			
		
	
		
			
				
					  nonAmountGivenConfirmed : number ;  
			
		
	
		
			
				
					  objectDescription : string ;  
			
		
	
		
			
				
					  offeredByDid : string ;  
			
		
	
		
			
				
					  recipientDid : string ;  
			
		
	
		
			
				
					  requirementsMet : boolean ;  
			
		
	
		
			
				
					  unit : string ;  
			
		
	
		
			
				
					  validThrough : string ;  
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					export  interface  OfferToPlanSummaryRecord  extends  OfferSummaryRecord  {  
			
		
	
		
			
				
					  planName : string ;  
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					// a summary record; the VC is not currently part of this record
  
			
		
	
		
			
				
					export  interface  PlanSummaryRecord  {  
			
		
	
		
			
				
					  agentDid? : string ;  // optional, if the issuer wants someone else to manage as well
  
			
		
	
		
			
				
					  description : string ;  
			
		
	
		
			
				
					  endTime? : string ;  
			
		
	
		
			
				
					  fulfillsPlanHandleId : string ;  
			
		
	
		
			
				
					  handleId : string ;  
			
		
	
		
			
				
					  image? : string ;  
			
		
	
		
			
				
					  issuerDid : string ;  
			
		
	
		
			
				
					  locLat? : number ;  
			
		
	
		
			
				
					  locLon? : number ;  
			
		
	
		
			
				
					  name? : string ;  
			
		
	
		
			
				
					  startTime? : string ;  
			
		
	
		
			
				
					  url? : string ;  
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					// Note that previous VCs may have additional fields.
  
			
		
	
		
			
				
					// https://endorser.ch/doc/html/transactions.html#id4
  
			
		
	
		
			
				
					export  interface  GiveVerifiableCredential  extends  GenericVerifiableCredential  {  
			
		
	
		
			
				
					  "@context" ? :  string ;  // optional when embedded, eg. in an Agree
  
			
		
	
		
			
				
					  "@type" :  "GiveAction" ;  
			
		
	
		
			
				
					  agent ? :  {  identifier : string  } ;  
			
		
	
		
			
				
					  description? : string ;  
			
		
	
		
			
				
					  fulfills ? :  {  "@type" :  string ;  identifier? : string ;  lastClaimId? : string  } [ ] ;  
			
		
	
		
			
				
					  identifier? : string ;  
			
		
	
		
			
				
					  image? : string ;  
			
		
	
		
			
				
					  object ? :  {  amountOfThisGood : number ;  unitCode : string  } ;  
			
		
	
		
			
				
					  provider? : GenericVerifiableCredential ;  // typically @type & identifier
  
			
		
	
		
			
				
					  recipient ? :  {  identifier : string  } ;  
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					// Note that previous VCs may have additional fields.
  
			
		
	
		
			
				
					// https://endorser.ch/doc/html/transactions.html#id8
  
			
		
	
		
			
				
					export  interface  OfferVerifiableCredential  extends  GenericVerifiableCredential  {  
			
		
	
		
			
				
					  "@context" ? :  string ;  // optional when embedded... though it doesn't make sense to agree to an offer
  
			
		
	
		
			
				
					  "@type" :  "Offer" ;  
			
		
	
		
			
				
					  description? : string ;  // conditions for the offer
  
			
		
	
		
			
				
					  includesObject ? :  {  amountOfThisGood : number ;  unitCode : string  } ;  
			
		
	
		
			
				
					  itemOffered ? :  {  
			
		
	
		
			
				
					    description? : string ;  // description of the item
  
			
		
	
		
			
				
					    isPartOf ? :  {  identifier? : string ;  lastClaimId? : string ;  "@type" ? :  string  } ;  
			
		
	
		
			
				
					  } ;  
			
		
	
		
			
				
					  offeredBy ? :  {  identifier : string  } ;  
			
		
	
		
			
				
					  recipient ? :  {  identifier : string  } ;  
			
		
	
		
			
				
					  validThrough? : string ;  
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					// Note that previous VCs may have additional fields.
  
			
		
	
		
			
				
					// https://endorser.ch/doc/html/transactions.html#id7
  
			
		
	
		
			
				
					export  interface  PlanVerifiableCredential  extends  GenericVerifiableCredential  {  
			
		
	
		
			
				
					  "@context" :  "https://schema.org" ;  
			
		
	
		
			
				
					  "@type" :  "PlanAction" ;  
			
		
	
		
			
				
					  name : string ;  
			
		
	
		
			
				
					  agent ? :  {  identifier : string  } ;  
			
		
	
		
			
				
					  description? : string ;  
			
		
	
		
			
				
					  identifier? : string ;  
			
		
	
		
			
				
					  lastClaimId? : string ;  
			
		
	
		
			
				
					  location ? :  {  
			
		
	
		
			
				
					    geo :  {  "@type" :  "GeoCoordinates" ;  latitude : number ;  longitude : number  } ;  
			
		
	
		
			
				
					  } ;  
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					/ * *  
			
		
	
		
			
				
					 *  Represents  data  about  a  project  
			
		
	
		
			
				
					 *  
			
		
	
		
			
				
					 *  @deprecated  
			
		
	
		
			
				
					 *  ( Maybe  we  should  use  PlanSummaryRecord  instead ,  either  by  adding  rowId  or  by  iterating  with  jwtId . )  
			
		
	
		
			
				
					 * * /  
			
		
	
		
			
				
					export  interface  PlanData  {  
			
		
	
		
			
				
					  / * *  
			
		
	
		
			
				
					   *  Description  of  the  project  
			
		
	
		
			
				
					   * * /  
			
		
	
		
			
				
					  description : string ;  
			
		
	
		
			
				
					  / * *  
			
		
	
		
			
				
					   *  URL  referencing  information  about  the  project  
			
		
	
		
			
				
					   * * /  
			
		
	
		
			
				
					  handleId : string ;  
			
		
	
		
			
				
					  image? : string ;  
			
		
	
		
			
				
					  / * *  
			
		
	
		
			
				
					   *  The  DID  of  the  issuer  
			
		
	
		
			
				
					   * /  
			
		
	
		
			
				
					  issuerDid : string ;  
			
		
	
		
			
				
					  / * *  
			
		
	
		
			
				
					   *  Name  of  the  project  
			
		
	
		
			
				
					   * * /  
			
		
	
		
			
				
					  name : string ;  
			
		
	
		
			
				
					  / * *  
			
		
	
		
			
				
					   *  The  identifier  of  the  project  record  --  different  from  jwtId  
			
		
	
		
			
				
					   *  ( Maybe  we  should  use  the  jwtId  to  iterate  through  the  records  instead . )  
			
		
	
		
			
				
					   * * /  
			
		
	
		
			
				
					  rowId? : string ;  
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					export  interface  EndorserRateLimits  {  
			
		
	
		
			
				
					  doneClaimsThisWeek : string ;  
			
		
	
		
			
				
					  doneRegistrationsThisMonth : string ;  
			
		
	
		
			
				
					  maxClaimsPerWeek : string ;  
			
		
	
		
			
				
					  maxRegistrationsPerMonth : string ;  
			
		
	
		
			
				
					  nextMonthBeginDateTime : string ;  
			
		
	
		
			
				
					  nextWeekBeginDateTime : string ;  
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					export  interface  ImageRateLimits  {  
			
		
	
		
			
				
					  doneImagesThisWeek : string ;  
			
		
	
		
			
				
					  maxImagesPerWeek : string ;  
			
		
	
		
			
				
					  nextWeekBeginDateTime : string ;  
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					export  interface  VerifiableCredential  {  
			
		
	
		
			
				
					  exp? : number ;  
			
		
	
		
			
				
					  iat : number ;  
			
		
	
		
			
				
					  iss : string ;  
			
		
	
		
			
				
					  vc :  {  
			
		
	
		
			
				
					    "@context" :  string [ ] ;  
			
		
	
		
			
				
					    type :  string [ ] ;  
			
		
	
		
			
				
					    credentialSubject : VerifiableCredentialSubject ;  
			
		
	
		
			
				
					  } ;  
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					// similar to GenericVerifiableCredential... maybe replace that one
  
			
		
	
		
			
				
					export  interface  VerifiableCredentialSubject  {  
			
		
	
		
			
				
					  "@context" :  string ;  
			
		
	
		
			
				
					  "@type" :  string ;  
			
		
	
		
			
				
					  [ key : string ] :  any ;  // eslint-disable-line @typescript-eslint/no-explicit-any
  
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					export  interface  WorldProperties  {  
			
		
	
		
			
				
					  startTime? : string ;  
			
		
	
		
			
				
					  endTime? : string ;  
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					// AKA Registration & RegisterAction
  
			
		
	
		
			
				
					export  interface  RegisterVerifiableCredential  {  
			
		
	
		
			
				
					  "@context" :  typeof  SCHEMA_ORG_CONTEXT ;  
			
		
	
		
			
				
					  "@type" :  "RegisterAction" ;  
			
		
	
		
			
				
					  agent :  {  identifier : string  } ;  
			
		
	
		
			
				
					  identifier? : string ;  // used for invites (when participant ID isn't known)
  
			
		
	
		
			
				
					  object :  string ;  
			
		
	
		
			
				
					  participant ? :  {  identifier : string  } ;  // used when person is known (not an invite)
  
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					// now for some of the error & other wrapper types
  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					export  interface  ResultWithType  {  
			
		
	
		
			
				
					  type :  string ;  
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					export  interface  SuccessResult  extends  ResultWithType  {  
			
		
	
		
			
				
					  type :  "success" ;  
			
		
	
		
			
				
					  response : AxiosResponse < ClaimResult > ;  
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					export  interface  ErrorResponse  {  
			
		
	
		
			
				
					  error ? :  {  
			
		
	
		
			
				
					    message? : string ;  
			
		
	
		
			
				
					  } ;  
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					export  interface  InternalError  {  
			
		
	
		
			
				
					  error : string ;  // for system logging
  
			
		
	
		
			
				
					  userMessage? : string ;  // for user display
  
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					export  interface  ErrorResult  extends  ResultWithType  {  
			
		
	
		
			
				
					  type :  "error" ;  
			
		
	
		
			
				
					  error : InternalError ;  
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					export  type  CreateAndSubmitClaimResult  =  SuccessResult  |  ErrorResult ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					/ * *  
			
		
	
		
			
				
					 *  This  is  similar  to  Contact  but  it  grew  up  in  different  logic  paths .  
			
		
	
		
			
				
					 *  We  may  want  to  change  this  to  be  a  Contact .  
			
		
	
		
			
				
					 * /  
			
		
	
		
			
				
					export  interface  UserInfo  {  
			
		
	
		
			
				
					  did : string ;  
			
		
	
		
			
				
					  name : string ;  
			
		
	
		
			
				
					  publicEncKey : string ;  
			
		
	
		
			
				
					  registered : boolean ;  
			
		
	
		
			
				
					  profileImageUrl? : string ;  
			
		
	
		
			
				
					  nextPublicEncKeyHash? : string ;  
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					// This is used to check for hidden info.
  
			
		
	
		
			
				
					// See https://github.com/trentlarson/endorser-ch/blob/0cb626f803028e7d9c67f095858a9fc8542e3dbd/server/api/services/util.js#L6
  
			
		
	
		
			
				
					const  HIDDEN_DID  =  "did:none:HIDDEN" ;