@reclaimprotocol/js-sdk 4.3.3 → 4.4.0
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 +21 -4
- package/dist/index.d.ts +6 -1
- package/dist/index.js +108 -62
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -35,7 +35,7 @@ Install the Reclaim Protocol SDK and a QR code generator:
|
|
|
35
35
|
npm install @reclaimprotocol/js-sdk react-qr-code
|
|
36
36
|
```
|
|
37
37
|
|
|
38
|
-
**Current SDK Version**: 4.
|
|
38
|
+
**Current SDK Version**: 4.4.0
|
|
39
39
|
|
|
40
40
|
## Step 3: Set up your React component
|
|
41
41
|
|
|
@@ -354,7 +354,24 @@ The Reclaim SDK offers several advanced options to customize your integration:
|
|
|
354
354
|
)
|
|
355
355
|
```
|
|
356
356
|
|
|
357
|
-
7. **
|
|
357
|
+
7. **Custom Share Page and App Clip URLs**:
|
|
358
|
+
You can customize the share page and app clip URLs for your app:
|
|
359
|
+
|
|
360
|
+
```javascript
|
|
361
|
+
const proofRequest = await ReclaimProofRequest.init(
|
|
362
|
+
APP_ID,
|
|
363
|
+
APP_SECRET,
|
|
364
|
+
PROVIDER_ID,
|
|
365
|
+
{
|
|
366
|
+
customSharePageUrl: 'https://your-custom-domain.com/verify', // Custom share page URL
|
|
367
|
+
customAppClipUrl: 'https://appclip.apple.com/id?p=your.custom.app.clip', // Custom iOS App Clip URL
|
|
368
|
+
// ... other options
|
|
369
|
+
}
|
|
370
|
+
)
|
|
371
|
+
```
|
|
372
|
+
|
|
373
|
+
|
|
374
|
+
8. **Platform-Specific Flow Control**:
|
|
358
375
|
The `triggerReclaimFlow()` method provides intelligent platform detection, but you can still use traditional methods for custom flows:
|
|
359
376
|
```javascript
|
|
360
377
|
// Traditional approach with manual QR code handling
|
|
@@ -366,7 +383,7 @@ The Reclaim SDK offers several advanced options to customize your integration:
|
|
|
366
383
|
// Automatically handles platform detection and optimal user experience
|
|
367
384
|
```
|
|
368
385
|
|
|
369
|
-
|
|
386
|
+
9. **Exporting and Importing SDK Configuration**:
|
|
370
387
|
You can export the entire Reclaim SDK configuration as a JSON string and use it to initialize the SDK with the same configuration on a different service or backend:
|
|
371
388
|
```javascript
|
|
372
389
|
// On the client-side or initial service
|
|
@@ -381,7 +398,7 @@ The Reclaim SDK offers several advanced options to customize your integration:
|
|
|
381
398
|
```
|
|
382
399
|
This allows you to generate request URLs and other details from your backend or a different service while maintaining the same configuration.
|
|
383
400
|
|
|
384
|
-
|
|
401
|
+
10. **Utility Methods**:
|
|
385
402
|
Additional utility methods for managing your proof requests:
|
|
386
403
|
```javascript
|
|
387
404
|
// Get the current session ID
|
package/dist/index.d.ts
CHANGED
|
@@ -64,6 +64,8 @@ type ProofRequestOptions = {
|
|
|
64
64
|
useBrowserExtension?: boolean;
|
|
65
65
|
extensionID?: string;
|
|
66
66
|
providerVersion?: string;
|
|
67
|
+
customSharePageUrl?: string;
|
|
68
|
+
customAppClipUrl?: string;
|
|
67
69
|
};
|
|
68
70
|
type ModalOptions = {
|
|
69
71
|
title?: string;
|
|
@@ -103,6 +105,8 @@ declare class ReclaimProofRequest {
|
|
|
103
105
|
private lastFailureTime?;
|
|
104
106
|
private templateData;
|
|
105
107
|
private extensionID;
|
|
108
|
+
private customSharePageUrl?;
|
|
109
|
+
private customAppClipUrl?;
|
|
106
110
|
private modalOptions?;
|
|
107
111
|
private modal?;
|
|
108
112
|
private readonly FAILURE_TIMEOUT;
|
|
@@ -123,7 +127,8 @@ declare class ReclaimProofRequest {
|
|
|
123
127
|
private setSignature;
|
|
124
128
|
private generateSignature;
|
|
125
129
|
private clearInterval;
|
|
126
|
-
|
|
130
|
+
private buildSharePageUrl;
|
|
131
|
+
toJsonString(): string;
|
|
127
132
|
getRequestUrl(): Promise<string>;
|
|
128
133
|
triggerReclaimFlow(): Promise<void>;
|
|
129
134
|
isBrowserExtensionAvailable(timeout?: number): Promise<boolean>;
|
package/dist/index.js
CHANGED
|
@@ -72,7 +72,7 @@ var require_package = __commonJS({
|
|
|
72
72
|
"package.json"(exports2, module2) {
|
|
73
73
|
module2.exports = {
|
|
74
74
|
name: "@reclaimprotocol/js-sdk",
|
|
75
|
-
version: "4.
|
|
75
|
+
version: "4.4.0",
|
|
76
76
|
description: "Designed to request proofs from the Reclaim protocol and manage the flow of claims and witness interactions.",
|
|
77
77
|
main: "dist/index.js",
|
|
78
78
|
types: "dist/index.d.ts",
|
|
@@ -454,6 +454,48 @@ function validateContext(context) {
|
|
|
454
454
|
{ input: context.contextMessage, paramName: "contextMessage", isString: true }
|
|
455
455
|
], "validateContext");
|
|
456
456
|
}
|
|
457
|
+
function validateModalOptions(modalOptions, functionName, paramPrefix = "") {
|
|
458
|
+
if (modalOptions.title !== void 0) {
|
|
459
|
+
validateFunctionParams([
|
|
460
|
+
{ input: modalOptions.title, paramName: `${paramPrefix}title`, isString: true }
|
|
461
|
+
], functionName);
|
|
462
|
+
}
|
|
463
|
+
if (modalOptions.description !== void 0) {
|
|
464
|
+
validateFunctionParams([
|
|
465
|
+
{ input: modalOptions.description, paramName: `${paramPrefix}description`, isString: true }
|
|
466
|
+
], functionName);
|
|
467
|
+
}
|
|
468
|
+
if (modalOptions.extensionUrl !== void 0) {
|
|
469
|
+
validateURL(modalOptions.extensionUrl, functionName);
|
|
470
|
+
validateFunctionParams([
|
|
471
|
+
{ input: modalOptions.extensionUrl, paramName: `${paramPrefix}extensionUrl`, isString: true }
|
|
472
|
+
], functionName);
|
|
473
|
+
}
|
|
474
|
+
if (modalOptions.darkTheme !== void 0) {
|
|
475
|
+
if (typeof modalOptions.darkTheme !== "boolean") {
|
|
476
|
+
throw new InvalidParamError(`${paramPrefix}darkTheme prop must be a boolean`);
|
|
477
|
+
}
|
|
478
|
+
validateFunctionParams([
|
|
479
|
+
{ input: modalOptions.darkTheme, paramName: `${paramPrefix}darkTheme` }
|
|
480
|
+
], functionName);
|
|
481
|
+
}
|
|
482
|
+
if (modalOptions.modalPopupTimer !== void 0) {
|
|
483
|
+
if (typeof modalOptions.modalPopupTimer !== "number" || modalOptions.modalPopupTimer <= 0 || !Number.isInteger(modalOptions.modalPopupTimer)) {
|
|
484
|
+
throw new InvalidParamError(`${paramPrefix}modalPopupTimer prop must be a valid time in minutes`);
|
|
485
|
+
}
|
|
486
|
+
validateFunctionParams([
|
|
487
|
+
{ input: modalOptions.modalPopupTimer, paramName: `${paramPrefix}modalPopupTimer` }
|
|
488
|
+
], functionName);
|
|
489
|
+
}
|
|
490
|
+
if (modalOptions.showExtensionInstallButton !== void 0) {
|
|
491
|
+
if (typeof modalOptions.showExtensionInstallButton !== "boolean") {
|
|
492
|
+
throw new InvalidParamError(`${paramPrefix}showExtensionInstallButton prop must be a boolean`);
|
|
493
|
+
}
|
|
494
|
+
validateFunctionParams([
|
|
495
|
+
{ input: modalOptions.showExtensionInstallButton, paramName: `${paramPrefix}showExtensionInstallButton` }
|
|
496
|
+
], functionName);
|
|
497
|
+
}
|
|
498
|
+
}
|
|
457
499
|
|
|
458
500
|
// src/utils/sessionUtils.ts
|
|
459
501
|
var logger4 = logger_default.logger;
|
|
@@ -1183,12 +1225,12 @@ function getShortenedUrl(url) {
|
|
|
1183
1225
|
}
|
|
1184
1226
|
});
|
|
1185
1227
|
}
|
|
1186
|
-
function createLinkWithTemplateData(templateData) {
|
|
1228
|
+
function createLinkWithTemplateData(templateData, sharePagePath) {
|
|
1187
1229
|
return __async(this, null, function* () {
|
|
1188
1230
|
let template = encodeURIComponent(JSON.stringify(templateData));
|
|
1189
1231
|
template = replaceAll(template, "(", "%28");
|
|
1190
1232
|
template = replaceAll(template, ")", "%29");
|
|
1191
|
-
const fullLink = `${constants.RECLAIM_SHARE_URL}${template}`;
|
|
1233
|
+
const fullLink = sharePagePath ? `${sharePagePath}/?template=${template}` : `${constants.RECLAIM_SHARE_URL}${template}`;
|
|
1192
1234
|
try {
|
|
1193
1235
|
const shortenedLink = yield getShortenedUrl(fullLink);
|
|
1194
1236
|
return shortenedLink;
|
|
@@ -1544,24 +1586,31 @@ var windowDefined = typeof window !== "undefined";
|
|
|
1544
1586
|
var userAgent = navigatorDefined ? navigator.userAgent.toLowerCase() : "";
|
|
1545
1587
|
var userAgentData = navigatorDefined ? navigator.userAgentData : void 0;
|
|
1546
1588
|
function getDeviceType() {
|
|
1547
|
-
|
|
1589
|
+
var _a;
|
|
1590
|
+
const navigatorDefined2 = typeof navigator !== "undefined";
|
|
1591
|
+
const windowDefined2 = typeof window !== "undefined";
|
|
1592
|
+
const documentDefined = typeof document !== "undefined";
|
|
1593
|
+
const userAgent2 = navigatorDefined2 ? (navigator.userAgent || "").toLowerCase() : "";
|
|
1594
|
+
if (!navigatorDefined2 || !windowDefined2 || !documentDefined) {
|
|
1548
1595
|
return "desktop" /* DESKTOP */;
|
|
1549
1596
|
}
|
|
1550
1597
|
let mobileScore = 0;
|
|
1551
|
-
const CONFIDENCE_THRESHOLD =
|
|
1552
|
-
const isTouchDevice = "ontouchstart" in window ||
|
|
1598
|
+
const CONFIDENCE_THRESHOLD = 4;
|
|
1599
|
+
const isTouchDevice = "ontouchstart" in window || navigator.maxTouchPoints > 0;
|
|
1553
1600
|
if (isTouchDevice) {
|
|
1554
1601
|
mobileScore += 3;
|
|
1555
1602
|
}
|
|
1556
|
-
const mobileUserAgentPattern = /android|webos|iphone|ipad|ipod|blackberry|iemobile|opera mini|mobile/i;
|
|
1557
|
-
if (mobileUserAgentPattern.test(
|
|
1603
|
+
const mobileUserAgentPattern = /android|webos|iphone|ipad|ipod|blackberry|iemobile|opera mini|mobile|tablet/i;
|
|
1604
|
+
if (mobileUserAgentPattern.test(userAgent2)) {
|
|
1558
1605
|
mobileScore += 3;
|
|
1559
1606
|
}
|
|
1607
|
+
const uaDataMobile = (_a = navigator == null ? void 0 : navigator.userAgentData) == null ? void 0 : _a.mobile;
|
|
1608
|
+
if (uaDataMobile === true) mobileScore += 3;
|
|
1560
1609
|
const hasMobileAPIs = "orientation" in window || "DeviceMotionEvent" in window || "DeviceOrientationEvent" in window;
|
|
1561
1610
|
if (hasMobileAPIs) {
|
|
1562
1611
|
mobileScore += 2;
|
|
1563
1612
|
}
|
|
1564
|
-
const hasHighDPI =
|
|
1613
|
+
const hasHighDPI = window.devicePixelRatio > 1.5;
|
|
1565
1614
|
if (hasHighDPI && isTouchDevice) {
|
|
1566
1615
|
mobileScore += 1;
|
|
1567
1616
|
}
|
|
@@ -1569,15 +1618,14 @@ function getDeviceType() {
|
|
|
1569
1618
|
if (hasMobileFeatures) {
|
|
1570
1619
|
mobileScore += 2;
|
|
1571
1620
|
}
|
|
1572
|
-
const
|
|
1573
|
-
|
|
1574
|
-
if (hasPointer && !isTouchDevice) {
|
|
1621
|
+
const hasFinePointer = window.matchMedia && window.matchMedia("(pointer: fine)").matches;
|
|
1622
|
+
if (hasFinePointer && !isTouchDevice) {
|
|
1575
1623
|
mobileScore -= 2;
|
|
1576
1624
|
}
|
|
1577
1625
|
if ("getBattery" in navigator || "battery" in navigator) {
|
|
1578
1626
|
mobileScore += 1;
|
|
1579
1627
|
}
|
|
1580
|
-
const isPadWithKeyboard =
|
|
1628
|
+
const isPadWithKeyboard = userAgent2.includes("macintosh") && isTouchDevice;
|
|
1581
1629
|
if (isPadWithKeyboard) {
|
|
1582
1630
|
mobileScore += 2;
|
|
1583
1631
|
}
|
|
@@ -1758,6 +1806,12 @@ var ReclaimProofRequest = class _ReclaimProofRequest {
|
|
|
1758
1806
|
if (options.extensionID) {
|
|
1759
1807
|
this.extensionID = options.extensionID;
|
|
1760
1808
|
}
|
|
1809
|
+
if (options == null ? void 0 : options.customSharePageUrl) {
|
|
1810
|
+
this.customSharePageUrl = options.customSharePageUrl;
|
|
1811
|
+
}
|
|
1812
|
+
if (options == null ? void 0 : options.customAppClipUrl) {
|
|
1813
|
+
this.customAppClipUrl = options.customAppClipUrl;
|
|
1814
|
+
}
|
|
1761
1815
|
this.options = options;
|
|
1762
1816
|
this.sdkVersion = "js-" + sdkVersion;
|
|
1763
1817
|
logger7.info(`Initializing client with applicationId: ${this.applicationId}`);
|
|
@@ -1812,6 +1866,16 @@ var ReclaimProofRequest = class _ReclaimProofRequest {
|
|
|
1812
1866
|
{ paramName: "envUrl", input: options.envUrl, isString: true }
|
|
1813
1867
|
], "the constructor");
|
|
1814
1868
|
}
|
|
1869
|
+
if (options.customSharePageUrl) {
|
|
1870
|
+
validateFunctionParams([
|
|
1871
|
+
{ paramName: "customSharePageUrl", input: options.customSharePageUrl, isString: true }
|
|
1872
|
+
], "the constructor");
|
|
1873
|
+
}
|
|
1874
|
+
if (options.customAppClipUrl) {
|
|
1875
|
+
validateFunctionParams([
|
|
1876
|
+
{ paramName: "customAppClipUrl", input: options.customAppClipUrl, isString: true }
|
|
1877
|
+
], "the constructor");
|
|
1878
|
+
}
|
|
1815
1879
|
}
|
|
1816
1880
|
const proofRequestInstance = new _ReclaimProofRequest(applicationId, providerId, options);
|
|
1817
1881
|
const signature = yield proofRequestInstance.generateSignature(appSecret);
|
|
@@ -1843,7 +1907,8 @@ var ReclaimProofRequest = class _ReclaimProofRequest {
|
|
|
1843
1907
|
options,
|
|
1844
1908
|
sdkVersion: sdkVersion2,
|
|
1845
1909
|
jsonProofResponse,
|
|
1846
|
-
resolvedProviderVersion
|
|
1910
|
+
resolvedProviderVersion,
|
|
1911
|
+
modalOptions
|
|
1847
1912
|
} = JSON.parse(jsonString);
|
|
1848
1913
|
validateFunctionParams([
|
|
1849
1914
|
{ input: applicationId, paramName: "applicationId", isString: true },
|
|
@@ -1853,6 +1918,9 @@ var ReclaimProofRequest = class _ReclaimProofRequest {
|
|
|
1853
1918
|
{ input: timeStamp, paramName: "timeStamp", isString: true },
|
|
1854
1919
|
{ input: sdkVersion2, paramName: "sdkVersion", isString: true }
|
|
1855
1920
|
], "fromJsonString");
|
|
1921
|
+
if (modalOptions) {
|
|
1922
|
+
validateModalOptions(modalOptions, "fromJsonString", "modalOptions.");
|
|
1923
|
+
}
|
|
1856
1924
|
if (redirectUrl) {
|
|
1857
1925
|
validateURL(redirectUrl, "fromJsonString");
|
|
1858
1926
|
}
|
|
@@ -1895,6 +1963,7 @@ var ReclaimProofRequest = class _ReclaimProofRequest {
|
|
|
1895
1963
|
proofRequestInstance.signature = signature;
|
|
1896
1964
|
proofRequestInstance.sdkVersion = sdkVersion2;
|
|
1897
1965
|
proofRequestInstance.resolvedProviderVersion = resolvedProviderVersion;
|
|
1966
|
+
proofRequestInstance.modalOptions = modalOptions;
|
|
1898
1967
|
return proofRequestInstance;
|
|
1899
1968
|
} catch (error) {
|
|
1900
1969
|
logger7.info("Failed to parse JSON string in fromJsonString:", error);
|
|
@@ -1917,46 +1986,7 @@ var ReclaimProofRequest = class _ReclaimProofRequest {
|
|
|
1917
1986
|
}
|
|
1918
1987
|
setModalOptions(options) {
|
|
1919
1988
|
try {
|
|
1920
|
-
|
|
1921
|
-
validateFunctionParams([
|
|
1922
|
-
{ input: options.title, paramName: "title", isString: true }
|
|
1923
|
-
], "setModalOptions");
|
|
1924
|
-
}
|
|
1925
|
-
if (options.description !== void 0) {
|
|
1926
|
-
validateFunctionParams([
|
|
1927
|
-
{ input: options.description, paramName: "description", isString: true }
|
|
1928
|
-
], "setModalOptions");
|
|
1929
|
-
}
|
|
1930
|
-
if (options.extensionUrl !== void 0) {
|
|
1931
|
-
validateURL(options.extensionUrl, "setModalOptions");
|
|
1932
|
-
validateFunctionParams([
|
|
1933
|
-
{ input: options.extensionUrl, paramName: "extensionUrl", isString: true }
|
|
1934
|
-
], "setModalOptions");
|
|
1935
|
-
}
|
|
1936
|
-
if (options.darkTheme !== void 0) {
|
|
1937
|
-
if (typeof options.darkTheme !== "boolean") {
|
|
1938
|
-
throw new InvalidParamError("darkTheme prop must be a boolean");
|
|
1939
|
-
}
|
|
1940
|
-
validateFunctionParams([
|
|
1941
|
-
{ input: options.darkTheme, paramName: "darkTheme" }
|
|
1942
|
-
], "setModalOptions");
|
|
1943
|
-
}
|
|
1944
|
-
if (options.modalPopupTimer !== void 0) {
|
|
1945
|
-
if (typeof options.modalPopupTimer !== "number" || options.modalPopupTimer <= 0 || !Number.isInteger(options.modalPopupTimer)) {
|
|
1946
|
-
throw new InvalidParamError("modalPopupTimer prop must be a valid time in minutes");
|
|
1947
|
-
}
|
|
1948
|
-
validateFunctionParams([
|
|
1949
|
-
{ input: options.modalPopupTimer, paramName: "modalPopupTimer" }
|
|
1950
|
-
], "setModalOptions");
|
|
1951
|
-
}
|
|
1952
|
-
if (options.showExtensionInstallButton !== void 0) {
|
|
1953
|
-
if (typeof options.showExtensionInstallButton !== "boolean") {
|
|
1954
|
-
throw new InvalidParamError("showExtensionInstallButton prop must be a boolean");
|
|
1955
|
-
}
|
|
1956
|
-
validateFunctionParams([
|
|
1957
|
-
{ input: options.showExtensionInstallButton, paramName: "showExtensionInstallButton" }
|
|
1958
|
-
], "setModalOptions");
|
|
1959
|
-
}
|
|
1989
|
+
validateModalOptions(options, "setModalOptions");
|
|
1960
1990
|
this.modalOptions = __spreadValues(__spreadValues({}, this.modalOptions), options);
|
|
1961
1991
|
logger7.info("Modal options set successfully");
|
|
1962
1992
|
} catch (error) {
|
|
@@ -2044,8 +2074,15 @@ var ReclaimProofRequest = class _ReclaimProofRequest {
|
|
|
2044
2074
|
this.intervals.delete(this.sessionId);
|
|
2045
2075
|
}
|
|
2046
2076
|
}
|
|
2077
|
+
buildSharePageUrl(template) {
|
|
2078
|
+
const baseUrl = "https://share.reclaimprotocol.org/verify";
|
|
2079
|
+
if (this.customSharePageUrl) {
|
|
2080
|
+
return `${this.customSharePageUrl}/?template=${template}`;
|
|
2081
|
+
}
|
|
2082
|
+
return `${baseUrl}/?template=${template}`;
|
|
2083
|
+
}
|
|
2047
2084
|
// Public methods
|
|
2048
|
-
toJsonString(
|
|
2085
|
+
toJsonString() {
|
|
2049
2086
|
var _a;
|
|
2050
2087
|
return JSON.stringify({
|
|
2051
2088
|
applicationId: this.applicationId,
|
|
@@ -2061,7 +2098,16 @@ var ReclaimProofRequest = class _ReclaimProofRequest {
|
|
|
2061
2098
|
options: this.options,
|
|
2062
2099
|
sdkVersion: this.sdkVersion,
|
|
2063
2100
|
jsonProofResponse: this.jsonProofResponse,
|
|
2064
|
-
resolvedProviderVersion: (_a = this.resolvedProviderVersion) != null ? _a : ""
|
|
2101
|
+
resolvedProviderVersion: (_a = this.resolvedProviderVersion) != null ? _a : "",
|
|
2102
|
+
modalOptions: this.modalOptions ? {
|
|
2103
|
+
title: this.modalOptions.title,
|
|
2104
|
+
description: this.modalOptions.description,
|
|
2105
|
+
extensionUrl: this.modalOptions.extensionUrl,
|
|
2106
|
+
darkTheme: this.modalOptions.darkTheme,
|
|
2107
|
+
modalPopupTimer: this.modalOptions.modalPopupTimer,
|
|
2108
|
+
showExtensionInstallButton: this.modalOptions.showExtensionInstallButton
|
|
2109
|
+
// onClose is intentionally excluded as functions cannot be serialized
|
|
2110
|
+
} : void 0
|
|
2065
2111
|
});
|
|
2066
2112
|
}
|
|
2067
2113
|
getRequestUrl() {
|
|
@@ -2097,16 +2143,16 @@ var ReclaimProofRequest = class _ReclaimProofRequest {
|
|
|
2097
2143
|
template = replaceAll(template, ")", "%29");
|
|
2098
2144
|
const isIos = getMobileDeviceType() === "ios" /* IOS */;
|
|
2099
2145
|
if (!isIos) {
|
|
2100
|
-
const instantAppUrl =
|
|
2146
|
+
const instantAppUrl = this.buildSharePageUrl(template);
|
|
2101
2147
|
logger7.info("Instant App Url created successfully: " + instantAppUrl);
|
|
2102
2148
|
return instantAppUrl;
|
|
2103
2149
|
} else {
|
|
2104
|
-
const appClipUrl = `https://appclip.apple.com/id?p=org.reclaimprotocol.app.clip&template=${template}`;
|
|
2150
|
+
const appClipUrl = this.customAppClipUrl ? `${this.customAppClipUrl}&template=${template}` : `https://appclip.apple.com/id?p=org.reclaimprotocol.app.clip&template=${template}`;
|
|
2105
2151
|
logger7.info("App Clip Url created successfully: " + appClipUrl);
|
|
2106
2152
|
return appClipUrl;
|
|
2107
2153
|
}
|
|
2108
2154
|
} else {
|
|
2109
|
-
const link = yield createLinkWithTemplateData(templateData);
|
|
2155
|
+
const link = yield createLinkWithTemplateData(templateData, this.customSharePageUrl);
|
|
2110
2156
|
logger7.info("Request Url created successfully: " + link);
|
|
2111
2157
|
return link;
|
|
2112
2158
|
}
|
|
@@ -2214,7 +2260,7 @@ var ReclaimProofRequest = class _ReclaimProofRequest {
|
|
|
2214
2260
|
showQRCodeModal() {
|
|
2215
2261
|
return __async(this, null, function* () {
|
|
2216
2262
|
try {
|
|
2217
|
-
const requestUrl = yield createLinkWithTemplateData(this.templateData);
|
|
2263
|
+
const requestUrl = yield createLinkWithTemplateData(this.templateData, this.customSharePageUrl);
|
|
2218
2264
|
this.modal = new QRCodeModal(this.modalOptions);
|
|
2219
2265
|
yield this.modal.show(requestUrl);
|
|
2220
2266
|
} catch (error) {
|
|
@@ -2229,7 +2275,7 @@ var ReclaimProofRequest = class _ReclaimProofRequest {
|
|
|
2229
2275
|
let template = encodeURIComponent(JSON.stringify(this.templateData));
|
|
2230
2276
|
template = replaceAll(template, "(", "%28");
|
|
2231
2277
|
template = replaceAll(template, ")", "%29");
|
|
2232
|
-
const instantAppUrl =
|
|
2278
|
+
const instantAppUrl = this.buildSharePageUrl(template);
|
|
2233
2279
|
logger7.info("Redirecting to Android instant app: " + instantAppUrl);
|
|
2234
2280
|
window.location.href = instantAppUrl;
|
|
2235
2281
|
} catch (error) {
|
|
@@ -2244,7 +2290,7 @@ var ReclaimProofRequest = class _ReclaimProofRequest {
|
|
|
2244
2290
|
let template = encodeURIComponent(JSON.stringify(this.templateData));
|
|
2245
2291
|
template = replaceAll(template, "(", "%28");
|
|
2246
2292
|
template = replaceAll(template, ")", "%29");
|
|
2247
|
-
const appClipUrl = `https://appclip.apple.com/id?p=org.reclaimprotocol.app.clip&template=${template}`;
|
|
2293
|
+
const appClipUrl = this.customAppClipUrl ? `${this.customAppClipUrl}&template=${template}` : `https://appclip.apple.com/id?p=org.reclaimprotocol.app.clip&template=${template}`;
|
|
2248
2294
|
logger7.info("Redirecting to iOS app clip: " + appClipUrl);
|
|
2249
2295
|
window.location.href = appClipUrl;
|
|
2250
2296
|
} catch (error) {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../package.json","../src/index.ts","../src/utils/interfaces.ts","../src/witness.ts","../src/utils/types.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","../src/utils/modalUtils.ts","../src/utils/device.ts"],"sourcesContent":["{\n \"name\": \"@reclaimprotocol/js-sdk\",\n \"version\": \"4.3.3\",\n \"description\": \"Designed to request proofs from the Reclaim protocol and manage the flow of claims and witness interactions.\",\n \"main\": \"dist/index.js\",\n \"types\": \"dist/index.d.ts\",\n \"keywords\": [\n \"reclaim\",\n \"protocol\",\n \"blockchain\",\n \"proof\",\n \"verification\",\n \"identity\",\n \"claims\",\n \"witness\",\n \"sdk\",\n \"javascript\",\n \"typescript\",\n \"decentralized\",\n \"web3\"\n ],\n \"files\": [\n \"dist\"\n ],\n \"tsup\": {\n \"entry\": [\n \"src/index.ts\"\n ],\n \"splitting\": false,\n \"sourcemap\": true,\n \"clean\": true\n },\n \"scripts\": {\n \"build\": \"sh scripts/build.sh\",\n \"release\": \"release-it\",\n \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\",\n \"commitlint\": \"commitlint --edit\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/reclaimprotocol/reclaim-js-sdk\"\n },\n \"author\": \"ali <ali@creatoros.co>\",\n \"license\": \"See License in <https://github.com/reclaimprotocol/.github/blob/main/LICENSE>\",\n \"bugs\": {\n \"url\": \"https://github.com/reclaimprotocol/reclaim-js-sdk/issues\"\n },\n \"homepage\": \"https://github.com/reclaimprotocol/reclaim-js-sdk/\",\n \"publishConfig\": {\n \"registry\": \"https://registry.npmjs.org/\",\n \"access\": \"public\"\n },\n \"release-it\": {\n \"git\": {\n \"commitMessage\": \"chore: release ${version}\",\n \"tagName\": \"v${version}\"\n },\n \"npm\": {\n \"publish\": true,\n \"tag\": \"latest\"\n },\n \"github\": {\n \"release\": true\n },\n \"plugins\": {\n \"@release-it/conventional-changelog\": {\n \"preset\": \"angular\"\n }\n }\n },\n \"devDependencies\": {\n \"@commitlint/cli\": \"^17.7.1\",\n \"@commitlint/config-conventional\": \"^17.7.0\",\n \"tsup\": \"^8.0.1\",\n \"typescript\": \"^5.3.3\"\n },\n \"dependencies\": {\n \"@release-it/conventional-changelog\": \"^10.0.1\",\n \"canonicalize\": \"^2.0.0\",\n \"ethers\": \"^6.9.1\",\n \"release-it\": \"^19.0.4\"\n }\n}\n","export * from './Reclaim';\nexport * from './utils/interfaces';\nexport { ClaimCreationType, ModalOptions } from './utils/types';","// Proof-related interfaces\nexport interface Proof {\n identifier: string;\n claimData: ProviderClaimData;\n signatures: string[];\n witnesses: WitnessData[];\n extractedParameterValues: any;\n publicData?: { [key: string]: string };\n taskId?: number;\n}\n\n// Extension Interactions\nexport const RECLAIM_EXTENSION_ACTIONS = {\n CHECK_EXTENSION: 'RECLAIM_EXTENSION_CHECK',\n EXTENSION_RESPONSE: 'RECLAIM_EXTENSION_RESPONSE',\n START_VERIFICATION: 'RECLAIM_START_VERIFICATION',\n STATUS_UPDATE: 'RECLAIM_STATUS_UPDATE',\n};\n\nexport interface ExtensionMessage {\n action: string;\n messageId: string;\n data?: any;\n extensionID?: string;\n}\n\nexport interface WitnessData {\n id: string;\n url: string;\n}\n\nexport interface ProviderClaimData {\n provider: string;\n parameters: string;\n owner: string;\n timestampS: number;\n context: string;\n identifier: string;\n epoch: number;\n}\n\n// Context and Beacon interfaces\nexport interface Context {\n contextAddress: string;\n contextMessage: string;\n}\n\nexport interface Beacon {\n getState(epoch?: number): Promise<BeaconState>;\n close?(): Promise<void>;\n}\n\nexport type BeaconState = {\n witnesses: WitnessData[];\n epoch: number;\n witnessesRequiredForClaim: number;\n nextEpochTimestampS: number;\n};\n\n\n","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 { Context, Proof, ProviderClaimData } from './interfaces';\n\n// Claim-related types\nexport type ClaimID = ProviderClaimData['identifier'];\n\nexport type ClaimInfo = Pick<ProviderClaimData, 'context' | 'provider' | 'parameters'>;\n\nexport type AnyClaimInfo = ClaimInfo | { identifier: ClaimID };\n\nexport type CompleteClaimData = Pick<ProviderClaimData, 'owner' | 'timestampS' | 'epoch'> & AnyClaimInfo;\n\nexport type SignedClaim = {\n claim: CompleteClaimData;\n signatures: Uint8Array[];\n};\n\n// Request and session-related types\nexport type CreateVerificationRequest = {\n providerIds: string[];\n applicationSecret?: string;\n};\n\nexport type StartSessionParams = {\n onSuccess: OnSuccess;\n onError: OnError;\n};\n\nexport type OnSuccess = (proof?: Proof | Proof[] | string) => void;\nexport type OnError = (error: Error) => void;\n\nexport type ProofRequestOptions = {\n log?: boolean;\n acceptAiProviders?: boolean;\n useAppClip?: boolean;\n device?: string;\n envUrl?: string;\n useBrowserExtension?: boolean;\n extensionID?: string;\n providerVersion?: string;\n};\n\n// Modal customization options\nexport type ModalOptions = {\n title?: string;\n description?: string;\n extensionUrl?: string;\n darkTheme?: boolean;\n modalPopupTimer?: number;\n showExtensionInstallButton?: boolean;\n onClose?: () => void;\n};\n\n// Claim creation type enum\nexport enum ClaimCreationType {\n STANDALONE = 'createClaim',\n ON_ME_CHAIN = 'createClaimOnMechain'\n}\n\n// Device type enum \nexport enum DeviceType {\n ANDROID = 'android',\n IOS = 'ios',\n DESKTOP = 'desktop',\n MOBILE = 'mobile'\n}\n\n\n// Session and response types\nexport type InitSessionResponse = {\n sessionId: string;\n resolvedProviderVersion: string;\n};\n\nexport interface UpdateSessionResponse {\n success: boolean;\n message?: string;\n};\n\nexport enum SessionStatus {\n SESSION_INIT = 'SESSION_INIT',\n SESSION_STARTED = 'SESSION_STARTED',\n USER_INIT_VERIFICATION = 'USER_INIT_VERIFICATION',\n USER_STARTED_VERIFICATION = 'USER_STARTED_VERIFICATION',\n PROOF_GENERATION_STARTED = 'PROOF_GENERATION_STARTED',\n PROOF_GENERATION_SUCCESS = 'PROOF_GENERATION_SUCCESS',\n PROOF_GENERATION_FAILED = 'PROOF_GENERATION_FAILED',\n PROOF_SUBMITTED = 'PROOF_SUBMITTED',\n PROOF_SUBMISSION_FAILED = 'PROOF_SUBMISSION_FAILED',\n PROOF_MANUAL_VERIFICATION_SUBMITED = 'PROOF_MANUAL_VERIFICATION_SUBMITED',\n};\n\n// JSON and template-related types\nexport type ProofPropertiesJSON = {\n applicationId: string;\n providerId: string;\n sessionId: string;\n context: Context;\n signature: string;\n redirectUrl?: string;\n parameters: { [key: string]: string };\n timeStamp: string;\n appCallbackUrl?: string;\n claimCreationType?: ClaimCreationType;\n options?: ProofRequestOptions;\n sdkVersion: string;\n jsonProofResponse?: boolean;\n resolvedProviderVersion: string;\n};\n\nexport type TemplateData = {\n sessionId: string;\n providerId: string;\n applicationId: string;\n signature: string;\n timestamp: string;\n callbackUrl: string;\n context: string;\n parameters: { [key: string]: string };\n redirectUrl: string;\n acceptAiProviders: boolean;\n sdkVersion: string;\n jsonProofResponse?: boolean;\n providerVersion?: string;\n resolvedProviderVersion: string;\n};\n\n// Add the new StatusUrlResponse type\nexport type StatusUrlResponse = {\n message: string;\n session?: {\n id: string;\n appId: string;\n httpProviderId: string[];\n sessionId: string;\n proofs?: Proof[];\n statusV2: string;\n };\n providerId?: string;\n};","import { type Proof, type Context, RECLAIM_EXTENSION_ACTIONS, ExtensionMessage } from './utils/interfaces'\nimport { getIdentifierFromClaimInfo } from './witness'\nimport {\n SignedClaim,\n ProofRequestOptions,\n StartSessionParams,\n ProofPropertiesJSON,\n TemplateData,\n InitSessionResponse,\n ClaimCreationType,\n ModalOptions,\n} from './utils/types'\nimport { SessionStatus, DeviceType } from './utils/types'\nimport { ethers } from 'ethers'\nimport canonicalize from 'canonicalize'\nimport {\n replaceAll,\n scheduleIntervalEndingTask\n} from './utils/helper'\nimport { constants, setBackendBaseUrl } from './utils/constants'\nimport {\n AddContextError,\n GetAppCallbackUrlError,\n GetStatusUrlError,\n InitError,\n InvalidParamError,\n ProofNotVerifiedError,\n ProofSubmissionFailedError,\n ProviderFailedError,\n SessionNotStartedError,\n SetParamsError,\n SetSignatureError,\n SignatureGeneratingError,\n SignatureNotFoundError\n} from './utils/errors'\nimport { validateContext, validateFunctionParams, validateParameters, validateSignature, validateURL } from './utils/validationUtils'\nimport { fetchStatusUrl, initSession, updateSession } from './utils/sessionUtils'\nimport { assertValidSignedClaim, createLinkWithTemplateData, getWitnessesForClaim } from './utils/proofUtils'\nimport { QRCodeModal } from './utils/modalUtils'\nimport loggerModule from './utils/logger';\nimport { getDeviceType, getMobileDeviceType, isMobileDevice } from './utils/device'\nconst logger = loggerModule.logger\n\nconst sdkVersion = require('../package.json').version;\n\n// Implementation\nexport async function verifyProof(proofOrProofs: Proof | Proof[]): Promise<boolean> {\n // If input is an array of proofs\n if (Array.isArray(proofOrProofs)) {\n for (const proof of proofOrProofs) {\n const isVerified = await verifyProof(proof);\n if (!isVerified) {\n return false;\n }\n }\n return true;\n }\n\n // Single proof verification logic\n const proof = proofOrProofs;\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\n// create a empty template data object to assign to templateData\nconst emptyTemplateData: TemplateData = {\n sessionId: '',\n providerId: '',\n applicationId: '',\n signature: '',\n timestamp: '',\n callbackUrl: '',\n context: '',\n parameters: {},\n redirectUrl: '',\n acceptAiProviders: false,\n sdkVersion: '',\n providerVersion: '',\n resolvedProviderVersion: '',\n jsonProofResponse: false\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 claimCreationType?: ClaimCreationType = ClaimCreationType.STANDALONE;\n private providerId: string;\n private resolvedProviderVersion?: string;\n private parameters: { [key: string]: string };\n private redirectUrl?: string;\n private intervals: Map<string, NodeJS.Timer> = new Map();\n private timeStamp: string;\n private sdkVersion: string;\n private jsonProofResponse: boolean = false;\n private lastFailureTime?: number;\n private templateData: TemplateData;\n private extensionID: string = \"reclaim-extension\";\n private modalOptions?: ModalOptions;\n private modal?: QRCodeModal;\n private readonly FAILURE_TIMEOUT = 30000; // 30 seconds timeout, can be adjusted\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 // keep template data as empty object \n this.templateData = emptyTemplateData;\n this.parameters = {};\n\n if (!options) {\n options = {};\n }\n\n options.useBrowserExtension = options.useBrowserExtension ?? true;\n\n if (options?.log) {\n loggerModule.setLogLevel('info');\n } else {\n loggerModule.setLogLevel('silent');\n }\n\n if (options.useAppClip === undefined) {\n options.useAppClip = true;\n }\n\n if (options?.envUrl) {\n setBackendBaseUrl(options.envUrl);\n }\n\n if (options.extensionID) {\n this.extensionID = options.extensionID;\n }\n\n this.options = options;\n // Fetch sdk version from package.json\n this.sdkVersion = 'js-' + sdkVersion;\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.providerVersion) {\n validateFunctionParams([\n { paramName: 'providerVersion', input: options.providerVersion, isString: true }\n ], 'the constructor')\n }\n if (options.log) {\n validateFunctionParams([\n { paramName: 'log', input: options.log }\n ], 'the constructor')\n }\n if (options.useAppClip) {\n validateFunctionParams([\n { paramName: 'useAppClip', input: options.useAppClip }\n ], 'the constructor')\n }\n if (options.device) {\n validateFunctionParams([\n { paramName: 'device', input: options.device, isString: true }\n ], 'the constructor')\n }\n if (options.useBrowserExtension) {\n validateFunctionParams([\n { paramName: 'useBrowserExtension', input: options.useBrowserExtension }\n ], 'the constructor')\n }\n if (options.extensionID) {\n validateFunctionParams([\n { paramName: 'extensionID', input: options.extensionID, isString: true }\n ], 'the constructor')\n }\n if (options.envUrl) {\n validateFunctionParams([\n { paramName: 'envUrl', input: options.envUrl, isString: true }\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: InitSessionResponse = await initSession(providerId, applicationId, proofRequestInstance.timeStamp, signature, options?.providerVersion);\n proofRequestInstance.sessionId = data.sessionId\n proofRequestInstance.resolvedProviderVersion = data.resolvedProviderVersion\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 parameters,\n signature,\n redirectUrl,\n timeStamp,\n appCallbackUrl,\n claimCreationType,\n options,\n sdkVersion,\n jsonProofResponse,\n resolvedProviderVersion\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 { input: sdkVersion, paramName: 'sdkVersion', isString: true },\n ], 'fromJsonString');\n\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 if (parameters) {\n validateParameters(parameters);\n }\n\n if (claimCreationType) {\n validateFunctionParams([\n { input: claimCreationType, paramName: 'claimCreationType' }\n ], 'fromJsonString');\n }\n\n if (jsonProofResponse !== undefined) {\n validateFunctionParams([\n { input: jsonProofResponse, paramName: 'jsonProofResponse' }\n ], 'fromJsonString');\n }\n\n\n if (options?.providerVersion) {\n validateFunctionParams([\n { input: options.providerVersion, paramName: 'providerVersion', isString: true }\n ], 'fromJsonString');\n }\n\n if (resolvedProviderVersion) {\n validateFunctionParams([\n { input: resolvedProviderVersion, paramName: 'resolvedProviderVersion', isString: true }\n ], 'fromJsonString');\n }\n\n const proofRequestInstance = new ReclaimProofRequest(applicationId, providerId, options);\n proofRequestInstance.sessionId = sessionId;\n proofRequestInstance.context = context;\n proofRequestInstance.parameters = parameters;\n proofRequestInstance.appCallbackUrl = appCallbackUrl\n proofRequestInstance.redirectUrl = redirectUrl\n proofRequestInstance.timeStamp = timeStamp\n proofRequestInstance.signature = signature\n proofRequestInstance.sdkVersion = sdkVersion;\n proofRequestInstance.resolvedProviderVersion = resolvedProviderVersion;\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, jsonProofResponse?: boolean): void {\n validateURL(url, 'setAppCallbackUrl')\n this.appCallbackUrl = url\n this.jsonProofResponse = jsonProofResponse ?? false\n }\n\n setRedirectUrl(url: string): void {\n validateURL(url, 'setRedirectUrl');\n this.redirectUrl = url;\n }\n\n setClaimCreationType(claimCreationType: ClaimCreationType): void {\n this.claimCreationType = claimCreationType;\n }\n\n setModalOptions(options: ModalOptions): void {\n try {\n // Validate modal options\n if (options.title !== undefined) {\n validateFunctionParams([\n { input: options.title, paramName: 'title', isString: true }\n ], 'setModalOptions');\n }\n\n if (options.description !== undefined) {\n validateFunctionParams([\n { input: options.description, paramName: 'description', isString: true }\n ], 'setModalOptions');\n }\n\n if (options.extensionUrl !== undefined) {\n validateURL(options.extensionUrl, 'setModalOptions');\n validateFunctionParams([\n { input: options.extensionUrl, paramName: 'extensionUrl', isString: true }\n ], 'setModalOptions');\n }\n\n if (options.darkTheme !== undefined) {\n // check if the darkTheme is a boolean\n if (typeof options.darkTheme !== 'boolean') {\n throw new InvalidParamError('darkTheme prop must be a boolean');\n }\n validateFunctionParams([\n { input: options.darkTheme, paramName: 'darkTheme' }\n ], 'setModalOptions');\n }\n\n if (options.modalPopupTimer !== undefined) {\n // check if the modalPopupTimer is a positive whole number\n if (typeof options.modalPopupTimer !== 'number' || options.modalPopupTimer <= 0 || !Number.isInteger(options.modalPopupTimer)) {\n throw new InvalidParamError('modalPopupTimer prop must be a valid time in minutes');\n }\n validateFunctionParams([\n { input: options.modalPopupTimer, paramName: 'modalPopupTimer' }\n ], 'setModalOptions');\n }\n\n if (options.showExtensionInstallButton !== undefined) {\n // check if the showExtensionInstallButton is a boolean\n if (typeof options.showExtensionInstallButton !== 'boolean') {\n throw new InvalidParamError('showExtensionInstallButton prop must be a boolean');\n }\n validateFunctionParams([\n { input: options.showExtensionInstallButton, paramName: 'showExtensionInstallButton' }\n ], 'setModalOptions');\n }\n\n this.modalOptions = { ...this.modalOptions, ...options };\n logger.info('Modal options set successfully');\n } catch (error) {\n logger.info('Error setting modal options:', error);\n throw new SetParamsError('Error setting modal options', error as Error);\n }\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 validateParameters(params);\n this.parameters = { ...this.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 // getter for SessionId\n getSessionId(): string {\n if (!this.sessionId) {\n throw new SessionNotStartedError(\"SessionId is not set\");\n }\n return this.sessionId;\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 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 appCallbackUrl: this.appCallbackUrl,\n claimCreationType: this.claimCreationType,\n parameters: this.parameters,\n signature: this.signature,\n redirectUrl: this.redirectUrl,\n timeStamp: this.timeStamp,\n options: this.options,\n sdkVersion: this.sdkVersion,\n jsonProofResponse: this.jsonProofResponse,\n resolvedProviderVersion: this.resolvedProviderVersion ?? ''\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 validateSignature(this.providerId, this.signature, this.applicationId, this.timeStamp)\n\n const templateData: TemplateData = {\n sessionId: this.sessionId,\n providerId: this.providerId,\n providerVersion: this.options?.providerVersion ?? '',\n resolvedProviderVersion: this.resolvedProviderVersion ?? '',\n applicationId: this.applicationId,\n signature: this.signature,\n timestamp: this.timeStamp,\n callbackUrl: this.getAppCallbackUrl(),\n context: JSON.stringify(this.context),\n parameters: this.parameters,\n redirectUrl: this.redirectUrl ?? '',\n acceptAiProviders: this.options?.acceptAiProviders ?? false,\n sdkVersion: this.sdkVersion,\n jsonProofResponse: this.jsonProofResponse\n\n }\n await updateSession(this.sessionId, SessionStatus.SESSION_STARTED)\n const deviceType = getDeviceType();\n if (this.options?.useAppClip && deviceType === DeviceType.MOBILE) {\n let template = encodeURIComponent(JSON.stringify(templateData));\n template = replaceAll(template, '(', '%28');\n template = replaceAll(template, ')', '%29');\n\n // check if the app is running on iOS or Android\n const isIos = getMobileDeviceType() === DeviceType.IOS;\n if (!isIos) {\n const instantAppUrl = `https://share.reclaimprotocol.org/verify/?template=${template}`;\n logger.info('Instant App Url created successfully: ' + instantAppUrl);\n return instantAppUrl;\n } else {\n const appClipUrl = `https://appclip.apple.com/id?p=org.reclaimprotocol.app.clip&template=${template}`;\n logger.info('App Clip Url created successfully: ' + appClipUrl);\n return appClipUrl;\n }\n } else {\n const link = await createLinkWithTemplateData(templateData)\n logger.info('Request Url created successfully: ' + link);\n return link;\n }\n } catch (error) {\n logger.info('Error creating Request Url:', error)\n throw error\n }\n }\n\n async triggerReclaimFlow(): Promise<void> {\n if (!this.signature) {\n throw new SignatureNotFoundError('Signature is not set.')\n }\n\n try {\n validateSignature(this.providerId, this.signature, this.applicationId, this.timeStamp)\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 providerVersion: this.options?.providerVersion ?? '',\n resolvedProviderVersion: this.resolvedProviderVersion ?? '',\n parameters: this.parameters,\n redirectUrl: this.redirectUrl ?? '',\n acceptAiProviders: this.options?.acceptAiProviders ?? false,\n sdkVersion: this.sdkVersion,\n jsonProofResponse: this.jsonProofResponse\n }\n\n this.templateData = templateData;\n\n logger.info('Triggering Reclaim flow');\n\n // Get device type\n const deviceType = getDeviceType();\n await updateSession(this.sessionId, SessionStatus.SESSION_STARTED)\n\n if (deviceType === DeviceType.DESKTOP) {\n const extensionAvailable = await this.isBrowserExtensionAvailable();\n // Desktop flow\n if (this.options?.useBrowserExtension && extensionAvailable) {\n logger.info('Triggering browser extension flow');\n this.triggerBrowserExtensionFlow();\n return;\n } else {\n // Show QR code popup modal\n logger.info('Browser extension not available, showing QR code modal');\n await this.showQRCodeModal();\n }\n } else if (deviceType === DeviceType.MOBILE) {\n // Mobile flow\n const mobileDeviceType = getMobileDeviceType();\n\n if (mobileDeviceType === DeviceType.ANDROID) {\n // Redirect to instant app URL\n logger.info('Redirecting to Android instant app');\n await this.redirectToInstantApp();\n } else if (mobileDeviceType === DeviceType.IOS) {\n // Redirect to app clip URL\n logger.info('Redirecting to iOS app clip');\n await this.redirectToAppClip();\n }\n }\n } catch (error) {\n logger.info('Error triggering Reclaim flow:', error);\n throw error;\n }\n }\n\n\n async isBrowserExtensionAvailable(timeout = 200): Promise<boolean> {\n try {\n return new Promise<boolean>((resolve) => {\n const messageId = `reclaim-check-${Date.now()}`;\n\n const timeoutId = setTimeout(() => {\n window.removeEventListener('message', messageListener);\n resolve(false);\n }, timeout);\n\n const messageListener = (event: MessageEvent) => {\n if (event.data?.action === RECLAIM_EXTENSION_ACTIONS.EXTENSION_RESPONSE &&\n event.data?.messageId === messageId) {\n clearTimeout(timeoutId);\n window.removeEventListener('message', messageListener);\n resolve(!!event.data.installed);\n }\n };\n\n window.addEventListener('message', messageListener);\n const message: ExtensionMessage = {\n action: RECLAIM_EXTENSION_ACTIONS.CHECK_EXTENSION,\n extensionID: this.extensionID,\n messageId: messageId\n }\n window.postMessage(message, '*');\n });\n } catch (error) {\n logger.info('Error checking Reclaim extension installed:', error);\n return false;\n }\n }\n\n private triggerBrowserExtensionFlow(): void {\n const message: ExtensionMessage = {\n action: RECLAIM_EXTENSION_ACTIONS.START_VERIFICATION,\n messageId: this.sessionId,\n data: this.templateData,\n extensionID: this.extensionID\n }\n window.postMessage(message, '*');\n logger.info('Browser extension flow triggered');\n }\n\n private async showQRCodeModal(): Promise<void> {\n try {\n const requestUrl = await createLinkWithTemplateData(this.templateData);\n this.modal = new QRCodeModal(this.modalOptions);\n await this.modal.show(requestUrl);\n } catch (error) {\n logger.info('Error showing QR code modal:', error);\n throw error;\n }\n }\n\n private async redirectToInstantApp(): Promise<void> {\n try {\n let template = encodeURIComponent(JSON.stringify(this.templateData));\n template = replaceAll(template, '(', '%28');\n template = replaceAll(template, ')', '%29');\n\n const instantAppUrl = `https://share.reclaimprotocol.org/verify/?template=${template}`;\n logger.info('Redirecting to Android instant app: ' + instantAppUrl);\n\n // Redirect to instant app\n window.location.href = instantAppUrl;\n } catch (error) {\n logger.info('Error redirecting to instant app:', error);\n throw error;\n }\n }\n\n private async redirectToAppClip(): Promise<void> {\n try {\n let template = encodeURIComponent(JSON.stringify(this.templateData));\n template = replaceAll(template, '(', '%28');\n template = replaceAll(template, ')', '%29');\n\n const appClipUrl = `https://appclip.apple.com/id?p=org.reclaimprotocol.app.clip&template=${template}`;\n logger.info('Redirecting to iOS app clip: ' + appClipUrl);\n\n // Redirect to app clip\n window.location.href = appClipUrl;\n } catch (error) {\n logger.info('Error redirecting to app clip:', 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 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\n // Reset failure time if status is not PROOF_GENERATION_FAILED\n if (statusUrlResponse.session.statusV2 !== SessionStatus.PROOF_GENERATION_FAILED) {\n this.lastFailureTime = undefined;\n }\n\n // Check for failure timeout\n if (statusUrlResponse.session.statusV2 === SessionStatus.PROOF_GENERATION_FAILED) {\n const currentTime = Date.now();\n if (!this.lastFailureTime) {\n this.lastFailureTime = currentTime;\n } else if (currentTime - this.lastFailureTime >= this.FAILURE_TIMEOUT) {\n throw new ProviderFailedError('Proof generation failed - timeout reached');\n }\n return; // Continue monitoring if under timeout\n }\n\n const isDefaultCallbackUrl = this.getAppCallbackUrl() === `${constants.DEFAULT_RECLAIM_CALLBACK_URL}${this.sessionId}`;\n\n if (isDefaultCallbackUrl) {\n if (statusUrlResponse.session.proofs && statusUrlResponse.session.proofs.length > 0) {\n const proofs = statusUrlResponse.session.proofs;\n if (this.claimCreationType === ClaimCreationType.STANDALONE) {\n const verified = await verifyProof(proofs);\n if (!verified) {\n logger.info(`Proofs not verified: ${JSON.stringify(proofs)}`);\n throw new ProofNotVerifiedError();\n }\n }\n // check if the proofs array has only one proof then send the proofs in onSuccess \n if (proofs.length === 1) {\n \n onSuccess(proofs[0]);\n } else {\n onSuccess(proofs);\n }\n this.clearInterval();\n this.modal?.close();\n }\n } else {\n if (statusUrlResponse.session.statusV2 === SessionStatus.PROOF_SUBMISSION_FAILED) {\n throw new ProofSubmissionFailedError();\n }\n if (statusUrlResponse.session.statusV2 === SessionStatus.PROOF_SUBMITTED) {\n if (onSuccess) {\n onSuccess('Proof submitted successfully to the custom callback url');\n }\n this.clearInterval();\n this.modal?.close();\n }\n }\n } catch (e) {\n if (onError) {\n onError(e as Error);\n }\n this.clearInterval();\n this.modal?.close();\n }\n }, 3000);\n\n this.intervals.set(this.sessionId, interval);\n scheduleIntervalEndingTask(this.sessionId, this.intervals, onError);\n }\n\n closeModal(): void {\n if (this.modal) {\n this.modal.close();\n logger.info('Modal closed by user');\n }\n }\n}\n\n","function createErrorClass(name: string) {\n return class extends Error {\n constructor(message?: string, public innerError?: Error) {\n // Include inner error message in the main message if available\n const fullMessage = innerError \n ? `${message || ''} caused by ${innerError.name}: ${innerError.message}`\n : message;\n \n super(fullMessage);\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 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 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 StatusUrlError = createErrorClass('StatusUrlError');\nexport const InavlidParametersError = createErrorClass('InavlidParametersError');\nexport const ProofSubmissionFailedError = createErrorClass('ProofSubmissionFailedError');","// 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 let BACKEND_BASE_URL = \"https://api.reclaimprotocol.org\";\n\nexport function setBackendBaseUrl(url: string) {\n BACKEND_BASE_URL = url;\n}\n\n// Constant values used throughout the application\nexport const constants = {\n // Default callback URL for Reclaim protocol\n get DEFAULT_RECLAIM_CALLBACK_URL() {\n return `${BACKEND_BASE_URL}/api/sdk/callback?callbackId=`;\n },\n\n // Default status URL for Reclaim sessions\n get DEFAULT_RECLAIM_STATUS_URL() {\n return `${BACKEND_BASE_URL}/api/sdk/session/`;\n },\n\n // URL for sharing Reclaim templates\n RECLAIM_SHARE_URL: 'https://share.reclaimprotocol.org/verifier/?template=',\n\n // Chrome extension URL for Reclaim Protocol\n CHROME_EXTENSION_URL: 'https://chromewebstore.google.com/detail/reclaim-extension/oafieibbbcepkmenknelhmgaoahamdeh',\n\n // QR Code API base URL\n QR_CODE_API_URL: 'https://api.qrserver.com/v1/create-qr-code/'\n};\n","import { ethers } from \"ethers\";\nimport { InavlidParametersError, InvalidParamError, InvalidSignatureError } from \"./errors\";\nimport canonicalize from 'canonicalize'\nimport { Context } 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// validate the parameters\n/** \n * Validates the parameters object\n * @param parameters - The parameters object to validate\n * @throws InavlidParametersError if the parameters object is not valid\n */\nexport function validateParameters(parameters: { [key: string]: string }): void {\n try {\n // check if the parameters is an object of key value pairs of string and string\n if (typeof parameters !== 'object' || parameters === null) {\n logger.info(`Parameters validation failed: Provided parameters is not an object`);\n throw new InavlidParametersError(`The provided parameters is not an object`);\n }\n // check each key and value in the parameters object\n for (const [key, value] of Object.entries(parameters)) {\n if (typeof key !== 'string' || typeof value !== 'string') {\n logger.info(`Parameters validation failed: Provided parameters is not an object of key value pairs of string and string`);\n throw new InavlidParametersError(`The provided parameters is not an object of key value pairs of string and string`);\n }\n }\n } catch (e) {\n logger.info(`Parameters validation failed: ${(e as Error).message}`);\n throw new InavlidParametersError(`Invalid parameters passed to validateParameters.`, e as Error);\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 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 if (options.providerVersion && typeof options.providerVersion !== 'string') {\n logger.info(`Options validation failed: Provided providerVersion in options is not valid`);\n throw new InvalidParamError(`The provided providerVersion 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 versionNumber?: 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, versionNumber })\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 { 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/**\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","import loggerModule from './logger';\nimport { ModalOptions } from './types';\nimport { constants } from './constants';\nconst logger = loggerModule.logger;\n\nexport class QRCodeModal {\n private modalId: string;\n private options: ModalOptions;\n private autoCloseTimer?: NodeJS.Timeout;\n private countdownTimer?: NodeJS.Timeout;\n private countdownSeconds: number = 60;\n\n constructor(options: ModalOptions = {}) {\n this.modalId = 'reclaim-qr-modal';\n this.options = {\n title: 'Verify with Reclaim',\n description: 'Scan the QR code with your mobile device to complete verification',\n extensionUrl: constants.CHROME_EXTENSION_URL,\n darkTheme: false,\n modalPopupTimer: 1, // default to 1 minute\n showExtensionInstallButton: false, // default to false\n ...options\n };\n }\n\n async show(requestUrl: string): Promise<void> {\n try {\n // Remove existing modal if present\n this.close();\n\n // Create modal HTML\n const modalHTML = this.createModalHTML();\n\n // Add modal to DOM\n document.body.insertAdjacentHTML('beforeend', modalHTML);\n\n // Generate QR code\n await this.generateQRCode(requestUrl, 'reclaim-qr-code');\n\n // Add event listeners\n this.addEventListeners();\n\n // Start auto-close timer\n this.startAutoCloseTimer();\n\n } catch (error) {\n logger.info('Error showing QR code modal:', error);\n throw error;\n }\n }\n\n close(): void {\n // Clear timers\n if (this.autoCloseTimer) {\n clearTimeout(this.autoCloseTimer);\n this.autoCloseTimer = undefined;\n }\n if (this.countdownTimer) {\n clearInterval(this.countdownTimer);\n this.countdownTimer = undefined;\n }\n\n const modal = document.getElementById(this.modalId);\n if (modal) {\n modal.remove();\n }\n if (this.options.onClose) {\n this.options.onClose();\n }\n }\n\n private getThemeStyles() {\n const isDark = this.options.darkTheme;\n\n return {\n modalBackground: isDark ? 'rgba(0, 0, 0, 0.8)' : 'rgba(0, 0, 0, 0.5)',\n cardBackground: isDark ? '#1f2937' : 'white',\n titleColor: isDark ? '#f9fafb' : '#1f2937',\n textColor: isDark ? '#d1d5db' : '#6b7280',\n qrBackground: isDark ? '#374151' : '#f9fafb',\n tipBackground: isDark ? '#1e40af' : '#f0f9ff',\n tipBorder: isDark ? '#1e40af' : '#e0f2fe',\n tipTextColor: isDark ? '#dbeafe' : '#0369a1',\n buttonBackground: isDark ? '#374151' : '#f3f4f6',\n buttonColor: isDark ? '#f9fafb' : '#374151',\n buttonHoverBackground: isDark ? '#4b5563' : '#e5e7eb',\n countdownColor: isDark ? '#6b7280' : '#9ca3af',\n progressBackground: isDark ? '#4b5563' : '#e5e7eb',\n progressGradient: isDark\n ? 'linear-gradient(90deg, #3b82f6 0%, #2563eb 50%, #1d4ed8 100%)'\n : 'linear-gradient(90deg, #2563eb 0%, #1d4ed8 50%, #1e40af 100%)',\n linkColor: isDark ? '#60a5fa' : '#2563eb',\n extensionButtonBackground: isDark ? '#1e40af' : '#2563eb',\n extensionButtonHover: isDark ? '#1d4ed8' : '#1d4ed8'\n };\n }\n\n private createModalHTML(): string {\n const styles = this.getThemeStyles();\n\n return `\n <div id=\"${this.modalId}\" style=\"\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background-color: ${styles.modalBackground};\n display: flex;\n justify-content: center;\n align-items: center;\n z-index: 10000;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n \">\n <div style=\"\n background: ${styles.cardBackground};\n border-radius: 12px;\n padding: 32px;\n max-width: 400px;\n width: 90%;\n text-align: center;\n box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);\n position: relative;\n \">\n <button id=\"reclaim-close-modal\" style=\"\n position: absolute;\n top: 16px;\n right: 16px;\n background: none;\n border: none;\n cursor: pointer;\n padding: 4px;\n border-radius: 6px;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: background-color 0.2s;\n width: 32px;\n height: 32px;\n \"\n onmouseover=\"this.style.backgroundColor='${styles.buttonHoverBackground}'\"\n onmouseout=\"this.style.backgroundColor='transparent'\"\n title=\"Close modal\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M12 4L4 12M4 4L12 12\" stroke=\"${styles.buttonColor}\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n \n <h2 style=\"\n margin: 0 0 16px 0;\n font-size: 24px;\n font-weight: 600;\n color: ${styles.titleColor};\n \">${this.options.title}</h2>\n \n <p style=\"\n margin: 0 0 24px 0;\n color: ${styles.textColor};\n font-size: 14px;\n line-height: 1.5;\n \">${this.options.description}</p>\n \n <div id=\"reclaim-qr-code\" style=\"\n margin: 0 auto 24px auto;\n background: ${styles.qrBackground};\n border-radius: 8px;\n display: inline-block;\n \"></div>\n \n ${this.options.showExtensionInstallButton ? `\n <div style=\"\n margin-bottom: 24px;\n padding: 16px;\n background: ${styles.tipBackground};\n border: 1px solid ${styles.tipBorder};\n border-radius: 8px;\n \">\n <p style=\"\n margin: 0 0 12px 0;\n font-size: 14px;\n color: ${styles.tipTextColor};\n font-weight: 500;\n \">💡 For a better experience</p>\n <p style=\"\n margin: 0 0 12px 0;\n font-size: 13px;\n color: ${styles.tipTextColor};\n line-height: 1.4;\n \">Install our browser extension for seamless verification without QR codes</p>\n <a href=\"${this.options.extensionUrl}\" \n target=\"_blank\" \n style=\"\n display: inline-block;\n background: ${styles.extensionButtonBackground};\n color: white;\n text-decoration: none;\n padding: 8px 16px;\n border-radius: 6px;\n font-size: 12px;\n font-weight: 500;\n transition: background-color 0.2s;\n \"\n onmouseover=\"this.style.backgroundColor='${styles.extensionButtonHover}'\"\n onmouseout=\"this.style.backgroundColor='${styles.extensionButtonBackground}'\">\n Install Extension\n </a>\n </div>` : ''}\n \n <div style=\"margin-top: 16px;\">\n <div id=\"reclaim-countdown\" style=\"\n font-size: 12px;\n color: ${styles.countdownColor};\n font-weight: 400;\n margin-bottom: 8px;\n \">Auto-close in 1:00</div>\n \n <div style=\"\n width: 100%;\n height: 4px;\n background-color: ${styles.progressBackground};\n border-radius: 2px;\n overflow: hidden;\n \">\n <div id=\"reclaim-progress-bar\" style=\"\n width: 100%;\n height: 100%;\n background: ${styles.progressGradient};\n border-radius: 2px;\n transition: width 1s linear;\n \"></div>\n </div>\n </div>\n </div>\n </div>\n `\n }\n\n private async generateQRCode(text: string, containerId: string): Promise<void> {\n try {\n // Simple QR code generation using a public API\n // In production, you might want to use a proper QR code library\n const qrCodeUrl = `${constants.QR_CODE_API_URL}?size=200x200&data=${encodeURIComponent(text)}`;\n\n const container = document.getElementById(containerId);\n const styles = this.getThemeStyles();\n\n if (container) {\n container.innerHTML = `\n <img src=\"${qrCodeUrl}\" \n alt=\"QR Code for Reclaim verification\" \n style=\"width: 200px; height: 200px; border-radius: 4px;\"\n onerror=\"this.style.display='none'; this.nextElementSibling.style.display='block';\">\n <div style=\"display: none; padding: 20px; color: ${styles.textColor}; font-size: 14px;\">\n QR code could not be loaded.<br>\n <a href=\"${text}\" target=\"_blank\" style=\"color: ${styles.linkColor}; text-decoration: underline;\">\n Click here to open verification link\n </a>\n </div>\n `;\n }\n } catch (error) {\n logger.info('Error generating QR code:', error);\n // Fallback to text link\n const container = document.getElementById(containerId);\n const styles = this.getThemeStyles();\n\n if (container) {\n container.innerHTML = `\n <div style=\"padding: 20px; color: ${styles.textColor}; font-size: 14px;\">\n <a href=\"${text}\" target=\"_blank\" style=\"color: ${styles.linkColor}; text-decoration: underline;\">\n Click here to open verification link\n </a>\n </div>\n `;\n }\n }\n }\n\n private addEventListeners(): void {\n const closeButton = document.getElementById('reclaim-close-modal');\n const modal = document.getElementById(this.modalId);\n\n const closeModal = () => {\n this.close();\n };\n\n if (closeButton) {\n closeButton.addEventListener('click', closeModal);\n }\n\n // Close on backdrop click\n if (modal) {\n modal.addEventListener('click', (e) => {\n if (e.target === modal) {\n closeModal();\n }\n });\n }\n\n // Close on escape key\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n closeModal();\n document.removeEventListener('keydown', handleEscape);\n }\n };\n document.addEventListener('keydown', handleEscape);\n }\n\n private startAutoCloseTimer(): void {\n this.countdownSeconds = (this.options.modalPopupTimer || 1) * 60; // default to 1 minute\n\n // Update countdown display immediately\n this.updateCountdownDisplay();\n\n // Start countdown timer (updates every second)\n this.countdownTimer = setInterval(() => {\n this.countdownSeconds--;\n this.updateCountdownDisplay();\n\n if (this.countdownSeconds <= 0) {\n this.close();\n }\n }, 1000);\n\n // Set auto-close timer for the number of minutes specified in the options in milliseconds\n const autoCloseMs = (this.options.modalPopupTimer || 1) * 60 * 1000;\n this.autoCloseTimer = setTimeout(() => {\n this.close();\n }, autoCloseMs);\n }\n\n private updateCountdownDisplay(): void {\n const countdownElement = document.getElementById('reclaim-countdown');\n const progressBar = document.getElementById('reclaim-progress-bar');\n\n if (countdownElement) {\n const minutes = Math.floor(this.countdownSeconds / 60);\n const seconds = this.countdownSeconds % 60;\n const timeString = `${minutes}:${seconds.toString().padStart(2, '0')}`;\n countdownElement.textContent = `Auto-close in ${timeString}`;\n }\n\n if (progressBar) {\n // Calculate progress percentage (reverse: starts at 100%, goes to 0%)\n const totalSeconds = (this.options.modalPopupTimer || 1) * 60;\n const progressPercentage = (this.countdownSeconds / totalSeconds) * 100;\n progressBar.style.width = `${progressPercentage}%`;\n }\n }\n}","import { DeviceType } from \"./types\";\n\nconst navigatorDefined = typeof navigator !== 'undefined';\nconst windowDefined = typeof window !== 'undefined';\n\nconst userAgent = navigatorDefined ? navigator.userAgent.toLowerCase() : '';\nconst userAgentData = navigatorDefined ? (navigator as Navigator & { \n userAgentData?: { \n platform: string;\n brands?: { brand: string; version: string }[];\n } \n}).userAgentData : undefined;\n\n/**\n * Highly accurate device type detection - returns only 'desktop' or 'mobile'\n * Uses multiple detection methods and scoring system for maximum accuracy\n * @returns {DeviceType.DESKTOP | DeviceType.MOBILE} The detected device type\n */\nexport function getDeviceType(): DeviceType.DESKTOP | DeviceType.MOBILE {\n // Early return for server-side rendering - assume desktop\n if (!navigatorDefined || !windowDefined) {\n return DeviceType.DESKTOP;\n }\n\n let mobileScore = 0;\n const CONFIDENCE_THRESHOLD = 2; // Adjusted threshold since we removed screen size checks\n\n // Method 1: Touch capability detection (weight: 3 - increased weight)\n const isTouchDevice = 'ontouchstart' in window || \n (navigatorDefined && navigator.maxTouchPoints > 0);\n if (isTouchDevice) {\n mobileScore += 3;\n }\n\n // Method 2: User agent detection (weight: 3)\n const mobileUserAgentPattern = /android|webos|iphone|ipad|ipod|blackberry|iemobile|opera mini|mobile/i;\n if (mobileUserAgentPattern.test(userAgent)) {\n mobileScore += 3;\n }\n\n // Method 3: Mobile-specific APIs (weight: 2)\n const hasMobileAPIs = 'orientation' in window || \n 'DeviceMotionEvent' in window ||\n 'DeviceOrientationEvent' in window;\n if (hasMobileAPIs) {\n mobileScore += 2;\n }\n\n // Method 4: Device pixel ratio for mobile devices (weight: 1)\n const hasHighDPI = windowDefined && window.devicePixelRatio > 1.5;\n if (hasHighDPI && isTouchDevice) {\n mobileScore += 1;\n }\n\n // Method 5: Mobile-specific browser features (weight: 2)\n const hasMobileFeatures = 'ontouchstart' in document.documentElement ||\n 'onorientationchange' in window ||\n navigator.maxTouchPoints > 1;\n if (hasMobileFeatures) {\n mobileScore += 2;\n }\n\n // Method 6: Check for desktop-specific indicators (negative weight)\n const hasKeyboard = 'keyboard' in navigator;\n const hasPointer = window.matchMedia && window.matchMedia('(pointer: fine)').matches;\n \n if (hasPointer && !isTouchDevice) {\n mobileScore -= 2;\n }\n\n // Method 7: Battery API (mobile-specific feature)\n if ('getBattery' in navigator || 'battery' in navigator) {\n mobileScore += 1;\n }\n\n // Method 8: Special case for iPad Pro and similar devices\n const isPadWithKeyboard = userAgent.includes('macintosh') && isTouchDevice;\n if (isPadWithKeyboard) {\n mobileScore += 2;\n }\n\n // Method 9: Check for mobile-specific viewport behavior\n const hasViewportMeta = document.querySelector('meta[name=\"viewport\"]') !== null;\n if (hasViewportMeta && isTouchDevice) {\n mobileScore += 1;\n }\n\n return mobileScore >= CONFIDENCE_THRESHOLD ? DeviceType.MOBILE : DeviceType.DESKTOP;\n}\n\n/**\n * Highly accurate mobile device type detection - returns only 'android' or 'ios'\n * Should only be called when getDeviceType() returns 'mobile'\n * @returns {DeviceType.ANDROID | DeviceType.IOS} The detected mobile device type\n */\nexport function getMobileDeviceType(): DeviceType.ANDROID | DeviceType.IOS {\n // Early return for server-side rendering - default to Android\n if (!navigatorDefined || !windowDefined) {\n return DeviceType.ANDROID;\n }\n\n const ua = navigator.userAgent;\n\n // Strategy 1: Direct iOS detection using comprehensive regex\n const iosPattern = /iPad|iPhone|iPod/i;\n if (iosPattern.test(ua)) {\n return DeviceType.IOS;\n }\n\n // Strategy 2: Direct Android detection\n const androidPattern = /Android/i;\n if (androidPattern.test(ua)) {\n return DeviceType.ANDROID;\n }\n\n // Strategy 3: iPad Pro masquerading as Mac detection\n const isMacWithTouch = /Macintosh|MacIntel/i.test(ua) && 'ontouchstart' in window;\n if (isMacWithTouch) {\n return DeviceType.IOS;\n }\n\n // Strategy 4: Modern iPad detection using userAgentData\n if (userAgentData?.platform === 'macOS' && 'ontouchstart' in window) {\n return DeviceType.IOS;\n }\n\n // Strategy 5: iOS-specific API detection\n if (typeof (window as any).DeviceMotionEvent?.requestPermission === 'function') {\n return DeviceType.IOS;\n }\n\n // Strategy 6: CSS property detection for iOS\n if (typeof CSS !== 'undefined' && CSS.supports?.('-webkit-touch-callout', 'none')) {\n return DeviceType.IOS;\n }\n\n // Strategy 7: WebKit without Chrome/Android indicates iOS Safari\n const isIOSWebKit = /WebKit/i.test(ua) && !/Chrome|CriOS|Android/i.test(ua);\n if (isIOSWebKit) {\n return DeviceType.IOS;\n }\n\n // Strategy 8: Chrome detection for Android (when Android not explicitly found)\n const isChromeOnMobile = (window as any).chrome && /Mobile/i.test(ua);\n if (isChromeOnMobile && !iosPattern.test(ua)) {\n return DeviceType.ANDROID;\n }\n\n // Strategy 9: Check for mobile-specific patterns that indicate Android\n const androidMobilePattern = /Mobile.*Android|Android.*Mobile/i;\n if (androidMobilePattern.test(ua)) {\n return DeviceType.ANDROID;\n }\n\n // Strategy 10: Fallback using existing regex patterns\n const mobilePattern = /webos|blackberry|iemobile|opera mini/i;\n if (mobilePattern.test(ua)) {\n // These are typically Android-based or Android-like\n return DeviceType.ANDROID;\n }\n\n // Default fallback - Android is more common globally\n return DeviceType.ANDROID;\n}\n\n/**\n * Convenience method to check if current device is mobile\n * @returns {boolean} True if device is mobile\n */\nexport function isMobileDevice(): boolean {\n return getDeviceType() === DeviceType.MOBILE;\n}\n\n/**\n * Convenience method to check if current device is desktop\n * @returns {boolean} True if device is desktop\n */\nexport function isDesktopDevice(): boolean {\n return getDeviceType() === DeviceType.DESKTOP;\n}"],"mappings":"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","names":["exports","module","ClaimCreationType","import_ethers","import_canonicalize","logger","import_ethers","logger","canonicalize","logger","import_ethers","import_ethers","import_ethers","logger","logger","logger","proof","canonicalize","sdkVersion"]}
|
|
1
|
+
{"version":3,"sources":["../package.json","../src/index.ts","../src/utils/interfaces.ts","../src/witness.ts","../src/utils/types.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","../src/utils/modalUtils.ts","../src/utils/device.ts"],"sourcesContent":["{\n \"name\": \"@reclaimprotocol/js-sdk\",\n \"version\": \"4.4.0\",\n \"description\": \"Designed to request proofs from the Reclaim protocol and manage the flow of claims and witness interactions.\",\n \"main\": \"dist/index.js\",\n \"types\": \"dist/index.d.ts\",\n \"keywords\": [\n \"reclaim\",\n \"protocol\",\n \"blockchain\",\n \"proof\",\n \"verification\",\n \"identity\",\n \"claims\",\n \"witness\",\n \"sdk\",\n \"javascript\",\n \"typescript\",\n \"decentralized\",\n \"web3\"\n ],\n \"files\": [\n \"dist\"\n ],\n \"tsup\": {\n \"entry\": [\n \"src/index.ts\"\n ],\n \"splitting\": false,\n \"sourcemap\": true,\n \"clean\": true\n },\n \"scripts\": {\n \"build\": \"sh scripts/build.sh\",\n \"release\": \"release-it\",\n \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\",\n \"commitlint\": \"commitlint --edit\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/reclaimprotocol/reclaim-js-sdk\"\n },\n \"author\": \"ali <ali@creatoros.co>\",\n \"license\": \"See License in <https://github.com/reclaimprotocol/.github/blob/main/LICENSE>\",\n \"bugs\": {\n \"url\": \"https://github.com/reclaimprotocol/reclaim-js-sdk/issues\"\n },\n \"homepage\": \"https://github.com/reclaimprotocol/reclaim-js-sdk/\",\n \"publishConfig\": {\n \"registry\": \"https://registry.npmjs.org/\",\n \"access\": \"public\"\n },\n \"release-it\": {\n \"git\": {\n \"commitMessage\": \"chore: release ${version}\",\n \"tagName\": \"v${version}\"\n },\n \"npm\": {\n \"publish\": true,\n \"tag\": \"latest\"\n },\n \"github\": {\n \"release\": true\n },\n \"plugins\": {\n \"@release-it/conventional-changelog\": {\n \"preset\": \"angular\"\n }\n }\n },\n \"devDependencies\": {\n \"@commitlint/cli\": \"^17.7.1\",\n \"@commitlint/config-conventional\": \"^17.7.0\",\n \"tsup\": \"^8.0.1\",\n \"typescript\": \"^5.3.3\"\n },\n \"dependencies\": {\n \"@release-it/conventional-changelog\": \"^10.0.1\",\n \"canonicalize\": \"^2.0.0\",\n \"ethers\": \"^6.9.1\",\n \"release-it\": \"^19.0.4\"\n }\n}\n","export * from './Reclaim';\nexport * from './utils/interfaces';\nexport { ClaimCreationType, ModalOptions } from './utils/types';","// Proof-related interfaces\nexport interface Proof {\n identifier: string;\n claimData: ProviderClaimData;\n signatures: string[];\n witnesses: WitnessData[];\n extractedParameterValues: any;\n publicData?: { [key: string]: string };\n taskId?: number;\n}\n\n// Extension Interactions\nexport const RECLAIM_EXTENSION_ACTIONS = {\n CHECK_EXTENSION: 'RECLAIM_EXTENSION_CHECK',\n EXTENSION_RESPONSE: 'RECLAIM_EXTENSION_RESPONSE',\n START_VERIFICATION: 'RECLAIM_START_VERIFICATION',\n STATUS_UPDATE: 'RECLAIM_STATUS_UPDATE',\n};\n\nexport interface ExtensionMessage {\n action: string;\n messageId: string;\n data?: any;\n extensionID?: string;\n}\n\nexport interface WitnessData {\n id: string;\n url: string;\n}\n\nexport interface ProviderClaimData {\n provider: string;\n parameters: string;\n owner: string;\n timestampS: number;\n context: string;\n identifier: string;\n epoch: number;\n}\n\n// Context and Beacon interfaces\nexport interface Context {\n contextAddress: string;\n contextMessage: string;\n}\n\nexport interface Beacon {\n getState(epoch?: number): Promise<BeaconState>;\n close?(): Promise<void>;\n}\n\nexport type BeaconState = {\n witnesses: WitnessData[];\n epoch: number;\n witnessesRequiredForClaim: number;\n nextEpochTimestampS: number;\n};\n\n\n","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 { Context, Proof, ProviderClaimData } from './interfaces';\n\n// Claim-related types\nexport type ClaimID = ProviderClaimData['identifier'];\n\nexport type ClaimInfo = Pick<ProviderClaimData, 'context' | 'provider' | 'parameters'>;\n\nexport type AnyClaimInfo = ClaimInfo | { identifier: ClaimID };\n\nexport type CompleteClaimData = Pick<ProviderClaimData, 'owner' | 'timestampS' | 'epoch'> & AnyClaimInfo;\n\nexport type SignedClaim = {\n claim: CompleteClaimData;\n signatures: Uint8Array[];\n};\n\n// Request and session-related types\nexport type CreateVerificationRequest = {\n providerIds: string[];\n applicationSecret?: string;\n};\n\nexport type StartSessionParams = {\n onSuccess: OnSuccess;\n onError: OnError;\n};\n\nexport type OnSuccess = (proof?: Proof | Proof[] | string) => void;\nexport type OnError = (error: Error) => void;\n\nexport type ProofRequestOptions = {\n log?: boolean;\n acceptAiProviders?: boolean;\n useAppClip?: boolean;\n device?: string;\n envUrl?: string;\n useBrowserExtension?: boolean;\n extensionID?: string;\n providerVersion?: string;\n customSharePageUrl?: string;\n customAppClipUrl?: string\n};\n\n// Modal customization options\nexport type ModalOptions = {\n title?: string;\n description?: string;\n extensionUrl?: string;\n darkTheme?: boolean;\n modalPopupTimer?: number;\n showExtensionInstallButton?: boolean;\n onClose?: () => void;\n};\n\n// JSON-safe modal options (excludes non-serializable functions)\nexport type SerializableModalOptions = Omit<ModalOptions, 'onClose'>;\n\n// Claim creation type enum\nexport enum ClaimCreationType {\n STANDALONE = 'createClaim',\n ON_ME_CHAIN = 'createClaimOnMechain'\n}\n\n// Device type enum \nexport enum DeviceType {\n ANDROID = 'android',\n IOS = 'ios',\n DESKTOP = 'desktop',\n MOBILE = 'mobile'\n}\n\n\n// Session and response types\nexport type InitSessionResponse = {\n sessionId: string;\n resolvedProviderVersion: string;\n};\n\nexport interface UpdateSessionResponse {\n success: boolean;\n message?: string;\n};\n\nexport enum SessionStatus {\n SESSION_INIT = 'SESSION_INIT',\n SESSION_STARTED = 'SESSION_STARTED',\n USER_INIT_VERIFICATION = 'USER_INIT_VERIFICATION',\n USER_STARTED_VERIFICATION = 'USER_STARTED_VERIFICATION',\n PROOF_GENERATION_STARTED = 'PROOF_GENERATION_STARTED',\n PROOF_GENERATION_SUCCESS = 'PROOF_GENERATION_SUCCESS',\n PROOF_GENERATION_FAILED = 'PROOF_GENERATION_FAILED',\n PROOF_SUBMITTED = 'PROOF_SUBMITTED',\n PROOF_SUBMISSION_FAILED = 'PROOF_SUBMISSION_FAILED',\n PROOF_MANUAL_VERIFICATION_SUBMITED = 'PROOF_MANUAL_VERIFICATION_SUBMITED',\n};\n\n// JSON and template-related types\nexport type ProofPropertiesJSON = {\n applicationId: string;\n providerId: string;\n sessionId: string;\n context: Context;\n signature: string;\n redirectUrl?: string;\n parameters: { [key: string]: string };\n timeStamp: string;\n appCallbackUrl?: string;\n claimCreationType?: ClaimCreationType;\n options?: ProofRequestOptions;\n sdkVersion: string;\n jsonProofResponse?: boolean;\n resolvedProviderVersion: string;\n modalOptions?: SerializableModalOptions;\n};\n\nexport type TemplateData = {\n sessionId: string;\n providerId: string;\n applicationId: string;\n signature: string;\n timestamp: string;\n callbackUrl: string;\n context: string;\n parameters: { [key: string]: string };\n redirectUrl: string;\n acceptAiProviders: boolean;\n sdkVersion: string;\n jsonProofResponse?: boolean;\n providerVersion?: string;\n resolvedProviderVersion: string;\n};\n\n// Add the new StatusUrlResponse type\nexport type StatusUrlResponse = {\n message: string;\n session?: {\n id: string;\n appId: string;\n httpProviderId: string[];\n sessionId: string;\n proofs?: Proof[];\n statusV2: string;\n };\n providerId?: string;\n};","import { type Proof, type Context, RECLAIM_EXTENSION_ACTIONS, ExtensionMessage } from './utils/interfaces'\nimport { getIdentifierFromClaimInfo } from './witness'\nimport {\n SignedClaim,\n ProofRequestOptions,\n StartSessionParams,\n ProofPropertiesJSON,\n TemplateData,\n InitSessionResponse,\n ClaimCreationType,\n ModalOptions,\n} from './utils/types'\nimport { SessionStatus, DeviceType } from './utils/types'\nimport { ethers } from 'ethers'\nimport canonicalize from 'canonicalize'\nimport {\n replaceAll,\n scheduleIntervalEndingTask\n} from './utils/helper'\nimport { constants, setBackendBaseUrl } from './utils/constants'\nimport {\n AddContextError,\n GetAppCallbackUrlError,\n GetStatusUrlError,\n InitError,\n InvalidParamError,\n ProofNotVerifiedError,\n ProofSubmissionFailedError,\n ProviderFailedError,\n SessionNotStartedError,\n SetParamsError,\n SetSignatureError,\n SignatureGeneratingError,\n SignatureNotFoundError\n} from './utils/errors'\nimport { validateContext, validateFunctionParams, validateParameters, validateSignature, validateURL, validateModalOptions } from './utils/validationUtils'\nimport { fetchStatusUrl, initSession, updateSession } from './utils/sessionUtils'\nimport { assertValidSignedClaim, createLinkWithTemplateData, getWitnessesForClaim } from './utils/proofUtils'\nimport { QRCodeModal } from './utils/modalUtils'\nimport loggerModule from './utils/logger';\nimport { getDeviceType, getMobileDeviceType, isMobileDevice } from './utils/device'\nconst logger = loggerModule.logger\n\nconst sdkVersion = require('../package.json').version;\n\n// Implementation\nexport async function verifyProof(proofOrProofs: Proof | Proof[]): Promise<boolean> {\n // If input is an array of proofs\n if (Array.isArray(proofOrProofs)) {\n for (const proof of proofOrProofs) {\n const isVerified = await verifyProof(proof);\n if (!isVerified) {\n return false;\n }\n }\n return true;\n }\n\n // Single proof verification logic\n const proof = proofOrProofs;\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\n// create a empty template data object to assign to templateData\nconst emptyTemplateData: TemplateData = {\n sessionId: '',\n providerId: '',\n applicationId: '',\n signature: '',\n timestamp: '',\n callbackUrl: '',\n context: '',\n parameters: {},\n redirectUrl: '',\n acceptAiProviders: false,\n sdkVersion: '',\n providerVersion: '',\n resolvedProviderVersion: '',\n jsonProofResponse: false\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 claimCreationType?: ClaimCreationType = ClaimCreationType.STANDALONE;\n private providerId: string;\n private resolvedProviderVersion?: string;\n private parameters: { [key: string]: string };\n private redirectUrl?: string;\n private intervals: Map<string, NodeJS.Timer> = new Map();\n private timeStamp: string;\n private sdkVersion: string;\n private jsonProofResponse: boolean = false;\n private lastFailureTime?: number;\n private templateData: TemplateData;\n private extensionID: string = \"reclaim-extension\";\n private customSharePageUrl?: string;\n private customAppClipUrl?: string;\n private modalOptions?: ModalOptions;\n private modal?: QRCodeModal;\n private readonly FAILURE_TIMEOUT = 30000; // 30 seconds timeout, can be adjusted\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 // keep template data as empty object \n this.templateData = emptyTemplateData;\n this.parameters = {};\n\n if (!options) {\n options = {};\n }\n\n options.useBrowserExtension = options.useBrowserExtension ?? true;\n\n if (options?.log) {\n loggerModule.setLogLevel('info');\n } else {\n loggerModule.setLogLevel('silent');\n }\n\n if (options.useAppClip === undefined) {\n options.useAppClip = true;\n }\n\n if (options?.envUrl) {\n setBackendBaseUrl(options.envUrl);\n }\n\n if (options.extensionID) {\n this.extensionID = options.extensionID;\n }\n\n if (options?.customSharePageUrl) {\n this.customSharePageUrl = options.customSharePageUrl;\n }\n\n if(options?.customAppClipUrl){\n this.customAppClipUrl = options.customAppClipUrl;\n }\n\n this.options = options;\n // Fetch sdk version from package.json\n this.sdkVersion = 'js-' + sdkVersion;\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.providerVersion) {\n validateFunctionParams([\n { paramName: 'providerVersion', input: options.providerVersion, isString: true }\n ], 'the constructor')\n }\n if (options.log) {\n validateFunctionParams([\n { paramName: 'log', input: options.log }\n ], 'the constructor')\n }\n if (options.useAppClip) {\n validateFunctionParams([\n { paramName: 'useAppClip', input: options.useAppClip }\n ], 'the constructor')\n }\n if (options.device) {\n validateFunctionParams([\n { paramName: 'device', input: options.device, isString: true }\n ], 'the constructor')\n }\n if (options.useBrowserExtension) {\n validateFunctionParams([\n { paramName: 'useBrowserExtension', input: options.useBrowserExtension }\n ], 'the constructor')\n }\n if (options.extensionID) {\n validateFunctionParams([\n { paramName: 'extensionID', input: options.extensionID, isString: true }\n ], 'the constructor')\n }\n if (options.envUrl) {\n validateFunctionParams([\n { paramName: 'envUrl', input: options.envUrl, isString: true }\n ], 'the constructor')\n }\n if (options.customSharePageUrl) {\n validateFunctionParams([\n { paramName: 'customSharePageUrl', input: options.customSharePageUrl, isString: true }\n ], 'the constructor')\n }\n if (options.customAppClipUrl) {\n validateFunctionParams([\n { paramName: 'customAppClipUrl', input: options.customAppClipUrl, isString: true }\n ], 'the constructor')\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: InitSessionResponse = await initSession(providerId, applicationId, proofRequestInstance.timeStamp, signature, options?.providerVersion);\n proofRequestInstance.sessionId = data.sessionId\n proofRequestInstance.resolvedProviderVersion = data.resolvedProviderVersion\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 parameters,\n signature,\n redirectUrl,\n timeStamp,\n appCallbackUrl,\n claimCreationType,\n options,\n sdkVersion,\n jsonProofResponse,\n resolvedProviderVersion,\n modalOptions\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 { input: sdkVersion, paramName: 'sdkVersion', isString: true },\n ], 'fromJsonString');\n\n if (modalOptions) {\n validateModalOptions(modalOptions, 'fromJsonString', 'modalOptions.');\n }\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 if (parameters) {\n validateParameters(parameters);\n }\n\n if (claimCreationType) {\n validateFunctionParams([\n { input: claimCreationType, paramName: 'claimCreationType' }\n ], 'fromJsonString');\n }\n\n if (jsonProofResponse !== undefined) {\n validateFunctionParams([\n { input: jsonProofResponse, paramName: 'jsonProofResponse' }\n ], 'fromJsonString');\n }\n\n\n if (options?.providerVersion) {\n validateFunctionParams([\n { input: options.providerVersion, paramName: 'providerVersion', isString: true }\n ], 'fromJsonString');\n }\n\n if (resolvedProviderVersion) {\n validateFunctionParams([\n { input: resolvedProviderVersion, paramName: 'resolvedProviderVersion', isString: true }\n ], 'fromJsonString');\n }\n\n const proofRequestInstance = new ReclaimProofRequest(applicationId, providerId, options);\n proofRequestInstance.sessionId = sessionId;\n proofRequestInstance.context = context;\n proofRequestInstance.parameters = parameters;\n proofRequestInstance.appCallbackUrl = appCallbackUrl\n proofRequestInstance.redirectUrl = redirectUrl\n proofRequestInstance.timeStamp = timeStamp\n proofRequestInstance.signature = signature\n proofRequestInstance.sdkVersion = sdkVersion;\n proofRequestInstance.resolvedProviderVersion = resolvedProviderVersion;\n proofRequestInstance.modalOptions = modalOptions;\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, jsonProofResponse?: boolean): void {\n validateURL(url, 'setAppCallbackUrl')\n this.appCallbackUrl = url\n this.jsonProofResponse = jsonProofResponse ?? false\n }\n\n setRedirectUrl(url: string): void {\n validateURL(url, 'setRedirectUrl');\n this.redirectUrl = url;\n }\n\n setClaimCreationType(claimCreationType: ClaimCreationType): void {\n this.claimCreationType = claimCreationType;\n }\n\n setModalOptions(options: ModalOptions): void {\n try {\n // Validate modal options\n validateModalOptions(options, 'setModalOptions');\n\n this.modalOptions = { ...this.modalOptions, ...options };\n logger.info('Modal options set successfully');\n } catch (error) {\n logger.info('Error setting modal options:', error);\n throw new SetParamsError('Error setting modal options', error as Error);\n }\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 validateParameters(params);\n this.parameters = { ...this.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 // getter for SessionId\n getSessionId(): string {\n if (!this.sessionId) {\n throw new SessionNotStartedError(\"SessionId is not set\");\n }\n return this.sessionId;\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 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 private buildSharePageUrl(template: string): string {\n const baseUrl = 'https://share.reclaimprotocol.org/verify';\n \n if (this.customSharePageUrl) {\n return `${this.customSharePageUrl}/?template=${template}`;\n }\n \n return `${baseUrl}/?template=${template}`;\n }\n\n // Public methods\n toJsonString(): string {\n return JSON.stringify({\n applicationId: this.applicationId,\n providerId: this.providerId,\n sessionId: this.sessionId,\n context: this.context,\n appCallbackUrl: this.appCallbackUrl,\n claimCreationType: this.claimCreationType,\n parameters: this.parameters,\n signature: this.signature,\n redirectUrl: this.redirectUrl,\n timeStamp: this.timeStamp,\n options: this.options,\n sdkVersion: this.sdkVersion,\n jsonProofResponse: this.jsonProofResponse,\n resolvedProviderVersion: this.resolvedProviderVersion ?? '',\n modalOptions: this.modalOptions ? {\n title: this.modalOptions.title,\n description: this.modalOptions.description,\n extensionUrl: this.modalOptions.extensionUrl,\n darkTheme: this.modalOptions.darkTheme,\n modalPopupTimer: this.modalOptions.modalPopupTimer,\n showExtensionInstallButton: this.modalOptions.showExtensionInstallButton\n // onClose is intentionally excluded as functions cannot be serialized\n } : undefined\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 validateSignature(this.providerId, this.signature, this.applicationId, this.timeStamp)\n\n const templateData: TemplateData = {\n sessionId: this.sessionId,\n providerId: this.providerId,\n providerVersion: this.options?.providerVersion ?? '',\n resolvedProviderVersion: this.resolvedProviderVersion ?? '',\n applicationId: this.applicationId,\n signature: this.signature,\n timestamp: this.timeStamp,\n callbackUrl: this.getAppCallbackUrl(),\n context: JSON.stringify(this.context),\n parameters: this.parameters,\n redirectUrl: this.redirectUrl ?? '',\n acceptAiProviders: this.options?.acceptAiProviders ?? false,\n sdkVersion: this.sdkVersion,\n jsonProofResponse: this.jsonProofResponse\n\n }\n await updateSession(this.sessionId, SessionStatus.SESSION_STARTED)\n const deviceType = getDeviceType();\n if (this.options?.useAppClip && deviceType === DeviceType.MOBILE) {\n let template = encodeURIComponent(JSON.stringify(templateData));\n template = replaceAll(template, '(', '%28');\n template = replaceAll(template, ')', '%29');\n\n // check if the app is running on iOS or Android\n const isIos = getMobileDeviceType() === DeviceType.IOS;\n if (!isIos) {\n const instantAppUrl = this.buildSharePageUrl(template);\n logger.info('Instant App Url created successfully: ' + instantAppUrl);\n return instantAppUrl;\n } else {\n const appClipUrl = this.customAppClipUrl ? `${this.customAppClipUrl}&template=${template}` : `https://appclip.apple.com/id?p=org.reclaimprotocol.app.clip&template=${template}`;\n logger.info('App Clip Url created successfully: ' + appClipUrl);\n return appClipUrl;\n }\n } else {\n const link = await createLinkWithTemplateData(templateData, this.customSharePageUrl)\n logger.info('Request Url created successfully: ' + link);\n return link;\n }\n } catch (error) {\n logger.info('Error creating Request Url:', error)\n throw error\n }\n }\n\n async triggerReclaimFlow(): Promise<void> {\n if (!this.signature) {\n throw new SignatureNotFoundError('Signature is not set.')\n }\n\n try {\n validateSignature(this.providerId, this.signature, this.applicationId, this.timeStamp)\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 providerVersion: this.options?.providerVersion ?? '',\n resolvedProviderVersion: this.resolvedProviderVersion ?? '',\n parameters: this.parameters,\n redirectUrl: this.redirectUrl ?? '',\n acceptAiProviders: this.options?.acceptAiProviders ?? false,\n sdkVersion: this.sdkVersion,\n jsonProofResponse: this.jsonProofResponse\n }\n\n this.templateData = templateData;\n\n logger.info('Triggering Reclaim flow');\n\n // Get device type\n const deviceType = getDeviceType();\n await updateSession(this.sessionId, SessionStatus.SESSION_STARTED)\n\n if (deviceType === DeviceType.DESKTOP) {\n const extensionAvailable = await this.isBrowserExtensionAvailable();\n // Desktop flow\n if (this.options?.useBrowserExtension && extensionAvailable) {\n logger.info('Triggering browser extension flow');\n this.triggerBrowserExtensionFlow();\n return;\n } else {\n // Show QR code popup modal\n logger.info('Browser extension not available, showing QR code modal');\n await this.showQRCodeModal();\n }\n } else if (deviceType === DeviceType.MOBILE) {\n // Mobile flow\n const mobileDeviceType = getMobileDeviceType();\n\n if (mobileDeviceType === DeviceType.ANDROID) {\n // Redirect to instant app URL\n logger.info('Redirecting to Android instant app');\n await this.redirectToInstantApp();\n } else if (mobileDeviceType === DeviceType.IOS) {\n // Redirect to app clip URL\n logger.info('Redirecting to iOS app clip');\n await this.redirectToAppClip();\n }\n }\n } catch (error) {\n logger.info('Error triggering Reclaim flow:', error);\n throw error;\n }\n }\n\n\n async isBrowserExtensionAvailable(timeout = 200): Promise<boolean> {\n try {\n return new Promise<boolean>((resolve) => {\n const messageId = `reclaim-check-${Date.now()}`;\n\n const timeoutId = setTimeout(() => {\n window.removeEventListener('message', messageListener);\n resolve(false);\n }, timeout);\n\n const messageListener = (event: MessageEvent) => {\n if (event.data?.action === RECLAIM_EXTENSION_ACTIONS.EXTENSION_RESPONSE &&\n event.data?.messageId === messageId) {\n clearTimeout(timeoutId);\n window.removeEventListener('message', messageListener);\n resolve(!!event.data.installed);\n }\n };\n\n window.addEventListener('message', messageListener);\n const message: ExtensionMessage = {\n action: RECLAIM_EXTENSION_ACTIONS.CHECK_EXTENSION,\n extensionID: this.extensionID,\n messageId: messageId\n }\n window.postMessage(message, '*');\n });\n } catch (error) {\n logger.info('Error checking Reclaim extension installed:', error);\n return false;\n }\n }\n\n private triggerBrowserExtensionFlow(): void {\n const message: ExtensionMessage = {\n action: RECLAIM_EXTENSION_ACTIONS.START_VERIFICATION,\n messageId: this.sessionId,\n data: this.templateData,\n extensionID: this.extensionID\n }\n window.postMessage(message, '*');\n logger.info('Browser extension flow triggered');\n }\n\n private async showQRCodeModal(): Promise<void> {\n try {\n const requestUrl = await createLinkWithTemplateData(this.templateData, this.customSharePageUrl);\n this.modal = new QRCodeModal(this.modalOptions);\n await this.modal.show(requestUrl);\n } catch (error) {\n logger.info('Error showing QR code modal:', error);\n throw error;\n }\n }\n\n private async redirectToInstantApp(): Promise<void> {\n try {\n let template = encodeURIComponent(JSON.stringify(this.templateData));\n template = replaceAll(template, '(', '%28');\n template = replaceAll(template, ')', '%29');\n\n const instantAppUrl = this.buildSharePageUrl(template);\n logger.info('Redirecting to Android instant app: ' + instantAppUrl);\n\n // Redirect to instant app\n window.location.href = instantAppUrl;\n } catch (error) {\n logger.info('Error redirecting to instant app:', error);\n throw error;\n }\n }\n\n private async redirectToAppClip(): Promise<void> {\n try {\n let template = encodeURIComponent(JSON.stringify(this.templateData));\n template = replaceAll(template, '(', '%28');\n template = replaceAll(template, ')', '%29');\n\n const appClipUrl = this.customAppClipUrl ? `${this.customAppClipUrl}&template=${template}` : `https://appclip.apple.com/id?p=org.reclaimprotocol.app.clip&template=${template}`;\n logger.info('Redirecting to iOS app clip: ' + appClipUrl);\n\n // Redirect to app clip\n window.location.href = appClipUrl;\n } catch (error) {\n logger.info('Error redirecting to app clip:', 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 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\n // Reset failure time if status is not PROOF_GENERATION_FAILED\n if (statusUrlResponse.session.statusV2 !== SessionStatus.PROOF_GENERATION_FAILED) {\n this.lastFailureTime = undefined;\n }\n\n // Check for failure timeout\n if (statusUrlResponse.session.statusV2 === SessionStatus.PROOF_GENERATION_FAILED) {\n const currentTime = Date.now();\n if (!this.lastFailureTime) {\n this.lastFailureTime = currentTime;\n } else if (currentTime - this.lastFailureTime >= this.FAILURE_TIMEOUT) {\n throw new ProviderFailedError('Proof generation failed - timeout reached');\n }\n return; // Continue monitoring if under timeout\n }\n\n const isDefaultCallbackUrl = this.getAppCallbackUrl() === `${constants.DEFAULT_RECLAIM_CALLBACK_URL}${this.sessionId}`;\n\n if (isDefaultCallbackUrl) {\n if (statusUrlResponse.session.proofs && statusUrlResponse.session.proofs.length > 0) {\n const proofs = statusUrlResponse.session.proofs;\n if (this.claimCreationType === ClaimCreationType.STANDALONE) {\n const verified = await verifyProof(proofs);\n if (!verified) {\n logger.info(`Proofs not verified: ${JSON.stringify(proofs)}`);\n throw new ProofNotVerifiedError();\n }\n }\n // check if the proofs array has only one proof then send the proofs in onSuccess \n if (proofs.length === 1) {\n\n onSuccess(proofs[0]);\n } else {\n onSuccess(proofs);\n }\n this.clearInterval();\n this.modal?.close();\n }\n } else {\n if (statusUrlResponse.session.statusV2 === SessionStatus.PROOF_SUBMISSION_FAILED) {\n throw new ProofSubmissionFailedError();\n }\n if (statusUrlResponse.session.statusV2 === SessionStatus.PROOF_SUBMITTED) {\n if (onSuccess) {\n onSuccess('Proof submitted successfully to the custom callback url');\n }\n this.clearInterval();\n this.modal?.close();\n }\n }\n } catch (e) {\n if (onError) {\n onError(e as Error);\n }\n this.clearInterval();\n this.modal?.close();\n }\n }, 3000);\n\n this.intervals.set(this.sessionId, interval);\n scheduleIntervalEndingTask(this.sessionId, this.intervals, onError);\n }\n\n closeModal(): void {\n if (this.modal) {\n this.modal.close();\n logger.info('Modal closed by user');\n }\n }\n}\n\n","function createErrorClass(name: string) {\n return class extends Error {\n constructor(message?: string, public innerError?: Error) {\n // Include inner error message in the main message if available\n const fullMessage = innerError \n ? `${message || ''} caused by ${innerError.name}: ${innerError.message}`\n : message;\n \n super(fullMessage);\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 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 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 StatusUrlError = createErrorClass('StatusUrlError');\nexport const InavlidParametersError = createErrorClass('InavlidParametersError');\nexport const ProofSubmissionFailedError = createErrorClass('ProofSubmissionFailedError');","// 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 let BACKEND_BASE_URL = \"https://api.reclaimprotocol.org\";\n\nexport function setBackendBaseUrl(url: string) {\n BACKEND_BASE_URL = url;\n}\n\n// Constant values used throughout the application\nexport const constants = {\n // Default callback URL for Reclaim protocol\n get DEFAULT_RECLAIM_CALLBACK_URL() {\n return `${BACKEND_BASE_URL}/api/sdk/callback?callbackId=`;\n },\n\n // Default status URL for Reclaim sessions\n get DEFAULT_RECLAIM_STATUS_URL() {\n return `${BACKEND_BASE_URL}/api/sdk/session/`;\n },\n\n // URL for sharing Reclaim templates\n RECLAIM_SHARE_URL: 'https://share.reclaimprotocol.org/verifier/?template=',\n\n // Chrome extension URL for Reclaim Protocol\n CHROME_EXTENSION_URL: 'https://chromewebstore.google.com/detail/reclaim-extension/oafieibbbcepkmenknelhmgaoahamdeh',\n\n // QR Code API base URL\n QR_CODE_API_URL: 'https://api.qrserver.com/v1/create-qr-code/'\n};\n","import { ethers } from \"ethers\";\nimport { InavlidParametersError, InvalidParamError, InvalidSignatureError } from \"./errors\";\nimport canonicalize from 'canonicalize'\nimport { Context } from \"./interfaces\";\nimport loggerModule from './logger';\nimport { ProofRequestOptions, ModalOptions } 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// validate the parameters\n/** \n * Validates the parameters object\n * @param parameters - The parameters object to validate\n * @throws InavlidParametersError if the parameters object is not valid\n */\nexport function validateParameters(parameters: { [key: string]: string }): void {\n try {\n // check if the parameters is an object of key value pairs of string and string\n if (typeof parameters !== 'object' || parameters === null) {\n logger.info(`Parameters validation failed: Provided parameters is not an object`);\n throw new InavlidParametersError(`The provided parameters is not an object`);\n }\n // check each key and value in the parameters object\n for (const [key, value] of Object.entries(parameters)) {\n if (typeof key !== 'string' || typeof value !== 'string') {\n logger.info(`Parameters validation failed: Provided parameters is not an object of key value pairs of string and string`);\n throw new InavlidParametersError(`The provided parameters is not an object of key value pairs of string and string`);\n }\n }\n } catch (e) {\n logger.info(`Parameters validation failed: ${(e as Error).message}`);\n throw new InavlidParametersError(`Invalid parameters passed to validateParameters.`, e as Error);\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 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 if (options.providerVersion && typeof options.providerVersion !== 'string') {\n logger.info(`Options validation failed: Provided providerVersion in options is not valid`);\n throw new InvalidParamError(`The provided providerVersion in options is not valid`);\n }\n}\n\n/**\n * Validates the modalOptions object\n * @param modalOptions - The modalOptions object to validate\n * @param functionName - The name of the function calling this validation\n * @param paramPrefix - Optional prefix for parameter names (e.g., 'modalOptions.')\n * @throws InvalidParamError if the modalOptions object is not valid\n */\nexport function validateModalOptions(modalOptions: ModalOptions, functionName: string, paramPrefix: string = ''): void {\n if (modalOptions.title !== undefined) {\n validateFunctionParams([\n { input: modalOptions.title, paramName: `${paramPrefix}title`, isString: true }\n ], functionName);\n }\n\n if (modalOptions.description !== undefined) {\n validateFunctionParams([\n { input: modalOptions.description, paramName: `${paramPrefix}description`, isString: true }\n ], functionName);\n }\n\n if (modalOptions.extensionUrl !== undefined) {\n validateURL(modalOptions.extensionUrl, functionName);\n validateFunctionParams([\n { input: modalOptions.extensionUrl, paramName: `${paramPrefix}extensionUrl`, isString: true }\n ], functionName);\n }\n\n if (modalOptions.darkTheme !== undefined) {\n if (typeof modalOptions.darkTheme !== 'boolean') {\n throw new InvalidParamError(`${paramPrefix}darkTheme prop must be a boolean`);\n }\n validateFunctionParams([\n { input: modalOptions.darkTheme, paramName: `${paramPrefix}darkTheme` }\n ], functionName);\n }\n\n if (modalOptions.modalPopupTimer !== undefined) {\n if (typeof modalOptions.modalPopupTimer !== 'number' || modalOptions.modalPopupTimer <= 0 || !Number.isInteger(modalOptions.modalPopupTimer)) {\n throw new InvalidParamError(`${paramPrefix}modalPopupTimer prop must be a valid time in minutes`);\n }\n validateFunctionParams([\n { input: modalOptions.modalPopupTimer, paramName: `${paramPrefix}modalPopupTimer` }\n ], functionName);\n }\n\n if (modalOptions.showExtensionInstallButton !== undefined) {\n if (typeof modalOptions.showExtensionInstallButton !== 'boolean') {\n throw new InvalidParamError(`${paramPrefix}showExtensionInstallButton prop must be a boolean`);\n }\n validateFunctionParams([\n { input: modalOptions.showExtensionInstallButton, paramName: `${paramPrefix}showExtensionInstallButton` }\n ], functionName);\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 versionNumber?: 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, versionNumber })\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 { 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/**\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 * @param sharePagePath - The path to the share page (optional)\n * @returns A promise that resolves to the created link (shortened if possible)\n */\nexport async function createLinkWithTemplateData(templateData: TemplateData, sharePagePath?: string): Promise<string> {\n let template = encodeURIComponent(JSON.stringify(templateData))\n template = replaceAll(template, '(', '%28')\n template = replaceAll(template, ')', '%29')\n const fullLink = sharePagePath ? `${sharePagePath}/?template=${template}` : `${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","import loggerModule from './logger';\nimport { ModalOptions } from './types';\nimport { constants } from './constants';\nconst logger = loggerModule.logger;\n\nexport class QRCodeModal {\n private modalId: string;\n private options: ModalOptions;\n private autoCloseTimer?: NodeJS.Timeout;\n private countdownTimer?: NodeJS.Timeout;\n private countdownSeconds: number = 60;\n\n constructor(options: ModalOptions = {}) {\n this.modalId = 'reclaim-qr-modal';\n this.options = {\n title: 'Verify with Reclaim',\n description: 'Scan the QR code with your mobile device to complete verification',\n extensionUrl: constants.CHROME_EXTENSION_URL,\n darkTheme: false,\n modalPopupTimer: 1, // default to 1 minute\n showExtensionInstallButton: false, // default to false\n ...options\n };\n }\n\n async show(requestUrl: string): Promise<void> {\n try {\n // Remove existing modal if present\n this.close();\n\n // Create modal HTML\n const modalHTML = this.createModalHTML();\n\n // Add modal to DOM\n document.body.insertAdjacentHTML('beforeend', modalHTML);\n\n // Generate QR code\n await this.generateQRCode(requestUrl, 'reclaim-qr-code');\n\n // Add event listeners\n this.addEventListeners();\n\n // Start auto-close timer\n this.startAutoCloseTimer();\n\n } catch (error) {\n logger.info('Error showing QR code modal:', error);\n throw error;\n }\n }\n\n close(): void {\n // Clear timers\n if (this.autoCloseTimer) {\n clearTimeout(this.autoCloseTimer);\n this.autoCloseTimer = undefined;\n }\n if (this.countdownTimer) {\n clearInterval(this.countdownTimer);\n this.countdownTimer = undefined;\n }\n\n const modal = document.getElementById(this.modalId);\n if (modal) {\n modal.remove();\n }\n if (this.options.onClose) {\n this.options.onClose();\n }\n }\n\n private getThemeStyles() {\n const isDark = this.options.darkTheme;\n\n return {\n modalBackground: isDark ? 'rgba(0, 0, 0, 0.8)' : 'rgba(0, 0, 0, 0.5)',\n cardBackground: isDark ? '#1f2937' : 'white',\n titleColor: isDark ? '#f9fafb' : '#1f2937',\n textColor: isDark ? '#d1d5db' : '#6b7280',\n qrBackground: isDark ? '#374151' : '#f9fafb',\n tipBackground: isDark ? '#1e40af' : '#f0f9ff',\n tipBorder: isDark ? '#1e40af' : '#e0f2fe',\n tipTextColor: isDark ? '#dbeafe' : '#0369a1',\n buttonBackground: isDark ? '#374151' : '#f3f4f6',\n buttonColor: isDark ? '#f9fafb' : '#374151',\n buttonHoverBackground: isDark ? '#4b5563' : '#e5e7eb',\n countdownColor: isDark ? '#6b7280' : '#9ca3af',\n progressBackground: isDark ? '#4b5563' : '#e5e7eb',\n progressGradient: isDark\n ? 'linear-gradient(90deg, #3b82f6 0%, #2563eb 50%, #1d4ed8 100%)'\n : 'linear-gradient(90deg, #2563eb 0%, #1d4ed8 50%, #1e40af 100%)',\n linkColor: isDark ? '#60a5fa' : '#2563eb',\n extensionButtonBackground: isDark ? '#1e40af' : '#2563eb',\n extensionButtonHover: isDark ? '#1d4ed8' : '#1d4ed8'\n };\n }\n\n private createModalHTML(): string {\n const styles = this.getThemeStyles();\n\n return `\n <div id=\"${this.modalId}\" style=\"\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background-color: ${styles.modalBackground};\n display: flex;\n justify-content: center;\n align-items: center;\n z-index: 10000;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n \">\n <div style=\"\n background: ${styles.cardBackground};\n border-radius: 12px;\n padding: 32px;\n max-width: 400px;\n width: 90%;\n text-align: center;\n box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);\n position: relative;\n \">\n <button id=\"reclaim-close-modal\" style=\"\n position: absolute;\n top: 16px;\n right: 16px;\n background: none;\n border: none;\n cursor: pointer;\n padding: 4px;\n border-radius: 6px;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: background-color 0.2s;\n width: 32px;\n height: 32px;\n \"\n onmouseover=\"this.style.backgroundColor='${styles.buttonHoverBackground}'\"\n onmouseout=\"this.style.backgroundColor='transparent'\"\n title=\"Close modal\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M12 4L4 12M4 4L12 12\" stroke=\"${styles.buttonColor}\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n \n <h2 style=\"\n margin: 0 0 16px 0;\n font-size: 24px;\n font-weight: 600;\n color: ${styles.titleColor};\n \">${this.options.title}</h2>\n \n <p style=\"\n margin: 0 0 24px 0;\n color: ${styles.textColor};\n font-size: 14px;\n line-height: 1.5;\n \">${this.options.description}</p>\n \n <div id=\"reclaim-qr-code\" style=\"\n margin: 0 auto 24px auto;\n background: ${styles.qrBackground};\n border-radius: 8px;\n display: inline-block;\n \"></div>\n \n ${this.options.showExtensionInstallButton ? `\n <div style=\"\n margin-bottom: 24px;\n padding: 16px;\n background: ${styles.tipBackground};\n border: 1px solid ${styles.tipBorder};\n border-radius: 8px;\n \">\n <p style=\"\n margin: 0 0 12px 0;\n font-size: 14px;\n color: ${styles.tipTextColor};\n font-weight: 500;\n \">💡 For a better experience</p>\n <p style=\"\n margin: 0 0 12px 0;\n font-size: 13px;\n color: ${styles.tipTextColor};\n line-height: 1.4;\n \">Install our browser extension for seamless verification without QR codes</p>\n <a href=\"${this.options.extensionUrl}\" \n target=\"_blank\" \n style=\"\n display: inline-block;\n background: ${styles.extensionButtonBackground};\n color: white;\n text-decoration: none;\n padding: 8px 16px;\n border-radius: 6px;\n font-size: 12px;\n font-weight: 500;\n transition: background-color 0.2s;\n \"\n onmouseover=\"this.style.backgroundColor='${styles.extensionButtonHover}'\"\n onmouseout=\"this.style.backgroundColor='${styles.extensionButtonBackground}'\">\n Install Extension\n </a>\n </div>` : ''}\n \n <div style=\"margin-top: 16px;\">\n <div id=\"reclaim-countdown\" style=\"\n font-size: 12px;\n color: ${styles.countdownColor};\n font-weight: 400;\n margin-bottom: 8px;\n \">Auto-close in 1:00</div>\n \n <div style=\"\n width: 100%;\n height: 4px;\n background-color: ${styles.progressBackground};\n border-radius: 2px;\n overflow: hidden;\n \">\n <div id=\"reclaim-progress-bar\" style=\"\n width: 100%;\n height: 100%;\n background: ${styles.progressGradient};\n border-radius: 2px;\n transition: width 1s linear;\n \"></div>\n </div>\n </div>\n </div>\n </div>\n `\n }\n\n private async generateQRCode(text: string, containerId: string): Promise<void> {\n try {\n // Simple QR code generation using a public API\n // In production, you might want to use a proper QR code library\n const qrCodeUrl = `${constants.QR_CODE_API_URL}?size=200x200&data=${encodeURIComponent(text)}`;\n\n const container = document.getElementById(containerId);\n const styles = this.getThemeStyles();\n\n if (container) {\n container.innerHTML = `\n <img src=\"${qrCodeUrl}\" \n alt=\"QR Code for Reclaim verification\" \n style=\"width: 200px; height: 200px; border-radius: 4px;\"\n onerror=\"this.style.display='none'; this.nextElementSibling.style.display='block';\">\n <div style=\"display: none; padding: 20px; color: ${styles.textColor}; font-size: 14px;\">\n QR code could not be loaded.<br>\n <a href=\"${text}\" target=\"_blank\" style=\"color: ${styles.linkColor}; text-decoration: underline;\">\n Click here to open verification link\n </a>\n </div>\n `;\n }\n } catch (error) {\n logger.info('Error generating QR code:', error);\n // Fallback to text link\n const container = document.getElementById(containerId);\n const styles = this.getThemeStyles();\n\n if (container) {\n container.innerHTML = `\n <div style=\"padding: 20px; color: ${styles.textColor}; font-size: 14px;\">\n <a href=\"${text}\" target=\"_blank\" style=\"color: ${styles.linkColor}; text-decoration: underline;\">\n Click here to open verification link\n </a>\n </div>\n `;\n }\n }\n }\n\n private addEventListeners(): void {\n const closeButton = document.getElementById('reclaim-close-modal');\n const modal = document.getElementById(this.modalId);\n\n const closeModal = () => {\n this.close();\n };\n\n if (closeButton) {\n closeButton.addEventListener('click', closeModal);\n }\n\n // Close on backdrop click\n if (modal) {\n modal.addEventListener('click', (e) => {\n if (e.target === modal) {\n closeModal();\n }\n });\n }\n\n // Close on escape key\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n closeModal();\n document.removeEventListener('keydown', handleEscape);\n }\n };\n document.addEventListener('keydown', handleEscape);\n }\n\n private startAutoCloseTimer(): void {\n this.countdownSeconds = (this.options.modalPopupTimer || 1) * 60; // default to 1 minute\n\n // Update countdown display immediately\n this.updateCountdownDisplay();\n\n // Start countdown timer (updates every second)\n this.countdownTimer = setInterval(() => {\n this.countdownSeconds--;\n this.updateCountdownDisplay();\n\n if (this.countdownSeconds <= 0) {\n this.close();\n }\n }, 1000);\n\n // Set auto-close timer for the number of minutes specified in the options in milliseconds\n const autoCloseMs = (this.options.modalPopupTimer || 1) * 60 * 1000;\n this.autoCloseTimer = setTimeout(() => {\n this.close();\n }, autoCloseMs);\n }\n\n private updateCountdownDisplay(): void {\n const countdownElement = document.getElementById('reclaim-countdown');\n const progressBar = document.getElementById('reclaim-progress-bar');\n\n if (countdownElement) {\n const minutes = Math.floor(this.countdownSeconds / 60);\n const seconds = this.countdownSeconds % 60;\n const timeString = `${minutes}:${seconds.toString().padStart(2, '0')}`;\n countdownElement.textContent = `Auto-close in ${timeString}`;\n }\n\n if (progressBar) {\n // Calculate progress percentage (reverse: starts at 100%, goes to 0%)\n const totalSeconds = (this.options.modalPopupTimer || 1) * 60;\n const progressPercentage = (this.countdownSeconds / totalSeconds) * 100;\n progressBar.style.width = `${progressPercentage}%`;\n }\n }\n}","import { DeviceType } from \"./types\";\n\nconst navigatorDefined = typeof navigator !== 'undefined';\nconst windowDefined = typeof window !== 'undefined';\n\nconst userAgent = navigatorDefined ? navigator.userAgent.toLowerCase() : '';\nconst userAgentData = navigatorDefined ? (navigator as Navigator & {\n userAgentData?: {\n platform: string;\n brands?: { brand: string; version: string }[];\n }\n}).userAgentData : undefined;\n\n/**\n * Highly accurate device type detection - returns only 'desktop' or 'mobile'\n * Uses multiple detection methods and scoring system for maximum accuracy\n * @returns {DeviceType.DESKTOP | DeviceType.MOBILE} The detected device type\n */\nexport function getDeviceType(): DeviceType.DESKTOP | DeviceType.MOBILE {\n const navigatorDefined = typeof navigator !== \"undefined\";\n const windowDefined = typeof window !== \"undefined\";\n const documentDefined = typeof document !== \"undefined\";\n const userAgent = navigatorDefined ? (navigator.userAgent || \"\").toLowerCase() : \"\";\n\n // Early return for SSR\n if (!navigatorDefined || !windowDefined || !documentDefined) {\n return DeviceType.DESKTOP;\n }\n\n let mobileScore = 0;\n const CONFIDENCE_THRESHOLD = 4; // stricter to avoid touch-laptop false positives\n\n // 1) Touch capability (weight: 3)\n const isTouchDevice = (\"ontouchstart\" in window) || (navigator.maxTouchPoints > 0);\n if (isTouchDevice) {\n mobileScore += 3;\n }\n\n // 2) User agent (weight: 3)\n const mobileUserAgentPattern = /android|webos|iphone|ipad|ipod|blackberry|iemobile|opera mini|mobile|tablet/i;\n if (mobileUserAgentPattern.test(userAgent)) {\n mobileScore += 3;\n }\n\n // 3) Client Hints: navigator.userAgentData.mobile (weight: 3)\n const uaDataMobile = (navigator as any)?.userAgentData?.mobile;\n if (uaDataMobile === true) mobileScore += 3;\n\n\n // 4) Mobile-specific APIs (weight: 2)\n const hasMobileAPIs = (\"orientation\" in window) ||\n (\"DeviceMotionEvent\" in window) ||\n (\"DeviceOrientationEvent\" in window);\n if (hasMobileAPIs) {\n mobileScore += 2;\n }\n\n // 5) Device pixel ratio for mobile devices (weight: 1)\n const hasHighDPI = window.devicePixelRatio > 1.5;\n if (hasHighDPI && isTouchDevice) {\n mobileScore += 1;\n }\n\n // 6) Mobile-specific browser features (weight: 2)\n const hasMobileFeatures = (\"ontouchstart\" in document.documentElement) ||\n (\"onorientationchange\" in window) ||\n (navigator.maxTouchPoints > 1);\n if (hasMobileFeatures) {\n mobileScore += 2;\n }\n\n // 7) hasPointer: desktops usually have fine pointer (negative weight)\n const hasFinePointer = window.matchMedia && window.matchMedia(\"(pointer: fine)\").matches;\n if (hasFinePointer && !isTouchDevice) {\n mobileScore -= 2;\n }\n\n // 8) Battery API (mobile-leaning signal) (weight: 1)\n if ((\"getBattery\" in navigator) || (\"battery\" in navigator)) {\n mobileScore += 1;\n }\n\n // 9) isPadWithKeyboard (iPadOS reports \"Macintosh\" + touch) (weight: 2)\n const isPadWithKeyboard = userAgent.includes(\"macintosh\") && isTouchDevice;\n if (isPadWithKeyboard) {\n mobileScore += 2;\n }\n\n // 10) Mobile-specific viewport behavior (weight: 1)\n const hasViewportMeta = document.querySelector('meta[name=\"viewport\"]') !== null;\n if (hasViewportMeta && isTouchDevice) {\n mobileScore += 1;\n }\n\n return mobileScore >= CONFIDENCE_THRESHOLD ? DeviceType.MOBILE : DeviceType.DESKTOP;\n}\n\n/**\n * Highly accurate mobile device type detection - returns only 'android' or 'ios'\n * Should only be called when getDeviceType() returns 'mobile'\n * @returns {DeviceType.ANDROID | DeviceType.IOS} The detected mobile device type\n */\nexport function getMobileDeviceType(): DeviceType.ANDROID | DeviceType.IOS {\n // Early return for server-side rendering - default to Android\n if (!navigatorDefined || !windowDefined) {\n return DeviceType.ANDROID;\n }\n\n const ua = navigator.userAgent;\n\n // Strategy 1: Direct iOS detection using comprehensive regex\n const iosPattern = /iPad|iPhone|iPod/i;\n if (iosPattern.test(ua)) {\n return DeviceType.IOS;\n }\n\n // Strategy 2: Direct Android detection\n const androidPattern = /Android/i;\n if (androidPattern.test(ua)) {\n return DeviceType.ANDROID;\n }\n\n // Strategy 3: iPad Pro masquerading as Mac detection\n const isMacWithTouch = /Macintosh|MacIntel/i.test(ua) && 'ontouchstart' in window;\n if (isMacWithTouch) {\n return DeviceType.IOS;\n }\n\n // Strategy 4: Modern iPad detection using userAgentData\n if (userAgentData?.platform === 'macOS' && 'ontouchstart' in window) {\n return DeviceType.IOS;\n }\n\n // Strategy 5: iOS-specific API detection\n if (typeof (window as any).DeviceMotionEvent?.requestPermission === 'function') {\n return DeviceType.IOS;\n }\n\n // Strategy 6: CSS property detection for iOS\n if (typeof CSS !== 'undefined' && CSS.supports?.('-webkit-touch-callout', 'none')) {\n return DeviceType.IOS;\n }\n\n // Strategy 7: WebKit without Chrome/Android indicates iOS Safari\n const isIOSWebKit = /WebKit/i.test(ua) && !/Chrome|CriOS|Android/i.test(ua);\n if (isIOSWebKit) {\n return DeviceType.IOS;\n }\n\n // Strategy 8: Chrome detection for Android (when Android not explicitly found)\n const isChromeOnMobile = (window as any).chrome && /Mobile/i.test(ua);\n if (isChromeOnMobile && !iosPattern.test(ua)) {\n return DeviceType.ANDROID;\n }\n\n // Strategy 9: Check for mobile-specific patterns that indicate Android\n const androidMobilePattern = /Mobile.*Android|Android.*Mobile/i;\n if (androidMobilePattern.test(ua)) {\n return DeviceType.ANDROID;\n }\n\n // Strategy 10: Fallback using existing regex patterns\n const mobilePattern = /webos|blackberry|iemobile|opera mini/i;\n if (mobilePattern.test(ua)) {\n // These are typically Android-based or Android-like\n return DeviceType.ANDROID;\n }\n\n // Default fallback - Android is more common globally\n return DeviceType.ANDROID;\n}\n\n/**\n * Convenience method to check if current device is mobile\n * @returns {boolean} True if device is mobile\n */\nexport function isMobileDevice(): boolean {\n return getDeviceType() === DeviceType.MOBILE;\n}\n\n/**\n * Convenience method to check if current device is desktop\n * @returns {boolean} True if device is desktop\n */\nexport function isDesktopDevice(): boolean {\n return getDeviceType() === DeviceType.DESKTOP;\n}"],"mappings":"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","names":["exports","module","ClaimCreationType","import_ethers","import_canonicalize","logger","import_ethers","logger","canonicalize","logger","import_ethers","import_ethers","import_ethers","logger","logger","navigatorDefined","windowDefined","userAgent","logger","proof","canonicalize","sdkVersion"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@reclaimprotocol/js-sdk",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.4.0",
|
|
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",
|