@waku/rln 0.1.4 → 0.1.5-76f86de.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 (108) hide show
  1. package/README.md +5 -0
  2. package/bundle/_virtual/index2.js +1 -1
  3. package/bundle/index.js +1 -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 +120 -36
  26. package/bundle/packages/rln/dist/keystore/cipher.js +3 -3
  27. package/bundle/packages/rln/dist/keystore/keystore.js +3 -2
  28. package/bundle/packages/rln/dist/rln.js +4 -4
  29. package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/lib/checksum.js +3 -3
  30. package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/lib/cipher.js +4 -4
  31. package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/lib/class.js +7 -7
  32. package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/lib/functional.js +7 -7
  33. package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/lib/index.js +6 -6
  34. package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/lib/kdf.js +5 -5
  35. package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/lib/password.js +1 -1
  36. package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/lib/schema-validation-generated.js +1 -1
  37. package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/lib/schema-validation.js +2 -2
  38. package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/lib/types.js +1 -1
  39. package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/node_modules/ethereum-cryptography/aes.js +3 -3
  40. package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/node_modules/ethereum-cryptography/pbkdf2.js +7 -7
  41. package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/node_modules/ethereum-cryptography/random.js +3 -3
  42. package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/node_modules/ethereum-cryptography/scrypt.js +3 -3
  43. package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/node_modules/ethereum-cryptography/sha256.js +3 -3
  44. package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/node_modules/ethereum-cryptography/utils.js +7 -7
  45. package/bundle/{node_modules/@chainsafe/bls-keystore → packages/rln}/node_modules/@noble/hashes/_assert.js +1 -1
  46. package/bundle/{node_modules/@chainsafe/bls-keystore → packages/rln}/node_modules/@noble/hashes/_sha2.js +3 -3
  47. package/bundle/{node_modules/@chainsafe/bls-keystore → packages/rln}/node_modules/@noble/hashes/_u64.js +1 -1
  48. package/bundle/{node_modules/@chainsafe/bls-keystore → packages/rln}/node_modules/@noble/hashes/cryptoBrowser.js +1 -1
  49. package/bundle/{node_modules/@chainsafe/bls-keystore → packages/rln}/node_modules/@noble/hashes/hmac.js +3 -3
  50. package/bundle/{node_modules/@chainsafe/bls-keystore → packages/rln}/node_modules/@noble/hashes/pbkdf2.js +4 -4
  51. package/bundle/{node_modules/@chainsafe/bls-keystore → packages/rln}/node_modules/@noble/hashes/scrypt.js +5 -5
  52. package/bundle/{node_modules/@chainsafe/bls-keystore → packages/rln}/node_modules/@noble/hashes/sha256.js +3 -3
  53. package/bundle/{node_modules/@chainsafe/bls-keystore → packages/rln}/node_modules/@noble/hashes/sha512.js +4 -4
  54. package/bundle/{node_modules/@chainsafe/bls-keystore → packages/rln}/node_modules/@noble/hashes/utils.js +2 -2
  55. package/dist/.tsbuildinfo +1 -1
  56. package/dist/codec.test-utils.d.ts +36 -0
  57. package/dist/codec.test-utils.js +56 -0
  58. package/dist/codec.test-utils.js.map +1 -0
  59. package/dist/contract/abi.d.ts +21 -17
  60. package/dist/contract/abi.js +502 -248
  61. package/dist/contract/abi.js.map +1 -1
  62. package/dist/contract/constants.d.ts +22 -18
  63. package/dist/contract/constants.js +3 -3
  64. package/dist/contract/constants.js.map +1 -1
  65. package/dist/contract/rln_contract.d.ts +10 -3
  66. package/dist/contract/rln_contract.js +120 -36
  67. package/dist/contract/rln_contract.js.map +1 -1
  68. package/dist/contract/test-setup.d.ts +26 -0
  69. package/dist/contract/test-setup.js +56 -0
  70. package/dist/contract/test-setup.js.map +1 -0
  71. package/dist/contract/test-utils.d.ts +39 -0
  72. package/dist/contract/test-utils.js +118 -0
  73. package/dist/contract/test-utils.js.map +1 -0
  74. package/dist/index.d.ts +3 -2
  75. package/dist/index.js +2 -2
  76. package/dist/index.js.map +1 -1
  77. package/dist/keystore/keystore.js +2 -1
  78. package/dist/keystore/keystore.js.map +1 -1
  79. package/dist/keystore/types.d.ts +1 -0
  80. package/dist/rln.d.ts +1 -1
  81. package/dist/rln.js +4 -4
  82. package/dist/rln.js.map +1 -1
  83. package/package.json +1 -91
  84. package/src/codec.test-utils.ts +80 -0
  85. package/src/contract/abi.ts +502 -248
  86. package/src/contract/constants.ts +3 -3
  87. package/src/contract/rln_contract.ts +158 -46
  88. package/src/contract/test-setup.ts +86 -0
  89. package/src/contract/test-utils.ts +179 -0
  90. package/src/index.ts +13 -2
  91. package/src/keystore/keystore.ts +2 -1
  92. package/src/keystore/types.ts +1 -0
  93. package/src/rln.ts +5 -5
  94. /package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/node_modules/uuid/dist/esm-browser/index.js +0 -0
  95. /package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/node_modules/uuid/dist/esm-browser/md5.js +0 -0
  96. /package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/node_modules/uuid/dist/esm-browser/nil.js +0 -0
  97. /package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/node_modules/uuid/dist/esm-browser/parse.js +0 -0
  98. /package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/node_modules/uuid/dist/esm-browser/regex.js +0 -0
  99. /package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/node_modules/uuid/dist/esm-browser/rng.js +0 -0
  100. /package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/node_modules/uuid/dist/esm-browser/sha1.js +0 -0
  101. /package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/node_modules/uuid/dist/esm-browser/stringify.js +0 -0
  102. /package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/node_modules/uuid/dist/esm-browser/v1.js +0 -0
  103. /package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/node_modules/uuid/dist/esm-browser/v3.js +0 -0
  104. /package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/node_modules/uuid/dist/esm-browser/v35.js +0 -0
  105. /package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/node_modules/uuid/dist/esm-browser/v4.js +0 -0
  106. /package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/node_modules/uuid/dist/esm-browser/v5.js +0 -0
  107. /package/bundle/{node_modules → packages/rln/node_modules}/@chainsafe/bls-keystore/node_modules/uuid/dist/esm-browser/validate.js +0 -0
  108. /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
- const SEPOLIA_CONTRACT = {
4
- chainId: 11155111,
5
- address: "0xCB33Aa5B38d79E3D9Fa8B10afF38AA201399a7e3",
3
+ const LINEA_CONTRACT = {
4
+ chainId: 59141,
5
+ address: "0xb9cd878c90e49f797b4431fbf4fb333108cb90e6",
6
6
  abi: RLN_ABI
7
7
  };
8
8
  /**
@@ -23,4 +23,4 @@ const RATE_LIMIT_PARAMS = {
23
23
  };
24
24
  const DEFAULT_RATE_LIMIT = RATE_LIMIT_PARAMS.MAX_RATE;
25
25
 
26
- export { DEFAULT_RATE_LIMIT, RATE_LIMIT_PARAMS, RATE_LIMIT_TIERS, SEPOLIA_CONTRACT };
26
+ export { DEFAULT_RATE_LIMIT, LINEA_CONTRACT, RATE_LIMIT_PARAMS, RATE_LIMIT_TIERS };
@@ -25,7 +25,8 @@ class RLNContract {
25
25
  rateLimit;
26
26
  _members = new Map();
27
27
  _membersFilter;
28
- _membersRemovedFilter;
28
+ _membershipErasedFilter;
29
+ _membersExpiredFilter;
29
30
  /**
30
31
  * Asynchronous initializer for RLNContract.
31
32
  * Allows injecting a mocked contract for testing purposes.
@@ -38,18 +39,26 @@ class RLNContract {
38
39
  }
39
40
  constructor(rlnInstance, options) {
40
41
  const { address, signer, rateLimit = DEFAULT_RATE_LIMIT, contract } = options;
41
- if (rateLimit < RATE_LIMIT_PARAMS.MIN_RATE ||
42
- rateLimit > RATE_LIMIT_PARAMS.MAX_RATE) {
43
- throw new Error(`Rate limit must be between ${RATE_LIMIT_PARAMS.MIN_RATE} and ${RATE_LIMIT_PARAMS.MAX_RATE} messages per epoch`);
44
- }
42
+ this.validateRateLimit(rateLimit);
45
43
  this.rateLimit = rateLimit;
46
44
  const initialRoot = rlnInstance.zerokit.getMerkleRoot();
47
45
  // Use the injected contract if provided; otherwise, instantiate a new one.
48
46
  this.contract = contract || new Contract(address, RLN_ABI, signer);
49
47
  this.merkleRootTracker = new MerkleRootTracker(5, initialRoot);
50
- // Initialize event filters for MembershipRegistered and MembershipRemoved
48
+ // Initialize event filters
51
49
  this._membersFilter = this.contract.filters.MembershipRegistered();
52
- this._membersRemovedFilter = this.contract.filters.MembershipRemoved();
50
+ this._membershipErasedFilter = this.contract.filters.MembershipErased();
51
+ this._membersExpiredFilter = this.contract.filters.MembershipExpired();
52
+ }
53
+ /**
54
+ * Validates that the rate limit is within the allowed range
55
+ * @throws Error if the rate limit is outside the allowed range
56
+ */
57
+ validateRateLimit(rateLimit) {
58
+ if (rateLimit < RATE_LIMIT_PARAMS.MIN_RATE ||
59
+ rateLimit > RATE_LIMIT_PARAMS.MAX_RATE) {
60
+ throw new Error(`Rate limit must be between ${RATE_LIMIT_PARAMS.MIN_RATE} and ${RATE_LIMIT_PARAMS.MAX_RATE} messages per epoch`);
61
+ }
53
62
  }
54
63
  /**
55
64
  * Gets the current rate limit for this contract instance
@@ -110,13 +119,14 @@ class RLNContract {
110
119
  this.contract.maxTotalRateLimit(),
111
120
  this.contract.currentTotalRateLimit()
112
121
  ]);
113
- return maxTotal.sub(currentTotal).toNumber();
122
+ return Number(maxTotal) - Number(currentTotal);
114
123
  }
115
124
  /**
116
125
  * Updates the rate limit for future registrations
117
126
  * @param newRateLimit The new rate limit to use
118
127
  */
119
128
  async setRateLimit(newRateLimit) {
129
+ this.validateRateLimit(newRateLimit);
120
130
  this.rateLimit = newRateLimit;
121
131
  }
122
132
  get members() {
@@ -129,11 +139,17 @@ class RLNContract {
129
139
  }
130
140
  return this._membersFilter;
131
141
  }
132
- get membersRemovedFilter() {
133
- if (!this._membersRemovedFilter) {
134
- throw Error("MembersRemoved filter was not initialized.");
142
+ get membershipErasedFilter() {
143
+ if (!this._membershipErasedFilter) {
144
+ throw Error("MembershipErased filter was not initialized.");
135
145
  }
136
- return this._membersRemovedFilter;
146
+ return this._membershipErasedFilter;
147
+ }
148
+ get membersExpiredFilter() {
149
+ if (!this._membersExpiredFilter) {
150
+ throw Error("MembersExpired filter was not initialized.");
151
+ }
152
+ return this._membersExpiredFilter;
137
153
  }
138
154
  async fetchMembers(rlnInstance, options = {}) {
139
155
  const registeredMemberEvents = await queryFilter(this.contract, {
@@ -144,9 +160,18 @@ class RLNContract {
144
160
  const removedMemberEvents = await queryFilter(this.contract, {
145
161
  fromBlock: this.deployBlock,
146
162
  ...options,
147
- membersFilter: this.membersRemovedFilter
163
+ membersFilter: this.membershipErasedFilter
164
+ });
165
+ const expiredMemberEvents = await queryFilter(this.contract, {
166
+ fromBlock: this.deployBlock,
167
+ ...options,
168
+ membersFilter: this.membersExpiredFilter
148
169
  });
149
- const events = [...registeredMemberEvents, ...removedMemberEvents];
170
+ const events = [
171
+ ...registeredMemberEvents,
172
+ ...removedMemberEvents,
173
+ ...expiredMemberEvents
174
+ ];
150
175
  this.processEvents(rlnInstance, events);
151
176
  }
152
177
  processEvents(rlnInstance, events) {
@@ -156,8 +181,22 @@ class RLNContract {
156
181
  if (!evt.args) {
157
182
  return;
158
183
  }
159
- if (evt.event === "MembershipRemoved") {
160
- const index = evt.args.index;
184
+ if (evt.event === "MembershipErased" ||
185
+ evt.event === "MembershipExpired") {
186
+ let index = evt.args.index;
187
+ if (!index) {
188
+ return;
189
+ }
190
+ if (typeof index === "number" || typeof index === "string") {
191
+ index = BigNumber.from(index);
192
+ }
193
+ else {
194
+ log.error("Index is not a number or string", {
195
+ index,
196
+ event: evt
197
+ });
198
+ return;
199
+ }
161
200
  const toRemoveVal = toRemoveTable.get(evt.blockNumber);
162
201
  if (toRemoveVal != undefined) {
163
202
  toRemoveVal.push(index.toNumber());
@@ -185,13 +224,17 @@ class RLNContract {
185
224
  if (!evt.args)
186
225
  return;
187
226
  const _idCommitment = evt.args.idCommitment;
188
- const index = evt.args.index;
227
+ let index = evt.args.index;
189
228
  if (!_idCommitment || !index) {
190
229
  return;
191
230
  }
231
+ if (typeof index === "number" || typeof index === "string") {
232
+ index = BigNumber.from(index);
233
+ }
192
234
  const idCommitment = zeroPadLE(hexToBytes(_idCommitment), 32);
193
235
  rlnInstance.zerokit.insertMember(idCommitment);
194
- this._members.set(index.toNumber(), {
236
+ const numericIndex = index.toNumber();
237
+ this._members.set(numericIndex, {
195
238
  index,
196
239
  idCommitment: _idCommitment
197
240
  });
@@ -213,18 +256,36 @@ class RLNContract {
213
256
  });
214
257
  }
215
258
  subscribeToMembers(rlnInstance) {
216
- this.contract.on(this.membersFilter, (_idCommitment, _rateLimit, _index, event) => {
259
+ this.contract.on(this.membersFilter, (_idCommitment, _membershipRateLimit, _index, event) => {
260
+ this.processEvents(rlnInstance, [event]);
261
+ });
262
+ this.contract.on(this.membershipErasedFilter, (_idCommitment, _membershipRateLimit, _index, event) => {
217
263
  this.processEvents(rlnInstance, [event]);
218
264
  });
219
- this.contract.on(this.membersRemovedFilter, (_idCommitment, _index, event) => {
265
+ this.contract.on(this.membersExpiredFilter, (_idCommitment, _membershipRateLimit, _index, event) => {
220
266
  this.processEvents(rlnInstance, [event]);
221
267
  });
222
268
  }
223
269
  async registerWithIdentity(identity) {
224
270
  try {
225
271
  log.info(`Registering identity with rate limit: ${this.rateLimit} messages/epoch`);
226
- const txRegisterResponse = await this.contract.register(identity.IDCommitmentBigInt, this.rateLimit, [], { gasLimit: 300000 });
272
+ // Check if the ID commitment is already registered
273
+ const existingIndex = await this.getMemberIndex(identity.IDCommitmentBigInt.toString());
274
+ if (existingIndex) {
275
+ throw new Error(`ID commitment is already registered with index ${existingIndex}`);
276
+ }
277
+ // Check if there's enough remaining rate limit
278
+ const remainingRateLimit = await this.getRemainingTotalRateLimit();
279
+ if (remainingRateLimit < this.rateLimit) {
280
+ throw new Error(`Not enough remaining rate limit. Requested: ${this.rateLimit}, Available: ${remainingRateLimit}`);
281
+ }
282
+ const estimatedGas = await this.contract.estimateGas.register(identity.IDCommitmentBigInt, this.rateLimit, []);
283
+ const gasLimit = estimatedGas.add(10000);
284
+ const txRegisterResponse = await this.contract.register(identity.IDCommitmentBigInt, this.rateLimit, [], { gasLimit });
227
285
  const txRegisterReceipt = await txRegisterResponse.wait();
286
+ if (txRegisterReceipt.status === 0) {
287
+ throw new Error("Transaction failed on-chain");
288
+ }
228
289
  const memberRegistered = txRegisterReceipt.events?.find((event) => event.event === "MembershipRegistered");
229
290
  if (!memberRegistered || !memberRegistered.args) {
230
291
  log.error("Failed to register membership: No MembershipRegistered event found");
@@ -232,26 +293,51 @@ class RLNContract {
232
293
  }
233
294
  const decodedData = {
234
295
  idCommitment: memberRegistered.args.idCommitment,
235
- rateLimit: memberRegistered.args.rateLimit,
296
+ membershipRateLimit: memberRegistered.args.membershipRateLimit,
236
297
  index: memberRegistered.args.index
237
298
  };
238
299
  log.info(`Successfully registered membership with index ${decodedData.index} ` +
239
- `and rate limit ${decodedData.rateLimit}`);
300
+ `and rate limit ${decodedData.membershipRateLimit}`);
240
301
  const network = await this.contract.provider.getNetwork();
241
302
  const address = this.contract.address;
242
- const membershipId = decodedData.index.toNumber();
303
+ const membershipId = Number(decodedData.index);
243
304
  return {
244
305
  identity,
245
306
  membership: {
246
307
  address,
247
308
  treeIndex: membershipId,
248
- chainId: network.chainId
309
+ chainId: network.chainId,
310
+ rateLimit: decodedData.membershipRateLimit.toNumber()
249
311
  }
250
312
  };
251
313
  }
252
314
  catch (error) {
253
- log.error(`Error in registerWithIdentity: ${error.message}`);
254
- return undefined;
315
+ if (error instanceof Error) {
316
+ const errorMessage = error.message;
317
+ log.error("registerWithIdentity - error message:", errorMessage);
318
+ log.error("registerWithIdentity - error stack:", error.stack);
319
+ // Try to extract more specific error information
320
+ if (errorMessage.includes("CannotExceedMaxTotalRateLimit")) {
321
+ throw new Error("Registration failed: Cannot exceed maximum total rate limit");
322
+ }
323
+ else if (errorMessage.includes("InvalidIdCommitment")) {
324
+ throw new Error("Registration failed: Invalid ID commitment");
325
+ }
326
+ else if (errorMessage.includes("InvalidMembershipRateLimit")) {
327
+ throw new Error("Registration failed: Invalid membership rate limit");
328
+ }
329
+ else if (errorMessage.includes("execution reverted")) {
330
+ throw new Error("Contract execution reverted. Check contract requirements.");
331
+ }
332
+ else {
333
+ throw new Error(`Error in registerWithIdentity: ${errorMessage}`);
334
+ }
335
+ }
336
+ else {
337
+ throw new Error("Unknown error in registerWithIdentity", {
338
+ cause: error
339
+ });
340
+ }
255
341
  }
256
342
  }
257
343
  /**
@@ -287,20 +373,21 @@ class RLNContract {
287
373
  }
288
374
  const decodedData = {
289
375
  idCommitment: memberRegistered.args.idCommitment,
290
- rateLimit: memberRegistered.args.rateLimit,
376
+ membershipRateLimit: memberRegistered.args.membershipRateLimit,
291
377
  index: memberRegistered.args.index
292
378
  };
293
379
  log.info(`Successfully registered membership with permit. Index: ${decodedData.index}, ` +
294
- `Rate limit: ${decodedData.rateLimit}, Erased ${idCommitmentsToErase.length} commitments`);
380
+ `Rate limit: ${decodedData.membershipRateLimit}, Erased ${idCommitmentsToErase.length} commitments`);
295
381
  const network = await this.contract.provider.getNetwork();
296
382
  const address = this.contract.address;
297
- const membershipId = decodedData.index.toNumber();
383
+ const membershipId = BigNumber.from(decodedData.index).toNumber();
298
384
  return {
299
385
  identity,
300
386
  membership: {
301
387
  address,
302
388
  treeIndex: membershipId,
303
- chainId: network.chainId
389
+ chainId: network.chainId,
390
+ rateLimit: decodedData.membershipRateLimit.toNumber()
304
391
  }
305
392
  };
306
393
  }
@@ -357,11 +444,8 @@ class RLNContract {
357
444
  async eraseMembership(idCommitment, eraseFromMembershipSet = true) {
358
445
  return this.contract.eraseMemberships([idCommitment], eraseFromMembershipSet);
359
446
  }
360
- async registerMembership(idCommitment, rateLimit = DEFAULT_RATE_LIMIT) {
361
- if (rateLimit < RATE_LIMIT_PARAMS.MIN_RATE ||
362
- rateLimit > RATE_LIMIT_PARAMS.MAX_RATE) {
363
- throw new Error(`Rate limit must be between ${RATE_LIMIT_PARAMS.MIN_RATE} and ${RATE_LIMIT_PARAMS.MAX_RATE}`);
364
- }
447
+ async registerMembership(idCommitment, rateLimit = this.rateLimit) {
448
+ this.validateRateLimit(rateLimit);
365
449
  return this.contract.register(idCommitment, rateLimit, []);
366
450
  }
367
451
  async getMemberIndex(idCommitment) {
@@ -1,6 +1,6 @@
1
- import { cipherDecrypt as cipherDecrypt_1 } from '../../../../node_modules/@chainsafe/bls-keystore/lib/cipher.js';
2
- import { kdf as kdf_2 } from '../../../../node_modules/@chainsafe/bls-keystore/lib/kdf.js';
3
- import { normalizePassword as normalizePassword_1 } from '../../../../node_modules/@chainsafe/bls-keystore/lib/password.js';
1
+ import { cipherDecrypt as cipherDecrypt_1 } from '../../node_modules/@chainsafe/bls-keystore/lib/cipher.js';
2
+ import { kdf as kdf_2 } from '../../node_modules/@chainsafe/bls-keystore/lib/kdf.js';
3
+ import { normalizePassword as normalizePassword_1 } from '../../node_modules/@chainsafe/bls-keystore/lib/password.js';
4
4
  import { keccak256 } from '../../../../node_modules/ethereum-cryptography/esm/keccak.js';
5
5
  import { hexToBytes } from '../../../../node_modules/ethereum-cryptography/esm/utils.js';
6
6
  import { concatBytes, bytesToHex } from '../../../../node_modules/@noble/hashes/esm/utils.js';
@@ -1,4 +1,4 @@
1
- import '../../../../node_modules/@chainsafe/bls-keystore/lib/index.js';
1
+ import '../../node_modules/@chainsafe/bls-keystore/lib/index.js';
2
2
  import '../../../interfaces/dist/protocols.js';
3
3
  import '../../../interfaces/dist/connection_manager.js';
4
4
  import '../../../interfaces/dist/health_indicator.js';
@@ -176,7 +176,8 @@ class Keystore {
176
176
  membership: {
177
177
  treeIndex: _.get(obj, "treeIndex"),
178
178
  chainId: _.get(obj, "membershipContract.chainId"),
179
- address: _.get(obj, "membershipContract.address")
179
+ address: _.get(obj, "membershipContract.address"),
180
+ rateLimit: _.get(obj, "membershipContract.rateLimit")
180
181
  }
181
182
  };
182
183
  }
@@ -21,7 +21,7 @@ import { Logger } from '../../utils/dist/logger/index.js';
21
21
  import '../../core/dist/lib/metadata/metadata.js';
22
22
  import __wbg_init, { init_panic_hook, newRLN } from '../../../node_modules/@waku/zerokit-rln-wasm/rln_wasm.js';
23
23
  import { createRLNEncoder, createRLNDecoder } from './codec.js';
24
- import { SEPOLIA_CONTRACT, DEFAULT_RATE_LIMIT } from './contract/constants.js';
24
+ import { LINEA_CONTRACT, DEFAULT_RATE_LIMIT } from './contract/constants.js';
25
25
  import { RLNContract } from './contract/rln_contract.js';
26
26
  import { Keystore } from './keystore/keystore.js';
27
27
  import verificationKey from './resources/verification_key.js';
@@ -127,9 +127,9 @@ class RLNInstance {
127
127
  let chainId = credentials?.membership.chainId;
128
128
  const address = credentials?.membership.address ||
129
129
  options.address ||
130
- SEPOLIA_CONTRACT.address;
131
- if (address === SEPOLIA_CONTRACT.address) {
132
- chainId = SEPOLIA_CONTRACT.chainId;
130
+ LINEA_CONTRACT.address;
131
+ if (address === LINEA_CONTRACT.address) {
132
+ chainId = LINEA_CONTRACT.chainId;
133
133
  }
134
134
  const signer = options.signer || (await extractMetaMaskSigner());
135
135
  const currentChainId = await signer.getChainId();
@@ -1,8 +1,8 @@
1
- import { commonjsGlobal } from '../../../../_virtual/_commonjsHelpers.js';
2
- import { __exports as checksum$1 } from '../../../../_virtual/checksum.js';
1
+ import { commonjsGlobal } from '../../../../../../_virtual/_commonjsHelpers.js';
2
+ import { __exports as checksum$1 } from '../../../../../../_virtual/checksum.js';
3
3
  import '../node_modules/ethereum-cryptography/sha256.js';
4
4
  import { u as utilsExports } from '../node_modules/ethereum-cryptography/utils.js';
5
- import { __exports as sha256 } from '../../../../_virtual/sha256.js';
5
+ import { __exports as sha256 } from '../../../../../../_virtual/sha256.js';
6
6
 
7
7
  var __awaiter = (commonjsGlobal && commonjsGlobal.__awaiter) || function (thisArg, _arguments, P, generator) {
8
8
  function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
@@ -1,10 +1,10 @@
1
- import { commonjsGlobal } from '../../../../_virtual/_commonjsHelpers.js';
2
- import { __exports as cipher } from '../../../../_virtual/cipher.js';
1
+ import { commonjsGlobal } from '../../../../../../_virtual/_commonjsHelpers.js';
2
+ import { __exports as cipher } from '../../../../../../_virtual/cipher.js';
3
3
  import '../node_modules/ethereum-cryptography/random.js';
4
4
  import '../node_modules/ethereum-cryptography/aes.js';
5
5
  import { u as utilsExports } from '../node_modules/ethereum-cryptography/utils.js';
6
- import { __exports as random } from '../../../../_virtual/random.js';
7
- import { __exports as aes } from '../../../../_virtual/aes.js';
6
+ import { __exports as random } from '../../../../../../_virtual/random.js';
7
+ import { __exports as aes } from '../../../../../../_virtual/aes.js';
8
8
 
9
9
  var __awaiter = (commonjsGlobal && commonjsGlobal.__awaiter) || function (thisArg, _arguments, P, generator) {
10
10
  function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
@@ -1,15 +1,15 @@
1
- import { commonjsGlobal } from '../../../../_virtual/_commonjsHelpers.js';
2
- import { __exports as _class } from '../../../../_virtual/class.js';
1
+ import { commonjsGlobal } from '../../../../../../_virtual/_commonjsHelpers.js';
2
+ import { __exports as _class } from '../../../../../../_virtual/class.js';
3
3
  import './kdf.js';
4
4
  import './checksum.js';
5
5
  import './cipher.js';
6
6
  import './functional.js';
7
7
  import './schema-validation.js';
8
- import { __exports as kdf } from '../../../../_virtual/kdf.js';
9
- import { __exports as checksum } from '../../../../_virtual/checksum.js';
10
- import { __exports as cipher } from '../../../../_virtual/cipher.js';
11
- import { __exports as functional } from '../../../../_virtual/functional.js';
12
- import { __exports as schemaValidation } from '../../../../_virtual/schema-validation.js';
8
+ import { __exports as kdf } from '../../../../../../_virtual/kdf.js';
9
+ import { __exports as checksum } from '../../../../../../_virtual/checksum.js';
10
+ import { __exports as cipher } from '../../../../../../_virtual/cipher.js';
11
+ import { __exports as functional } from '../../../../../../_virtual/functional.js';
12
+ import { __exports as schemaValidation } from '../../../../../../_virtual/schema-validation.js';
13
13
 
14
14
  var __awaiter = (commonjsGlobal && commonjsGlobal.__awaiter) || function (thisArg, _arguments, P, generator) {
15
15
  function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
@@ -1,15 +1,15 @@
1
- import { commonjsGlobal } from '../../../../_virtual/_commonjsHelpers.js';
2
- import { __exports as functional } from '../../../../_virtual/functional.js';
3
- import require$$0 from '../../../../_virtual/index2.js';
1
+ import { commonjsGlobal } from '../../../../../../_virtual/_commonjsHelpers.js';
2
+ import { __exports as functional } from '../../../../../../_virtual/functional.js';
3
+ import require$$0 from '../../../../../../_virtual/index2.js';
4
4
  import './kdf.js';
5
5
  import './checksum.js';
6
6
  import './cipher.js';
7
7
  import './password.js';
8
8
  import { u as utilsExports } from '../node_modules/ethereum-cryptography/utils.js';
9
- import { __exports as kdf } from '../../../../_virtual/kdf.js';
10
- import { __exports as checksum } from '../../../../_virtual/checksum.js';
11
- import { __exports as cipher } from '../../../../_virtual/cipher.js';
12
- import { __exports as password } from '../../../../_virtual/password.js';
9
+ import { __exports as kdf } from '../../../../../../_virtual/kdf.js';
10
+ import { __exports as checksum } from '../../../../../../_virtual/checksum.js';
11
+ import { __exports as cipher } from '../../../../../../_virtual/cipher.js';
12
+ import { __exports as password } from '../../../../../../_virtual/password.js';
13
13
 
14
14
  (function (exports) {
15
15
  var __awaiter = (commonjsGlobal && commonjsGlobal.__awaiter) || function (thisArg, _arguments, P, generator) {
@@ -1,13 +1,13 @@
1
- import { commonjsGlobal } from '../../../../_virtual/_commonjsHelpers.js';
2
- import { __exports as lib } from '../../../../_virtual/index.js';
1
+ import { commonjsGlobal } from '../../../../../../_virtual/_commonjsHelpers.js';
2
+ import { __exports as lib } from '../../../../../../_virtual/index.js';
3
3
  import './types.js';
4
4
  import './functional.js';
5
5
  import './class.js';
6
6
  import './schema-validation.js';
7
- import { __exports as types } from '../../../../_virtual/types.js';
8
- import { __exports as functional } from '../../../../_virtual/functional.js';
9
- import { __exports as _class } from '../../../../_virtual/class.js';
10
- import { __exports as schemaValidation } from '../../../../_virtual/schema-validation.js';
7
+ import { __exports as types } from '../../../../../../_virtual/types.js';
8
+ import { __exports as functional } from '../../../../../../_virtual/functional.js';
9
+ import { __exports as _class } from '../../../../../../_virtual/class.js';
10
+ import { __exports as schemaValidation } from '../../../../../../_virtual/schema-validation.js';
11
11
 
12
12
  (function (exports) {
13
13
  var __createBinding = (commonjsGlobal && commonjsGlobal.__createBinding) || (Object.create ? (function(o, m, k, k2) {
@@ -1,12 +1,12 @@
1
- import { commonjsGlobal } from '../../../../_virtual/_commonjsHelpers.js';
2
- import { __exports as kdf$1 } from '../../../../_virtual/kdf.js';
1
+ import { commonjsGlobal } from '../../../../../../_virtual/_commonjsHelpers.js';
2
+ import { __exports as kdf$1 } from '../../../../../../_virtual/kdf.js';
3
3
  import '../node_modules/ethereum-cryptography/random.js';
4
4
  import '../node_modules/ethereum-cryptography/pbkdf2.js';
5
5
  import '../node_modules/ethereum-cryptography/scrypt.js';
6
6
  import { u as utilsExports } from '../node_modules/ethereum-cryptography/utils.js';
7
- import { __exports as random } from '../../../../_virtual/random.js';
8
- import { __exports as pbkdf2 } from '../../../../_virtual/pbkdf2.js';
9
- import { __exports as scrypt } from '../../../../_virtual/scrypt.js';
7
+ import { __exports as random } from '../../../../../../_virtual/random.js';
8
+ import { __exports as pbkdf2 } from '../../../../../../_virtual/pbkdf2.js';
9
+ import { __exports as scrypt } from '../../../../../../_virtual/scrypt.js';
10
10
 
11
11
  var __awaiter = (commonjsGlobal && commonjsGlobal.__awaiter) || function (thisArg, _arguments, P, generator) {
12
12
  function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
@@ -1,4 +1,4 @@
1
- import { __exports as password } from '../../../../_virtual/password.js';
1
+ import { __exports as password } from '../../../../../../_virtual/password.js';
2
2
  import { u as utilsExports } from '../node_modules/ethereum-cryptography/utils.js';
3
3
 
4
4
  Object.defineProperty(password, "__esModule", { value: true });
@@ -1,4 +1,4 @@
1
- import { __exports as schemaValidationGenerated } from '../../../../_virtual/schema-validation-generated.js';
1
+ import { __exports as schemaValidationGenerated } from '../../../../../../_virtual/schema-validation-generated.js';
2
2
 
3
3
  Object.defineProperty(schemaValidationGenerated, "__esModule", { value: true });
4
4
  schemaValidationGenerated.Keystore = void 0;
@@ -1,6 +1,6 @@
1
- import { __exports as schemaValidation } from '../../../../_virtual/schema-validation.js';
1
+ import { __exports as schemaValidation } from '../../../../../../_virtual/schema-validation.js';
2
2
  import './schema-validation-generated.js';
3
- import { __exports as schemaValidationGenerated } from '../../../../_virtual/schema-validation-generated.js';
3
+ import { __exports as schemaValidationGenerated } from '../../../../../../_virtual/schema-validation-generated.js';
4
4
 
5
5
  Object.defineProperty(schemaValidation, "__esModule", { value: true });
6
6
  schemaValidation.isValidKeystore = schemaValidation.validateKeystore = schemaValidation.schemaValidationErrors = void 0;
@@ -1,4 +1,4 @@
1
- import { __exports as types } from '../../../../_virtual/types.js';
1
+ import { __exports as types } from '../../../../../../_virtual/types.js';
2
2
 
3
3
  Object.defineProperty(types, "__esModule", { value: true });
4
4
 
@@ -1,7 +1,7 @@
1
- import { __exports as aes } from '../../../../../_virtual/aes.js';
2
- import '../@noble/hashes/cryptoBrowser.js';
1
+ import { __exports as aes } from '../../../../../../../_virtual/aes.js';
2
+ import '../../../../@noble/hashes/cryptoBrowser.js';
3
3
  import { u as utilsExports } from './utils.js';
4
- import { __exports as cryptoBrowser } from '../../../../../_virtual/cryptoBrowser.js';
4
+ import { __exports as cryptoBrowser } from '../../../../../../../_virtual/cryptoBrowser.js';
5
5
 
6
6
  Object.defineProperty(aes, "__esModule", { value: true });
7
7
  aes.decrypt = aes.encrypt = void 0;
@@ -1,11 +1,11 @@
1
- import { __exports as pbkdf2$1 } from '../../../../../_virtual/pbkdf2.js';
2
- import '../@noble/hashes/pbkdf2.js';
3
- import '../@noble/hashes/sha256.js';
4
- import '../@noble/hashes/sha512.js';
1
+ import { __exports as pbkdf2$1 } from '../../../../../../../_virtual/pbkdf2.js';
2
+ import '../../../../@noble/hashes/pbkdf2.js';
3
+ import '../../../../@noble/hashes/sha256.js';
4
+ import '../../../../@noble/hashes/sha512.js';
5
5
  import { u as utilsExports } from './utils.js';
6
- import { __exports as pbkdf2$2 } from '../../../../../_virtual/pbkdf22.js';
7
- import { __exports as sha256 } from '../../../../../_virtual/sha2562.js';
8
- import { __exports as sha512 } from '../../../../../_virtual/sha512.js';
6
+ import { __exports as pbkdf2$2 } from '../../../../../../../_virtual/pbkdf22.js';
7
+ import { __exports as sha256 } from '../../../../../../../_virtual/sha2562.js';
8
+ import { __exports as sha512 } from '../../../../../../../_virtual/sha512.js';
9
9
 
10
10
  Object.defineProperty(pbkdf2$1, "__esModule", { value: true });
11
11
  pbkdf2$1.pbkdf2Sync = pbkdf2$1.pbkdf2 = void 0;
@@ -1,6 +1,6 @@
1
- import { __exports as random } from '../../../../../_virtual/random.js';
2
- import '../@noble/hashes/utils.js';
3
- import { __exports as utils } from '../../../../../_virtual/utils.js';
1
+ import { __exports as random } from '../../../../../../../_virtual/random.js';
2
+ import '../../../../@noble/hashes/utils.js';
3
+ import { __exports as utils } from '../../../../../../../_virtual/utils.js';
4
4
 
5
5
  Object.defineProperty(random, "__esModule", { value: true });
6
6
  random.getRandomBytes = random.getRandomBytesSync = void 0;
@@ -1,7 +1,7 @@
1
- import { __exports as scrypt$1 } from '../../../../../_virtual/scrypt.js';
2
- import '../@noble/hashes/scrypt.js';
1
+ import { __exports as scrypt$1 } from '../../../../../../../_virtual/scrypt.js';
2
+ import '../../../../@noble/hashes/scrypt.js';
3
3
  import { u as utilsExports } from './utils.js';
4
- import { __exports as scrypt$2 } from '../../../../../_virtual/scrypt2.js';
4
+ import { __exports as scrypt$2 } from '../../../../../../../_virtual/scrypt2.js';
5
5
 
6
6
  Object.defineProperty(scrypt$1, "__esModule", { value: true });
7
7
  scrypt$1.scryptSync = scrypt$1.scrypt = void 0;
@@ -1,7 +1,7 @@
1
- import { __exports as sha256 } from '../../../../../_virtual/sha256.js';
2
- import '../@noble/hashes/sha256.js';
1
+ import { __exports as sha256 } from '../../../../../../../_virtual/sha256.js';
2
+ import '../../../../@noble/hashes/sha256.js';
3
3
  import { u as utilsExports } from './utils.js';
4
- import { __exports as sha256$1 } from '../../../../../_virtual/sha2562.js';
4
+ import { __exports as sha256$1 } from '../../../../../../../_virtual/sha2562.js';
5
5
 
6
6
  Object.defineProperty(sha256, "__esModule", { value: true });
7
7
  sha256.sha256 = void 0;
@@ -1,10 +1,10 @@
1
- import { commonjsGlobal } from '../../../../../_virtual/_commonjsHelpers.js';
2
- import { commonjsRequire } from '../../../../../_virtual/_commonjs-dynamic-modules.js';
3
- import { __module as utils } from '../../../../../_virtual/utils2.js';
4
- import '../@noble/hashes/_assert.js';
5
- import '../@noble/hashes/utils.js';
6
- import { __exports as _assert } from '../../../../../_virtual/_assert.js';
7
- import { __exports as utils$1 } from '../../../../../_virtual/utils.js';
1
+ import { commonjsGlobal } from '../../../../../../../_virtual/_commonjsHelpers.js';
2
+ import { commonjsRequire } from '../../../../../../../_virtual/_commonjs-dynamic-modules.js';
3
+ import { __module as utils } from '../../../../../../../_virtual/utils2.js';
4
+ import '../../../../@noble/hashes/_assert.js';
5
+ import '../../../../@noble/hashes/utils.js';
6
+ import { __exports as _assert } from '../../../../../../../_virtual/_assert.js';
7
+ import { __exports as utils$1 } from '../../../../../../../_virtual/utils.js';
8
8
 
9
9
  utils.exports;
10
10
 
@@ -1,4 +1,4 @@
1
- import { __exports as _assert } from '../../../../../../_virtual/_assert.js';
1
+ import { __exports as _assert } from '../../../../../_virtual/_assert.js';
2
2
 
3
3
  Object.defineProperty(_assert, "__esModule", { value: true });
4
4
  _assert.output = _assert.exists = _assert.hash = _assert.bytes = _assert.bool = _assert.number = void 0;
@@ -1,8 +1,8 @@
1
- import { __exports as _sha2 } from '../../../../../../_virtual/_sha2.js';
1
+ import { __exports as _sha2 } from '../../../../../_virtual/_sha2.js';
2
2
  import './_assert.js';
3
3
  import './utils.js';
4
- import { __exports as utils } from '../../../../../../_virtual/utils.js';
5
- import { __exports as _assert } from '../../../../../../_virtual/_assert.js';
4
+ import { __exports as utils } from '../../../../../_virtual/utils.js';
5
+ import { __exports as _assert } from '../../../../../_virtual/_assert.js';
6
6
 
7
7
  Object.defineProperty(_sha2, "__esModule", { value: true });
8
8
  _sha2.SHA2 = void 0;
@@ -1,4 +1,4 @@
1
- import { __exports as _u64 } from '../../../../../../_virtual/_u64.js';
1
+ import { __exports as _u64 } from '../../../../../_virtual/_u64.js';
2
2
 
3
3
  (function (exports) {
4
4
  Object.defineProperty(exports, "__esModule", { value: true });