@reclaimprotocol/js-sdk 0.0.1

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/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2024 alimansour0002
4
+ Permission is hereby granted, free of charge, to any person obtaining a copy
5
+ of this software and associated documentation files (the "Software"), to deal
6
+ in the Software without restriction, including without limitation the rights
7
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8
+ copies of the Software, and to permit persons to whom the Software is
9
+ furnished to do so, subject to the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be included in all
12
+ copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,123 @@
1
+ # Reclaim SDK v2
2
+
3
+ Designed to request proofs from the Reclaim protocol and manage the flow of claims and witness interactions.
4
+
5
+ ## Interfaces:
6
+
7
+ - ### Reclaim Interface
8
+
9
+ - #### `requestProof(request: ReclaimRequest, AppCallbackUrl: string): TemplateWithLink`
10
+
11
+ Requests proof using the provided proof request.
12
+
13
+ **Parameters:**
14
+
15
+ - `request`: ReclaimRequest (The proof request object)
16
+ - `AppCallbackUrl`: callback url which will receive the proof from AppClip/InstantApp
17
+
18
+ **Returns:**
19
+
20
+ - `TemplateWithLink`: A link to AppClip/AppInstant with Template Data
21
+
22
+ - ### ReclaimRequest Interface
23
+
24
+ - **title:** `string` - Title of the request
25
+ - **requestedProofs:** `RequestedProof[]` - Proofs requested by the application
26
+ - **contextMessage?:** `string` - Context message for the proof request
27
+ - **contextAddress?:** `string` - Context address for the proof request
28
+ - **requestorSignature?:** `string` - Signature of the requestor
29
+
30
+ - ### RequestedProof interface
31
+
32
+ - **name:** `string` - Title of the request
33
+ - **provider:** `ProviderV2` - Proof requested by the application
34
+ - **metadata**: {logoUri?: string, description?: string} - Metadata of the proof provider
35
+
36
+ - ### TemplateWithLink Interface:
37
+
38
+ - **template**: `Template`
39
+ - **link**: `string`
40
+
41
+ - ### Template Interface:
42
+
43
+ - **id:** `string`
44
+ - **name:** `string`
45
+ - **callbackUrl:** `string`
46
+ - **claims:** `RequestedProof[]`
47
+ - **context:** `string`
48
+ - **requestorSignature?:** `string`
49
+
50
+ - ### ProviderV2 Interface:
51
+
52
+ - **headers?:** `Map<string, string>` _(Any additional headers to be sent with the request)_
53
+ - **url:** `string` _(URL to make the request to, e.g., "https://amazon.in/orders?q=abcd")_
54
+ - **method:** `'GET' | 'POST'` _(HTTP method)_
55
+ - **body?:** `string | Uint8Array` _(Body of the request, used only if the method is POST)_
56
+ - **responseRedactions:** `ResponseRedaction[]` _(Portions to select from a response for redaction)_
57
+ - **responseMatches:** `ResponseMatch[]` _(List to check that the redacted response matches provided strings/regexes)_
58
+ - **geoLocation?:** `string` \_(Geographical location from where to proxy the request)
59
+
60
+ - ### ResponseRedaction Interface:
61
+
62
+ - **xPath?:** `string` _(XPath for HTML response)_
63
+ - **jsonPath?:** `string` _(JSONPath for JSON response)_
64
+ - **regex?:** `string` _(Regex for response matching)_
65
+
66
+ - ### ResponseMatch Interface:
67
+
68
+ - **type:** `'regex' | 'contains'` _("regex" or "contains" indicating the matching type)_
69
+ - **value:** `string` _(The string/regex to match against)_
70
+
71
+ ## Usage Flow
72
+
73
+ <img src='./readme/usage-flow-3.svg' width='900' />
74
+
75
+ ## Dependency Diagram
76
+
77
+ <img src='./readme/depemdency-diagram.svg' width='600' />
78
+
79
+ ## Error Codes
80
+
81
+ - `Malformed proof request`: The proof request is structurally incorrect or missing required elements.
82
+
83
+ - `Invalid AppCallbackUrl format`: The provided AppCallbackUrl is not in the expected format.
84
+
85
+ ## Create ProofRequest Example
86
+
87
+ ```typescript
88
+ const privateKey = 'YOUR_PRIVATE_KEY'
89
+
90
+ const proofRequest: ProofRequest = {
91
+ title: 'Example Proof Request',
92
+ requestedProofs: [
93
+ {
94
+ url: 'https://api.example.com/data',
95
+ method: 'GET',
96
+ responseRedactions: [
97
+ { start: 10, end: 20 },
98
+ { start: 30, end: 40 }
99
+ ],
100
+ responseMatches: [
101
+ { type: 'string', value: 'important-data' },
102
+ { type: 'regex', pattern: '\\d{3}-\\d{2}-\\d{4}' }
103
+ ],
104
+ geoLocation: '37.7749,-122.4194'
105
+ }
106
+ ],
107
+ contextMessage: 'Please provide the necessary proofs for verification.',
108
+ contextAddress: '0x0'
109
+ }
110
+
111
+ const dataToSign = JSON.stringify(proofRequest)
112
+
113
+ const signature = signData(dataToSign, privateKey)
114
+
115
+ const proofRequestWithSignature: ProofRequest = {
116
+ ...proofRequestWithoutSensitiveHeaders,
117
+ requestorSignature: signature
118
+ }
119
+
120
+ // Send the proof request to the AppClip/InstantApp
121
+ // Verify the signature on the AppClip side
122
+ const isSignatureValid = verifySignature(dataToSign, signature)
123
+ ```
package/dist/index.js ADDED
@@ -0,0 +1,1050 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __defProps = Object.defineProperties;
5
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
7
+ var __getOwnPropNames = Object.getOwnPropertyNames;
8
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
9
+ var __getProtoOf = Object.getPrototypeOf;
10
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
11
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
12
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
13
+ var __spreadValues = (a, b) => {
14
+ for (var prop in b || (b = {}))
15
+ if (__hasOwnProp.call(b, prop))
16
+ __defNormalProp(a, prop, b[prop]);
17
+ if (__getOwnPropSymbols)
18
+ for (var prop of __getOwnPropSymbols(b)) {
19
+ if (__propIsEnum.call(b, prop))
20
+ __defNormalProp(a, prop, b[prop]);
21
+ }
22
+ return a;
23
+ };
24
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
25
+ var __export = (target, all) => {
26
+ for (var name in all)
27
+ __defProp(target, name, { get: all[name], enumerable: true });
28
+ };
29
+ var __copyProps = (to, from, except, desc) => {
30
+ if (from && typeof from === "object" || typeof from === "function") {
31
+ for (let key of __getOwnPropNames(from))
32
+ if (!__hasOwnProp.call(to, key) && key !== except)
33
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
34
+ }
35
+ return to;
36
+ };
37
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
38
+ // If the importer is in node compatibility mode or this is not an ESM
39
+ // file that has been converted to a CommonJS file using a Babel-
40
+ // compatible transform (i.e. "__esModule" has not been set), then set
41
+ // "default" to the CommonJS "module.exports" for node compatibility.
42
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
43
+ mod
44
+ ));
45
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
46
+ var __async = (__this, __arguments, generator) => {
47
+ return new Promise((resolve, reject) => {
48
+ var fulfilled = (value) => {
49
+ try {
50
+ step(generator.next(value));
51
+ } catch (e) {
52
+ reject(e);
53
+ }
54
+ };
55
+ var rejected = (value) => {
56
+ try {
57
+ step(generator.throw(value));
58
+ } catch (e) {
59
+ reject(e);
60
+ }
61
+ };
62
+ var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
63
+ step((generator = generator.apply(__this, __arguments)).next());
64
+ });
65
+ };
66
+
67
+ // src/index.ts
68
+ var src_exports = {};
69
+ __export(src_exports, {
70
+ ReclaimClient: () => ReclaimClient
71
+ });
72
+ module.exports = __toCommonJS(src_exports);
73
+
74
+ // src/witness.ts
75
+ var import_ethers = require("ethers");
76
+ function fetchWitnessListForClaim({ witnesses, witnessesRequiredForClaim, epoch }, params, timestampS) {
77
+ const identifier = typeof params === "string" ? params : getIdentifierFromClaimInfo(params);
78
+ const completeInput = [
79
+ identifier,
80
+ epoch.toString(),
81
+ witnessesRequiredForClaim.toString(),
82
+ timestampS.toString()
83
+ ].join("\n");
84
+ const completeHashStr = import_ethers.ethers.keccak256(strToUint8Array(completeInput));
85
+ const completeHash = import_ethers.ethers.getBytes(completeHashStr);
86
+ const completeHashView = uint8ArrayToDataView(completeHash);
87
+ const witnessesLeft = [...witnesses];
88
+ const selectedWitnesses = [];
89
+ let byteOffset = 0;
90
+ for (let i = 0; i < witnessesRequiredForClaim; i++) {
91
+ const randomSeed = completeHashView.getUint32(byteOffset);
92
+ const witnessIndex = randomSeed % witnessesLeft.length;
93
+ const witness = witnessesLeft[witnessIndex];
94
+ selectedWitnesses.push(witness);
95
+ witnessesLeft[witnessIndex] = witnessesLeft[witnessesLeft.length - 1];
96
+ witnessesLeft.pop();
97
+ byteOffset = (byteOffset + 4) % completeHash.length;
98
+ }
99
+ return selectedWitnesses;
100
+ }
101
+ function getIdentifierFromClaimInfo(info) {
102
+ const str = `${info.provider}
103
+ ${info.parameters}
104
+ ${info.context || ""}`;
105
+ return import_ethers.ethers.keccak256(strToUint8Array(str)).toLowerCase();
106
+ }
107
+ function strToUint8Array(str) {
108
+ return new TextEncoder().encode(str);
109
+ }
110
+ function uint8ArrayToDataView(arr) {
111
+ return new DataView(arr.buffer, arr.byteOffset, arr.byteLength);
112
+ }
113
+ function createSignDataForClaim(data) {
114
+ const identifier = "identifier" in data ? data.identifier : getIdentifierFromClaimInfo(data);
115
+ const lines = [
116
+ identifier,
117
+ data.owner.toLowerCase(),
118
+ data.timestampS.toString(),
119
+ data.epoch.toString()
120
+ ];
121
+ return lines.join("\n");
122
+ }
123
+
124
+ // src/Reclaim.ts
125
+ var import_uuid = require("uuid");
126
+ var import_ethers5 = require("ethers");
127
+ var import_canonicalize = __toESM(require("canonicalize"));
128
+
129
+ // src/utils.ts
130
+ var import_url_parse = __toESM(require("url-parse"));
131
+ var import_ethers4 = require("ethers");
132
+
133
+ // src/contract-types/contracts/factories/Reclaim__factory.ts
134
+ var import_ethers2 = require("ethers");
135
+ var _abi = [
136
+ {
137
+ anonymous: false,
138
+ inputs: [
139
+ {
140
+ indexed: false,
141
+ internalType: "address",
142
+ name: "previousAdmin",
143
+ type: "address"
144
+ },
145
+ {
146
+ indexed: false,
147
+ internalType: "address",
148
+ name: "newAdmin",
149
+ type: "address"
150
+ }
151
+ ],
152
+ name: "AdminChanged",
153
+ type: "event"
154
+ },
155
+ {
156
+ anonymous: false,
157
+ inputs: [
158
+ {
159
+ indexed: true,
160
+ internalType: "address",
161
+ name: "beacon",
162
+ type: "address"
163
+ }
164
+ ],
165
+ name: "BeaconUpgraded",
166
+ type: "event"
167
+ },
168
+ {
169
+ anonymous: false,
170
+ inputs: [
171
+ {
172
+ components: [
173
+ {
174
+ internalType: "uint32",
175
+ name: "id",
176
+ type: "uint32"
177
+ },
178
+ {
179
+ internalType: "uint32",
180
+ name: "timestampStart",
181
+ type: "uint32"
182
+ },
183
+ {
184
+ internalType: "uint32",
185
+ name: "timestampEnd",
186
+ type: "uint32"
187
+ },
188
+ {
189
+ components: [
190
+ {
191
+ internalType: "address",
192
+ name: "addr",
193
+ type: "address"
194
+ },
195
+ {
196
+ internalType: "string",
197
+ name: "host",
198
+ type: "string"
199
+ }
200
+ ],
201
+ internalType: "struct Reclaim.Witness[]",
202
+ name: "witnesses",
203
+ type: "tuple[]"
204
+ },
205
+ {
206
+ internalType: "uint8",
207
+ name: "minimumWitnessesForClaimCreation",
208
+ type: "uint8"
209
+ }
210
+ ],
211
+ indexed: false,
212
+ internalType: "struct Reclaim.Epoch",
213
+ name: "epoch",
214
+ type: "tuple"
215
+ }
216
+ ],
217
+ name: "EpochAdded",
218
+ type: "event"
219
+ },
220
+ {
221
+ anonymous: false,
222
+ inputs: [
223
+ {
224
+ indexed: false,
225
+ internalType: "uint8",
226
+ name: "version",
227
+ type: "uint8"
228
+ }
229
+ ],
230
+ name: "Initialized",
231
+ type: "event"
232
+ },
233
+ {
234
+ anonymous: false,
235
+ inputs: [
236
+ {
237
+ indexed: true,
238
+ internalType: "address",
239
+ name: "previousOwner",
240
+ type: "address"
241
+ },
242
+ {
243
+ indexed: true,
244
+ internalType: "address",
245
+ name: "newOwner",
246
+ type: "address"
247
+ }
248
+ ],
249
+ name: "OwnershipTransferred",
250
+ type: "event"
251
+ },
252
+ {
253
+ anonymous: false,
254
+ inputs: [
255
+ {
256
+ indexed: true,
257
+ internalType: "address",
258
+ name: "implementation",
259
+ type: "address"
260
+ }
261
+ ],
262
+ name: "Upgraded",
263
+ type: "event"
264
+ },
265
+ {
266
+ inputs: [
267
+ {
268
+ internalType: "address",
269
+ name: "witnessAddress",
270
+ type: "address"
271
+ },
272
+ {
273
+ internalType: "string",
274
+ name: "host",
275
+ type: "string"
276
+ }
277
+ ],
278
+ name: "addAsWitness",
279
+ outputs: [],
280
+ stateMutability: "nonpayable",
281
+ type: "function"
282
+ },
283
+ {
284
+ inputs: [],
285
+ name: "addNewEpoch",
286
+ outputs: [],
287
+ stateMutability: "nonpayable",
288
+ type: "function"
289
+ },
290
+ {
291
+ inputs: [
292
+ {
293
+ internalType: "uint32",
294
+ name: "epochNum",
295
+ type: "uint32"
296
+ },
297
+ {
298
+ components: [
299
+ {
300
+ internalType: "string",
301
+ name: "provider",
302
+ type: "string"
303
+ },
304
+ {
305
+ internalType: "string",
306
+ name: "parameters",
307
+ type: "string"
308
+ },
309
+ {
310
+ internalType: "string",
311
+ name: "context",
312
+ type: "string"
313
+ }
314
+ ],
315
+ internalType: "struct Claims.ClaimInfo",
316
+ name: "claimInfo",
317
+ type: "tuple"
318
+ },
319
+ {
320
+ components: [
321
+ {
322
+ internalType: "bytes32",
323
+ name: "identifier",
324
+ type: "bytes32"
325
+ },
326
+ {
327
+ internalType: "address",
328
+ name: "owner",
329
+ type: "address"
330
+ },
331
+ {
332
+ internalType: "uint32",
333
+ name: "timestampS",
334
+ type: "uint32"
335
+ },
336
+ {
337
+ internalType: "uint256",
338
+ name: "epoch",
339
+ type: "uint256"
340
+ }
341
+ ],
342
+ internalType: "struct Claims.CompleteClaimData",
343
+ name: "claimData",
344
+ type: "tuple"
345
+ },
346
+ {
347
+ internalType: "bytes[]",
348
+ name: "signatures",
349
+ type: "bytes[]"
350
+ }
351
+ ],
352
+ name: "assertValidEpochAndSignedClaim",
353
+ outputs: [],
354
+ stateMutability: "view",
355
+ type: "function"
356
+ },
357
+ {
358
+ inputs: [],
359
+ name: "currentEpoch",
360
+ outputs: [
361
+ {
362
+ internalType: "uint32",
363
+ name: "",
364
+ type: "uint32"
365
+ }
366
+ ],
367
+ stateMutability: "view",
368
+ type: "function"
369
+ },
370
+ {
371
+ inputs: [],
372
+ name: "epochDurationS",
373
+ outputs: [
374
+ {
375
+ internalType: "uint32",
376
+ name: "",
377
+ type: "uint32"
378
+ }
379
+ ],
380
+ stateMutability: "view",
381
+ type: "function"
382
+ },
383
+ {
384
+ inputs: [
385
+ {
386
+ internalType: "uint256",
387
+ name: "",
388
+ type: "uint256"
389
+ }
390
+ ],
391
+ name: "epochs",
392
+ outputs: [
393
+ {
394
+ internalType: "uint32",
395
+ name: "id",
396
+ type: "uint32"
397
+ },
398
+ {
399
+ internalType: "uint32",
400
+ name: "timestampStart",
401
+ type: "uint32"
402
+ },
403
+ {
404
+ internalType: "uint32",
405
+ name: "timestampEnd",
406
+ type: "uint32"
407
+ },
408
+ {
409
+ internalType: "uint8",
410
+ name: "minimumWitnessesForClaimCreation",
411
+ type: "uint8"
412
+ }
413
+ ],
414
+ stateMutability: "view",
415
+ type: "function"
416
+ },
417
+ {
418
+ inputs: [
419
+ {
420
+ internalType: "uint32",
421
+ name: "epoch",
422
+ type: "uint32"
423
+ }
424
+ ],
425
+ name: "fetchEpoch",
426
+ outputs: [
427
+ {
428
+ components: [
429
+ {
430
+ internalType: "uint32",
431
+ name: "id",
432
+ type: "uint32"
433
+ },
434
+ {
435
+ internalType: "uint32",
436
+ name: "timestampStart",
437
+ type: "uint32"
438
+ },
439
+ {
440
+ internalType: "uint32",
441
+ name: "timestampEnd",
442
+ type: "uint32"
443
+ },
444
+ {
445
+ components: [
446
+ {
447
+ internalType: "address",
448
+ name: "addr",
449
+ type: "address"
450
+ },
451
+ {
452
+ internalType: "string",
453
+ name: "host",
454
+ type: "string"
455
+ }
456
+ ],
457
+ internalType: "struct Reclaim.Witness[]",
458
+ name: "witnesses",
459
+ type: "tuple[]"
460
+ },
461
+ {
462
+ internalType: "uint8",
463
+ name: "minimumWitnessesForClaimCreation",
464
+ type: "uint8"
465
+ }
466
+ ],
467
+ internalType: "struct Reclaim.Epoch",
468
+ name: "",
469
+ type: "tuple"
470
+ }
471
+ ],
472
+ stateMutability: "view",
473
+ type: "function"
474
+ },
475
+ {
476
+ inputs: [
477
+ {
478
+ internalType: "uint32",
479
+ name: "epoch",
480
+ type: "uint32"
481
+ },
482
+ {
483
+ internalType: "bytes32",
484
+ name: "identifier",
485
+ type: "bytes32"
486
+ },
487
+ {
488
+ internalType: "uint32",
489
+ name: "timestampS",
490
+ type: "uint32"
491
+ }
492
+ ],
493
+ name: "fetchWitnessesForClaim",
494
+ outputs: [
495
+ {
496
+ components: [
497
+ {
498
+ internalType: "address",
499
+ name: "addr",
500
+ type: "address"
501
+ },
502
+ {
503
+ internalType: "string",
504
+ name: "host",
505
+ type: "string"
506
+ }
507
+ ],
508
+ internalType: "struct Reclaim.Witness[]",
509
+ name: "",
510
+ type: "tuple[]"
511
+ }
512
+ ],
513
+ stateMutability: "view",
514
+ type: "function"
515
+ },
516
+ {
517
+ inputs: [],
518
+ name: "initialize",
519
+ outputs: [],
520
+ stateMutability: "nonpayable",
521
+ type: "function"
522
+ },
523
+ {
524
+ inputs: [],
525
+ name: "minimumWitnessesForClaimCreation",
526
+ outputs: [
527
+ {
528
+ internalType: "uint8",
529
+ name: "",
530
+ type: "uint8"
531
+ }
532
+ ],
533
+ stateMutability: "view",
534
+ type: "function"
535
+ },
536
+ {
537
+ inputs: [],
538
+ name: "owner",
539
+ outputs: [
540
+ {
541
+ internalType: "address",
542
+ name: "",
543
+ type: "address"
544
+ }
545
+ ],
546
+ stateMutability: "view",
547
+ type: "function"
548
+ },
549
+ {
550
+ inputs: [],
551
+ name: "proxiableUUID",
552
+ outputs: [
553
+ {
554
+ internalType: "bytes32",
555
+ name: "",
556
+ type: "bytes32"
557
+ }
558
+ ],
559
+ stateMutability: "view",
560
+ type: "function"
561
+ },
562
+ {
563
+ inputs: [
564
+ {
565
+ internalType: "address",
566
+ name: "witnessAddress",
567
+ type: "address"
568
+ }
569
+ ],
570
+ name: "removeAsWitness",
571
+ outputs: [],
572
+ stateMutability: "nonpayable",
573
+ type: "function"
574
+ },
575
+ {
576
+ inputs: [],
577
+ name: "renounceOwnership",
578
+ outputs: [],
579
+ stateMutability: "nonpayable",
580
+ type: "function"
581
+ },
582
+ {
583
+ inputs: [
584
+ {
585
+ internalType: "address",
586
+ name: "newOwner",
587
+ type: "address"
588
+ }
589
+ ],
590
+ name: "transferOwnership",
591
+ outputs: [],
592
+ stateMutability: "nonpayable",
593
+ type: "function"
594
+ },
595
+ {
596
+ inputs: [
597
+ {
598
+ internalType: "address",
599
+ name: "addr",
600
+ type: "address"
601
+ },
602
+ {
603
+ internalType: "bool",
604
+ name: "isWhitelisted",
605
+ type: "bool"
606
+ }
607
+ ],
608
+ name: "updateWitnessWhitelist",
609
+ outputs: [],
610
+ stateMutability: "nonpayable",
611
+ type: "function"
612
+ },
613
+ {
614
+ inputs: [
615
+ {
616
+ internalType: "address",
617
+ name: "newImplementation",
618
+ type: "address"
619
+ }
620
+ ],
621
+ name: "upgradeTo",
622
+ outputs: [],
623
+ stateMutability: "nonpayable",
624
+ type: "function"
625
+ },
626
+ {
627
+ inputs: [
628
+ {
629
+ internalType: "address",
630
+ name: "newImplementation",
631
+ type: "address"
632
+ },
633
+ {
634
+ internalType: "bytes",
635
+ name: "data",
636
+ type: "bytes"
637
+ }
638
+ ],
639
+ name: "upgradeToAndCall",
640
+ outputs: [],
641
+ stateMutability: "payable",
642
+ type: "function"
643
+ },
644
+ {
645
+ inputs: [
646
+ {
647
+ internalType: "uint256",
648
+ name: "",
649
+ type: "uint256"
650
+ }
651
+ ],
652
+ name: "witnesses",
653
+ outputs: [
654
+ {
655
+ internalType: "address",
656
+ name: "addr",
657
+ type: "address"
658
+ },
659
+ {
660
+ internalType: "string",
661
+ name: "host",
662
+ type: "string"
663
+ }
664
+ ],
665
+ stateMutability: "view",
666
+ type: "function"
667
+ }
668
+ ];
669
+ var Reclaim__factory = class {
670
+ static connect(address, signerOrProvider) {
671
+ return new import_ethers2.Contract(address, _abi, signerOrProvider);
672
+ }
673
+ };
674
+ Reclaim__factory.abi = _abi;
675
+
676
+ // src/contract-types/config.json
677
+ var config_default = {
678
+ "0x1a4": {
679
+ chainName: "opt-goerli",
680
+ address: "0xF93F605142Fb1Efad7Aa58253dDffF67775b4520",
681
+ rpcUrl: "https://opt-goerli.g.alchemy.com/v2/rksDkSUXd2dyk2ANy_zzODknx_AAokui"
682
+ }
683
+ };
684
+
685
+ // src/smart-contract.ts
686
+ var import_ethers3 = require("ethers");
687
+ var DEFAULT_CHAIN_ID = 420;
688
+ function makeBeacon(chainId) {
689
+ chainId = chainId || DEFAULT_CHAIN_ID;
690
+ const contract = getContract(chainId);
691
+ if (contract) {
692
+ let _a;
693
+ return makeBeaconCacheable({
694
+ getState(epochId) {
695
+ return __async(this, null, function* () {
696
+ const epoch = yield contract.fetchEpoch(epochId || 0);
697
+ if (!epoch.id) {
698
+ throw new Error(`Invalid epoch ID: ${epochId}`);
699
+ }
700
+ return {
701
+ epoch: epoch.id,
702
+ witnesses: epoch.witnesses.map((w) => ({
703
+ id: w.addr.toLowerCase(),
704
+ url: w.host
705
+ })),
706
+ witnessesRequiredForClaim: epoch.minimumWitnessesForClaimCreation,
707
+ nextEpochTimestampS: epoch.timestampEnd
708
+ };
709
+ });
710
+ }
711
+ });
712
+ } else {
713
+ return void 0;
714
+ }
715
+ }
716
+ function makeBeaconCacheable(beacon) {
717
+ const cache = {};
718
+ return __spreadProps(__spreadValues({}, beacon), {
719
+ getState(epochId) {
720
+ return __async(this, null, function* () {
721
+ if (!epochId) {
722
+ const state = yield beacon.getState();
723
+ return state;
724
+ }
725
+ const key = epochId;
726
+ if (!cache[key]) {
727
+ cache[key] = beacon.getState(epochId);
728
+ }
729
+ return cache[key];
730
+ });
731
+ }
732
+ });
733
+ }
734
+ var existingContractsMap = {};
735
+ function getContract(chainId) {
736
+ const chainKey = `0x${chainId.toString(16)}`;
737
+ if (!existingContractsMap[chainKey]) {
738
+ const contractData = config_default[chainKey];
739
+ if (!contractData) {
740
+ throw new Error(`Unsupported chain: "${chainKey}"`);
741
+ }
742
+ const rpcProvider = new import_ethers3.ethers.JsonRpcProvider(contractData.rpcUrl);
743
+ existingContractsMap[chainKey] = Reclaim__factory.connect(
744
+ contractData.address,
745
+ rpcProvider
746
+ );
747
+ }
748
+ return existingContractsMap[chainKey];
749
+ }
750
+
751
+ // src/utils.ts
752
+ function getWitnessesForClaim(epoch, identifier, timestampS) {
753
+ return __async(this, null, function* () {
754
+ const beacon = makeBeacon();
755
+ if (!beacon)
756
+ throw new Error("No beacon");
757
+ const state = yield beacon.getState(epoch);
758
+ const witnessList = fetchWitnessListForClaim(state, identifier, timestampS);
759
+ return witnessList.map((w) => w.id.toLowerCase());
760
+ });
761
+ }
762
+ function recoverSignersOfSignedClaim({
763
+ claim,
764
+ signatures
765
+ }) {
766
+ const dataStr = createSignDataForClaim(__spreadValues({}, claim));
767
+ return signatures.map(
768
+ (signature) => import_ethers4.ethers.verifyMessage(dataStr, import_ethers4.ethers.hexlify(signature)).toLowerCase()
769
+ );
770
+ }
771
+ function assertValidSignedClaim(claim, expectedWitnessAddresses) {
772
+ const witnessAddresses = recoverSignersOfSignedClaim(claim);
773
+ const witnessesNotSeen = new Set(expectedWitnessAddresses);
774
+ for (const witness of witnessAddresses) {
775
+ if (witnessesNotSeen.has(witness)) {
776
+ witnessesNotSeen.delete(witness);
777
+ }
778
+ }
779
+ if (witnessesNotSeen.size > 0) {
780
+ throw new Error(
781
+ `Missing signatures from ${expectedWitnessAddresses.join(", ")}`
782
+ );
783
+ }
784
+ }
785
+
786
+ // src/Reclaim.ts
787
+ var DEFAULT_RECLAIM_CALLBACK_URL = "https://api.reclaimprotocol.org/v2/callback?callbackId=";
788
+ var DEFAULT_RECLAIM_STATUS_URL = "https://api.reclaimprotocol.org/v2/session/";
789
+ var RECLAIM_SHARE_URL = "https://share.reclaimprotocol.org/instant/?template=";
790
+ function escapeRegExp(string) {
791
+ return string.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
792
+ }
793
+ function replaceAll(str, find, replace) {
794
+ return str.replace(new RegExp(escapeRegExp(find), "g"), replace);
795
+ }
796
+ var ReclaimClient = class {
797
+ constructor(applicationId, sessionId) {
798
+ this.sessionId = "";
799
+ this.context = { contextAddress: "0x0", contextMessage: "" };
800
+ this.applicationId = applicationId;
801
+ if (sessionId) {
802
+ this.sessionId = sessionId;
803
+ } else {
804
+ this.sessionId = (0, import_uuid.v4)().toString();
805
+ }
806
+ }
807
+ createVerificationRequest(providers) {
808
+ return __async(this, null, function* () {
809
+ const template = yield this.createLinkRequest(providers);
810
+ this.verificationRequest = new ReclaimVerficationRequest(
811
+ this.sessionId,
812
+ this.getStatusUrl(),
813
+ template
814
+ );
815
+ return this.verificationRequest;
816
+ });
817
+ }
818
+ createLinkRequest(providers) {
819
+ return __async(this, null, function* () {
820
+ const appCallbackUrl = yield this.getAppCallbackUrl();
821
+ const providersV2 = yield this.buildHttpProviderV2ByName(providers);
822
+ if (!this.requestedProofs) {
823
+ yield this.buildRequestedProofs(providersV2, appCallbackUrl);
824
+ }
825
+ if (!this.signature) {
826
+ throw new Error("Signature is not set");
827
+ }
828
+ const appId = import_ethers5.ethers.verifyMessage(
829
+ import_ethers5.ethers.getBytes(
830
+ import_ethers5.ethers.keccak256(
831
+ new TextEncoder().encode((0, import_canonicalize.default)(this.requestedProofs))
832
+ )
833
+ ),
834
+ import_ethers5.ethers.hexlify(this.signature)
835
+ ).toLowerCase();
836
+ if (import_ethers5.ethers.getAddress(appId) !== import_ethers5.ethers.getAddress(this.applicationId)) {
837
+ throw new Error("Invalid signature");
838
+ }
839
+ const templateData = __spreadProps(__spreadValues({}, this.requestedProofs), { signature: this.signature });
840
+ let template = `${RECLAIM_SHARE_URL}${encodeURIComponent(
841
+ JSON.stringify(templateData)
842
+ )}`;
843
+ template = replaceAll(template, "(", "%28");
844
+ template = replaceAll(template, ")", "%29");
845
+ return template;
846
+ });
847
+ }
848
+ setAppCallbackUrl(url) {
849
+ this.appCallbackUrl = url;
850
+ }
851
+ getAppCallbackUrl() {
852
+ return __async(this, null, function* () {
853
+ let appCallbackUrl = this.appCallbackUrl;
854
+ if (!appCallbackUrl) {
855
+ appCallbackUrl = `${DEFAULT_RECLAIM_CALLBACK_URL}${this.sessionId}`;
856
+ }
857
+ return appCallbackUrl;
858
+ });
859
+ }
860
+ setStatusUrl(url) {
861
+ this.statusUrl = url;
862
+ }
863
+ getStatusUrl() {
864
+ let statusUrl = this.statusUrl;
865
+ if (!statusUrl) {
866
+ statusUrl = `${DEFAULT_RECLAIM_STATUS_URL}${this.sessionId}`;
867
+ }
868
+ return statusUrl;
869
+ }
870
+ setSignature(signature) {
871
+ this.signature = signature;
872
+ }
873
+ // @dev Use this function only in development environments
874
+ getSignature(requestedProofs, applicationSecret) {
875
+ return __async(this, null, function* () {
876
+ const wallet = new import_ethers5.ethers.Wallet(applicationSecret);
877
+ const signature = yield wallet.signMessage(
878
+ import_ethers5.ethers.getBytes(
879
+ import_ethers5.ethers.keccak256(
880
+ new TextEncoder().encode((0, import_canonicalize.default)(requestedProofs))
881
+ )
882
+ )
883
+ );
884
+ return signature;
885
+ });
886
+ }
887
+ buildHttpProviderV2ByName(providerNames) {
888
+ return __async(this, null, function* () {
889
+ try {
890
+ const reclaimServerUrl = "https://api.reclaimprotocol.org/get/httpsproviders";
891
+ const appProvidersUrl = `https://api.reclaimprotocol.org/v2/app-http-providers/${this.applicationId}`;
892
+ const response = yield fetch(reclaimServerUrl);
893
+ const appResponse = yield fetch(appProvidersUrl);
894
+ if (!response.ok || !appResponse.ok) {
895
+ throw new Error("Failed to fetch HTTP providers");
896
+ }
897
+ const allProviders = (yield response.json()).providers;
898
+ const appProviders = (yield appResponse.json()).result.providers;
899
+ const filteredProviders = allProviders.filter((provider) => {
900
+ return providerNames.includes(provider.name);
901
+ });
902
+ if (filteredProviders.length == 0) {
903
+ throw new Error(`Providers is not available for this application`);
904
+ }
905
+ for (let provider of filteredProviders) {
906
+ if (!appProviders.includes(provider.name)) {
907
+ throw new Error(`Provider ${provider.name} is not available for this application`);
908
+ }
909
+ }
910
+ return filteredProviders;
911
+ } catch (error) {
912
+ console.error("Error fetching HTTP providers:", error);
913
+ throw error;
914
+ }
915
+ });
916
+ }
917
+ buildRequestedProofs(providers, callbackUrl, statusUrl) {
918
+ const claims = providers.map((provider) => {
919
+ return {
920
+ provider: encodeURIComponent(provider.name),
921
+ context: JSON.stringify(this.context),
922
+ templateClaimId: provider.id,
923
+ payload: {
924
+ metadata: {
925
+ name: encodeURIComponent(provider.name),
926
+ logoUrl: provider.logoUrl
927
+ },
928
+ url: provider.url,
929
+ urlType: provider.urlType,
930
+ method: provider.method,
931
+ login: {
932
+ url: provider.loginUrl
933
+ },
934
+ parameters: {},
935
+ responseSelections: provider.responseSelections,
936
+ customInjection: provider.customInjection,
937
+ bodySniff: provider.bodySniff,
938
+ userAgent: provider.userAgent,
939
+ useZk: true
940
+ }
941
+ };
942
+ });
943
+ this.requestedProofs = {
944
+ id: (0, import_uuid.v4)().toString(),
945
+ sessionId: this.sessionId,
946
+ name: "web-SDK",
947
+ callbackUrl,
948
+ statusUrl: statusUrl ? statusUrl : this.getStatusUrl(),
949
+ claims
950
+ };
951
+ return this.requestedProofs;
952
+ }
953
+ addContext(address, message) {
954
+ this.context = {
955
+ contextAddress: address,
956
+ contextMessage: message
957
+ };
958
+ return this.context;
959
+ }
960
+ static verifySignedProof(proof) {
961
+ return __async(this, null, function* () {
962
+ if (!proof.signatures.length) {
963
+ throw new Error("No signatures");
964
+ }
965
+ const witnesses = yield getWitnessesForClaim(
966
+ proof.claimData.epoch,
967
+ proof.identifier,
968
+ proof.claimData.timestampS
969
+ );
970
+ try {
971
+ const calculatedIdentifier = getIdentifierFromClaimInfo({
972
+ parameters: JSON.parse(
973
+ (0, import_canonicalize.default)(proof.claimData.parameters)
974
+ ),
975
+ provider: proof.claimData.provider,
976
+ context: proof.claimData.context
977
+ });
978
+ proof.identifier = proof.identifier.replace('"', "");
979
+ proof.identifier = proof.identifier.replace('"', "");
980
+ if (calculatedIdentifier !== proof.identifier) {
981
+ throw new Error("Identifier Mismatch");
982
+ }
983
+ const signedClaim = {
984
+ claim: __spreadValues({}, proof.claimData),
985
+ signatures: proof.signatures.map((signature) => {
986
+ return import_ethers5.ethers.getBytes(signature);
987
+ })
988
+ };
989
+ assertValidSignedClaim(signedClaim, witnesses);
990
+ } catch (e) {
991
+ console.error(e);
992
+ return false;
993
+ }
994
+ return true;
995
+ });
996
+ }
997
+ };
998
+ var ReclaimVerficationRequest = class {
999
+ constructor(sessionId, statusUrl, template) {
1000
+ this.intervals = /* @__PURE__ */ new Map();
1001
+ this.sessionId = sessionId;
1002
+ this.statusUrl = statusUrl;
1003
+ this.template = template;
1004
+ }
1005
+ on(event, callback) {
1006
+ if (event === "success") {
1007
+ this.onSuccessCallback = callback;
1008
+ }
1009
+ if (event === "error") {
1010
+ this.onFailureCallback = callback;
1011
+ }
1012
+ return this;
1013
+ }
1014
+ start() {
1015
+ return __async(this, null, function* () {
1016
+ if (this.statusUrl && this.sessionId) {
1017
+ const interval = setInterval(() => __async(this, null, function* () {
1018
+ try {
1019
+ const res = yield fetch(this.statusUrl);
1020
+ const data = yield res.json();
1021
+ if (!data.session)
1022
+ return;
1023
+ data.session.proofs.forEach((proof) => __async(this, null, function* () {
1024
+ const verified = yield ReclaimClient.verifySignedProof(proof);
1025
+ if (!verified) {
1026
+ throw new Error("Proof not verified");
1027
+ }
1028
+ }));
1029
+ if (this.onSuccessCallback) {
1030
+ this.onSuccessCallback(data.session.proofs);
1031
+ }
1032
+ clearInterval(this.intervals.get(this.sessionId));
1033
+ } catch (e) {
1034
+ if (this.onFailureCallback) {
1035
+ this.onFailureCallback(e);
1036
+ }
1037
+ clearInterval(this.intervals.get(this.sessionId));
1038
+ }
1039
+ }), 3e3);
1040
+ this.intervals.set(this.sessionId, interval);
1041
+ return this.template;
1042
+ }
1043
+ });
1044
+ }
1045
+ };
1046
+ // Annotate the CommonJS export names for ESM import in node:
1047
+ 0 && (module.exports = {
1048
+ ReclaimClient
1049
+ });
1050
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/witness.ts","../src/Reclaim.ts","../src/utils.ts","../src/contract-types/contracts/factories/Reclaim__factory.ts","../src/contract-types/config.json","../src/smart-contract.ts"],"sourcesContent":["export { ReclaimClient } from './Reclaim';","import { ethers } from 'ethers';\nimport type { WitnessData } from './interfaces';\nimport type { ClaimID, ClaimInfo, CompleteClaimData } from './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) {\n const identifier =\n typeof params === 'string' ? params : getIdentifierFromClaimInfo(params);\n const completeInput = [\n identifier,\n epoch.toString(),\n witnessesRequiredForClaim.toString(),\n timestampS.toString(),\n ].join('\\n');\n const completeHashStr = ethers.keccak256(strToUint8Array(completeInput));\n const completeHash = ethers.getBytes(completeHashStr);\n const completeHashView = uint8ArrayToDataView(completeHash);\n const witnessesLeft = [...witnesses];\n const selectedWitnesses: WitnessData[] = [];\n // we'll use 32 bits of the hash to select\n // each witness\n let byteOffset = 0;\n for (let i = 0; i < witnessesRequiredForClaim; i++) {\n const randomSeed = completeHashView.getUint32(byteOffset);\n const witnessIndex = randomSeed % witnessesLeft.length;\n const witness = witnessesLeft[witnessIndex] as WitnessData;\n selectedWitnesses.push(witness);\n\n // Remove the selected witness from the list of witnesses left\n witnessesLeft[witnessIndex] = witnessesLeft[\n witnessesLeft.length - 1\n ] as WitnessData;\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 = `${info.provider}\\n${info.parameters}\\n${info.context || ''}`;\n return ethers.keccak256(strToUint8Array(str)).toLowerCase();\n}\n\nexport function strToUint8Array(str: string) {\n return new TextEncoder().encode(str);\n}\n\nexport function uint8ArrayToDataView(arr: Uint8Array) {\n return new DataView(arr.buffer, arr.byteOffset, arr.byteLength);\n}\n\nexport function createSignDataForClaim(data: CompleteClaimData) {\n const identifier =\n 'identifier' in data ? data.identifier : getIdentifierFromClaimInfo(data);\n const lines = [\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 { ProviderV2, Proof, RequestedProofs, Context, RequestedClaim } from './interfaces'\nimport { getIdentifierFromClaimInfo } from './witness'\nimport type { SignedClaim } from './types'\nimport { v4 } from 'uuid'\nimport { ethers } from 'ethers'\nimport canonicalize from 'canonicalize'\nimport { getWitnessesForClaim, assertValidSignedClaim } from './utils'\n\nconst DEFAULT_RECLAIM_CALLBACK_URL =\n 'https://api.reclaimprotocol.org/v2/callback?callbackId='\nconst DEFAULT_RECLAIM_STATUS_URL =\n 'https://api.reclaimprotocol.org/v2/session/'\nconst RECLAIM_SHARE_URL = 'https://share.reclaimprotocol.org/instant/?template='\n\nfunction escapeRegExp(string: string) {\n return string.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'); // $& means the whole matched string\n}\nfunction replaceAll(str: string, find: string, replace: string) {\n return str.replace(new RegExp(escapeRegExp(find), 'g'), replace);\n}\n\n\n\nexport class ReclaimClient {\n applicationId: string\n signature?: string\n appCallbackUrl?: string\n statusUrl?: string\n sessionId: string = ''\n requestedProofs?: RequestedProofs\n context: Context = { contextAddress: '0x0', contextMessage: '' }\n verificationRequest?: ReclaimVerficationRequest\n\n constructor(applicationId: string, sessionId?: string) {\n this.applicationId = applicationId\n if (sessionId) {\n this.sessionId = sessionId\n } else {\n this.sessionId = v4().toString()\n }\n }\n\n async createVerificationRequest(providers: string[]) {\n const template = await this.createLinkRequest(providers)\n this.verificationRequest = new ReclaimVerficationRequest(\n this.sessionId,\n this.getStatusUrl(),\n template\n )\n\n return this.verificationRequest\n }\n\n async createLinkRequest(providers: string[]) {\n const appCallbackUrl = await this.getAppCallbackUrl()\n const providersV2 = await this.buildHttpProviderV2ByName(providers)\n if (!this.requestedProofs) {\n await this.buildRequestedProofs(providersV2, appCallbackUrl)\n }\n\n if (!this.signature) {\n throw new Error('Signature is not set')\n }\n\n const appId = ethers\n .verifyMessage(\n ethers.getBytes(\n ethers.keccak256(\n new TextEncoder().encode(canonicalize(this.requestedProofs)!)\n )\n ),\n ethers.hexlify(this.signature)\n )\n .toLowerCase()\n\n if (ethers.getAddress(appId) !== ethers.getAddress(this.applicationId)) {\n throw new Error('Invalid signature')\n }\n\n\n const templateData = { ...this.requestedProofs, signature: this.signature }\n let template = `${RECLAIM_SHARE_URL}${encodeURIComponent(\n JSON.stringify(templateData)\n )}`\n template = replaceAll(template, '(', '%28')\n template = replaceAll(template, ')', '%29')\n\n return template\n }\n\n setAppCallbackUrl(url: string) {\n this.appCallbackUrl = url\n }\n\n async getAppCallbackUrl() {\n let appCallbackUrl = this.appCallbackUrl\n if (!appCallbackUrl) {\n appCallbackUrl = `${DEFAULT_RECLAIM_CALLBACK_URL}${this.sessionId}`\n }\n return appCallbackUrl\n }\n\n setStatusUrl(url: string) {\n this.statusUrl = url\n }\n\n getStatusUrl() {\n let statusUrl = this.statusUrl\n if (!statusUrl) {\n statusUrl = `${DEFAULT_RECLAIM_STATUS_URL}${this.sessionId}`\n }\n return statusUrl\n }\n\n setSignature(signature: string) {\n this.signature = signature\n }\n\n // @dev Use this function only in development environments\n async getSignature(\n requestedProofs: RequestedProofs,\n applicationSecret: string\n ): Promise<string> {\n const wallet = new ethers.Wallet(applicationSecret)\n const signature = await wallet.signMessage(\n ethers.getBytes(\n ethers.keccak256(\n new TextEncoder().encode(canonicalize(requestedProofs)!)\n )\n )\n )\n\n return signature\n }\n\n async buildHttpProviderV2ByName(\n providerNames: string[]\n ): Promise<ProviderV2[]> {\n try {\n\n const reclaimServerUrl =\n 'https://api.reclaimprotocol.org/get/httpsproviders'\n\n const appProvidersUrl = `https://api.reclaimprotocol.org/v2/app-http-providers/${this.applicationId}`\n\n\n const response = await fetch(reclaimServerUrl)\n const appResponse = await fetch(appProvidersUrl)\n\n\n if (!response.ok || !appResponse.ok) {\n throw new Error('Failed to fetch HTTP providers')\n }\n\n const allProviders = (await response.json()).providers as ProviderV2[]\n const appProviders = (await appResponse.json()).result.providers as string[]\n const filteredProviders = allProviders.filter(provider => {\n return providerNames.includes(provider.name)\n })\n if (filteredProviders.length == 0) {\n throw new Error(`Providers is not available for this application`)\n }\n for (let provider of filteredProviders) {\n if (!appProviders.includes(provider.name)) {\n throw new Error(`Provider ${provider.name} is not available for this application`)\n }\n }\n return filteredProviders\n } catch (error) {\n console.error('Error fetching HTTP providers:', error)\n throw error\n }\n }\n\n buildRequestedProofs(\n providers: ProviderV2[],\n callbackUrl: string,\n statusUrl?: string\n ): RequestedProofs {\n const claims = providers.map(provider => {\n return {\n provider: encodeURIComponent(provider.name),\n context: JSON.stringify(this.context),\n templateClaimId: provider.id,\n payload: {\n metadata: {\n name: encodeURIComponent(provider.name),\n logoUrl: provider.logoUrl\n },\n url: provider.url,\n urlType: provider.urlType as \"CONSTANT\" | \"REGEX\",\n method: provider.method as \"GET\" | \"POST\",\n login: {\n url: provider.loginUrl\n },\n parameters: {},\n responseSelections: provider.responseSelections,\n customInjection: provider.customInjection,\n bodySniff: provider.bodySniff,\n userAgent: provider.userAgent,\n useZk: true\n }\n } as RequestedClaim;\n });\n\n this.requestedProofs = {\n id: v4().toString(),\n sessionId: this.sessionId,\n name: 'web-SDK',\n callbackUrl: callbackUrl,\n statusUrl: statusUrl ? statusUrl : this.getStatusUrl(),\n claims: claims\n };\n\n return this.requestedProofs!;\n }\n\n addContext(address: string, message: string) {\n // TODO: sync data on backend\n this.context = {\n contextAddress: address,\n contextMessage: message\n }\n return this.context\n }\n\n static async verifySignedProof(proof: Proof) {\n if (!proof.signatures.length) {\n throw new Error('No signatures')\n }\n const witnesses = await getWitnessesForClaim(\n proof.claimData.epoch,\n proof.identifier,\n proof.claimData.timestampS\n )\n\n try {\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 = proof.identifier.replace('\"', '')\n proof.identifier = proof.identifier.replace('\"', '')\n // check if the identifier matches the one in the proof\n if (calculatedIdentifier !== proof.identifier) {\n throw new Error('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 // verify the witness signature\n assertValidSignedClaim(signedClaim, witnesses)\n } catch (e: Error | unknown) {\n console.error(e)\n return false\n }\n\n return true\n }\n}\n\nclass ReclaimVerficationRequest {\n onSuccessCallback?: (data: Proof | Error | unknown) => void | unknown\n onFailureCallback?: (data: Proof | Error | unknown) => void | unknown\n sessionId: string\n template: string\n statusUrl: string\n intervals: Map<string, NodeJS.Timer> = new Map()\n\n constructor(sessionId: string, statusUrl: string, template: string) {\n this.sessionId = sessionId\n this.statusUrl = statusUrl\n this.template = template\n }\n\n on(\n event: string,\n callback: (data: Proof | Error | unknown) => void | unknown\n ) {\n if (event === 'success') {\n this.onSuccessCallback = callback\n }\n if (event === 'error') {\n this.onFailureCallback = callback\n }\n return this\n }\n\n async start() {\n if (this.statusUrl && this.sessionId) {\n const interval = setInterval(async () => {\n try {\n const res = await fetch(this.statusUrl)\n const data = await res.json()\n\n if (!data.session) return\n\n data.session.proofs.forEach(async (proof: Proof) => {\n const verified = await ReclaimClient.verifySignedProof(proof)\n if (!verified) {\n throw new Error('Proof not verified')\n }\n })\n if (this.onSuccessCallback) {\n this.onSuccessCallback(data.session.proofs)\n }\n clearInterval(this.intervals.get(this.sessionId!))\n } catch (e: Error | unknown) {\n if (this.onFailureCallback) {\n this.onFailureCallback(e)\n }\n clearInterval(this.intervals.get(this.sessionId!))\n }\n }, 3000)\n this.intervals.set(this.sessionId, interval)\n return this.template\n }\n }\n}\n","import URL from 'url-parse';\nimport type { ParsedURL, SignedClaim } from './types';\nimport type { WitnessData } from './interfaces';\nimport { ethers } from 'ethers';\nimport { makeBeacon } from './smart-contract';\nimport { fetchWitnessListForClaim, createSignDataForClaim } from './witness';\n\n/*\n URL utils\n*/\nexport function parse(url: string): ParsedURL {\n validateURL(url);\n\n const parsed = URL(url, /* parseQueryString */ true);\n\n for (const param in parsed.query) {\n parsed.query[param] = decodeURIComponent(parsed.query[param]!);\n }\n const queryParams = parsed.query;\n\n let path = parsed.pathname || null;\n let hostname = parsed.hostname || null;\n let scheme = parsed.protocol || null;\n\n if (scheme) {\n // Remove colon at end\n scheme = scheme.substring(0, scheme.length - 1);\n }\n\n return {\n hostname,\n path,\n queryParams,\n scheme,\n };\n}\n\nfunction validateURL(url: string): void {\n if (typeof url !== 'string') {\n throw new Error(`Invalid URL: ${url}. URL must be a string.`);\n }\n if (!url) {\n throw new Error(`Invalid URL: ${url}. URL cannot be empty`);\n }\n}\n\n/*\n Witness Utils\n*/\n\nexport async function getWitnessesForClaim(\n epoch: number,\n identifier: string,\n timestampS: number\n) {\n const beacon = makeBeacon();\n if (!beacon) throw new Error('No beacon');\n const state = await beacon.getState(epoch);\n const witnessList = fetchWitnessListForClaim(state, identifier, timestampS);\n return witnessList.map((w: WitnessData) => w.id.toLowerCase());\n}\n\n/*\n Proof Utils\n*/\n\n/** recovers the addresses of those that signed the claim */\nexport function recoverSignersOfSignedClaim({\n claim,\n signatures,\n}: SignedClaim) {\n const dataStr = createSignDataForClaim({ ...claim });\n return signatures.map((signature) =>\n ethers.verifyMessage(dataStr, ethers.hexlify(signature)).toLowerCase()\n );\n}\n\n/**\n * Asserts that the claim is signed by the expected witnesses\n * @param claim\n * @param expectedWitnessAddresses\n */\nexport function assertValidSignedClaim(\n claim: SignedClaim,\n expectedWitnessAddresses: string[]\n) {\n const witnessAddresses = recoverSignersOfSignedClaim(claim);\n // set of witnesses whose signatures we've not seen\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 // check if all witnesses have signed\n if (witnessesNotSeen.size > 0) {\n throw new Error(\n `Missing signatures from ${expectedWitnessAddresses.join(', ')}`\n );\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}\n","import type { Beacon, BeaconState } from './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 = 420;\n\nexport function makeBeacon(chainId?: number): Beacon | undefined {\n chainId = chainId || DEFAULT_CHAIN_ID;\n const contract = getContract(chainId);\n if (contract) {\n return makeBeaconCacheable({\n async getState(epochId: number | undefined): Promise<BeaconState> {\n //@ts-ignore\n const epoch = await contract.fetchEpoch(epochId || 0);\n if (!epoch.id) {\n throw new Error(`Invalid epoch ID: ${epochId}`);\n }\n\n return {\n epoch: epoch.id,\n witnesses: epoch.witnesses.map((w: any) => ({\n id: w.addr.toLowerCase(),\n url: w.host,\n })),\n witnessesRequiredForClaim: epoch.minimumWitnessesForClaimCreation,\n nextEpochTimestampS: epoch.timestampEnd,\n };\n },\n });\n } else {\n return undefined;\n }\n}\n\nexport function makeBeaconCacheable(beacon: Beacon): Beacon {\n const cache: { [epochId: number]: Promise<BeaconState> } = {};\n\n return {\n ...beacon,\n async getState(epochId: number | undefined): Promise<BeaconState> {\n if (!epochId) {\n // TODO: add cache here\n const state = await beacon.getState();\n return state;\n }\n\n const key = epochId;\n\n if (!cache[key]) {\n cache[key] = beacon.getState(epochId);\n }\n\n return cache[key] as unknown as BeaconState;\n },\n };\n}\n\nconst existingContractsMap: { [chain: string]: Contract } = {};\n\nfunction getContract(chainId: number): Contract {\n const chainKey = `0x${chainId.toString(16)}`;\n if (!existingContractsMap[chainKey]) {\n const contractData =\n CONTRACTS_CONFIG[chainKey as keyof typeof CONTRACTS_CONFIG];\n if (!contractData) {\n throw new Error(`Unsupported chain: \"${chainKey}\"`);\n }\n\n const rpcProvider = new ethers.JsonRpcProvider(contractData.rpcUrl);\n existingContractsMap[chainKey] = ReclaimFactory.connect(\n contractData.address,\n rpcProvider\n );\n }\n\n return existingContractsMap[chainKey] as Contract;\n}\n"],"mappings":"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","names":["import_ethers","import_ethers","import_ethers","import_ethers","canonicalize"]}
package/package.json ADDED
@@ -0,0 +1,72 @@
1
+ {
2
+ "name": "@reclaimprotocol/js-sdk",
3
+ "version": "0.0.1",
4
+ "description": "Designed to request proofs from the Reclaim protocol and manage the flow of claims and witness interactions.",
5
+ "main": "dist/index.js",
6
+ "keywords": [],
7
+ "files": [
8
+ "dist"
9
+ ],
10
+ "tsup": {
11
+ "entry": [
12
+ "src/index.ts"
13
+ ],
14
+ "splitting": false,
15
+ "sourcemap": true,
16
+ "clean": true
17
+ },
18
+ "scripts": {
19
+ "build": "tsup",
20
+ "release": "release-it",
21
+ "test": "echo \"Error: no test specified\" && exit 1"
22
+ },
23
+ "repository": {
24
+ "type": "git",
25
+ "url": "git+https://github.com/reclaimprotocol/v2-reclaim-sdk.git"
26
+ },
27
+ "author": "alimansour0002 <106339946+alimansour0002@users.noreply.github.com> (https://github.com/alimansour0002)",
28
+ "license": "MIT",
29
+ "bugs": {
30
+ "url": "https://github.com/reclaimprotocol/v2-reclaim-sdk/issues"
31
+ },
32
+ "homepage": "https://github.com/reclaimprotocol/v2-reclaim-sdk#readme",
33
+ "publishConfig": {
34
+ "registry": "https://registry.npmjs.org/",
35
+ "access": "public"
36
+ },
37
+ "release-it": {
38
+ "git": {
39
+ "commitMessage": "chore: release ${version}",
40
+ "tagName": "v${version}"
41
+ },
42
+ "npm": {
43
+ "publish": true,
44
+ "tag": "beta"
45
+ },
46
+ "github": {
47
+ "release": true
48
+ },
49
+ "plugins": {
50
+ "@release-it/conventional-changelog": {
51
+ "preset": "angular"
52
+ }
53
+ }
54
+ },
55
+ "devDependencies": {
56
+ "@bconnorwhite/bob": "^2.9.5",
57
+ "@release-it/conventional-changelog": "^5.0.0",
58
+ "@types/qs": "^6.9.11",
59
+ "@types/url-parse": "^1.4.11",
60
+ "@types/uuid": "^9.0.7",
61
+ "release-it": "^15.0.0",
62
+ "tsup": "^8.0.1",
63
+ "typescript": "^5.3.3"
64
+ },
65
+ "dependencies": {
66
+ "canonicalize": "^2.0.0",
67
+ "ethers": "^6.9.1",
68
+ "qs": "^6.11.2",
69
+ "url-parse": "^1.5.10",
70
+ "uuid": "^9.0.1"
71
+ }
72
+ }