@reclaimprotocol/js-sdk 2.0.1 → 2.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -205,10 +205,6 @@ For production applications, it's recommended to handle proofs on your backend:
205
205
  reclaimProofRequest.setCallbackUrl('https://your-backend.com/receive-proofs')
206
206
  ```
207
207
 
208
- 2. Set a custom status URL:
209
- ```javascript
210
- reclaimProofRequest.setStatusUrl('https://your-backend.com/receive-status')
211
- ```
212
208
 
213
209
  These options allow you to securely process proofs and status updates on your server.
214
210
 
package/dist/index.js CHANGED
@@ -164,6 +164,7 @@ var AddContextError = createErrorClass("AddContextError");
164
164
  var SetSignatureError = createErrorClass("SetSignatureError");
165
165
  var GetAppCallbackUrlError = createErrorClass("GetAppCallbackUrlError");
166
166
  var GetRequestUrlError = createErrorClass("GetRequestUrlError");
167
+ var StatusUrlError = createErrorClass("StatusUrlError");
167
168
 
168
169
  // src/utils/logger.ts
169
170
  var SimpleLogger = class {
@@ -378,6 +379,31 @@ function updateSession(sessionId, status) {
378
379
  }
379
380
  });
380
381
  }
382
+ function fetchStatusUrl(sessionId) {
383
+ return __async(this, null, function* () {
384
+ validateFunctionParams(
385
+ [{ input: sessionId, paramName: "sessionId", isString: true }],
386
+ "fetchStatusUrl"
387
+ );
388
+ try {
389
+ const response = yield fetch(`${constants.DEFAULT_RECLAIM_STATUS_URL}${sessionId}`, {
390
+ method: "GET",
391
+ headers: { "Content-Type": "application/json" }
392
+ });
393
+ const res = yield response.json();
394
+ if (!response.ok) {
395
+ const errorMessage = `Error fetching status URL for sessionId: ${sessionId}. Status Code: ${response.status}`;
396
+ logger4.info(errorMessage, res);
397
+ throw new StatusUrlError(errorMessage);
398
+ }
399
+ return res;
400
+ } catch (err) {
401
+ const errorMessage = `Failed to fetch status URL for sessionId: ${sessionId}`;
402
+ logger4.info(errorMessage, err);
403
+ throw new StatusUrlError(`Error fetching status URL for sessionId: ${sessionId}`);
404
+ }
405
+ });
406
+ }
381
407
 
382
408
  // src/utils/proofUtils.ts
383
409
  var import_ethers5 = require("ethers");
@@ -1170,7 +1196,7 @@ function transformForOnchain(proof) {
1170
1196
  var ReclaimProofRequest = class _ReclaimProofRequest {
1171
1197
  // Private constructor
1172
1198
  constructor(applicationId, providerId, options) {
1173
- this.context = { contextAddress: "0x0", contextMessage: "" };
1199
+ this.context = { contextAddress: "0x0", contextMessage: "sample context" };
1174
1200
  this.intervals = /* @__PURE__ */ new Map();
1175
1201
  this.providerId = providerId;
1176
1202
  this.timeStamp = Date.now().toString();
@@ -1439,8 +1465,7 @@ var ReclaimProofRequest = class _ReclaimProofRequest {
1439
1465
  }
1440
1466
  startSession(_0) {
1441
1467
  return __async(this, arguments, function* ({ onSuccess, onError }) {
1442
- const statusUrl = this.getStatusUrl();
1443
- if (!statusUrl || !this.sessionId) {
1468
+ if (!this.sessionId) {
1444
1469
  const message = "Session can't be started due to undefined value of statusUrl and sessionId";
1445
1470
  logger6.info(message);
1446
1471
  throw new SessionNotStartedError(message);
@@ -1448,12 +1473,11 @@ var ReclaimProofRequest = class _ReclaimProofRequest {
1448
1473
  logger6.info("Starting session");
1449
1474
  const interval = setInterval(() => __async(this, null, function* () {
1450
1475
  try {
1451
- const res = yield fetch(statusUrl);
1452
- const data = yield res.json();
1453
- if (!data.session) return;
1454
- if (data.session.status === "PROOF_GENERATION_FAILED" /* PROOF_GENERATION_FAILED */) throw new ProviderFailedError();
1455
- if (data.session.proofs.length === 0) return;
1456
- const proof = data.session.proofs[0];
1476
+ const statusUrlResponse = yield fetchStatusUrl(this.sessionId);
1477
+ if (!statusUrlResponse.session) return;
1478
+ if (statusUrlResponse.session.statusV2 === "PROOF_GENERATION_FAILED" /* PROOF_GENERATION_FAILED */) throw new ProviderFailedError();
1479
+ if (!statusUrlResponse.session.proofs || statusUrlResponse.session.proofs.length === 0) return;
1480
+ const proof = statusUrlResponse.session.proofs[0];
1457
1481
  const verified = yield verifyProof(proof);
1458
1482
  if (!verified) {
1459
1483
  logger6.info(`Proof not verified: ${proof}`);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/witness.ts","../src/Reclaim.ts","../src/utils/errors.ts","../src/utils/logger.ts","../src/utils/helper.ts","../src/utils/constants.ts","../src/utils/validationUtils.ts","../src/utils/sessionUtils.ts","../src/utils/proofUtils.ts","../src/contract-types/contracts/factories/Reclaim__factory.ts","../src/contract-types/config.json","../src/smart-contract.ts"],"sourcesContent":["export * from './Reclaim';\nexport * from './utils/interfaces';","import { ethers } from 'ethers';\nimport type { WitnessData } from './utils/interfaces';\nimport type { ClaimID, ClaimInfo, CompleteClaimData } from './utils/types';\n\ntype BeaconState = {\n witnesses: WitnessData[];\n epoch: number;\n witnessesRequiredForClaim: number;\n nextEpochTimestampS: number;\n};\n\nexport function fetchWitnessListForClaim(\n { witnesses, witnessesRequiredForClaim, epoch }: BeaconState,\n params: string | ClaimInfo,\n timestampS: number\n): WitnessData[] {\n const identifier: ClaimID =\n typeof params === 'string' ? params : getIdentifierFromClaimInfo(params);\n const completeInput: string = [\n identifier,\n epoch.toString(),\n witnessesRequiredForClaim.toString(),\n timestampS.toString(),\n ].join('\\n');\n const completeHashStr: string = ethers.keccak256(strToUint8Array(completeInput));\n const completeHash: Uint8Array = ethers.getBytes(completeHashStr);\n const completeHashView: DataView = uint8ArrayToDataView(completeHash);\n const witnessesLeft: WitnessData[] = [...witnesses];\n const selectedWitnesses: WitnessData[] = [];\n let byteOffset: number = 0;\n for (let i = 0; i < witnessesRequiredForClaim; i++) {\n const randomSeed: number = completeHashView.getUint32(byteOffset);\n const witnessIndex: number = randomSeed % witnessesLeft.length;\n const witness: WitnessData = witnessesLeft[witnessIndex];\n selectedWitnesses.push(witness);\n\n witnessesLeft[witnessIndex] = witnessesLeft[witnessesLeft.length - 1];\n witnessesLeft.pop();\n byteOffset = (byteOffset + 4) % completeHash.length;\n }\n\n return selectedWitnesses;\n}\n\nexport function getIdentifierFromClaimInfo(info: ClaimInfo): ClaimID {\n const str: string = `${info.provider}\\n${info.parameters}\\n${info.context || ''}`;\n return ethers.keccak256(strToUint8Array(str)).toLowerCase();\n}\n\nexport function strToUint8Array(str: string): Uint8Array {\n return new TextEncoder().encode(str);\n}\n\nexport function uint8ArrayToDataView(arr: Uint8Array): DataView {\n return new DataView(arr.buffer, arr.byteOffset, arr.byteLength);\n}\n\nexport function createSignDataForClaim(data: CompleteClaimData): string {\n const identifier: ClaimID =\n 'identifier' in data ? data.identifier : getIdentifierFromClaimInfo(data);\n const lines: string[] = [\n identifier,\n data.owner.toLowerCase(),\n data.timestampS.toString(),\n data.epoch.toString(),\n ];\n\n return lines.join('\\n');\n}\n","import type { Proof, RequestedProof, Context, ProviderData } from './utils/interfaces'\nimport { getIdentifierFromClaimInfo } from './witness'\nimport type {\n SignedClaim,\n ProofRequestOptions,\n StartSessionParams,\n ProofPropertiesJSON,\n TemplateData\n} from './utils/types'\nimport { SessionStatus } from './utils/types'\nimport { ethers } from 'ethers'\nimport canonicalize from 'canonicalize'\nimport {\n replaceAll,\n scheduleIntervalEndingTask\n} from './utils/helper'\nimport { constants } from './utils/constants'\nimport {\n AddContextError,\n AvailableParamsError,\n BuildProofRequestError,\n GetAppCallbackUrlError,\n GetStatusUrlError,\n InitError,\n InvalidParamError,\n NoProviderParamsError,\n ProofNotVerifiedError,\n ProviderFailedError,\n SessionNotStartedError,\n SetParamsError,\n SetSignatureError,\n SignatureGeneratingError,\n SignatureNotFoundError} from './utils/errors'\nimport { validateContext, validateFunctionParams, validateRequestedProof, validateSignature, validateURL } from './utils/validationUtils'\nimport { initSession, updateSession } from './utils/sessionUtils'\nimport { assertValidSignedClaim, createLinkWithTemplateData, generateRequestedProof, getFilledParameters, getWitnessesForClaim } from './utils/proofUtils'\nimport loggerModule from './utils/logger';\nconst logger = loggerModule.logger\n\n\nexport async function verifyProof(proof: Proof): Promise<boolean> {\n if (!proof.signatures.length) {\n throw new SignatureNotFoundError('No signatures')\n }\n\n try {\n // check if witness array exist and first element is manual-verify\n let witnesses = []\n if (proof.witnesses.length && proof.witnesses[0]?.url === 'manual-verify') {\n witnesses.push(proof.witnesses[0].id)\n } else {\n witnesses = await getWitnessesForClaim(\n proof.claimData.epoch,\n proof.identifier,\n proof.claimData.timestampS\n )\n }\n // then hash the claim info with the encoded ctx to get the identifier\n const calculatedIdentifier = getIdentifierFromClaimInfo({\n parameters: JSON.parse(\n canonicalize(proof.claimData.parameters) as string\n ),\n provider: proof.claimData.provider,\n context: proof.claimData.context\n })\n proof.identifier = replaceAll(proof.identifier, '\"', '')\n // check if the identifier matches the one in the proof\n if (calculatedIdentifier !== proof.identifier) {\n throw new ProofNotVerifiedError('Identifier Mismatch')\n }\n\n const signedClaim: SignedClaim = {\n claim: {\n ...proof.claimData\n },\n signatures: proof.signatures.map(signature => {\n return ethers.getBytes(signature)\n })\n }\n\n assertValidSignedClaim(signedClaim, witnesses)\n } catch (e: Error | unknown) {\n logger.info(`Error verifying proof: ${e instanceof Error ? e.message : String(e)}`)\n return false\n }\n\n return true\n}\n\nexport function transformForOnchain(proof: Proof): { claimInfo: any, signedClaim: any } {\n const claimInfoBuilder = new Map([\n ['context', proof.claimData.context],\n ['parameters', proof.claimData.parameters],\n ['provider', proof.claimData.provider],\n ]);\n const claimInfo = Object.fromEntries(claimInfoBuilder);\n const claimBuilder = new Map<string, number | string>([\n ['epoch', proof.claimData.epoch],\n ['identifier', proof.claimData.identifier],\n ['owner', proof.claimData.owner],\n ['timestampS', proof.claimData.timestampS],\n ]);\n const signedClaim = {\n claim: Object.fromEntries(claimBuilder),\n signatures: proof.signatures,\n };\n return { claimInfo, signedClaim };\n}\n\nexport class ReclaimProofRequest {\n // Private class properties\n private applicationId: string;\n private signature?: string;\n private appCallbackUrl?: string;\n private sessionId: string;\n private options?: ProofRequestOptions;\n private context: Context = { contextAddress: '0x0', contextMessage: '' };\n private requestedProof?: RequestedProof;\n private providerId: string;\n private redirectUrl?: string;\n private intervals: Map<string, NodeJS.Timer> = new Map();\n private timeStamp: string;\n\n // Private constructor\n private constructor(applicationId: string, providerId: string, options?: ProofRequestOptions) {\n this.providerId = providerId;\n this.timeStamp = Date.now().toString();\n this.applicationId = applicationId;\n this.sessionId = \"\";\n if (options?.log) {\n loggerModule.setLogLevel('info');\n } else {\n loggerModule.setLogLevel('silent');\n }\n this.options = options;\n logger.info(`Initializing client with applicationId: ${this.applicationId}`);\n }\n\n // Static initialization methods\n static async init(applicationId: string, appSecret: string, providerId: string, options?: ProofRequestOptions): Promise<ReclaimProofRequest> {\n try {\n validateFunctionParams([\n { paramName: 'applicationId', input: applicationId, isString: true },\n { paramName: 'providerId', input: providerId, isString: true },\n { paramName: 'appSecret', input: appSecret, isString: true }\n ], 'the constructor')\n\n // check if options is provided and validate each property of options\n if (options) {\n if (options.acceptAiProviders) {\n validateFunctionParams([\n { paramName: 'acceptAiProviders', input: options.acceptAiProviders }\n ], 'the constructor')\n }\n if (options.log) {\n validateFunctionParams([\n { paramName: 'log', input: options.log }\n ], 'the constructor')\n }\n\n }\n\n const proofRequestInstance = new ReclaimProofRequest(applicationId, providerId, options)\n\n const signature = await proofRequestInstance.generateSignature(appSecret)\n proofRequestInstance.setSignature(signature)\n\n const data = await initSession(providerId, applicationId, proofRequestInstance.timeStamp, signature);\n proofRequestInstance.sessionId = data.sessionId\n\n await proofRequestInstance.buildProofRequest(data.provider)\n\n return proofRequestInstance\n } catch (error) {\n logger.info('Failed to initialize ReclaimProofRequest', error as Error);\n throw new InitError('Failed to initialize ReclaimProofRequest', error as Error)\n }\n }\n\n static async fromJsonString(jsonString: string): Promise<ReclaimProofRequest> {\n try {\n const {\n applicationId,\n providerId,\n sessionId,\n context,\n requestedProof,\n signature,\n redirectUrl,\n timeStamp,\n appCallbackUrl,\n options\n }: ProofPropertiesJSON = JSON.parse(jsonString)\n\n validateFunctionParams([\n { input: applicationId, paramName: 'applicationId', isString: true },\n { input: providerId, paramName: 'providerId', isString: true },\n { input: signature, paramName: 'signature', isString: true },\n { input: sessionId, paramName: 'sessionId', isString: true },\n { input: timeStamp, paramName: 'timeStamp', isString: true },\n ], 'fromJsonString');\n\n validateRequestedProof(requestedProof);\n\n if (redirectUrl) {\n validateURL(redirectUrl, 'fromJsonString');\n }\n\n if (appCallbackUrl) {\n validateURL(appCallbackUrl, 'fromJsonString');\n }\n\n if (context) {\n validateContext(context);\n }\n\n const proofRequestInstance = new ReclaimProofRequest(applicationId, providerId, options);\n proofRequestInstance.sessionId = sessionId;\n proofRequestInstance.context = context;\n proofRequestInstance.requestedProof = requestedProof\n proofRequestInstance.appCallbackUrl = appCallbackUrl\n proofRequestInstance.redirectUrl = redirectUrl\n proofRequestInstance.timeStamp = timeStamp\n proofRequestInstance.signature = signature\n\n return proofRequestInstance\n } catch (error) {\n logger.info('Failed to parse JSON string in fromJsonString:', error);\n throw new InvalidParamError('Invalid JSON string provided to fromJsonString');\n }\n }\n\n // Setter methods\n setAppCallbackUrl(url: string): void {\n validateURL(url, 'setAppCallbackUrl')\n this.appCallbackUrl = url\n }\n\n setRedirectUrl(url: string): void {\n validateURL(url, 'setRedirectUrl');\n this.redirectUrl = url;\n }\n\n addContext(address: string, message: string): void {\n try {\n validateFunctionParams([\n { input: address, paramName: 'address', isString: true },\n { input: message, paramName: 'message', isString: true }\n ], 'addContext');\n this.context = { contextAddress: address, contextMessage: message };\n } catch (error) {\n logger.info(\"Error adding context\", error)\n throw new AddContextError(\"Error adding context\", error as Error)\n }\n }\n\n setParams(params: { [key: string]: string }): void {\n try {\n const requestedProof = this.getRequestedProof();\n if (!requestedProof || !this.requestedProof) {\n throw new BuildProofRequestError('Requested proof is not present.');\n }\n\n const currentParams = this.availableParams()\n if (!currentParams) {\n throw new NoProviderParamsError('No params present in the provider config.');\n }\n\n const paramsToSet = Object.keys(params)\n for (const param of paramsToSet) {\n if (!currentParams.includes(param)) {\n throw new InvalidParamError(\n `Cannot set parameter ${param} for provider ${this.providerId}. Available parameters: ${currentParams}`\n );\n }\n }\n this.requestedProof.parameters = { ...requestedProof.parameters, ...params }\n } catch (error) {\n logger.info('Error Setting Params:', error);\n throw new SetParamsError(\"Error setting params\", error as Error)\n }\n }\n\n // Getter methods\n getAppCallbackUrl(): string {\n try {\n validateFunctionParams([{ input: this.sessionId, paramName: 'sessionId', isString: true }], 'getAppCallbackUrl');\n return this.appCallbackUrl || `${constants.DEFAULT_RECLAIM_CALLBACK_URL}${this.sessionId}`\n } catch (error) {\n logger.info(\"Error getting app callback url\", error)\n throw new GetAppCallbackUrlError(\"Error getting app callback url\", error as Error)\n }\n }\n\n getStatusUrl(): string {\n try {\n validateFunctionParams([{ input: this.sessionId, paramName: 'sessionId', isString: true }], 'getStatusUrl');\n return `${constants.DEFAULT_RECLAIM_STATUS_URL}${this.sessionId}`\n } catch (error) {\n logger.info(\"Error fetching Status Url\", error)\n throw new GetStatusUrlError(\"Error fetching status url\", error as Error)\n }\n }\n\n // Private helper methods\n private setSignature(signature: string): void {\n try {\n validateFunctionParams([{ input: signature, paramName: 'signature', isString: true }], 'setSignature');\n this.signature = signature;\n logger.info(`Signature set successfully for applicationId: ${this.applicationId}`);\n } catch (error) {\n logger.info(\"Error setting signature\", error)\n throw new SetSignatureError(\"Error setting signature\", error as Error)\n }\n }\n\n private async generateSignature(applicationSecret: string): Promise<string> {\n try {\n const wallet = new ethers.Wallet(applicationSecret)\n const canonicalData = canonicalize({ providerId: this.providerId, timestamp: this.timeStamp });\n\n\n if (!canonicalData) {\n throw new SignatureGeneratingError('Failed to canonicalize data for signing.');\n }\n\n const messageHash = ethers.keccak256(new TextEncoder().encode(canonicalData));\n\n return await wallet.signMessage(ethers.getBytes(messageHash));\n } catch (err) {\n logger.info(`Error generating proof request for applicationId: ${this.applicationId}, providerId: ${this.providerId}, signature: ${this.signature}, timeStamp: ${this.timeStamp}`, err);\n throw new SignatureGeneratingError(`Error generating signature for applicationSecret: ${applicationSecret}`)\n }\n }\n\n private async buildProofRequest(provider: ProviderData): Promise<RequestedProof> {\n try {\n this.requestedProof = generateRequestedProof(provider);\n return this.requestedProof;\n } catch (err: Error | unknown) {\n logger.info(err instanceof Error ? err.message : String(err));\n throw new BuildProofRequestError('Something went wrong while generating proof request', err as Error);\n }\n }\n\n private getRequestedProof(): RequestedProof {\n if (!this.requestedProof) {\n throw new BuildProofRequestError('RequestedProof is not present in the instance.')\n }\n return this.requestedProof\n }\n\n private availableParams(): string[] {\n try {\n const requestedProofs = this.getRequestedProof();\n let availableParamsStore = Object.keys(requestedProofs.parameters)\n availableParamsStore = availableParamsStore.concat(requestedProofs.url\n .split(/{{(.*?)}}/)\n .filter((_: string, i: number) => i % 2))\n\n return [...new Set(availableParamsStore)];\n\n } catch (error) {\n logger.info(\"Error fetching available params\", error)\n throw new AvailableParamsError(\"Error fetching available params\", error as Error)\n }\n }\n\n private clearInterval(): void {\n if (this.sessionId && this.intervals.has(this.sessionId)) {\n clearInterval(this.intervals.get(this.sessionId) as NodeJS.Timeout)\n this.intervals.delete(this.sessionId)\n }\n }\n\n // Public methods\n toJsonString(options?: ProofRequestOptions): string {\n return JSON.stringify({\n applicationId: this.applicationId,\n providerId: this.providerId,\n sessionId: this.sessionId,\n context: this.context,\n requestedProof: this.requestedProof,\n appCallbackUrl: this.appCallbackUrl,\n signature: this.signature,\n redirectUrl: this.redirectUrl,\n timeStamp: this.timeStamp,\n options: this.options\n })\n }\n\n async getRequestUrl(): Promise<string> {\n logger.info('Creating Request Url')\n if (!this.signature) {\n throw new SignatureNotFoundError('Signature is not set.')\n }\n\n try {\n const requestedProof = this.getRequestedProof()\n validateSignature(this.providerId, this.signature, this.applicationId, this.timeStamp)\n\n const templateData: TemplateData = {\n sessionId: this.sessionId,\n providerId: this.providerId,\n applicationId: this.applicationId,\n signature: this.signature,\n timestamp: this.timeStamp,\n callbackUrl: this.getAppCallbackUrl(),\n context: JSON.stringify(this.context),\n parameters: getFilledParameters(requestedProof),\n redirectUrl: this.redirectUrl ?? '',\n acceptAiProviders: this.options?.acceptAiProviders ?? false\n }\n\n const link = await createLinkWithTemplateData(templateData)\n logger.info('Request Url created successfully: ' + link)\n await updateSession(this.sessionId, SessionStatus.SESSION_STARTED)\n return link\n } catch (error) {\n logger.info('Error creating Request Url:', error)\n throw error\n }\n }\n\n async startSession({ onSuccess, onError }: StartSessionParams): Promise<void> {\n const statusUrl = this.getStatusUrl()\n if (!statusUrl || !this.sessionId) {\n const message = \"Session can't be started due to undefined value of statusUrl and sessionId\"\n logger.info(message)\n throw new SessionNotStartedError(message)\n }\n\n logger.info('Starting session')\n const interval = setInterval(async () => {\n try {\n const res = await fetch(statusUrl)\n const data = await res.json()\n\n if (!data.session) return\n if (data.session.status === SessionStatus.PROOF_GENERATION_FAILED) throw new ProviderFailedError()\n if (data.session.proofs.length === 0) return\n\n const proof = data.session.proofs[0]\n const verified = await verifyProof(proof)\n if (!verified) {\n logger.info(`Proof not verified: ${proof}`)\n throw new ProofNotVerifiedError()\n }\n if (onSuccess) {\n onSuccess(proof)\n }\n this.clearInterval()\n } catch (e) {\n if (onError) {\n onError(e as Error)\n }\n this.clearInterval()\n }\n }, 3000)\n\n this.intervals.set(this.sessionId, interval)\n scheduleIntervalEndingTask(this.sessionId, this.intervals, onError)\n }\n}\n\n","function createErrorClass(name: string) {\n return class extends Error {\n constructor(message?: string, public innerError?: Error) {\n super(message);\n this.name = name;\n if (innerError) {\n this.stack += `\\nCaused by: ${innerError.stack}`;\n }\n }\n };\n}\n\nexport const TimeoutError = createErrorClass('TimeoutError');\nexport const ProofNotVerifiedError = createErrorClass('ProofNotVerifiedError');\nexport const SessionNotStartedError = createErrorClass('SessionNotStartedError');\nexport const ProviderNotFoundError = createErrorClass('ProviderNotFoundError');\nexport const BuildProofRequestError = createErrorClass('BuildProofRequestError');\nexport const SignatureGeneratingError = createErrorClass('SignatureGeneratingError');\nexport const SignatureNotFoundError = createErrorClass('SignatureNotFoundError');\nexport const InvalidSignatureError = createErrorClass('InvalidSignatureError');\nexport const UpdateSessionError = createErrorClass('UpdateSessionError');\nexport const InitSessionError = createErrorClass('InitSessionError');\nexport const ProviderFailedError = createErrorClass('ProviderFailedError');\nexport const InvalidParamError = createErrorClass('InvalidParamError');\nexport const ApplicationError = createErrorClass('ApplicationError');\nexport const InitError = createErrorClass('InitError');\nexport const AvailableParamsError = createErrorClass('AvailableParamsError')\nexport const BackendServerError = createErrorClass('BackendServerError');\nexport const GetStatusUrlError = createErrorClass('GetStatusUrlError');\nexport const NoProviderParamsError = createErrorClass('NoProviderParamsError');\nexport const SetParamsError = createErrorClass('SetParamsError');\nexport const AddContextError = createErrorClass('AddContextError');\nexport const SetSignatureError = createErrorClass('SetSignatureError');\nexport const GetAppCallbackUrlError = createErrorClass(\"GetAppCallbackUrlError\");\nexport const GetRequestUrlError = createErrorClass('GetRequestUrlError');","// Define the possible log levels\nexport type LogLevel = 'info' | 'warn' | 'error' | 'silent';\n\n// Define a simple logger class\nclass SimpleLogger {\n private level: LogLevel = 'info';\n\n setLevel(level: LogLevel) {\n this.level = level;\n }\n\n private shouldLog(messageLevel: LogLevel): boolean {\n const levels: LogLevel[] = ['error', 'warn', 'info', 'silent'];\n return levels.indexOf(this.level) >= levels.indexOf(messageLevel);\n }\n\n private log(level: LogLevel, message: string, ...args: any[]) {\n if (this.shouldLog(level) && this.level !== 'silent') {\n const logFunction = this.getLogFunction(level);\n console.log('current level', this.level);\n logFunction(`[${level.toUpperCase()}]`, message, ...args);\n }\n }\n\n private getLogFunction(level: LogLevel): (message?: any, ...optionalParams: any[]) => void {\n switch (level) {\n case 'error':\n return console.error;\n case 'warn':\n return console.warn;\n case 'info':\n return console.info;\n default:\n return () => {}; // No-op for 'silent'\n }\n }\n\n info(message: string, ...args: any[]) {\n this.log('info', message, ...args);\n }\n\n warn(message: string, ...args: any[]) {\n this.log('warn', message, ...args);\n }\n\n error(message: string, ...args: any[]) {\n this.log('error', message, ...args);\n }\n}\n\n// Create the logger instance\nconst logger = new SimpleLogger();\n\n// Function to set the log level\nexport function setLogLevel(level: LogLevel) {\n logger.setLevel(level);\n}\n\n// Export the logger instance and the setLogLevel function\nexport default {\n logger,\n setLogLevel\n};\n","import { OnError } from './types'\nimport { TimeoutError } from './errors'\nimport loggerModule from './logger'\nconst logger = loggerModule.logger\n\n/**\n * Escapes special characters in a string for use in a regular expression\n * @param string - The input string to escape\n * @returns The input string with special regex characters escaped\n */\nexport function escapeRegExp(string: string): string {\n return string.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'); // $& means the whole matched string\n}\n\n/**\n * Replaces all occurrences of a substring in a string\n * @param str - The original string\n * @param find - The substring to find\n * @param replace - The string to replace the found substrings with\n * @returns A new string with all occurrences of 'find' replaced by 'replace'\n */\nexport function replaceAll(str: string, find: string, replace: string): string {\n if (find === '') return str;\n return str.replace(new RegExp(escapeRegExp(find), 'g'), replace);\n}\n\n/**\n * Schedules a task to end an interval after a specified timeout\n * @param sessionId - The ID of the current session\n * @param intervals - A Map containing the intervals\n * @param onFailureCallback - Callback function to be called on failure\n * @param timeout - Timeout in milliseconds (default: 10 minutes)\n */\nexport function scheduleIntervalEndingTask(\n sessionId: string,\n intervals: Map<string, NodeJS.Timer>,\n onFailureCallback: OnError,\n timeout: number = 1000 * 60 * 10\n): void {\n setTimeout(() => {\n if (intervals.has(sessionId)) {\n const message = 'Interval ended without receiving proofs'\n onFailureCallback(new TimeoutError(message))\n logger.info(message)\n clearInterval(intervals.get(sessionId) as NodeJS.Timeout)\n intervals.delete(sessionId)\n }\n }, timeout)\n}\n","// Base URL for the backend API\nexport const BACKEND_BASE_URL = \"https://api.reclaimprotocol.org\";\n\n// Constant values used throughout the application\nexport const constants = {\n\n // Default callback URL for Reclaim protocol\n DEFAULT_RECLAIM_CALLBACK_URL: `${BACKEND_BASE_URL}/api/sdk/callback?callbackId=`,\n\n // Default status URL for Reclaim sessions\n DEFAULT_RECLAIM_STATUS_URL: `${BACKEND_BASE_URL}/api/sdk/session/`,\n\n // URL for sharing Reclaim templates\n RECLAIM_SHARE_URL: 'https://share.reclaimprotocol.org/verifier/?template='\n};\n","import { ethers } from \"ethers\";\nimport { InvalidParamError, InvalidSignatureError, ProviderNotFoundError } from \"./errors\";\nimport canonicalize from 'canonicalize'\nimport { Context, RequestedProof } from \"./interfaces\";\nimport loggerModule from './logger';\nimport { ProofRequestOptions } from \"./types\";\nconst logger = loggerModule.logger;\n\n/**\n * Validates function parameters based on specified criteria\n * @param params - An array of objects containing input, paramName, and optional isString flag\n * @param functionName - The name of the function being validated\n * @throws InvalidParamError if any parameter fails validation\n */\nexport function validateFunctionParams(params: { input: any, paramName: string, isString?: boolean }[], functionName: string): void {\n params.forEach(({ input, paramName, isString }) => {\n if (input == null) {\n logger.info(`Validation failed: ${paramName} in ${functionName} is null or undefined`);\n throw new InvalidParamError(`${paramName} passed to ${functionName} must not be null or undefined.`);\n }\n if (isString && typeof input !== 'string') {\n logger.info(`Validation failed: ${paramName} in ${functionName} is not a string`);\n throw new InvalidParamError(`${paramName} passed to ${functionName} must be a string.`);\n }\n if (isString && input.trim() === '') {\n logger.info(`Validation failed: ${paramName} in ${functionName} is an empty string`);\n throw new InvalidParamError(`${paramName} passed to ${functionName} must not be an empty string.`);\n }\n });\n}\n\n/**\n* Validates a URL string\n* @param url - The URL to validate\n* @param functionName - The name of the function calling this validation\n* @throws InvalidParamError if the URL is invalid or empty\n*/\nexport function validateURL(url: string, functionName: string): void {\n try {\n new URL(url);\n } catch (e) {\n logger.info(`URL validation failed for ${url} in ${functionName}: ${(e as Error).message}`);\n throw new InvalidParamError(`Invalid URL format ${url} passed to ${functionName}.`, e as Error);\n }\n}\n\n/**\n* Validates a signature against the provided application ID\n* @param providerId - The ID of the provider\n* @param signature - The signature to validate\n* @param applicationId - The expected application ID\n* @param timestamp - The timestamp of the signature\n* @throws InvalidSignatureError if the signature is invalid or doesn't match the application ID\n*/\nexport function validateSignature(providerId: string, signature: string, applicationId: string, timestamp: string): void {\n try {\n logger.info(`Starting signature validation for providerId: ${providerId}, applicationId: ${applicationId}, timestamp: ${timestamp}`);\n\n const message = canonicalize({ providerId, timestamp });\n if (!message) {\n logger.info('Failed to canonicalize message for signature validation');\n throw new Error('Failed to canonicalize message');\n }\n const messageHash = ethers.keccak256(new TextEncoder().encode(message));\n let appId = ethers.verifyMessage(\n ethers.getBytes(messageHash),\n ethers.hexlify(signature)\n ).toLowerCase();\n\n if (ethers.getAddress(appId) !== ethers.getAddress(applicationId)) {\n logger.info(`Signature validation failed: Mismatch between derived appId (${appId}) and provided applicationId (${applicationId})`);\n throw new InvalidSignatureError(`Signature does not match the application id: ${appId}`);\n }\n\n logger.info(`Signature validated successfully for applicationId: ${applicationId}`);\n } catch (err) {\n logger.info(`Signature validation failed: ${(err as Error).message}`);\n if (err instanceof InvalidSignatureError) {\n throw err;\n }\n throw new InvalidSignatureError(`Failed to validate signature: ${(err as Error).message}`);\n }\n}\n\n\n/**\n * Validates the requested proof object\n * @param requestedProof - The requested proof object to validate\n * @throws InvalidParamError if the requested proof object is not valid\n */\nexport function validateRequestedProof(requestedProof: RequestedProof): void {\n if (!requestedProof.url) {\n logger.info(`Requested proof validation failed: Provided url in requested proof is not valid`);\n throw new InvalidParamError(`The provided url in requested proof is not valid`);\n }\n\n if (requestedProof.parameters && typeof requestedProof.parameters !== 'object') {\n logger.info(`Requested proof validation failed: Provided parameters in requested proof is not valid`);\n throw new InvalidParamError(`The provided parameters in requested proof is not valid`);\n }\n}\n\n/**\n * Validates the context object\n * @param context - The context object to validate\n * @throws InvalidParamError if the context object is not valid\n */\nexport function validateContext(context: Context): void {\n if (!context.contextAddress) {\n logger.info(`Context validation failed: Provided context address in context is not valid`);\n throw new InvalidParamError(`The provided context address in context is not valid`);\n }\n\n if (!context.contextMessage) {\n logger.info(`Context validation failed: Provided context message in context is not valid`);\n throw new InvalidParamError(`The provided context message in context is not valid`);\n }\n\n validateFunctionParams([\n { input: context.contextAddress, paramName: 'contextAddress', isString: true },\n { input: context.contextMessage, paramName: 'contextMessage', isString: true }\n ], 'validateContext');\n}\n\n/**\n * Validates the options object\n * @param options - The options object to validate\n * @throws InvalidParamError if the options object is not valid\n */\nexport function validateOptions(options: ProofRequestOptions): void {\n if (options.acceptAiProviders && typeof options.acceptAiProviders !== 'boolean') {\n logger.info(`Options validation failed: Provided acceptAiProviders in options is not valid`);\n throw new InvalidParamError(`The provided acceptAiProviders in options is not valid`);\n }\n\n if (options.log && typeof options.log !== 'boolean') {\n logger.info(`Options validation failed: Provided log in options is not valid`);\n throw new InvalidParamError(`The provided log in options is not valid`);\n }\n}\n\n\n\n","import {\n InitSessionError,\n UpdateSessionError\n} from \"./errors\";\nimport { InitSessionResponse, SessionStatus } from \"./types\";\nimport { validateFunctionParams } from \"./validationUtils\";\nimport { BACKEND_BASE_URL } from './constants';\nimport loggerModule from './logger';\nconst logger = loggerModule.logger;\n\n/**\n * Initializes a session with the provided parameters\n * @param providerId - The ID of the provider\n * @param appId - The ID of the application\n * @param timestamp - The timestamp of the request\n * @param signature - The signature for authentication\n * @returns A promise that resolves to an InitSessionResponse\n * @throws InitSessionError if the session initialization fails\n */\nexport async function initSession(\n providerId: string,\n appId: string,\n timestamp: string,\n signature: string\n): Promise<InitSessionResponse> {\n logger.info(`Initializing session for providerId: ${providerId}, appId: ${appId}`);\n try {\n const response = await fetch(`${BACKEND_BASE_URL}/api/sdk/init-session/`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ providerId, appId, timestamp, signature })\n });\n\n const res = await response.json();\n\n if (!response.ok) {\n logger.info(`Session initialization failed: ${res.message || 'Unknown error'}`);\n throw new InitSessionError(res.message || `Error initializing session with providerId: ${providerId}`);\n }\n\n return res as InitSessionResponse;\n } catch (err) {\n logger.info(`Failed to initialize session for providerId: ${providerId}, appId: ${appId}`, err);\n throw err;\n }\n}\n\n/**\n * Updates the status of an existing session\n * @param sessionId - The ID of the session to update\n * @param status - The new status of the session\n * @returns A promise that resolves to the update response\n * @throws UpdateSessionError if the session update fails\n */\nexport async function updateSession(sessionId: string, status: SessionStatus) {\n logger.info(`Updating session status for sessionId: ${sessionId}, new status: ${status}`);\n validateFunctionParams(\n [{ input: sessionId, paramName: 'sessionId', isString: true }],\n 'updateSession'\n );\n\n try {\n const response = await fetch(`${BACKEND_BASE_URL}/api/sdk/update/session/`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ sessionId, status })\n });\n\n const res = await response.json();\n\n if (!response.ok) {\n const errorMessage = `Error updating session with sessionId: ${sessionId}. Status Code: ${response.status}`;\n logger.info(errorMessage, res);\n throw new UpdateSessionError(errorMessage);\n }\n\n logger.info(`Session status updated successfully for sessionId: ${sessionId}`);\n return res;\n } catch (err) {\n const errorMessage = `Failed to update session with sessionId: ${sessionId}`;\n logger.info(errorMessage, err);\n throw new UpdateSessionError(`Error updating session with sessionId: ${sessionId}`);\n }\n}","import { ethers } from \"ethers\";\nimport { Context, ProviderData, RequestedProof, WitnessData } from \"./interfaces\";\nimport { SignedClaim, TemplateData } from \"./types\";\nimport { createSignDataForClaim, fetchWitnessListForClaim } from \"../witness\";\nimport { BACKEND_BASE_URL, constants } from \"./constants\";\nimport { replaceAll } from \"./helper\";\nimport { validateURL } from \"./validationUtils\";\nimport { makeBeacon } from \"../smart-contract\";\nimport { ProofNotVerifiedError } from \"./errors\";\nimport loggerModule from './logger';\nconst logger = loggerModule.logger;\n\n/**\n * Generates the requested proof for a given provider\n * @param provider - The provider details\n * @returns RequestedProof object containing the generated proof request\n */\nexport function generateRequestedProof(provider: ProviderData): RequestedProof {\n const providerParams: { [key: string]: string } = {}\n provider.responseSelections.forEach(rs =>\n rs.responseMatch.split(/{{(.*?)}}/)\n .filter((_, i) => i % 2)\n .forEach(param => providerParams[param] = '')\n )\n const proof: RequestedProof = {\n url: provider.url,\n parameters: providerParams\n };\n\n return proof;\n}\n\n\n/**\n * Retrieves the parameters that have been filled with values from the requested proof\n * @param requestedProof - The requested proof object\n * @returns An object containing the parameters that have been filled with values\n */\nexport function getFilledParameters(requestedProof: RequestedProof): { [key: string]: string } {\n return Object.keys(requestedProof.parameters).reduce<{ [key: string]: string }>((acc, param) => {\n if (requestedProof.parameters[param]) {\n acc[param] = requestedProof.parameters[param];\n }\n return acc;\n }, {});\n}\n\n/**\n * Retrieves a shortened URL for the given URL\n * @param url - The URL to be shortened\n * @returns A promise that resolves to the shortened URL, or the original URL if shortening fails\n */\nexport async function getShortenedUrl(url: string): Promise<string> {\n logger.info(`Attempting to shorten URL: ${url}`);\n try {\n validateURL(url, 'getShortenedUrl')\n const response = await fetch(`${BACKEND_BASE_URL}/api/sdk/shortener`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ fullUrl: url })\n })\n const res = await response.json()\n if (!response.ok) {\n logger.info(`Failed to shorten URL: ${url}, Response: ${JSON.stringify(res)}`);\n return url;\n }\n const shortenedVerificationUrl = res.result.shortUrl\n return shortenedVerificationUrl\n } catch (err) {\n logger.info(`Error shortening URL: ${url}, Error: ${err}`);\n return url\n }\n}\n\n/**\n * Creates a link with embedded template data\n * @param templateData - The data to be embedded in the link\n * @returns A promise that resolves to the created link (shortened if possible)\n */\nexport async function createLinkWithTemplateData(templateData: TemplateData): Promise<string> {\n let template = encodeURIComponent(JSON.stringify(templateData))\n template = replaceAll(template, '(', '%28')\n template = replaceAll(template, ')', '%29')\n\n const fullLink = `${constants.RECLAIM_SHARE_URL}${template}`\n try {\n const shortenedLink = await getShortenedUrl(fullLink)\n return shortenedLink;\n } catch (err) {\n logger.info(`Error creating link for sessionId: ${templateData.sessionId}, Error: ${err}`);\n return fullLink;\n }\n}\n\n/**\n * Retrieves the list of witnesses for a given claim\n * @param epoch - The epoch number\n * @param identifier - The claim identifier\n * @param timestampS - The timestamp in seconds\n * @returns A promise that resolves to an array of witness addresses\n * @throws Error if no beacon is available\n */\nexport async function getWitnessesForClaim(\n epoch: number,\n identifier: string,\n timestampS: number\n): Promise<string[]> {\n const beacon = makeBeacon()\n if (!beacon) {\n logger.info('No beacon available for getting witnesses');\n throw new Error('No beacon available');\n }\n const state = await beacon.getState(epoch)\n const witnessList = fetchWitnessListForClaim(state, identifier, timestampS)\n const witnesses = witnessList.map((w: WitnessData) => w.id.toLowerCase())\n return witnesses;\n}\n\n/**\n * Recovers the signers' addresses from a signed claim\n * @param claim - The signed claim object\n * @param signatures - The signatures associated with the claim\n * @returns An array of recovered signer addresses\n */\nexport function recoverSignersOfSignedClaim({\n claim,\n signatures\n}: SignedClaim): string[] {\n const dataStr = createSignDataForClaim({ ...claim })\n const signers = signatures.map(signature =>\n ethers.verifyMessage(dataStr, ethers.hexlify(signature)).toLowerCase()\n )\n return signers;\n}\n\n/**\n * Asserts that a signed claim is valid by checking if all expected witnesses have signed\n * @param claim - The signed claim to validate\n * @param expectedWitnessAddresses - An array of expected witness addresses\n * @throws ProofNotVerifiedError if any expected witness signature is missing\n */\nexport function assertValidSignedClaim(\n claim: SignedClaim,\n expectedWitnessAddresses: string[]\n): void {\n const witnessAddresses = recoverSignersOfSignedClaim(claim)\n const witnessesNotSeen = new Set(expectedWitnessAddresses)\n for (const witness of witnessAddresses) {\n if (witnessesNotSeen.has(witness)) {\n witnessesNotSeen.delete(witness)\n }\n }\n\n if (witnessesNotSeen.size > 0) {\n const missingWitnesses = Array.from(witnessesNotSeen).join(', ');\n logger.info(`Claim validation failed. Missing signatures from: ${missingWitnesses}`);\n throw new ProofNotVerifiedError(\n `Missing signatures from ${missingWitnesses}`\n )\n }\n}","/* Autogenerated file. Do not edit manually. */\n/* tslint:disable */\n\nimport { Contract } from 'ethers';\n\nconst _abi = [\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: 'address',\n name: 'previousAdmin',\n type: 'address',\n },\n {\n indexed: false,\n internalType: 'address',\n name: 'newAdmin',\n type: 'address',\n },\n ],\n name: 'AdminChanged',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: 'address',\n name: 'beacon',\n type: 'address',\n },\n ],\n name: 'BeaconUpgraded',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n components: [\n {\n internalType: 'uint32',\n name: 'id',\n type: 'uint32',\n },\n {\n internalType: 'uint32',\n name: 'timestampStart',\n type: 'uint32',\n },\n {\n internalType: 'uint32',\n name: 'timestampEnd',\n type: 'uint32',\n },\n {\n components: [\n {\n internalType: 'address',\n name: 'addr',\n type: 'address',\n },\n {\n internalType: 'string',\n name: 'host',\n type: 'string',\n },\n ],\n internalType: 'struct Reclaim.Witness[]',\n name: 'witnesses',\n type: 'tuple[]',\n },\n {\n internalType: 'uint8',\n name: 'minimumWitnessesForClaimCreation',\n type: 'uint8',\n },\n ],\n indexed: false,\n internalType: 'struct Reclaim.Epoch',\n name: 'epoch',\n type: 'tuple',\n },\n ],\n name: 'EpochAdded',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: 'uint8',\n name: 'version',\n type: 'uint8',\n },\n ],\n name: 'Initialized',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: 'address',\n name: 'previousOwner',\n type: 'address',\n },\n {\n indexed: true,\n internalType: 'address',\n name: 'newOwner',\n type: 'address',\n },\n ],\n name: 'OwnershipTransferred',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: 'address',\n name: 'implementation',\n type: 'address',\n },\n ],\n name: 'Upgraded',\n type: 'event',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'witnessAddress',\n type: 'address',\n },\n {\n internalType: 'string',\n name: 'host',\n type: 'string',\n },\n ],\n name: 'addAsWitness',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [],\n name: 'addNewEpoch',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'uint32',\n name: 'epochNum',\n type: 'uint32',\n },\n {\n components: [\n {\n internalType: 'string',\n name: 'provider',\n type: 'string',\n },\n {\n internalType: 'string',\n name: 'parameters',\n type: 'string',\n },\n {\n internalType: 'string',\n name: 'context',\n type: 'string',\n },\n ],\n internalType: 'struct Claims.ClaimInfo',\n name: 'claimInfo',\n type: 'tuple',\n },\n {\n components: [\n {\n internalType: 'bytes32',\n name: 'identifier',\n type: 'bytes32',\n },\n {\n internalType: 'address',\n name: 'owner',\n type: 'address',\n },\n {\n internalType: 'uint32',\n name: 'timestampS',\n type: 'uint32',\n },\n {\n internalType: 'uint256',\n name: 'epoch',\n type: 'uint256',\n },\n ],\n internalType: 'struct Claims.CompleteClaimData',\n name: 'claimData',\n type: 'tuple',\n },\n {\n internalType: 'bytes[]',\n name: 'signatures',\n type: 'bytes[]',\n },\n ],\n name: 'assertValidEpochAndSignedClaim',\n outputs: [],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'currentEpoch',\n outputs: [\n {\n internalType: 'uint32',\n name: '',\n type: 'uint32',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'epochDurationS',\n outputs: [\n {\n internalType: 'uint32',\n name: '',\n type: 'uint32',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'uint256',\n name: '',\n type: 'uint256',\n },\n ],\n name: 'epochs',\n outputs: [\n {\n internalType: 'uint32',\n name: 'id',\n type: 'uint32',\n },\n {\n internalType: 'uint32',\n name: 'timestampStart',\n type: 'uint32',\n },\n {\n internalType: 'uint32',\n name: 'timestampEnd',\n type: 'uint32',\n },\n {\n internalType: 'uint8',\n name: 'minimumWitnessesForClaimCreation',\n type: 'uint8',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'uint32',\n name: 'epoch',\n type: 'uint32',\n },\n ],\n name: 'fetchEpoch',\n outputs: [\n {\n components: [\n {\n internalType: 'uint32',\n name: 'id',\n type: 'uint32',\n },\n {\n internalType: 'uint32',\n name: 'timestampStart',\n type: 'uint32',\n },\n {\n internalType: 'uint32',\n name: 'timestampEnd',\n type: 'uint32',\n },\n {\n components: [\n {\n internalType: 'address',\n name: 'addr',\n type: 'address',\n },\n {\n internalType: 'string',\n name: 'host',\n type: 'string',\n },\n ],\n internalType: 'struct Reclaim.Witness[]',\n name: 'witnesses',\n type: 'tuple[]',\n },\n {\n internalType: 'uint8',\n name: 'minimumWitnessesForClaimCreation',\n type: 'uint8',\n },\n ],\n internalType: 'struct Reclaim.Epoch',\n name: '',\n type: 'tuple',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'uint32',\n name: 'epoch',\n type: 'uint32',\n },\n {\n internalType: 'bytes32',\n name: 'identifier',\n type: 'bytes32',\n },\n {\n internalType: 'uint32',\n name: 'timestampS',\n type: 'uint32',\n },\n ],\n name: 'fetchWitnessesForClaim',\n outputs: [\n {\n components: [\n {\n internalType: 'address',\n name: 'addr',\n type: 'address',\n },\n {\n internalType: 'string',\n name: 'host',\n type: 'string',\n },\n ],\n internalType: 'struct Reclaim.Witness[]',\n name: '',\n type: 'tuple[]',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'initialize',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [],\n name: 'minimumWitnessesForClaimCreation',\n outputs: [\n {\n internalType: 'uint8',\n name: '',\n type: 'uint8',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'owner',\n outputs: [\n {\n internalType: 'address',\n name: '',\n type: 'address',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'proxiableUUID',\n outputs: [\n {\n internalType: 'bytes32',\n name: '',\n type: 'bytes32',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'witnessAddress',\n type: 'address',\n },\n ],\n name: 'removeAsWitness',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [],\n name: 'renounceOwnership',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'newOwner',\n type: 'address',\n },\n ],\n name: 'transferOwnership',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'addr',\n type: 'address',\n },\n {\n internalType: 'bool',\n name: 'isWhitelisted',\n type: 'bool',\n },\n ],\n name: 'updateWitnessWhitelist',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'newImplementation',\n type: 'address',\n },\n ],\n name: 'upgradeTo',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'newImplementation',\n type: 'address',\n },\n {\n internalType: 'bytes',\n name: 'data',\n type: 'bytes',\n },\n ],\n name: 'upgradeToAndCall',\n outputs: [],\n stateMutability: 'payable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'uint256',\n name: '',\n type: 'uint256',\n },\n ],\n name: 'witnesses',\n outputs: [\n {\n internalType: 'address',\n name: 'addr',\n type: 'address',\n },\n {\n internalType: 'string',\n name: 'host',\n type: 'string',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n] as const;\n\nexport class Reclaim__factory {\n static readonly abi = _abi;\n\n static connect(address: string, signerOrProvider: any): Contract {\n return new Contract(address, _abi, signerOrProvider);\n }\n}\n","{\n \"0x1a4\": {\n \"chainName\": \"opt-goerli\",\n \"address\": \"0xF93F605142Fb1Efad7Aa58253dDffF67775b4520\",\n \"rpcUrl\": \"https://opt-goerli.g.alchemy.com/v2/rksDkSUXd2dyk2ANy_zzODknx_AAokui\"\n },\n \"0xaa37dc\": {\n \"chainName\": \"opt-sepolia\",\n \"address\": \"0x6D0f81BDA11995f25921aAd5B43359630E65Ca96\",\n \"rpcUrl\": \"https://opt-sepolia.g.alchemy.com/v2/aO1-SfG4oFRLyAiLREqzyAUu0HTCwHgs\"\n}\n\n}\n","import type { Beacon, BeaconState } from './utils/interfaces';\nimport { Reclaim__factory as ReclaimFactory } from './contract-types';\nimport CONTRACTS_CONFIG from './contract-types/config.json';\nimport { Contract, ethers } from 'ethers';\n\nconst DEFAULT_CHAIN_ID = 11155420;\n\nexport function makeBeacon(chainId?: number): Beacon | undefined {\n chainId = chainId || DEFAULT_CHAIN_ID;\n const contract = getContract(chainId);\n if (contract) {\n return makeBeaconCacheable({\n async getState(epochId: number | undefined): Promise<BeaconState> {\n //@ts-ignore\n const epoch = await contract.fetchEpoch(epochId || 0);\n if (!epoch.id) {\n throw new Error(`Invalid epoch ID: ${epochId}`);\n }\n\n return {\n epoch: epoch.id,\n witnesses: epoch.witnesses.map((w: any) => ({\n id: w.addr.toLowerCase(),\n url: w.host,\n })),\n witnessesRequiredForClaim: epoch.minimumWitnessesForClaimCreation,\n nextEpochTimestampS: epoch.timestampEnd,\n };\n },\n });\n } else {\n return undefined;\n }\n}\n\nexport function makeBeaconCacheable(beacon: Beacon): Beacon {\n const cache: { [epochId: number]: Promise<BeaconState> } = {};\n\n return {\n ...beacon,\n async getState(epochId: number | undefined): Promise<BeaconState> {\n if (!epochId) {\n // TODO: add cache here\n const state = await beacon.getState();\n return state;\n }\n\n const key = epochId;\n\n if (!cache[key]) {\n cache[key] = beacon.getState(epochId);\n }\n\n return cache[key] as unknown as BeaconState;\n },\n };\n}\n\nconst existingContractsMap: { [chain: string]: Contract } = {};\n\nfunction getContract(chainId: number): Contract {\n const chainKey = `0x${chainId.toString(16)}`;\n if (!existingContractsMap[chainKey]) {\n const contractData =\n CONTRACTS_CONFIG[chainKey as keyof typeof CONTRACTS_CONFIG];\n if (!contractData) {\n throw new Error(`Unsupported chain: \"${chainKey}\"`);\n }\n\n const rpcProvider = new ethers.JsonRpcProvider(contractData.rpcUrl);\n existingContractsMap[chainKey] = ReclaimFactory.connect(\n contractData.address,\n rpcProvider\n );\n }\n\n return existingContractsMap[chainKey] as Contract;\n}\n"],"mappings":"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","names":["import_ethers","import_canonicalize","logger","import_ethers","logger","canonicalize","logger","import_ethers","import_ethers","import_ethers","logger","logger","canonicalize"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/witness.ts","../src/Reclaim.ts","../src/utils/errors.ts","../src/utils/logger.ts","../src/utils/helper.ts","../src/utils/constants.ts","../src/utils/validationUtils.ts","../src/utils/sessionUtils.ts","../src/utils/proofUtils.ts","../src/contract-types/contracts/factories/Reclaim__factory.ts","../src/contract-types/config.json","../src/smart-contract.ts"],"sourcesContent":["export * from './Reclaim';\nexport * from './utils/interfaces';","import { ethers } from 'ethers';\nimport type { WitnessData } from './utils/interfaces';\nimport type { ClaimID, ClaimInfo, CompleteClaimData } from './utils/types';\n\ntype BeaconState = {\n witnesses: WitnessData[];\n epoch: number;\n witnessesRequiredForClaim: number;\n nextEpochTimestampS: number;\n};\n\nexport function fetchWitnessListForClaim(\n { witnesses, witnessesRequiredForClaim, epoch }: BeaconState,\n params: string | ClaimInfo,\n timestampS: number\n): WitnessData[] {\n const identifier: ClaimID =\n typeof params === 'string' ? params : getIdentifierFromClaimInfo(params);\n const completeInput: string = [\n identifier,\n epoch.toString(),\n witnessesRequiredForClaim.toString(),\n timestampS.toString(),\n ].join('\\n');\n const completeHashStr: string = ethers.keccak256(strToUint8Array(completeInput));\n const completeHash: Uint8Array = ethers.getBytes(completeHashStr);\n const completeHashView: DataView = uint8ArrayToDataView(completeHash);\n const witnessesLeft: WitnessData[] = [...witnesses];\n const selectedWitnesses: WitnessData[] = [];\n let byteOffset: number = 0;\n for (let i = 0; i < witnessesRequiredForClaim; i++) {\n const randomSeed: number = completeHashView.getUint32(byteOffset);\n const witnessIndex: number = randomSeed % witnessesLeft.length;\n const witness: WitnessData = witnessesLeft[witnessIndex];\n selectedWitnesses.push(witness);\n\n witnessesLeft[witnessIndex] = witnessesLeft[witnessesLeft.length - 1];\n witnessesLeft.pop();\n byteOffset = (byteOffset + 4) % completeHash.length;\n }\n\n return selectedWitnesses;\n}\n\nexport function getIdentifierFromClaimInfo(info: ClaimInfo): ClaimID {\n const str: string = `${info.provider}\\n${info.parameters}\\n${info.context || ''}`;\n return ethers.keccak256(strToUint8Array(str)).toLowerCase();\n}\n\nexport function strToUint8Array(str: string): Uint8Array {\n return new TextEncoder().encode(str);\n}\n\nexport function uint8ArrayToDataView(arr: Uint8Array): DataView {\n return new DataView(arr.buffer, arr.byteOffset, arr.byteLength);\n}\n\nexport function createSignDataForClaim(data: CompleteClaimData): string {\n const identifier: ClaimID =\n 'identifier' in data ? data.identifier : getIdentifierFromClaimInfo(data);\n const lines: string[] = [\n identifier,\n data.owner.toLowerCase(),\n data.timestampS.toString(),\n data.epoch.toString(),\n ];\n\n return lines.join('\\n');\n}\n","import type { Proof, RequestedProof, Context, ProviderData } from './utils/interfaces'\nimport { getIdentifierFromClaimInfo } from './witness'\nimport type {\n SignedClaim,\n ProofRequestOptions,\n StartSessionParams,\n ProofPropertiesJSON,\n TemplateData\n} from './utils/types'\nimport { SessionStatus } from './utils/types'\nimport { ethers } from 'ethers'\nimport canonicalize from 'canonicalize'\nimport {\n replaceAll,\n scheduleIntervalEndingTask\n} from './utils/helper'\nimport { constants } from './utils/constants'\nimport {\n AddContextError,\n AvailableParamsError,\n BuildProofRequestError,\n GetAppCallbackUrlError,\n GetStatusUrlError,\n InitError,\n InvalidParamError,\n NoProviderParamsError,\n ProofNotVerifiedError,\n ProviderFailedError,\n SessionNotStartedError,\n SetParamsError,\n SetSignatureError,\n SignatureGeneratingError,\n SignatureNotFoundError} from './utils/errors'\nimport { validateContext, validateFunctionParams, validateRequestedProof, validateSignature, validateURL } from './utils/validationUtils'\nimport { fetchStatusUrl, initSession, updateSession } from './utils/sessionUtils'\nimport { assertValidSignedClaim, createLinkWithTemplateData, generateRequestedProof, getFilledParameters, getWitnessesForClaim } from './utils/proofUtils'\nimport loggerModule from './utils/logger';\nconst logger = loggerModule.logger\n\n\nexport async function verifyProof(proof: Proof): Promise<boolean> {\n if (!proof.signatures.length) {\n throw new SignatureNotFoundError('No signatures')\n }\n\n try {\n // check if witness array exist and first element is manual-verify\n let witnesses = []\n if (proof.witnesses.length && proof.witnesses[0]?.url === 'manual-verify') {\n witnesses.push(proof.witnesses[0].id)\n } else {\n witnesses = await getWitnessesForClaim(\n proof.claimData.epoch,\n proof.identifier,\n proof.claimData.timestampS\n )\n }\n // then hash the claim info with the encoded ctx to get the identifier\n const calculatedIdentifier = getIdentifierFromClaimInfo({\n parameters: JSON.parse(\n canonicalize(proof.claimData.parameters) as string\n ),\n provider: proof.claimData.provider,\n context: proof.claimData.context\n })\n proof.identifier = replaceAll(proof.identifier, '\"', '')\n // check if the identifier matches the one in the proof\n if (calculatedIdentifier !== proof.identifier) {\n throw new ProofNotVerifiedError('Identifier Mismatch')\n }\n\n const signedClaim: SignedClaim = {\n claim: {\n ...proof.claimData\n },\n signatures: proof.signatures.map(signature => {\n return ethers.getBytes(signature)\n })\n }\n\n assertValidSignedClaim(signedClaim, witnesses)\n } catch (e: Error | unknown) {\n logger.info(`Error verifying proof: ${e instanceof Error ? e.message : String(e)}`)\n return false\n }\n\n return true\n}\n\nexport function transformForOnchain(proof: Proof): { claimInfo: any, signedClaim: any } {\n const claimInfoBuilder = new Map([\n ['context', proof.claimData.context],\n ['parameters', proof.claimData.parameters],\n ['provider', proof.claimData.provider],\n ]);\n const claimInfo = Object.fromEntries(claimInfoBuilder);\n const claimBuilder = new Map<string, number | string>([\n ['epoch', proof.claimData.epoch],\n ['identifier', proof.claimData.identifier],\n ['owner', proof.claimData.owner],\n ['timestampS', proof.claimData.timestampS],\n ]);\n const signedClaim = {\n claim: Object.fromEntries(claimBuilder),\n signatures: proof.signatures,\n };\n return { claimInfo, signedClaim };\n}\n\nexport class ReclaimProofRequest {\n // Private class properties\n private applicationId: string;\n private signature?: string;\n private appCallbackUrl?: string;\n private sessionId: string;\n private options?: ProofRequestOptions;\n private context: Context = { contextAddress: '0x0', contextMessage: 'sample context' };\n private requestedProof?: RequestedProof;\n private providerId: string;\n private redirectUrl?: string;\n private intervals: Map<string, NodeJS.Timer> = new Map();\n private timeStamp: string;\n\n // Private constructor\n private constructor(applicationId: string, providerId: string, options?: ProofRequestOptions) {\n this.providerId = providerId;\n this.timeStamp = Date.now().toString();\n this.applicationId = applicationId;\n this.sessionId = \"\";\n if (options?.log) {\n loggerModule.setLogLevel('info');\n } else {\n loggerModule.setLogLevel('silent');\n }\n this.options = options;\n logger.info(`Initializing client with applicationId: ${this.applicationId}`);\n }\n\n // Static initialization methods\n static async init(applicationId: string, appSecret: string, providerId: string, options?: ProofRequestOptions): Promise<ReclaimProofRequest> {\n try {\n validateFunctionParams([\n { paramName: 'applicationId', input: applicationId, isString: true },\n { paramName: 'providerId', input: providerId, isString: true },\n { paramName: 'appSecret', input: appSecret, isString: true }\n ], 'the constructor')\n\n // check if options is provided and validate each property of options\n if (options) {\n if (options.acceptAiProviders) {\n validateFunctionParams([\n { paramName: 'acceptAiProviders', input: options.acceptAiProviders }\n ], 'the constructor')\n }\n if (options.log) {\n validateFunctionParams([\n { paramName: 'log', input: options.log }\n ], 'the constructor')\n }\n\n }\n\n const proofRequestInstance = new ReclaimProofRequest(applicationId, providerId, options)\n\n const signature = await proofRequestInstance.generateSignature(appSecret)\n proofRequestInstance.setSignature(signature)\n\n const data = await initSession(providerId, applicationId, proofRequestInstance.timeStamp, signature);\n proofRequestInstance.sessionId = data.sessionId\n\n await proofRequestInstance.buildProofRequest(data.provider)\n\n return proofRequestInstance\n } catch (error) {\n logger.info('Failed to initialize ReclaimProofRequest', error as Error);\n throw new InitError('Failed to initialize ReclaimProofRequest', error as Error)\n }\n }\n\n static async fromJsonString(jsonString: string): Promise<ReclaimProofRequest> {\n try {\n const {\n applicationId,\n providerId,\n sessionId,\n context,\n requestedProof,\n signature,\n redirectUrl,\n timeStamp,\n appCallbackUrl,\n options\n }: ProofPropertiesJSON = JSON.parse(jsonString)\n\n validateFunctionParams([\n { input: applicationId, paramName: 'applicationId', isString: true },\n { input: providerId, paramName: 'providerId', isString: true },\n { input: signature, paramName: 'signature', isString: true },\n { input: sessionId, paramName: 'sessionId', isString: true },\n { input: timeStamp, paramName: 'timeStamp', isString: true },\n ], 'fromJsonString');\n\n validateRequestedProof(requestedProof);\n\n if (redirectUrl) {\n validateURL(redirectUrl, 'fromJsonString');\n }\n\n if (appCallbackUrl) {\n validateURL(appCallbackUrl, 'fromJsonString');\n }\n\n if (context) {\n validateContext(context);\n }\n\n const proofRequestInstance = new ReclaimProofRequest(applicationId, providerId, options);\n proofRequestInstance.sessionId = sessionId;\n proofRequestInstance.context = context;\n proofRequestInstance.requestedProof = requestedProof\n proofRequestInstance.appCallbackUrl = appCallbackUrl\n proofRequestInstance.redirectUrl = redirectUrl\n proofRequestInstance.timeStamp = timeStamp\n proofRequestInstance.signature = signature\n\n return proofRequestInstance\n } catch (error) {\n logger.info('Failed to parse JSON string in fromJsonString:', error);\n throw new InvalidParamError('Invalid JSON string provided to fromJsonString');\n }\n }\n\n // Setter methods\n setAppCallbackUrl(url: string): void {\n validateURL(url, 'setAppCallbackUrl')\n this.appCallbackUrl = url\n }\n\n setRedirectUrl(url: string): void {\n validateURL(url, 'setRedirectUrl');\n this.redirectUrl = url;\n }\n\n addContext(address: string, message: string): void {\n try {\n validateFunctionParams([\n { input: address, paramName: 'address', isString: true },\n { input: message, paramName: 'message', isString: true }\n ], 'addContext');\n this.context = { contextAddress: address, contextMessage: message };\n } catch (error) {\n logger.info(\"Error adding context\", error)\n throw new AddContextError(\"Error adding context\", error as Error)\n }\n }\n\n setParams(params: { [key: string]: string }): void {\n try {\n const requestedProof = this.getRequestedProof();\n if (!requestedProof || !this.requestedProof) {\n throw new BuildProofRequestError('Requested proof is not present.');\n }\n\n const currentParams = this.availableParams()\n if (!currentParams) {\n throw new NoProviderParamsError('No params present in the provider config.');\n }\n\n const paramsToSet = Object.keys(params)\n for (const param of paramsToSet) {\n if (!currentParams.includes(param)) {\n throw new InvalidParamError(\n `Cannot set parameter ${param} for provider ${this.providerId}. Available parameters: ${currentParams}`\n );\n }\n }\n this.requestedProof.parameters = { ...requestedProof.parameters, ...params }\n } catch (error) {\n logger.info('Error Setting Params:', error);\n throw new SetParamsError(\"Error setting params\", error as Error)\n }\n }\n\n // Getter methods\n getAppCallbackUrl(): string {\n try {\n validateFunctionParams([{ input: this.sessionId, paramName: 'sessionId', isString: true }], 'getAppCallbackUrl');\n return this.appCallbackUrl || `${constants.DEFAULT_RECLAIM_CALLBACK_URL}${this.sessionId}`\n } catch (error) {\n logger.info(\"Error getting app callback url\", error)\n throw new GetAppCallbackUrlError(\"Error getting app callback url\", error as Error)\n }\n }\n\n getStatusUrl(): string {\n try {\n validateFunctionParams([{ input: this.sessionId, paramName: 'sessionId', isString: true }], 'getStatusUrl');\n return `${constants.DEFAULT_RECLAIM_STATUS_URL}${this.sessionId}`\n } catch (error) {\n logger.info(\"Error fetching Status Url\", error)\n throw new GetStatusUrlError(\"Error fetching status url\", error as Error)\n }\n }\n\n // Private helper methods\n private setSignature(signature: string): void {\n try {\n validateFunctionParams([{ input: signature, paramName: 'signature', isString: true }], 'setSignature');\n this.signature = signature;\n logger.info(`Signature set successfully for applicationId: ${this.applicationId}`);\n } catch (error) {\n logger.info(\"Error setting signature\", error)\n throw new SetSignatureError(\"Error setting signature\", error as Error)\n }\n }\n\n private async generateSignature(applicationSecret: string): Promise<string> {\n try {\n const wallet = new ethers.Wallet(applicationSecret)\n const canonicalData = canonicalize({ providerId: this.providerId, timestamp: this.timeStamp });\n\n\n if (!canonicalData) {\n throw new SignatureGeneratingError('Failed to canonicalize data for signing.');\n }\n\n const messageHash = ethers.keccak256(new TextEncoder().encode(canonicalData));\n\n return await wallet.signMessage(ethers.getBytes(messageHash));\n } catch (err) {\n logger.info(`Error generating proof request for applicationId: ${this.applicationId}, providerId: ${this.providerId}, signature: ${this.signature}, timeStamp: ${this.timeStamp}`, err);\n throw new SignatureGeneratingError(`Error generating signature for applicationSecret: ${applicationSecret}`)\n }\n }\n\n private async buildProofRequest(provider: ProviderData): Promise<RequestedProof> {\n try {\n this.requestedProof = generateRequestedProof(provider);\n return this.requestedProof;\n } catch (err: Error | unknown) {\n logger.info(err instanceof Error ? err.message : String(err));\n throw new BuildProofRequestError('Something went wrong while generating proof request', err as Error);\n }\n }\n\n private getRequestedProof(): RequestedProof {\n if (!this.requestedProof) {\n throw new BuildProofRequestError('RequestedProof is not present in the instance.')\n }\n return this.requestedProof\n }\n\n private availableParams(): string[] {\n try {\n const requestedProofs = this.getRequestedProof();\n let availableParamsStore = Object.keys(requestedProofs.parameters)\n availableParamsStore = availableParamsStore.concat(requestedProofs.url\n .split(/{{(.*?)}}/)\n .filter((_: string, i: number) => i % 2))\n\n return [...new Set(availableParamsStore)];\n\n } catch (error) {\n logger.info(\"Error fetching available params\", error)\n throw new AvailableParamsError(\"Error fetching available params\", error as Error)\n }\n }\n\n private clearInterval(): void {\n if (this.sessionId && this.intervals.has(this.sessionId)) {\n clearInterval(this.intervals.get(this.sessionId) as NodeJS.Timeout)\n this.intervals.delete(this.sessionId)\n }\n }\n\n // Public methods\n toJsonString(options?: ProofRequestOptions): string {\n return JSON.stringify({\n applicationId: this.applicationId,\n providerId: this.providerId,\n sessionId: this.sessionId,\n context: this.context,\n requestedProof: this.requestedProof,\n appCallbackUrl: this.appCallbackUrl,\n signature: this.signature,\n redirectUrl: this.redirectUrl,\n timeStamp: this.timeStamp,\n options: this.options\n })\n }\n\n async getRequestUrl(): Promise<string> {\n logger.info('Creating Request Url')\n if (!this.signature) {\n throw new SignatureNotFoundError('Signature is not set.')\n }\n\n try {\n const requestedProof = this.getRequestedProof()\n validateSignature(this.providerId, this.signature, this.applicationId, this.timeStamp)\n\n const templateData: TemplateData = {\n sessionId: this.sessionId,\n providerId: this.providerId,\n applicationId: this.applicationId,\n signature: this.signature,\n timestamp: this.timeStamp,\n callbackUrl: this.getAppCallbackUrl(),\n context: JSON.stringify(this.context),\n parameters: getFilledParameters(requestedProof),\n redirectUrl: this.redirectUrl ?? '',\n acceptAiProviders: this.options?.acceptAiProviders ?? false\n }\n\n const link = await createLinkWithTemplateData(templateData)\n logger.info('Request Url created successfully: ' + link)\n await updateSession(this.sessionId, SessionStatus.SESSION_STARTED)\n return link\n } catch (error) {\n logger.info('Error creating Request Url:', error)\n throw error\n }\n }\n\n async startSession({ onSuccess, onError }: StartSessionParams): Promise<void> {\n if (!this.sessionId) {\n const message = \"Session can't be started due to undefined value of statusUrl and sessionId\"\n logger.info(message)\n throw new SessionNotStartedError(message)\n }\n\n logger.info('Starting session')\n const interval = setInterval(async () => {\n try {\n const statusUrlResponse = await fetchStatusUrl(this.sessionId)\n\n if (!statusUrlResponse.session) return\n if (statusUrlResponse.session.statusV2 === SessionStatus.PROOF_GENERATION_FAILED) throw new ProviderFailedError()\n if (!statusUrlResponse.session.proofs || statusUrlResponse.session.proofs.length === 0) return\n\n const proof = statusUrlResponse.session.proofs[0]\n const verified = await verifyProof(proof)\n if (!verified) {\n logger.info(`Proof not verified: ${proof}`)\n throw new ProofNotVerifiedError()\n }\n if (onSuccess) {\n onSuccess(proof)\n }\n this.clearInterval()\n } catch (e) {\n if (onError) {\n onError(e as Error)\n }\n this.clearInterval()\n }\n }, 3000)\n\n this.intervals.set(this.sessionId, interval)\n scheduleIntervalEndingTask(this.sessionId, this.intervals, onError)\n }\n}\n\n","function createErrorClass(name: string) {\n return class extends Error {\n constructor(message?: string, public innerError?: Error) {\n super(message);\n this.name = name;\n if (innerError) {\n this.stack += `\\nCaused by: ${innerError.stack}`;\n }\n }\n };\n}\n\nexport const TimeoutError = createErrorClass('TimeoutError');\nexport const ProofNotVerifiedError = createErrorClass('ProofNotVerifiedError');\nexport const SessionNotStartedError = createErrorClass('SessionNotStartedError');\nexport const ProviderNotFoundError = createErrorClass('ProviderNotFoundError');\nexport const BuildProofRequestError = createErrorClass('BuildProofRequestError');\nexport const SignatureGeneratingError = createErrorClass('SignatureGeneratingError');\nexport const SignatureNotFoundError = createErrorClass('SignatureNotFoundError');\nexport const InvalidSignatureError = createErrorClass('InvalidSignatureError');\nexport const UpdateSessionError = createErrorClass('UpdateSessionError');\nexport const InitSessionError = createErrorClass('InitSessionError');\nexport const ProviderFailedError = createErrorClass('ProviderFailedError');\nexport const InvalidParamError = createErrorClass('InvalidParamError');\nexport const ApplicationError = createErrorClass('ApplicationError');\nexport const InitError = createErrorClass('InitError');\nexport const AvailableParamsError = createErrorClass('AvailableParamsError')\nexport const BackendServerError = createErrorClass('BackendServerError');\nexport const GetStatusUrlError = createErrorClass('GetStatusUrlError');\nexport const NoProviderParamsError = createErrorClass('NoProviderParamsError');\nexport const SetParamsError = createErrorClass('SetParamsError');\nexport const AddContextError = createErrorClass('AddContextError');\nexport const SetSignatureError = createErrorClass('SetSignatureError');\nexport const GetAppCallbackUrlError = createErrorClass(\"GetAppCallbackUrlError\");\nexport const GetRequestUrlError = createErrorClass('GetRequestUrlError');\nexport const StatusUrlError = createErrorClass('StatusUrlError');","// Define the possible log levels\nexport type LogLevel = 'info' | 'warn' | 'error' | 'silent';\n\n// Define a simple logger class\nclass SimpleLogger {\n private level: LogLevel = 'info';\n\n setLevel(level: LogLevel) {\n this.level = level;\n }\n\n private shouldLog(messageLevel: LogLevel): boolean {\n const levels: LogLevel[] = ['error', 'warn', 'info', 'silent'];\n return levels.indexOf(this.level) >= levels.indexOf(messageLevel);\n }\n\n private log(level: LogLevel, message: string, ...args: any[]) {\n if (this.shouldLog(level) && this.level !== 'silent') {\n const logFunction = this.getLogFunction(level);\n console.log('current level', this.level);\n logFunction(`[${level.toUpperCase()}]`, message, ...args);\n }\n }\n\n private getLogFunction(level: LogLevel): (message?: any, ...optionalParams: any[]) => void {\n switch (level) {\n case 'error':\n return console.error;\n case 'warn':\n return console.warn;\n case 'info':\n return console.info;\n default:\n return () => {}; // No-op for 'silent'\n }\n }\n\n info(message: string, ...args: any[]) {\n this.log('info', message, ...args);\n }\n\n warn(message: string, ...args: any[]) {\n this.log('warn', message, ...args);\n }\n\n error(message: string, ...args: any[]) {\n this.log('error', message, ...args);\n }\n}\n\n// Create the logger instance\nconst logger = new SimpleLogger();\n\n// Function to set the log level\nexport function setLogLevel(level: LogLevel) {\n logger.setLevel(level);\n}\n\n// Export the logger instance and the setLogLevel function\nexport default {\n logger,\n setLogLevel\n};\n","import { OnError } from './types'\nimport { TimeoutError } from './errors'\nimport loggerModule from './logger'\nconst logger = loggerModule.logger\n\n/**\n * Escapes special characters in a string for use in a regular expression\n * @param string - The input string to escape\n * @returns The input string with special regex characters escaped\n */\nexport function escapeRegExp(string: string): string {\n return string.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'); // $& means the whole matched string\n}\n\n/**\n * Replaces all occurrences of a substring in a string\n * @param str - The original string\n * @param find - The substring to find\n * @param replace - The string to replace the found substrings with\n * @returns A new string with all occurrences of 'find' replaced by 'replace'\n */\nexport function replaceAll(str: string, find: string, replace: string): string {\n if (find === '') return str;\n return str.replace(new RegExp(escapeRegExp(find), 'g'), replace);\n}\n\n/**\n * Schedules a task to end an interval after a specified timeout\n * @param sessionId - The ID of the current session\n * @param intervals - A Map containing the intervals\n * @param onFailureCallback - Callback function to be called on failure\n * @param timeout - Timeout in milliseconds (default: 10 minutes)\n */\nexport function scheduleIntervalEndingTask(\n sessionId: string,\n intervals: Map<string, NodeJS.Timer>,\n onFailureCallback: OnError,\n timeout: number = 1000 * 60 * 10\n): void {\n setTimeout(() => {\n if (intervals.has(sessionId)) {\n const message = 'Interval ended without receiving proofs'\n onFailureCallback(new TimeoutError(message))\n logger.info(message)\n clearInterval(intervals.get(sessionId) as NodeJS.Timeout)\n intervals.delete(sessionId)\n }\n }, timeout)\n}\n","// Base URL for the backend API\nexport const BACKEND_BASE_URL = \"https://api.reclaimprotocol.org\";\n\n// Constant values used throughout the application\nexport const constants = {\n\n // Default callback URL for Reclaim protocol\n DEFAULT_RECLAIM_CALLBACK_URL: `${BACKEND_BASE_URL}/api/sdk/callback?callbackId=`,\n\n // Default status URL for Reclaim sessions\n DEFAULT_RECLAIM_STATUS_URL: `${BACKEND_BASE_URL}/api/sdk/session/`,\n\n // URL for sharing Reclaim templates\n RECLAIM_SHARE_URL: 'https://share.reclaimprotocol.org/verifier/?template='\n};\n","import { ethers } from \"ethers\";\nimport { InvalidParamError, InvalidSignatureError, ProviderNotFoundError } from \"./errors\";\nimport canonicalize from 'canonicalize'\nimport { Context, RequestedProof } from \"./interfaces\";\nimport loggerModule from './logger';\nimport { ProofRequestOptions } from \"./types\";\nconst logger = loggerModule.logger;\n\n/**\n * Validates function parameters based on specified criteria\n * @param params - An array of objects containing input, paramName, and optional isString flag\n * @param functionName - The name of the function being validated\n * @throws InvalidParamError if any parameter fails validation\n */\nexport function validateFunctionParams(params: { input: any, paramName: string, isString?: boolean }[], functionName: string): void {\n params.forEach(({ input, paramName, isString }) => {\n if (input == null) {\n logger.info(`Validation failed: ${paramName} in ${functionName} is null or undefined`);\n throw new InvalidParamError(`${paramName} passed to ${functionName} must not be null or undefined.`);\n }\n if (isString && typeof input !== 'string') {\n logger.info(`Validation failed: ${paramName} in ${functionName} is not a string`);\n throw new InvalidParamError(`${paramName} passed to ${functionName} must be a string.`);\n }\n if (isString && input.trim() === '') {\n logger.info(`Validation failed: ${paramName} in ${functionName} is an empty string`);\n throw new InvalidParamError(`${paramName} passed to ${functionName} must not be an empty string.`);\n }\n });\n}\n\n/**\n* Validates a URL string\n* @param url - The URL to validate\n* @param functionName - The name of the function calling this validation\n* @throws InvalidParamError if the URL is invalid or empty\n*/\nexport function validateURL(url: string, functionName: string): void {\n try {\n new URL(url);\n } catch (e) {\n logger.info(`URL validation failed for ${url} in ${functionName}: ${(e as Error).message}`);\n throw new InvalidParamError(`Invalid URL format ${url} passed to ${functionName}.`, e as Error);\n }\n}\n\n/**\n* Validates a signature against the provided application ID\n* @param providerId - The ID of the provider\n* @param signature - The signature to validate\n* @param applicationId - The expected application ID\n* @param timestamp - The timestamp of the signature\n* @throws InvalidSignatureError if the signature is invalid or doesn't match the application ID\n*/\nexport function validateSignature(providerId: string, signature: string, applicationId: string, timestamp: string): void {\n try {\n logger.info(`Starting signature validation for providerId: ${providerId}, applicationId: ${applicationId}, timestamp: ${timestamp}`);\n\n const message = canonicalize({ providerId, timestamp });\n if (!message) {\n logger.info('Failed to canonicalize message for signature validation');\n throw new Error('Failed to canonicalize message');\n }\n const messageHash = ethers.keccak256(new TextEncoder().encode(message));\n let appId = ethers.verifyMessage(\n ethers.getBytes(messageHash),\n ethers.hexlify(signature)\n ).toLowerCase();\n\n if (ethers.getAddress(appId) !== ethers.getAddress(applicationId)) {\n logger.info(`Signature validation failed: Mismatch between derived appId (${appId}) and provided applicationId (${applicationId})`);\n throw new InvalidSignatureError(`Signature does not match the application id: ${appId}`);\n }\n\n logger.info(`Signature validated successfully for applicationId: ${applicationId}`);\n } catch (err) {\n logger.info(`Signature validation failed: ${(err as Error).message}`);\n if (err instanceof InvalidSignatureError) {\n throw err;\n }\n throw new InvalidSignatureError(`Failed to validate signature: ${(err as Error).message}`);\n }\n}\n\n\n/**\n * Validates the requested proof object\n * @param requestedProof - The requested proof object to validate\n * @throws InvalidParamError if the requested proof object is not valid\n */\nexport function validateRequestedProof(requestedProof: RequestedProof): void {\n if (!requestedProof.url) {\n logger.info(`Requested proof validation failed: Provided url in requested proof is not valid`);\n throw new InvalidParamError(`The provided url in requested proof is not valid`);\n }\n\n if (requestedProof.parameters && typeof requestedProof.parameters !== 'object') {\n logger.info(`Requested proof validation failed: Provided parameters in requested proof is not valid`);\n throw new InvalidParamError(`The provided parameters in requested proof is not valid`);\n }\n}\n\n/**\n * Validates the context object\n * @param context - The context object to validate\n * @throws InvalidParamError if the context object is not valid\n */\nexport function validateContext(context: Context): void {\n if (!context.contextAddress) {\n logger.info(`Context validation failed: Provided context address in context is not valid`);\n throw new InvalidParamError(`The provided context address in context is not valid`);\n }\n\n if (!context.contextMessage) {\n logger.info(`Context validation failed: Provided context message in context is not valid`);\n throw new InvalidParamError(`The provided context message in context is not valid`);\n }\n\n validateFunctionParams([\n { input: context.contextAddress, paramName: 'contextAddress', isString: true },\n { input: context.contextMessage, paramName: 'contextMessage', isString: true }\n ], 'validateContext');\n}\n\n/**\n * Validates the options object\n * @param options - The options object to validate\n * @throws InvalidParamError if the options object is not valid\n */\nexport function validateOptions(options: ProofRequestOptions): void {\n if (options.acceptAiProviders && typeof options.acceptAiProviders !== 'boolean') {\n logger.info(`Options validation failed: Provided acceptAiProviders in options is not valid`);\n throw new InvalidParamError(`The provided acceptAiProviders in options is not valid`);\n }\n\n if (options.log && typeof options.log !== 'boolean') {\n logger.info(`Options validation failed: Provided log in options is not valid`);\n throw new InvalidParamError(`The provided log in options is not valid`);\n }\n}\n\n\n\n","import {\n InitSessionError,\n UpdateSessionError,\n StatusUrlError\n} from \"./errors\";\nimport { InitSessionResponse, SessionStatus, StatusUrlResponse } from \"./types\";\nimport { validateFunctionParams } from \"./validationUtils\";\nimport { BACKEND_BASE_URL, constants } from './constants';\nimport loggerModule from './logger';\nconst logger = loggerModule.logger;\n\n/**\n * Initializes a session with the provided parameters\n * @param providerId - The ID of the provider\n * @param appId - The ID of the application\n * @param timestamp - The timestamp of the request\n * @param signature - The signature for authentication\n * @returns A promise that resolves to an InitSessionResponse\n * @throws InitSessionError if the session initialization fails\n */\nexport async function initSession(\n providerId: string,\n appId: string,\n timestamp: string,\n signature: string\n): Promise<InitSessionResponse> {\n logger.info(`Initializing session for providerId: ${providerId}, appId: ${appId}`);\n try {\n const response = await fetch(`${BACKEND_BASE_URL}/api/sdk/init-session/`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ providerId, appId, timestamp, signature })\n });\n\n const res = await response.json();\n\n if (!response.ok) {\n logger.info(`Session initialization failed: ${res.message || 'Unknown error'}`);\n throw new InitSessionError(res.message || `Error initializing session with providerId: ${providerId}`);\n }\n\n return res as InitSessionResponse;\n } catch (err) {\n logger.info(`Failed to initialize session for providerId: ${providerId}, appId: ${appId}`, err);\n throw err;\n }\n}\n\n/**\n * Updates the status of an existing session\n * @param sessionId - The ID of the session to update\n * @param status - The new status of the session\n * @returns A promise that resolves to the update response\n * @throws UpdateSessionError if the session update fails\n */\nexport async function updateSession(sessionId: string, status: SessionStatus) {\n logger.info(`Updating session status for sessionId: ${sessionId}, new status: ${status}`);\n validateFunctionParams(\n [{ input: sessionId, paramName: 'sessionId', isString: true }],\n 'updateSession'\n );\n\n try {\n const response = await fetch(`${BACKEND_BASE_URL}/api/sdk/update/session/`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ sessionId, status })\n });\n\n const res = await response.json();\n\n if (!response.ok) {\n const errorMessage = `Error updating session with sessionId: ${sessionId}. Status Code: ${response.status}`;\n logger.info(errorMessage, res);\n throw new UpdateSessionError(errorMessage);\n }\n\n logger.info(`Session status updated successfully for sessionId: ${sessionId}`);\n return res;\n } catch (err) {\n const errorMessage = `Failed to update session with sessionId: ${sessionId}`;\n logger.info(errorMessage, err);\n throw new UpdateSessionError(`Error updating session with sessionId: ${sessionId}`);\n }\n}\n\n/**\n * Fetches the status URL for a given session ID\n * @param sessionId - The ID of the session to fetch the status URL for\n * @returns A promise that resolves to a StatusUrlResponse\n * @throws StatusUrlError if the status URL fetch fails\n */\nexport async function fetchStatusUrl(sessionId: string): Promise<StatusUrlResponse> {\n validateFunctionParams(\n [{ input: sessionId, paramName: 'sessionId', isString: true }],\n 'fetchStatusUrl'\n );\n\n try {\n const response = await fetch(`${constants.DEFAULT_RECLAIM_STATUS_URL}${sessionId}`, {\n method: 'GET',\n headers: { 'Content-Type': 'application/json' }\n });\n\n const res = await response.json();\n\n if (!response.ok) {\n const errorMessage = `Error fetching status URL for sessionId: ${sessionId}. Status Code: ${response.status}`;\n logger.info(errorMessage, res);\n throw new StatusUrlError(errorMessage);\n }\n\n return res as StatusUrlResponse;\n } catch (err) {\n const errorMessage = `Failed to fetch status URL for sessionId: ${sessionId}`;\n logger.info(errorMessage, err);\n throw new StatusUrlError(`Error fetching status URL for sessionId: ${sessionId}`);\n }\n}\n\n\n","import { ethers } from \"ethers\";\nimport { Context, ProviderData, RequestedProof, WitnessData } from \"./interfaces\";\nimport { SignedClaim, TemplateData } from \"./types\";\nimport { createSignDataForClaim, fetchWitnessListForClaim } from \"../witness\";\nimport { BACKEND_BASE_URL, constants } from \"./constants\";\nimport { replaceAll } from \"./helper\";\nimport { validateURL } from \"./validationUtils\";\nimport { makeBeacon } from \"../smart-contract\";\nimport { ProofNotVerifiedError } from \"./errors\";\nimport loggerModule from './logger';\nconst logger = loggerModule.logger;\n\n/**\n * Generates the requested proof for a given provider\n * @param provider - The provider details\n * @returns RequestedProof object containing the generated proof request\n */\nexport function generateRequestedProof(provider: ProviderData): RequestedProof {\n const providerParams: { [key: string]: string } = {}\n provider.responseSelections.forEach(rs =>\n rs.responseMatch.split(/{{(.*?)}}/)\n .filter((_, i) => i % 2)\n .forEach(param => providerParams[param] = '')\n )\n const proof: RequestedProof = {\n url: provider.url,\n parameters: providerParams\n };\n\n return proof;\n}\n\n\n/**\n * Retrieves the parameters that have been filled with values from the requested proof\n * @param requestedProof - The requested proof object\n * @returns An object containing the parameters that have been filled with values\n */\nexport function getFilledParameters(requestedProof: RequestedProof): { [key: string]: string } {\n return Object.keys(requestedProof.parameters).reduce<{ [key: string]: string }>((acc, param) => {\n if (requestedProof.parameters[param]) {\n acc[param] = requestedProof.parameters[param];\n }\n return acc;\n }, {});\n}\n\n/**\n * Retrieves a shortened URL for the given URL\n * @param url - The URL to be shortened\n * @returns A promise that resolves to the shortened URL, or the original URL if shortening fails\n */\nexport async function getShortenedUrl(url: string): Promise<string> {\n logger.info(`Attempting to shorten URL: ${url}`);\n try {\n validateURL(url, 'getShortenedUrl')\n const response = await fetch(`${BACKEND_BASE_URL}/api/sdk/shortener`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ fullUrl: url })\n })\n const res = await response.json()\n if (!response.ok) {\n logger.info(`Failed to shorten URL: ${url}, Response: ${JSON.stringify(res)}`);\n return url;\n }\n const shortenedVerificationUrl = res.result.shortUrl\n return shortenedVerificationUrl\n } catch (err) {\n logger.info(`Error shortening URL: ${url}, Error: ${err}`);\n return url\n }\n}\n\n/**\n * Creates a link with embedded template data\n * @param templateData - The data to be embedded in the link\n * @returns A promise that resolves to the created link (shortened if possible)\n */\nexport async function createLinkWithTemplateData(templateData: TemplateData): Promise<string> {\n let template = encodeURIComponent(JSON.stringify(templateData))\n template = replaceAll(template, '(', '%28')\n template = replaceAll(template, ')', '%29')\n\n const fullLink = `${constants.RECLAIM_SHARE_URL}${template}`\n try {\n const shortenedLink = await getShortenedUrl(fullLink)\n return shortenedLink;\n } catch (err) {\n logger.info(`Error creating link for sessionId: ${templateData.sessionId}, Error: ${err}`);\n return fullLink;\n }\n}\n\n/**\n * Retrieves the list of witnesses for a given claim\n * @param epoch - The epoch number\n * @param identifier - The claim identifier\n * @param timestampS - The timestamp in seconds\n * @returns A promise that resolves to an array of witness addresses\n * @throws Error if no beacon is available\n */\nexport async function getWitnessesForClaim(\n epoch: number,\n identifier: string,\n timestampS: number\n): Promise<string[]> {\n const beacon = makeBeacon()\n if (!beacon) {\n logger.info('No beacon available for getting witnesses');\n throw new Error('No beacon available');\n }\n const state = await beacon.getState(epoch)\n const witnessList = fetchWitnessListForClaim(state, identifier, timestampS)\n const witnesses = witnessList.map((w: WitnessData) => w.id.toLowerCase())\n return witnesses;\n}\n\n/**\n * Recovers the signers' addresses from a signed claim\n * @param claim - The signed claim object\n * @param signatures - The signatures associated with the claim\n * @returns An array of recovered signer addresses\n */\nexport function recoverSignersOfSignedClaim({\n claim,\n signatures\n}: SignedClaim): string[] {\n const dataStr = createSignDataForClaim({ ...claim })\n const signers = signatures.map(signature =>\n ethers.verifyMessage(dataStr, ethers.hexlify(signature)).toLowerCase()\n )\n return signers;\n}\n\n/**\n * Asserts that a signed claim is valid by checking if all expected witnesses have signed\n * @param claim - The signed claim to validate\n * @param expectedWitnessAddresses - An array of expected witness addresses\n * @throws ProofNotVerifiedError if any expected witness signature is missing\n */\nexport function assertValidSignedClaim(\n claim: SignedClaim,\n expectedWitnessAddresses: string[]\n): void {\n const witnessAddresses = recoverSignersOfSignedClaim(claim)\n const witnessesNotSeen = new Set(expectedWitnessAddresses)\n for (const witness of witnessAddresses) {\n if (witnessesNotSeen.has(witness)) {\n witnessesNotSeen.delete(witness)\n }\n }\n\n if (witnessesNotSeen.size > 0) {\n const missingWitnesses = Array.from(witnessesNotSeen).join(', ');\n logger.info(`Claim validation failed. Missing signatures from: ${missingWitnesses}`);\n throw new ProofNotVerifiedError(\n `Missing signatures from ${missingWitnesses}`\n )\n }\n}","/* Autogenerated file. Do not edit manually. */\n/* tslint:disable */\n\nimport { Contract } from 'ethers';\n\nconst _abi = [\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: 'address',\n name: 'previousAdmin',\n type: 'address',\n },\n {\n indexed: false,\n internalType: 'address',\n name: 'newAdmin',\n type: 'address',\n },\n ],\n name: 'AdminChanged',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: 'address',\n name: 'beacon',\n type: 'address',\n },\n ],\n name: 'BeaconUpgraded',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n components: [\n {\n internalType: 'uint32',\n name: 'id',\n type: 'uint32',\n },\n {\n internalType: 'uint32',\n name: 'timestampStart',\n type: 'uint32',\n },\n {\n internalType: 'uint32',\n name: 'timestampEnd',\n type: 'uint32',\n },\n {\n components: [\n {\n internalType: 'address',\n name: 'addr',\n type: 'address',\n },\n {\n internalType: 'string',\n name: 'host',\n type: 'string',\n },\n ],\n internalType: 'struct Reclaim.Witness[]',\n name: 'witnesses',\n type: 'tuple[]',\n },\n {\n internalType: 'uint8',\n name: 'minimumWitnessesForClaimCreation',\n type: 'uint8',\n },\n ],\n indexed: false,\n internalType: 'struct Reclaim.Epoch',\n name: 'epoch',\n type: 'tuple',\n },\n ],\n name: 'EpochAdded',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: 'uint8',\n name: 'version',\n type: 'uint8',\n },\n ],\n name: 'Initialized',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: 'address',\n name: 'previousOwner',\n type: 'address',\n },\n {\n indexed: true,\n internalType: 'address',\n name: 'newOwner',\n type: 'address',\n },\n ],\n name: 'OwnershipTransferred',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: 'address',\n name: 'implementation',\n type: 'address',\n },\n ],\n name: 'Upgraded',\n type: 'event',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'witnessAddress',\n type: 'address',\n },\n {\n internalType: 'string',\n name: 'host',\n type: 'string',\n },\n ],\n name: 'addAsWitness',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [],\n name: 'addNewEpoch',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'uint32',\n name: 'epochNum',\n type: 'uint32',\n },\n {\n components: [\n {\n internalType: 'string',\n name: 'provider',\n type: 'string',\n },\n {\n internalType: 'string',\n name: 'parameters',\n type: 'string',\n },\n {\n internalType: 'string',\n name: 'context',\n type: 'string',\n },\n ],\n internalType: 'struct Claims.ClaimInfo',\n name: 'claimInfo',\n type: 'tuple',\n },\n {\n components: [\n {\n internalType: 'bytes32',\n name: 'identifier',\n type: 'bytes32',\n },\n {\n internalType: 'address',\n name: 'owner',\n type: 'address',\n },\n {\n internalType: 'uint32',\n name: 'timestampS',\n type: 'uint32',\n },\n {\n internalType: 'uint256',\n name: 'epoch',\n type: 'uint256',\n },\n ],\n internalType: 'struct Claims.CompleteClaimData',\n name: 'claimData',\n type: 'tuple',\n },\n {\n internalType: 'bytes[]',\n name: 'signatures',\n type: 'bytes[]',\n },\n ],\n name: 'assertValidEpochAndSignedClaim',\n outputs: [],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'currentEpoch',\n outputs: [\n {\n internalType: 'uint32',\n name: '',\n type: 'uint32',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'epochDurationS',\n outputs: [\n {\n internalType: 'uint32',\n name: '',\n type: 'uint32',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'uint256',\n name: '',\n type: 'uint256',\n },\n ],\n name: 'epochs',\n outputs: [\n {\n internalType: 'uint32',\n name: 'id',\n type: 'uint32',\n },\n {\n internalType: 'uint32',\n name: 'timestampStart',\n type: 'uint32',\n },\n {\n internalType: 'uint32',\n name: 'timestampEnd',\n type: 'uint32',\n },\n {\n internalType: 'uint8',\n name: 'minimumWitnessesForClaimCreation',\n type: 'uint8',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'uint32',\n name: 'epoch',\n type: 'uint32',\n },\n ],\n name: 'fetchEpoch',\n outputs: [\n {\n components: [\n {\n internalType: 'uint32',\n name: 'id',\n type: 'uint32',\n },\n {\n internalType: 'uint32',\n name: 'timestampStart',\n type: 'uint32',\n },\n {\n internalType: 'uint32',\n name: 'timestampEnd',\n type: 'uint32',\n },\n {\n components: [\n {\n internalType: 'address',\n name: 'addr',\n type: 'address',\n },\n {\n internalType: 'string',\n name: 'host',\n type: 'string',\n },\n ],\n internalType: 'struct Reclaim.Witness[]',\n name: 'witnesses',\n type: 'tuple[]',\n },\n {\n internalType: 'uint8',\n name: 'minimumWitnessesForClaimCreation',\n type: 'uint8',\n },\n ],\n internalType: 'struct Reclaim.Epoch',\n name: '',\n type: 'tuple',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'uint32',\n name: 'epoch',\n type: 'uint32',\n },\n {\n internalType: 'bytes32',\n name: 'identifier',\n type: 'bytes32',\n },\n {\n internalType: 'uint32',\n name: 'timestampS',\n type: 'uint32',\n },\n ],\n name: 'fetchWitnessesForClaim',\n outputs: [\n {\n components: [\n {\n internalType: 'address',\n name: 'addr',\n type: 'address',\n },\n {\n internalType: 'string',\n name: 'host',\n type: 'string',\n },\n ],\n internalType: 'struct Reclaim.Witness[]',\n name: '',\n type: 'tuple[]',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'initialize',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [],\n name: 'minimumWitnessesForClaimCreation',\n outputs: [\n {\n internalType: 'uint8',\n name: '',\n type: 'uint8',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'owner',\n outputs: [\n {\n internalType: 'address',\n name: '',\n type: 'address',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'proxiableUUID',\n outputs: [\n {\n internalType: 'bytes32',\n name: '',\n type: 'bytes32',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'witnessAddress',\n type: 'address',\n },\n ],\n name: 'removeAsWitness',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [],\n name: 'renounceOwnership',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'newOwner',\n type: 'address',\n },\n ],\n name: 'transferOwnership',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'addr',\n type: 'address',\n },\n {\n internalType: 'bool',\n name: 'isWhitelisted',\n type: 'bool',\n },\n ],\n name: 'updateWitnessWhitelist',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'newImplementation',\n type: 'address',\n },\n ],\n name: 'upgradeTo',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'newImplementation',\n type: 'address',\n },\n {\n internalType: 'bytes',\n name: 'data',\n type: 'bytes',\n },\n ],\n name: 'upgradeToAndCall',\n outputs: [],\n stateMutability: 'payable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'uint256',\n name: '',\n type: 'uint256',\n },\n ],\n name: 'witnesses',\n outputs: [\n {\n internalType: 'address',\n name: 'addr',\n type: 'address',\n },\n {\n internalType: 'string',\n name: 'host',\n type: 'string',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n] as const;\n\nexport class Reclaim__factory {\n static readonly abi = _abi;\n\n static connect(address: string, signerOrProvider: any): Contract {\n return new Contract(address, _abi, signerOrProvider);\n }\n}\n","{\n \"0x1a4\": {\n \"chainName\": \"opt-goerli\",\n \"address\": \"0xF93F605142Fb1Efad7Aa58253dDffF67775b4520\",\n \"rpcUrl\": \"https://opt-goerli.g.alchemy.com/v2/rksDkSUXd2dyk2ANy_zzODknx_AAokui\"\n },\n \"0xaa37dc\": {\n \"chainName\": \"opt-sepolia\",\n \"address\": \"0x6D0f81BDA11995f25921aAd5B43359630E65Ca96\",\n \"rpcUrl\": \"https://opt-sepolia.g.alchemy.com/v2/aO1-SfG4oFRLyAiLREqzyAUu0HTCwHgs\"\n}\n\n}\n","import type { Beacon, BeaconState } from './utils/interfaces';\nimport { Reclaim__factory as ReclaimFactory } from './contract-types';\nimport CONTRACTS_CONFIG from './contract-types/config.json';\nimport { Contract, ethers } from 'ethers';\n\nconst DEFAULT_CHAIN_ID = 11155420;\n\nexport function makeBeacon(chainId?: number): Beacon | undefined {\n chainId = chainId || DEFAULT_CHAIN_ID;\n const contract = getContract(chainId);\n if (contract) {\n return makeBeaconCacheable({\n async getState(epochId: number | undefined): Promise<BeaconState> {\n //@ts-ignore\n const epoch = await contract.fetchEpoch(epochId || 0);\n if (!epoch.id) {\n throw new Error(`Invalid epoch ID: ${epochId}`);\n }\n\n return {\n epoch: epoch.id,\n witnesses: epoch.witnesses.map((w: any) => ({\n id: w.addr.toLowerCase(),\n url: w.host,\n })),\n witnessesRequiredForClaim: epoch.minimumWitnessesForClaimCreation,\n nextEpochTimestampS: epoch.timestampEnd,\n };\n },\n });\n } else {\n return undefined;\n }\n}\n\nexport function makeBeaconCacheable(beacon: Beacon): Beacon {\n const cache: { [epochId: number]: Promise<BeaconState> } = {};\n\n return {\n ...beacon,\n async getState(epochId: number | undefined): Promise<BeaconState> {\n if (!epochId) {\n // TODO: add cache here\n const state = await beacon.getState();\n return state;\n }\n\n const key = epochId;\n\n if (!cache[key]) {\n cache[key] = beacon.getState(epochId);\n }\n\n return cache[key] as unknown as BeaconState;\n },\n };\n}\n\nconst existingContractsMap: { [chain: string]: Contract } = {};\n\nfunction getContract(chainId: number): Contract {\n const chainKey = `0x${chainId.toString(16)}`;\n if (!existingContractsMap[chainKey]) {\n const contractData =\n CONTRACTS_CONFIG[chainKey as keyof typeof CONTRACTS_CONFIG];\n if (!contractData) {\n throw new Error(`Unsupported chain: \"${chainKey}\"`);\n }\n\n const rpcProvider = new ethers.JsonRpcProvider(contractData.rpcUrl);\n existingContractsMap[chainKey] = ReclaimFactory.connect(\n contractData.address,\n rpcProvider\n );\n }\n\n return existingContractsMap[chainKey] as Contract;\n}\n"],"mappings":"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","names":["import_ethers","import_canonicalize","logger","import_ethers","logger","canonicalize","logger","import_ethers","import_ethers","import_ethers","logger","logger","canonicalize"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@reclaimprotocol/js-sdk",
3
- "version": "2.0.1",
3
+ "version": "2.0.3",
4
4
  "description": "Designed to request proofs from the Reclaim protocol and manage the flow of claims and witness interactions.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -0,0 +1,4 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!-- Do not edit this file with editors other than draw.io -->
3
+ <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
4
+ <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="413px" height="137px" viewBox="-0.5 -0.5 413 137" content="&lt;mxfile host=&quot;app.diagrams.net&quot; modified=&quot;2023-12-12T10:56:37.870Z&quot; agent=&quot;Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36&quot; etag=&quot;5c-IEuCihH7OA-rWiBcE&quot; version=&quot;22.1.7&quot; type=&quot;google&quot;&gt;&lt;diagram name=&quot;Page-1&quot; id=&quot;Bim3TOI_uKPudQwilAti&quot;&gt;zZbLjtsgFIafxstGBwO+LJvMdCpVlapm0XZJbRqjcUyEya1PXzxAbIaZKholTZXEsX8OmPP93BK8WB8eFNs0n2XN2ySF+pDguyRNUVZm5m9Qjl7JcquslKidNgpL8Zs7EZy6FTXvg0AtZavFJhQr2XW80oHGlJL7MOyXbMO3btiKR8KyYm2sfhO1bqxapPmof+Ri1fg3m5RtyZr5YJdJ37Ba7icSvk/wQkmp7d36sODtQM9zsfU+vFJ66pjinT6nQmor7Fi7dbl95VXLxNqIy7tPrpP66DPfN0Lz5YZVw/Pe2Jvgea+VfDyBMCnM4164ju240vwwkVyvHrhcc62OJsSXUmKr7EfAuePbTNhiF8acpatTS2PW5sYl/jIEHEHYmgF2w9yxS9TPD4CIBULoOjBIBKNineyEGf3DPLwZlLSEM6DAdaDQCArXDVf97XC8QzfE4dud8IhIVFu140M8ekLAlH4/rLxGMKPJxMx5V3vlZyurx0E6CP3dPMOMApQII1JiCpm5usIfrj3DTR1PkRnGhNDSfn3pEAp/Y93Lrap4sAyaXq6452QlXgdbQeyH4i3TYhfuDC/BfapqMmbHScBGik73EftT++fZga5rB5oBIJICoe6TTeyAWZFCaRZnXOA8z7LQHVKWeUlzioxHZZFZIy9hD/nH9riWvwzCOAsxCWdhDs+stA2+2dh4e77wPAMAArQgBFF/zQNzSwQpzjAYk81MpPi5vXlOswKMscMPXcpd+l+4S0Nz3SHujeaax/FYZ8PH0zG+/wM=&lt;/diagram&gt;&lt;/mxfile&gt;" style="background-color: rgb(255, 255, 255);"><defs/><g><rect x="165" y="1" width="77" height="34" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-width="2" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 75px; height: 1px; padding-top: 18px; margin-left: 166px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Reclaim SDK</div></div></div></foreignObject><text x="204" y="22" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Reclaim SDK</text></switch></g><rect x="148" y="101" width="111" height="34" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-width="2" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 109px; height: 1px; padding-top: 118px; margin-left: 149px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">uuid</div></div></div></foreignObject><text x="203" y="122" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">uuid</text></switch></g><rect x="301" y="101" width="110" height="34" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-width="2" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 108px; height: 1px; padding-top: 118px; margin-left: 302px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">canonicalize</div></div></div></foreignObject><text x="356" y="122" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">canonicalize</text></switch></g><rect x="1" y="101" width="110" height="34" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-width="2" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 108px; height: 1px; padding-top: 118px; margin-left: 2px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">ethers</div></div></div></foreignObject><text x="56" y="122" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">ethers</text></switch></g><path d="M 203.57 35 Q 203.57 35 203.57 92.88" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 203.57 99.88 L 200.07 92.88 L 207.07 92.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 242 28.88 Q 351 71 354.65 92.99" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 355.79 99.9 L 351.2 93.56 L 358.1 92.42 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 165 31.96 Q 61 70 57.11 93" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 55.94 99.9 L 53.66 92.41 L 60.56 93.58 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g><switch><g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/><a transform="translate(0,-5)" xlink:href="https://www.drawio.com/doc/faq/svg-export-text-problems" target="_blank"><text text-anchor="middle" font-size="10px" x="50%" y="100%">Text is not SVG - cannot display</text></a></switch></svg>
@@ -0,0 +1 @@
1
+ <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="1039" height="762"><desc>participant%20AppClip%2FInstanApp%0Aparticipant%20User%0Aparticipant%20SDK%20Sample%20Web%20App%0Aparticipant%20Reclaim%20SDK%0A%0AUser-%3ESDK%20Sample%20Web%20App%3A%20ask%20to%20provide%20proof%0A%0ASDK%20Sample%20Web%20App-%3EReclaim%20SDK%3A%20requestProof(request%2C%20AppCallbackUrl)%0Aactivate%20Reclaim%20SDK%0AReclaim%20SDK-%3EReclaim%20SDK%3A%20Validate%20request%0AReclaim%20SDK-%3EReclaim%20SDK%3A%20Generate%20Template%20Instance%0AReclaim%20SDK--%3ESDK%20Sample%20Web%20App%3A%20TemplateInstance%0Adeactivate%20Reclaim%20SDK%0ASDK%20Sample%20Web%20App-%3ESDK%20Sample%20Web%20App%3A%20Generate%20QrCode%20from%20template%0A%0AUser--%3ESDK%20Sample%20Web%20App%3A%20Scan%20QrCode%0A%0ASDK%20Sample%20Web%20App--%3EAppClip%2FInstanApp%3A%20Open%20AppClip%2FInstanApp%0A%0AAppClip%2FInstanApp-%3EAppClip%2FInstanApp%3A%20complete%20verification%20task%0A%0AAppClip%2FInstanApp-%3ESDK%20Sample%20Web%20App%3A%20Submit%20Proof%20using%20AppCallbackUrl%0A%0ASDK%20Sample%20Web%20App--%3EUser%3A%20notify%20user%20(proof%20received)%0A</desc><defs/><g><g/><g/><g/><g/><g/><g/><g/><g/><g/><g/><g/><g><rect fill="white" stroke="none" x="0" y="0" width="1039" height="762"/></g><g/><g><path fill="none" stroke="black" paint-order="fill stroke markers" d=" M 88.59873290331642 59.284222437999986 L 88.59873290331642 762.954518438" stroke-miterlimit="10" stroke-width="1.4659797833333332" stroke-dasharray="13.532121076923076,5.863919133333333"/><path fill="none" stroke="black" paint-order="fill stroke markers" d=" M 285.4386060077435 59.284222437999986 L 285.4386060077435 762.954518438" stroke-miterlimit="10" stroke-width="1.4659797833333332" stroke-dasharray="13.532121076923076,5.863919133333333"/><path fill="none" stroke="black" paint-order="fill stroke markers" d=" M 506.7163531173789 59.284222437999986 L 506.7163531173789 762.954518438" stroke-miterlimit="10" stroke-width="1.4659797833333332" stroke-dasharray="13.532121076923076,5.863919133333333"/><path fill="none" stroke="black" paint-order="fill stroke markers" d=" M 814.1986855920534 59.284222437999986 L 814.1986855920534 762.954518438" stroke-miterlimit="10" stroke-width="1.4659797833333332" stroke-dasharray="13.532121076923076,5.863919133333333"/></g><g><path fill="none" stroke="none"/><g><path fill="white" stroke="black" paint-order="fill stroke markers" d=" M 8.795878700000003 11.786477457999997 L 168.40158710663283 11.786477457999997 L 168.40158710663283 59.284222437999986 L 8.795878700000003 59.284222437999986 L 8.795878700000003 11.786477457999997 Z" stroke-miterlimit="10" stroke-width="2.814681184" stroke-dasharray=""/></g><g><g/><text fill="black" stroke="none" font-family="sans-serif" font-size="11pt" font-style="normal" font-weight="normal" text-decoration="normal" x="27.88293547900001" y="41.692465037999995" text-anchor="start" dominant-baseline="alphabetic" xml:space="preserve">AppClip/InstanApp</text></g><path fill="none" stroke="none"/><g><path fill="white" stroke="black" paint-order="fill stroke markers" d=" M 250.87553604514974 11.786477457999997 L 320.00167597033726 11.786477457999997 L 320.00167597033726 59.284222437999986 L 250.87553604514974 59.284222437999986 L 250.87553604514974 11.786477457999997 Z" stroke-miterlimit="10" stroke-width="2.814681184" stroke-dasharray=""/></g><g><g/><text fill="black" stroke="none" font-family="sans-serif" font-size="11pt" font-style="normal" font-weight="normal" text-decoration="normal" x="269.96259282414974" y="41.692465037999995" text-anchor="start" dominant-baseline="alphabetic" xml:space="preserve">User</text></g><path fill="none" stroke="none"/><g><path fill="white" stroke="black" paint-order="fill stroke markers" d=" M 413.6099863408203 11.786477457999997 L 599.8227198939375 11.786477457999997 L 599.8227198939375 59.284222437999986 L 413.6099863408203 59.284222437999986 L 413.6099863408203 11.786477457999997 Z" stroke-miterlimit="10" stroke-width="2.814681184" stroke-dasharray=""/></g><g><g/><text fill="black" stroke="none" font-family="sans-serif" font-size="11pt" font-style="normal" font-weight="normal" text-decoration="normal" x="432.6970431198203" y="41.692465037999995" text-anchor="start" dominant-baseline="alphabetic" xml:space="preserve">SDK Sample Web App</text></g><path fill="none" stroke="none"/><g><path fill="white" stroke="black" paint-order="fill stroke markers" d=" M 751.5289643233073 11.786477457999997 L 876.8684068607995 11.786477457999997 L 876.8684068607995 59.284222437999986 L 751.5289643233073 59.284222437999986 L 751.5289643233073 11.786477457999997 Z" stroke-miterlimit="10" stroke-width="2.814681184" stroke-dasharray=""/></g><g><g/><text fill="black" stroke="none" font-family="sans-serif" font-size="11pt" font-style="normal" font-weight="normal" text-decoration="normal" x="770.6160211023073" y="41.692465037999995" text-anchor="start" dominant-baseline="alphabetic" xml:space="preserve">Reclaim SDK</text></g></g><g><path fill="white" stroke="black" paint-order="fill stroke markers" d=" M 805.4028068920534 166.593942578 L 822.9945642920534 166.593942578 L 822.9945642920534 360.103273978 L 805.4028068920534 360.103273978 L 805.4028068920534 166.593942578" stroke-miterlimit="10" stroke-width="1.4659797833333332" stroke-dasharray=""/><g><g><rect fill="white" stroke="none" x="329.0615110575416" y="94.46773723799998" width="134.03193701003906" height="22.86928462"/></g><text fill="black" stroke="none" font-family="sans-serif" font-size="11pt" font-style="normal" font-weight="normal" text-decoration="normal" x="331.70027466754163" y="110.30031889799997" text-anchor="start" dominant-baseline="alphabetic" xml:space="preserve">ask to provide proof</text></g><g><path fill="none" stroke="black" paint-order="fill stroke markers" d=" M 285.4386060077435 117.33702185799999 L 492.2324728580456 117.33702185799999" stroke-miterlimit="10" stroke-width="1.4659797833333332" stroke-dasharray=""/><g transform="translate(506.7163531173789,117.33702185799999) translate(-506.7163531173789,-117.33702185799999)"><path fill="black" stroke="none" paint-order="stroke fill markers" d=" M 492.05655528404554 110.00712294133332 L 506.7163531173789 117.33702185799999 L 492.05655528404554 124.66692077466665 Z"/></g></g><g><g><rect fill="white" stroke="none" x="527.5332660407123" y="143.724657958" width="257.05262792800784" height="22.86928462"/></g><text fill="black" stroke="none" font-family="sans-serif" font-size="11pt" font-style="normal" font-weight="normal" text-decoration="normal" x="530.1720296507123" y="159.557239618" text-anchor="start" dominant-baseline="alphabetic" xml:space="preserve">requestProof(request, AppCallbackUrl)</text></g><g><path fill="none" stroke="black" paint-order="fill stroke markers" d=" M 506.7163531173789 166.593942578 L 790.9189266327201 166.593942578" stroke-miterlimit="10" stroke-width="1.4659797833333332" stroke-dasharray=""/><g transform="translate(805.4028068920534,166.593942578) translate(-805.4028068920534,-166.593942578)"><path fill="black" stroke="none" paint-order="stroke fill markers" d=" M 790.7430090587201 159.26404366133332 L 805.4028068920534 166.593942578 L 790.7430090587201 173.92384149466668 Z"/></g></g><g><g><rect fill="white" stroke="none" x="843.8114772153867" y="192.981578678" width="110.14505041335937" height="22.86928462"/></g><text fill="black" stroke="none" font-family="sans-serif" font-size="11pt" font-style="normal" font-weight="normal" text-decoration="normal" x="846.4502408253867" y="208.81416033800002" text-anchor="start" dominant-baseline="alphabetic" xml:space="preserve">Validate request</text></g><g><path fill="none" stroke="black" paint-order="fill stroke markers" d=" M 822.9945642920534 215.850863298 L 893.3615938920534 215.850863298 L 893.3615938920534 238.720147918 L 837.4784445513867 238.720147918" stroke-miterlimit="10" stroke-width="1.4659797833333332" stroke-dasharray=""/><g transform="translate(822.9945642920534,238.720147918) translate(-822.9945642920534,-238.720147918)"><path fill="black" stroke="none" paint-order="stroke fill markers" d=" M 837.6543621253867 231.39024900133333 L 822.9945642920534 238.720147918 L 837.6543621253867 246.0500468346667 Z"/></g></g><g><g><rect fill="white" stroke="none" x="843.8114772153867" y="265.107784018" width="189.45071447585937" height="22.86928462"/></g><text fill="black" stroke="none" font-family="sans-serif" font-size="11pt" font-style="normal" font-weight="normal" text-decoration="normal" x="846.4502408253867" y="280.94036567800003" text-anchor="start" dominant-baseline="alphabetic" xml:space="preserve">Generate Template Instance</text></g><g><path fill="none" stroke="black" paint-order="fill stroke markers" d=" M 822.9945642920534 287.97706863800005 L 893.3615938920534 287.97706863800005 L 893.3615938920534 310.846353258 L 837.4784445513867 310.846353258" stroke-miterlimit="10" stroke-width="1.4659797833333332" stroke-dasharray=""/><g transform="translate(822.9945642920534,310.846353258) translate(-822.9945642920534,-310.846353258)"><path fill="black" stroke="none" paint-order="stroke fill markers" d=" M 837.6543621253867 303.5164543413334 L 822.9945642920534 310.846353258 L 837.6543621253867 318.1762521746667 Z"/></g></g><g><g><rect fill="white" stroke="none" x="595.9691486090717" y="337.23398935800003" width="120.18086279128906" height="22.86928462"/></g><text fill="black" stroke="none" font-family="sans-serif" font-size="11pt" font-style="normal" font-weight="normal" text-decoration="normal" x="598.6079122190716" y="353.06657101800005" text-anchor="start" dominant-baseline="alphabetic" xml:space="preserve">TemplateInstance</text></g><g><path fill="none" stroke="black" paint-order="fill stroke markers" d=" M 805.4028068920534 360.103273978 L 521.2002333767123 360.103273978" stroke-miterlimit="10" stroke-width="1.4659797833333332" stroke-dasharray="7.0367029599999995"/><g transform="translate(506.7163531173789,360.103273978) translate(-506.7163531173789,-360.103273978)"><path fill="black" stroke="none" paint-order="stroke fill markers" d=" M 521.3761509507123 352.77337506133335 L 506.7163531173789 360.103273978 L 521.3761509507123 367.43317289466665 Z"/></g></g><g><g><rect fill="white" stroke="none" x="527.5332660407123" y="386.490910078" width="215.49939001296875" height="22.86928462"/></g><text fill="black" stroke="none" font-family="sans-serif" font-size="11pt" font-style="normal" font-weight="normal" text-decoration="normal" x="530.1720296507123" y="402.32349173800003" text-anchor="start" dominant-baseline="alphabetic" xml:space="preserve">Generate QrCode from template</text></g><g><path fill="none" stroke="black" paint-order="fill stroke markers" d=" M 506.7163531173789 409.36019469800004 L 577.0833827173789 409.36019469800004 L 577.0833827173789 432.229479318 L 521.2002333767123 432.229479318" stroke-miterlimit="10" stroke-width="1.4659797833333332" stroke-dasharray=""/><g transform="translate(506.7163531173789,432.229479318) translate(-506.7163531173789,-432.229479318)"><path fill="black" stroke="none" paint-order="stroke fill markers" d=" M 521.3761509507123 424.89958040133337 L 506.7163531173789 432.229479318 L 521.3761509507123 439.55937823466667 Z"/></g></g><g><g><rect fill="white" stroke="none" x="349.0292768656471" y="458.617115418" width="94.09640539382812" height="22.86928462"/></g><text fill="black" stroke="none" font-family="sans-serif" font-size="11pt" font-style="normal" font-weight="normal" text-decoration="normal" x="351.6680404756471" y="474.44969707800004" text-anchor="start" dominant-baseline="alphabetic" xml:space="preserve">Scan QrCode</text></g><g><path fill="none" stroke="black" paint-order="fill stroke markers" d=" M 285.4386060077435 481.486400038 L 492.2324728580456 481.486400038" stroke-miterlimit="10" stroke-width="1.4659797833333332" stroke-dasharray="7.0367029599999995"/><g transform="translate(506.7163531173789,481.486400038) translate(-506.7163531173789,-481.486400038)"><path fill="black" stroke="none" paint-order="stroke fill markers" d=" M 492.05655528404554 474.15650112133335 L 506.7163531173789 481.486400038 L 492.05655528404554 488.81629895466665 Z"/></g></g><g><g><rect fill="white" stroke="none" x="214.33519327974216" y="507.874036138" width="166.64469946121093" height="22.86928462"/></g><text fill="black" stroke="none" font-family="sans-serif" font-size="11pt" font-style="normal" font-weight="normal" text-decoration="normal" x="216.97395688974217" y="523.706617798" text-anchor="start" dominant-baseline="alphabetic" xml:space="preserve">Open AppClip/InstanApp</text></g><g><path fill="none" stroke="black" paint-order="fill stroke markers" d=" M 506.7163531173789 530.743320758 L 103.08261316264975 530.743320758" stroke-miterlimit="10" stroke-width="1.4659797833333332" stroke-dasharray="7.0367029599999995"/><g transform="translate(88.59873290331642,530.743320758) translate(-88.59873290331642,-530.743320758)"><path fill="black" stroke="none" paint-order="stroke fill markers" d=" M 103.25853073664975 523.4134218413333 L 88.59873290331642 530.743320758 L 103.25853073664975 538.0732196746667 Z"/></g></g><g><g><rect fill="white" stroke="none" x="109.41564582664975" y="557.130956858" width="169.86584509109375" height="22.86928462"/></g><text fill="black" stroke="none" font-family="sans-serif" font-size="11pt" font-style="normal" font-weight="normal" text-decoration="normal" x="112.05440943664975" y="572.963538518" text-anchor="start" dominant-baseline="alphabetic" xml:space="preserve">complete verification task</text></g><g><path fill="none" stroke="black" paint-order="fill stroke markers" d=" M 88.59873290331642 580.0002414779999 L 158.9657625033164 580.0002414779999 L 158.9657625033164 602.8695260979999 L 103.08261316264975 602.8695260979999" stroke-miterlimit="10" stroke-width="1.4659797833333332" stroke-dasharray=""/><g transform="translate(88.59873290331642,602.8695260979999) translate(-88.59873290331642,-602.8695260979999)"><path fill="black" stroke="none" paint-order="stroke fill markers" d=" M 103.25853073664975 595.5396271813332 L 88.59873290331642 602.8695260979999 L 103.25853073664975 610.1994250146666 Z"/></g></g><g><g><rect fill="white" stroke="none" x="180.53779948091403" y="629.257162198" width="234.23948705886718" height="22.86928462"/></g><text fill="black" stroke="none" font-family="sans-serif" font-size="11pt" font-style="normal" font-weight="normal" text-decoration="normal" x="183.17656309091404" y="645.0897438579999" text-anchor="start" dominant-baseline="alphabetic" xml:space="preserve">Submit Proof using AppCallbackUrl</text></g><g><path fill="none" stroke="black" paint-order="fill stroke markers" d=" M 88.59873290331642 652.126446818 L 492.2324728580456 652.126446818" stroke-miterlimit="10" stroke-width="1.4659797833333332" stroke-dasharray=""/><g transform="translate(506.7163531173789,652.126446818) translate(-506.7163531173789,-652.126446818)"><path fill="black" stroke="none" paint-order="stroke fill markers" d=" M 492.05655528404554 644.7965479013333 L 506.7163531173789 652.126446818 L 492.05655528404554 659.4563457346667 Z"/></g></g><g><g><rect fill="white" stroke="none" x="306.2555189310768" y="678.514082918" width="179.64392126296875" height="22.86928462"/></g><text fill="black" stroke="none" font-family="sans-serif" font-size="11pt" font-style="normal" font-weight="normal" text-decoration="normal" x="308.8942825410768" y="694.346664578" text-anchor="start" dominant-baseline="alphabetic" xml:space="preserve">notify user (proof received)</text></g><g><path fill="none" stroke="black" paint-order="fill stroke markers" d=" M 506.7163531173789 701.383367538 L 299.9224862670768 701.383367538" stroke-miterlimit="10" stroke-width="1.4659797833333332" stroke-dasharray="7.0367029599999995"/><g transform="translate(285.4386060077435,701.383367538) translate(-285.4386060077435,-701.383367538)"><path fill="black" stroke="none" paint-order="stroke fill markers" d=" M 300.09840384107684 694.0534686213333 L 285.4386060077435 701.383367538 L 300.09840384107684 708.7132664546667 Z"/></g></g></g><g/><g/><g/><g/></g></svg>
@@ -0,0 +1 @@
1
+ <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="1039" height="690"><desc>participant%20AppClip%2FInstanApp%0Aparticipant%20User%0Aparticipant%20SDK%20Sample%20Web%20App%0Aparticipant%20Reclaim%20SDK%0A%0AUser-%3ESDK%20Sample%20Web%20App%3A%20ask%20to%20provide%20proof%0A%0ASDK%20Sample%20Web%20App-%3EReclaim%20SDK%3A%20requestProof(request%2C%20AppCallbackUrl)%0Aactivate%20Reclaim%20SDK%0AReclaim%20SDK-%3EReclaim%20SDK%3A%20Generate%20Template%20Instance%0AReclaim%20SDK--%3ESDK%20Sample%20Web%20App%3A%20TemplateInstance%0Adeactivate%20Reclaim%20SDK%0A%0ASDK%20Sample%20Web%20App-%3ESDK%20Sample%20Web%20App%3A%20Generate%20QrCode%20from%20template%0A%0AUser--%3ESDK%20Sample%20Web%20App%3A%20Scan%20QrCode%0A%0ASDK%20Sample%20Web%20App--%3EAppClip%2FInstanApp%3A%20Open%20AppClip%2FInstanApp%0A%0AAppClip%2FInstanApp-%3EAppClip%2FInstanApp%3A%20complete%20verification%20task%0A%0AAppClip%2FInstanApp-%3ESDK%20Sample%20Web%20App%3A%20Submit%20Proof%20using%20AppCallbackUrl%0A%0ASDK%20Sample%20Web%20App--%3EUser%3A%20notify%20user%20(proof%20received)%0A</desc><defs/><g><g/><g/><g/><g/><g/><g/><g/><g/><g/><g/><g><rect fill="white" stroke="none" x="0" y="0" width="1039" height="690"/></g><g/><g><path fill="none" stroke="black" paint-order="fill stroke markers" d=" M 88.59873290331642 59.284222437999986 L 88.59873290331642 690.8283130980001" stroke-miterlimit="10" stroke-width="1.4659797833333332" stroke-dasharray="13.532121076923076,5.863919133333333"/><path fill="none" stroke="black" paint-order="fill stroke markers" d=" M 285.4386060077435 59.284222437999986 L 285.4386060077435 690.8283130980001" stroke-miterlimit="10" stroke-width="1.4659797833333332" stroke-dasharray="13.532121076923076,5.863919133333333"/><path fill="none" stroke="black" paint-order="fill stroke markers" d=" M 506.7163531173789 59.284222437999986 L 506.7163531173789 690.8283130980001" stroke-miterlimit="10" stroke-width="1.4659797833333332" stroke-dasharray="13.532121076923076,5.863919133333333"/><path fill="none" stroke="black" paint-order="fill stroke markers" d=" M 814.1986855920534 59.284222437999986 L 814.1986855920534 690.8283130980001" stroke-miterlimit="10" stroke-width="1.4659797833333332" stroke-dasharray="13.532121076923076,5.863919133333333"/></g><g><path fill="none" stroke="none"/><g><path fill="white" stroke="black" paint-order="fill stroke markers" d=" M 8.795878700000003 11.786477457999997 L 168.40158710663283 11.786477457999997 L 168.40158710663283 59.284222437999986 L 8.795878700000003 59.284222437999986 L 8.795878700000003 11.786477457999997 Z" stroke-miterlimit="10" stroke-width="2.814681184" stroke-dasharray=""/></g><g><g/><text fill="black" stroke="none" font-family="sans-serif" font-size="11pt" font-style="normal" font-weight="normal" text-decoration="normal" x="27.88293547900001" y="41.692465037999995" text-anchor="start" dominant-baseline="alphabetic" xml:space="preserve">AppClip/InstanApp</text></g><path fill="none" stroke="none"/><g><path fill="white" stroke="black" paint-order="fill stroke markers" d=" M 250.87553604514974 11.786477457999997 L 320.00167597033726 11.786477457999997 L 320.00167597033726 59.284222437999986 L 250.87553604514974 59.284222437999986 L 250.87553604514974 11.786477457999997 Z" stroke-miterlimit="10" stroke-width="2.814681184" stroke-dasharray=""/></g><g><g/><text fill="black" stroke="none" font-family="sans-serif" font-size="11pt" font-style="normal" font-weight="normal" text-decoration="normal" x="269.96259282414974" y="41.692465037999995" text-anchor="start" dominant-baseline="alphabetic" xml:space="preserve">User</text></g><path fill="none" stroke="none"/><g><path fill="white" stroke="black" paint-order="fill stroke markers" d=" M 413.6099863408203 11.786477457999997 L 599.8227198939375 11.786477457999997 L 599.8227198939375 59.284222437999986 L 413.6099863408203 59.284222437999986 L 413.6099863408203 11.786477457999997 Z" stroke-miterlimit="10" stroke-width="2.814681184" stroke-dasharray=""/></g><g><g/><text fill="black" stroke="none" font-family="sans-serif" font-size="11pt" font-style="normal" font-weight="normal" text-decoration="normal" x="432.6970431198203" y="41.692465037999995" text-anchor="start" dominant-baseline="alphabetic" xml:space="preserve">SDK Sample Web App</text></g><path fill="none" stroke="none"/><g><path fill="white" stroke="black" paint-order="fill stroke markers" d=" M 751.5289643233073 11.786477457999997 L 876.8684068607995 11.786477457999997 L 876.8684068607995 59.284222437999986 L 751.5289643233073 59.284222437999986 L 751.5289643233073 11.786477457999997 Z" stroke-miterlimit="10" stroke-width="2.814681184" stroke-dasharray=""/></g><g><g/><text fill="black" stroke="none" font-family="sans-serif" font-size="11pt" font-style="normal" font-weight="normal" text-decoration="normal" x="770.6160211023073" y="41.692465037999995" text-anchor="start" dominant-baseline="alphabetic" xml:space="preserve">Reclaim SDK</text></g></g><g><path fill="white" stroke="black" paint-order="fill stroke markers" d=" M 805.4028068920534 166.593942578 L 822.9945642920534 166.593942578 L 822.9945642920534 287.977068638 L 805.4028068920534 287.977068638 L 805.4028068920534 166.593942578" stroke-miterlimit="10" stroke-width="1.4659797833333332" stroke-dasharray=""/><g><g><rect fill="white" stroke="none" x="329.0615110575416" y="94.46773723799998" width="134.03193701003906" height="22.86928462"/></g><text fill="black" stroke="none" font-family="sans-serif" font-size="11pt" font-style="normal" font-weight="normal" text-decoration="normal" x="331.70027466754163" y="110.30031889799997" text-anchor="start" dominant-baseline="alphabetic" xml:space="preserve">ask to provide proof</text></g><g><path fill="none" stroke="black" paint-order="fill stroke markers" d=" M 285.4386060077435 117.33702185799999 L 492.2324728580456 117.33702185799999" stroke-miterlimit="10" stroke-width="1.4659797833333332" stroke-dasharray=""/><g transform="translate(506.7163531173789,117.33702185799999) translate(-506.7163531173789,-117.33702185799999)"><path fill="black" stroke="none" paint-order="stroke fill markers" d=" M 492.05655528404554 110.00712294133332 L 506.7163531173789 117.33702185799999 L 492.05655528404554 124.66692077466665 Z"/></g></g><g><g><rect fill="white" stroke="none" x="527.5332660407123" y="143.724657958" width="257.05262792800784" height="22.86928462"/></g><text fill="black" stroke="none" font-family="sans-serif" font-size="11pt" font-style="normal" font-weight="normal" text-decoration="normal" x="530.1720296507123" y="159.557239618" text-anchor="start" dominant-baseline="alphabetic" xml:space="preserve">requestProof(request, AppCallbackUrl)</text></g><g><path fill="none" stroke="black" paint-order="fill stroke markers" d=" M 506.7163531173789 166.593942578 L 790.9189266327201 166.593942578" stroke-miterlimit="10" stroke-width="1.4659797833333332" stroke-dasharray=""/><g transform="translate(805.4028068920534,166.593942578) translate(-805.4028068920534,-166.593942578)"><path fill="black" stroke="none" paint-order="stroke fill markers" d=" M 790.7430090587201 159.26404366133332 L 805.4028068920534 166.593942578 L 790.7430090587201 173.92384149466668 Z"/></g></g><g><g><rect fill="white" stroke="none" x="843.8114772153867" y="192.981578678" width="189.45071447585937" height="22.86928462"/></g><text fill="black" stroke="none" font-family="sans-serif" font-size="11pt" font-style="normal" font-weight="normal" text-decoration="normal" x="846.4502408253867" y="208.81416033800002" text-anchor="start" dominant-baseline="alphabetic" xml:space="preserve">Generate Template Instance</text></g><g><path fill="none" stroke="black" paint-order="fill stroke markers" d=" M 822.9945642920534 215.850863298 L 893.3615938920534 215.850863298 L 893.3615938920534 238.720147918 L 837.4784445513867 238.720147918" stroke-miterlimit="10" stroke-width="1.4659797833333332" stroke-dasharray=""/><g transform="translate(822.9945642920534,238.720147918) translate(-822.9945642920534,-238.720147918)"><path fill="black" stroke="none" paint-order="stroke fill markers" d=" M 837.6543621253867 231.39024900133333 L 822.9945642920534 238.720147918 L 837.6543621253867 246.0500468346667 Z"/></g></g><g><g><rect fill="white" stroke="none" x="595.9691486090717" y="265.107784018" width="120.18086279128906" height="22.86928462"/></g><text fill="black" stroke="none" font-family="sans-serif" font-size="11pt" font-style="normal" font-weight="normal" text-decoration="normal" x="598.6079122190716" y="280.94036567800003" text-anchor="start" dominant-baseline="alphabetic" xml:space="preserve">TemplateInstance</text></g><g><path fill="none" stroke="black" paint-order="fill stroke markers" d=" M 805.4028068920534 287.977068638 L 521.2002333767123 287.977068638" stroke-miterlimit="10" stroke-width="1.4659797833333332" stroke-dasharray="7.0367029599999995"/><g transform="translate(506.7163531173789,287.977068638) translate(-506.7163531173789,-287.977068638)"><path fill="black" stroke="none" paint-order="stroke fill markers" d=" M 521.3761509507123 280.64716972133334 L 506.7163531173789 287.977068638 L 521.3761509507123 295.30696755466664 Z"/></g></g><g><g><rect fill="white" stroke="none" x="527.5332660407123" y="314.364704738" width="215.49939001296875" height="22.86928462"/></g><text fill="black" stroke="none" font-family="sans-serif" font-size="11pt" font-style="normal" font-weight="normal" text-decoration="normal" x="530.1720296507123" y="330.197286398" text-anchor="start" dominant-baseline="alphabetic" xml:space="preserve">Generate QrCode from template</text></g><g><path fill="none" stroke="black" paint-order="fill stroke markers" d=" M 506.7163531173789 337.23398935800003 L 577.0833827173789 337.23398935800003 L 577.0833827173789 360.103273978 L 521.2002333767123 360.103273978" stroke-miterlimit="10" stroke-width="1.4659797833333332" stroke-dasharray=""/><g transform="translate(506.7163531173789,360.103273978) translate(-506.7163531173789,-360.103273978)"><path fill="black" stroke="none" paint-order="stroke fill markers" d=" M 521.3761509507123 352.77337506133335 L 506.7163531173789 360.103273978 L 521.3761509507123 367.43317289466665 Z"/></g></g><g><g><rect fill="white" stroke="none" x="349.0292768656471" y="386.490910078" width="94.09640539382812" height="22.86928462"/></g><text fill="black" stroke="none" font-family="sans-serif" font-size="11pt" font-style="normal" font-weight="normal" text-decoration="normal" x="351.6680404756471" y="402.32349173800003" text-anchor="start" dominant-baseline="alphabetic" xml:space="preserve">Scan QrCode</text></g><g><path fill="none" stroke="black" paint-order="fill stroke markers" d=" M 285.4386060077435 409.360194698 L 492.2324728580456 409.360194698" stroke-miterlimit="10" stroke-width="1.4659797833333332" stroke-dasharray="7.0367029599999995"/><g transform="translate(506.7163531173789,409.360194698) translate(-506.7163531173789,-409.360194698)"><path fill="black" stroke="none" paint-order="stroke fill markers" d=" M 492.05655528404554 402.03029578133334 L 506.7163531173789 409.360194698 L 492.05655528404554 416.69009361466664 Z"/></g></g><g><g><rect fill="white" stroke="none" x="214.33519327974216" y="435.747830798" width="166.64469946121093" height="22.86928462"/></g><text fill="black" stroke="none" font-family="sans-serif" font-size="11pt" font-style="normal" font-weight="normal" text-decoration="normal" x="216.97395688974217" y="451.580412458" text-anchor="start" dominant-baseline="alphabetic" xml:space="preserve">Open AppClip/InstanApp</text></g><g><path fill="none" stroke="black" paint-order="fill stroke markers" d=" M 506.7163531173789 458.61711541799997 L 103.08261316264975 458.61711541799997" stroke-miterlimit="10" stroke-width="1.4659797833333332" stroke-dasharray="7.0367029599999995"/><g transform="translate(88.59873290331642,458.61711541799997) translate(-88.59873290331642,-458.61711541799997)"><path fill="black" stroke="none" paint-order="stroke fill markers" d=" M 103.25853073664975 451.2872165013333 L 88.59873290331642 458.61711541799997 L 103.25853073664975 465.9470143346666 Z"/></g></g><g><g><rect fill="white" stroke="none" x="109.41564582664975" y="485.004751518" width="169.86584509109375" height="22.86928462"/></g><text fill="black" stroke="none" font-family="sans-serif" font-size="11pt" font-style="normal" font-weight="normal" text-decoration="normal" x="112.05440943664975" y="500.837333178" text-anchor="start" dominant-baseline="alphabetic" xml:space="preserve">complete verification task</text></g><g><path fill="none" stroke="black" paint-order="fill stroke markers" d=" M 88.59873290331642 507.874036138 L 158.9657625033164 507.874036138 L 158.9657625033164 530.743320758 L 103.08261316264975 530.743320758" stroke-miterlimit="10" stroke-width="1.4659797833333332" stroke-dasharray=""/><g transform="translate(88.59873290331642,530.743320758) translate(-88.59873290331642,-530.743320758)"><path fill="black" stroke="none" paint-order="stroke fill markers" d=" M 103.25853073664975 523.4134218413333 L 88.59873290331642 530.743320758 L 103.25853073664975 538.0732196746667 Z"/></g></g><g><g><rect fill="white" stroke="none" x="180.53779948091403" y="557.130956858" width="234.23948705886718" height="22.86928462"/></g><text fill="black" stroke="none" font-family="sans-serif" font-size="11pt" font-style="normal" font-weight="normal" text-decoration="normal" x="183.17656309091404" y="572.963538518" text-anchor="start" dominant-baseline="alphabetic" xml:space="preserve">Submit Proof using AppCallbackUrl</text></g><g><path fill="none" stroke="black" paint-order="fill stroke markers" d=" M 88.59873290331642 580.000241478 L 492.2324728580456 580.000241478" stroke-miterlimit="10" stroke-width="1.4659797833333332" stroke-dasharray=""/><g transform="translate(506.7163531173789,580.000241478) translate(-506.7163531173789,-580.000241478)"><path fill="black" stroke="none" paint-order="stroke fill markers" d=" M 492.05655528404554 572.6703425613333 L 506.7163531173789 580.000241478 L 492.05655528404554 587.3301403946667 Z"/></g></g><g><g><rect fill="white" stroke="none" x="306.2555189310768" y="606.387877578" width="179.64392126296875" height="22.86928462"/></g><text fill="black" stroke="none" font-family="sans-serif" font-size="11pt" font-style="normal" font-weight="normal" text-decoration="normal" x="308.8942825410768" y="622.220459238" text-anchor="start" dominant-baseline="alphabetic" xml:space="preserve">notify user (proof received)</text></g><g><path fill="none" stroke="black" paint-order="fill stroke markers" d=" M 506.7163531173789 629.2571621980001 L 299.9224862670768 629.2571621980001" stroke-miterlimit="10" stroke-width="1.4659797833333332" stroke-dasharray="7.0367029599999995"/><g transform="translate(285.4386060077435,629.2571621980001) translate(-285.4386060077435,-629.2571621980001)"><path fill="black" stroke="none" paint-order="stroke fill markers" d=" M 300.09840384107684 621.9272632813334 L 285.4386060077435 629.2571621980001 L 300.09840384107684 636.5870611146668 Z"/></g></g></g><g/><g/><g/><g/></g></svg>
@@ -0,0 +1 @@
1
+ <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="1039" height="762"><desc>%0A%0Aparticipant%20AppClip%2FInstanApp%0Aparticipant%20User%0Aparticipant%Reclaim%0Aparticipant%20Reclaim%20SDK%0A%0AUser-%3EApp%3A%20ask%20to%20provide%20proof%0A%0AApp-%3EReclaim%20SDK%3A%20requestProof(request%2C%20AppCallbackUrl)%0Aactivate%20Reclaim%20SDK%0AReclaim%20SDK-%3EReclaim%20SDK%3A%20Validate%20request%0AReclaim%20SDK-%3EReclaim%20SDK%3A%20Generate%20Template%20Instance%0AReclaim%20SDK--%3EApp%3A%20TemplateInstance%0Adeactivate%20Reclaim%20SDK%0AApp-%3EApp%3A%20Generate%20QrCode%20from%20template%0A%0A%0AUser--%3EApp%3A%20Scan%20QrCode%0A%0AApp--%3EAppClip%2FInstanApp%3A%20Open%20AppClip%2FInstanApp%0A%0AAppClip%2FInstanApp-%3EAppClip%2FInstanApp%3A%20complete%20verification%20task%0A%0A%0AAppClip%2FInstanApp-%3EApp%3A%20Submit%20Proof%20using%20AppCallbackUrl%0A%0A%0AApp--%3EUser%3A%20notify%20user%20(proof%20received)%0A</desc><defs/><g><g/><g/><g/><g/><g/><g/><g/><g/><g/><g/><g/><g><rect fill="white" stroke="none" x="0" y="0" width="1039" height="762"/></g><g/><g><path fill="none" stroke="black" paint-order="fill stroke markers" d=" M 88.59873290331642 59.284222437999986 L 88.59873290331642 762.954518438" stroke-miterlimit="10" stroke-width="1.4659797833333332" stroke-dasharray="13.532121076923076,5.863919133333333"/><path fill="none" stroke="black" paint-order="fill stroke markers" d=" M 285.4386060077435 59.284222437999986 L 285.4386060077435 762.954518438" stroke-miterlimit="10" stroke-width="1.4659797833333332" stroke-dasharray="13.532121076923076,5.863919133333333"/><path fill="none" stroke="black" paint-order="fill stroke markers" d=" M 506.7163531173789 59.284222437999986 L 506.7163531173789 762.954518438" stroke-miterlimit="10" stroke-width="1.4659797833333332" stroke-dasharray="13.532121076923076,5.863919133333333"/><path fill="none" stroke="black" paint-order="fill stroke markers" d=" M 814.1986855920534 59.284222437999986 L 814.1986855920534 762.954518438" stroke-miterlimit="10" stroke-width="1.4659797833333332" stroke-dasharray="13.532121076923076,5.863919133333333"/></g><g><path fill="none" stroke="none"/><g><path fill="white" stroke="black" paint-order="fill stroke markers" d=" M 8.795878700000003 11.786477457999997 L 168.40158710663283 11.786477457999997 L 168.40158710663283 59.284222437999986 L 8.795878700000003 59.284222437999986 L 8.795878700000003 11.786477457999997 Z" stroke-miterlimit="10" stroke-width="2.814681184" stroke-dasharray=""/></g><g><g/><text fill="black" stroke="none" font-family="sans-serif" font-size="11pt" font-style="normal" font-weight="normal" text-decoration="normal" x="27.88293547900001" y="41.692465037999995" text-anchor="start" dominant-baseline="alphabetic" xml:space="preserve">AppClip/InstanApp</text></g><path fill="none" stroke="none"/><g><path fill="white" stroke="black" paint-order="fill stroke markers" d=" M 250.87553604514974 11.786477457999997 L 320.00167597033726 11.786477457999997 L 320.00167597033726 59.284222437999986 L 250.87553604514974 59.284222437999986 L 250.87553604514974 11.786477457999997 Z" stroke-miterlimit="10" stroke-width="2.814681184" stroke-dasharray=""/></g><g><g/><text fill="black" stroke="none" font-family="sans-serif" font-size="11pt" font-style="normal" font-weight="normal" text-decoration="normal" x="269.96259282414974" y="41.692465037999995" text-anchor="start" dominant-baseline="alphabetic" xml:space="preserve">User</text></g><path fill="none" stroke="none"/><g><path fill="white" stroke="black" paint-order="fill stroke markers" d=" M 474.5870676396484 11.786477457999997 L 538.8456385951093 11.786477457999997 L 538.8456385951093 59.284222437999986 L 474.5870676396484 59.284222437999986 L 474.5870676396484 11.786477457999997 Z" stroke-miterlimit="10" stroke-width="2.814681184" stroke-dasharray=""/></g><g><g/><text fill="black" stroke="none" font-family="sans-serif" font-size="11pt" font-style="normal" font-weight="normal" text-decoration="normal" x="493.67412441864843" y="41.692465037999995" text-anchor="start" dominant-baseline="alphabetic" xml:space="preserve">App</text></g><path fill="none" stroke="none"/><g><path fill="white" stroke="black" paint-order="fill stroke markers" d=" M 751.5289643233073 11.786477457999997 L 876.8684068607995 11.786477457999997 L 876.8684068607995 59.284222437999986 L 751.5289643233073 59.284222437999986 L 751.5289643233073 11.786477457999997 Z" stroke-miterlimit="10" stroke-width="2.814681184" stroke-dasharray=""/></g><g><g/><text fill="black" stroke="none" font-family="sans-serif" font-size="11pt" font-style="normal" font-weight="normal" text-decoration="normal" x="770.6160211023073" y="41.692465037999995" text-anchor="start" dominant-baseline="alphabetic" xml:space="preserve">Reclaim SDK</text></g></g><g><path fill="white" stroke="black" paint-order="fill stroke markers" d=" M 805.4028068920534 166.593942578 L 822.9945642920534 166.593942578 L 822.9945642920534 360.103273978 L 805.4028068920534 360.103273978 L 805.4028068920534 166.593942578" stroke-miterlimit="10" stroke-width="1.4659797833333332" stroke-dasharray=""/><g><g><rect fill="white" stroke="none" x="329.0615110575416" y="94.46773723799998" width="134.03193701003906" height="22.86928462"/></g><text fill="black" stroke="none" font-family="sans-serif" font-size="11pt" font-style="normal" font-weight="normal" text-decoration="normal" x="331.70027466754163" y="110.30031889799997" text-anchor="start" dominant-baseline="alphabetic" xml:space="preserve">ask to provide proof</text></g><g><path fill="none" stroke="black" paint-order="fill stroke markers" d=" M 285.4386060077435 117.33702185799999 L 492.2324728580456 117.33702185799999" stroke-miterlimit="10" stroke-width="1.4659797833333332" stroke-dasharray=""/><g transform="translate(506.7163531173789,117.33702185799999) translate(-506.7163531173789,-117.33702185799999)"><path fill="black" stroke="none" paint-order="stroke fill markers" d=" M 492.05655528404554 110.00712294133332 L 506.7163531173789 117.33702185799999 L 492.05655528404554 124.66692077466665 Z"/></g></g><g><g><rect fill="white" stroke="none" x="527.5332660407123" y="143.724657958" width="257.05262792800784" height="22.86928462"/></g><text fill="black" stroke="none" font-family="sans-serif" font-size="11pt" font-style="normal" font-weight="normal" text-decoration="normal" x="530.1720296507123" y="159.557239618" text-anchor="start" dominant-baseline="alphabetic" xml:space="preserve">requestProof(request, AppCallbackUrl)</text></g><g><path fill="none" stroke="black" paint-order="fill stroke markers" d=" M 506.7163531173789 166.593942578 L 790.9189266327201 166.593942578" stroke-miterlimit="10" stroke-width="1.4659797833333332" stroke-dasharray=""/><g transform="translate(805.4028068920534,166.593942578) translate(-805.4028068920534,-166.593942578)"><path fill="black" stroke="none" paint-order="stroke fill markers" d=" M 790.7430090587201 159.26404366133332 L 805.4028068920534 166.593942578 L 790.7430090587201 173.92384149466668 Z"/></g></g><g><g><rect fill="white" stroke="none" x="843.8114772153867" y="192.981578678" width="110.14505041335937" height="22.86928462"/></g><text fill="black" stroke="none" font-family="sans-serif" font-size="11pt" font-style="normal" font-weight="normal" text-decoration="normal" x="846.4502408253867" y="208.81416033800002" text-anchor="start" dominant-baseline="alphabetic" xml:space="preserve">Validate request</text></g><g><path fill="none" stroke="black" paint-order="fill stroke markers" d=" M 822.9945642920534 215.850863298 L 893.3615938920534 215.850863298 L 893.3615938920534 238.720147918 L 837.4784445513867 238.720147918" stroke-miterlimit="10" stroke-width="1.4659797833333332" stroke-dasharray=""/><g transform="translate(822.9945642920534,238.720147918) translate(-822.9945642920534,-238.720147918)"><path fill="black" stroke="none" paint-order="stroke fill markers" d=" M 837.6543621253867 231.39024900133333 L 822.9945642920534 238.720147918 L 837.6543621253867 246.0500468346667 Z"/></g></g><g><g><rect fill="white" stroke="none" x="843.8114772153867" y="265.107784018" width="189.45071447585937" height="22.86928462"/></g><text fill="black" stroke="none" font-family="sans-serif" font-size="11pt" font-style="normal" font-weight="normal" text-decoration="normal" x="846.4502408253867" y="280.94036567800003" text-anchor="start" dominant-baseline="alphabetic" xml:space="preserve">Generate Template Instance</text></g><g><path fill="none" stroke="black" paint-order="fill stroke markers" d=" M 822.9945642920534 287.97706863800005 L 893.3615938920534 287.97706863800005 L 893.3615938920534 310.846353258 L 837.4784445513867 310.846353258" stroke-miterlimit="10" stroke-width="1.4659797833333332" stroke-dasharray=""/><g transform="translate(822.9945642920534,310.846353258) translate(-822.9945642920534,-310.846353258)"><path fill="black" stroke="none" paint-order="stroke fill markers" d=" M 837.6543621253867 303.5164543413334 L 822.9945642920534 310.846353258 L 837.6543621253867 318.1762521746667 Z"/></g></g><g><g><rect fill="white" stroke="none" x="595.9691486090717" y="337.23398935800003" width="120.18086279128906" height="22.86928462"/></g><text fill="black" stroke="none" font-family="sans-serif" font-size="11pt" font-style="normal" font-weight="normal" text-decoration="normal" x="598.6079122190716" y="353.06657101800005" text-anchor="start" dominant-baseline="alphabetic" xml:space="preserve">TemplateInstance</text></g><g><path fill="none" stroke="black" paint-order="fill stroke markers" d=" M 805.4028068920534 360.103273978 L 521.2002333767123 360.103273978" stroke-miterlimit="10" stroke-width="1.4659797833333332" stroke-dasharray="7.0367029599999995"/><g transform="translate(506.7163531173789,360.103273978) translate(-506.7163531173789,-360.103273978)"><path fill="black" stroke="none" paint-order="stroke fill markers" d=" M 521.3761509507123 352.77337506133335 L 506.7163531173789 360.103273978 L 521.3761509507123 367.43317289466665 Z"/></g></g><g><g><rect fill="white" stroke="none" x="527.5332660407123" y="386.490910078" width="215.49939001296875" height="22.86928462"/></g><text fill="black" stroke="none" font-family="sans-serif" font-size="11pt" font-style="normal" font-weight="normal" text-decoration="normal" x="530.1720296507123" y="402.32349173800003" text-anchor="start" dominant-baseline="alphabetic" xml:space="preserve">Generate QrCode from template</text></g><g><path fill="none" stroke="black" paint-order="fill stroke markers" d=" M 506.7163531173789 409.36019469800004 L 577.0833827173789 409.36019469800004 L 577.0833827173789 432.229479318 L 521.2002333767123 432.229479318" stroke-miterlimit="10" stroke-width="1.4659797833333332" stroke-dasharray=""/><g transform="translate(506.7163531173789,432.229479318) translate(-506.7163531173789,-432.229479318)"><path fill="black" stroke="none" paint-order="stroke fill markers" d=" M 521.3761509507123 424.89958040133337 L 506.7163531173789 432.229479318 L 521.3761509507123 439.55937823466667 Z"/></g></g><g><g><rect fill="white" stroke="none" x="349.0292768656471" y="458.617115418" width="94.09640539382812" height="22.86928462"/></g><text fill="black" stroke="none" font-family="sans-serif" font-size="11pt" font-style="normal" font-weight="normal" text-decoration="normal" x="351.6680404756471" y="474.44969707800004" text-anchor="start" dominant-baseline="alphabetic" xml:space="preserve">Scan QrCode</text></g><g><path fill="none" stroke="black" paint-order="fill stroke markers" d=" M 285.4386060077435 481.486400038 L 492.2324728580456 481.486400038" stroke-miterlimit="10" stroke-width="1.4659797833333332" stroke-dasharray="7.0367029599999995"/><g transform="translate(506.7163531173789,481.486400038) translate(-506.7163531173789,-481.486400038)"><path fill="black" stroke="none" paint-order="stroke fill markers" d=" M 492.05655528404554 474.15650112133335 L 506.7163531173789 481.486400038 L 492.05655528404554 488.81629895466665 Z"/></g></g><g><g><rect fill="white" stroke="none" x="214.33519327974216" y="507.874036138" width="166.64469946121093" height="22.86928462"/></g><text fill="black" stroke="none" font-family="sans-serif" font-size="11pt" font-style="normal" font-weight="normal" text-decoration="normal" x="216.97395688974217" y="523.706617798" text-anchor="start" dominant-baseline="alphabetic" xml:space="preserve">Open AppClip/InstanApp</text></g><g><path fill="none" stroke="black" paint-order="fill stroke markers" d=" M 506.7163531173789 530.743320758 L 103.08261316264975 530.743320758" stroke-miterlimit="10" stroke-width="1.4659797833333332" stroke-dasharray="7.0367029599999995"/><g transform="translate(88.59873290331642,530.743320758) translate(-88.59873290331642,-530.743320758)"><path fill="black" stroke="none" paint-order="stroke fill markers" d=" M 103.25853073664975 523.4134218413333 L 88.59873290331642 530.743320758 L 103.25853073664975 538.0732196746667 Z"/></g></g><g><g><rect fill="white" stroke="none" x="109.41564582664975" y="557.130956858" width="169.86584509109375" height="22.86928462"/></g><text fill="black" stroke="none" font-family="sans-serif" font-size="11pt" font-style="normal" font-weight="normal" text-decoration="normal" x="112.05440943664975" y="572.963538518" text-anchor="start" dominant-baseline="alphabetic" xml:space="preserve">complete verification task</text></g><g><path fill="none" stroke="black" paint-order="fill stroke markers" d=" M 88.59873290331642 580.0002414779999 L 158.9657625033164 580.0002414779999 L 158.9657625033164 602.8695260979999 L 103.08261316264975 602.8695260979999" stroke-miterlimit="10" stroke-width="1.4659797833333332" stroke-dasharray=""/><g transform="translate(88.59873290331642,602.8695260979999) translate(-88.59873290331642,-602.8695260979999)"><path fill="black" stroke="none" paint-order="stroke fill markers" d=" M 103.25853073664975 595.5396271813332 L 88.59873290331642 602.8695260979999 L 103.25853073664975 610.1994250146666 Z"/></g></g><g><g><rect fill="white" stroke="none" x="180.53779948091403" y="629.257162198" width="234.23948705886718" height="22.86928462"/></g><text fill="black" stroke="none" font-family="sans-serif" font-size="11pt" font-style="normal" font-weight="normal" text-decoration="normal" x="183.17656309091404" y="645.0897438579999" text-anchor="start" dominant-baseline="alphabetic" xml:space="preserve">Submit Proof using AppCallbackUrl</text></g><g><path fill="none" stroke="black" paint-order="fill stroke markers" d=" M 88.59873290331642 652.126446818 L 492.2324728580456 652.126446818" stroke-miterlimit="10" stroke-width="1.4659797833333332" stroke-dasharray=""/><g transform="translate(506.7163531173789,652.126446818) translate(-506.7163531173789,-652.126446818)"><path fill="black" stroke="none" paint-order="stroke fill markers" d=" M 492.05655528404554 644.7965479013333 L 506.7163531173789 652.126446818 L 492.05655528404554 659.4563457346667 Z"/></g></g><g><g><rect fill="white" stroke="none" x="306.2555189310768" y="678.514082918" width="179.64392126296875" height="22.86928462"/></g><text fill="black" stroke="none" font-family="sans-serif" font-size="11pt" font-style="normal" font-weight="normal" text-decoration="normal" x="308.8942825410768" y="694.346664578" text-anchor="start" dominant-baseline="alphabetic" xml:space="preserve">notify user (proof received)</text></g><g><path fill="none" stroke="black" paint-order="fill stroke markers" d=" M 506.7163531173789 701.383367538 L 299.9224862670768 701.383367538" stroke-miterlimit="10" stroke-width="1.4659797833333332" stroke-dasharray="7.0367029599999995"/><g transform="translate(285.4386060077435,701.383367538) translate(-285.4386060077435,-701.383367538)"><path fill="black" stroke="none" paint-order="stroke fill markers" d=" M 300.09840384107684 694.0534686213333 L 285.4386060077435 701.383367538 L 300.09840384107684 708.7132664546667 Z"/></g></g></g><g/><g/><g/><g/></g></svg>