@waku/rln 0.1.4 → 0.1.5-6198efb.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 (123) hide show
  1. package/README.md +5 -0
  2. package/bundle/_virtual/index2.js +1 -1
  3. package/bundle/index.js +3 -1
  4. package/bundle/node_modules/@ethersproject/abi/lib.esm/_version.js +1 -1
  5. package/bundle/node_modules/@ethersproject/abstract-provider/lib.esm/_version.js +1 -1
  6. package/bundle/node_modules/@ethersproject/abstract-signer/lib.esm/_version.js +1 -1
  7. package/bundle/node_modules/@ethersproject/address/lib.esm/_version.js +1 -1
  8. package/bundle/node_modules/@ethersproject/bignumber/lib.esm/_version.js +1 -1
  9. package/bundle/node_modules/@ethersproject/contracts/lib.esm/_version.js +1 -1
  10. package/bundle/node_modules/@ethersproject/contracts/lib.esm/index.js +1 -1
  11. package/bundle/node_modules/@ethersproject/hash/lib.esm/_version.js +1 -1
  12. package/bundle/node_modules/@ethersproject/keccak256/lib.esm/index.js +1 -1
  13. package/bundle/node_modules/{js-sha3 → @ethersproject/keccak256/node_modules/js-sha3}/src/sha3.js +2 -2
  14. package/bundle/node_modules/@ethersproject/networks/lib.esm/_version.js +1 -1
  15. package/bundle/node_modules/@ethersproject/networks/lib.esm/index.js +1 -19
  16. package/bundle/node_modules/@ethersproject/properties/lib.esm/_version.js +1 -1
  17. package/bundle/node_modules/@ethersproject/providers/lib.esm/_version.js +1 -1
  18. package/bundle/node_modules/@ethersproject/signing-key/lib.esm/_version.js +1 -1
  19. package/bundle/node_modules/@ethersproject/signing-key/lib.esm/elliptic.js +10 -58
  20. package/bundle/node_modules/@ethersproject/strings/lib.esm/_version.js +1 -1
  21. package/bundle/node_modules/@ethersproject/transactions/lib.esm/_version.js +1 -1
  22. package/bundle/node_modules/@ethersproject/web/lib.esm/_version.js +1 -1
  23. package/bundle/packages/rln/dist/contract/abi.js +502 -248
  24. package/bundle/packages/rln/dist/contract/constants.js +4 -4
  25. package/bundle/packages/rln/dist/contract/rln_contract.js +122 -38
  26. package/bundle/packages/rln/dist/contract/rln_light_contract.js +477 -0
  27. package/bundle/packages/rln/dist/keystore/cipher.js +3 -3
  28. package/bundle/packages/rln/dist/keystore/keystore.js +3 -2
  29. package/bundle/packages/rln/dist/rln.js +6 -6
  30. package/bundle/packages/rln/dist/rln_light.js +149 -0
  31. package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/lib/checksum.js +3 -3
  32. package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/lib/cipher.js +4 -4
  33. package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/lib/class.js +7 -7
  34. package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/lib/functional.js +7 -7
  35. package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/lib/index.js +6 -6
  36. package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/lib/kdf.js +5 -5
  37. package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/lib/password.js +1 -1
  38. package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/lib/schema-validation-generated.js +1 -1
  39. package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/lib/schema-validation.js +2 -2
  40. package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/lib/types.js +1 -1
  41. package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/node_modules/ethereum-cryptography/aes.js +3 -3
  42. package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/node_modules/ethereum-cryptography/pbkdf2.js +7 -7
  43. package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/node_modules/ethereum-cryptography/random.js +3 -3
  44. package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/node_modules/ethereum-cryptography/scrypt.js +3 -3
  45. package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/node_modules/ethereum-cryptography/sha256.js +3 -3
  46. package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/node_modules/ethereum-cryptography/utils.js +7 -7
  47. package/bundle/{node_modules/@chainsafe/bls-keystore → packages/rln}/node_modules/@noble/hashes/_assert.js +1 -1
  48. package/bundle/{node_modules/@chainsafe/bls-keystore → packages/rln}/node_modules/@noble/hashes/_sha2.js +3 -3
  49. package/bundle/{node_modules/@chainsafe/bls-keystore → packages/rln}/node_modules/@noble/hashes/_u64.js +1 -1
  50. package/bundle/{node_modules/@chainsafe/bls-keystore → packages/rln}/node_modules/@noble/hashes/cryptoBrowser.js +1 -1
  51. package/bundle/packages/rln/node_modules/@noble/hashes/esm/_assert.js +43 -0
  52. package/bundle/packages/rln/node_modules/@noble/hashes/esm/_sha2.js +116 -0
  53. package/bundle/packages/rln/node_modules/@noble/hashes/esm/hmac.js +79 -0
  54. package/bundle/packages/rln/node_modules/@noble/hashes/esm/sha256.js +126 -0
  55. package/bundle/packages/rln/node_modules/@noble/hashes/esm/utils.js +43 -0
  56. package/bundle/{node_modules/@chainsafe/bls-keystore → packages/rln}/node_modules/@noble/hashes/hmac.js +3 -3
  57. package/bundle/{node_modules/@chainsafe/bls-keystore → packages/rln}/node_modules/@noble/hashes/pbkdf2.js +4 -4
  58. package/bundle/{node_modules/@chainsafe/bls-keystore → packages/rln}/node_modules/@noble/hashes/scrypt.js +5 -5
  59. package/bundle/{node_modules/@chainsafe/bls-keystore → packages/rln}/node_modules/@noble/hashes/sha256.js +3 -3
  60. package/bundle/{node_modules/@chainsafe/bls-keystore → packages/rln}/node_modules/@noble/hashes/sha512.js +4 -4
  61. package/bundle/{node_modules/@chainsafe/bls-keystore → packages/rln}/node_modules/@noble/hashes/utils.js +2 -2
  62. package/dist/.tsbuildinfo +1 -1
  63. package/dist/codec.test-utils.d.ts +36 -0
  64. package/dist/codec.test-utils.js +56 -0
  65. package/dist/codec.test-utils.js.map +1 -0
  66. package/dist/contract/abi.d.ts +21 -17
  67. package/dist/contract/abi.js +502 -248
  68. package/dist/contract/abi.js.map +1 -1
  69. package/dist/contract/constants.d.ts +22 -18
  70. package/dist/contract/constants.js +3 -3
  71. package/dist/contract/constants.js.map +1 -1
  72. package/dist/contract/rln_contract.d.ts +10 -3
  73. package/dist/contract/rln_contract.js +122 -38
  74. package/dist/contract/rln_contract.js.map +1 -1
  75. package/dist/contract/rln_light_contract.d.ts +124 -0
  76. package/dist/contract/rln_light_contract.js +460 -0
  77. package/dist/contract/rln_light_contract.js.map +1 -0
  78. package/dist/contract/test-setup.d.ts +26 -0
  79. package/dist/contract/test-setup.js +56 -0
  80. package/dist/contract/test-setup.js.map +1 -0
  81. package/dist/contract/test-utils.d.ts +39 -0
  82. package/dist/contract/test-utils.js +118 -0
  83. package/dist/contract/test-utils.js.map +1 -0
  84. package/dist/index.d.ts +5 -2
  85. package/dist/index.js +4 -2
  86. package/dist/index.js.map +1 -1
  87. package/dist/keystore/keystore.js +2 -1
  88. package/dist/keystore/keystore.js.map +1 -1
  89. package/dist/keystore/types.d.ts +1 -0
  90. package/dist/rln.d.ts +1 -1
  91. package/dist/rln.js +6 -6
  92. package/dist/rln.js.map +1 -1
  93. package/dist/rln_light.d.ts +64 -0
  94. package/dist/rln_light.js +144 -0
  95. package/dist/rln_light.js.map +1 -0
  96. package/package.json +1 -91
  97. package/src/codec.test-utils.ts +80 -0
  98. package/src/contract/abi.ts +502 -248
  99. package/src/contract/constants.ts +3 -3
  100. package/src/contract/rln_contract.ts +160 -48
  101. package/src/contract/rln_light_contract.ts +725 -0
  102. package/src/contract/test-setup.ts +86 -0
  103. package/src/contract/test-utils.ts +179 -0
  104. package/src/index.ts +17 -2
  105. package/src/keystore/keystore.ts +2 -1
  106. package/src/keystore/types.ts +1 -0
  107. package/src/rln.ts +7 -7
  108. package/src/rln_light.ts +235 -0
  109. /package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/node_modules/uuid/dist/esm-browser/index.js +0 -0
  110. /package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/node_modules/uuid/dist/esm-browser/md5.js +0 -0
  111. /package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/node_modules/uuid/dist/esm-browser/nil.js +0 -0
  112. /package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/node_modules/uuid/dist/esm-browser/parse.js +0 -0
  113. /package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/node_modules/uuid/dist/esm-browser/regex.js +0 -0
  114. /package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/node_modules/uuid/dist/esm-browser/rng.js +0 -0
  115. /package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/node_modules/uuid/dist/esm-browser/sha1.js +0 -0
  116. /package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/node_modules/uuid/dist/esm-browser/stringify.js +0 -0
  117. /package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/node_modules/uuid/dist/esm-browser/v1.js +0 -0
  118. /package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/node_modules/uuid/dist/esm-browser/v3.js +0 -0
  119. /package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/node_modules/uuid/dist/esm-browser/v35.js +0 -0
  120. /package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/node_modules/uuid/dist/esm-browser/v4.js +0 -0
  121. /package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/node_modules/uuid/dist/esm-browser/v5.js +0 -0
  122. /package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/node_modules/uuid/dist/esm-browser/validate.js +0 -0
  123. /package/bundle/{node_modules → packages/rln/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 SEPOLIA_CONTRACT = {
4
- chainId: 11155111,
5
- address: "0xCB33Aa5B38d79E3D9Fa8B10afF38AA201399a7e3",
3
+ export const LINEA_CONTRACT = {
4
+ chainId: 59141,
5
+ address: "0xb9cd878c90e49f797b4431fbf4fb333108cb90e6",
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
- rateLimit: number;
33
+ membershipRateLimit: ethers.BigNumber;
34
34
  index: ethers.BigNumber;
35
35
  }
36
36
 
@@ -65,7 +65,8 @@ export class RLNContract {
65
65
 
66
66
  private _members: Map<number, Member> = new Map();
67
67
  private _membersFilter: ethers.EventFilter;
68
- private _membersRemovedFilter: ethers.EventFilter;
68
+ private _membershipErasedFilter: ethers.EventFilter;
69
+ private _membersExpiredFilter: ethers.EventFilter;
69
70
 
70
71
  /**
71
72
  * Asynchronous initializer for RLNContract.
@@ -94,15 +95,7 @@ export class RLNContract {
94
95
  contract
95
96
  } = options;
96
97
 
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
-
98
+ this.validateRateLimit(rateLimit);
106
99
  this.rateLimit = rateLimit;
107
100
 
108
101
  const initialRoot = rlnInstance.zerokit.getMerkleRoot();
@@ -111,9 +104,25 @@ export class RLNContract {
111
104
  this.contract = contract || new ethers.Contract(address, RLN_ABI, signer);
112
105
  this.merkleRootTracker = new MerkleRootTracker(5, initialRoot);
113
106
 
114
- // Initialize event filters for MembershipRegistered and MembershipRemoved
107
+ // Initialize event filters
115
108
  this._membersFilter = this.contract.filters.MembershipRegistered();
116
- this._membersRemovedFilter = this.contract.filters.MembershipRemoved();
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
+ }
117
126
  }
118
127
 
119
128
  /**
@@ -143,7 +152,7 @@ export class RLNContract {
143
152
  */
144
153
  public async getMinRateLimit(): Promise<number> {
145
154
  const minRate = await this.contract.minMembershipRateLimit();
146
- return minRate.toNumber();
155
+ return ethers.BigNumber.from(minRate).toNumber();
147
156
  }
148
157
 
149
158
  /**
@@ -152,7 +161,7 @@ export class RLNContract {
152
161
  */
153
162
  public async getMaxRateLimit(): Promise<number> {
154
163
  const maxRate = await this.contract.maxMembershipRateLimit();
155
- return maxRate.toNumber();
164
+ return ethers.BigNumber.from(maxRate).toNumber();
156
165
  }
157
166
 
158
167
  /**
@@ -182,7 +191,7 @@ export class RLNContract {
182
191
  this.contract.maxTotalRateLimit(),
183
192
  this.contract.currentTotalRateLimit()
184
193
  ]);
185
- return maxTotal.sub(currentTotal).toNumber();
194
+ return Number(maxTotal) - Number(currentTotal);
186
195
  }
187
196
 
188
197
  /**
@@ -190,6 +199,7 @@ export class RLNContract {
190
199
  * @param newRateLimit The new rate limit to use
191
200
  */
192
201
  public async setRateLimit(newRateLimit: number): Promise<void> {
202
+ this.validateRateLimit(newRateLimit);
193
203
  this.rateLimit = newRateLimit;
194
204
  }
195
205
 
@@ -207,11 +217,18 @@ export class RLNContract {
207
217
  return this._membersFilter;
208
218
  }
209
219
 
210
- private get membersRemovedFilter(): ethers.EventFilter {
211
- if (!this._membersRemovedFilter) {
212
- throw Error("MembersRemoved filter was not initialized.");
220
+ private get membershipErasedFilter(): ethers.EventFilter {
221
+ if (!this._membershipErasedFilter) {
222
+ throw Error("MembershipErased filter was not initialized.");
213
223
  }
214
- return this._membersRemovedFilter;
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;
215
232
  }
216
233
 
217
234
  public async fetchMembers(
@@ -226,10 +243,19 @@ export class RLNContract {
226
243
  const removedMemberEvents = await queryFilter(this.contract, {
227
244
  fromBlock: this.deployBlock,
228
245
  ...options,
229
- membersFilter: this.membersRemovedFilter
246
+ membersFilter: this.membershipErasedFilter
247
+ });
248
+ const expiredMemberEvents = await queryFilter(this.contract, {
249
+ fromBlock: this.deployBlock,
250
+ ...options,
251
+ membersFilter: this.membersExpiredFilter
230
252
  });
231
253
 
232
- const events = [...registeredMemberEvents, ...removedMemberEvents];
254
+ const events = [
255
+ ...registeredMemberEvents,
256
+ ...removedMemberEvents,
257
+ ...expiredMemberEvents
258
+ ];
233
259
  this.processEvents(rlnInstance, events);
234
260
  }
235
261
 
@@ -242,8 +268,26 @@ export class RLNContract {
242
268
  return;
243
269
  }
244
270
 
245
- if (evt.event === "MembershipRemoved") {
246
- const index = evt.args.index as ethers.BigNumber;
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
+
247
291
  const toRemoveVal = toRemoveTable.get(evt.blockNumber);
248
292
  if (toRemoveVal != undefined) {
249
293
  toRemoveVal.push(index.toNumber());
@@ -275,15 +319,21 @@ export class RLNContract {
275
319
  if (!evt.args) return;
276
320
 
277
321
  const _idCommitment = evt.args.idCommitment as string;
278
- const index = evt.args.index as ethers.BigNumber;
322
+ let index = evt.args.index;
279
323
 
280
324
  if (!_idCommitment || !index) {
281
325
  return;
282
326
  }
283
327
 
328
+ if (typeof index === "number" || typeof index === "string") {
329
+ index = ethers.BigNumber.from(index);
330
+ }
331
+
284
332
  const idCommitment = zeroPadLE(hexToBytes(_idCommitment), 32);
285
333
  rlnInstance.zerokit.insertMember(idCommitment);
286
- this._members.set(index.toNumber(), {
334
+
335
+ const numericIndex = index.toNumber();
336
+ this._members.set(numericIndex, {
287
337
  index,
288
338
  idCommitment: _idCommitment
289
339
  });
@@ -316,7 +366,7 @@ export class RLNContract {
316
366
  this.membersFilter,
317
367
  (
318
368
  _idCommitment: string,
319
- _rateLimit: number,
369
+ _membershipRateLimit: ethers.BigNumber,
320
370
  _index: ethers.BigNumber,
321
371
  event: ethers.Event
322
372
  ) => {
@@ -325,9 +375,22 @@ export class RLNContract {
325
375
  );
326
376
 
327
377
  this.contract.on(
328
- this.membersRemovedFilter,
378
+ this.membershipErasedFilter,
329
379
  (
330
380
  _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,
331
394
  _index: ethers.BigNumber,
332
395
  event: ethers.Event
333
396
  ) => {
@@ -344,15 +407,45 @@ export class RLNContract {
344
407
  `Registering identity with rate limit: ${this.rateLimit} messages/epoch`
345
408
  );
346
409
 
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
+
347
435
  const txRegisterResponse: ethers.ContractTransaction =
348
436
  await this.contract.register(
349
437
  identity.IDCommitmentBigInt,
350
438
  this.rateLimit,
351
439
  [],
352
- { gasLimit: 300000 }
440
+ { gasLimit }
353
441
  );
442
+
354
443
  const txRegisterReceipt = await txRegisterResponse.wait();
355
444
 
445
+ if (txRegisterReceipt.status === 0) {
446
+ throw new Error("Transaction failed on-chain");
447
+ }
448
+
356
449
  const memberRegistered = txRegisterReceipt.events?.find(
357
450
  (event) => event.event === "MembershipRegistered"
358
451
  );
@@ -366,30 +459,55 @@ export class RLNContract {
366
459
 
367
460
  const decodedData: MembershipRegisteredEvent = {
368
461
  idCommitment: memberRegistered.args.idCommitment,
369
- rateLimit: memberRegistered.args.rateLimit,
462
+ membershipRateLimit: memberRegistered.args.membershipRateLimit,
370
463
  index: memberRegistered.args.index
371
464
  };
372
465
 
373
466
  log.info(
374
467
  `Successfully registered membership with index ${decodedData.index} ` +
375
- `and rate limit ${decodedData.rateLimit}`
468
+ `and rate limit ${decodedData.membershipRateLimit}`
376
469
  );
377
470
 
378
471
  const network = await this.contract.provider.getNetwork();
379
472
  const address = this.contract.address;
380
- const membershipId = decodedData.index.toNumber();
473
+ const membershipId = Number(decodedData.index);
381
474
 
382
475
  return {
383
476
  identity,
384
477
  membership: {
385
478
  address,
386
479
  treeIndex: membershipId,
387
- chainId: network.chainId
480
+ chainId: network.chainId,
481
+ rateLimit: decodedData.membershipRateLimit.toNumber()
388
482
  }
389
483
  };
390
484
  } catch (error) {
391
- log.error(`Error in registerWithIdentity: ${(error as Error).message}`);
392
- return undefined;
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
+ }
393
511
  }
394
512
  }
395
513
 
@@ -467,25 +585,26 @@ export class RLNContract {
467
585
 
468
586
  const decodedData: MembershipRegisteredEvent = {
469
587
  idCommitment: memberRegistered.args.idCommitment,
470
- rateLimit: memberRegistered.args.rateLimit,
588
+ membershipRateLimit: memberRegistered.args.membershipRateLimit,
471
589
  index: memberRegistered.args.index
472
590
  };
473
591
 
474
592
  log.info(
475
593
  `Successfully registered membership with permit. Index: ${decodedData.index}, ` +
476
- `Rate limit: ${decodedData.rateLimit}, Erased ${idCommitmentsToErase.length} commitments`
594
+ `Rate limit: ${decodedData.membershipRateLimit}, Erased ${idCommitmentsToErase.length} commitments`
477
595
  );
478
596
 
479
597
  const network = await this.contract.provider.getNetwork();
480
598
  const address = this.contract.address;
481
- const membershipId = decodedData.index.toNumber();
599
+ const membershipId = ethers.BigNumber.from(decodedData.index).toNumber();
482
600
 
483
601
  return {
484
602
  identity,
485
603
  membership: {
486
604
  address,
487
605
  treeIndex: membershipId,
488
- chainId: network.chainId
606
+ chainId: network.chainId,
607
+ rateLimit: decodedData.membershipRateLimit.toNumber()
489
608
  }
490
609
  };
491
610
  } catch (error) {
@@ -560,16 +679,9 @@ export class RLNContract {
560
679
 
561
680
  public async registerMembership(
562
681
  idCommitment: string,
563
- rateLimit: number = DEFAULT_RATE_LIMIT
682
+ rateLimit: number = this.rateLimit
564
683
  ): Promise<ethers.ContractTransaction> {
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
- }
684
+ this.validateRateLimit(rateLimit);
573
685
  return this.contract.register(idCommitment, rateLimit, []);
574
686
  }
575
687