From cf7bfdd00f404c29bcee11d0730a5c7459bbe28a Mon Sep 17 00:00:00 2001 From: Chinmay Mhatre Date: Wed, 4 Jun 2025 12:21:37 +0530 Subject: [PATCH 1/5] feat: support versioned providers --- package-lock.json | 4 ++-- src/Reclaim.ts | 36 +++++++++++++++++++++++++++++++++--- src/utils/sessionUtils.ts | 5 +++-- src/utils/types.ts | 6 ++++++ src/utils/validationUtils.ts | 5 +++++ 5 files changed, 49 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 711d094..1bf4e01 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@reclaimprotocol/js-sdk", - "version": "3.0.1", + "version": "4.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@reclaimprotocol/js-sdk", - "version": "3.0.1", + "version": "4.0.0", "license": "See License in ", "dependencies": { "canonicalize": "^2.0.0", diff --git a/src/Reclaim.ts b/src/Reclaim.ts index e05d924..d8464d4 100644 --- a/src/Reclaim.ts +++ b/src/Reclaim.ts @@ -139,6 +139,8 @@ const emptyTemplateData: TemplateData = { redirectUrl: '', acceptAiProviders: false, sdkVersion: '', + providerVersion: '', + resolvedProviderVersion: '', jsonProofResponse: false } export class ReclaimProofRequest { @@ -151,6 +153,7 @@ export class ReclaimProofRequest { private context: Context = { contextAddress: '0x0', contextMessage: 'sample context' }; private claimCreationType?: ClaimCreationType = ClaimCreationType.STANDALONE; private providerId: string; + private resolvedProviderVersion?: string; private parameters: { [key: string]: string }; private redirectUrl?: string; private intervals: Map = new Map(); @@ -219,6 +222,11 @@ export class ReclaimProofRequest { { paramName: 'acceptAiProviders', input: options.acceptAiProviders } ], 'the constructor') } + if (options.providerVersion) { + validateFunctionParams([ + { paramName: 'providerVersion', input: options.providerVersion, isString: true } + ], 'the constructor') + } if (options.log) { validateFunctionParams([ { paramName: 'log', input: options.log } @@ -257,8 +265,9 @@ export class ReclaimProofRequest { const signature = await proofRequestInstance.generateSignature(appSecret) proofRequestInstance.setSignature(signature) - const data: InitSessionResponse = await initSession(providerId, applicationId, proofRequestInstance.timeStamp, signature); + const data: InitSessionResponse = await initSession(providerId, applicationId, proofRequestInstance.timeStamp, signature, options?.providerVersion); proofRequestInstance.sessionId = data.sessionId + proofRequestInstance.resolvedProviderVersion = data.resolvedProviderVersion return proofRequestInstance } catch (error) { @@ -282,7 +291,8 @@ export class ReclaimProofRequest { claimCreationType, options, sdkVersion, - jsonProofResponse + jsonProofResponse, + resolvedProviderVersion }: ProofPropertiesJSON = JSON.parse(jsonString) validateFunctionParams([ @@ -323,6 +333,19 @@ export class ReclaimProofRequest { ], 'fromJsonString'); } + + if (options?.providerVersion) { + validateFunctionParams([ + { input: options.providerVersion, paramName: 'providerVersion', isString: true } + ], 'fromJsonString'); + } + + if (resolvedProviderVersion) { + validateFunctionParams([ + { input: resolvedProviderVersion, paramName: 'resolvedProviderVersion', isString: true } + ], 'fromJsonString'); + } + const proofRequestInstance = new ReclaimProofRequest(applicationId, providerId, options); proofRequestInstance.sessionId = sessionId; proofRequestInstance.context = context; @@ -332,6 +355,7 @@ export class ReclaimProofRequest { proofRequestInstance.timeStamp = timeStamp proofRequestInstance.signature = signature proofRequestInstance.sdkVersion = sdkVersion; + proofRequestInstance.resolvedProviderVersion = resolvedProviderVersion; return proofRequestInstance } catch (error) { logger.info('Failed to parse JSON string in fromJsonString:', error); @@ -485,7 +509,8 @@ export class ReclaimProofRequest { timeStamp: this.timeStamp, options: this.options, sdkVersion: this.sdkVersion, - jsonProofResponse: this.jsonProofResponse + jsonProofResponse: this.jsonProofResponse, + resolvedProviderVersion: this.resolvedProviderVersion ?? '' }) } @@ -501,6 +526,8 @@ export class ReclaimProofRequest { const templateData: TemplateData = { sessionId: this.sessionId, providerId: this.providerId, + providerVersion: this.options?.providerVersion ?? '', + resolvedProviderVersion: this.resolvedProviderVersion ?? '', applicationId: this.applicationId, signature: this.signature, timestamp: this.timeStamp, @@ -511,6 +538,7 @@ export class ReclaimProofRequest { acceptAiProviders: this.options?.acceptAiProviders ?? false, sdkVersion: this.sdkVersion, jsonProofResponse: this.jsonProofResponse + } await updateSession(this.sessionId, SessionStatus.SESSION_STARTED) if (this.options?.useAppClip) { @@ -555,6 +583,8 @@ export class ReclaimProofRequest { timestamp: this.timeStamp, callbackUrl: this.getAppCallbackUrl(), context: JSON.stringify(this.context), + providerVersion: this.options?.providerVersion ?? '', + resolvedProviderVersion: this.resolvedProviderVersion ?? '', parameters: this.parameters, redirectUrl: this.redirectUrl ?? '', acceptAiProviders: this.options?.acceptAiProviders ?? false, diff --git a/src/utils/sessionUtils.ts b/src/utils/sessionUtils.ts index 54fc04b..53b3ccd 100644 --- a/src/utils/sessionUtils.ts +++ b/src/utils/sessionUtils.ts @@ -22,14 +22,15 @@ export async function initSession( providerId: string, appId: string, timestamp: string, - signature: string + signature: string, + versionNumber?: string ): Promise { logger.info(`Initializing session for providerId: ${providerId}, appId: ${appId}`); try { const response = await fetch(`${BACKEND_BASE_URL}/api/sdk/init/session/`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ providerId, appId, timestamp, signature }) + body: JSON.stringify({ providerId, appId, timestamp, signature, versionNumber }) }); const res = await response.json(); diff --git a/src/utils/types.ts b/src/utils/types.ts index 6a81799..9f6c9c5 100644 --- a/src/utils/types.ts +++ b/src/utils/types.ts @@ -31,12 +31,14 @@ export type OnError = (error: Error) => void; export type ProofRequestOptions = { log?: boolean; + versionNumber?: string; acceptAiProviders?: boolean; useAppClip?: boolean; device?: string; envUrl?: string; useBrowserExtension?: boolean; extensionID?: string; + providerVersion?: string; }; // Modal customization options @@ -66,6 +68,7 @@ export enum DeviceType { // Session and response types export type InitSessionResponse = { sessionId: string; + resolvedProviderVersion: string; }; export interface UpdateSessionResponse { @@ -101,6 +104,7 @@ export type ProofPropertiesJSON = { options?: ProofRequestOptions; sdkVersion: string; jsonProofResponse?: boolean; + resolvedProviderVersion: string; }; export type TemplateData = { @@ -116,6 +120,8 @@ export type TemplateData = { acceptAiProviders: boolean; sdkVersion: string; jsonProofResponse?: boolean; + providerVersion?: string; + resolvedProviderVersion: string; }; // Add the new StatusUrlResponse type diff --git a/src/utils/validationUtils.ts b/src/utils/validationUtils.ts index 0022571..c205f71 100644 --- a/src/utils/validationUtils.ts +++ b/src/utils/validationUtils.ts @@ -148,6 +148,11 @@ export function validateOptions(options: ProofRequestOptions): void { logger.info(`Options validation failed: Provided log in options is not valid`); throw new InvalidParamError(`The provided log in options is not valid`); } + + if (options.providerVersion && typeof options.providerVersion !== 'string') { + logger.info(`Options validation failed: Provided providerVersion in options is not valid`); + throw new InvalidParamError(`The provided providerVersion in options is not valid`); + } } From b0f06b13aaf88fb9fe31550017fe9df8e1f82890 Mon Sep 17 00:00:00 2001 From: Chinmay Mhatre Date: Fri, 6 Jun 2025 20:30:37 +0530 Subject: [PATCH 2/5] chore: remove incorrect versionNumber type --- src/utils/types.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/utils/types.ts b/src/utils/types.ts index 9f6c9c5..6aa89ff 100644 --- a/src/utils/types.ts +++ b/src/utils/types.ts @@ -31,7 +31,6 @@ export type OnError = (error: Error) => void; export type ProofRequestOptions = { log?: boolean; - versionNumber?: string; acceptAiProviders?: boolean; useAppClip?: boolean; device?: string; From d76db58c9a2d43c97c551a841b10ff05d269afc7 Mon Sep 17 00:00:00 2001 From: Chinmay Mhatre Date: Mon, 9 Jun 2025 14:07:07 +0530 Subject: [PATCH 3/5] chore: bump minor and revert lock file --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1bf4e01..711d094 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@reclaimprotocol/js-sdk", - "version": "4.0.0", + "version": "3.0.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@reclaimprotocol/js-sdk", - "version": "4.0.0", + "version": "3.0.1", "license": "See License in ", "dependencies": { "canonicalize": "^2.0.0", diff --git a/package.json b/package.json index 6d4848c..f880bab 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@reclaimprotocol/js-sdk", - "version": "4.0.0", + "version": "4.1.0", "description": "Designed to request proofs from the Reclaim protocol and manage the flow of claims and witness interactions.", "main": "dist/index.js", "types": "dist/index.d.ts", From 8bf7be4feaff2004e8e9248e5e4f3446151649ce Mon Sep 17 00:00:00 2001 From: Chinmay Mhatre Date: Mon, 9 Jun 2025 14:11:01 +0530 Subject: [PATCH 4/5] chore: bump minor version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f880bab..016afed 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@reclaimprotocol/js-sdk", - "version": "4.1.0", + "version": "4.2.0", "description": "Designed to request proofs from the Reclaim protocol and manage the flow of claims and witness interactions.", "main": "dist/index.js", "types": "dist/index.d.ts", From b3bf0884858b9e51200946b3e32fdc6335693163 Mon Sep 17 00:00:00 2001 From: Chinmay Mhatre Date: Mon, 9 Jun 2025 14:16:35 +0530 Subject: [PATCH 5/5] chore: update example copy --- example/src/app/page.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/example/src/app/page.tsx b/example/src/app/page.tsx index 1d7bd25..11cb875 100644 --- a/example/src/app/page.tsx +++ b/example/src/app/page.tsx @@ -146,12 +146,12 @@ export default function Home() { return (
-

Reclaim BrowserSDK

+

Reclaim SDK

{!proofData && !isLoading && (

- Click the button below to start the claim process using your browser extension. + Click the button below to start the claim process.