@waku/rln 0.1.5-76f86de.0 → 0.1.5-ea6daae.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.
Files changed (110) hide show
  1. package/README.md +0 -5
  2. package/bundle/_virtual/index2.js +1 -1
  3. package/bundle/_virtual/utils.js +2 -2
  4. package/bundle/_virtual/utils2.js +2 -2
  5. package/bundle/index.js +1 -1
  6. package/bundle/{packages/rln/node_modules → node_modules}/@chainsafe/bls-keystore/lib/checksum.js +3 -3
  7. package/bundle/{packages/rln/node_modules → node_modules}/@chainsafe/bls-keystore/lib/cipher.js +4 -4
  8. package/bundle/{packages/rln/node_modules → node_modules}/@chainsafe/bls-keystore/lib/class.js +7 -7
  9. package/bundle/{packages/rln/node_modules → node_modules}/@chainsafe/bls-keystore/lib/functional.js +7 -7
  10. package/bundle/{packages/rln/node_modules → node_modules}/@chainsafe/bls-keystore/lib/index.js +6 -6
  11. package/bundle/{packages/rln/node_modules → node_modules}/@chainsafe/bls-keystore/lib/kdf.js +5 -5
  12. package/bundle/{packages/rln/node_modules → node_modules}/@chainsafe/bls-keystore/lib/password.js +1 -1
  13. package/bundle/{packages/rln/node_modules → node_modules}/@chainsafe/bls-keystore/lib/schema-validation-generated.js +1 -1
  14. package/bundle/{packages/rln/node_modules → node_modules}/@chainsafe/bls-keystore/lib/schema-validation.js +2 -2
  15. package/bundle/{packages/rln/node_modules → node_modules}/@chainsafe/bls-keystore/lib/types.js +1 -1
  16. package/bundle/{packages/rln → node_modules/@chainsafe/bls-keystore}/node_modules/@noble/hashes/_assert.js +1 -1
  17. package/bundle/{packages/rln → node_modules/@chainsafe/bls-keystore}/node_modules/@noble/hashes/_sha2.js +3 -3
  18. package/bundle/{packages/rln → node_modules/@chainsafe/bls-keystore}/node_modules/@noble/hashes/_u64.js +1 -1
  19. package/bundle/{packages/rln → node_modules/@chainsafe/bls-keystore}/node_modules/@noble/hashes/cryptoBrowser.js +1 -1
  20. package/bundle/{packages/rln → node_modules/@chainsafe/bls-keystore}/node_modules/@noble/hashes/hmac.js +3 -3
  21. package/bundle/{packages/rln → node_modules/@chainsafe/bls-keystore}/node_modules/@noble/hashes/pbkdf2.js +4 -4
  22. package/bundle/{packages/rln → node_modules/@chainsafe/bls-keystore}/node_modules/@noble/hashes/scrypt.js +5 -5
  23. package/bundle/{packages/rln → node_modules/@chainsafe/bls-keystore}/node_modules/@noble/hashes/sha256.js +3 -3
  24. package/bundle/{packages/rln → node_modules/@chainsafe/bls-keystore}/node_modules/@noble/hashes/sha512.js +4 -4
  25. package/bundle/{packages/rln → node_modules/@chainsafe/bls-keystore}/node_modules/@noble/hashes/utils.js +2 -2
  26. package/bundle/{packages/rln/node_modules → node_modules}/@chainsafe/bls-keystore/node_modules/ethereum-cryptography/aes.js +3 -3
  27. package/bundle/{packages/rln/node_modules → node_modules}/@chainsafe/bls-keystore/node_modules/ethereum-cryptography/pbkdf2.js +7 -7
  28. package/bundle/{packages/rln/node_modules → node_modules}/@chainsafe/bls-keystore/node_modules/ethereum-cryptography/random.js +3 -3
  29. package/bundle/{packages/rln/node_modules → node_modules}/@chainsafe/bls-keystore/node_modules/ethereum-cryptography/scrypt.js +3 -3
  30. package/bundle/{packages/rln/node_modules → node_modules}/@chainsafe/bls-keystore/node_modules/ethereum-cryptography/sha256.js +3 -3
  31. package/bundle/{packages/rln/node_modules → node_modules}/@chainsafe/bls-keystore/node_modules/ethereum-cryptography/utils.js +7 -7
  32. package/bundle/node_modules/@ethersproject/abi/lib.esm/_version.js +1 -1
  33. package/bundle/node_modules/@ethersproject/abstract-provider/lib.esm/_version.js +1 -1
  34. package/bundle/node_modules/@ethersproject/abstract-signer/lib.esm/_version.js +1 -1
  35. package/bundle/node_modules/@ethersproject/address/lib.esm/_version.js +1 -1
  36. package/bundle/node_modules/@ethersproject/bignumber/lib.esm/_version.js +1 -1
  37. package/bundle/node_modules/@ethersproject/contracts/lib.esm/_version.js +1 -1
  38. package/bundle/node_modules/@ethersproject/contracts/lib.esm/index.js +1 -1
  39. package/bundle/node_modules/@ethersproject/hash/lib.esm/_version.js +1 -1
  40. package/bundle/node_modules/@ethersproject/keccak256/lib.esm/index.js +1 -1
  41. package/bundle/node_modules/@ethersproject/networks/lib.esm/_version.js +1 -1
  42. package/bundle/node_modules/@ethersproject/networks/lib.esm/index.js +19 -1
  43. package/bundle/node_modules/@ethersproject/properties/lib.esm/_version.js +1 -1
  44. package/bundle/node_modules/@ethersproject/providers/lib.esm/_version.js +1 -1
  45. package/bundle/node_modules/@ethersproject/signing-key/lib.esm/_version.js +1 -1
  46. package/bundle/node_modules/@ethersproject/signing-key/lib.esm/elliptic.js +58 -10
  47. package/bundle/node_modules/@ethersproject/strings/lib.esm/_version.js +1 -1
  48. package/bundle/node_modules/@ethersproject/transactions/lib.esm/_version.js +1 -1
  49. package/bundle/node_modules/@ethersproject/web/lib.esm/_version.js +1 -1
  50. package/bundle/node_modules/{@ethersproject/keccak256/node_modules/js-sha3 → js-sha3}/src/sha3.js +2 -2
  51. package/bundle/packages/rln/dist/contract/abi.js +248 -502
  52. package/bundle/packages/rln/dist/contract/constants.js +4 -4
  53. package/bundle/packages/rln/dist/contract/rln_contract.js +36 -120
  54. package/bundle/packages/rln/dist/keystore/cipher.js +3 -3
  55. package/bundle/packages/rln/dist/keystore/keystore.js +2 -3
  56. package/bundle/packages/rln/dist/rln.js +4 -4
  57. package/dist/.tsbuildinfo +1 -1
  58. package/dist/contract/abi.d.ts +17 -21
  59. package/dist/contract/abi.js +248 -502
  60. package/dist/contract/abi.js.map +1 -1
  61. package/dist/contract/constants.d.ts +18 -22
  62. package/dist/contract/constants.js +3 -3
  63. package/dist/contract/constants.js.map +1 -1
  64. package/dist/contract/rln_contract.d.ts +3 -10
  65. package/dist/contract/rln_contract.js +36 -120
  66. package/dist/contract/rln_contract.js.map +1 -1
  67. package/dist/index.d.ts +2 -3
  68. package/dist/index.js +2 -2
  69. package/dist/index.js.map +1 -1
  70. package/dist/keystore/keystore.js +1 -2
  71. package/dist/keystore/keystore.js.map +1 -1
  72. package/dist/keystore/types.d.ts +0 -1
  73. package/dist/rln.d.ts +1 -1
  74. package/dist/rln.js +4 -4
  75. package/dist/rln.js.map +1 -1
  76. package/package.json +1 -1
  77. package/src/contract/abi.ts +248 -502
  78. package/src/contract/constants.ts +3 -3
  79. package/src/contract/rln_contract.ts +46 -158
  80. package/src/index.ts +2 -13
  81. package/src/keystore/keystore.ts +1 -2
  82. package/src/keystore/types.ts +0 -1
  83. package/src/rln.ts +5 -5
  84. package/dist/codec.test-utils.d.ts +0 -36
  85. package/dist/codec.test-utils.js +0 -56
  86. package/dist/codec.test-utils.js.map +0 -1
  87. package/dist/contract/test-setup.d.ts +0 -26
  88. package/dist/contract/test-setup.js +0 -56
  89. package/dist/contract/test-setup.js.map +0 -1
  90. package/dist/contract/test-utils.d.ts +0 -39
  91. package/dist/contract/test-utils.js +0 -118
  92. package/dist/contract/test-utils.js.map +0 -1
  93. package/src/codec.test-utils.ts +0 -80
  94. package/src/contract/test-setup.ts +0 -86
  95. package/src/contract/test-utils.ts +0 -179
  96. /package/bundle/{packages/rln/node_modules → node_modules}/@chainsafe/bls-keystore/node_modules/uuid/dist/esm-browser/index.js +0 -0
  97. /package/bundle/{packages/rln/node_modules → node_modules}/@chainsafe/bls-keystore/node_modules/uuid/dist/esm-browser/md5.js +0 -0
  98. /package/bundle/{packages/rln/node_modules → node_modules}/@chainsafe/bls-keystore/node_modules/uuid/dist/esm-browser/nil.js +0 -0
  99. /package/bundle/{packages/rln/node_modules → node_modules}/@chainsafe/bls-keystore/node_modules/uuid/dist/esm-browser/parse.js +0 -0
  100. /package/bundle/{packages/rln/node_modules → node_modules}/@chainsafe/bls-keystore/node_modules/uuid/dist/esm-browser/regex.js +0 -0
  101. /package/bundle/{packages/rln/node_modules → node_modules}/@chainsafe/bls-keystore/node_modules/uuid/dist/esm-browser/rng.js +0 -0
  102. /package/bundle/{packages/rln/node_modules → node_modules}/@chainsafe/bls-keystore/node_modules/uuid/dist/esm-browser/sha1.js +0 -0
  103. /package/bundle/{packages/rln/node_modules → node_modules}/@chainsafe/bls-keystore/node_modules/uuid/dist/esm-browser/stringify.js +0 -0
  104. /package/bundle/{packages/rln/node_modules → node_modules}/@chainsafe/bls-keystore/node_modules/uuid/dist/esm-browser/v1.js +0 -0
  105. /package/bundle/{packages/rln/node_modules → node_modules}/@chainsafe/bls-keystore/node_modules/uuid/dist/esm-browser/v3.js +0 -0
  106. /package/bundle/{packages/rln/node_modules → node_modules}/@chainsafe/bls-keystore/node_modules/uuid/dist/esm-browser/v35.js +0 -0
  107. /package/bundle/{packages/rln/node_modules → node_modules}/@chainsafe/bls-keystore/node_modules/uuid/dist/esm-browser/v4.js +0 -0
  108. /package/bundle/{packages/rln/node_modules → node_modules}/@chainsafe/bls-keystore/node_modules/uuid/dist/esm-browser/v5.js +0 -0
  109. /package/bundle/{packages/rln/node_modules → node_modules}/@chainsafe/bls-keystore/node_modules/uuid/dist/esm-browser/validate.js +0 -0
  110. /package/bundle/{packages/rln/node_modules → node_modules}/@chainsafe/bls-keystore/node_modules/uuid/dist/esm-browser/version.js +0 -0
@@ -1,8 +1,8 @@
1
1
  import { RLN_ABI } from "./abi.js";
2
2
 
3
- export const LINEA_CONTRACT = {
4
- chainId: 59141,
5
- address: "0xb9cd878c90e49f797b4431fbf4fb333108cb90e6",
3
+ export const SEPOLIA_CONTRACT = {
4
+ chainId: 11155111,
5
+ address: "0xCB33Aa5B38d79E3D9Fa8B10afF38AA201399a7e3",
6
6
  abi: RLN_ABI
7
7
  };
8
8
 
@@ -30,7 +30,7 @@ interface RLNContractInitOptions extends RLNContractOptions {
30
30
 
31
31
  export interface MembershipRegisteredEvent {
32
32
  idCommitment: string;
33
- membershipRateLimit: ethers.BigNumber;
33
+ rateLimit: number;
34
34
  index: ethers.BigNumber;
35
35
  }
36
36
 
@@ -65,8 +65,7 @@ export class RLNContract {
65
65
 
66
66
  private _members: Map<number, Member> = new Map();
67
67
  private _membersFilter: ethers.EventFilter;
68
- private _membershipErasedFilter: ethers.EventFilter;
69
- private _membersExpiredFilter: ethers.EventFilter;
68
+ private _membersRemovedFilter: ethers.EventFilter;
70
69
 
71
70
  /**
72
71
  * Asynchronous initializer for RLNContract.
@@ -95,7 +94,15 @@ export class RLNContract {
95
94
  contract
96
95
  } = options;
97
96
 
98
- this.validateRateLimit(rateLimit);
97
+ if (
98
+ rateLimit < RATE_LIMIT_PARAMS.MIN_RATE ||
99
+ rateLimit > RATE_LIMIT_PARAMS.MAX_RATE
100
+ ) {
101
+ throw new Error(
102
+ `Rate limit must be between ${RATE_LIMIT_PARAMS.MIN_RATE} and ${RATE_LIMIT_PARAMS.MAX_RATE} messages per epoch`
103
+ );
104
+ }
105
+
99
106
  this.rateLimit = rateLimit;
100
107
 
101
108
  const initialRoot = rlnInstance.zerokit.getMerkleRoot();
@@ -104,25 +111,9 @@ export class RLNContract {
104
111
  this.contract = contract || new ethers.Contract(address, RLN_ABI, signer);
105
112
  this.merkleRootTracker = new MerkleRootTracker(5, initialRoot);
106
113
 
107
- // Initialize event filters
114
+ // Initialize event filters for MembershipRegistered and MembershipRemoved
108
115
  this._membersFilter = this.contract.filters.MembershipRegistered();
109
- this._membershipErasedFilter = this.contract.filters.MembershipErased();
110
- this._membersExpiredFilter = this.contract.filters.MembershipExpired();
111
- }
112
-
113
- /**
114
- * Validates that the rate limit is within the allowed range
115
- * @throws Error if the rate limit is outside the allowed range
116
- */
117
- private validateRateLimit(rateLimit: number): void {
118
- if (
119
- rateLimit < RATE_LIMIT_PARAMS.MIN_RATE ||
120
- rateLimit > RATE_LIMIT_PARAMS.MAX_RATE
121
- ) {
122
- throw new Error(
123
- `Rate limit must be between ${RATE_LIMIT_PARAMS.MIN_RATE} and ${RATE_LIMIT_PARAMS.MAX_RATE} messages per epoch`
124
- );
125
- }
116
+ this._membersRemovedFilter = this.contract.filters.MembershipRemoved();
126
117
  }
127
118
 
128
119
  /**
@@ -191,7 +182,7 @@ export class RLNContract {
191
182
  this.contract.maxTotalRateLimit(),
192
183
  this.contract.currentTotalRateLimit()
193
184
  ]);
194
- return Number(maxTotal) - Number(currentTotal);
185
+ return maxTotal.sub(currentTotal).toNumber();
195
186
  }
196
187
 
197
188
  /**
@@ -199,7 +190,6 @@ export class RLNContract {
199
190
  * @param newRateLimit The new rate limit to use
200
191
  */
201
192
  public async setRateLimit(newRateLimit: number): Promise<void> {
202
- this.validateRateLimit(newRateLimit);
203
193
  this.rateLimit = newRateLimit;
204
194
  }
205
195
 
@@ -217,18 +207,11 @@ export class RLNContract {
217
207
  return this._membersFilter;
218
208
  }
219
209
 
220
- private get membershipErasedFilter(): ethers.EventFilter {
221
- if (!this._membershipErasedFilter) {
222
- throw Error("MembershipErased filter was not initialized.");
210
+ private get membersRemovedFilter(): ethers.EventFilter {
211
+ if (!this._membersRemovedFilter) {
212
+ throw Error("MembersRemoved filter was not initialized.");
223
213
  }
224
- return this._membershipErasedFilter;
225
- }
226
-
227
- private get membersExpiredFilter(): ethers.EventFilter {
228
- if (!this._membersExpiredFilter) {
229
- throw Error("MembersExpired filter was not initialized.");
230
- }
231
- return this._membersExpiredFilter;
214
+ return this._membersRemovedFilter;
232
215
  }
233
216
 
234
217
  public async fetchMembers(
@@ -243,19 +226,10 @@ export class RLNContract {
243
226
  const removedMemberEvents = await queryFilter(this.contract, {
244
227
  fromBlock: this.deployBlock,
245
228
  ...options,
246
- membersFilter: this.membershipErasedFilter
247
- });
248
- const expiredMemberEvents = await queryFilter(this.contract, {
249
- fromBlock: this.deployBlock,
250
- ...options,
251
- membersFilter: this.membersExpiredFilter
229
+ membersFilter: this.membersRemovedFilter
252
230
  });
253
231
 
254
- const events = [
255
- ...registeredMemberEvents,
256
- ...removedMemberEvents,
257
- ...expiredMemberEvents
258
- ];
232
+ const events = [...registeredMemberEvents, ...removedMemberEvents];
259
233
  this.processEvents(rlnInstance, events);
260
234
  }
261
235
 
@@ -268,26 +242,8 @@ export class RLNContract {
268
242
  return;
269
243
  }
270
244
 
271
- if (
272
- evt.event === "MembershipErased" ||
273
- evt.event === "MembershipExpired"
274
- ) {
275
- let index = evt.args.index;
276
-
277
- if (!index) {
278
- return;
279
- }
280
-
281
- if (typeof index === "number" || typeof index === "string") {
282
- index = ethers.BigNumber.from(index);
283
- } else {
284
- log.error("Index is not a number or string", {
285
- index,
286
- event: evt
287
- });
288
- return;
289
- }
290
-
245
+ if (evt.event === "MembershipRemoved") {
246
+ const index = evt.args.index as ethers.BigNumber;
291
247
  const toRemoveVal = toRemoveTable.get(evt.blockNumber);
292
248
  if (toRemoveVal != undefined) {
293
249
  toRemoveVal.push(index.toNumber());
@@ -319,21 +275,15 @@ export class RLNContract {
319
275
  if (!evt.args) return;
320
276
 
321
277
  const _idCommitment = evt.args.idCommitment as string;
322
- let index = evt.args.index;
278
+ const index = evt.args.index as ethers.BigNumber;
323
279
 
324
280
  if (!_idCommitment || !index) {
325
281
  return;
326
282
  }
327
283
 
328
- if (typeof index === "number" || typeof index === "string") {
329
- index = ethers.BigNumber.from(index);
330
- }
331
-
332
284
  const idCommitment = zeroPadLE(hexToBytes(_idCommitment), 32);
333
285
  rlnInstance.zerokit.insertMember(idCommitment);
334
-
335
- const numericIndex = index.toNumber();
336
- this._members.set(numericIndex, {
286
+ this._members.set(index.toNumber(), {
337
287
  index,
338
288
  idCommitment: _idCommitment
339
289
  });
@@ -366,7 +316,7 @@ export class RLNContract {
366
316
  this.membersFilter,
367
317
  (
368
318
  _idCommitment: string,
369
- _membershipRateLimit: ethers.BigNumber,
319
+ _rateLimit: number,
370
320
  _index: ethers.BigNumber,
371
321
  event: ethers.Event
372
322
  ) => {
@@ -375,22 +325,9 @@ export class RLNContract {
375
325
  );
376
326
 
377
327
  this.contract.on(
378
- this.membershipErasedFilter,
328
+ this.membersRemovedFilter,
379
329
  (
380
330
  _idCommitment: string,
381
- _membershipRateLimit: ethers.BigNumber,
382
- _index: ethers.BigNumber,
383
- event: ethers.Event
384
- ) => {
385
- this.processEvents(rlnInstance, [event]);
386
- }
387
- );
388
-
389
- this.contract.on(
390
- this.membersExpiredFilter,
391
- (
392
- _idCommitment: string,
393
- _membershipRateLimit: ethers.BigNumber,
394
331
  _index: ethers.BigNumber,
395
332
  event: ethers.Event
396
333
  ) => {
@@ -407,45 +344,15 @@ export class RLNContract {
407
344
  `Registering identity with rate limit: ${this.rateLimit} messages/epoch`
408
345
  );
409
346
 
410
- // Check if the ID commitment is already registered
411
- const existingIndex = await this.getMemberIndex(
412
- identity.IDCommitmentBigInt.toString()
413
- );
414
- if (existingIndex) {
415
- throw new Error(
416
- `ID commitment is already registered with index ${existingIndex}`
417
- );
418
- }
419
-
420
- // Check if there's enough remaining rate limit
421
- const remainingRateLimit = await this.getRemainingTotalRateLimit();
422
- if (remainingRateLimit < this.rateLimit) {
423
- throw new Error(
424
- `Not enough remaining rate limit. Requested: ${this.rateLimit}, Available: ${remainingRateLimit}`
425
- );
426
- }
427
-
428
- const estimatedGas = await this.contract.estimateGas.register(
429
- identity.IDCommitmentBigInt,
430
- this.rateLimit,
431
- []
432
- );
433
- const gasLimit = estimatedGas.add(10000);
434
-
435
347
  const txRegisterResponse: ethers.ContractTransaction =
436
348
  await this.contract.register(
437
349
  identity.IDCommitmentBigInt,
438
350
  this.rateLimit,
439
351
  [],
440
- { gasLimit }
352
+ { gasLimit: 300000 }
441
353
  );
442
-
443
354
  const txRegisterReceipt = await txRegisterResponse.wait();
444
355
 
445
- if (txRegisterReceipt.status === 0) {
446
- throw new Error("Transaction failed on-chain");
447
- }
448
-
449
356
  const memberRegistered = txRegisterReceipt.events?.find(
450
357
  (event) => event.event === "MembershipRegistered"
451
358
  );
@@ -459,55 +366,30 @@ export class RLNContract {
459
366
 
460
367
  const decodedData: MembershipRegisteredEvent = {
461
368
  idCommitment: memberRegistered.args.idCommitment,
462
- membershipRateLimit: memberRegistered.args.membershipRateLimit,
369
+ rateLimit: memberRegistered.args.rateLimit,
463
370
  index: memberRegistered.args.index
464
371
  };
465
372
 
466
373
  log.info(
467
374
  `Successfully registered membership with index ${decodedData.index} ` +
468
- `and rate limit ${decodedData.membershipRateLimit}`
375
+ `and rate limit ${decodedData.rateLimit}`
469
376
  );
470
377
 
471
378
  const network = await this.contract.provider.getNetwork();
472
379
  const address = this.contract.address;
473
- const membershipId = Number(decodedData.index);
380
+ const membershipId = decodedData.index.toNumber();
474
381
 
475
382
  return {
476
383
  identity,
477
384
  membership: {
478
385
  address,
479
386
  treeIndex: membershipId,
480
- chainId: network.chainId,
481
- rateLimit: decodedData.membershipRateLimit.toNumber()
387
+ chainId: network.chainId
482
388
  }
483
389
  };
484
390
  } catch (error) {
485
- if (error instanceof Error) {
486
- const errorMessage = error.message;
487
- log.error("registerWithIdentity - error message:", errorMessage);
488
- log.error("registerWithIdentity - error stack:", error.stack);
489
-
490
- // Try to extract more specific error information
491
- if (errorMessage.includes("CannotExceedMaxTotalRateLimit")) {
492
- throw new Error(
493
- "Registration failed: Cannot exceed maximum total rate limit"
494
- );
495
- } else if (errorMessage.includes("InvalidIdCommitment")) {
496
- throw new Error("Registration failed: Invalid ID commitment");
497
- } else if (errorMessage.includes("InvalidMembershipRateLimit")) {
498
- throw new Error("Registration failed: Invalid membership rate limit");
499
- } else if (errorMessage.includes("execution reverted")) {
500
- throw new Error(
501
- "Contract execution reverted. Check contract requirements."
502
- );
503
- } else {
504
- throw new Error(`Error in registerWithIdentity: ${errorMessage}`);
505
- }
506
- } else {
507
- throw new Error("Unknown error in registerWithIdentity", {
508
- cause: error
509
- });
510
- }
391
+ log.error(`Error in registerWithIdentity: ${(error as Error).message}`);
392
+ return undefined;
511
393
  }
512
394
  }
513
395
 
@@ -585,26 +467,25 @@ export class RLNContract {
585
467
 
586
468
  const decodedData: MembershipRegisteredEvent = {
587
469
  idCommitment: memberRegistered.args.idCommitment,
588
- membershipRateLimit: memberRegistered.args.membershipRateLimit,
470
+ rateLimit: memberRegistered.args.rateLimit,
589
471
  index: memberRegistered.args.index
590
472
  };
591
473
 
592
474
  log.info(
593
475
  `Successfully registered membership with permit. Index: ${decodedData.index}, ` +
594
- `Rate limit: ${decodedData.membershipRateLimit}, Erased ${idCommitmentsToErase.length} commitments`
476
+ `Rate limit: ${decodedData.rateLimit}, Erased ${idCommitmentsToErase.length} commitments`
595
477
  );
596
478
 
597
479
  const network = await this.contract.provider.getNetwork();
598
480
  const address = this.contract.address;
599
- const membershipId = ethers.BigNumber.from(decodedData.index).toNumber();
481
+ const membershipId = decodedData.index.toNumber();
600
482
 
601
483
  return {
602
484
  identity,
603
485
  membership: {
604
486
  address,
605
487
  treeIndex: membershipId,
606
- chainId: network.chainId,
607
- rateLimit: decodedData.membershipRateLimit.toNumber()
488
+ chainId: network.chainId
608
489
  }
609
490
  };
610
491
  } catch (error) {
@@ -679,9 +560,16 @@ export class RLNContract {
679
560
 
680
561
  public async registerMembership(
681
562
  idCommitment: string,
682
- rateLimit: number = this.rateLimit
563
+ rateLimit: number = DEFAULT_RATE_LIMIT
683
564
  ): Promise<ethers.ContractTransaction> {
684
- this.validateRateLimit(rateLimit);
565
+ if (
566
+ rateLimit < RATE_LIMIT_PARAMS.MIN_RATE ||
567
+ rateLimit > RATE_LIMIT_PARAMS.MAX_RATE
568
+ ) {
569
+ throw new Error(
570
+ `Rate limit must be between ${RATE_LIMIT_PARAMS.MIN_RATE} and ${RATE_LIMIT_PARAMS.MAX_RATE}`
571
+ );
572
+ }
685
573
  return this.contract.register(idCommitment, rateLimit, []);
686
574
  }
687
575
 
package/src/index.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { RLNDecoder, RLNEncoder } from "./codec.js";
2
2
  import { RLN_ABI } from "./contract/abi.js";
3
- import { LINEA_CONTRACT, RLNContract } from "./contract/index.js";
3
+ import { RLNContract, SEPOLIA_CONTRACT } from "./contract/index.js";
4
4
  import { createRLN } from "./create.js";
5
5
  import { IdentityCredential } from "./identity.js";
6
6
  import { Keystore } from "./keystore/index.js";
@@ -19,18 +19,7 @@ export {
19
19
  RLNDecoder,
20
20
  MerkleRootTracker,
21
21
  RLNContract,
22
- LINEA_CONTRACT,
22
+ SEPOLIA_CONTRACT,
23
23
  extractMetaMaskSigner,
24
24
  RLN_ABI
25
25
  };
26
-
27
- export type {
28
- DecryptedCredentials,
29
- EncryptedCredentials,
30
- Keccak256Hash,
31
- KeystoreEntity,
32
- MembershipHash,
33
- MembershipInfo,
34
- Password,
35
- Sha256Hash
36
- } from "./keystore/types.js";
@@ -274,8 +274,7 @@ export class Keystore {
274
274
  membership: {
275
275
  treeIndex: _.get(obj, "treeIndex"),
276
276
  chainId: _.get(obj, "membershipContract.chainId"),
277
- address: _.get(obj, "membershipContract.address"),
278
- rateLimit: _.get(obj, "membershipContract.rateLimit")
277
+ address: _.get(obj, "membershipContract.address")
279
278
  }
280
279
  };
281
280
  } catch (err) {
@@ -11,7 +11,6 @@ export type MembershipInfo = {
11
11
  chainId: number;
12
12
  address: string;
13
13
  treeIndex: number;
14
- rateLimit: number;
15
14
  };
16
15
 
17
16
  export type KeystoreEntity = {
package/src/rln.ts CHANGED
@@ -16,7 +16,7 @@ import {
16
16
  type RLNEncoder
17
17
  } from "./codec.js";
18
18
  import { DEFAULT_RATE_LIMIT } from "./contract/constants.js";
19
- import { LINEA_CONTRACT, RLNContract } from "./contract/index.js";
19
+ import { RLNContract, SEPOLIA_CONTRACT } from "./contract/index.js";
20
20
  import { IdentityCredential } from "./identity.js";
21
21
  import { Keystore } from "./keystore/index.js";
22
22
  import type {
@@ -108,7 +108,7 @@ type StartRLNOptions = {
108
108
  */
109
109
  signer?: ethers.Signer;
110
110
  /**
111
- * If not set - will use default LINEA_CONTRACT address.
111
+ * If not set - will use default SEPOLIA_CONTRACT address.
112
112
  */
113
113
  address?: string;
114
114
  /**
@@ -190,10 +190,10 @@ export class RLNInstance {
190
190
  const address =
191
191
  credentials?.membership.address ||
192
192
  options.address ||
193
- LINEA_CONTRACT.address;
193
+ SEPOLIA_CONTRACT.address;
194
194
 
195
- if (address === LINEA_CONTRACT.address) {
196
- chainId = LINEA_CONTRACT.chainId;
195
+ if (address === SEPOLIA_CONTRACT.address) {
196
+ chainId = SEPOLIA_CONTRACT.chainId;
197
197
  }
198
198
 
199
199
  const signer = options.signer || (await extractMetaMaskSigner());
@@ -1,36 +0,0 @@
1
- import type { IProtoMessage } from "@waku/interfaces";
2
- import type { IdentityCredential } from "./identity.js";
3
- export interface TestRLNCodecSetup {
4
- rlnInstance: any;
5
- credential: IdentityCredential;
6
- index: number;
7
- payload: Uint8Array;
8
- }
9
- export declare const TEST_CONSTANTS: {
10
- readonly contentTopic: "/test/1/waku-message/utf8";
11
- readonly emptyPubsubTopic: "";
12
- readonly defaultIndex: 0;
13
- readonly defaultPayload: Uint8Array;
14
- };
15
- export declare const EMPTY_PROTO_MESSAGE: {
16
- readonly timestamp: undefined;
17
- readonly contentTopic: "";
18
- readonly ephemeral: undefined;
19
- readonly meta: undefined;
20
- readonly rateLimitProof: undefined;
21
- readonly version: undefined;
22
- };
23
- /**
24
- * Creates a basic RLN setup for codec tests
25
- */
26
- export declare function createTestRLNCodecSetup(): Promise<TestRLNCodecSetup>;
27
- /**
28
- * Creates a meta setter function for testing
29
- */
30
- export declare function createTestMetaSetter(): (msg: IProtoMessage & {
31
- meta: undefined;
32
- }) => Uint8Array;
33
- /**
34
- * Verifies common RLN message properties
35
- */
36
- export declare function verifyRLNMessage(msg: any, payload: Uint8Array, contentTopic: string, version: number, rlnInstance: any): void;
@@ -1,56 +0,0 @@
1
- import { expect } from "chai";
2
- import { createRLN } from "./create.js";
3
- export const TEST_CONSTANTS = {
4
- contentTopic: "/test/1/waku-message/utf8",
5
- emptyPubsubTopic: "",
6
- defaultIndex: 0,
7
- defaultPayload: new Uint8Array([1, 2, 3, 4, 5])
8
- };
9
- export const EMPTY_PROTO_MESSAGE = {
10
- timestamp: undefined,
11
- contentTopic: "",
12
- ephemeral: undefined,
13
- meta: undefined,
14
- rateLimitProof: undefined,
15
- version: undefined
16
- };
17
- /**
18
- * Creates a basic RLN setup for codec tests
19
- */
20
- export async function createTestRLNCodecSetup() {
21
- const rlnInstance = await createRLN();
22
- const credential = rlnInstance.zerokit.generateIdentityCredentials();
23
- rlnInstance.zerokit.insertMember(credential.IDCommitment);
24
- return {
25
- rlnInstance,
26
- credential,
27
- index: TEST_CONSTANTS.defaultIndex,
28
- payload: TEST_CONSTANTS.defaultPayload
29
- };
30
- }
31
- /**
32
- * Creates a meta setter function for testing
33
- */
34
- export function createTestMetaSetter() {
35
- return (msg) => {
36
- const buffer = new ArrayBuffer(4);
37
- const view = new DataView(buffer);
38
- view.setUint32(0, msg.payload.length, false);
39
- return new Uint8Array(buffer);
40
- };
41
- }
42
- /**
43
- * Verifies common RLN message properties
44
- */
45
- export function verifyRLNMessage(msg, payload, contentTopic, version, rlnInstance) {
46
- expect(msg.rateLimitProof).to.not.be.undefined;
47
- expect(msg.verify([rlnInstance.zerokit.getMerkleRoot()])).to.be.true;
48
- expect(msg.verifyNoRoot()).to.be.true;
49
- expect(msg.epoch).to.not.be.undefined;
50
- expect(msg.epoch).to.be.gt(0);
51
- expect(msg.contentTopic).to.eq(contentTopic);
52
- expect(msg.msg.version).to.eq(version);
53
- expect(msg.payload).to.deep.eq(payload);
54
- expect(msg.timestamp).to.not.be.undefined;
55
- }
56
- //# sourceMappingURL=codec.test-utils.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"codec.test-utils.js","sourceRoot":"","sources":["../src/codec.test-utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAE9B,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAUxC,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,YAAY,EAAE,2BAA2B;IACzC,gBAAgB,EAAE,EAAE;IACpB,YAAY,EAAE,CAAC;IACf,cAAc,EAAE,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;CACvC,CAAC;AAEX,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,SAAS,EAAE,SAAS;IACpB,YAAY,EAAE,EAAE;IAChB,SAAS,EAAE,SAAS;IACpB,IAAI,EAAE,SAAS;IACf,cAAc,EAAE,SAAS;IACzB,OAAO,EAAE,SAAS;CACV,CAAC;AAEX;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB;IAC3C,MAAM,WAAW,GAAG,MAAM,SAAS,EAAE,CAAC;IACtC,MAAM,UAAU,GAAG,WAAW,CAAC,OAAO,CAAC,2BAA2B,EAAE,CAAC;IACrE,WAAW,CAAC,OAAO,CAAC,YAAY,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;IAE1D,OAAO;QACL,WAAW;QACX,UAAU;QACV,KAAK,EAAE,cAAc,CAAC,YAAY;QAClC,OAAO,EAAE,cAAc,CAAC,cAAc;KACvC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB;IAGlC,OAAO,CAAC,GAAwC,EAAc,EAAE;QAC9D,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC;QAClC,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;QAClC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAC7C,OAAO,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;IAChC,CAAC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAC9B,GAAQ,EACR,OAAmB,EACnB,YAAoB,EACpB,OAAe,EACf,WAAgB;IAEhB,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC;IAC/C,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;IACrE,MAAM,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;IACtC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC;IACtC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAE9B,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC;IAC7C,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;IACvC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;IACxC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC;AAC5C,CAAC"}
@@ -1,26 +0,0 @@
1
- import { ethers } from "ethers";
2
- import sinon from "sinon";
3
- import type { IdentityCredential } from "../identity.js";
4
- import { RLNContract } from "./rln_contract.js";
5
- export interface TestRLNInstance {
6
- rlnInstance: any;
7
- identity: IdentityCredential;
8
- insertMemberSpy: sinon.SinonStub;
9
- }
10
- /**
11
- * Creates a test RLN instance with basic setup
12
- */
13
- export declare function createTestRLNInstance(): Promise<TestRLNInstance>;
14
- /**
15
- * Initializes an RLN contract with the given registry contract
16
- */
17
- export declare function initializeRLNContract(rlnInstance: any, mockedRegistryContract: ethers.Contract): Promise<RLNContract>;
18
- /**
19
- * Common test message data
20
- */
21
- export declare const TEST_DATA: {
22
- readonly contentTopic: "/test/1/waku-message/utf8";
23
- readonly emptyPubsubTopic: "";
24
- readonly testMessage: Uint8Array;
25
- readonly mockSignature: "0xdeb8a6b00a8e404deb1f52d3aa72ed7f60a2ff4484c737eedaef18a0aacb2dfb4d5d74ac39bb71fa358cf2eb390565a35b026cc6272f2010d4351e17670311c21c";
26
- };
@@ -1,56 +0,0 @@
1
- import { hexToBytes } from "@waku/utils/bytes";
2
- import { ethers } from "ethers";
3
- import sinon from "sinon";
4
- import { createRLN } from "../create.js";
5
- import { DEFAULT_RATE_LIMIT, LINEA_CONTRACT } from "./constants.js";
6
- import { RLNContract } from "./rln_contract.js";
7
- /**
8
- * Creates a test RLN instance with basic setup
9
- */
10
- export async function createTestRLNInstance() {
11
- const rlnInstance = await createRLN();
12
- const insertMemberSpy = sinon.stub();
13
- rlnInstance.zerokit.insertMember = insertMemberSpy;
14
- const mockSignature = "0xdeb8a6b00a8e404deb1f52d3aa72ed7f60a2ff4484c737eedaef18a0aacb2dfb4d5d74ac39bb71fa358cf2eb390565a35b026cc6272f2010d4351e17670311c21c";
15
- const identity = rlnInstance.zerokit.generateSeededIdentityCredential(mockSignature);
16
- return {
17
- rlnInstance,
18
- identity,
19
- insertMemberSpy
20
- };
21
- }
22
- /**
23
- * Initializes an RLN contract with the given registry contract
24
- */
25
- export async function initializeRLNContract(rlnInstance, mockedRegistryContract) {
26
- const provider = new ethers.providers.JsonRpcProvider();
27
- const voidSigner = new ethers.VoidSigner(LINEA_CONTRACT.address, provider);
28
- const originalRegister = mockedRegistryContract.register;
29
- mockedRegistryContract.register = function (...args) {
30
- const result = originalRegister.apply(this, args);
31
- if (args[0] && rlnInstance.zerokit) {
32
- const idCommitmentBigInt = args[0];
33
- const idCommitmentHex = "0x" + idCommitmentBigInt.toString(16).padStart(64, "0");
34
- const idCommitment = ethers.utils.zeroPad(hexToBytes(idCommitmentHex), 32);
35
- rlnInstance.zerokit.insertMember(idCommitment);
36
- }
37
- return result;
38
- };
39
- const contract = await RLNContract.init(rlnInstance, {
40
- address: LINEA_CONTRACT.address,
41
- signer: voidSigner,
42
- rateLimit: DEFAULT_RATE_LIMIT,
43
- contract: mockedRegistryContract
44
- });
45
- return contract;
46
- }
47
- /**
48
- * Common test message data
49
- */
50
- export const TEST_DATA = {
51
- contentTopic: "/test/1/waku-message/utf8",
52
- emptyPubsubTopic: "",
53
- testMessage: Uint8Array.from("Hello World".split("").map((x) => x.charCodeAt(0))),
54
- mockSignature: "0xdeb8a6b00a8e404deb1f52d3aa72ed7f60a2ff4484c737eedaef18a0aacb2dfb4d5d74ac39bb71fa358cf2eb390565a35b026cc6272f2010d4351e17670311c21c"
55
- };
56
- //# sourceMappingURL=test-setup.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"test-setup.js","sourceRoot":"","sources":["../../src/contract/test-setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGzC,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACpE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAQhD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB;IACzC,MAAM,WAAW,GAAG,MAAM,SAAS,EAAE,CAAC;IACtC,MAAM,eAAe,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IACrC,WAAW,CAAC,OAAO,CAAC,YAAY,GAAG,eAAe,CAAC;IAEnD,MAAM,aAAa,GACjB,sIAAsI,CAAC;IACzI,MAAM,QAAQ,GACZ,WAAW,CAAC,OAAO,CAAC,gCAAgC,CAAC,aAAa,CAAC,CAAC;IAEtE,OAAO;QACL,WAAW;QACX,QAAQ;QACR,eAAe;KAChB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,WAAgB,EAChB,sBAAuC;IAEvC,MAAM,QAAQ,GAAG,IAAI,MAAM,CAAC,SAAS,CAAC,eAAe,EAAE,CAAC;IACxD,MAAM,UAAU,GAAG,IAAI,MAAM,CAAC,UAAU,CAAC,cAAc,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAE3E,MAAM,gBAAgB,GAAG,sBAAsB,CAAC,QAAQ,CAAC;IACxD,sBAA8B,CAAC,QAAQ,GAAG,UAAU,GAAG,IAAW;QACjE,MAAM,MAAM,GAAG,gBAAgB,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAElD,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC;YACnC,MAAM,kBAAkB,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YACnC,MAAM,eAAe,GACnB,IAAI,GAAG,kBAAkB,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;YAC3D,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CACvC,UAAU,CAAC,eAAe,CAAC,EAC3B,EAAE,CACH,CAAC;YACF,WAAW,CAAC,OAAO,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;QACjD,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC;IAEF,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,WAAW,EAAE;QACnD,OAAO,EAAE,cAAc,CAAC,OAAO;QAC/B,MAAM,EAAE,UAAU;QAClB,SAAS,EAAE,kBAAkB;QAC7B,QAAQ,EAAE,sBAAsB;KACjC,CAAC,CAAC;IAEH,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,YAAY,EAAE,2BAA2B;IACzC,gBAAgB,EAAE,EAAE;IACpB,WAAW,EAAE,UAAU,CAAC,IAAI,CAC1B,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CACpD;IACD,aAAa,EACX,sIAAsI;CAChI,CAAC"}